Skip to content

DouDOU-start/airgate-openai

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

231 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AirGate OpenAI

OpenAI / ChatGPT / Anthropic 协议䞉合䞀眑关插件

release ci license go react


AirGate OpenAI 䞍是又䞀䞪"OpenAI 蜬发服务"而是 airgate-core 的旗舰眑关插件也是 airgate-sdk 的官方参考实现。它圚䞀䞪 gRPC 子进皋里同时承蜜

  • OpenAI Responses / Chat Completions API 蜬发Codex 栞心端点
  • ChatGPT OAuth 浏览噚授权莊号 接入PKCE + WebSocket 桥接
  • Anthropic Messages API 协议翻译Claude → Responses 䞀步盎蜬

它解决䞀䞪具䜓问题甚䞀套莊号池同时服务 OpenAI、Codex CLI、Claude Code 䞉种客户端而䞍需芁圚 core 里䞺每䞀种协议各塞䞀仜代码。插件可以独立发版、独立 release、独立装卞、独立热曎core 䞍重启、其他插件䞍受圱响。

✹ 栞心特性

  • 🔌 双莊号类型 — apikey任䜕 Responses 兌容服务䞎 oauth浏览噚登圕 ChatGPT自劚刷新 token插件按莊号类型选择䞊枞协议
  • 🔄 Anthropic 协议翻译 — Claude 客户端的 /v1/messages 䞀步盎蜬䞺 Responses API 请求SSE 流再回译䞺 Anthropic 事件工具调甚 / 掚理 token / stop_reason 党保留
  • 🌐 双协议入口 — 同䞀䞪 /v1/responses 同时支持 HTTP/SSE 侎 WebSocketOAuth 莊号走 WebSocket 䞊行再以 SSE 写回客户端
  • 🎯 暡型降级䞎重试 — Anthropic 蜬发铟路圚暡型䞍存圚 / 被拒时自劚降级到映射衚里的䞋䞀䞪候选
  • 🧠 䞊䞋文裁剪 — 历史消息超窗时按规则截断避免䞊枞 400
  • 🪄 系统提瀺词预讟 — 内眮 default / simple / nsfw / cc 四套 Codex 提瀺词按莊号选择
  • 💌 莊号前端 Widget — 自垊创建/猖蟑莊号衚单OAuth 匕富面板、字段提瀺、状态展瀺由 core 自劚嵌入管理后台
  • 📊 䞀键发版 — git tag 觊发 release workflow矩阵构建 4 䞪平台linux/darwin × amd64/arm64自劚泚入版本号、䞊䌠 sha256

🧩 接入䜍眮

                  ┌──────────────────────────────────────┐
                  │           AirGate Core               │
                  │      (莊号 / 计莹 / 管理后台)        │
                  └────────────┬─────────────────────────┘
                               │ go-plugin (gRPC)
                               ▌
                  ┌──────────────────────────────────────┐
                  │      airgate-openai (本仓库)         │
                  │                                      │
                  │   ┌──────────┐    ┌──────────────┐   │
                  │   │ HTTP/SSE │    │  WebSocket   │   │
                  │   │   入口   │    │     入口     │   │
                  │   └────┬─────┘    └──────┬───────┘   │
                  │        ├─ apikey ─────────           │
                  │        └─ oauth ──────────           │
                  │                          │           │
                  │     ┌────────────────────▌────────┐  │
                  │     │     Anthropic 协议翻译      │  │
                  │     │ (request convert / decode)  │  │
                  │     └──────────────┬──────────────┘  │
                  └────────────────────┌─────────────────┘
                                       ▌
                       OpenAI / ChatGPT / 兌容平台

请求生呜呚期

客户端请求 ──► Core 鉎权 ──► Plugin.Forward()
                                                  │
                                          ┌───────┮───────┐
                                          ▌               ▌
                                  Anthropic 翻译     原生 Responses
                                   (convert)         (forwardAPIKey
                                          │           / forwardOAuth)
                                          â–Œ               │
                                     䞊枞 AI API ◄────────┘
                                          │
                                          ▌
                                     ForwardResult
                                  ┌───────┮───────┐
                              标准甚量/成本   莊号状态反銈
                              Core 入库扣莹   Core 曎新莊号

Forward() 拿到 core 䌠入的莊号识别请求是 Anthropic Messages、OpenAI 原生还是 Images API再分发到 forwardAPIKeyHTTP/SSE 盎连或 forwardOAuthWebSocket 桥接。插件莟莣协议适配、䞊枞请求和平台标准甚量/成本计算core 莟莣鉎权、莊号选择、入库䞎按甚户倍率扣莹。

🚊 路由

由 metadata.go 声明、Routes() 返回core 启劚时自劚泚册到眑关

方法 路埄 诎明
POST /v1/responses Responses APICodex 栞心端点
POST /v1/chat/completions Chat Completions API
POST /v1/messages Anthropic Messages API协议翻译
POST /v1/messages/count_tokens Anthropic Count Tokens兌容回退
GET /v1/models 暡型列衚
POST /v1/images/generations Images API文生囟
POST /v1/images/edits Images API囟生囟 / 猖蟑
WS /v1/responses Responses APIWebSocket

及倖提䟛䞍垊 /v1 前猀的别名路由POST /responses、POST /chat/completions、POST /messages、GET /models、WS /responses 等方䟿客户端盎接填站点根地址。

🔑 莊号类型

Key 标筟 凭证字段 适甚场景
apikey API Key api_key + base_url可选 所有提䟛 Responses 标准接口的服务
oauth OAuth 登圕 access_token / refresh_token / chatgpt_account_id授权后自劚填充 浏览噚登圕 ChatGPT 䞪人莊号

莊号字段定义同样从 metadata.go 掟生通过 Info() 䞊报给 core前端衚单 Widget 自劚枲染。

🛠 技术栈

层 技术
后端 Go 1.25 · gRPC · gjson/sjson零 struct· gorilla/websocket
前端 React 19 · Vite · TypeScript莊号衚单 Widget
插件协议 hashicorp/go-plugin (gRPC)
䞊枞协议 OpenAI Responses / Chat Completions · ChatGPT WebSocket · Anthropic Messages
发垃 GitHub Actions · 矩阵构建 4 平台二进制 · GitHub Release

🚀 安装䞎匀发

方匏 1安装到 core掚荐

打匀 core 管理后台 → 插件管理 → 䞉种方匏任选

1. 插件垂场 → 点击「安装」               从 GitHub Release 自劚拉取匹配圓前架构
2. 䞊䌠安装 → 拖入二进制文件              适合内郚环境 / 自建二进制
3. GitHub 安装 → 蟓入 DouDOU-start/airgate-openai

market 䌚定时从 GitHub API 同步最新 release默讀 6h䜿甚 ETag 䞍消耗 API 配额新 tag push 后通垞几分钟内即可圚垂场看到。

方匏 2源码运行匀发

需芁 Go 1.25+、Node 22+以及兄匟目圕 airgate-sdk 侎 airgate-core

git clone https://github.com/DouDOU-start/airgate-sdk.git
git clone https://github.com/DouDOU-start/airgate-core.git
git clone https://github.com/DouDOU-start/airgate-openai.git
cd airgate-openai

make install        # 装 web 䟝赖䞎 Go 暡块
make build          # 完敎构建web/dist → backend/webdist → bin/gateway-openai
make manifest       # 重新生成 plugin.yaml
make ci             # 侎 CI 完党䞀臎的本地检查lint + test + vet + build

把本插件以 dev 暡匏挂到 core热重蜜䞍重启 core

# airgate-core/backend/config.yaml
plugins:
  dev:
    - name: gateway-openai
      path: /absolute/path/to/airgate-openai/backend

然后 cd airgate-core/backend && go run ./cmd/servercore 䌚通过 go run . 启劚本插件握手 gRPC䟝次调甚 Init → Start → RegisterRoutes。

方匏 3䞍䟝赖 core 的端到端调试

cd backend && go run ./cmd/devserver   # 启劚本地 devserver暡拟 core
cd backend && go run ./cmd/chat        # 启劚亀互匏测试客户端SSE / WS 双协议

曎倚呜什见 make help。

🔄 Anthropic 协议翻译

Anthropic JSON 请求
  → anthropic_convert.go    䞀步盎蜬䞺 Responses API JSON保留工具、reasoning、system
  → anthropic_forward.go    蜬发到䞊枞含暡型降级重试
  → anthropic_response.go   Responses SSE → Anthropic SSE 回译
  → anthropic_model_map.go  Claude ↔ OpenAI 暡型映射衚
  → anthropic_util.go       工具名猩短、stop_reason 蜬换

讟计䞊避匀"先把 Anthropic 蜬成 Chat Completions 再蜬 Responses"的䞀步走 —— 盎接䞀步蜬换零䞭闎结构䜓党郚甚 gjson/sjson 操䜜 JSON。

🏗 项目结构

airgate-openai/
├── backend/                              # Go 后端插件䞻䜓
│   ├── main.go                           # gRPC 插件入口
│   ├── cmd/
│   │   ├── chat/                         # 亀互匏测试客户端SSE / WS 双协议
│   │   ├── devserver/                    # 匀发服务噚暡拟 core
│   │   └── genmanifest/                  # plugin.yaml 生成噚
│   └── internal/
│       ├── gateway/                      # 眑关栞心逻蟑
│       │   ├── gateway.go                # GatewayPlugin 接口实现
│       │   ├── metadata.go               # 插件元信息运行时单源
│       │   ├── forward.go                # 䞉暡匏蜬发分发 + apikey/oauth 蜬发
│       │   ├── anthropic_convert.go      # Anthropic → Responses 请求䞀步盎蜬
│       │   ├── anthropic_response.go     # Responses → Anthropic 响应回译
│       │   ├── anthropic_forward.go      # Anthropic 蜬发入口、暡型降级重试
│       │   ├── anthropic_model_map.go    # Claude ↔ OpenAI 暡型映射
│       │   ├── anthropic_count_tokens.go # count_tokens 兌容回退
│       │   ├── anthropic_context_guard.go# Anthropic 历史裁剪
│       │   ├── request.go                # 请求检测、URL 构建、预倄理
│       │   ├── stream.go                 # SSE 流匏响应倄理
│       │   ├── ws.go / ws_handler.go     # WebSocket 连接䞎事件解析
│       │   ├── transport_pool.go         # HTTP transport 倍甚池
│       │   ├── headers.go                # 讀证倎、癜名单、Codex 标识
│       │   ├── oauth.go / oauth_handler.go # OAuth 授权流皋PKCE
│       │   └── assets.go                 # WebAssetsProviderembed webdist
│       ├── model/registry.go             # 集䞭暡型规栌定义含单价
│       └── resources/                    # 嵌入资源系统提瀺词预讟
├── web/                                  # 前端莊号衚单 Widget
│   └── src/components/AccountForm.tsx
├── .github/workflows/
│   ├── ci.yml                            # push/PR 觊发倍甚 make ci
│   └── release.yml                       # v* tag 觊发矩阵构建 4 平台二进制
├── plugin.yaml                           # genmanifest 自劚生成
└── Makefile

🔧 讟计芁点

  • metadata.go 是运行时真盞plugin.yaml 仅䞺分发产物make manifest 重生。莊号衚单、路由、暡型列衚、䟝赖声明党郚从 metadata.go 掟生
  • 零 struct JSON 倄理 —— 党皋䜿甚 gjson/sjson䞊枞 schema 经垞变零 struct 让兌容性绎技成本最䜎
  • Anthropic 翻译只做单向请求 Anthropic → Responses响应 Responses → Anthropic䞍匕入第䞉种䞭闎栌匏
  • transport 倍甚HTTP transport 由 transport_pool 按 base_url 分桶避免每次郜新建连接
  • 版本单䞀来源PluginVersion 是 var发版时由 -ldflags 圚猖译期泚入 git tag —— git tag = release 版本 = 已安装 tab 星瀺的版本氞䞍偏犻

📊 发版

正匏发版只需芁打 git tag䞍芁手工改版本号字段

git tag v0.2.0
git push origin v0.2.0

release.yml 䌚自劚

  1. 矩阵构建 4 䞪平台二进制linux/darwin × amd64/arm64
  2. 通过 -ldflags "-X .../gateway.PluginVersion=${version}" 把 git tag去掉 v 前猀泚入到二进制
  3. 䞊䌠到 GitHub Release资产呜名 gateway-openai-{os}-{arch}附垊 .sha256
  4. airgate-core 插件垂场䌚通过 GitHub API 自劚同步新版本

🀝 莡献 / 反銈

📜 License

MIT — 诊见 LICENSE。

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages