Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,18 @@ The redesign follows a macOS 27 design direction using available macOS 26 APIs b

As a companion feature, the gateway accepts **Anthropic Messages**, **OpenAI Chat Completions**, and **OpenAI Responses** from clients, whichever of those three you configure as upstreams.

- **Configure all three** and every client is handed to the upstream that already speaks its protocol, untouched.
- **Configure one or two** and a client speaking a protocol you did have still passes through, while one speaking a protocol you do not is converted for you.
A provider is one root address — `https://api.deepseek.com` — and up to three addresses bound under it, one per protocol:

Either way, if an upstream fails the rest of your queue takes over in order. It configures **Claude Code and Codex** with one click; other compatible clients can use the local endpoint manually. Around seventy provider presets ship built in, alongside custom and plugin-backed providers, with switching and model mapping. A provider that publishes `/v1/models` or `/models` can fill in its own model bindings from the editor; one that does not leaves the control disabled rather than failing.
| Protocol | Address |
| --- | --- |
| Anthropic Messages | `https://api.deepseek.com/anthropic` |
| OpenAI Chat Completions | `https://api.deepseek.com/chat/completions` |
| OpenAI Responses | `https://api.deepseek.com/responses` |

- **Bind all three** and every client is handed to the address that already speaks its protocol, untouched. A vendor publishing all three of its own endpoints is never translated for.
- **Bind one or two** and a client speaking a protocol you did bind still passes through, while one speaking a protocol you did not is converted for you. Conversion follows what you configured, rather than being decided in advance.

Either way, if an upstream fails the rest of your queue takes over in order. It configures **Claude Code and Codex** with one click; other compatible clients can use the local endpoint manually. Presets ship for Anthropic, OpenAI, Google and the model vendors with a first-party coding endpoint, alongside custom and plugin-backed providers, with switching and model mapping. A provider that publishes `/v1/models` or `/models` can fill in its own model bindings from the editor; one that does not leaves the control disabled rather than failing.

The gateway binds to `127.0.0.1`; inference requests still go to the provider you select.

Expand Down
14 changes: 11 additions & 3 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,18 @@ CLI 会话记录 ──▶ CC Buddy ──▶ 浏览 · 搜索 · 追踪 · 导

作为附带能力,网关始终接受客户端发来的 **Anthropic Messages、OpenAI Chat Completions 和 OpenAI Responses**,而上游由你在这三种协议中自行选配。

- **三种都配**:每个客户端都会被交给协议相同的那个上游,原样直通,不做任何转换。
- **只配一种或两种**:协议已配置的客户端照样直通;协议未配置的客户端由网关完成协议转换后再发出。
一个服务商只填一个根地址——`https://api.deepseek.com`——再在它下面按协议绑定最多三个地址:

两种情况下,若某个上游失败,队列中的其余上游都会按顺序接管。它能一键配置 **Claude Code 和 Codex**;其他兼容客户端可手动使用本地端点。内置约七十个服务商预设,也支持自定义与插件服务,均可切换并映射模型。若服务商提供 `/v1/models` 或 `/models`,可在编辑器中一键拉取并自动建立模型绑定;没有该接口时按钮会置灰而不是报错。
| 协议 | 地址 |
| --- | --- |
| Anthropic Messages | `https://api.deepseek.com/anthropic` |
| OpenAI Chat Completions | `https://api.deepseek.com/chat/completions` |
| OpenAI Responses | `https://api.deepseek.com/responses` |

- **三个都绑**:每个客户端都会被交给协议相同的那个地址,原样直通,不做任何转换。服务商自己就支持三种协议时,网关不会白做一次转换。
- **只绑一个或两个**:协议已绑定的客户端照样直通;协议未绑定的客户端由网关完成协议转换后再发出。转换是按你实际配置了什么来决定的,不是提前写死的。

两种情况下,若某个上游失败,队列中的其余上游都会按顺序接管。它能一键配置 **Claude Code 和 Codex**;其他兼容客户端可手动使用本地端点。内置预设覆盖 Anthropic、OpenAI、Google 以及提供官方 Coding 端点的模型厂商,也支持自定义与插件服务,均可切换并映射模型。若服务商提供 `/v1/models` 或 `/models`,可在编辑器中一键拉取并自动建立模型绑定;没有该接口时按钮会置灰而不是报错。

网关只监听 `127.0.0.1`;推理请求仍会发送给所选服务商。

Expand Down
11 changes: 11 additions & 0 deletions native/Resources/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"{n} 个会话无法建立索引,已显示其余会话" = "{n} conversations could not be indexed; the rest are shown";
"{n} 个失败" = "{n} failed";
"{n} 个文件" = "{n} files";
"{n} 个协议直通" = "{n} protocols pass through";
"{n} 个已存在" = "{n} already imported";
"{n} 会话" = "{n} sessions";
"{n} 天前" = "{n} d ago";
Expand Down Expand Up @@ -67,7 +68,9 @@
"安装到工具" = "Install to tools";
"安装受支持的 coding agent 后刷新本页。" = "Install a supported coding agent, then refresh this page.";
"按 Agent" = "By agent";
"按 API 地址填入该协议的常规地址" = "Fill in this protocol's conventional address from the API URL";
"按目录" = "By directory";
"按需转换" = "Converts as needed";
"把客户端模型名精确映射到上游模型;未命中时才使用自动映射。" = "Map client model names exactly to upstream models; automatic mapping is used only when none match.";
"把客户端请求的模型名精确映射到上游模型,回包自动改回原名。带 [1m](1M 上下文)等特殊模型务必在此显式映射到支持的上游,避免被自动映射降级。未命中别名时才走「自动映射」。" = "Map the client’s requested model name exactly to an upstream model; the response is renamed back automatically. Models with [1m] (1M context) etc. MUST be mapped here explicitly to a supported upstream, to avoid being auto-downgraded. Auto-mapping only kicks in when no alias matches.";
"版本" = "Version";
Expand Down Expand Up @@ -480,6 +483,7 @@
"模型厂商" = "Model vendors";
"模型列表为空或无法解析" = "The model list was empty or could not be read";
"默认" = "Default";
"默认地址" = "Default address";
"默认位置不可移除" = "The default location can't be removed";
"目标工具" = "Target tools";
"目标位置已存在同名 Skill,覆盖后原内容将被替换:\n{paths}" = "A Skill with the same name already exists at the target. Replacing it will overwrite its current contents:\n{paths}";
Expand Down Expand Up @@ -565,6 +569,7 @@
"全部范围" = "All scopes";
"全部更新" = "Update all";
"全部会话" = "All sessions";
"全部直通" = "All pass through";
"全部状态" = "All statuses";
"全局" = "Global";
"全局安装" = "Global installs";
Expand All @@ -583,6 +588,8 @@
"软删除的会话会出现在这里" = "Soft-deleted sessions appear here";
"若曾在终端 export ANTHROPIC_BASE_URL,请删除旧值以免覆盖。" = "If you previously exported ANTHROPIC_BASE_URL in a terminal, remove the old value so it does not override this one.";
"若曾在终端 export ANTHROPIC_BASE_URL,请删除以免覆盖。" = "If you ran export ANTHROPIC_BASE_URL in a terminal, remove it to avoid overriding.";
"三个协议都已绑定,全部直通" = "All three protocols are bound; everything passes through";
"三个协议都已绑定:每个客户端都走自己的地址,不做任何转换。" = "All three protocols are bound: every client uses its own address and nothing is converted.";
"筛选标签 {name}" = "Filter by tag {name}";
"删除" = "Delete";
"删除 Skill {name}" = "Delete Skill {name}";
Expand Down Expand Up @@ -742,6 +749,8 @@
"未安装 ChatGPT 桌面端" = "The ChatGPT app is not installed";
"未安装 Claude 桌面端" = "Claude Desktop is not installed";
"未安装插件" = "No plugins installed";
"未绑定的协议会转换后发往「{protocol}」。" = "Unbound protocols are converted and sent to “{protocol}”.";
"未绑定的协议由 Bifrost 自动转换" = "Unbound protocols are converted by Bifrost";
"未标注模型" = "Model not specified";
"未登录" = "Not signed in";
"未发现插件。把插件目录放到 ~/.ccbud/plugins// 后回到本页。" = "No plugins found. Put a plugin folder in ~/.ccbud/plugins//, then return to this page.";
Expand Down Expand Up @@ -1054,8 +1063,10 @@
"直接搜索" = "Direct search";
"直连" = "Direct";
"直通" = "Pass-through";
"只填服务商根地址,每个协议各自的地址在下面绑定。" = "Enter the provider's root address only; each protocol's own address is bound below.";
"至少 {count} 处匹配" = "At least {count} matches";
"至少 1 处匹配" = "At least 1 match";
"至少绑定一个协议的地址,网关才有上游可用。" = "Bind at least one protocol's address so the gateway has an upstream.";
"智能排序" = "Smart ranking";
"置顶会话" = "Pin session";
"中心源副本会保留。" = "The central source copy will be kept.";
Expand Down
11 changes: 11 additions & 0 deletions native/Resources/ja.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"{n} 个会话无法建立索引,已显示其余会话" = "{n} 件の会話をインデックス化できませんでした。残りの会話を表示しています";
"{n} 个失败" = "{n} 件失敗";
"{n} 个文件" = "{n} ファイル";
"{n} 个协议直通" = "{n}個のプロトコルが直通";
"{n} 个已存在" = "{n} 件は既存";
"{n} 会话" = "{n} セッション";
"{n} 天前" = "{n} 日前";
Expand Down Expand Up @@ -67,7 +68,9 @@
"安装到工具" = "インストール先ツール";
"安装受支持的 coding agent 后刷新本页。" = "対応する coding agent をインストールしてから、このページを更新してください。";
"按 Agent" = "エージェント別";
"按 API 地址填入该协议的常规地址" = "API アドレスからこのプロトコルの標準アドレスを入力します";
"按目录" = "ディレクトリ別";
"按需转换" = "必要に応じて変換";
"把客户端模型名精确映射到上游模型;未命中时才使用自动映射。" = "クライアントのモデル名を上流モデルに正確にマッピングします。一致しない場合のみ自動マッピングを使います。";
"把客户端请求的模型名精确映射到上游模型,回包自动改回原名。带 [1m](1M 上下文)等特殊模型务必在此显式映射到支持的上游,避免被自动映射降级。未命中别名时才走「自动映射」。" = "クライアントが要求したモデル名を上流モデルに正確にマッピングし、レスポンスは自動で元の名前に戻します。[1m](1M コンテキスト)などの特殊モデルは自動ダウングレードを避けるため、ここで対応する上流に明示的にマッピングしてください。別名に一致しない場合のみ「自動マッピング」が動作します。";
"版本" = "バージョン";
Expand Down Expand Up @@ -480,6 +483,7 @@
"模型厂商" = "モデルベンダー";
"模型列表为空或无法解析" = "モデル一覧が空か、解析できませんでした";
"默认" = "標準";
"默认地址" = "既定のアドレス";
"默认位置不可移除" = "既定の場所は削除できません";
"目标工具" = "対象ツール";
"目标位置已存在同名 Skill,覆盖后原内容将被替换:\n{paths}" = "対象には同名の Skill がすでにあります。上書きすると現在の内容が置き換えられます:\n{paths}";
Expand Down Expand Up @@ -565,6 +569,7 @@
"全部范围" = "すべてのスコープ";
"全部更新" = "すべて更新";
"全部会话" = "すべてのセッション";
"全部直通" = "すべて直通";
"全部状态" = "すべてのステータス";
"全局" = "グローバル";
"全局安装" = "グローバルインストール";
Expand All @@ -583,6 +588,8 @@
"软删除的会话会出现在这里" = "論理削除したセッションがここに表示されます";
"若曾在终端 export ANTHROPIC_BASE_URL,请删除旧值以免覆盖。" = "ターミナルで ANTHROPIC_BASE_URL を export したことがある場合は、上書きを避けるため古い値を削除してください。";
"若曾在终端 export ANTHROPIC_BASE_URL,请删除以免覆盖。" = "ターミナルで export ANTHROPIC_BASE_URL を実行した場合は、上書きを避けるため削除してください。";
"三个协议都已绑定,全部直通" = "3つのプロトコルすべてを設定済みで、すべて直通します";
"三个协议都已绑定:每个客户端都走自己的地址,不做任何转换。" = "3つのプロトコルすべてを設定済みです。各クライアントは自分のアドレスを使い、変換は行われません。";
"筛选标签 {name}" = "タグ {name} で絞り込む";
"删除" = "削除";
"删除 Skill {name}" = "Skill {name} を削除";
Expand Down Expand Up @@ -742,6 +749,8 @@
"未安装 ChatGPT 桌面端" = "ChatGPTアプリがインストールされていません";
"未安装 Claude 桌面端" = "Claudeデスクトップがインストールされていません";
"未安装插件" = "プラグイン未インストール";
"未绑定的协议会转换后发往「{protocol}」。" = "設定されていないプロトコルは変換されて「{protocol}」に送られます。";
"未绑定的协议由 Bifrost 自动转换" = "設定されていないプロトコルは Bifrost が自動変換します";
"未标注模型" = "モデル未指定";
"未登录" = "未ログイン";
"未发现插件。把插件目录放到 ~/.ccbud/plugins// 后回到本页。" = "プラグインが見つかりません。プラグインフォルダを ~/.ccbud/plugins// に置いてから本ページに戻ってください。";
Expand Down Expand Up @@ -1054,8 +1063,10 @@
"直接搜索" = "直接検索";
"直连" = "直接";
"直通" = "パススルー";
"只填服务商根地址,每个协议各自的地址在下面绑定。" = "サービス提供元のルートアドレスのみを入力します。各プロトコルのアドレスは下で設定します。";
"至少 {count} 处匹配" = "少なくとも {count} 件一致";
"至少 1 处匹配" = "少なくとも 1 件一致";
"至少绑定一个协议的地址,网关才有上游可用。" = "ゲートウェイに上流が必要です。少なくとも1つのプロトコルのアドレスを設定してください。";
"智能排序" = "スマート並べ替え";
"置顶会话" = "セッションをピン留め";
"中心源副本会保留。" = "中央ソースのコピーは保持されます。";
Expand Down
11 changes: 11 additions & 0 deletions native/Resources/ko.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"{n} 个会话无法建立索引,已显示其余会话" = "대화 {n}개의 색인을 생성하지 못했습니다. 나머지 대화는 표시됩니다";
"{n} 个失败" = "{n}개 실패";
"{n} 个文件" = "{n}개 파일";
"{n} 个协议直通" = "{n}개 프로토콜 통과";
"{n} 个已存在" = "{n}개는 이미 있음";
"{n} 会话" = "세션 {n}개";
"{n} 天前" = "{n}일 전";
Expand Down Expand Up @@ -67,7 +68,9 @@
"安装到工具" = "설치할 도구";
"安装受支持的 coding agent 后刷新本页。" = "지원되는 coding agent를 설치한 후 이 페이지를 새로 고치세요.";
"按 Agent" = "에이전트별";
"按 API 地址填入该协议的常规地址" = "API 주소를 바탕으로 이 프로토콜의 일반 주소를 채웁니다";
"按目录" = "디렉터리별";
"按需转换" = "필요할 때만 변환";
"把客户端模型名精确映射到上游模型;未命中时才使用自动映射。" = "클라이언트 모델명을 업스트림 모델에 정확히 매핑합니다. 일치하지 않을 때만 자동 매핑을 사용합니다.";
"把客户端请求的模型名精确映射到上游模型,回包自动改回原名。带 [1m](1M 上下文)等特殊模型务必在此显式映射到支持的上游,避免被自动映射降级。未命中别名时才走「自动映射」。" = "클라이언트가 요청한 모델명을 업스트림 모델에 정확히 매핑하고, 응답은 자동으로 원래 이름으로 되돌립니다. [1m](1M 컨텍스트) 등 특수 모델은 자동 다운그레이드를 피하기 위해 여기서 지원되는 업스트림에 명시적으로 매핑하세요. 별칭에 맞지 않을 때만 “자동 매핑”이 동작합니다.";
"版本" = "버전";
Expand Down Expand Up @@ -480,6 +483,7 @@
"模型厂商" = "모델 제공사";
"模型列表为空或无法解析" = "모델 목록이 비어 있거나 읽을 수 없습니다";
"默认" = "기본";
"默认地址" = "기본 주소";
"默认位置不可移除" = "기본 위치는 제거할 수 없습니다";
"目标工具" = "대상 도구";
"目标位置已存在同名 Skill,覆盖后原内容将被替换:\n{paths}" = "대상에 같은 이름의 Skill이 이미 있습니다. 덮어쓰면 현재 내용이 교체됩니다:\n{paths}";
Expand Down Expand Up @@ -565,6 +569,7 @@
"全部范围" = "모든 범위";
"全部更新" = "모두 업데이트";
"全部会话" = "모든 세션";
"全部直通" = "모두 통과";
"全部状态" = "모든 상태";
"全局" = "전역";
"全局安装" = "전역 설치";
Expand All @@ -583,6 +588,8 @@
"软删除的会话会出现在这里" = "삭제된 세션이 여기에 표시됩니다";
"若曾在终端 export ANTHROPIC_BASE_URL,请删除旧值以免覆盖。" = "터미널에서 ANTHROPIC_BASE_URL을 export한 적이 있다면 이전 값이 덮어쓰지 않도록 삭제하세요.";
"若曾在终端 export ANTHROPIC_BASE_URL,请删除以免覆盖。" = "터미널에서 export ANTHROPIC_BASE_URL을 실행했다면 덮어쓰지 않도록 삭제하세요.";
"三个协议都已绑定,全部直通" = "세 프로토콜이 모두 지정되어 전부 통과합니다";
"三个协议都已绑定:每个客户端都走自己的地址,不做任何转换。" = "세 프로토콜이 모두 지정되어 각 클라이언트가 자기 주소를 사용하며 변환이 일어나지 않습니다.";
"筛选标签 {name}" = "태그 {name}(으)로 필터링";
"删除" = "삭제";
"删除 Skill {name}" = "Skill {name} 삭제";
Expand Down Expand Up @@ -742,6 +749,8 @@
"未安装 ChatGPT 桌面端" = "ChatGPT 앱이 설치되어 있지 않습니다";
"未安装 Claude 桌面端" = "Claude 데스크톱이 설치되어 있지 않습니다";
"未安装插件" = "설치된 플러그인 없음";
"未绑定的协议会转换后发往「{protocol}」。" = "지정하지 않은 프로토콜은 변환되어 “{protocol}”(으)로 전송됩니다.";
"未绑定的协议由 Bifrost 自动转换" = "지정하지 않은 프로토콜은 Bifrost가 자동 변환합니다";
"未标注模型" = "모델 미지정";
"未登录" = "로그인 안 됨";
"未发现插件。把插件目录放到 ~/.ccbud/plugins// 后回到本页。" = "플러그인을 찾을 수 없습니다. 플러그인 폴더를 ~/.ccbud/plugins//에 넣은 후 이 페이지로 돌아오세요.";
Expand Down Expand Up @@ -1054,8 +1063,10 @@
"直接搜索" = "직접 검색";
"直连" = "직접";
"直通" = "패스스루";
"只填服务商根地址,每个协议各自的地址在下面绑定。" = "공급자의 루트 주소만 입력하세요. 프로토콜별 주소는 아래에서 지정합니다.";
"至少 {count} 处匹配" = "최소 {count}회 일치";
"至少 1 处匹配" = "최소 1회 일치";
"至少绑定一个协议的地址,网关才有上游可用。" = "게이트웨이에 업스트림이 있으려면 프로토콜 주소를 하나 이상 지정하세요.";
"智能排序" = "스마트 정렬";
"置顶会话" = "세션 고정";
"中心源副本会保留。" = "중앙 원본 사본은 유지됩니다.";
Expand Down
Loading