Conversation
1f55aac to
fde6065
Compare
There was a problem hiding this comment.
Pull request overview
Adds consistent User-Agent handling across the SDK by introducing a default UA (Charm Fantasy/<version>) and allowing overrides at provider, call, and agent levels, with shared header-resolution helpers and tests to validate precedence.
Changes:
- Embed SDK version from
version.txtand expose it asfantasy.Versionfor default UA generation. - Add call-level (
Call.UserAgent,ObjectCall.UserAgent) and agent-level (fantasy.WithUserAgent) UA overrides and wire them through providers. - Introduce shared
providers/internal/httpheadersutilities for default UA + precedence resolution; add provider-specificWithUserAgentoptions and tests across providers.
Reviewed changes
Copilot reviewed 27 out of 27 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| version.txt | Adds the SDK version source used for default UA strings. |
| version.go | Embeds version.txt and exposes fantasy.Version. |
| providers/vercel/vercel.go | Adds provider-level WithUserAgent passthrough to OpenAI provider options. |
| providers/openrouter/useragent_test.go | Tests OpenRouter UA default + override precedence. |
| providers/openrouter/openrouter.go | Adds provider-level WithUserAgent passthrough to OpenAI provider options. |
| providers/openaicompat/openaicompat.go | Adds provider-level WithUserAgent passthrough to OpenAI provider options. |
| providers/openai/responses_language_model.go | Applies per-call UA request options to Responses API calls/streams. |
| providers/openai/openai_test.go | Adds tests covering default/provider/call/agent UA precedence for OpenAI provider. |
| providers/openai/openai.go | Adds provider-level WithUserAgent and resolves headers with default UA. |
| providers/openai/language_model.go | Applies per-call UA request options for chat completions and object flows. |
| providers/openai/call_useragent.go | Adds helpers to translate call UA override into OpenAI per-request options. |
| providers/internal/httpheaders/httpheaders_test.go | Adds unit tests for default UA and precedence resolution utilities. |
| providers/internal/httpheaders/httpheaders.go | Introduces shared default UA and header precedence resolution utilities. |
| providers/google/useragent_test.go | Tests Google provider UA default + override precedence. |
| providers/google/google.go | Adds provider-level WithUserAgent, default UA resolution, and wires per-call UA via wrapped HTTP client. |
| providers/google/call_useragent.go | Implements per-call UA override via context + custom RoundTripper. |
| providers/bedrock/useragent_test.go | Tests Bedrock provider UA default + override precedence. |
| providers/bedrock/bedrock.go | Adds provider-level WithUserAgent passthrough to Anthropic provider options. |
| providers/azure/useragent_test.go | Tests Azure provider UA default + override precedence. |
| providers/azure/azure.go | Adds provider-level WithUserAgent passthrough to OpenAI provider options. |
| providers/anthropic/useragent_test.go | Tests Anthropic provider UA default + override precedence. |
| providers/anthropic/call_useragent.go | Adds helper to translate call UA override into Anthropic per-request options. |
| providers/anthropic/anthropic.go | Adds provider-level WithUserAgent, default UA resolution, and applies per-call UA request options. |
| object.go | Adds ObjectCall.UserAgent to support per-object-call UA override. |
| model.go | Adds Call.UserAgent to support per-call UA override. |
| agent_useragent_test.go | Tests that agent-level UA is propagated into underlying fantasy.Call. |
| agent.go | Adds agent-level WithUserAgent and propagates it into per-step calls. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
andreynering
left a comment
There was a problem hiding this comment.
This looks good.
As a sanity check, I'd hold merge until we have the Crush PR opened so we can test both together and ensure everything keep working.
The User-Agent change per se is unlikely to break anything, but I mean mostly because of the added HTTP transports, etc.
|
There are two failures on CI.
|
Note that the user agent defaults to Charm Fantasy/<version>, which means we need to maintain a const.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
b973cf0 to
aaea4a2
Compare
|
Alrighty, good catches. Updated |
This revision sets a default user agent (e.g.
Charm Fantasy/0.11.0) and allows end users to configure the user agent on both the agent and provider level.The precedence is:
WithUserAgent()WithUserAgent()WithHeaders(map[string]string{"User-Agent": "…"})Charm Fantasy/<version>)…where higher numbers take prescience.
Related: charmbracelet/crush#2323