Documentation
¶
Index ¶
- Constants
- Variables
- func GetAllModels() map[ModelID]Model
- func IsCopilotAnthropicModel(apiModel string) bool
- func IsCopilotResponsesAPIModel(apiModel string) bool
- func LoadModelCache() error
- func RefreshProviderModels(ctx context.Context, provider ModelProvider, apiKey string, bearerToken string, ...) error
- func RefreshProviderModelsForAccount(ctx context.Context, params AccountModelRefreshParams) error
- func RegisterDynamicModel(model Model)
- func ResolveLlamaCppBaseURL(configured string) string
- func ResolveOllamaBaseURL(configured string) string
- func ResolveOllamaRawBaseURL(configured string) string
- func SaveModelCache() error
- type AccountModelRefreshParams
- type FetchedModel
- type Model
- type ModelID
- type ModelProvider
Constants ¶
const ( ProviderAnthropic ModelProvider = "anthropic" // Claude 3 family Claude3Haiku ModelID = "anthropic.claude-3-haiku-20240307" Claude3Opus ModelID = "anthropic.claude-3-opus-20240229" Claude35Sonnet ModelID = "anthropic.claude-3-5-sonnet-20241022" Claude35Haiku ModelID = "anthropic.claude-3-5-haiku-20241022" Claude37Sonnet ModelID = "anthropic.claude-3-7-sonnet-20250219" // Claude 4 family Claude4Sonnet ModelID = "anthropic.claude-sonnet-4-20250514" Claude4Opus ModelID = "anthropic.claude-opus-4-20250514" Claude4Opus1 ModelID = "anthropic.claude-opus-4-1-20250805" Claude45Sonnet ModelID = "anthropic.claude-sonnet-4-5-20250929" Claude45Haiku ModelID = "anthropic.claude-haiku-4-5-20251001" Claude45Opus ModelID = "anthropic.claude-opus-4-5-20251101" Claude46Sonnet ModelID = "anthropic.claude-sonnet-4-6" Claude46Opus ModelID = "anthropic.claude-opus-4-6" )
const ( ProviderCopilot ModelProvider = "copilot" // Model IDs match the dynamic format: "copilot.{api-id}" CopilotGTP35Turbo ModelID = "copilot.gpt-3.5-turbo" CopilotGPT4o ModelID = "copilot.gpt-4o" CopilotGPT4oMini ModelID = "copilot.gpt-4o-mini" CopilotGPT41 ModelID = "copilot.gpt-4.1" CopilotClaude35 ModelID = "copilot.claude-3.5-sonnet" CopilotClaude37 ModelID = "copilot.claude-3.7-sonnet" CopilotClaude4 ModelID = "copilot.claude-sonnet-4" CopilotO1 ModelID = "copilot.o1" CopilotO3Mini ModelID = "copilot.o3-mini" CopilotO4Mini ModelID = "copilot.o4-mini" CopilotGemini20 ModelID = "copilot.gemini-2.0-flash" CopilotGemini25 ModelID = "copilot.gemini-2.5-pro" CopilotGPT4 ModelID = "copilot.gpt-4" CopilotClaude37Thought ModelID = "copilot.claude-3.7-sonnet-thought" CopilotGPT54 ModelID = "copilot.gpt-5.4" CopilotClaudeOpus4 ModelID = "copilot.claude-opus-4" CopilotGemini25Flash ModelID = "copilot.gemini-2.5-flash" )
const ( ProviderAntigravity ModelProvider = "antigravity" ProviderGemini ModelProvider = "gemini" // Gemini 3 preview models (require preview access) Gemini31ProPreview ModelID = "gemini.gemini-3.1-pro-preview-customtools" Gemini31ProPreviewBase ModelID = "gemini.gemini-3.1-pro-preview" Gemini31FlashLitePreview ModelID = "gemini.gemini-3.1-flash-lite-preview" Gemini30ProPreview ModelID = "gemini.gemini-3-pro-preview" Gemini30Flash ModelID = "gemini.gemini-3-flash-preview" // Gemini30Flash legacy alias – config files using "gemini.gemini-3-flash" still resolve. Gemini30FlashLegacy ModelID = "gemini.gemini-3-flash" // Gemini 2.5 stable models Gemini25 ModelID = "gemini.gemini-2.5-pro" Gemini25Flash ModelID = "gemini.gemini-2.5-flash" Gemini25FlashLite ModelID = "gemini.gemini-2.5-flash-lite" // Gemini 2.5 preview aliases – config files using old preview IDs still resolve. Gemini25LegacyPreview ModelID = "gemini.gemini-2.5-pro-preview-05-06" Gemini25FlashLegacyPreview ModelID = "gemini.gemini-2.5-flash-preview-04-17" // Gemini 2.0 stable models Gemini20Flash ModelID = "gemini.gemini-2.0-flash" Gemini20FlashLite ModelID = "gemini.gemini-2.0-flash-lite" )
const ( ProviderGROQ ModelProvider = "groq" // Model IDs match the dynamic format: "groq.{api-id}" QWENQwq ModelID = "groq.qwen-qwq-32b" Llama4Scout ModelID = "groq.meta-llama/llama-4-scout-17b-16e-instruct" Llama4Maverick ModelID = "groq.meta-llama/llama-4-maverick-17b-128e-instruct" Llama3_3_70BVersatile ModelID = "groq.llama-3.3-70b-versatile" DeepseekR1DistillLlama70b ModelID = "groq.deepseek-r1-distill-llama-70b" )
const ( ProviderOllama ModelProvider = "ollama" DefaultOllamaBaseURL = "http://localhost:11434/v1" DefaultOllamaRawURL = "http://localhost:11434" )
const ( ProviderOpenAI ModelProvider = "openai" ProviderOpenAICompatible ModelProvider = "openai-compatible" // Model IDs match the dynamic format: "openai.{api-id}" GPT41 ModelID = "openai.gpt-4.1" GPT41Mini ModelID = "openai.gpt-4.1-mini" GPT41Nano ModelID = "openai.gpt-4.1-nano" GPT45Preview ModelID = "openai.gpt-4.5-preview" GPT4o ModelID = "openai.gpt-4o" GPT4oMini ModelID = "openai.gpt-4o-mini" O1 ModelID = "openai.o1" O1Pro ModelID = "openai.o1-pro" O1Mini ModelID = "openai.o1-mini" O3 ModelID = "openai.o3" O3Mini ModelID = "openai.o3-mini" O4Mini ModelID = "openai.o4-mini" )
const ( ProviderOpenRouter ModelProvider = "openrouter" // Model IDs match the dynamic format: "openrouter.{api-id}" // OpenRouter API returns IDs in "provider/model" format OpenRouterClaude37Sonnet ModelID = "openrouter.anthropic/claude-3.7-sonnet" OpenRouterClaude35Haiku ModelID = "openrouter.anthropic/claude-3.5-haiku" OpenRouterGPT41 ModelID = "openrouter.openai/gpt-4.1" OpenRouterDeepSeekR1Free ModelID = "openrouter.deepseek/deepseek-r1-0528:free" )
const ( ProviderVertexAI ModelProvider = "vertexai" // Models VertexAIGemini25Flash ModelID = "vertexai.gemini-2.5-flash" VertexAIGemini25 ModelID = "vertexai.gemini-2.5" )
const ( ProviderXAI ModelProvider = "xai" // Model IDs match the dynamic format: "xai.{api-id}" XAIGrok3Beta ModelID = "xai.grok-3-beta" XAIGrok3MiniBeta ModelID = "xai.grok-3-mini-beta" XAIGrok3FastBeta ModelID = "xai.grok-3-fast-beta" XAiGrok3MiniFastBeta ModelID = "xai.grok-3-mini-fast-beta" )
Variables ¶
var AnthropicModels = map[ModelID]Model{ Claude3Haiku: { ID: Claude3Haiku, Name: "Claude 3 Haiku", Provider: ProviderAnthropic, APIModel: "claude-3-haiku-20240307", CostPer1MIn: 0.25, CostPer1MInCached: 0.03, CostPer1MOut: 1.25, ContextWindow: 200_000, DefaultMaxTokens: 4_096, SupportsAttachments: true, }, Claude3Opus: { ID: Claude3Opus, Name: "Claude 3 Opus", Provider: ProviderAnthropic, APIModel: "claude-3-opus-20240229", CostPer1MIn: 15.0, CostPer1MInCached: 1.50, CostPer1MOut: 75.0, ContextWindow: 200_000, DefaultMaxTokens: 4_096, SupportsAttachments: true, }, Claude35Sonnet: { ID: Claude35Sonnet, Name: "Claude 3.5 Sonnet", Provider: ProviderAnthropic, APIModel: "claude-3-5-sonnet-20241022", CostPer1MIn: 3.0, CostPer1MInCached: 0.30, CostPer1MOut: 15.0, ContextWindow: 200_000, DefaultMaxTokens: 8_192, SupportsAttachments: true, }, Claude35Haiku: { ID: Claude35Haiku, Name: "Claude 3.5 Haiku", Provider: ProviderAnthropic, APIModel: "claude-3-5-haiku-20241022", CostPer1MIn: 0.80, CostPer1MInCached: 0.08, CostPer1MOut: 4.0, ContextWindow: 200_000, DefaultMaxTokens: 8_192, SupportsAttachments: true, }, Claude37Sonnet: { ID: Claude37Sonnet, Name: "Claude 3.7 Sonnet", Provider: ProviderAnthropic, APIModel: "claude-3-7-sonnet-20250219", CostPer1MIn: 3.0, CostPer1MInCached: 0.30, CostPer1MOut: 15.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, CanReason: true, SupportsAttachments: true, }, Claude4Sonnet: { ID: Claude4Sonnet, Name: "Claude Sonnet 4", Provider: ProviderAnthropic, APIModel: "claude-sonnet-4-20250514", CostPer1MIn: 3.0, CostPer1MInCached: 0.30, CostPer1MOut: 15.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, CanReason: true, SupportsAttachments: true, }, Claude4Opus: { ID: Claude4Opus, Name: "Claude Opus 4", Provider: ProviderAnthropic, APIModel: "claude-opus-4-20250514", CostPer1MIn: 15.0, CostPer1MInCached: 1.50, CostPer1MOut: 75.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, CanReason: true, SupportsAttachments: true, }, Claude4Opus1: { ID: Claude4Opus1, Name: "Claude Opus 4.1", Provider: ProviderAnthropic, APIModel: "claude-opus-4-1-20250805", CostPer1MIn: 15.0, CostPer1MInCached: 1.50, CostPer1MOut: 75.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, CanReason: true, SupportsAttachments: true, }, Claude45Sonnet: { ID: Claude45Sonnet, Name: "Claude Sonnet 4.5", Provider: ProviderAnthropic, APIModel: "claude-sonnet-4-5-20250929", CostPer1MIn: 3.0, CostPer1MInCached: 0.30, CostPer1MOut: 15.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, CanReason: true, SupportsAttachments: true, }, Claude45Haiku: { ID: Claude45Haiku, Name: "Claude Haiku 4.5", Provider: ProviderAnthropic, APIModel: "claude-haiku-4-5-20251001", CostPer1MIn: 0.80, CostPer1MInCached: 0.08, CostPer1MOut: 4.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, SupportsAttachments: true, }, Claude45Opus: { ID: Claude45Opus, Name: "Claude Opus 4.5", Provider: ProviderAnthropic, APIModel: "claude-opus-4-5-20251101", CostPer1MIn: 15.0, CostPer1MInCached: 1.50, CostPer1MOut: 75.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, CanReason: true, SupportsAttachments: true, }, Claude46Sonnet: { ID: Claude46Sonnet, Name: "Claude Sonnet 4.6", Provider: ProviderAnthropic, APIModel: "claude-sonnet-4-6", CostPer1MIn: 3.0, CostPer1MInCached: 0.30, CostPer1MOut: 15.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, CanReason: true, SupportsAttachments: true, }, Claude46Opus: { ID: Claude46Opus, Name: "Claude Opus 4.6", Provider: ProviderAnthropic, APIModel: "claude-opus-4-6", CostPer1MIn: 15.0, CostPer1MInCached: 1.50, CostPer1MOut: 75.0, ContextWindow: 200_000, DefaultMaxTokens: 32_000, CanReason: true, SupportsAttachments: true, }, }
AnthropicModels lists all supported Anthropic models with their full capabilities. Capabilities are sourced from the Claude Code CLI source (oa() and uM() functions). Context window: 200 000 tokens for all current models. Max output tokens by family (default / upper limit from oa()):
- Claude 3 Haiku: 4 096 / 4 096
- Claude 3 Opus: 4 096 / 4 096
- Claude 3.5 Sonnet / 3.5 Haiku: 8 192 / 8 192
- Claude 3.7 Sonnet: 32 000 / 64 000
- Claude 4 Sonnet / Haiku / Opus (all 4.x): 32 000 / 64 000
var AntigravityModels = map[ModelID]Model{ AntigravityGemini30Pro: { ID: AntigravityGemini30Pro, Name: "Gemini 3 Pro", Provider: ProviderAntigravity, APIModel: "gemini-3-pro-preview", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, AntigravityGemini31Pro: { ID: AntigravityGemini31Pro, Name: "Gemini 3.1 Pro", Provider: ProviderAntigravity, APIModel: "gemini-3.1-pro-preview-customtools", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, AntigravityGemini30Flash: { ID: AntigravityGemini30Flash, Name: "Gemini 3 Flash", Provider: ProviderAntigravity, APIModel: "gemini-3-flash-preview", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, SupportsAttachments: true, }, }
var AzureModels = map[ModelID]Model{ AzureGPT41: { ID: AzureGPT41, Name: "Azure OpenAI – GPT 4.1", Provider: ProviderAzure, APIModel: "gpt-4.1", CostPer1MIn: 2.00, CostPer1MInCached: 0.50, CostPer1MOut: 8.00, CostPer1MOutCached: 0.0, ContextWindow: 1_047_576, DefaultMaxTokens: 20000, SupportsAttachments: true, }, AzureGPT41Mini: { ID: AzureGPT41Mini, Name: "Azure OpenAI – GPT 4.1 mini", Provider: ProviderAzure, APIModel: "gpt-4.1-mini", CostPer1MIn: 0.40, CostPer1MInCached: 0.10, CostPer1MOut: 1.60, CostPer1MOutCached: 0.0, ContextWindow: 200_000, DefaultMaxTokens: 20000, SupportsAttachments: true, }, AzureGPT41Nano: { ID: AzureGPT41Nano, Name: "Azure OpenAI – GPT 4.1 nano", Provider: ProviderAzure, APIModel: "gpt-4.1-nano", CostPer1MIn: 0.10, CostPer1MInCached: 0.025, CostPer1MOut: 0.40, CostPer1MOutCached: 0.0, ContextWindow: 1_047_576, DefaultMaxTokens: 20000, SupportsAttachments: true, }, AzureGPT45Preview: { ID: AzureGPT45Preview, Name: "Azure OpenAI – GPT 4.5 preview", Provider: ProviderAzure, APIModel: "gpt-4.5-preview", CostPer1MIn: 75.00, CostPer1MInCached: 37.50, CostPer1MOut: 150.00, CostPer1MOutCached: 0.0, ContextWindow: 128_000, DefaultMaxTokens: 15000, SupportsAttachments: true, }, AzureGPT4o: { ID: AzureGPT4o, Name: "Azure OpenAI – GPT-4o", Provider: ProviderAzure, APIModel: "gpt-4o", CostPer1MIn: 2.50, CostPer1MInCached: 1.25, CostPer1MOut: 10.00, CostPer1MOutCached: 0.0, ContextWindow: 128_000, DefaultMaxTokens: 4096, SupportsAttachments: true, }, AzureGPT4oMini: { ID: AzureGPT4oMini, Name: "Azure OpenAI – GPT-4o mini", Provider: ProviderAzure, APIModel: "gpt-4o-mini", CostPer1MIn: 0.15, CostPer1MInCached: 0.075, CostPer1MOut: 0.60, CostPer1MOutCached: 0.0, ContextWindow: 128_000, SupportsAttachments: true, }, AzureO1: { ID: AzureO1, Name: "Azure OpenAI – O1", Provider: ProviderAzure, APIModel: "o1", CostPer1MIn: 15.00, CostPer1MInCached: 7.50, CostPer1MOut: 60.00, CostPer1MOutCached: 0.0, ContextWindow: 200_000, DefaultMaxTokens: 50000, CanReason: true, SupportsAttachments: true, }, AzureO1Mini: { ID: AzureO1Mini, Name: "Azure OpenAI – O1 mini", Provider: ProviderAzure, APIModel: "o1-mini", CostPer1MIn: 1.10, CostPer1MInCached: 0.55, CostPer1MOut: 4.40, CostPer1MOutCached: 0.0, ContextWindow: 128_000, DefaultMaxTokens: 50000, CanReason: true, SupportsAttachments: true, }, AzureO3: { ID: AzureO3, Name: "Azure OpenAI – O3", Provider: ProviderAzure, APIModel: "o3", CostPer1MIn: 10.00, CostPer1MInCached: 2.50, CostPer1MOut: 40.00, CostPer1MOutCached: 0.0, ContextWindow: 200_000, CanReason: true, SupportsAttachments: true, }, AzureO3Mini: { ID: AzureO3Mini, Name: "Azure OpenAI – O3 mini", Provider: ProviderAzure, APIModel: "o3-mini", CostPer1MIn: 1.10, CostPer1MInCached: 0.55, CostPer1MOut: 4.40, CostPer1MOutCached: 0.0, ContextWindow: 200_000, DefaultMaxTokens: 50000, CanReason: true, SupportsAttachments: false, }, AzureO4Mini: { ID: AzureO4Mini, Name: "Azure OpenAI – O4 mini", Provider: ProviderAzure, APIModel: "o4-mini", CostPer1MIn: 1.10, CostPer1MInCached: 0.275, CostPer1MOut: 4.40, CostPer1MOutCached: 0.0, ContextWindow: 128_000, DefaultMaxTokens: 50000, CanReason: true, SupportsAttachments: true, }, }
var GeminiModels = map[ModelID]Model{ Gemini31ProPreview: { ID: Gemini31ProPreview, Name: "Gemini 3.1 Pro Preview (Custom Tools)", Provider: ProviderGemini, APIModel: "gemini-3.1-pro-preview-customtools", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini31ProPreviewBase: { ID: Gemini31ProPreviewBase, Name: "Gemini 3.1 Pro Preview", Provider: ProviderGemini, APIModel: "gemini-3.1-pro-preview", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini31FlashLitePreview: { ID: Gemini31FlashLitePreview, Name: "Gemini 3.1 Flash Lite Preview", Provider: ProviderGemini, APIModel: "gemini-3.1-flash-lite-preview", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini30ProPreview: { ID: Gemini30ProPreview, Name: "Gemini 3 Pro Preview", Provider: ProviderGemini, APIModel: "gemini-3-pro-preview", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini30Flash: { ID: Gemini30Flash, Name: "Gemini 3 Flash Preview", Provider: ProviderGemini, APIModel: "gemini-3-flash-preview", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini30FlashLegacy: { ID: Gemini30FlashLegacy, Name: "Gemini 3 Flash Preview", Provider: ProviderGemini, APIModel: "gemini-3-flash-preview", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini25: { ID: Gemini25, Name: "Gemini 2.5 Pro", Provider: ProviderGemini, APIModel: "gemini-2.5-pro", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini25Flash: { ID: Gemini25Flash, Name: "Gemini 2.5 Flash", Provider: ProviderGemini, APIModel: "gemini-2.5-flash", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini25FlashLite: { ID: Gemini25FlashLite, Name: "Gemini 2.5 Flash Lite", Provider: ProviderGemini, APIModel: "gemini-2.5-flash-lite", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, SupportsAttachments: true, }, Gemini25LegacyPreview: { ID: Gemini25LegacyPreview, Name: "Gemini 2.5 Pro", Provider: ProviderGemini, APIModel: "gemini-2.5-pro", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini25FlashLegacyPreview: { ID: Gemini25FlashLegacyPreview, Name: "Gemini 2.5 Flash", Provider: ProviderGemini, APIModel: "gemini-2.5-flash", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, CanReason: true, SupportsAttachments: true, }, Gemini20Flash: { ID: Gemini20Flash, Name: "Gemini 2.0 Flash", Provider: ProviderGemini, APIModel: "gemini-2.0-flash", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, SupportsAttachments: true, }, Gemini20FlashLite: { ID: Gemini20FlashLite, Name: "Gemini 2.0 Flash Lite", Provider: ProviderGemini, APIModel: "gemini-2.0-flash-lite", ContextWindow: 1_000_000, DefaultMaxTokens: 8_192, SupportsAttachments: true, }, }
var ProviderPopularity = map[ModelProvider]int{ ProviderCopilot: 1, ProviderAnthropic: 2, ProviderOpenAI: 3, ProviderAntigravity: 4, ProviderOllama: 5, ProviderLlamaCpp: 6, ProviderGemini: 7, ProviderGROQ: 8, ProviderOpenRouter: 9, ProviderBedrock: 10, ProviderAzure: 11, ProviderVertexAI: 12, ProviderOpenAICompatible: 13, }
Providers in order of popularity
var SupportedModels = map[ModelID]Model{ BedrockClaude37Sonnet: { ID: BedrockClaude37Sonnet, Name: "Bedrock: Claude 3.7 Sonnet", Provider: ProviderBedrock, APIModel: "anthropic.claude-3-7-sonnet-20250219-v1:0", CostPer1MIn: 3.0, CostPer1MInCached: 3.75, CostPer1MOutCached: 0.30, CostPer1MOut: 15.0, }, }
var VertexAIGeminiModels = map[ModelID]Model{ VertexAIGemini25Flash: { ID: VertexAIGemini25Flash, Name: "VertexAI: Gemini 2.5 Flash", Provider: ProviderVertexAI, APIModel: "gemini-2.5-flash-preview-04-17", CostPer1MIn: 0.15, CostPer1MInCached: 0, CostPer1MOut: 0.60, CostPer1MOutCached: 0, ContextWindow: 1000000, DefaultMaxTokens: 50000, SupportsAttachments: true, }, VertexAIGemini25: { ID: VertexAIGemini25, Name: "VertexAI: Gemini 2.5 Pro", Provider: ProviderVertexAI, APIModel: "gemini-2.5-pro-preview-03-25", CostPer1MIn: 1.25, CostPer1MInCached: 0, CostPer1MOut: 10, CostPer1MOutCached: 0, ContextWindow: 1000000, DefaultMaxTokens: 50000, SupportsAttachments: true, }, }
Functions ¶
func GetAllModels ¶ added in v0.2.0
GetAllModels returns both static and dynamic models
func IsCopilotAnthropicModel ¶ added in v0.3.0
IsCopilotAnthropicModel returns true if the given API model name is an Anthropic model served through the GitHub Copilot API (detected by name containing "claude").
func IsCopilotResponsesAPIModel ¶ added in v0.100.0
IsCopilotResponsesAPIModel returns true if the model must use the OpenAI Responses API (/v1/responses) instead of Chat Completions (/v1/chat/completions). GPT-5+ models (except gpt-5-mini variants) require the Responses API.
func LoadModelCache ¶ added in v0.3.0
func LoadModelCache() error
LoadModelCache loads previously cached dynamic models into SupportedModels. Cached models do not overwrite static entries (Azure, VertexAI, Bedrock).
func RefreshProviderModels ¶ added in v0.2.0
func RefreshProviderModels(ctx context.Context, provider ModelProvider, apiKey string, bearerToken string, baseURL string) error
RefreshProviderModels fetches and registers models from a provider
func RefreshProviderModelsForAccount ¶ added in v0.252.0
func RefreshProviderModelsForAccount(ctx context.Context, params AccountModelRefreshParams) error
RefreshProviderModelsForAccount fetches and registers models for a named provider account. Model IDs are prefixed with accountID when AllAccountsOfType > 1 (disambiguates multiple accounts of same type).
func RegisterDynamicModel ¶ added in v0.2.0
func RegisterDynamicModel(model Model)
RegisterDynamicModel adds a dynamically discovered model
func ResolveLlamaCppBaseURL ¶ added in v0.291.0
ResolveLlamaCppBaseURL returns the llama-server base URL, consulting the LLAMACPP_BASE_URL environment variable as a fallback before using the built-in default (http://localhost:8080/v1).
func ResolveOllamaBaseURL ¶ added in v0.2.0
func ResolveOllamaRawBaseURL ¶ added in v0.2.0
ResolveOllamaRawBaseURL returns the raw Ollama base URL without the /v1 suffix, suitable for calling native Ollama endpoints like /api/tags.
func SaveModelCache ¶ added in v0.3.0
func SaveModelCache() error
SaveModelCache saves dynamically discovered models to a local cache file. This allows models to be available immediately on the next startup.
Types ¶
type AccountModelRefreshParams ¶ added in v0.252.0
type AccountModelRefreshParams struct {
AccountID string
ProviderType ModelProvider
APIKey string
BearerToken string
BaseURL string
ExtraHeaders map[string]string
// AllAccountsOfType is the count of non-disabled accounts sharing ProviderType,
// used to decide whether to prefix the model ID with AccountID.
AllAccountsOfType int
}
AccountModelRefreshParams holds the parameters needed to refresh models for a named account.
type FetchedModel ¶ added in v0.2.0
type FetchedModel struct {
ID string `json:"id"`
Name string `json:"name,omitempty"`
Description string `json:"description,omitempty"`
Created int64 `json:"created,omitempty"`
ContextWindow int64 `json:"context_window,omitempty"`
}
FetchedModel represents a model returned by a provider's API
func FetchModelsFromProvider ¶ added in v0.2.0
func FetchModelsFromProvider(ctx context.Context, provider ModelProvider, apiKey string, bearerToken string, baseURL string) ([]FetchedModel, error)
FetchModelsFromProvider queries a provider's API for available models
type Model ¶
type Model struct {
ID ModelID `json:"id"`
Name string `json:"name"`
Provider ModelProvider `json:"provider"`
APIModel string `json:"api_model"`
CostPer1MIn float64 `json:"cost_per_1m_in"`
CostPer1MOut float64 `json:"cost_per_1m_out"`
CostPer1MInCached float64 `json:"cost_per_1m_in_cached"`
CostPer1MOutCached float64 `json:"cost_per_1m_out_cached"`
ContextWindow int64 `json:"context_window"`
DefaultMaxTokens int64 `json:"default_max_tokens"`
CanReason bool `json:"can_reason"`
SupportsReasoningEffort bool `json:"supports_reasoning_effort"`
SupportsAttachments bool `json:"supports_attachments"`
// AccountID is the ProviderAccount.ID that this model belongs to.
// Empty means the model comes from the legacy single-account system.
AccountID string `json:"account_id,omitempty"`
}
func (Model) DisplayLabel ¶ added in v0.252.0
DisplayLabel returns the display label for a model. sameTypeAccountCount is how many non-disabled accounts share this model's provider type. If > 1, the account ID is prefixed to disambiguate.
type ModelID ¶
type ModelID string
const ( AzureGPT41 ModelID = "azure.gpt-4.1" AzureGPT41Mini ModelID = "azure.gpt-4.1-mini" AzureGPT41Nano ModelID = "azure.gpt-4.1-nano" AzureGPT45Preview ModelID = "azure.gpt-4.5-preview" AzureGPT4o ModelID = "azure.gpt-4o" AzureGPT4oMini ModelID = "azure.gpt-4o-mini" AzureO1 ModelID = "azure.o1" AzureO1Mini ModelID = "azure.o1-mini" AzureO3 ModelID = "azure.o3" AzureO3Mini ModelID = "azure.o3-mini" AzureO4Mini ModelID = "azure.o4-mini" )
const ( // Bedrock BedrockClaude37Sonnet ModelID = "bedrock.claude-3.7-sonnet" )
Model IDs
func NormalizeModelID ¶ added in v0.210.0
type ModelProvider ¶
type ModelProvider string
const ( ProviderLlamaCpp ModelProvider = "llama-cpp" DefaultLlamaCppBaseURL = "http://localhost:8080/v1" )
const ( ProviderBedrock ModelProvider = "bedrock" // ForTests ProviderMock ModelProvider = "__mock" )
const ProviderAzure ModelProvider = "azure"
const (
ProviderLocal ModelProvider = "local"
)