diff --git a/terminal-messenger/application/main.go b/terminal-messenger/application/main.go index dcfd642..f61b6d7 100644 --- a/terminal-messenger/application/main.go +++ b/terminal-messenger/application/main.go @@ -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"` + Text string `json:"text"` } `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() - body, _ := io.ReadAll(resp.Body) + // 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!") - } +}