Skip to content

feat: multi-key strategy, configurable retention, response cleanup & resilience - #1

Open
cxk1993 wants to merge 2 commits into
thy-chan:mainfrom
cxk1993:main
Open

feat: multi-key strategy, configurable retention, response cleanup & resilience#1
cxk1993 wants to merge 2 commits into
thy-chan:mainfrom
cxk1993:main

Conversation

@cxk1993

@cxk1993 cxk1993 commented Aug 3, 2026

Copy link
Copy Markdown

概述

为 model-gateway 增加多 Key 轮换策略选择、消耗数据保留天数配置,并修复响应 model 字段拼接、🤖 前缀注入等体验问题。所有改动已在本地 WSL 环境实测验证。

说明: 本 PR 基于 v1.6.1 版本(本地增强环境)开发,与当前仓库 main(v1.3.0)相比,除了本 PR 的增强改动外,还包含了原作者 v1.4 ~ v1.6 期间的部分更新内容(识图辅助、announcement.md、presets.json、README 更新等)。如维护者希望只合并增强部分,可对照 diff 挑选。

主要改动(本 PR 新增)

🎯 多 Key 轮换策略(核心)

  • 新增 4 种 Key 选择策略,每渠道可独立配置(面板「🔑 Key 管理」弹窗内下拉选择):
    • sticky(默认):粘性 + 熔断,一直用同一 Key,429 或连续 3 次失败才切换(保缓存、降延迟)
    • round_robin:每次请求顺序轮换
    • random:每次请求随机选择
    • first:永远只取第一个 Key
  • 切换逻辑全部在网关内部完成,前端/客户端无感知
  • 参考了 freellmapiOmniRoute 的 key 路由设计

🔥 稳定性提升

  • 429 限流冷却 30s → 180s(provider 级冷却,避免 IP 级限流时空转切完所有 Key)
  • classify_failure() 区分 请求参数错误(400/404/422,不切 Key)/ 认证错误(401/403,切 Key+熔断)/ 限流(429,冷却)/ 服务故障(5xx,熔断)
  • sanitize_messages() 自动移除上游拒绝的空 tool_calls: [] 数组(SenseNova 兼容)

✨ 响应净化

  • 删除流式 + 非流式两处硬编码 🤖 {提供商} · {模型名} 前缀注入
  • 响应 model 字段从 "SenseNova · deepseek-v4-flash" 改为纯 "deepseek-v4-flash"(与其他提供商行为一致)

📊 面板与数据管理

  • 消耗统计面板新增 「数据保留天数」 配置(usage_retention_days,默认 720 天,1-7200),前端直接可改,改完立即触发清理
  • 调用日志持久化到 call_log.jsonl(原内存 100 条重启即丢),/api/call-log?hours=N 支持按小时查询
  • models_meta.json 修正多个模型的 context_length 错误值(如 sensenova-6.7-flash-lite / sensenova-u1-fast 应为 256K)

🧹 代码清理

  • 移除未使用的 call_log_lock 死代码
  • 移除 get_sticky_key() 兼容包装,统一走 select_key()

测试验证

  • python -m py_compile 通过
  • ✅ 流式 + 非流式 chat 请求实测:content 无 🤖 前缀、model 字段纯模型名
  • ✅ 4 种 Key 策略逻辑单测(轮询/随机/粘性/固定)
  • ✅ 保留天数修改/回读/非法值校验
  • ✅ 调用日志持久化 + hours 过滤
  • ✅ 服务重启后配置持久化(config.json / providers.json)

安全说明

  • 敏感文件(providers.json / config.json / usage.jsonl / history.jsonl / routers.json / call_log.jsonl 等)均在 .gitignore 中,未包含任何真实 API Key
  • config.example.json / providers.example.json 使用占位符

cxk1993 added 2 commits August 4, 2026 01:04
…ence

- Key strategies: sticky(failover) / round_robin / random / first, per-provider configurable
- 429 cooldown raised 30s -> 180s, provider-level to avoid burning all keys
- Response model field: pure model name (no '{provider} · {model}' prefix)
- Removed hardcoded 🤖 prefix injection in stream & non-stream paths
- Usage retention days: configurable from panel (default 720, 1-7200)
- Call log persisted to call_log.jsonl, API supports hours filter
- sanitize_messages strips empty tool_calls arrays (SenseNova compat)
- classify_failure distinguishes request/auth/quota/server errors
- Removed dead code: call_log_lock, get_sticky_key wrapper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant