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 |
æåŒ core 管çåå° â æä»¶ç®¡ç â äžç§æ¹åŒä»»éïŒ
1. æä»¶åžåº â ç¹å»ãå®è£
ã ïŒä» GitHub Release èªåšæåïŒå¹é
åœåæ¶æïŒ
2. äžäŒ å®è£
â æå
¥äºè¿å¶æä»¶ ïŒéåå
éšç¯å¢ / èªå»ºäºè¿å¶ïŒ
3. GitHub å®è£
â èŸå
¥ DouDOU-start/airgate-openai
market äŒå®æ¶ä» GitHub API åæ¥ææ° releaseïŒé»è®€ 6hïŒäœ¿çš ETag äžæ¶è API é é¢ïŒïŒæ° tag push åéåžžå åéå å³å¯åšåžåºçå°ã
éèŠ 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ã
cd backend && go run ./cmd/devserver # å¯åšæ¬å° devserverïŒæš¡æ coreïŒ
cd backend && go run ./cmd/chat # å¯åšäº€äºåŒæµè¯å®¢æ·ç«¯ïŒSSE / WS ååè®®ïŒæŽå€åœä»€è§ make helpã
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.0release.yml äŒèªåšïŒ
- ç©éµæå»º 4 䞪平å°äºè¿å¶ïŒlinux/darwin à amd64/arm64ïŒ
- éè¿
-ldflags "-X .../gateway.PluginVersion=${version}"æ git tagïŒå»ævåçŒïŒæ³šå ¥å°äºè¿å¶ - äžäŒ å° GitHub ReleaseïŒèµäº§åœå
gateway-openai-{os}-{arch}ïŒé垊.sha256 - airgate-core æä»¶åžåºäŒéè¿ GitHub API èªåšåæ¥æ°çæ¬
- Bug / Feature: Issues
- äž»ä»åº: airgate-core
- æä»¶ SDK: airgate-sdk
MIT â è¯Šè§ LICENSEã