diff --git a/cmd/opencodereview/main.go b/cmd/opencodereview/main.go index 67be013..f6f9ce2 100644 --- a/cmd/opencodereview/main.go +++ b/cmd/opencodereview/main.go @@ -13,6 +13,7 @@ import ( ) func main() { + llm.AppVersion = Version llm.InitEmbeddedLoader() ctx := context.Background() diff --git a/internal/agent/agent.go b/internal/agent/agent.go index 209d48a..0a1df8c 100644 --- a/internal/agent/agent.go +++ b/internal/agent/agent.go @@ -675,7 +675,7 @@ func (a *Agent) performLlmCodeReview(ctx context.Context, messages []llm.Message rec := fs.AppendTaskRecord(session.MainTask, append([]llm.Message(nil), messages...)) startTime := time.Now() - resp, err := a.args.LLMClient.Completions(llm.ChatRequest{ + resp, err := a.args.LLMClient.CompletionsWithCtx(ctx, llm.ChatRequest{ Model: a.args.Model, Messages: messages, Tools: a.args.MainToolDefs, diff --git a/internal/llm/client.go b/internal/llm/client.go index 3482544..1425ae2 100644 --- a/internal/llm/client.go +++ b/internal/llm/client.go @@ -22,6 +22,16 @@ import ( const maxRetries = 10 // Maximum number of retry attempts with exponential backoff. +var AppVersion = "dev" + +func userAgent(provider string) string { + ua := "open-code-review/" + AppVersion + if provider != "" { + ua += " | " + provider + } + return ua +} + // LLMClient is the unified interface for all LLM protocol implementations. type LLMClient interface { Completions(req ChatRequest) (*ChatResponse, error) @@ -361,6 +371,7 @@ func (c *OpenAIClient) StreamCompletion(req ChatRequest, cb func(chunk []byte) e httpReq.Header.Set("Content-Type", "application/json") httpReq.Header.Set("Authorization", "Bearer "+c.cfg.APIKey) httpReq.Header.Set("Accept", "text/event-stream") + httpReq.Header.Set("User-Agent", userAgent("")) resp, err := c.client.Do(httpReq) if err != nil { @@ -413,6 +424,7 @@ func (c *OpenAIClient) doRequestCtx(ctx context.Context, model string, req ChatR } httpReq.Header.Set("Content-Type", "application/json") httpReq.Header.Set("Authorization", "Bearer "+c.cfg.APIKey) + httpReq.Header.Set("User-Agent", userAgent("")) resp, err := c.client.Do(httpReq) if err != nil { @@ -527,6 +539,7 @@ func (c *AnthropicClient) StreamCompletion(req ChatRequest, cb func(chunk []byte httpReq.Header.Set("Content-Type", "application/json") httpReq.Header.Set("x-api-key", c.cfg.APIKey) httpReq.Header.Set("anthropic-version", anthropicVersion) + httpReq.Header.Set("User-Agent", userAgent("claude")) resp, err := c.client.Do(httpReq) if err != nil { @@ -627,6 +640,7 @@ func (c *AnthropicClient) doRequestCtx(ctx context.Context, model string, req Ch httpReq.Header.Set("Content-Type", "application/json") httpReq.Header.Set("x-api-key", c.cfg.APIKey) httpReq.Header.Set("anthropic-version", anthropicVersion) + httpReq.Header.Set("User-Agent", userAgent("claude")) resp, err := c.client.Do(httpReq) if err != nil {