package grok import ( "bufio" "bytes" "encoding/json" "fmt" _ "io" "net/http" "os" "strings" "github.com/fatih/color" ) type Client struct { APIKey string BaseURL string } func NewClient() *Client { key := os.Getenv("XAI_API_KEY") if key == "" { color.Red("Error: XAI_API_KEY environment variable not set") os.Exit(1) } return &Client{ APIKey: key, BaseURL: "https://api.x.ai/v1", } } func (c *Client) Stream(messages []map[string]string, model string) string { url := c.BaseURL + "/chat/completions" payload := map[string]interface{}{ "model": model, "messages": messages, "temperature": 0.7, "stream": true, } body, _ := json.Marshal(payload) req, _ := http.NewRequest("POST", url, bytes.NewReader(body)) req.Header.Set("Authorization", "Bearer "+c.APIKey) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { color.Red("Error: %v", err) os.Exit(1) } defer resp.Body.Close() var fullReply strings.Builder scanner := bufio.NewScanner(resp.Body) for scanner.Scan() { line := scanner.Text() if strings.HasPrefix(line, "data: ") { data := line[6:] if data == "[DONE]" { break } var chunk map[string]interface{} if json.Unmarshal([]byte(data), &chunk) == nil { if choices, ok := chunk["choices"].([]interface{}); ok && len(choices) > 0 { if delta, ok := choices[0].(map[string]interface{})["delta"].(map[string]interface{}); ok { if content, ok := delta["content"].(string); ok { fmt.Print(content) fullReply.WriteString(content) } } } } } } fmt.Println() return fullReply.String() }