Skip to content

57ggfk/ai-proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AI Proxy

基于 AI SDK 的多 Provider 多 Endpoint AI API 格式转换代理。支持 OpenAIClaudeGemini 三种格式之间灵活转换,配置驱动,零侵入。

功能

  • 三种 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 全局安装

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.tgz

从源码

git clone <repo-url>
cd ai-proxy
npm install

快速开始

1. 配置

首次启动自动创建 ~/.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"
    }
  ]
}

2. 运行

ai-proxy              # 全局安装后直接运行
npm run dev           # 开发模式(热重载)
npm run build:run     # 生产模式(从源码)

启动后访问 http://localhost:3000/ 查看健康检查和路由列表。

3. 调用

# 用 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
  }'

配置说明

Config (~/.ai-proxy/config.json)

字段 类型 说明
port number 服务端口号,默认 3000
providers ProviderConfig[] AI 供应商列表
endpoints EndpointConfig[] 代理端点列表

ProviderConfig

字段 类型 说明
id string 唯一标识符,被 endpoint 引用
type string openai-responses
url string API Base URL
key string API Key(openai-compatible 可为空)
maxOutputTokens number 可选,限制最大输出 token 数

EndpointConfig

字段 类型 说明
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

使用示例

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
  }'

Claude SDK → OpenAI 后端

curl http://localhost:3000/openai/v1/messages \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "Hello!"}],
    "max_tokens": 1024
  }'

OpenAI SDK → Gemini 后端

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 运行测试

添加新的 ExposeFormat

  1. src/config/types.tsExposeFormat 中添加新格式
  2. 创建 src/converters/{format}.ts,实现 Converter 接口(toSDKfromSDKfromSDKStream
  3. src/converters/index.tsCONVERTERS map 中注册

License

MIT

About

基于 AI SDK 的多 Provider 多 Endpoint AI API 格式转换代理。支持 OpenAI、Claude、Gemini 三种格式之间灵活转换,配置驱动,零侵入。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors