Files

24 KiB
Raw Permalink Blame History

CC Switch v4.0.10

4.0 正式版の 6 回目の修正リリース

今回の中心はワンクリックインポートのリンク(ccswitch:// ディープリンク)です。CC Switch が起動していないときにリンクを押しても失われなくなりました。リンクで API の形式を宣言したり、Pi のプロバイダーをインポートしたり、サイト自身のアイコンを付けたりできます。Codex と Grok Build のリンクはプロバイダー独自の設定を保ち、固定のテンプレートに置き換えられなくなりました。確認ダイアログでは、インポート後すぐに切り替えるかどうかを選べます。あわせて、中国語・英語・日本語のサイト運営者向け連携ガイドと、オンラインのリンク生成ツールを公開しました。プロバイダーのアイコンにはローカルの画像をアップロードできるようになり、「マイアイコン」に保存すればすべてのプロバイダーで選べます。使用量ページには最初のトークンまでの時間を追加し、ルーティングを使っていなくてもセッションログから推定します。また、ルーティングモードで Claude Code の haiku 階層のリクエストが、思考を必須とする上流に拒否される問題、v3.20 以前に公式アカウントでルーティングを使ったときに残った Codex のセッションが開けない問題、Grok Build でサードパーティのプロバイダーを使うとセッションのタイトルを生成できない問題などを修正しました。4.0 の更新内容の全体は v4.0 リリースノート をご覧ください。


ワンクリックインポートのリンク

ユーザーから見た変化

  • CC Switch が起動していないときにリンクを押しても、失われなくなりました。 これまで Windows と Linux では、CC Switch を起動していない状態でワンクリックインポートのリンクを押すと、アプリは起動するもののインポートの確認ダイアログが表示されませんでした。軽量モードでウィンドウを作り直したときにも失われていました。macOS では同じリンクで確認ダイアログが 2 回表示されていました。現在はリンクをいったん保存し、確認ダイアログが表示されて初めて処理済みとします。途中で中断されても失われず、後から届いた古いリンクが新しいリンクを上書きすることもありません。
  • 確認ダイアログで、インポート後すぐに切り替えるかどうかを選べるようになりました。 プロバイダーのリンクの確認ダイアログに「インポート後にこのプロバイダーへ切り替える」スイッチを追加しました。デフォルトはオフで、オンにすると、クライアントのリクエストの送り先がリンクに書かれたアドレスに変わることが表示されます。OpenCode、OpenClaw、Hermes、MiniMax Code のような共存型アプリでは「インポート後に OpenCode の設定へ追加する」のようなスイッチ、Pi では「インポート後に Pi で有効にする」で、この 2 種類はデフォルトでオンです。プロンプトは「インポート後に有効にする」です。リンクの enabled が決めるのはスイッチの初期状態だけです。スイッチをオフにするとプロバイダーを保存するだけで、クライアントの設定は変更しません。そのアプリで最初のプロバイダーであっても同じです。
  • 使用量クエリスクリプト付きのリンクは、インポート後に使用量クエリがデフォルトで有効になります。 サイト運営者がリンクにスクリプトを付けるのは、インポートしてすぐに残高を見てほしいからですが、これまではさらに手動で有効にする必要がありました。リンクに usageEnabled=false と書かれていれば引き続きオフです。スクリプトのないリンクはこれまでと同じです。スクリプトはサンドボックスで実行され、プロバイダーのアドレスと同一オリジンの HTTPS に 1 回だけリクエストを送れます。確認ダイアログには、これまでどおりスクリプトの内容がすべて表示されます。
  • Codex のリンクで、プロバイダー独自の設定を保つようになりました。 リンクに完全な config.toml が含まれている場合、これまでは Key、アドレス、モデルだけを取り出して固定のテンプレートに当てはめていたため、プロバイダーの認証方式、リクエストヘッダー、WebSocket 対応、モデルカタログのアドレスが失われていました。現在はそのうち、このプロバイダーに属する部分を保ちます。接続と認証のフィールド、モデル、推論強度、コンテキストウィンドウ、サブエージェントモデルなどです。モデルカタログのアドレスは、API のアドレスと同一オリジンの場合にだけ保ちます。Codex はこれを取得するときにプロバイダーの認証情報を付けるためです。[features]、MCP、権限のようなグローバル設定はインポートしません。Codex にコマンドを実行させたり、ローカルの認証情報を読ませたりするプロバイダー設定(auth、aws、gateway_oauth、env_http_headers)を含むリンクは、全体を拒否します。設定を含まないリンクのインポート結果は、これまでと一字一句同じです。
  • Grok Build のリンクで、モデルの設定を保つようになりました。 config.toml を含むリンクも、これまでは固定のテンプレートに置き換えられ、表示名、説明、API の種類、コンテキストウィンドウが失われていました。現在は [models] default が指すモデルテーブルを保ち、アドレス、Key、モデルは引き続きリンクのパラメーターを優先します。auth_provider、env_http_headers、mtls_cert_dir を使うリンクは拒否されます。Grok Build では 1 つのプロバイダーが使うテーブルは 1 つだけなので、ほかのモデルテーブルはインポートしません。
  • 展開して実行される値は、すべて拒否するようになりました。 共存型アプリは、設定にある特殊な書き方を展開します。Pi では ! で始まる値がコマンドとして実行され、$NAME / ${NAME} は環境変数を読みます。OpenCode には {env:} / {file:}、OpenClaw と Hermes には ${...} があります。リンクにこうした書き方があると、コマンドが実行されたり、ローカルの秘密情報やファイルの内容がリンクに書かれたアドレスに送られたりするおそれがあります。現在はリンクの解析、設定のマージ、プロバイダーの生成のそれぞれで確認し、見つかればインポートを拒否します。
  • その他: configUrl を含むリンクは、開いた時点で非対応であることを表示するようになり、確認した後で失敗することはなくなりました。プロンプトのリンクが MiniMax Code に、MCP のリンクが Pi と MiniMax Code に対応しました。プロバイダーをインポートすると、トレイメニューがすぐに更新されます。

サイト運営者向けの新しいパラメーター

  • apiFormat: 1 つのパラメーターで上流の API 形式(anthropic / openai_chat / openai_responses / gemini_native)を宣言でき、CC Switch が各アプリ自身のフィールドに置き換えます。Claude Code、Codex、Grok Build でネイティブでない形式を使うには、ローカルルーティングを有効にする必要があります。アプリが対応していない組み合わせは、解析の時点で拒否されます。このパラメーターのないリンクの動作は変わりません。
  • Pi のプロバイダーのリンク: 新たに対応しました。インポートすると Pi の models.json に書き込まれます。リンクにはモデルが必須です。
  • iconUrl: サイト自身のロゴの https アドレスを指定します。確認ダイアログを開いた時点でダウンロードして上部に表示し、インポート後はカードのカスタムアイコンになります。ダウンロードに失敗してもインポートには影響せず、カードは内蔵アイコンか名前の頭文字に戻ります。画像は小さな PNG に描き直して保存し、アドレス自体は保存も表示もしません。ダウンロード時にはパブリックなアドレスにだけ接続し、名前解決の結果を固定して、2 回目の DNS 解決で別の場所を指されるのを防ぎます。リダイレクトは 1 回ごとに確認し、最大 3 回までです。システムプロキシは使わず、Cookie も送りません。タイムアウトは 5 秒、サイズは最大 256 KB で、ファイルの種類が内容と一致している必要があります。

サイト運営者向け連携ガイドとオンライン生成ツール

  • サイト運営者向け連携ガイド(ほかに 中文、English):リンクの生成方法、ページに「ワンクリックインポート」ボタンを置く方法(ボタンを押したときにバックエンドへリンクを要求するので、Key がページのソースに現れません)、ユーザーが CC Switch をインストールしていないときに何を表示するか、使用量クエリスクリプトの付け方を説明しています。New API や Sub2API で構築したサイトでは、Key 一覧に「CC Switch へのインポート」ボタンが最初から付いています。違いは、New API のリンクには使用量クエリスクリプトが含まれないため、ユーザーがインポートしても残高が表示されないことです。
  • オンラインのリンク生成ツール:テストページから、サイト運営者向けの生成ツールに作り替えました。プロバイダー、MCP、プロンプト、Skill の 4 種類に分かれ、アプリごとに選べる apiFormat を一覧にし、使用量スクリプトのテンプレートを内蔵しています。icon / iconUrl を入力すると、アプリ内と同じルールで確認します。ユーザーマニュアルにあった生成ツールへのリンクは、一度も公開されたことのない GitHub Pages のアドレスを指しており、開くと 404 でした。現在はマニュアルと README のどちらもここを指すようにしました。

新機能

プロバイダーのアイコンにローカルの画像をアップロードし、「マイアイコン」に保存して繰り返し使えるようになりました。 アイコンの選択画面は「マイアイコン」と「内蔵アイコン」の 2 グループに分かれ、検索欄で両方を同時に絞り込めます。「マイアイコン」の最初のマスにある「アップロード」を押し、PNG、JPG、WebP、SVG のいずれか(2 MB まで)を選んで名前を付ける(デフォルトはファイル名)と、「マイアイコン」に保存され、現在のプロバイダーに使われます。以降はほかのプロバイダーやほかのアプリでもそのまま選べ、もう一度アップロードする必要はありません。同じ画像をもう一度アップロードすると、既存のものを再利用します。アイコンにマウスを重ねると、名前の変更や削除ができます。カードには画像そのものを保存しているため、名前を変えても削除しても、すでにそのアイコンを使っているプロバイダーには影響しません。画像は 96×96 の PNG に縮小され、「マイアイコン」もプロバイダーの設定もクラウド同期で引き継がれます。ディスクに別のファイルとして保存することはありません。SVG はまずビットマップに変換し、中のスクリプトや外部へのリクエストは実行されず、元のファイルはデータベースに入りません。ワンクリックインポートのリンクで付いてきたサイトのアイコンは「現在のアイコン」として表示され、「マイアイコン」に保存できます。選択画面ではアイコンを 1 回クリックすると選択して閉じるようになりました。アイコンを外すには、検索欄の横の「アイコンをクリア」を押します。

使用量ページに最初のトークンまでの時間を表示するようになりました。 ルーティングサービスはこれまでも最初のトークンまでの時間を記録していましたが、見られるのはツールチップとリクエストの詳細だけでした。現在はプロバイダー統計とモデル統計に「最初のトークン」列を追加しました。値はルーティングサービス経由で成功したストリーミングリクエストの中央値なので、キュー待ちやコールドスタートでたまに遅くなったリクエストに引き上げられることはありません。リクエストログでも「速度」の後ろに「最初のトークン」列を追加しました。ルーティングを使っていないときは、セッションログのタイムスタンプから推定し、≈ を付けて表示します。Claude Code は思考から始まる返信を、Codex は比較的新しいバージョンが書き込んだタイムスタンプを使います。本文やツール呼び出しから始まる返信には推定値がありません。アップグレード前にインポートした記録は計算し直しません。

使用量クエリに Sub2API のテンプレートを追加しました。 「利用状況を設定」のテンプレートに Sub2API を追加しました。必要なのはプロバイダーの Key とアドレスだけで、アドレスに /v1 が付いていてもいなくても構いません。プラン名を表示し、無制限のサブスクリプションがマイナスの残高として表示されることもなくなりました。

新しいプリセット: NekoCode(Claude Code、Claude Desktop、Codex、OpenCode、OpenClaw、Hermes、Pi。MiniMax Code は Pi のプリセットを使います)。YYLX は中国語(簡体字)の画面では「鱼鱼连线」(繁体字中国語では「魚魚連線」)と表示されます。日本語の画面では引き続き YYLX と表示されます。

修正

  • ルーティングモードで、Claude Code の haiku 階層のリクエストが上流に拒否されていた問題(#8118)。ルーティングモードでは settings.json に固定のモデルエイリアスを書き込み、Claude Code はエイリアスによって思考パラメーターの送り方を決めます。haiku 階層にはこれまで claude-haiku-4-5 を書いていたため、Claude Code はこのモデルでは思考をオフにできると判断して思考をオフにしたリクエストを送り、思考を必須とする上流にそのまま拒否されていました。現在は claude-haiku-5-5 に変え、sonnet、opus 階層と同じ送り方になりました。ルーティング自体は引き続き「haiku」というキーワードでマッピングするため、選ばれるモデルは変わりません。
  • v3.20 以前に公式アカウントでルーティングを使ったときに残った Codex のセッションが開けなかった問題(#7948)。v3.17 から v3.20 で公式アカウントからローカルルーティングを使っていたとき、Codex はセッションを cc-switch-official の名前で記録していました。v4.0 はこのテーブルを書き込まなくなったため、Codex がこれらのセッションを再開しようとすると「Model provider cc-switch-official not found」というエラーになっていました。現在は CC Switch の起動時に、これらのセッションを Codex 内蔵の openai グループに戻します。変更するのはセッションの記録だけで、config.toml には触れません。これらのセッションはもともと公式ログインを使っており、Codex も一貫して OpenAI として扱っていたため、移動後も動作は変わりません。
  • Grok Build でサードパーティのプロバイダーを使うと、セッションのタイトルを生成できなかった問題(#7003)。models.session_summary が設定されていない場合、Grok Build は内蔵の grok-4.6 でタイトルを生成しますが、リクエストはデフォルトのモデルテーブルのアドレスに送られるため、サードパーティの上流に拒否されていました。現在はプロバイダーを切り替えるとき、session_summary が未設定か CC Switch が書いたテーブルを指している場合は、現在のプロバイダーを指すように合わせ、公式アカウントに戻すときは削除します。自分で設定した内蔵モデルや自分のテーブルはそのまま残します。
  • OpenRouter、Novita の残高がゼロのとき、カードに「プラン期限切れ」と表示されていた問題(#8148)。残高がゼロまたはマイナスでも Key は実際には使えるのに、カードとトレイにはプランの期限が切れたと表示されていました。現在は「残高なし」と表示します。API が返す残高が欠けていたり形式が正しくなかったりする場合はエラーとし、残高ゼロとしては扱わなくなりました。
  • Codex で途中でモデルを変えた後も、使用量が元のモデルで記録されていた問題。 Codex がスレッドの設定でモデルを変えたとき、ログに新しいターンのコンテキストが書かれるとは限らず、使用量の取り込みではこれまで、その後のリクエストを直前のモデル名で記録し(それより前の記録がなければ unknown)、料金も元のモデルで計算していました。現在はこの設定を読み取ります。すでに取り込んだ記録は自動では書き換えません。元のセッションログが残っていれば、使用量ページの「データソース」で「Codex 使用量を再構築」を押して作り直せます(再構築の前にデータベースが自動でバックアップされます)。
  • 設定画面で設定ディレクトリを変更し、まだ保存を押していないときに別の設定を変更すると、ディレクトリまで保存されていた問題(#7849)。ほかの設定が自動保存されるとき、確定済みのディレクトリだけを含めるようになりました。破棄した下書きが入力欄に残ることもなくなりました。
  • Windows でプロバイダーの追加・編集ページを開くと、ウィンドウが一瞬ちらついていた問題。 v4.0.9 では編集ページで先に読み込み中の画面が表示される問題を修正しましたが、ページ全体のフェードイン・フェードアウトが Windows ではまだちらついていました。現在はこの 2 つのページでフェードイン・フェードアウトをしなくなりました。ほかのページには影響しません。
  • Windows で削除したデスクトップのショートカットが、更新のたびに作り直されていた問題。 MSI のアップグレードは旧バージョンをアンインストールしてから新バージョンを完全にインストールするため、これまでは毎回デスクトップのショートカットを作り直していました。現在は新規インストールのときにだけ作成し、アップグレードでは元のショートカットが残っている場合にだけ保持します。

その他: 「接続モード」の説明を、まずそれぞれのモードの長所を述べる形に改めました。直接接続は最もネイティブ、ルーティングはプロバイダーのホットスイッチができ、フェイルオーバーとフォーマット変換に対応、集約はクライアント内で複数のプロバイダーのモデルをシームレスに切り替えられます。使用量ページの表の列はすべて左揃えにし、リクエストログではプロバイダーとモデルの 2 列の幅を少し減らして数値の列に回しました。日本語の画面では「高級オプション」を「詳細オプション」に改めました。

アップグレードに関する注意

データベースの構造は変わっていません。 バージョンは 20 のままです。

  • すでにルーティングモードで Claude Code を使っている場合、アップグレード後に CC Switch を起動すると新しい haiku のエイリアスが settings.json に書き込まれ、新しく開いた Claude Code のセッションから使われます。
  • Codex のセッションの移行は CC Switch の起動時に自動で行われ、Codex の設定ディレクトリごとに 1 回だけです。変更前のセッション記録は、既存のセッショングループ移行用のバックアップディレクトリに保存されます。cc-switch-official テーブルを手動で復元していて、まだ使っている場合、この移行はスキップされます。
  • 新しいプリセットは新しく追加するプロバイダーにだけ影響します。

謝辞

@funkpopo(OpenRouter の残高がゼロのときにプラン期限切れと表示される問題、Codex で途中でモデルを変えた後に使用量が誤ったモデルで記録される問題)、@hulkbig(設定の自動保存で未確定のディレクトリまで保存される問題)、@NestorRay(Windows でプロバイダーのページを開くときのちらつき)の貢献に感謝します。

問題の報告、再現情報の提供、検証に協力してくださった @hao-lin-lwh、@desmonna、@mossonli、@enderzcx、@nbcoming、@liyangdeamo-svg、@linhay、@aofee に感謝します。

技術的な詳細は CHANGELOG をご覧ください。