Skip to content

feat: user agent#152

Open
meowgorithm wants to merge 10 commits intomainfrom
user-agent
Open

feat: user agent#152
meowgorithm wants to merge 10 commits intomainfrom
user-agent

Conversation

@meowgorithm
Copy link
Member

@meowgorithm meowgorithm commented Feb 27, 2026

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.

// Set it on the provider level
provider, _ := open router.New(
    openrouter.WithAPIKey(key),
    openrouter.WithUserAgent("MyHotAgent/0.1.0"),
)

// Set it on the agent level
agent := open router.New(
    model,
    fantasy.WithUserAgent("MyHotterAgent/0.1.0"),
)

The precedence is:

  1. Agent-level WithUserAgent()
  2. Provider-level WithUserAgent()
  3. Provider-level WithHeaders(map[string]string{"User-Agent": "…"})
  4. Default (Charm Fantasy/<version>)

…where higher numbers take prescience.

Related: charmbracelet/crush#2323

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.txt and expose it as fantasy.Version for 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/httpheaders utilities for default UA + precedence resolution; add provider-specific WithUserAgent options 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.

Copy link
Member

@andreynering andreynering left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@andreynering
Copy link
Member

There are two failures on CI.

  • lint: just need to format with gofumpt
  • govulncheck: just need a rebase or merge from main. A dependency was updated.

@meowgorithm
Copy link
Member Author

Alrighty, good catches. Updated task release, gofumpt-ed, and rebased on main.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants