feat(llm): 多模型注册表 + 降级链 + 成本追踪 #22

Merged
shaotao merged 1 commit from feat/model-registry into main 2026-06-12 21:26:44 +08:00
Owner

变更

新增 bixiweave/llm/registry.py,包含三个核心组件:

ModelRegistry

  • register(name, provider) / unregister(name) / get_provider(name)
  • create_profile(name, primary, fallbacks) — 定义带降级的模型 Profile
  • resolve(profile_name) — 返回 FallbackLLMProvider 或直接 Provider

FallbackLLMProvider

  • 包装 [provider, fallback1, fallback2, ...] 调用链
  • 主模型失败(异常)时自动切换到备用模型
  • 支持 max_retries_per_model 重试同一模型
  • 所有调用自动记录到 UsageTracker

UsageTracker

  • 按 Profile 和按模型累计 Token 消耗
  • 保留最近 1000 条详细记录
  • 支持查询 get_summary() / get_by_profile() / get_by_model()

测试

20 个新测试 + 127 个已有测试,共 147 passed

用法

registry = ModelRegistry()
registry.register("gpt4", OpenAIProvider())
registry.register("haiku", AnthropicProvider())
registry.register("deepseek", DeepSeekProvider())

registry.create_profile("prod", primary="gpt4", fallbacks=["haiku", "deepseek"])

provider = registry.resolve("prod")  # FallbackLLMProvider
resp = await provider.chat(messages)

stats = registry.get_usage_stats()
## 变更 新增 `bixiweave/llm/registry.py`,包含三个核心组件: ### ModelRegistry - `register(name, provider)` / `unregister(name)` / `get_provider(name)` - `create_profile(name, primary, fallbacks)` — 定义带降级的模型 Profile - `resolve(profile_name)` — 返回 FallbackLLMProvider 或直接 Provider ### FallbackLLMProvider - 包装 `[provider, fallback1, fallback2, ...]` 调用链 - 主模型失败(异常)时自动切换到备用模型 - 支持 `max_retries_per_model` 重试同一模型 - 所有调用自动记录到 UsageTracker ### UsageTracker - 按 Profile 和按模型累计 Token 消耗 - 保留最近 1000 条详细记录 - 支持查询 `get_summary()` / `get_by_profile()` / `get_by_model()` ## 测试 20 个新测试 + 127 个已有测试,共 147 passed ## 用法 ```python registry = ModelRegistry() registry.register("gpt4", OpenAIProvider()) registry.register("haiku", AnthropicProvider()) registry.register("deepseek", DeepSeekProvider()) registry.create_profile("prod", primary="gpt4", fallbacks=["haiku", "deepseek"]) provider = registry.resolve("prod") # FallbackLLMProvider resp = await provider.chat(messages) stats = registry.get_usage_stats() ```
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
bixiu/bixiweave!22
No description provided.