mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
README 从 642 行降到 131 行,只保留简介、核心能力、最小快速开始、文档索引、 改名说明、目录结构与测试入口。其余内容迁到 docs/,中英文索引一一对应: docs/features.md 实现与完整特性清单(原 README 的"实现/特性") docs/configuration.md 配置文件、自动探测模型、多密钥与配额 docs/routing.md 模型路由、AUTO 链、冷却与半冷却、源/适配器、源模板 docs/performance.md 实测内存占用与调优、thinking 预算 docs/webui.md WebUI 使用 docs/adapters.md Lua 适配器协议与内置适配器清单 docs/gui.md 桌面端 Headless/Desktop 两种产物与构建 docs/development.md 目录职责、开发协作、测试 docs/deployment.md 部署、发行包、目录权限、llmsproxy 迁移与验证清单 中性化:README / README_EN / GUI 注释里的 `Clash Verge` 类比全部改为 「桌面壳 / desktop shell」,仓库内(源码与文档)已无该表述。
61 lines
2.7 KiB
Markdown
61 lines
2.7 KiB
Markdown
# 适配器协议
|
||
|
||
> 本文档由 README 拆分而来:Lua 适配器协议与内置适配器清单。
|
||
> 编写适配器的完整参考见 [lua-adapters.md](lua-adapters.md)。
|
||
> 返回 [README](../README.md)。
|
||
|
||
## Lua 适配器协议
|
||
|
||
完整 API 见 **[Lua 适配器 API 文档](docs/lua-adapters.md)**([English](docs/lua-adapters-en.md))。
|
||
|
||
每个适配器是一个返回 table 的 Lua 脚本(`internal/lua/adapters/<name>.lua`),
|
||
加载时可被 `adapter_dir` 下的同名脚本覆盖——**改 Lua 脚本无需重编译**,
|
||
重启即生效;通过 WebUI 上传的适配器与在线编辑的源配置则即时生效。
|
||
|
||
```lua
|
||
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` `kimicode`
|
||
`qwen38` `sensenova` `trae`。
|
||
|
||
`anthropic`/`gemini`/`ollama` 适配器内置多模态转换(`image_url` → 各自上游格式);
|
||
推理开关由中立的 `thinking` 字段表达,`deepseek` 适配器把它映射为
|
||
`thinking.type = "disabled"`。
|
||
|
||
**kimicode** 是展示 `build_headers` 的样例:云端校验调用方 app,需要按
|
||
`meta.app_secret` 对时间戳+URL+请求体哈希做 HMAC 签名并附 `X-App-Sign` 等头。
|
||
配好 `sources[].meta.{app_id, app_secret, app_agent}` 即可。
|
||
|