mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
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 全绿。
3.6 KiB
3.6 KiB
实现与完整特性
本文档由 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}, 适配器映射到各自协议(Anthropicthinking.budget_tokens、GeminithinkingConfig、 DeepSeekthinking.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 权限,支持环境变量注入主密钥