diff options
Diffstat (limited to 'internal/llm/openai.go')
| -rw-r--r-- | internal/llm/openai.go | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/internal/llm/openai.go b/internal/llm/openai.go index 9b48782..279eca4 100644 --- a/internal/llm/openai.go +++ b/internal/llm/openai.go @@ -6,10 +6,11 @@ import ( "encoding/json" "errors" "fmt" - "log" "net/http" "os" "time" + + "hexai/internal/logging" ) // openAIClient implements Client against OpenAI's Chat Completions API. @@ -18,12 +19,11 @@ type openAIClient struct { apiKey string baseURL string defaultModel string - logger *log.Logger } // Colors and base styling are provided by logging.go -func newOpenAIFromEnv(apiKey string, logger *log.Logger) Client { +func newOpenAIFromEnv(apiKey string) Client { base := os.Getenv("OPENAI_BASE_URL") if base == "" { base = "https://api.openai.com/v1" @@ -37,7 +37,6 @@ func newOpenAIFromEnv(apiKey string, logger *log.Logger) Client { apiKey: apiKey, baseURL: base, defaultModel: model, - logger: logger, } } @@ -83,10 +82,10 @@ func (c *openAIClient) Chat(ctx context.Context, messages []Message, opts ...Req o.Model = c.defaultModel } start := time.Now() - LogPrintf(c.logger, "llm/openai ", "chat start model=%s temp=%.2f max_tokens=%d stop=%d messages=%d", o.Model, o.Temperature, o.MaxTokens, len(o.Stop), len(messages)) + logging.Logf("llm/openai ", "chat start model=%s temp=%.2f max_tokens=%d stop=%d messages=%d", o.Model, o.Temperature, o.MaxTokens, len(o.Stop), len(messages)) for i, m := range messages { // Sending context (cyan) - LogPrintf(c.logger, "llm/openai ", "msg[%d] role=%s size=%d preview=%s%s%s", i, m.Role, len(m.Content), AnsiCyan, previewForLog(m.Content), AnsiBase) + logging.Logf("llm/openai ", "msg[%d] role=%s size=%d preview=%s%s%s", i, m.Role, len(m.Content), logging.AnsiCyan, logging.PreviewForLog(m.Content), logging.AnsiBase) } req := oaChatRequest{Model: o.Model} req.Messages = make([]oaMessage, len(messages)) @@ -109,7 +108,7 @@ func (c *openAIClient) Chat(ctx context.Context, messages []Message, opts ...Req return "", err } endpoint := c.baseURL + "/chat/completions" - LogPrintf(c.logger, "llm/openai ", "POST %s", endpoint) + logging.Logf("llm/openai ", "POST %s", endpoint) httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, bytes.NewReader(body)) if err != nil { c.logf("new request error: %v", err) @@ -120,7 +119,7 @@ func (c *openAIClient) Chat(ctx context.Context, messages []Message, opts ...Req resp, err := c.httpClient.Do(httpReq) if err != nil { - LogPrintf(c.logger, "llm/openai ", "%shttp error after %s: %v%s", AnsiRed, time.Since(start), err, AnsiBase) + logging.Logf("llm/openai ", "%shttp error after %s: %v%s", logging.AnsiRed, time.Since(start), err, logging.AnsiBase) return "", err } defer resp.Body.Close() @@ -128,31 +127,31 @@ func (c *openAIClient) Chat(ctx context.Context, messages []Message, opts ...Req var apiErr oaChatResponse _ = json.NewDecoder(resp.Body).Decode(&apiErr) if apiErr.Error != nil && apiErr.Error.Message != "" { - LogPrintf(c.logger, "llm/openai ", "%sapi error status=%d type=%s msg=%s duration=%s%s", AnsiRed, resp.StatusCode, apiErr.Error.Type, apiErr.Error.Message, time.Since(start), AnsiBase) + logging.Logf("llm/openai ", "%sapi error status=%d type=%s msg=%s duration=%s%s", logging.AnsiRed, resp.StatusCode, apiErr.Error.Type, apiErr.Error.Message, time.Since(start), logging.AnsiBase) return "", fmt.Errorf("openai error: %s (status %d)", apiErr.Error.Message, resp.StatusCode) } - LogPrintf(c.logger, "llm/openai ", "%shttp non-2xx status=%d duration=%s%s", AnsiRed, resp.StatusCode, time.Since(start), AnsiBase) + logging.Logf("llm/openai ", "%shttp non-2xx status=%d duration=%s%s", logging.AnsiRed, resp.StatusCode, time.Since(start), logging.AnsiBase) return "", fmt.Errorf("openai http error: status %d", resp.StatusCode) } var out oaChatResponse if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { - LogPrintf(c.logger, "llm/openai ", "%sdecode error after %s: %v%s", AnsiRed, time.Since(start), err, AnsiBase) + logging.Logf("llm/openai ", "%sdecode error after %s: %v%s", logging.AnsiRed, time.Since(start), err, logging.AnsiBase) return "", err } if len(out.Choices) == 0 { - LogPrintf(c.logger, "llm/openai ", "%sno choices returned duration=%s%s", AnsiRed, time.Since(start), AnsiBase) + logging.Logf("llm/openai ", "%sno choices returned duration=%s%s", logging.AnsiRed, time.Since(start), logging.AnsiBase) return "", errors.New("openai: no choices returned") } content := out.Choices[0].Message.Content // Received context (green) - LogPrintf(c.logger, "llm/openai ", "success choice=0 finish=%s size=%d preview=%s%s%s duration=%s", out.Choices[0].FinishReason, len(content), AnsiGreen, previewForLog(content), AnsiBase, time.Since(start)) + logging.Logf("llm/openai ", "success choice=0 finish=%s size=%d preview=%s%s%s duration=%s", out.Choices[0].FinishReason, len(content), logging.AnsiGreen, logging.PreviewForLog(content), logging.AnsiBase, time.Since(start)) return content, nil } // small helper to keep return type consistent func nilStringErr(msg string) (string, error) { return "", errors.New(msg) } -func (c *openAIClient) logf(format string, args ...any) { LogPrintf(c.logger, "llm/openai ", format, args...) } +func (c *openAIClient) logf(format string, args ...any) { logging.Logf("llm/openai ", format, args...) } func trimPreview(s string, n int) string { if n <= 0 || len(s) <= n { |
