Files
ModelRouter/docs/adapters.md
JianFeeeee 8f2c5572e7 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:25:58 +08:00

2.8 KiB
Raw Blame History

适配器协议

本文档由 README 拆分而来:Lua 适配器协议与内置适配器清单。 编写适配器的完整参考见 lua-adapters.md。 返回 README。

Lua 适配器协议

完整 API 见 Lua 适配器 API 文档(English)。

每个适配器是一个返回 table 的 Lua 脚本(internal/lua/adapters/<name>.lua), 加载时可被 adapter_dir 下的同名脚本覆盖——改 Lua 脚本无需重编译, 重启即生效;通过 WebUI 上传的适配器与在线编辑的源配置则即时生效。

return {
  name = "mysrc",
  version = "1.0.0",
  endpoint = "/chat/completions",        -- 上游路径(可被 source.endpoint 覆盖)
  headers = { ["X-Static"] = "v" },      -- 静态默认请求头(build_headers 缺省时使用)

  -- 请求转换:把 OpenAI 格式 req 转成上游原生格式,返回字符串
  transform_request = function(raw_json) ... end,

  -- 响应转换:把上游原生响应转成统一格式字符串
  --   { content, reasoning_content, finish_reason, token_usage{...}, tool_calls[{...}] }
  transform_response = function(raw_json) ... end,

  -- 流式分块转换:把上游 SSE data 转成 { content, done, ... },返回 "" 则跳过
  transform_stream_chunk = function(raw_chunk) ... end,

  -- [可选] 动态请求头/签名钩子
  -- meta = { url, method, body, api_key, timestamp, source={ name, meta={...} } }
  build_headers = function(meta) return { ["X-App-Sign"] = sign } end,

  -- [可选] 出向序列化(契约 v2):上游不是 OpenAI 协议时接管写给客户端的字节。
  -- 不声明则沿用内核的 OpenAI 兜底;声明即完全取代,内核不再混合字段。
  serialize_response = function(result) return body_str end,
  serialize_open_preamble = function(result) return bytes end,
  serialize_chunk = function(delta) return bytes end,
  serialize_close = function(result) return bytes end,
}

内置信号辅助:hmac_sha256_hex(key, data)、sha256_hex(data)、base64_encode(s)、 tohex(s)、json.encode/decode、log(level, msg)。

内置适配器

openai deepseek anthropic gemini github groq mistral ollama qwen38 sensenova qwen38 sensenova trae。

anthropic/gemini/ollama 适配器内置多模态转换(image_url → 各自上游格式); 推理开关由中立的 thinking 字段表达,deepseek 适配器把它映射为 thinking.type = "disabled"。

适配器可用 build_headers(meta) 注入签名头。示例见 adapters/ 下任一脚本的 build_headers 实现;云端校验调用方 app 时需要按 meta.app_secret 对时间戳+URL+请求体哈希做 HMAC 签名并附 X-App-Sign 等头。 配好 sources[].meta.{app_id, app_secret, app_agent} 即可。