Updated with error handling and multiple answer responses
This commit is contained in:
@@ -33,9 +33,7 @@ type Response struct {
|
||||
ID string `json:"id"`
|
||||
Status string `json:"status"`
|
||||
Output []struct {
|
||||
Content []struct {
|
||||
Text string `json:"text"`
|
||||
} `json:"content"`
|
||||
} `json:"output"`
|
||||
}
|
||||
|
||||
@@ -45,23 +43,59 @@ type Messenger struct {
|
||||
prevID string
|
||||
}
|
||||
|
||||
func (m *Messenger) Send(input string) (string, error) {
|
||||
data, _ := json.Marshal(Request{input, m.model, m.prevID, map[string]string{"channel": "text"}})
|
||||
func (m *Messenger) Send(input string) ([]string, error) {
|
||||
data, err := json.Marshal(Request{input, m.model, m.prevID, map[string]string{"channel": "text"}})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to marshal request: %w", err)
|
||||
}
|
||||
|
||||
resp, err := m.client.Post(apiURL, "application/json", bytes.NewBuffer(data))
|
||||
if err != nil {
|
||||
return "", err
|
||||
return nil, fmt.Errorf("failed to send request: %w", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
// Check HTTP status code
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
return nil, fmt.Errorf("HTTP %d: %s - Response body: %s", resp.StatusCode, resp.Status, string(body))
|
||||
}
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to read response body: %w", err)
|
||||
}
|
||||
|
||||
var r Response
|
||||
json.Unmarshal(body, &r)
|
||||
if err := json.Unmarshal(body, &r); err != nil {
|
||||
return nil, fmt.Errorf("failed to parse JSON response: %w - Raw body: %s", err, string(body))
|
||||
}
|
||||
|
||||
m.prevID = r.ID
|
||||
|
||||
if r.Status == "completed" && len(r.Output) > 0 && len(r.Output[0].Content) > 0 {
|
||||
return r.Output[0].Content[0].Text, nil
|
||||
// Detailed validation of response structure
|
||||
if r.Status != "completed" {
|
||||
return nil, fmt.Errorf("response status is '%s' (expected 'completed') - Response ID: %s, Raw body: %s", r.Status, r.ID, string(body))
|
||||
}
|
||||
return "", fmt.Errorf("invalid response")
|
||||
|
||||
if len(r.Output) == 0 {
|
||||
return nil, fmt.Errorf("response has no output - Response ID: %s, Status: %s, Output length: %d, Raw body: %s", r.ID, r.Status, len(r.Output), string(body))
|
||||
}
|
||||
|
||||
// Collect all Output Text values
|
||||
var texts []string
|
||||
for i, content := range r.Output {
|
||||
if content.Text == "" {
|
||||
fmt.Printf("Warning: Output[%d] has empty text field\n", i)
|
||||
}
|
||||
texts = append(texts, content.Text)
|
||||
}
|
||||
|
||||
if len(texts) == 0 {
|
||||
return nil, fmt.Errorf("no text content found in response - Response ID: %s, Output items: %d", r.ID, len(r.Output))
|
||||
}
|
||||
|
||||
return texts, nil
|
||||
}
|
||||
|
||||
func getConversations() []string {
|
||||
@@ -121,11 +155,11 @@ func showHistory(id string) {
|
||||
}
|
||||
|
||||
func main() {
|
||||
var id, model string
|
||||
var id, model string
|
||||
|
||||
fmt.Println("\n░▀█▀░█░█░█▀█░░░█▄█░█▀▀░█▀▀░█▀▀░█▀▀░█▀█░█▀▀░█▀▀░█▀▄\n░░█░░▀▄▀░█▀█░░░█░█░█▀▀░▀▀█░▀▀█░█▀▀░█░█░█░█░█▀▀░█▀▄\n░▀▀▀░░▀░░▀░▀░░░▀░▀░▀▀▀░▀▀▀░▀▀▀░▀▀▀░▀░▀░▀▀▀░▀▀▀░▀░▀")
|
||||
fmt.Println("\n░▀█▀░█░█░█▀█░░░█▄█░█▀▀░█▀▀░█▀▀░█▀▀░█▀█░█▀▀░█▀▀░█▀▄\n░░█░░▀▄▀░█▀█░░░█░█░█▀▀░▀▀█░▀▀█░█▀▀░█░█░█░█░█▀▀░█▀▄\n░▀▀▀░░▀░░▀░▀░░░▀░▀░▀▀▀░▀▀▀░▀▀▀░▀▀▀░▀░▀░▀▀▀░▀▀▀░▀░▀")
|
||||
|
||||
// Check for recent conversations
|
||||
// Check for recent conversations
|
||||
convs := getConversations()
|
||||
if len(convs) > 0 {
|
||||
fmt.Println("Recent conversations:")
|
||||
@@ -155,8 +189,6 @@ fmt.Println("\n░▀█▀░█░█░█▀█░░░█▄█░█▀
|
||||
|
||||
m := &Messenger{&http.Client{Timeout: 10 * time.Second}, model, id}
|
||||
|
||||
|
||||
|
||||
fmt.Println("Use ↑/↓ for history, 'quit' to exit\n")
|
||||
|
||||
histFile := "/tmp/messenger_temp.tmp"
|
||||
@@ -178,12 +210,15 @@ fmt.Println("\n░▀█▀░█░█░█▀█░░░█▄█░█▀
|
||||
continue
|
||||
}
|
||||
|
||||
response, err := m.Send(input)
|
||||
responses, err := m.Send(input)
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
fmt.Printf("\n"+reset+"Error sending message:\n%s\n\n", err)
|
||||
continue
|
||||
}
|
||||
|
||||
// Join all responses into a single string
|
||||
response := strings.Join(responses, "\n")
|
||||
|
||||
if first && m.prevID != "" {
|
||||
first = false
|
||||
rl.Close()
|
||||
@@ -205,4 +240,4 @@ fmt.Println("\n░▀█▀░█░█░█▀█░░░█▄█░█▀
|
||||
}
|
||||
|
||||
fmt.Println("Goodbye!")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user