提供方与模型¶
本包包含两种协议适配器:
openai-completionsanthropic-messages
目录与兼容层显式配置了以下提供方:
| 提供方 | Provider ID | 协议 | 环境变量 |
|---|---|---|---|
| DeepSeek | deepseek |
openai-completions |
DEEPSEEK_API_KEY |
| MiniMax Global | minimax |
anthropic-messages |
MINIMAX_API_KEY |
| MiniMax China | minimax-cn |
anthropic-messages |
MINIMAX_CN_API_KEY |
| Xiaomi MiMo | xiaomi |
openai-completions |
XIAOMI_API_KEY 或 MIMO_API_KEY |
| Z.AI Global | zai |
openai-completions |
ZAI_API_KEY |
| Zhipu Coding Plan China | zai-coding-cn |
openai-completions |
ZAI_CODING_CN_API_KEY |
| Moonshot AI Global | moonshotai |
openai-completions |
MOONSHOT_API_KEY |
| Moonshot AI China | moonshotai-cn |
openai-completions |
MOONSHOT_API_KEY |
| Kimi Coding | kimi-coding |
anthropic-messages |
KIMI_API_KEY |
目录中还包含其他兼容提供方和模型的元数据。这些条目可供查询,并且可能通过两种协议适配器之一正常工作,但它们尚未全部针对线上提供方 API 验证过,不构成支持保证。自动化测试通过本地 mock 服务器覆盖两种适配器,而非对每个提供方进行线上集成测试。
本包只读取 llm.GetModel 所选提供方的 key。也可以通过 StreamOptions.APIKey 或 StreamOptions.Env 提供请求级别的凭证。
发现模型¶
与其硬编码动态提供的模型 ID,不如直接查询目录:
for _, provider := range llm.GetProviders() {
fmt.Println(provider)
for _, model := range llm.GetModels(provider) {
fmt.Printf(" %s: %s\n", model.ID, model.Name)
}
}
model, ok := llm.LookupModel("xiaomi", "mimo-v2-flash")
if !ok {
log.Fatal("model not found")
}
LookupModel 返回模型和一个表示是否找到的标志。GetModel 适用于已知的目录条目,在提供方或模型 ID 不存在时会 panic。
模型元数据¶
Model 同时是一份只读的元数据记录。可在请求前读取它来驱动 UI、施加限制或估算成本:
| 字段 | 类型 | 含义 |
|---|---|---|
ID |
string |
发送给提供方的标识符 |
Name |
string |
可读的展示名 |
Provider |
string |
厂商键,如 anthropic |
Protocol |
Protocol |
由哪个适配器处理 |
BaseURL |
string |
端点基础 URL |
Headers |
map[string]string |
合并进每次请求的默认请求头 |
Reasoning |
bool |
模型能否产生思考内容 |
Input |
[]ModelInput |
接受的模态:Text、Image |
ContextWindow |
int64 |
最大总 token 数(输入 + 输出) |
MaxTokens |
int64 |
模型可生成的最大 token 数 |
Cost |
ModelCost |
每百万 token 的定价 |
Compatibility |
ModelCompatibility |
协议特定的覆盖项(见下文) |
Reasoning 只表明是否支持思考;要读取模型实际接受的精确等级,请用SupportedThinkingLevels,而不是直接读 ThinkingLevelMap。
Cost 中的价格是每百万 token 的单价,与 CalculateCost 的计费方式一致:
| 字段 | 含义 |
|---|---|
Input |
每百万输入 token 的价格 |
Output |
每百万输出 token 的价格 |
CacheRead |
每百万缓存读取 token 的价格 |
CacheWrite |
每百万缓存写入 token 的价格 |
model, _ := llm.LookupModel("deepseek", "deepseek-v4-flash")
fmt.Printf("%s: %d-token window, $%.2f/M in, $%.2f/M out\n",
model.Name, model.ContextWindow, model.Cost.Input, model.Cost.Output)
已完成请求上对应的 Usage 与 UsageCost 记录参见读取响应。
自定义与兼容端点¶
任何实现了内置协议之一的端点,都可以通过直接构造一个 Model 并设置 BaseURL 来使用。这涵盖 Ollama、vLLM、LM Studio 等本地服务器,以及私有模型网关:
model := llm.Model{
ID: "qwen2.5-coder:7b",
Name: "Qwen2.5 Coder 7B",
Provider: "ollama",
Protocol: llm.ProtocolOpenAICompletions,
BaseURL: "http://localhost:11434/v1",
Input: []llm.ModelInput{llm.Text},
ContextWindow: 32768,
MaxTokens: 4096,
}
events, err := llm.Stream(ctx, model, input, llm.StreamOptions{APIKey: "ollama"})
端点特定的行为(推理字段名、cache-control 支持以及类似差异)通过 Model.Compatibility 配合 OpenAICompletionsCompatibility 或 AnthropicMessagesCompatibility 配置。只需设置与默认不同的字段;每个字段都是指针,未设置时保持适配器原有行为不变。
supports := func(b bool) *bool { return &b }
// OpenAI 兼容端点:其上限字段名为 "max_completion_tokens",并接受推理强度字段。
model.Compatibility = &llm.OpenAICompletionsCompatibility{
MaxTokensField: "max_completion_tokens",
SupportsReasoningEffort: supports(true),
}
// Anthropic 兼容端点:不支持 cache control。
model.Compatibility = &llm.AnthropicMessagesCompatibility{
SupportsCacheControl: supports(false),
}
如果某个通信协议既非 OpenAI 兼容也非 Anthropic 兼容,请实现一个自定义协议适配器。