基于 AI SDK 的多 Provider 多 Endpoint AI API 格式转换代理。支持 OpenAI、Claude、Gemini 三种格式之间灵活转换,配置驱动,零侵入。
- 三种 API 格式互转 — OpenAI Chat Completions、Claude Messages、Gemini generateContent 任意组合
- 多 Provider 多 Endpoint — 一个实例同时代理多个 AI 供应商,每个 endpoint 独立配置格式和后端
- 正交组合 — Provider 类型和 ExposeFormat 完全解耦,例如用 OpenAI 格式调用 Claude 后端,或用 Claude 格式调用 Gemini 后端
- 同步 & 流式 — SSE 流式响应全链路支持
- 工具调用 — Function Calling / Tool Use 双向转换
- 多模态 — 文本 + 图片内容转换
- openai-responses — 支持 OpenAI Responses API
- openai-compatible — 支持对接任何 OpenAI 兼容 API(Ollama、vLLM、LM Studio 等)
npm install -g @theape/ai-proxy在有网络的机器上打包:
npm run pack:offline # 生成 theape-ai-proxy-1.0.0.tgz将 .tgz 文件拷贝到目标机器,然后:
npm install -g ./theape-ai-proxy-1.0.0.tgzgit clone <repo-url>
cd ai-proxy
npm install首次启动自动创建 ~/.ai-proxy/config.json,编辑配置:
{
"port": 3000,
"providers": [
{
"id": "my-claude",
"type": "anthropic",
"url": "https://api.anthropic.com",
"key": "sk-ant-..."
},
{
"id": "my-openai",
"type": "openai-responses",
"url": "https://api.openai.com",
"key": "sk-..."
},
{
"id": "my-gemini",
"type": "google",
"url": "https://generativelanguage.googleapis.com",
"key": "AIza..."
},
{
"id": "my-local",
"type": "openai-compatible",
"url": "http://localhost:11434",
"key": ""
}
],
"endpoints": [
{
"id": "openai-via-claude",
"path": "/claude",
"exposeFormat": "openai-compatible",
"provider": "my-claude"
},
{
"id": "claude-via-openai",
"path": "/openai",
"exposeFormat": "anthropic",
"provider": "my-openai"
},
{
"id": "openai-via-gemini",
"path": "/gemini",
"exposeFormat": "openai-compatible",
"provider": "my-gemini"
}
]
}ai-proxy # 全局安装后直接运行
npm run dev # 开发模式(热重载)
npm run build:run # 生产模式(从源码)启动后访问 http://localhost:3000/ 查看健康检查和路由列表。
# 用 OpenAI SDK 格式调用 Claude
curl http://localhost:3000/claude/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-20250514",
"messages": [{"role": "user", "content": "Hello!"}],
"stream": false
}'| 字段 | 类型 | 说明 |
|---|---|---|
port |
number |
服务端口号,默认 3000 |
providers |
ProviderConfig[] |
AI 供应商列表 |
endpoints |
EndpointConfig[] |
代理端点列表 |
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string |
唯一标识符,被 endpoint 引用 |
type |
string |
openai-responses |
url |
string |
API Base URL |
key |
string |
API Key(openai-compatible 可为空) |
maxOutputTokens |
number |
可选,限制最大输出 token 数 |
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string |
唯一标识符 |
path |
string |
挂载路径前缀,如 /claude |
exposeFormat |
string |
对外暴露格式:openai-compatible |
provider |
string |
引用的 provider id |
| exposeFormat | 实际路径 |
|---|---|
openai |
{path}/v1/chat/completions |
anthropic |
{path}/v1/messages |
gemini |
{path}/v1beta/models/:model/generateContent |
curl http://localhost:3000/claude/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-20250514",
"messages": [{"role": "user", "content": "Hello!"}],
"stream": false
}'curl http://localhost:3000/openai/v1/messages \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Hello!"}],
"max_tokens": 1024
}'curl http://localhost:3000/gemini/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-2.0-flash",
"messages": [{"role": "user", "content": "Hello!"}],
"stream": false
}'所有端点均支持 stream: true:
curl http://localhost:3000/claude/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-20250514",
"messages": [{"role": "user", "content": "Count to 10"}],
"stream": true
}'src/
├── index.ts # 入口:启动 Hono 服务器
├── app.ts # createApp():加载配置,动态挂载 endpoint 路由
├── config/
│ ├── types.ts # ProviderType, ExposeFormat, Config 类型定义
│ ├── loader.ts # 加载 ~/.ai-proxy/config.json,校验,首次启动创建示例
│ └── index.ts # barrel export
├── providers/
│ └── index.ts # 根据 config.type 创建 @ai-sdk/* provider 实例
├── converters/
│ ├── openai-compatible.ts # OpenAI Chat Completions ↔ AI SDK 双向转换
│ ├── openai-responses.ts # OpenAI Responses ↔ AI SDK 双向转换
│ ├── anthropic.ts # Claude Messages ↔ AI SDK 双向转换
│ ├── gemini.ts # Gemini generateContent ↔ AI SDK 双向转换
│ └── index.ts # Converter 注册表
├── routes/
│ └── proxy.ts # 通用代理路由工厂,根据 exposeFormat 选择 converter
└── utils/
├── request.ts # 错误响应、ID 生成、API Key/Base URL 获取
└── stream.ts # SSE / NDJSON 编解码工具
Client Request (OpenAI / Claude / Gemini 格式)
│
▼
[src/app.ts] ── 遍历 config.endpoints,为每个 endpoint 挂载路由
│
▼
[src/routes/proxy.ts] ── POST * 通用处理器
│
├── converter.toSDK(body) ── 客户端格式 → LanguageModelV2CallOptions
├── provider(modelId).doGenerate() ── AI SDK 处理 HTTP 请求、认证、流解析
└── converter.fromSDK(result) ── LanguageModelV2 结果 → 客户端格式
核心设计:AI SDK 的 @ai-sdk/openai-responses(对应 @ai-sdk/openai)、@ai-sdk/anthropic、@ai-sdk/google、@ai-sdk/openai-compatible 已经封装了各 provider 的 HTTP 请求、认证头、SSE/NDJSON 流解析。Converter 只负责请求/响应格式的双向映射,不处理网络层。
npm run dev # tsx watch 热重载
npm run build # TypeScript 编译到 dist/
npm run start # tsx 直接运行
npm run build:run # 编译后运行 dist/
npm test # vitest 运行测试- 在
src/config/types.ts的ExposeFormat中添加新格式 - 创建
src/converters/{format}.ts,实现Converter接口(toSDK、fromSDK、fromSDKStream) - 在
src/converters/index.ts的CONVERTERSmap 中注册
MIT