Files
ModelRouter/docs/features.md
JianFeeeee 8578696cc1 chore!: 移除厂商私有协议适配器与渠道业务插件(合规清理)
G-Star 合规要求下,把"模拟官方客户端、复刻私有协议、自动领取平台额度"这一类
能力整体移出仓库。这些实现依赖各平台未公开的端点、签名算法与官方 client id,
属于绕过客户端校验获取额度,风险高于普通协议适配。

移除(93 个文件):
- 适配器:opencodezen(伪装 UA 取免费池)、trae、buddy、kimicode
- 插件:channels.lua(12 个平台登录/领额度/签到)、quota.lua(厂商额度探针)
- 随之删除的 78 个渠道/额度专用测试与 3 份渠道文档

同时修掉的既有问题:
- **硬编码第三方 OAuth client_secret**(Google Cloud Code 的 GOCSPX-…,两处)
  随 channels.lua 一起消失。
- `deploy.sh` 的 `sync_plugins` 整段删除:它仍按"内置插件是发行物"的旧前提
  把插件复制/覆盖进 plugin_dir,与"插件属运维资产、网关不安装不覆盖"的契约
  冲突。现在部署脚本只同步适配器与二进制/配置。
- 适配器清单去掉已移除项;e2e 配置改用显式 `auto:` 链(`models.priority` 早已
  移除,该测试此前已失效)。

保留(公开协议):openai / anthropic / gemini / deepseek / github / groq /
mistral / ollama / qwen38 / sensenova = 10 个适配器;插件示例 billing / usage。

验证:go build -tags luajit ./... OK;internal/lua 21.4s、provider、core 51s、
gateway 122.8s、e2e 9.0s 全绿。
2026-10-27 09:23:24 +08:00

3.6 KiB
Raw Blame History

实现与完整特性

本文档由 README 拆分而来:架构来源与完整特性清单(README 只保留摘要)。 返回 README。

实现

统一 OpenAI 兼容网关:把多个上游 LLM 源(DeepSeek、Qijiar、OpenAI、Anthropic、Gemini、 Groq、Mistral、Ollama、KimiCode…)通过 Lua 适配器 做协议转换,对内网暴露 一个标准 OpenAI Chat Completions 接口(/v1/chat/completions + /v1/models), 支持单次结算、SSE 流式、AUTO 模型路由与多模态透传。

从上游多源 LLM 适配层 (internal/agent/api/provider.go + internal/lua/adapters/*)抽离而来并独立演进。

特性

  • 多源:一个进程内配置任意多个上游源,按请求的 model 自动路由。
  • AUTO 模式:default_model: AUTO 时按优先级页保存的 AUTO 链档位逐档调度并发请求。
  • 统一输出:所有源对外都是 OpenAI 格式(含 reasoning_content、tool_calls、usage)。
  • 生图:POST /v1/images/generations,kind: image 的模型独立路由。
  • 多模态:content 数组(image_url 等)在多源间无损透传,Anthropic/Gemini/Ollama 自动转换。
  • LuaJIT VM:基于 golua 绑定的 LuaJIT,每个适配器独立 VM + worker 池,安全并发。 池是 弹性 的:Σ max_concurrent 只是上限而非预分配,状态按需创建、空闲时自动回收, 因此空载网关几乎不持有 Lua 状态(启动 0 个)。
    • 扩容步长由适配器最大并发决定:clamp(ceil(max/8), 1, 8),且仅在真实并发争用 (所有现有状态均已占用)时批量预热,顺序流量始终只用 1 个状态。
    • 缩容步长由当前连接数决定:clamp(ceil(冗余/(1+占用)), 1, 冗余)——无连接时一轮收到 常驻下限,忙时每轮只释放 1 个,保护热路径。WebUI「适配器」页展示实时池指标。
  • thinking 预算:请求里的推理开关/预算归一为中立的 thinking:{enabled,budget_tokens}, 适配器映射到各自协议(Anthropic thinking.budget_tokens、Gemini thinkingConfig、 DeepSeek thinking.type="disabled")。
  • Lua 适配协议:每个源挂一个 .lua 适配器,完成 transform_request / transform_response / transform_stream_chunk 双向转换,协议差异全在 Lua 层。
  • 签名 / 请求头钩子:适配器可定义 build_headers(meta),在 Go 发 HTTP 前 动态注入/签名请求头——用于云端 API 校验调用方 app(如 KimiCode 只放行特定 agent)。提供 hmac_sha256_hex / sha256_hex / base64_encode 等签名辅助。
  • WebUI:内置管理界面,可在线查看/新增/编辑上游源与模型、配置 AUTO 优先级链、 管理密钥模型范围,写入运行时文件持久化。
  • 密钥加密存储:运行时文件中的上游 api_key、自定义请求头值、网关 key 均以 AES-256-GCM 加密落盘(master.key 独立 0600,或 MODELROUTER_MASTER_KEY)。
  • 实时源探测:状态页探测各源可达性(GET {base}/models,失败回退最小请求), 不污染正常调度的退避状态,错误信息在 UI 可悬停查看。
  • 鉴权:网关自身用 gateway_keys 校验客户端 Bearer key;与上游各自的 key 相互独立。
  • 流式:SSE chat.completion.chunk,含角色首包与 [DONE] 收尾。
  • 全链路审计:HTTP 访问日志、登录/配置变更审计、请求记录 CSV 导出、密钥用量统计 CSV 导出
  • AES-256-GCM 加密存储:运行时文件敏感字段加密落盘,master.key 0600 权限,支持环境变量注入主密钥