提供商管理

本页覆盖提供商目录加载、模型元数据、别名、路由、成本控制、后备行为、REST 端点、频道命令和安全说明。

包含的主题

  • 动态提供商加载
  • 模型目录
  • 模型别名
  • 每个 Agent 的模型覆盖
  • 模型路由
  • 成本追踪
  • 后备提供商
  • API 端点
  • 频道命令
  • 环境变量汇总
  • 安全说明

动态提供商加载

官方提供商定义从注册表预安装到 ~/.librefang/providers/。要添加或覆盖提供商,请在同一目录下放置自定义 .toml 文件。每个文件定义一个提供商:

# ~/.librefang/providers/my-endpoint.toml
id = "my-endpoint"
display_name = "My Private Endpoint"
driver = "openai_compatible"
base_url = "https://llm.internal.company.com/v1"
api_key_env = "MY_ENDPOINT_KEY"
key_required = true

[[models]]
id = "my-model-7b"
display_name = "My Model 7B"
tier = "Balanced"
context_window = 32768
max_output_tokens = 4096
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_tools = true
supports_vision = false

~/.librefang/providers/ 中的文件在启动时加载,并与内置提供商一起合并到目录中。

自定义图像生成 provider

不在内置列表(openaigeminielevenlabsminimaxgoogle_tts)的媒体驱动名以前会失败 "Unknown media provider"。现在配置了 URL 的自定义 provider 会落到通用 OpenAI 兼容图像驱动:

# config.toml
[provider_urls]
volcengine = "https://open.volcengineapi.com/v1"
tongyi     = "https://dashscope.aliyuncs.com/compatible-mode/v1"
export VOLCENGINE_API_KEY="sk-..."
export TONGYI_API_KEY="sk-..."

驱动期望标准的 OpenAI Images API 请求/响应形状(/images/generations 端点,返回 b64_jsonurl)。设 [media] image_provider = "volcengine"(或在 [provider_urls] 里用的任何 id)把图像生成调用路由过去。

驱动侧文件上传

Moonshot(Kimi)驱动在转发请求到 /v1/chat/completions 之前先把附件上传到 /v1/files,所以带 image / PDF / text 附件的消息端到端就能工作,不用你按附件做封送。文件写到 std::env::temp_dir(),上传前做了 content-type 校验、大小限制、文件名净化。这是透明的 — 不需要额外配置;像平时一样通过 POST /api/agents/{id}/upload 或 dashboard 聊天附文件即可。

提供商区域

部分提供商提供区域特定的端点。区域在注册表 TOML 文件中定义,并支持可选的 api_key_env 覆盖:

# 在提供商的注册表 TOML 中:
[provider.regions.intl]
base_url = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"

[provider.regions.china]
base_url = "https://api.minimaxi.com/v1"
api_key_env = "MINIMAX_CN_API_KEY"    # 可选:覆盖默认的 API 密钥环境变量

config.toml 中选择区域:

[provider_regions]
qwen = "intl"
minimax = "china"

优先级: 区域选择在显式的 [provider_urls] 条目之前应用。如果同一提供商同时设置了两者,provider_urls 优先。


模型目录

所有 230+ 个内置模型的完整目录,按提供商排序。价格单位为每百万 token。

#模型 ID显示名称提供商层级上下文窗口最大输出输入 $/M输出 $/M工具视觉
1claude-opus-4-20250514Claude Opus 4anthropic旗舰200,00032,000$15.00$75.00
2claude-sonnet-4-20250514Claude Sonnet 4anthropic智能200,00064,000$3.00$15.00
3claude-haiku-4-5-20251001Claude Haiku 4.5anthropic快速200,0008,192$0.25$1.25
4gpt-4.1GPT-4.1openai旗舰1,047,57632,768$2.00$8.00
5gpt-4oGPT-4oopenai智能128,00016,384$2.50$10.00
6o3-minio3-miniopenai智能200,000100,000$1.10$4.40
7gpt-4.1-miniGPT-4.1 Miniopenai平衡1,047,57632,768$0.40$1.60
8gpt-4o-miniGPT-4o Miniopenai快速128,00016,384$0.15$0.60
9gpt-4.1-nanoGPT-4.1 Nanoopenai快速1,047,57632,768$0.10$0.40
10gemini-2.5-proGemini 2.5 Progemini旗舰1,048,57665,536$1.25$10.00
11gemini-2.5-flashGemini 2.5 Flashgemini智能1,048,57665,536$0.15$0.60
12gemini-2.0-flashGemini 2.0 Flashgemini快速1,048,5768,192$0.10$0.40
13deepseek-chatDeepSeek V3deepseek智能64,0008,192$0.27$1.10
14deepseek-reasonerDeepSeek R1deepseek智能64,0008,192$0.55$2.19
15llama-3.3-70b-versatileLlama 3.3 70Bgroq平衡128,00032,768$0.059$0.079
16mixtral-8x7b-32768Mixtral 8x7Bgroq平衡32,7684,096$0.024$0.024
17llama-3.1-8b-instantLlama 3.1 8Bgroq快速128,0008,192$0.05$0.08
18gemma2-9b-itGemma 2 9Bgroq快速8,1924,096$0.02$0.02
19openrouter/google/gemini-2.5-flashGemini 2.5 Flash (OpenRouter)openrouter智能1,048,57665,536$0.15$0.60
20openrouter/anthropic/claude-sonnet-4Claude Sonnet 4 (OpenRouter)openrouter智能200,00064,000$3.00$15.00
21openrouter/openai/gpt-4oGPT-4o (OpenRouter)openrouter智能128,00016,384$2.50$10.00
22openrouter/deepseek/deepseek-chatDeepSeek V3 (OpenRouter)openrouter智能128,00032,768$0.14$0.28
23openrouter/meta-llama/llama-3.3-70b-instructLlama 3.3 70B (OpenRouter)openrouter平衡128,00032,768$0.39$0.39
24openrouter/qwen/qwen-2.5-72b-instructQwen 2.5 72B (OpenRouter)openrouter平衡128,00032,768$0.36$0.36
25openrouter/google/gemini-2.5-proGemini 2.5 Pro (OpenRouter)openrouter旗舰1,048,57665,536$1.25$10.00
26openrouter/mistralai/mistral-large-latestMistral Large (OpenRouter)openrouter智能128,0008,192$2.00$6.00
27openrouter/google/gemma-2-9b-itGemma 2 9B (OpenRouter)openrouter快速8,1924,096$0.00$0.00
28openrouter/deepseek/deepseek-r1DeepSeek R1 (OpenRouter)openrouter旗舰128,00032,768$0.55$2.19
29mistral-large-latestMistral Largemistral智能128,0008,192$2.00$6.00
30codestral-latestCodestralmistral智能32,0008,192$0.30$0.90
31mistral-small-latestMistral Smallmistral快速128,0008,192$0.10$0.30
32meta-llama/Meta-Llama-3.1-405B-Instruct-TurboLlama 3.1 405B (Together)together旗舰130,0004,096$3.50$3.50
33Qwen/Qwen2.5-72B-Instruct-TurboQwen 2.5 72B (Together)together智能32,7684,096$0.20$0.60
34mistralai/Mixtral-8x22B-Instruct-v0.1Mixtral 8x22B (Together)together平衡65,5364,096$0.60$0.60
35accounts/fireworks/models/llama-v3p1-405b-instructLlama 3.1 405B (Fireworks)fireworks旗舰131,07216,384$3.00$3.00
36accounts/fireworks/models/mixtral-8x22b-instructMixtral 8x22B (Fireworks)fireworks平衡65,5364,096$0.90$0.90
37llama3.2Llama 3.2 (Ollama)ollama本地128,0004,096$0.00$0.00
38mistral:latestMistral (Ollama)ollama本地32,7684,096$0.00$0.00
39phi3Phi-3 (Ollama)ollama本地128,0004,096$0.00$0.00
40vllm-localvLLM Local Modelvllm本地32,7684,096$0.00$0.00
41lmstudio-localLM Studio Local Modellmstudio本地32,7684,096$0.00$0.00
42sonar-proSonar Properplexity智能200,0008,192$3.00$15.00
43sonarSonarperplexity平衡128,0008,192$1.00$5.00
44command-r-plusCommand R+cohere智能128,0004,096$2.50$10.00
45command-rCommand Rcohere平衡128,0004,096$0.15$0.60
46jamba-1.5-largeJamba 1.5 Largeai21智能256,0004,096$2.00$8.00
47cerebras/llama3.3-70bLlama 3.3 70B (Cerebras)cerebras平衡128,0008,192$0.06$0.06
48cerebras/llama3.1-8bLlama 3.1 8B (Cerebras)cerebras快速128,0008,192$0.01$0.01
49sambanova/llama-3.3-70bLlama 3.3 70B (SambaNova)sambanova平衡128,0008,192$0.06$0.06
50grok-2Grok 2xai智能131,07232,768$2.00$10.00
51grok-2-miniGrok 2 Minixai快速131,07232,768$0.30$0.50
52hf/meta-llama/Llama-3.3-70B-InstructLlama 3.3 70B (HF)huggingface平衡128,0004,096$0.30$0.30
53replicate/meta-llama-3.3-70b-instructLlama 3.3 70B (Replicate)replicate平衡128,0004,096$0.40$0.40

模型层级:

层级描述典型用途
旗舰能力最强,成本最高编排、架构设计、安全审计
智能推理能力强,成本适中编码、代码审查、研究、分析
平衡性价比好规划、写作、DevOps、日常任务
快速云端推理最便宜运维、翻译、简单问答、健康检查
本地自托管,零成本隐私优先、离线使用、开发环境

说明:

  • 本地提供商(Ollama、vLLM、LM Studio)在运行时自动发现模型。你下载并启动的任何模型都会以 Local 层级和零成本合并到目录中。
  • 以上条目是 230+ 个内置模型的代表性子集。完整目录包含每个提供商的更多模型,以及因安装环境而异的运行时自动发现模型。

模型别名

全部 23 个别名解析为规范模型 ID。别名不区分大小写。

别名解析为
sonnetclaude-sonnet-4-20250514
claude-sonnetclaude-sonnet-4-20250514
haikuclaude-haiku-4-5-20251001
claude-haikuclaude-haiku-4-5-20251001
opusclaude-opus-4-20250514
claude-opusclaude-opus-4-20250514
gpt4gpt-4o
gpt4ogpt-4o
gpt4-minigpt-4o-mini
flashgemini-2.5-flash
gemini-flashgemini-2.5-flash
gemini-progemini-2.5-pro
deepseekdeepseek-chat
llamallama-3.3-70b-versatile
llama-70bllama-3.3-70b-versatile
mixtralmixtral-8x7b-32768
mistralmistral-large-latest
codestralcodestral-latest
grokgrok-2
grok-minigrok-2-mini
sonarsonar-pro
jambajamba-1.5-large
command-rcommand-r-plus

你可以在任何接受模型 ID 的地方使用别名:配置文件、REST API 调用、聊天命令以及模型路由配置。


每个 Agent 的模型覆盖

config.toml 中的每个 Agent 都可以指定自己的模型,覆盖全局默认值:

# 全局默认模型
[agents.defaults]
model = "claude-sonnet-4-20250514"

# 逐 Agent 覆盖:使用别名或完整模型 ID
[[agents]]
name = "orchestrator"
model = "opus"                      # claude-opus-4-20250514 的别名

[[agents]]
name = "ops"
model = "llama-3.3-70b-versatile"   # 便宜的 Groq 模型,用于简单运维

[[agents]]
name = "coder"
model = "gemini-2.5-flash"          # 快速 + 便宜 + 100 万上下文

[[agents]]
name = "researcher"
model = "sonar-pro"                 # Perplexity,内置网页搜索

# 也可以在 agent manifest TOML 中固定模型
[[agents]]
name = "production-bot"
pinned_model = "claude-sonnet-4-20250514"  # 永不自动路由

当 Agent manifest 设置了 pinned_model 时,该 Agent 始终使用指定模型,忽略路由配置。此功能用于稳定模式KernelMode::Stable),在该模式下模型被冻结以确保生产可靠性。


模型路由

LibreFang 可以自动为每个查询选择能够处理该查询的最便宜模型。这通过 ModelRoutingConfig 在逐 Agent 级别配置。

工作原理

  1. ModelRouter 根据启发式规则对每个传入的 CompletionRequest 进行评分
  2. 评分映射到一个 TaskComplexity 层级:SimpleMediumComplex
  3. 每个层级有一个预配置的模型

评分启发式规则

信号权重逻辑
总消息长度每 ~4 个字符 1 分粗略的 token 近似
工具可用性每个定义的工具 +20有工具意味着多步骤工作
代码标记每个标记 +30反引号、fndefclassimportfunctionasyncawaitstructimplreturn
对话深度每条超过 10 条的消息 +15深层上下文 = 更难的推理
系统提示长度每 10 个字符(超过 500)+1长系统提示意味着复杂任务

阈值

复杂度分数范围默认模型
Simplescore < 100claude-haiku-4-5-20251001
Medium100 <= score < 500claude-sonnet-4-20250514
Complexscore >= 500claude-sonnet-4-20250514

配置

模型路由仅在 agent manifest 中逐 Agent 配置,不是 ~/.librefang/config.toml 的顶层字段。如果把 [routing] 放到 config.toml 顶层会被忽略(内核日志会打印 Unknown config field (ignored) field="routing")。

# 在 agent manifest 文件中
[routing]
simple_model = "claude-haiku-4-5-20251001"
medium_model = "gemini-2.5-flash"
complex_model = "claude-sonnet-4-20250514"
simple_threshold = 100
complex_threshold = 500

路由器还与模型目录集成:

  • validate_models() 检查所有配置的模型 ID 是否存在于目录中
  • resolve_aliases() 将别名展开为规范 ID(例如 "sonnet" 变为 "claude-sonnet-4-20250514"

成本追踪

LibreFang 追踪每次 LLM 调用的成本,并可以强制执行逐 Agent 的消费配额。

每次响应的成本估算

每次 LLM 调用后,成本按以下公式计算:

cost = (input_tokens / 1,000,000) * input_rate + (output_tokens / 1,000,000) * output_rate

MeteringEngine 首先检查模型目录获取精确定价。如果未找到模型,则回退到模式匹配的启发式规则。

成本费率(每百万 token)

模型匹配模式输入 $/M输出 $/M
*haiku*$0.25$1.25
*sonnet*$3.00$15.00
*opus*$15.00$75.00
gpt-4o-mini$0.15$0.60
gpt-4o$2.50$10.00
gpt-4.1-nano$0.10$0.40
gpt-4.1-mini$0.40$1.60
gpt-4.1$2.00$8.00
o3-mini$1.10$4.40
gemini-2.5-pro$1.25$10.00
gemini-2.5-flash$0.15$0.60
gemini-2.0-flash$0.10$0.40
deepseek-reasoner / deepseek-r1$0.55$2.19
*deepseek*$0.27$1.10
*cerebras*$0.06$0.06
*sambanova*$0.06$0.06
*replicate*$0.40$0.40
*llama* / *mixtral*$0.05$0.10
*qwen*$0.20$0.60
mistral-large*$2.00$6.00
*mistral*(其他)$0.10$0.30
command-r-plus$2.50$10.00
command-r$0.15$0.60
sonar-pro$3.00$15.00
*sonar*(其他)$1.00$5.00
grok-2-mini / grok-mini$0.30$0.50
*grok*(其他)$2.00$10.00
*jamba*$2.00$8.00
默认(未知)$1.00$3.00

配额强制执行

每次 LLM 调用都会检查配额。如果 Agent 超出每小时限额,调用会被拒绝并返回 QuotaExceeded 错误。

# config.toml 中的逐 Agent 配额
[[agents]]
name = "chatbot"
[agents.resources]
max_cost_per_hour_usd = 5.00   # 每小时上限 $5

使用量页脚(启用时)会在每次响应后附加成本信息:

> Cost: $0.0042 | Tokens: 1,200 in / 340 out | Model: claude-sonnet-4-20250514

后备提供商

FallbackDriver 将多个 LLM 驱动包装成一个链。如果主驱动失败,会自动尝试链中的下一个驱动。

行为

  • 成功时:立即返回
  • 速率限制/过载错误(429529):向上冒泡以进行重试逻辑(不进行故障转移,因为主驱动应在退避后重试)
  • 所有其他错误:记录警告并尝试链中的下一个驱动
  • 所有驱动都失败时:返回最后一个错误

配置

后备链在 Agent manifest 或 config.toml 中配置。当 Agent 处于稳定模式KernelMode::Stable)或为提高可靠性配置了多个提供商时,FallbackDriver 会自动使用。

# 示例:主用 Anthropic,后备 Gemini,然后 Groq
[[agents]]
name = "production-bot"
model = "claude-sonnet-4-20250514"
fallback_models = ["gemini-2.5-flash", "llama-3.3-70b-versatile"]

后备驱动创建的链为:AnthropicDriver -> GeminiDriver -> OpenAIDriver(Groq)


API 端点

列出所有模型

GET /api/models

返回包含元数据、定价和功能标志的完整模型目录。

响应:

[
  {
    "id": "claude-sonnet-4-20250514",
    "display_name": "Claude Sonnet 4",
    "provider": "anthropic",
    "tier": "Smart",
    "context_window": 200000,
    "max_output_tokens": 64000,
    "input_cost_per_m": 3.0,
    "output_cost_per_m": 15.0,
    "supports_tools": true,
    "supports_vision": true,
    "supports_streaming": true,
    "aliases": ["sonnet", "claude-sonnet"]
  }
]

获取指定模型

GET /api/models/{id}

返回单个模型条目。支持规范 ID 和别名。

GET /api/models/sonnet
GET /api/models/claude-sonnet-4-20250514

列出别名

GET /api/models/aliases

返回所有别名到规范 ID 的映射。

响应:

{
  "sonnet": "claude-sonnet-4-20250514",
  "haiku": "claude-haiku-4-5-20251001",
  "flash": "gemini-2.5-flash",
  "grok": "grok-2"
}

列出提供商

GET /api/providers

返回所有 49 个提供商及其认证状态和模型数量。

响应:

[
  {
    "id": "anthropic",
    "display_name": "Anthropic",
    "api_key_env": "ANTHROPIC_API_KEY",
    "base_url": "https://api.anthropic.com",
    "key_required": true,
    "auth_status": "Configured",
    "model_count": 3
  },
  {
    "id": "ollama",
    "display_name": "Ollama",
    "api_key_env": "OLLAMA_API_KEY",
    "base_url": "http://localhost:11434/v1",
    "key_required": false,
    "auth_status": "NotRequired",
    "model_count": 5
  }
]

认证状态值:Configured(已配置)、Missing(缺失)、NotRequired(无需配置)。

设置提供商 API 密钥

POST /api/providers/{name}/key
Content-Type: application/json

{ "api_key": "sk-..." }

在运行时为提供商配置 API 密钥(存储为 Zeroizing<String>,值被丢弃时自动从内存中擦除)。

删除提供商 API 密钥

DELETE /api/providers/{name}/key

删除提供商已配置的 API 密钥。

测试提供商连接

POST /api/providers/{name}/test

发送一个最小化的测试请求,以验证提供商可达且 API 密钥有效。


频道命令

在任何频道中均可使用以下两个聊天命令来检查模型和提供商:

/models

列出所有可用模型及其层级、提供商和上下文窗口。仅显示已配置认证(或无需认证)的提供商下的模型。

/models

示例输出:

Available models (12):

Frontier:
  claude-opus-4-20250514 (Anthropic) — 200K ctx
  gemini-2.5-pro (Google Gemini) — 1M ctx

Smart:
  claude-sonnet-4-20250514 (Anthropic) — 200K ctx
  gemini-2.5-flash (Google Gemini) — 1M ctx
  deepseek-chat (DeepSeek) — 64K ctx

Balanced:
  llama-3.3-70b-versatile (Groq) — 128K ctx

Fast:
  claude-haiku-4-5-20251001 (Anthropic) — 200K ctx
  gemini-2.0-flash (Google Gemini) — 1M ctx

Local:
  llama3.2 (Ollama) — 128K ctx

/providers

列出所有 49 个提供商及其认证状态。

/providers

示例输出:

LLM Providers (49):

  Anthropic          ANTHROPIC_API_KEY       Configured    3 models
  OpenAI             OPENAI_API_KEY          Missing       6 models
  Google Gemini      GEMINI_API_KEY          Configured    3 models
  DeepSeek           DEEPSEEK_API_KEY        Missing       2 models
  Groq               GROQ_API_KEY            Configured    4 models
  Ollama             (no key needed)         Ready         3 models
  vLLM               (no key needed)         Ready         1 model
  LM Studio          (no key needed)         Ready         1 model
  ...

环境变量汇总

所有提供商环境变量的快速参考:

提供商环境变量是否必需
AnthropicANTHROPIC_API_KEY
OpenAIOPENAI_API_KEY
Google GeminiGEMINI_API_KEYGOOGLE_API_KEY
DeepSeekDEEPSEEK_API_KEY
GroqGROQ_API_KEY
OpenRouterOPENROUTER_API_KEY
Mistral AIMISTRAL_API_KEY
Together AITOGETHER_API_KEY
Fireworks AIFIREWORKS_API_KEY
OllamaOLLAMA_API_KEY
vLLMVLLM_API_KEY
LM StudioLMSTUDIO_API_KEY
Perplexity AIPERPLEXITY_API_KEY
CohereCOHERE_API_KEY
AI21 LabsAI21_API_KEY
CerebrasCEREBRAS_API_KEY
SambaNovaSAMBANOVA_API_KEY
Hugging FaceHF_API_KEY
xAIXAI_API_KEY
ReplicateREPLICATE_API_TOKEN
Claude CodeANTHROPIC_API_KEY
NVIDIA NIMNVIDIA_API_KEY
Voyage AIVOYAGE_API_KEY
AnyscaleANYSCALE_API_KEY
DeepInfraDEEPINFRA_API_KEY
Azure OpenAIAZURE_OPENAI_API_KEYAZURE_OPENAI_ENDPOINT
Amazon BedrockAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_REGION
Google Vertex AIGOOGLE_APPLICATION_CREDENTIALSVERTEX_PROJECTVERTEX_LOCATION

安全说明

  • 所有 API 密钥存储为 Zeroizing<String> -- 当值从内存中丢弃时,密钥内容会被自动用零覆盖。
  • 认证检测(detect_auth())仅检查 std::env::var() 是否存在 -- 不会读取或记录实际的密钥值。
  • 通过 REST API 设置的提供商 API 密钥(POST /api/providers/{name}/key)遵循相同的零化策略。
  • 健康检查端点(/api/health)不会暴露提供商认证状态或 API 密钥。详细信息位于 /api/health/detail,需要认证才能访问。
  • 所有 DriverConfigKernelConfig 结构体的 Debug 实现均包含密钥脱敏 -- API 密钥在日志中显示为 "***"

Provider 故障转移链

源码: librefang-llm-drivers/src/drivers/fallback_chain.rs

FallbackChain 允许你配置一个按顺序尝试的 LLM Provider 列表。当某个 provider 失败时,运行时会对失败类型分类,决定是切换到下一个 provider 还是立即返回错误。

故障转移原因

LibreFang 在决定是否向前切换之前,会对每次失败进行分类:

FailoverReason说明是否转移?
RateLimitHTTP 429 或 x-ratelimit-remaining: 0是 — 尝试下一个 provider
Timeout请求超过配置的超时时限
ServerErrorHTTP 5xx 响应
ModelNotFound请求的模型 ID 返回 HTTP 404
AuthErrorHTTP 401 / 403否 — 密钥配置错误,立即停止
Unknown其他任何错误

AuthError 故意不向前转移——密钥缺失或被吊销需要运维人员处理,静默重试会掩盖问题。

配置

~/.librefang/config.toml 中通过 [[providers.fallback_chain]] 定义链:

[[providers.fallback_chain]]
name = "anthropic"
model = "claude-sonnet-4-5"

[[providers.fallback_chain]]
name = "openai"
model = "gpt-4o"

[[providers.fallback_chain]]
name = "openai-compatible"
base_url = "http://localhost:11434/v1"
model = "llama3.1:8b"

LibreFang 按顺序尝试列表中的每个 provider。若所有 provider 均因可转移原因失败,则返回最后一个 provider 的错误。

与 Credential Pool 的交互

故障转移链中的每个条目都可以拥有由 Credential Pool 管理的多个密钥。当一个密钥的速率限制耗尽时,pool 会在链切换到下一个 provider 之前先轮转到该 provider 的下一个密钥。


Credential Pool

源码: librefang-llm-drivers/src/credential_pool.rs

CredentialPool 管理单个 provider 的多个 API Key,并自动在它们之间轮转。这可以在无需手动干预的情况下扩展有效速率限制,并在个别密钥临时耗尽时保持服务连续性。

轮转策略

策略行为
FillFirst始终使用第一个未耗尽的密钥,按顺序跳过已耗尽的密钥。
RoundRobin按固定循环依次轮换密钥,跳过已耗尽的密钥。
Random每次请求随机选择一个未耗尽的密钥。
LeastUsed选择总请求次数最少的未耗尽密钥。

默认策略为 RoundRobin

配置

[providers.anthropic]
rotation_strategy = "round_robin"  # fill_first | round_robin | random | least_used

[[providers.anthropic.keys]]
key = "sk-ant-key-1"

[[providers.anthropic.keys]]
key = "sk-ant-key-2"

[[providers.anthropic.keys]]
key = "sk-ant-key-3"

耗尽与冷却

当响应头报告剩余配额为零时(x-ratelimit-remaining-requests: 0x-ratelimit-remaining-tokens: 0),密钥被标记为已耗尽,所有轮转策略均会跳过它。

1 小时后,已耗尽的密钥自动重新加入活跃池。此冷却时长在当前版本不可配置;与大多数 OpenAI 兼容 provider 使用的标准窗口对应。

若池中所有密钥同时耗尽,CredentialPool 返回 RateLimit 错误,触发向故障转移链中下一个 provider 切换(如已配置)。

用量追踪

池中每个密钥追踪:

  • 总请求次数
  • 总 token 数(提示词 + 补全)
  • 耗尽时间戳(如当前已耗尽)

这些计数器仅保存在内存中,守护进程重启后重置。持久用量追踪通过预算账本(/api/providers/{name}/usage)提供。


速率限制追踪器

源码: librefang-llm-drivers/src/rate_limit_tracker.rs

每次 LLM API 响应后,LibreFang 将 provider 的速率限制响应头解析为 RateLimitSnapshot。该快照供 Credential Pool 检测耗尽状态,并在控制台和 CLI 中展示给运维人员。

解析的响应头

LibreFang 识别主流 provider 的 21 种响应头变体

响应头含义
x-ratelimit-limit-requests窗口请求上限
x-ratelimit-remaining-requests当前窗口剩余请求数
x-ratelimit-reset-requests请求配额重置时间
x-ratelimit-limit-tokens窗口 token 上限
x-ratelimit-remaining-tokens当前窗口剩余 token 数
x-ratelimit-reset-tokenstoken 配额重置时间
ratelimit-limit通用综合限制(部分 provider)
ratelimit-remaining通用综合剩余
ratelimit-reset通用重置时间
retry-after安全重试等待秒数(429 响应)
x-rate-limit-limit-requests备用拼写变体
x-rate-limit-remaining-requests备用拼写变体
… 以及 9 个 provider 专属变体

ASCII 进度条

CLI 和控制台为每个活跃 provider 显示紧凑进度条:

anthropic  [████████░░░░░░░░░░░░]  req: 847/1000  tok: 42.3K/90K
openai     [██████████████░░░░░░]  req: 712/1000  tok: 61.1K/90K

进度条宽度为 20 字符,每个填充块()代表 5% 的已用配额。空进度条表示该 provider 未返回配额数据。

访问快照

# Current rate-limit snapshot for all providers
curl http://127.0.0.1:4545/api/providers/rate-limits
{
  "anthropic": {
    "requests": { "limit": 1000, "remaining": 153, "reset_in_seconds": 34 },
    "tokens":   { "limit": 90000, "remaining": 47700, "reset_in_seconds": 34 }
  }
}

provider 未返回对应响应头时,字段值为 null