跳转至

提供方与模型

本包包含两种协议适配器:

  • openai-completions
  • anthropic-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_KEYMIMO_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.APIKeyStreamOptions.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 接受的模态:TextImage
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)

已完成请求上对应的 UsageUsageCost 记录参见读取响应

自定义与兼容端点

任何实现了内置协议之一的端点,都可以通过直接构造一个 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 配合 OpenAICompletionsCompatibilityAnthropicMessagesCompatibility 配置。只需设置与默认不同的字段;每个字段都是指针,未设置时保持适配器原有行为不变。

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 兼容,请实现一个自定义协议适配器