Skip to content

Commit 7230aa7

Browse files
Merge branch 'router-for-me:main' into main
2 parents 2dc61ac + 1dc4ecb commit 7230aa7

File tree

109 files changed

+6077
-3376
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+6077
-3376
lines changed

README_CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# CLIProxyAPI Plus
22

3-
[English](README.md) | 中文
3+
[English](README.md) | 中文 | [日本語](README_JA.md)
44

55
这是 [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) 的 Plus 版本,在原有基础上增加了第三方供应商的支持。
66

README_JA.md

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
# CLI Proxy API
2+
3+
[English](README.md) | [中文](README_CN.md) | 日本語
4+
5+
CLI向けのOpenAI/Gemini/Claude/Codex互換APIインターフェースを提供するプロキシサーバーです。
6+
7+
OAuth経由でOpenAI Codex(GPTモデル)およびClaude Codeもサポートしています。
8+
9+
ローカルまたはマルチアカウントのCLIアクセスを、OpenAI(Responses含む)/Gemini/Claude互換のクライアントやSDKで利用できます。
10+
11+
## スポンサー
12+
13+
[![z.ai](https://assets.router-for.me/english-5-0.jpg)](https://z.ai/subscribe?ic=8JVLJQFSKB)
14+
15+
本プロジェクトはZ.aiにスポンサーされており、GLM CODING PLANの提供を受けています。
16+
17+
GLM CODING PLANはAIコーディング向けに設計されたサブスクリプションサービスで、月額わずか$10から利用可能です。フラッグシップのGLM-4.7および(GLM-5はProユーザーのみ利用可能)モデルを10以上の人気AIコーディングツール(Claude Code、Cline、Roo Codeなど)で利用でき、開発者にトップクラスの高速かつ安定したコーディング体験を提供します。
18+
19+
GLM CODING PLANを10%割引で取得:https://z.ai/subscribe?ic=8JVLJQFSKB
20+
21+
---
22+
23+
<table>
24+
<tbody>
25+
<tr>
26+
<td width="180"><a href="https://www.packyapi.com/register?aff=cliproxyapi"><img src="./assets/packycode.png" alt="PackyCode" width="150"></a></td>
27+
<td>PackyCodeのスポンサーシップに感謝します!PackyCodeは信頼性が高く効率的なAPIリレーサービスプロバイダーで、Claude Code、Codex、Geminiなどのリレーサービスを提供しています。PackyCodeは当ソフトウェアのユーザーに特別割引を提供しています:<a href="https://www.packyapi.com/register?aff=cliproxyapi">こちらのリンク</a>から登録し、チャージ時にプロモーションコード「cliproxyapi」を入力すると10%割引になります。</td>
28+
</tr>
29+
<tr>
30+
<td width="180"><a href="https://www.aicodemirror.com/register?invitecode=TJNAIF"><img src="./assets/aicodemirror.png" alt="AICodeMirror" width="150"></a></td>
31+
<td>AICodeMirrorのスポンサーシップに感謝します!AICodeMirrorはClaude Code / Codex / Gemini CLI向けの公式高安定性リレーサービスを提供しており、エンタープライズグレードの同時接続、迅速な請求書発行、24時間365日の専任技術サポートを備えています。Claude Code / Codex / Geminiの公式チャネルが元の価格の38% / 2% / 9%で利用でき、チャージ時にはさらに割引があります!CLIProxyAPIユーザー向けの特別特典:<a href="https://www.aicodemirror.com/register?invitecode=TJNAIF">こちらのリンク</a>から登録すると、初回チャージが20%割引になり、エンタープライズのお客様は最大25%割引を受けられます!</td>
32+
</tr>
33+
</tbody>
34+
</table>
35+
36+
## 概要
37+
38+
- CLIモデル向けのOpenAI/Gemini/Claude互換APIエンドポイント
39+
- OAuthログインによるOpenAI Codexサポート(GPTモデル)
40+
- OAuthログインによるClaude Codeサポート
41+
- OAuthログインによるQwen Codeサポート
42+
- OAuthログインによるiFlowサポート
43+
- プロバイダールーティングによるAmp CLIおよびIDE拡張機能のサポート
44+
- ストリーミングおよび非ストリーミングレスポンス
45+
- 関数呼び出し/ツールのサポート
46+
- マルチモーダル入力サポート(テキストと画像)
47+
- ラウンドロビン負荷分散による複数アカウント対応(Gemini、OpenAI、Claude、QwenおよびiFlow)
48+
- シンプルなCLI認証フロー(Gemini、OpenAI、Claude、QwenおよびiFlow)
49+
- Generative Language APIキーのサポート
50+
- AI Studioビルドのマルチアカウント負荷分散
51+
- Gemini CLIのマルチアカウント負荷分散
52+
- Claude Codeのマルチアカウント負荷分散
53+
- Qwen Codeのマルチアカウント負荷分散
54+
- iFlowのマルチアカウント負荷分散
55+
- OpenAI Codexのマルチアカウント負荷分散
56+
- 設定によるOpenAI互換アップストリームプロバイダー(例:OpenRouter)
57+
- プロキシ埋め込み用の再利用可能なGo SDK(`docs/sdk-usage.md`を参照)
58+
59+
## はじめに
60+
61+
CLIProxyAPIガイド:[https://help.router-for.me/ja/](https://help.router-for.me/ja/)
62+
63+
## 管理API
64+
65+
[MANAGEMENT_API.md](https://help.router-for.me/ja/management/api)を参照
66+
67+
## Amp CLIサポート
68+
69+
CLIProxyAPIは[Amp CLI](https://ampcode.com)およびAmp IDE拡張機能の統合サポートを含んでおり、Google/ChatGPT/ClaudeのOAuthサブスクリプションをAmpのコーディングツールで使用できます:
70+
71+
- Ampの APIパターン用のプロバイダールートエイリアス(`/api/provider/{provider}/v1...`
72+
- OAuth認証およびアカウント機能用の管理プロキシ
73+
- 自動ルーティングによるスマートモデルフォールバック
74+
- 利用できないモデルを代替モデルにルーティングする**モデルマッピング**(例:`claude-opus-4.5``claude-sonnet-4`
75+
- localhostのみの管理エンドポイントによるセキュリティファーストの設計
76+
77+
**[Amp CLI統合ガイドの完全版](https://help.router-for.me/ja/agent-client/amp-cli.html)**
78+
79+
## SDKドキュメント
80+
81+
- 使い方:[docs/sdk-usage.md](docs/sdk-usage.md)
82+
- 上級(エグゼキューターとトランスレーター):[docs/sdk-advanced.md](docs/sdk-advanced.md)
83+
- アクセス:[docs/sdk-access.md](docs/sdk-access.md)
84+
- ウォッチャー:[docs/sdk-watcher.md](docs/sdk-watcher.md)
85+
- カスタムプロバイダーの例:`examples/custom-provider`
86+
87+
## コントリビューション
88+
89+
コントリビューションを歓迎します!お気軽にPull Requestを送ってください。
90+
91+
1. リポジトリをフォーク
92+
2. フィーチャーブランチを作成(`git checkout -b feature/amazing-feature`
93+
3. 変更をコミット(`git commit -m 'Add some amazing feature'`
94+
4. ブランチにプッシュ(`git push origin feature/amazing-feature`
95+
5. Pull Requestを作成
96+
97+
## 関連プロジェクト
98+
99+
CLIProxyAPIをベースにした以下のプロジェクトがあります:
100+
101+
### [vibeproxy](https://github.com/automazeio/vibeproxy)
102+
103+
macOSネイティブのメニューバーアプリで、Claude CodeとChatGPTのサブスクリプションをAIコーディングツールで使用可能 - APIキー不要
104+
105+
### [Subtitle Translator](https://github.com/VjayC/SRT-Subtitle-Translator-Validator)
106+
107+
CLIProxyAPI経由でGeminiサブスクリプションを使用してSRT字幕を翻訳するブラウザベースのツール。自動検証/エラー修正機能付き - APIキー不要
108+
109+
### [CCS (Claude Code Switch)](https://github.com/kaitranntt/ccs)
110+
111+
CLIProxyAPI OAuthを使用して複数のClaudeアカウントや代替モデル(Gemini、Codex、Antigravity)を即座に切り替えるCLIラッパー - APIキー不要
112+
113+
### [ProxyPal](https://github.com/heyhuynhgiabuu/proxypal)
114+
115+
CLIProxyAPI管理用のmacOSネイティブGUI:OAuth経由でプロバイダー、モデルマッピング、エンドポイントを設定 - APIキー不要
116+
117+
### [Quotio](https://github.com/nguyenphutrong/quotio)
118+
119+
Claude、Gemini、OpenAI、Qwen、Antigravityのサブスクリプションを統合し、リアルタイムのクォータ追跡とスマート自動フェイルオーバーを備えたmacOSネイティブのメニューバーアプリ。Claude Code、OpenCode、Droidなどのコーディングツール向け - APIキー不要
120+
121+
### [CodMate](https://github.com/loocor/CodMate)
122+
123+
CLI AIセッション(Codex、Claude Code、Gemini CLI)を管理するmacOS SwiftUIネイティブアプリ。統合プロバイダー管理、Gitレビュー、プロジェクト整理、グローバル検索、ターミナル統合機能を搭載。CLIProxyAPIと統合し、Codex、Claude、Gemini、Antigravity、Qwen CodeのOAuth認証を提供。単一のプロキシエンドポイントを通じた組み込みおよびサードパーティプロバイダーの再ルーティングに対応 - OAuthプロバイダーではAPIキー不要
124+
125+
### [ProxyPilot](https://github.com/Finesssee/ProxyPilot)
126+
127+
TUI、システムトレイ、マルチプロバイダーOAuthを備えたWindows向けCLIProxyAPIフォーク - AIコーディングツール用、APIキー不要
128+
129+
### [Claude Proxy VSCode](https://github.com/uzhao/claude-proxy-vscode)
130+
131+
Claude Codeモデルを素早く切り替えるVSCode拡張機能。バックエンドとしてCLIProxyAPIを統合し、バックグラウンドでの自動ライフサイクル管理を搭載
132+
133+
### [ZeroLimit](https://github.com/0xtbug/zero-limit)
134+
135+
CLIProxyAPIを使用してAIコーディングアシスタントのクォータを監視するTauri + React製のWindowsデスクトップアプリ。Gemini、Claude、OpenAI Codex、Antigravityアカウントの使用量をリアルタイムダッシュボード、システムトレイ統合、ワンクリックプロキシコントロールで追跡 - APIキー不要
136+
137+
### [CPA-XXX Panel](https://github.com/ferretgeek/CPA-X)
138+
139+
CLIProxyAPI向けの軽量Web管理パネル。ヘルスチェック、リソース監視、リアルタイムログ、自動更新、リクエスト統計、料金表示機能を搭載。ワンクリックインストールとsystemdサービスに対応
140+
141+
### [CLIProxyAPI Tray](https://github.com/kitephp/CLIProxyAPI_Tray)
142+
143+
PowerShellスクリプトで実装されたWindowsトレイアプリケーション。サードパーティライブラリに依存せず、ショートカットの自動作成、サイレント実行、パスワード管理、チャネル切り替え(Main / Plus)、自動ダウンロードおよび自動更新に対応
144+
145+
### [霖君](https://github.com/wangdabaoqq/LinJun)
146+
147+
霖君はAIプログラミングアシスタントを管理するクロスプラットフォームデスクトップアプリケーションで、macOS、Windows、Linuxシステムに対応。Claude Code、Gemini CLI、OpenAI Codex、Qwen Codeなどのコーディングツールを統合管理し、ローカルプロキシによるマルチアカウントクォータ追跡とワンクリック設定が可能
148+
149+
### [CLIProxyAPI Dashboard](https://github.com/itsmylife44/cliproxyapi-dashboard)
150+
151+
Next.js、React、PostgreSQLで構築されたCLIProxyAPI用のモダンなWebベース管理ダッシュボード。リアルタイムログストリーミング、構造化された設定編集、APIキー管理、Claude/Gemini/Codex向けOAuthプロバイダー統合、使用量分析、コンテナ管理、コンパニオンプラグインによるOpenCodeとの設定同期機能を搭載 - 手動でのYAML編集は不要
152+
153+
### [All API Hub](https://github.com/qixing-jk/all-api-hub)
154+
155+
New API互換リレーサイトアカウントをワンストップで管理するブラウザ拡張機能。残高と使用量のダッシュボード、自動チェックイン、一般的なアプリへのワンクリックキーエクスポート、ページ内API可用性テスト、チャネル/モデルの同期とリダイレクト機能を搭載。Management APIを通じてCLIProxyAPIと統合し、ワンクリックでプロバイダーのインポートと設定同期が可能
156+
157+
### [Shadow AI](https://github.com/HEUDavid/shadow-ai)
158+
159+
Shadow AIは制限された環境向けに特別に設計されたAIアシスタントツールです。ウィンドウや痕跡のないステルス動作モードを提供し、LAN(ローカルエリアネットワーク)を介したクロスデバイスAI質疑応答のインタラクションと制御を可能にします。本質的には「画面/音声キャプチャ + AI推論 + 低摩擦デリバリー」の自動化コラボレーションレイヤーであり、制御されたデバイスや制限された環境でアプリケーション横断的にAIアシスタントを没入的に使用できるようユーザーを支援します。
160+
161+
> [!NOTE]
162+
> CLIProxyAPIをベースにプロジェクトを開発した場合は、PRを送ってこのリストに追加してください。
163+
164+
## その他の選択肢
165+
166+
以下のプロジェクトはCLIProxyAPIの移植版またはそれに触発されたものです:
167+
168+
### [9Router](https://github.com/decolua/9router)
169+
170+
CLIProxyAPIに触発されたNext.js実装。インストールと使用が簡単で、フォーマット変換(OpenAI/Claude/Gemini/Ollama)、自動フォールバック付きコンボシステム、指数バックオフ付きマルチアカウント管理、Next.js Webダッシュボード、CLIツール(Cursor、Claude Code、Cline、RooCode)のサポートをゼロから構築 - APIキー不要
171+
172+
### [OmniRoute](https://github.com/diegosouzapw/OmniRoute)
173+
174+
コーディングを止めない。無料および低コストのAIモデルへのスマートルーティングと自動フォールバック。
175+
176+
OmniRouteはマルチプロバイダーLLM向けのAIゲートウェイです:スマートルーティング、負荷分散、リトライ、フォールバックを備えたOpenAI互換エンドポイント。ポリシー、レート制限、キャッシュ、可観測性を追加して、信頼性が高くコストを意識した推論を実現します。
177+
178+
> [!NOTE]
179+
> CLIProxyAPIの移植版またはそれに触発されたプロジェクトを開発した場合は、PRを送ってこのリストに追加してください。
180+
181+
## ライセンス
182+
183+
本プロジェクトはMITライセンスの下でライセンスされています - 詳細は[LICENSE](LICENSE)ファイルを参照してください。

cmd/server/main.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ func main() {
103103
var standalone bool
104104
var noIncognito bool
105105
var useIncognito bool
106+
var localModel bool
106107

107108
// Define command-line flags for different operation modes.
108109
flag.BoolVar(&login, "login", false, "Login Google Account")
@@ -137,6 +138,7 @@ func main() {
137138
flag.StringVar(&password, "password", "", "")
138139
flag.BoolVar(&tuiMode, "tui", false, "Start with terminal management UI")
139140
flag.BoolVar(&standalone, "standalone", false, "In TUI mode, start an embedded local server")
141+
flag.BoolVar(&localModel, "local-model", false, "Use embedded model catalog only, skip remote model fetching")
140142

141143
flag.CommandLine.Usage = func() {
142144
out := flag.CommandLine.Output()
@@ -578,11 +580,16 @@ func main() {
578580
cmd.WaitForCloudDeploy()
579581
return
580582
}
583+
if localModel && (!tuiMode || standalone) {
584+
log.Info("Local model mode: using embedded model catalog, remote model updates disabled")
585+
}
581586
if tuiMode {
582587
if standalone {
583588
// Standalone mode: start an embedded local server and connect TUI client to it.
584589
managementasset.StartAutoUpdater(context.Background(), configFilePath)
585-
registry.StartModelsUpdater(context.Background())
590+
if !localModel {
591+
registry.StartModelsUpdater(context.Background())
592+
}
586593
hook := tui.NewLogHook(2000)
587594
hook.SetFormatter(&logging.LogFormatter{})
588595
log.AddHook(hook)
@@ -655,7 +662,9 @@ func main() {
655662
} else {
656663
// Start the main proxy service
657664
managementasset.StartAutoUpdater(context.Background(), configFilePath)
658-
registry.StartModelsUpdater(context.Background())
665+
if !localModel {
666+
registry.StartModelsUpdater(context.Background())
667+
}
659668

660669
if cfg.AuthDir != "" {
661670
kiro.InitializeAndStart(cfg.AuthDir, cfg)

config.example.yaml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,19 @@ nonstream-keepalive-interval: 0
175175
# cache-user-id: true # optional: default is false; set true to reuse cached user_id per API key instead of generating a random one each request
176176

177177
# Default headers for Claude API requests. Update when Claude Code releases new versions.
178-
# These are used as fallbacks when the client does not send its own headers.
178+
# In legacy mode, user-agent/package-version/runtime-version/timeout are used as fallbacks
179+
# when the client omits them, while OS/arch remain runtime-derived. When
180+
# stabilize-device-profile is enabled, OS/arch stay pinned to the baseline values below,
181+
# while user-agent/package-version/runtime-version seed a software fingerprint that can
182+
# still upgrade to newer official Claude client versions.
179183
# claude-header-defaults:
180184
# user-agent: "claude-cli/2.1.44 (external, sdk-cli)"
181185
# package-version: "0.74.0"
182186
# runtime-version: "v24.3.0"
187+
# os: "MacOS"
188+
# arch: "arm64"
183189
# timeout: "600"
190+
# stabilize-device-profile: false # optional, default false; set true to enable per-auth/API-key fingerprint pinning
184191

185192
# Default headers for Codex OAuth model requests.
186193
# These are used only for file-backed/OAuth Codex requests when the client

examples/custom-provider/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ func init() {
5252
sdktr.Register(fOpenAI, fMyProv,
5353
func(model string, raw []byte, stream bool) []byte { return raw },
5454
sdktr.ResponseTransform{
55-
Stream: func(ctx context.Context, model string, originalReq, translatedReq, raw []byte, param *any) []string {
56-
return []string{string(raw)}
55+
Stream: func(ctx context.Context, model string, originalReq, translatedReq, raw []byte, param *any) [][]byte {
56+
return [][]byte{raw}
5757
},
58-
NonStream: func(ctx context.Context, model string, originalReq, translatedReq, raw []byte, param *any) string {
59-
return string(raw)
58+
NonStream: func(ctx context.Context, model string, originalReq, translatedReq, raw []byte, param *any) []byte {
59+
return raw
6060
},
6161
},
6262
)

internal/api/handlers/management/auth_files.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,10 +748,25 @@ func (h *Handler) authIDForPath(path string) string {
748748
if path == "" {
749749
return ""
750750
}
751+
path = filepath.Clean(path)
752+
if !filepath.IsAbs(path) {
753+
if abs, errAbs := filepath.Abs(path); errAbs == nil {
754+
path = abs
755+
}
756+
}
751757
id := path
752758
if h != nil && h.cfg != nil {
753759
authDir := strings.TrimSpace(h.cfg.AuthDir)
760+
if resolvedAuthDir, errResolve := util.ResolveAuthDir(authDir); errResolve == nil && resolvedAuthDir != "" {
761+
authDir = resolvedAuthDir
762+
}
754763
if authDir != "" {
764+
authDir = filepath.Clean(authDir)
765+
if !filepath.IsAbs(authDir) {
766+
if abs, errAbs := filepath.Abs(authDir); errAbs == nil {
767+
authDir = abs
768+
}
769+
}
755770
if rel, errRel := filepath.Rel(authDir, path); errRel == nil && rel != "" {
756771
id = rel
757772
}

internal/auth/gemini/gemini_auth.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,9 @@ func (g *GeminiAuth) getTokenFromWeb(ctx context.Context, config *oauth2.Config,
305305
defer manualPromptTimer.Stop()
306306
}
307307

308+
var manualInputCh <-chan string
309+
var manualInputErrCh <-chan error
310+
308311
waitForCallback:
309312
for {
310313
select {
@@ -326,13 +329,14 @@ waitForCallback:
326329
return nil, err
327330
default:
328331
}
329-
input, err := opts.Prompt("Paste the Gemini callback URL (or press Enter to keep waiting): ")
330-
if err != nil {
331-
return nil, err
332-
}
333-
parsed, err := misc.ParseOAuthCallback(input)
334-
if err != nil {
335-
return nil, err
332+
manualInputCh, manualInputErrCh = misc.AsyncPrompt(opts.Prompt, "Paste the Gemini callback URL (or press Enter to keep waiting): ")
333+
continue
334+
case input := <-manualInputCh:
335+
manualInputCh = nil
336+
manualInputErrCh = nil
337+
parsed, errParse := misc.ParseOAuthCallback(input)
338+
if errParse != nil {
339+
return nil, errParse
336340
}
337341
if parsed == nil {
338342
continue
@@ -345,6 +349,8 @@ waitForCallback:
345349
}
346350
authCode = parsed.Code
347351
break waitForCallback
352+
case errManual := <-manualInputErrCh:
353+
return nil, errManual
348354
case <-timeoutTimer.C:
349355
return nil, fmt.Errorf("oauth flow timed out")
350356
}

0 commit comments

Comments
 (0)