From 6762e081f38b80acd467d2c93999a0492ad7d70d Mon Sep 17 00:00:00 2001 From: can1357 Date: Sat, 3 Jan 2026 21:01:01 +0100 Subject: [PATCH 1/6] feat(translator): add developer role support for Gemini translators Treat OpenAI's "developer" role the same as "system" role in request translation for gemini, gemini-cli, and antigravity backends. --- .../openai/chat-completions/antigravity_openai_request.go | 4 ++-- .../openai/chat-completions/gemini-cli_openai_request.go | 4 ++-- .../gemini/openai/chat-completions/gemini_openai_request.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go index d1403d7b..f6ab2c12 100644 --- a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go +++ b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go @@ -184,7 +184,7 @@ func ConvertOpenAIRequestToAntigravity(modelName string, inputRawJSON []byte, _ role := m.Get("role").String() content := m.Get("content") - if role == "system" && len(arr) > 1 { + if (role == "system" || role == "developer") && len(arr) > 1 { // system -> request.systemInstruction as a user message style if content.Type == gjson.String { out, _ = sjson.SetBytes(out, "request.systemInstruction.role", "user") @@ -201,7 +201,7 @@ func ConvertOpenAIRequestToAntigravity(modelName string, inputRawJSON []byte, _ } } } - } else if role == "user" || (role == "system" && len(arr) == 1) { + } else if role == "user" || ((role == "system" || role == "developer") && len(arr) == 1) { // Build single user content node to avoid splitting into multiple contents node := []byte(`{"role":"user","parts":[]}`) if content.Type == gjson.String { diff --git a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go index e1d1a40b..82c5cf39 100644 --- a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go +++ b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go @@ -152,7 +152,7 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo role := m.Get("role").String() content := m.Get("content") - if role == "system" && len(arr) > 1 { + if (role == "system" || role == "developer") && len(arr) > 1 { // system -> request.systemInstruction as a user message style if content.Type == gjson.String { out, _ = sjson.SetBytes(out, "request.systemInstruction.role", "user") @@ -169,7 +169,7 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo } } } - } else if role == "user" || (role == "system" && len(arr) == 1) { + } else if role == "user" || ((role == "system" || role == "developer") && len(arr) == 1) { // Build single user content node to avoid splitting into multiple contents node := []byte(`{"role":"user","parts":[]}`) if content.Type == gjson.String { diff --git a/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go b/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go index f0902b38..4d89d011 100644 --- a/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go +++ b/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go @@ -170,7 +170,7 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool) role := m.Get("role").String() content := m.Get("content") - if role == "system" && len(arr) > 1 { + if (role == "system" || role == "developer") && len(arr) > 1 { // system -> system_instruction as a user message style if content.Type == gjson.String { out, _ = sjson.SetBytes(out, "system_instruction.role", "user") @@ -187,7 +187,7 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool) } } } - } else if role == "user" || (role == "system" && len(arr) == 1) { + } else if role == "user" || ((role == "system" || role == "developer") && len(arr) == 1) { // Build single user content node to avoid splitting into multiple contents node := []byte(`{"role":"user","parts":[]}`) if content.Type == gjson.String { From 821249a5edc58225f9b8acf4446a73137db5e968 Mon Sep 17 00:00:00 2001 From: Finessse Date: Sun, 4 Jan 2026 18:19:41 +0700 Subject: [PATCH 2/6] docs: add ProxyPilot to community projects --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f74ab391..8d675056 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,10 @@ Native macOS menu bar app that unifies Claude, Gemini, OpenAI, Qwen, and Antigra Native macOS SwiftUI app for managing CLI AI sessions (Codex, Claude Code, Gemini CLI) with unified provider management, Git review, project organization, global search, and terminal integration. Integrates CLIProxyAPI to provide OAuth authentication for Codex, Claude, Gemini, Antigravity, and Qwen Code, with built-in and third-party provider rerouting through a single proxy endpoint - no API keys needed for OAuth providers. +### [ProxyPilot](https://github.com/Finesssee/ProxyPilot) + +Windows-native CLIProxyAPI fork with TUI, system tray, and multi-provider OAuth for AI coding tools - no API keys needed. + > [!NOTE] > If you developed a project based on CLIProxyAPI, please open a PR to add it to this list. From 9f1b445c7c438589af5648bea060bb97a8a8f0b1 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Mon, 5 Jan 2026 11:23:48 +0800 Subject: [PATCH 3/6] docs: add ProxyPilot to community projects in Chinese README --- README_CN.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README_CN.md b/README_CN.md index 6e8a455c..58f794d1 100644 --- a/README_CN.md +++ b/README_CN.md @@ -121,6 +121,10 @@ CLI 封装器,用于通过 CLIProxyAPI OAuth 即时切换多个 Claude 账户 原生 macOS SwiftUI 应用,用于管理 CLI AI 会话(Claude Code、Codex、Gemini CLI),提供统一的提供商管理、Git 审查、项目组织、全局搜索和终端集成。集成 CLIProxyAPI 为 Codex、Claude、Gemini、Antigravity 和 Qwen Code 提供统一的 OAuth 认证,支持内置和第三方提供商通过单一代理端点重路由 - OAuth 提供商无需 API 密钥。 +### [ProxyPilot](https://github.com/Finesssee/ProxyPilot) + +原生 Windows CLIProxyAPI 分支,集成 TUI、系统托盘及多服务商 OAuth 认证,专为 AI 编程工具打造,无需 API 密钥。 + > [!NOTE] > 如果你开发了基于 CLIProxyAPI 的项目,请提交一个 PR(拉取请求)将其添加到此列表中。 From ffddd1c90af63c5afa5a01dc8c4ad319ff09e454 Mon Sep 17 00:00:00 2001 From: decolua Date: Mon, 5 Jan 2026 20:29:26 +0700 Subject: [PATCH 4/6] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 8d675056..87efd8e0 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,10 @@ Native macOS SwiftUI app for managing CLI AI sessions (Codex, Claude Code, Gemin Windows-native CLIProxyAPI fork with TUI, system tray, and multi-provider OAuth for AI coding tools - no API keys needed. +### [9Router](https://github.com/decolua/9router) + +A Next.js implementation inspired by CLIProxyAPI. Easy to install and use. Built from scratch with format translation (OpenAI/Claude/Gemini/Ollama), combo system with auto-fallback, multi-account management with exponential backoff, and Next.js web dashboard. Supports CLI tools (Cursor, Claude Code, Cline, RooCode). + > [!NOTE] > If you developed a project based on CLIProxyAPI, please open a PR to add it to this list. From 386ccffed47d9e32559f550ddad9c11aa30d2762 Mon Sep 17 00:00:00 2001 From: decolua Date: Mon, 5 Jan 2026 20:54:33 +0700 Subject: [PATCH 5/6] Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 87efd8e0..82c34b81 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ Windows-native CLIProxyAPI fork with TUI, system tray, and multi-provider OAuth ### [9Router](https://github.com/decolua/9router) -A Next.js implementation inspired by CLIProxyAPI. Easy to install and use. Built from scratch with format translation (OpenAI/Claude/Gemini/Ollama), combo system with auto-fallback, multi-account management with exponential backoff, and Next.js web dashboard. Supports CLI tools (Cursor, Claude Code, Cline, RooCode). +A Next.js implementation inspired by CLIProxyAPI, easy to install and use, built from scratch with format translation (OpenAI/Claude/Gemini/Ollama), combo system with auto-fallback, multi-account management with exponential backoff, a Next.js web dashboard, and support for CLI tools (Cursor, Claude Code, Cline, RooCode) - no API keys needed. > [!NOTE] > If you developed a project based on CLIProxyAPI, please open a PR to add it to this list. From f861bd6a94ee24f56400da34882ad36134a1f9c8 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Tue, 6 Jan 2026 23:15:28 +0800 Subject: [PATCH 6/6] docs: add 9Router to community projects in README --- README.md | 9 ++++++++- README_CN.md | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 82c34b81..93cb125a 100644 --- a/README.md +++ b/README.md @@ -126,12 +126,19 @@ Native macOS SwiftUI app for managing CLI AI sessions (Codex, Claude Code, Gemin Windows-native CLIProxyAPI fork with TUI, system tray, and multi-provider OAuth for AI coding tools - no API keys needed. +> [!NOTE] +> If you developed a project based on CLIProxyAPI, please open a PR to add it to this list. + +## More choices + +Those projects are ports of CLIProxyAPI or inspired by it: + ### [9Router](https://github.com/decolua/9router) A Next.js implementation inspired by CLIProxyAPI, easy to install and use, built from scratch with format translation (OpenAI/Claude/Gemini/Ollama), combo system with auto-fallback, multi-account management with exponential backoff, a Next.js web dashboard, and support for CLI tools (Cursor, Claude Code, Cline, RooCode) - no API keys needed. > [!NOTE] -> If you developed a project based on CLIProxyAPI, please open a PR to add it to this list. +> If you have developed a port of CLIProxyAPI or a project inspired by it, please open a PR to add it to this list. ## License diff --git a/README_CN.md b/README_CN.md index 58f794d1..b15808f7 100644 --- a/README_CN.md +++ b/README_CN.md @@ -128,6 +128,17 @@ CLI 封装器,用于通过 CLIProxyAPI OAuth 即时切换多个 Claude 账户 > [!NOTE] > 如果你开发了基于 CLIProxyAPI 的项目,请提交一个 PR(拉取请求)将其添加到此列表中。 +## 更多选择 + +以下项目是 CLIProxyAPI 的移植版或受其启发: + +### [9Router](https://github.com/decolua/9router) + +基于 Next.js 的实现,灵感来自 CLIProxyAPI,易于安装使用;自研格式转换(OpenAI/Claude/Gemini/Ollama)、组合系统与自动回退、多账户管理(指数退避)、Next.js Web 控制台,并支持 Cursor、Claude Code、Cline、RooCode 等 CLI 工具,无需 API 密钥。 + +> [!NOTE] +> 如果你开发了 CLIProxyAPI 的移植或衍生项目,请提交 PR 将其添加到此列表中。 + ## 许可证 此项目根据 MIT 许可证授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。