[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"package:cask:cc-switch:en":3,"releases:stats:cask:cc-switch:en":440,"releases:cask:cc-switch:1:false:false:en":441,"releases-count:cask:cc-switch:true:en":581},{"accentColor":4,"artifacts":5,"autoUpdates":32,"categories":33,"conflictsWith":40,"dependsOn":43,"deprecated":36,"description":54,"descriptionEn":55,"developer":56,"disabled":36,"displayName":57,"downloadSha256":58,"downloadSize":59,"downloadUrl":60,"editorChoice":36,"formulaeUrl":61,"homepage":62,"iconUrl":63,"installCommand":64,"installs":65,"installs30d":66,"isFont":36,"isLibrary":36,"kegOnly":36,"kind":69,"latestRelease":70,"machineTranslated":36,"minMacos":53,"name":57,"names":77,"platforms":79,"primaryCategory":410,"rank30d":411,"releaseCount":412,"releaseStats":413,"repoUrl":62,"screenshots":419,"sourceLocale":423,"sourceUrl":428,"summary":429,"summaryTranslation":430,"supports":432,"tags":434,"tap":438,"token":78,"version":108,"versionChangedAt":439},"#E68C53",{"apps":6,"binaries":8,"entries":9,"pkgs":31},[7],"CC Switch.app",[],[10,17],{"declaration":11,"phase":14,"sources":15,"target":13,"type":16},{"app":12,"target":13},[7],"\u002FApplications\u002FCC Switch.app","install",[7],"app",{"declaration":18,"phase":28,"sources":29,"type":30},{"zap":19},[20],{"trash":21},[22,23,24,25,26,27],"~\u002F.cc-switch","~\u002FLibrary\u002FApplication Support\u002Fcom.ccswitch.desktop","~\u002FLibrary\u002FCaches\u002Fcom.ccswitch.desktop","~\u002FLibrary\u002FPreferences\u002Fcom.ccswitch.desktop.plist","~\u002FLibrary\u002FSaved Application State\u002Fcom.ccswitch.desktop.savedState","~\u002FLibrary\u002FWebKit\u002Fcom.ccswitch.desktop","cleanup",[],"zap",[],true,[34],{"icon":35,"machineTranslated":36,"name":37,"slug":38,"sourceLocale":39},"lucide:code-xml",false,"Developer Tools","developer-tools","zh-CN",{"casks":41,"formulae":42},[],[],{"arch":44,"casks":47,"formulae":48,"macos":49,"requirements":50},[45,46],"arm64","x86_64",[],[],">= 12",{"macos":51},{">=":52},[53],"12","CC Switch is an open-source desktop configuration manager for AI coding tools. It helps developers maintain provider endpoints, credentials, models, MCP servers, skills, prompts, sessions and usage from one interface. It does not itself supply an AI model subscription or replace the coding clients it manages.\n\n## Features\n- Switch provider connection fields while preserving unrelated client configuration.\n- Choose Direct connections, local Routing with conversion\u002Ffailover, or model-based Aggregation for supported clients. Aggregation does not provide failover.\n- Manage Claude Code, Claude Desktop, Codex, Gemini CLI, Grok Build, OpenCode, OpenClaw, Hermes, Pi and MiniMax Code; individual integrations differ.\n- Synchronize supported MCP and skill configurations and edit tool-specific prompts.\n- Read session steps, tool results and changes, search\u002Fexport conversations and resume supported sessions.\n- Inspect request usage, estimated costs, provider quotas and account information where integrations support them.\n\n## Installation and requirements\nInstall the recorded Mac cask with `brew install --cask cc-switch`, or download the official DMG, open it and copy CC Switch to Applications. The official Mac build is universal for Apple Silicon and Intel, requires macOS12 or later, and is signed\u002Fnotarized according to the maintainer. The cask lists no extra formula dependencies or explicit conflicts. Configure a provider or import supported existing configuration, then select the intended mode. The managed coding tools have their own installation, runtime, permissions and account requirements.\n\nThe maintainer also supplies Windows10+ packages (including ARM builds) and Linux x86_64\u002FARM64 builds. Linux requires glibc2.35+ and WebKitGTK4.1, for example Ubuntu22.04+ or Debian12+; RHEL\u002FRocky\u002FAlma8–9 are not supported by the stated release requirements. No supported mobile edition was confirmed. RAM and installed disk minimums were not published in the cited guide. The verified4.0.4 Mac DMG is33,926,314bytes; that is download size, not installation footprint.\n\n## Compatibility and upgrades\nRouting and Aggregation depend on the local gateway and upstream protocol support. Claude Code Aggregation needs Claude Code2.1.243 or newer. Restart Codex, Gemini CLI and Grok Build when prompted after switching; Claude Code aggregation changes apply without a restart. WSL networking has separate localhost requirements.\n\nVersion4.0 changes how settings are preserved and removes common configuration snippets. It migrates the database to schema20 and automatically creates a database backup in `~\u002F.cc-switch\u002Fbackups\u002F`; a3.x client cannot open the new database. Review the official upgrade notes before downgrading or changing existing setups. Existing provider presets are not silently replaced with new defaults.\n\n## Accounts, cost and license\nCC Switch is released under MIT (copyright Jason Young) and can be used without buying a CC Switch subscription. Each AI provider has separate authentication, subscription\u002FAPI charges and service conditions. API keys and account credentials are needed for the relevant provider operations; request-cost estimates are not invoices. Configuration and session data are stored locally by default under `~\u002F.cc-switch`. Cloud\u002FWebDAV synchronization and relay endpoints introduce their own account and data-handling choices.\n\nSources: [Official project and requirements](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch), [4.0.4 English release notes](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fblob\u002Fmain\u002Fdocs\u002Frelease-notes\u002Fv4.0.4-en.md), [License](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fblob\u002Fmain\u002FLICENSE).","Configuration manager for AI coding agents","Jason Young (farion1231) and contributors","CC Switch","1e4d02e19864336b7fdc7e47d791c0a66f652c9591d8bf3c59be48a4cc940fd3",33926314,"https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Freleases\u002Fdownload\u002Fv4.0.4\u002FCC-Switch-v4.0.4-macOS.dmg","https:\u002F\u002Fformulae.brew.sh\u002Fcask\u002Fcc-switch","https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch","https:\u002F\u002Fcdn.opennavo.com\u002Ficons\u002Fuploads\u002Fefbe73b4642d\u002F50e788e99f3b-256.png","brew install --cask cc-switch",{"d30":66,"d365":67,"d90":68},2811,111713,24550,"cask",{"brewCommittedAt":71,"hasNotes":36,"isLatest":32,"isPrerelease":36,"sections":72,"source":73,"translation":74,"version":76},"2026-10-08T15:50:41Z",[],"homebrew",{"status":75},"none","4.0.5",[57,78],"cc-switch",[80,109,136,164,191,219,246,274,301,329,356,383],{"arch":46,"artifacts":81,"conflictsWith":96,"dependsOn":99,"downloadSha256":58,"downloadUrl":60,"macos":106,"minMacos":53,"requiresRosetta":36,"tag":107,"version":108},{"apps":82,"binaries":83,"entries":84,"pkgs":95},[7],[],[85,89],{"declaration":86,"phase":14,"sources":88,"target":13,"type":16},{"app":87,"target":13},[7],[7],{"declaration":90,"phase":28,"sources":94,"type":30},{"zap":91},[92],{"trash":93},[22,23,24,25,26,27],[],[],{"casks":97,"formulae":98},[],[],{"arch":100,"casks":101,"formulae":102,"macos":49,"requirements":103},[46],[],[],{"macos":104},{">=":105},[53],"27","golden_gate","4.0.4",{"arch":45,"artifacts":110,"conflictsWith":125,"dependsOn":128,"downloadSha256":58,"downloadUrl":60,"macos":106,"minMacos":53,"requiresRosetta":36,"tag":135,"version":108},{"apps":111,"binaries":112,"entries":113,"pkgs":124},[7],[],[114,118],{"declaration":115,"phase":14,"sources":117,"target":13,"type":16},{"app":116,"target":13},[7],[7],{"declaration":119,"phase":28,"sources":123,"type":30},{"zap":120},[121],{"trash":122},[22,23,24,25,26,27],[],[],{"casks":126,"formulae":127},[],[],{"arch":129,"casks":130,"formulae":131,"macos":49,"requirements":132},[45],[],[],{"macos":133},{">=":134},[53],"arm64_golden_gate",{"arch":46,"artifacts":137,"conflictsWith":152,"dependsOn":155,"downloadSha256":58,"downloadUrl":60,"macos":162,"minMacos":53,"requiresRosetta":36,"tag":163,"version":108},{"apps":138,"binaries":139,"entries":140,"pkgs":151},[7],[],[141,145],{"declaration":142,"phase":14,"sources":144,"target":13,"type":16},{"app":143,"target":13},[7],[7],{"declaration":146,"phase":28,"sources":150,"type":30},{"zap":147},[148],{"trash":149},[22,23,24,25,26,27],[],[],{"casks":153,"formulae":154},[],[],{"arch":156,"casks":157,"formulae":158,"macos":49,"requirements":159},[46],[],[],{"macos":160},{">=":161},[53],"26","tahoe",{"arch":45,"artifacts":165,"conflictsWith":180,"dependsOn":183,"downloadSha256":58,"downloadUrl":60,"macos":162,"minMacos":53,"requiresRosetta":36,"tag":190,"version":108},{"apps":166,"binaries":167,"entries":168,"pkgs":179},[7],[],[169,173],{"declaration":170,"phase":14,"sources":172,"target":13,"type":16},{"app":171,"target":13},[7],[7],{"declaration":174,"phase":28,"sources":178,"type":30},{"zap":175},[176],{"trash":177},[22,23,24,25,26,27],[],[],{"casks":181,"formulae":182},[],[],{"arch":184,"casks":185,"formulae":186,"macos":49,"requirements":187},[45],[],[],{"macos":188},{">=":189},[53],"arm64_tahoe",{"arch":46,"artifacts":192,"conflictsWith":207,"dependsOn":210,"downloadSha256":58,"downloadUrl":60,"macos":217,"minMacos":53,"requiresRosetta":36,"tag":218,"version":108},{"apps":193,"binaries":194,"entries":195,"pkgs":206},[7],[],[196,200],{"declaration":197,"phase":14,"sources":199,"target":13,"type":16},{"app":198,"target":13},[7],[7],{"declaration":201,"phase":28,"sources":205,"type":30},{"zap":202},[203],{"trash":204},[22,23,24,25,26,27],[],[],{"casks":208,"formulae":209},[],[],{"arch":211,"casks":212,"formulae":213,"macos":49,"requirements":214},[46],[],[],{"macos":215},{">=":216},[53],"15","sequoia",{"arch":45,"artifacts":220,"conflictsWith":235,"dependsOn":238,"downloadSha256":58,"downloadUrl":60,"macos":217,"minMacos":53,"requiresRosetta":36,"tag":245,"version":108},{"apps":221,"binaries":222,"entries":223,"pkgs":234},[7],[],[224,228],{"declaration":225,"phase":14,"sources":227,"target":13,"type":16},{"app":226,"target":13},[7],[7],{"declaration":229,"phase":28,"sources":233,"type":30},{"zap":230},[231],{"trash":232},[22,23,24,25,26,27],[],[],{"casks":236,"formulae":237},[],[],{"arch":239,"casks":240,"formulae":241,"macos":49,"requirements":242},[45],[],[],{"macos":243},{">=":244},[53],"arm64_sequoia",{"arch":46,"artifacts":247,"conflictsWith":262,"dependsOn":265,"downloadSha256":58,"downloadUrl":60,"macos":272,"minMacos":53,"requiresRosetta":36,"tag":273,"version":108},{"apps":248,"binaries":249,"entries":250,"pkgs":261},[7],[],[251,255],{"declaration":252,"phase":14,"sources":254,"target":13,"type":16},{"app":253,"target":13},[7],[7],{"declaration":256,"phase":28,"sources":260,"type":30},{"zap":257},[258],{"trash":259},[22,23,24,25,26,27],[],[],{"casks":263,"formulae":264},[],[],{"arch":266,"casks":267,"formulae":268,"macos":49,"requirements":269},[46],[],[],{"macos":270},{">=":271},[53],"14","sonoma",{"arch":45,"artifacts":275,"conflictsWith":290,"dependsOn":293,"downloadSha256":58,"downloadUrl":60,"macos":272,"minMacos":53,"requiresRosetta":36,"tag":300,"version":108},{"apps":276,"binaries":277,"entries":278,"pkgs":289},[7],[],[279,283],{"declaration":280,"phase":14,"sources":282,"target":13,"type":16},{"app":281,"target":13},[7],[7],{"declaration":284,"phase":28,"sources":288,"type":30},{"zap":285},[286],{"trash":287},[22,23,24,25,26,27],[],[],{"casks":291,"formulae":292},[],[],{"arch":294,"casks":295,"formulae":296,"macos":49,"requirements":297},[45],[],[],{"macos":298},{">=":299},[53],"arm64_sonoma",{"arch":46,"artifacts":302,"conflictsWith":317,"dependsOn":320,"downloadSha256":58,"downloadUrl":60,"macos":327,"minMacos":53,"requiresRosetta":36,"tag":328,"version":108},{"apps":303,"binaries":304,"entries":305,"pkgs":316},[7],[],[306,310],{"declaration":307,"phase":14,"sources":309,"target":13,"type":16},{"app":308,"target":13},[7],[7],{"declaration":311,"phase":28,"sources":315,"type":30},{"zap":312},[313],{"trash":314},[22,23,24,25,26,27],[],[],{"casks":318,"formulae":319},[],[],{"arch":321,"casks":322,"formulae":323,"macos":49,"requirements":324},[46],[],[],{"macos":325},{">=":326},[53],"13","ventura",{"arch":45,"artifacts":330,"conflictsWith":345,"dependsOn":348,"downloadSha256":58,"downloadUrl":60,"macos":327,"minMacos":53,"requiresRosetta":36,"tag":355,"version":108},{"apps":331,"binaries":332,"entries":333,"pkgs":344},[7],[],[334,338],{"declaration":335,"phase":14,"sources":337,"target":13,"type":16},{"app":336,"target":13},[7],[7],{"declaration":339,"phase":28,"sources":343,"type":30},{"zap":340},[341],{"trash":342},[22,23,24,25,26,27],[],[],{"casks":346,"formulae":347},[],[],{"arch":349,"casks":350,"formulae":351,"macos":49,"requirements":352},[45],[],[],{"macos":353},{">=":354},[53],"arm64_ventura",{"arch":46,"artifacts":357,"conflictsWith":372,"dependsOn":375,"downloadSha256":58,"downloadUrl":60,"macos":53,"minMacos":53,"requiresRosetta":36,"tag":382,"version":108},{"apps":358,"binaries":359,"entries":360,"pkgs":371},[7],[],[361,365],{"declaration":362,"phase":14,"sources":364,"target":13,"type":16},{"app":363,"target":13},[7],[7],{"declaration":366,"phase":28,"sources":370,"type":30},{"zap":367},[368],{"trash":369},[22,23,24,25,26,27],[],[],{"casks":373,"formulae":374},[],[],{"arch":376,"casks":377,"formulae":378,"macos":49,"requirements":379},[46],[],[],{"macos":380},{">=":381},[53],"monterey",{"arch":45,"artifacts":384,"conflictsWith":399,"dependsOn":402,"downloadSha256":58,"downloadUrl":60,"macos":53,"minMacos":53,"requiresRosetta":36,"tag":409,"version":108},{"apps":385,"binaries":386,"entries":387,"pkgs":398},[7],[],[388,392],{"declaration":389,"phase":14,"sources":391,"target":13,"type":16},{"app":390,"target":13},[7],[7],{"declaration":393,"phase":28,"sources":397,"type":30},{"zap":394},[395],{"trash":396},[22,23,24,25,26,27],[],[],{"casks":400,"formulae":401},[],[],{"arch":403,"casks":404,"formulae":405,"macos":49,"requirements":406},[45],[],[],{"macos":407},{">=":408},[53],"arm64_monterey",{"icon":35,"machineTranslated":36,"name":37,"slug":38,"sourceLocale":39},75,21,{"brewLag":414,"cadence":418,"count30d":415},{"compared":415,"earlierCount":416,"medianMinutes":417},3,2,-60,"weekly",[420],{"caption":421,"height":422,"machineTranslated":36,"sourceLocale":423,"theme":424,"thumbUrl":425,"url":426,"width":427},"Official4.0 interface example: provider cards, Direct\u002FRouting\u002FAggregation modes and sidebar tools on macOS.",849,"en-US","light","https:\u002F\u002Fcdn.opennavo.com\u002Fscreenshots\u002Fuploads\u002Fscreenshot\u002F58d0a56b0693\u002Fe72030ed8aa4-640.png","https:\u002F\u002Fcdn.opennavo.com\u002Fscreenshots\u002Fuploads\u002Fscreenshot\u002F58d0a56b0693\u002Fe72030ed8aa4-1280.png",1280,"https:\u002F\u002Fgithub.com\u002Fhomebrew\u002Fhomebrew-cask\u002Fblob\u002FHEAD\u002FCasks\u002Fc\u002Fcc-switch.rb","Desktop manager for AI coding-tool providers, local routing, model aggregation, MCP, skills, prompts, sessions and usage.",{"locale":423,"machineTranslated":36,"sourceLocale":423,"status":431},"source",{"arm64":32,"requiresRosetta":36,"status":433,"x86_64":32},"known",[57,435,436,437],"MCP","Tauri","MIT","homebrew\u002Fcask","2026-10-07T14:00:21.503962Z",null,{"current":442,"records":443,"size":578,"stats":579,"total":412},1,[444,447,464,481,498,503,508,513,518,523,528,533,538,543,548,553,558,563,568,573],{"brewCommittedAt":71,"hasNotes":36,"isLatest":32,"isPrerelease":36,"sections":445,"source":73,"translation":446,"version":76},[],{"status":75},{"bodyMarkdown":448,"brewCommittedAt":449,"hasNotes":32,"id":450,"isLatest":36,"isPrerelease":36,"machineTranslated":36,"publishedAt":439,"sections":451,"source":460,"sourceLocale":423,"summary":461,"title":462,"translation":463,"version":108},"# CC Switch v4.0\n\n### Stable release (4.0.4): a new interface, the new Aggregation mode, and safer config switching\n\nThis is the first stable release of v4.0, and the app will update to it automatically. It includes everything in the 4.0 preview, plus the fixes and additions made during the preview, from 4.0.1 to 4.0.4.\n\nThis is the biggest CC Switch release yet. With it, we've rethought the core of the CC Switch experience: how you connect to models, how you switch providers, and how you manage a growing set of AI coding tools.\n\nThe interface has been redesigned from the sidebar to the tray, giving apps, config, usage and sessions each a clear place. The new Aggregation mode puts models from several providers into one Claude Code or Codex model picker, so you can switch between them right inside the client. The Usage page has been redesigned too: every request is logged with its token usage, cost and output speed, and choosing the \"All\" time range shows the past year of daily usage as a heatmap. Session management has been rewritten from scratch: what the AI did in each turn, what it changed and which step failed are all visible at a glance. And the config-writing core has been rebuilt: switching providers now replaces only the key fields instead of rewriting the whole file, which removes a great deal of complexity and puts an end to a whole class of lost-settings problems. MCP servers can now be synced to Pi too, so one MCP config can serve 8 AI coding tools at once.\n\n> **Upgrading from 3.x?** How provider switching works, the database version and a few settings have changed. We suggest reading \"Before You Upgrade\" below first.\n\n---\n\n## A Redesigned Interface\n\nThe new interface uses a sidebar layout and an orange theme. Switching apps, plus global features like MCP, Skills, Prompts, Sessions, Accounts and Usage, are all one click away in the sidebar.\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Ffarion1231\u002Fcc-switch\u002Fmain\u002Fassets\u002Frelease-notes\u002Fv4.0.0\u002Fmain-en.png\" alt=\"The new interface: sidebar, mode tabs and provider cards\" width=\"720\">\u003C\u002Fp>\n\n- **Modes at a glance**: Every app page has three tabs at the top: Direct \u002F Routing \u002F Aggregation. Clicking a tab only changes what you're looking at and never touches your config. The button that actually switches modes tells you what will happen, and going back to Direct takes one step and can be undone\n- **A home for your tools**: The new Apps page shows each AI coding tool's version, install location and source, with install, upgrade and batch upgrade\n- **A cleaner Add Provider panel**: Search, pick a preset, fill in the form. Search matches Chinese names and domains, and one vendor's plans and regions are merged into one row, so Claude's presets now take noticeably fewer rows. Preset providers are no longer highlighted as recommendations\n- **Quota shows what's left**: Cards read \"5-hour 94% left\" or \"Balance 8.99 CNY\", and each tier is followed by its reset countdown, like \"⏱ 2h30m\". Quota stays a quiet gray: a percentage turns bold when it drops below 10%, and a balance turns red only once it runs out. Click it to re-check and see the result. Codex subscriptions also show how many saved resets are left and when they expire, and ChatGPT subscriptions show their Codex Credits balance, converted to US dollars at API prices\n- **Tray organized by app**: Each row reads \"name · mode · provider · quota\", and submenus list only the providers you can switch to right now. The tray icon shows a dot only when something really needs your attention\n- **Settings grouped by purpose**: General, App config, Local routing, Network, Data, About. Local routing's service status, listen address and failover settings now live in one place\n- **Editing is no longer a dialog**: Providers, MCP servers and prompts open as a full page in the content area, and the sidebar keeps working. With unsaved changes, clicking the sidebar, pressing ⌘, or switching away from the tray asks first\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Ffarion1231\u002Fcc-switch\u002Fmain\u002Fassets\u002Frelease-notes\u002Fv4.0.0\u002Fapps-en.png\" alt=\"The Apps page: versions, installs and upgrades for every AI coding tool in one place\" width=\"720\">\u003C\u002Fp>\n\nUpgrading users see a short note on first launch explaining where things have moved. After each update, the first launch also shows a summary of what changed. To see it again, click \"Recent updates\" in Settings → About.\n\n---\n\n## Aggregation: Many Providers, One Model Picker\n\nUntil now, using another provider's model meant going back to CC Switch, switching providers, and returning to your client.\n\nTurn on **Aggregation**, add a few providers, and their models all show up together in the Claude Code or Codex model picker. Whichever model you pick, the request goes straight to that provider, without ever leaving the client.\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Ffarion1231\u002Fcc-switch\u002Fmain\u002Fassets\u002Frelease-notes\u002Fv4.0.0\u002Fagg-codex-en.png\" alt=\"Models from several providers listed together in Codex's model picker\" width=\"560\">\u003C\u002Fp>\n\n- **Add and remove anytime**: Click \"Add\" or \"Remove\" on a provider card, then choose one provider as the default to handle requests that don't name an aggregated model\n- **Know every model at a glance**: Each model name carries its provider, like \"Kimi K3 (Kimi For Coding)\", and its description shows the real upstream model ID and context window, like `kimi-k3 · 256K`\n- **A streamlined form**: When you add or edit a provider on the \"Aggregation\" tab, connection details and the model list sit on one page, and that's all you fill in. The \"Direct\" and \"Routing\" tabs use the full form\n- **Mix providers in Codex without errors**: Set your official account as the default, and official and third-party models are listed side by side. Switch back and forth between providers' models and context compaction and reasoning state carry over\n- **Switch models mid-session**: You can change to another model partway through a session. Note that after each switch, the new model has to build its prompt cache again, so the first turn after switching costs noticeably more\n- **Restart reminders**: When Codex's model list changes you're prompted to restart, and Codex CLI users can restart the background service from the banner in one click. Changes to Claude Code's aggregated models take effect right away, with no restart\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Ffarion1231\u002Fcc-switch\u002Fmain\u002Fassets\u002Frelease-notes\u002Fv4.0.0\u002Fagg-en.png\" alt=\"Aggregation: one default provider plus six added providers\" width=\"720\">\u003C\u002Fp>\n\nAggregation is opt-in and currently supports Claude Code and Codex. Claude Code's aggregated model list needs Claude Code 2.1.243 or later. Aggregation routes each request by the model you pick, and does not offer failover.\n\n| Mode | How requests travel | Best for |\n|------|---------------------|----------|\n| **Direct** | The client talks to the provider directly | Everyday use |\n| **Routing** | Through local routing to one provider, with protocol conversion and failover | Incompatible protocols, or when you need failover |\n| **Aggregation** | Through local routing, dispatched by model to several providers | Mixing models from several providers in one session |\n\n> **A Tribute to opencodex**\n>\n> Aggregation learned a great deal from [opencodex](https:\u002F\u002Fgithub.com\u002Flidge-jun\u002Fopencodex) and builds directly on its ideas: prefixing model IDs with the provider so models from many providers can share the Claude Code and Codex pickers; letting Codex compact context on third-party models; and detecting when a background service is still using an old model list, then prompting a restart. All of these came out of opencodex's exploration. Our thanks to its author ([@lidge-jun](https:\u002F\u002Fgithub.com\u002Flidge-jun)) and contributors for open-sourcing this work, and our deepest respect for their open-source spirit!\n>\n> If you want a tool dedicated to bringing any model into Codex and Claude Code, we highly recommend giving opencodex a try!\n\n---\n\n## Usage\n\n**The Usage page** has redesigned metrics, a trend chart, a request log, and four paginated tables for providers, models and pricing. A new \"All\" time range shows your daily usage as a 53-week heatmap, and wide-range queries no longer freeze the window.\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Ffarion1231\u002Fcc-switch\u002Fmain\u002Fassets\u002Frelease-notes\u002Fv4.0.0\u002Fusage-en.png\" alt=\"Usage: the 53-week heatmap and request log\" width=\"720\">\u003C\u002Fp>\n\n- **Output speed** is now measured over generation time only, without the wait for the first token. Even without routing, requests imported from Claude Code and Codex session logs get an estimated speed, marked with \"≈\"\n- **The model table gains Success Rate and Speed columns**. The \"Average Cost\" column is gone; hover over the cost to see it\n- **The provider and model tables count cache tokens**, so the rows add up to the total token count at the top\n- Usage imported from session logs without routing shows a provider name like \"Claude Code · Session logs\", and hovering explains why the specific provider cannot be told apart\n- Usage records are written on a separate thread, so a slow disk no longer slows down the routing service\n\n---\n\n## Switch Providers, Keep Your Config Intact\n\nThis is the most important under-the-hood change in this release. It applies to Claude Code, Codex, Gemini CLI, Grok Build and Claude Desktop.\n\nCC Switch launched in August 2025, when the API ecosystem was far less mature than it is today. API formats often differed widely between official and third-party providers, so the original design rewrote the whole config file on every switch. That choice brought a series of problems and a lot of complexity. Now that the ecosystem has matured, it's time to rebuild.\n\n**Before**: Switching providers rewrote the entire config file from that provider's saved snapshot. Hooks, plugins and permissions you added to `settings.json`, or MCP servers you added to `config.toml`, were either lost on switch or absorbed into one provider's snapshot, disappearing as soon as you switched to another.\n\n**Now**: Switching replaces only the endpoint, credential, model and protocol, plus the provider's own switches. Everything else stays exactly where it was:\n\n- In TOML and `.env` files, untouched lines, comments and order included, stay byte for byte the same\n- In JSON files, every other key keeps its value and order\n- Shared settings simply stay in your config file, so the \"common config snippet\" feature is no longer needed\n\n**The editor previews what your config file will look like after switching**. Global settings you edit there are written to the config file, and before saving CC Switch checks whether another program has changed the file in the meantime.\n\nThe new write engine also adds several layers of protection:\n\n- If a config file can't be parsed, writing stops and the original file is left untouched\n- External changes are checked before writing, so a file another program just saved is never overwritten\n- When several files change together, the intent is recorded first. If the app quits unexpectedly midway, the next launch finishes the job automatically instead of leaving things half-written\n- Each file is backed up as-is before the new version writes to it for the first time\n- Config files that hold keys are readable and writable only by you\n\nTurning routing on or off no longer relies on backing up and restoring your whole config. When Codex switches to a third-party provider, the ChatGPT login it overwrites is stashed locally and restored automatically when you switch back to your official account.\n\n---\n\n## Session Management: See Every AI Coding Session Clearly\n\nAI coding tools keep a complete record of every session on your machine, but the raw logs are thousands of lines of JSON and nearly impossible to read. This release rewrites session management from scratch to make those records as readable as possible, and adds token usage and cost for each session.\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Ffarion1231\u002Fcc-switch\u002Fmain\u002Fassets\u002Frelease-notes\u002Fv4.0.0\u002Fsession-en.png\" alt=\"The session reader: step summaries, tool call details and the conversation outline\" width=\"720\">\u003C\u002Fp>\n\n- **Nine clients, one way to read them**: Sessions from Claude Code, Codex, Gemini CLI, Grok Build, OpenCode, OpenClaw, Hermes, Pi and MiniMax Code are parsed into structured content, with text, thinking, tool calls, tool results and images each shown in their own form\n- **One turn, one summary line**: A long run of AI actions folds into a single line, such as \"Steps · 44 · 27 commands · 2 files changed · 1 failed · 27m45s\". Failed commands are marked in red, and expanding one shows its parameters, output and exit code. Runs of file reads and searches merge into \"Read N files, searched N times\"\n- **Conversation outline**: The right-hand panel lists each of your prompts along with how many steps the turn took and what it concluded. Turns with failed steps get a red dot; click to jump there\n- **Three views**: \"All\" shows the full process, \"Chat\" shows only what you and the AI said, and \"Changes\" shows only which files were changed\n- **The whole session at a glance**: The header shows the project directory, start and end time, number of prompts and tool calls, model, total tokens and the cost at API prices\n- **Find in session**: Matches hidden inside folded tool output are expanded and scrolled into view automatically, and typing stays smooth even in long sessions\n- **From reading back to working**: Resume a session in your favorite terminal (Ghostty, for example) in one click, or copy the resume command. You can also export to Markdown and copy a single turn or the whole conversation\n- **An easier-to-search list**: Group by project or time, search titles, directories, first and last messages or session IDs, and delete in bulk\n- OpenCode 2.x sessions and Gemini CLI's new JSONL session format are now supported, and Hermes sessions open correctly again\n\nThe session reader redesign was led by [@Owlbay](https:\u002F\u002Fgithub.com\u002FOwlbay). Many thanks to Owlbay for the enormous effort.\n\n---\n\n## MCP Sync to Pi\n\nPi 1.0 has built-in MCP with the same config format as Claude Code. Turn on sync for Pi on the MCP page, and your existing MCP servers work in Pi right away. Together with Claude Code, Codex, Gemini CLI, Grok Build, OpenCode, Hermes and MiniMax Code, one MCP config can now manage 8 AI coding tools.\n\n- **Only connection fields are written**: Pi's own settings, such as timeouts, tool exposure and OAuth, are left as they are\n- **Turning sync off does not delete entries**: They are only marked disabled in Pi, and those settings are still there when you turn sync back on\n- **Unsupported configs are flagged right away**: Servers that use the SSE transport, which Pi does not support, or have special characters in their names are not written to the file\n\nMCP sync for Pi was built by [@Owlbay](https:\u002F\u002Fgithub.com\u002FOwlbay) and [@LystranG](https:\u002F\u002Fgithub.com\u002FLystranG).\n\n---\n\n## More Improvements\n\n- **Claude Code quick toggles**: New \"Disable Auto Mode Server Checks\". Starting with Claude Code 2.1.281, every session going through a third-party gateway or local routing first stopped once with a \"not eligible\" notice. With this checked, the check runs locally and the notice goes away. It is checked by default for new third-party providers; do not check it for official endpoints. Every quick toggle now has a \"?\" after it, explaining what it does and whether it is a global setting or follows the provider\n- **MCP**: Paste several server configs at once in JSON, TOML, Codex or OpenCode format. If writing to one app fails you can retry just that app, and one bad server no longer stops the others from syncing\n- **Skills**: \"Installed\" and \"Discover\" are merged into one page with one-click \"Update all\", and you can choose the sync method: automatic, symlink only or copy only. The installed list has a select-all checkbox in its header\n- **Prompts**: Manage prompts for eight apps on one page, copy them to other apps, import existing files, and undo a delete\n- **Accounts**: Accounts, re-login actions and remaining quota at a glance\n- **Backups at a glance**: \"Backup & Restore\" now has an expandable \"Other Backups\" section listing the path, size and item count of each kind of backup under `~\u002F.cc-switch`. You can open where they are stored or delete a whole category, and before deleting it tells you what you would lose\n- **Model metadata autofill**: When you pick a fetched model, its context window, output limit, reasoning levels and input types are filled in from presets and models.dev, without overwriting anything you've already entered\n- **Claude Desktop**: With model mapping, the local routing service starts on its own and stops when no longer needed\n- **OpenCode**: OpenCode 2.0's new provider config is supported. Both the old and new formats can be read and written, and format errors point to the exact field. You can pick thinking variants: models known to support reasoning are marked automatically, and OpenCode generates the variants itself. Comments and formatting in `opencode.jsonc` survive sync, and OpenCode 2.x usage is tracked\n- **MiniMax Code**: Install and upgrade it from the Apps page, and choose your own provider key when creating a provider\n- **Presets and pricing**: New Command Code, OpenCode Zen (Claude Code and Codex; shares one row with OpenCode Go) and MoArk (Claude Code, Codex, Pi, OpenCode, OpenClaw) presets; updated pricing for Claude Opus 5.5, GPT-6 Sol \u002F Luna, MiMo V2.6 and more; all existing presets now have proper icons\n- **Easier troubleshooting from logs**: Switching providers and entering or leaving Routing or Aggregation now logs where it switched from and to and how it went\n- **Project switcher hidden by default**: Most users don't need projects, so new installs no longer show the project switcher on the main page or in the tray. Turn it on in Settings when you need it. If you already use it, nothing changes\n\n---\n\n## Before You Upgrade\n\n**Where settings live has changed.** Shared settings now stay in the client's own config file, and the \"common config snippet\" feature has been removed. A model or reasoning effort you pick temporarily in the client goes back to the provider's value when you switch away and back. To keep it, save it in the provider editor.\n\n**Some fixes take effect after one switch.** The Codex model catalog and session history fixes apply the next time CC Switch writes the Codex config, so just switch providers once after upgrading. Re-sync your existing MCP config once to clear the old `type` field.\n\n**Restart when prompted after switching.** Codex, Gemini CLI and Grok Build need a restart after switching models, and Codex also needs a restart after its Aggregation list changes. Changes to Claude Code's aggregated models need no restart.\n\n**The database schema is now at 20.** The database is backed up automatically before the upgrade, under `~\u002F.cc-switch\u002Fbackups\u002F` (files starting with `db_backup_`). Going back to 3.x afterwards shows \"Database version is too new\".\n\n**Existing cards stay as they are.** Preset updates only apply to newly created providers. For example, existing Claude providers do not get \"Disable Auto Mode Server Checks\" checked automatically; check it in the editor if you need it. New pricing only backfills requests previously recorded at $0; other historical costs are not recalculated.\n\n**Claude Code's Aggregation mode needs 2.1.243 or later.** Claude Code added a `modelPicker` setting in that version, and aggregated models are listed in `\u002Fmodel` through it. Earlier versions ignore it, so `\u002Fmodel` shows none of the aggregated models. Run `claude --version` to check your version and `claude update` to upgrade.\n\n**A few settings have been removed.** Per-provider cost multipliers (relay prices already include their multiplier, so applying another one only skews the numbers); the connectivity-check advanced settings (built-in defaults are used now); and Claude's \"Teammates Mode\" and \"Max Effort Thinking\" quick toggles (every Claude Code session now has team features built in, and max effort locked every session to the most expensive level; use `\u002Feffort max` in a session when you need it). Variables already written in your config are not removed.\n\n---\n\n## Fixes\n\n- **Claude Code conversations on a ChatGPT account broke with a 400 error.** The official Codex backend added a field to its reasoning records, and the next request was then rejected. Conversations that already failed now recover on their own\n- **With Claude Code mapped to GPT or Grok, turning thinking off still left it reasoning at full effort.** Turning thinking off now lowers the reasoning effort to low, levels the target model does not support are adjusted automatically, and `\u002Feffort low` on GPT-5.x pro no longer fails with a 400\n- After quitting with `⌘Q`, the Dock's \"Quit\" or logging out on macOS, clients stayed pointed at the stopped local routing service\n- Replies on the Codex official route appeared only after a long delay, with usage recorded as 0\n- GPT models in the Codex model catalog lost their official prompts, tool capabilities and reasoning levels\n- Since Codex 0.158, the `type` field in MCP config caused errors and could even stop Codex from starting\n- MiniMax tool calls failed to parse their arguments, and some models' thinking showed up mixed into the reply text\n- Some upstreams mix LF and CRLF line breaks in streaming responses, which made tool calls go missing\n- An upstream rejection was reported as \"output limit reached\"; it is now reported as the upstream error it is, with the reason\n- Claude Desktop with OpenCode Go failed with `400 MissingSessionID`; local routing now adds the session ID automatically\n- Other apps checked when importing a Skill never actually got it, and syncing Skills deleted same-named folders inside OpenClaw's directory\n- Adding or importing a prompt could empty a prompt file you wrote by hand\n- Codex under WSL slowed down startup and session scans\n- The time MCP preset exited right after it started; it now runs `uvx mcp-server-time` (for servers you already added, change the command to `uvx` and the argument to `mcp-server-time` by hand)\n- Upgrading some CLIs installed an extra npm copy\n- The database file didn't shrink after old logs were pruned\n- \"Save and restart service\" in settings didn't actually restart the service\n- On macOS, after an in-app update or a config directory change, the restarted window opened behind other apps (the restart for this upgrade is still run by the old version, so the fix takes effect from the next update)\n- Grok Build's \"Get API Key\" opened the plain homepage, and the Xiaomi MiMo presets for Hermes and OpenClaw defaulted to a model without image support\n\n---\n\n## Changes Since the 4.0.0 Preview\n\nIf you already installed a preview from 4.0.0 to 4.0.3, this section lists what changed during the preview. The notes above already include all of it.\n\n**New**: Claude Code's \"Disable Auto Mode Server Checks\" quick toggle and an explanation for every toggle; MCP sync to Pi 1.0; full-page editing for MCP servers and prompts, with a reminder to save before leaving; the \"Other Backups\" overview; Codex Credits balance; OpenCode 2.0's new provider config and thinking variants; Success Rate and Speed columns in the Usage model table; OpenCode Zen and MoArk presets; select-all for installed Skills; switch logging; an update summary after each update.\n\n**Fixes**: ChatGPT account conversations failing with a 400; reasoning at full effort with thinking off; four rows of the same model at the top of `\u002Fmodel` in Claude Code's Aggregation mode; apps checked when importing a Skill not getting it; model mapping and aggregated models not working after another tool changed Codex's model catalog setting; Gemini CLI sessions not showing up; Codex under WSL slowing down scans; upstream errors reported as an output limit; Claude Desktop with OpenCode Go failing with a 400; tool calls lost in streaming; usage tables leaving out cache tokens; usage writes slowing down routing; the time MCP preset exiting at startup; Codex usage sync possibly hanging; plus UI details such as the sidebar animation, the divider, rows stretched by picking many reasoning levels, the time range picker border and icons filling their box.\n\n**Polish**: Changing Claude Code's aggregated models no longer needs a restart; the provider form follows the tab you are on, and models fetched in the full Codex form can be picked straight into the model mapping table; Claude's \"Teammates Mode\" and \"Max Effort Thinking\" quick toggles are removed.\n\n**New in 4.0.4**:\n- On macOS, after an in-app update or a config directory change, the restarted window comes to the front\n- New installs hide the project switcher by default\n- In a narrow Usage window, the request log's Speed column no longer gets pushed out into the horizontal scroll area\n- The Star prompt on the About page is now a strip of its own that you can dismiss\n\n---\n\n## Thanks\n\nThanks to everyone who contributed to this release:\n\n[@Owlbay](https:\u002F\u002Fgithub.com\u002FOwlbay) (session reader redesign, usage heatmap and performance, full-page editing and the unsaved-changes reminder, MCP sync for Pi, the time MCP preset, the MiMo presets), [@qyinter](https:\u002F\u002Fgithub.com\u002Fqyinter) (extensive UI\u002FUX polish), [@allenxu09](https:\u002F\u002Fgithub.com\u002Fallenxu09), [@parkavenue9639](https:\u002F\u002Fgithub.com\u002Fparkavenue9639), [@ggbdpq](https:\u002F\u002Fgithub.com\u002Fggbdpq), [@SailingLoong](https:\u002F\u002Fgithub.com\u002FSailingLoong), [@DEAN-Cherry](https:\u002F\u002Fgithub.com\u002FDEAN-Cherry), [@LystranG](https:\u002F\u002Fgithub.com\u002FLystranG), [@lcgash](https:\u002F\u002Fgithub.com\u002Flcgash), [@Chris-Xie369](https:\u002F\u002Fgithub.com\u002FChris-Xie369), [@fisHarly0](https:\u002F\u002Fgithub.com\u002FfisHarly0), [@minc-nice-100](https:\u002F\u002Fgithub.com\u002Fminc-nice-100), [@funkpopo](https:\u002F\u002Fgithub.com\u002Ffunkpopo), [@ISuuuu](https:\u002F\u002Fgithub.com\u002FISuuuu), [@tingfeng347](https:\u002F\u002Fgithub.com\u002Ftingfeng347), [@Hexc01](https:\u002F\u002Fgithub.com\u002FHexc01), [@zhengkaics](https:\u002F\u002Fgithub.com\u002Fzhengkaics), [@7ten7](https:\u002F\u002Fgithub.com\u002F7ten7), [@2doright](https:\u002F\u002Fgithub.com\u002F2doright), [@RemindZ](https:\u002F\u002Fgithub.com\u002FRemindZ), [@M3chD09](https:\u002F\u002Fgithub.com\u002FM3chD09), [@Richard-Zhang1019](https:\u002F\u002Fgithub.com\u002FRichard-Zhang1019), [@YuxuZhou-CN](https:\u002F\u002Fgithub.com\u002FYuxuZhou-CN), [@Eureka0w0v0](https:\u002F\u002Fgithub.com\u002FEureka0w0v0), [@Ne1ther](https:\u002F\u002Fgithub.com\u002FNe1ther), [@h6rime](https:\u002F\u002Fgithub.com\u002Fh6rime), [@bigben446](https:\u002F\u002Fgithub.com\u002Fbigben446), [@szupzj18](https:\u002F\u002Fgithub.com\u002Fszupzj18), [@AnxForever](https:\u002F\u002Fgithub.com\u002FAnxForever)\n\nThanks also to [@PnutCN](https:\u002F\u002Fgithub.com\u002FPnutCN), [@Aaron-WealthTech](https:\u002F\u002Fgithub.com\u002FAaron-WealthTech), [@RuriLothlorien](https:\u002F\u002Fgithub.com\u002FRuriLothlorien), [@Ming-Sir-69](https:\u002F\u002Fgithub.com\u002FMing-Sir-69), [@juntaosun](https:\u002F\u002Fgithub.com\u002Fjuntaosun), [@killServer0](https:\u002F\u002Fgithub.com\u002FkillServer0), [@shangchaovo](https:\u002F\u002Fgithub.com\u002Fshangchaovo), [@gsmchen](https:\u002F\u002Fgithub.com\u002Fgsmchen), [@winter-maple](https:\u002F\u002Fgithub.com\u002Fwinter-maple), [@guangzh3n](https:\u002F\u002Fgithub.com\u002Fguangzh3n), [@AltCtrlFn](https:\u002F\u002Fgithub.com\u002FAltCtrlFn), [@R-Tsubasa](https:\u002F\u002Fgithub.com\u002FR-Tsubasa), [@Lingbou](https:\u002F\u002Fgithub.com\u002FLingbou), [@Enough1122](https:\u002F\u002Fgithub.com\u002FEnough1122), [@IAld010](https:\u002F\u002Fgithub.com\u002FIAld010) for detailed bug reports, investigation and suggestions that helped us pin down the problems.\n\nSpecial thanks to the [opencodex](https:\u002F\u002Fgithub.com\u002Flidge-jun\u002Fopencodex) project; much of Aggregation's design benefits from its open-source exploration.\n\nAnd thanks to everyone who filed an issue or helped reproduce a bug. For the full technical details, see the [CHANGELOG](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fblob\u002Fmain\u002FCHANGELOG.md).\n\n\n[Official version release](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Freleases\u002Ftag\u002Fv4.0.4).","2026-10-07T12:59:54Z",625,[452],{"area":453,"items":454},"Highlights",[455,456,457,458,459],"Redesign sidebar, provider cards, app management and tray.","Aggregate Claude Code and Codex models from multiple providers.","Preserve unrelated configuration fields and detect external edits.","Rebuild session and usage views; synchronize MCP to Pi.","Database moves to schema20; review3.x migration and restart notes.","editorial","First stable4.0 release: redesigned interface, multi-provider model aggregation, safer config writes and rebuilt session\u002Fusage views.","CC Switch 4.0.4",{"locale":423,"machineTranslated":36,"sourceLocale":423,"status":431},{"bodyMarkdown":465,"brewCommittedAt":466,"hasNotes":32,"id":467,"isLatest":36,"isPrerelease":36,"machineTranslated":36,"publishedAt":468,"sections":469,"source":460,"sourceLocale":423,"summary":477,"title":478,"translation":479,"version":480},"# CC Switch v3.20.4\n\n> This release is mostly fixes, plus one new integration: **MiniMax Code becomes the tenth managed app** — providers, MCP, Skills, prompts, session browsing and usage statistics all come along, while the default model, sign-in and session deletion stay with MiniMax Code itself. The fixes center on using Codex through the local proxy, and four problems that made Codex unusable are closed in this release: starting with Codex 0.154, tools placed in `additional_tools` made strict Chat gateways return 400 outright; a single screenshot with `detail: \"original\"` made every later turn of the session return 400; editing or switching away from some Codex providers silently wiped the saved API key; and a card bound to a deleted ChatGPT account could neither be switched away from nor rebound. On the Claude Code side, auto mode works again under GitHub Copilot, and `\u002Feffort`'s `xhigh` and `max`, as well as Grok 4.6's reasoning effort, are sent at the selected tier. Claude Desktop's third-party configuration now supports Linux as well. **This release includes a database migration (v18 → v19); we recommend backing up the database manually before upgrading** — see [Upgrade Notes](#this-release-includes-a-database-migration).\n\n**[中文版 →](v3.20.4-zh.md) | [日本語版 →](v3.20.4-ja.md)**\n\n---\n\n## Highlights: What You Can Do Now\n\n- **Manage MiniMax Code with CC Switch** ([#7383](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7383), [#7578](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7578)): the tenth managed app. Providers are written into `~\u002F.minimax\u002Fconfig.yaml` alongside MiniMax Code's own settings, and multiple providers can coexist; MCP syncs both ways with `~\u002F.minimax\u002Fmcp.json`; Skills and the `AGENTS.md` prompt library come along; presets come from Pi's preset catalog, 41 in total. The default model, sign-in and session deletion **stay managed by MiniMax Code itself** — CC Switch does not touch them.\n- **See MiniMax Code sessions and usage in the dashboard**: browse sessions read-only and copy the resume command; usage is imported incrementally under a separate \"MiniMax Code (Session)\" source, and the first sync backfills the history.\n- **Switch Claude Desktop to third-party providers on Linux** ([#7331](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7331), fixes [#4855](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F4855)): the config paths follow the same layout as macOS and Windows, and the Flatpak build works too.\n- **Codex 0.154 and later no longer get 400 through Chat gateways** ([#7454](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7454), fixes [#7451](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7451), [#6158](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6158)): the tools in `additional_tools` are merged into the request correctly instead of turning into a system message with `content: null`.\n- **A single screenshot no longer ruins a whole Codex session** ([#7476](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7476), fixes [#6495](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6495), [#7458](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7458)): sessions that are already broken recover right after upgrading, with no manual history editing.\n- **Editing or switching away from a Codex provider no longer wipes the saved API key** ([#7434](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7434), fixes [#7433](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7433)).\n- **After a ChatGPT account is deleted, the Codex cards bound to it can be rebound or switched away from** ([#7395](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7395), fixes [#7392](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7392)).\n- **Use Claude Code's auto mode under GitHub Copilot** ([#5404](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F5404), fixes [#5175](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5175)).\n- **`\u002Feffort` sends exactly the tier you pick** ([#7318](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7318), [#7531](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7531), fixes [#7314](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7314), [#5367](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5367)): `xhigh` is no longer dropped, models mapped to Grok 4.6 carry the reasoning effort again, and `max` on GPT-5.6 and GPT-6 Astra is no longer downgraded to `xhigh`.\n- **Tools without a description no longer make the whole request return 400** ([#7319](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7319), [#7378](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7378), fixes [#7303](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7303)).\n- **See output tokens per second in the request log** ([#3369](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F3369), fixes [#5936](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5936)).\n- **Search and bulk-add models in the OpenCode provider form** ([#7515](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7515), fixes [#7423](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7423)).\n\n---\n\n## Usage Guides\n\n- **[Claude Desktop](..\u002Fuser-manual\u002Fen\u002F2-providers\u002F2.6-claude-desktop.md)**: the Linux configuration paths added in this release, the limits of the Flatpak build, and the updated support scope table.\n- **[Adding Providers](..\u002Fuser-manual\u002Fen\u002F2-providers\u002F2.1-add.md)**: the difference between Codex's native Responses direct connection and Chat routing conversion (the examples of Chat-only providers now name Baidu Qianfan Coding Plan and StepFun Step Plan), and the three fields the \"Hide AI Attribution\" toggle now writes.\n\n---\n\n> [!WARNING]\n>\n> ## Only Official Channels (Please Read)\n>\n> CC Switch is a **fully free and open-source** desktop app, and we **do not charge users any fees**. Please only obtain the software through the official channels listed below:\n>\n> | Channel            | Only Official                                                                  |\n> | ------------------ | ------------------------------------------------------------------------------ |\n> | Website            | **[ccswitch.io](https:\u002F\u002Fccswitch.io)**                                         |\n> | Source             | **[github.com\u002Ffarion1231\u002Fcc-switch](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch)** |\n> | Downloads          | **[GitHub Releases](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Freleases)**        |\n> | Author             | **[@farion1231](https:\u002F\u002Fgithub.com\u002Ffarion1231)**                               |\n> | Report an Imposter | **[GitHub Issues](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues)**            |\n>\n> **Any \"CC Switch\" website or client that asks you for payment, top-ups, or login credentials is fake.** If you have been tricked into paying, stop the transaction immediately and file a report through GitHub Issues.\n\n---\n\n## Overview\n\nMiniMax Code is MiniMax's coding agent; the terminal version `mcode` and the desktop app share the `~\u002F.minimax` data directory. CC Switch manages it in additive mode, like OpenCode, Hermes and Pi: each provider is an entry under `custom_provider` in `~\u002F.minimax\u002Fconfig.yaml`, multiple providers coexist, and writes preserve MiniMax Code's other settings and respect its config file lock. MCP syncs both ways with `~\u002F.minimax\u002Fmcp.json`, Skills are deployed to `~\u002F.minimax\u002Fskills\u002F`, and the prompt library writes to `~\u002F.minimax\u002FAGENTS.md`; session browsing is read-only, and usage is imported incrementally from MiniMax Code's own database. The scope is deliberately kept tight: the default model, sign-in, cloud features and session deletion are all left to MiniMax Code, and local proxy takeover, failover, the tray, the common-config snippet and Profiles do not cover it either. ([#7383](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7383), [#7578](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7578))\n\nThe most significant fixes concern using Codex through the local proxy. Starting with 0.154, Codex puts extra tools such as plugins and execution namespaces into an `additional_tools` input item; the converter treated it as a message and produced a system message with `content: null`, strict Chat gateways returned 400 outright, and the tools inside were dropped as well ([#7454](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7454)). Codex marks screenshots with `detail: \"original\"`, a value that is only valid in the Responses API; copied verbatim into the Chat request, it made gateways such as Ark\u002FDoubao, SenseNova, GLM and vLLM return 400 for the entire request, and because Codex replays the full history every turn, a single image made that session fail on every turn from then on ([#7476](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7476)). The other two are account-data problems: for Codex providers that carry their own credential source, the saved API key was overwritten by the empty live auth when the provider was edited and saved or switched away from ([#7434](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7434)); and after a ChatGPT account was deleted in the Auth Center and the user signed in again, cards bound to the old account reported \"account not found\" on every switch, takeover and startup restore ([#7395](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7395)).\n\nClaude Code's converted requests get several fixes too: tools without a description are no longer sent with `\"description\": null` ([#7319](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7319), [#7378](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7378)); the auto mode classifier under GitHub Copilot no longer gets 400 because of the `stop` parameter ([#5404](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F5404)); and `\u002Feffort xhigh` is no longer dropped, models mapped to Grok 4.6 carry the reasoning effort again, and `max` on GPT-5.6 and GPT-6 Astra is no longer downgraded to `xhigh` ([#7318](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7318), [#7531](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7531)). The remaining fixes cover Skills installation (a skills.sh id that differs from the directory name, and repositories with more than 10,000 files, [#6381](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6381), [#7489](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7489)), prompts reading back external edits ([#7194](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7194)), the OMO unified config on WSL ([#7550](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7550)), version detection on the About page ([#7346](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7346), [#7348](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7348)) and the Windows taskbar ([#6348](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6348)). On the feature side, Claude Desktop's third-party configuration supports Linux ([#7331](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7331)), the request log shows output tokens per second ([#3369](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F3369)), and the OpenCode provider form can search and bulk-add fetched models ([#7515](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7515)).\n\nPresets get a maintenance round: the domestic Codex presets are aligned with each vendor's Responses documentation (Kimi For Coding moves to K2.8 Preview with a 1M window, DeepSeek defaults to `deepseek-flash`), MiniMax's China site and BaiLing move to their current official domains, AICodeWith's Codex-family endpoint is corrected to `\u002Fv1`, and a few presets are added. On 2026-09-12 DeepSeek withdrew its announcement that V4 Pro would be billed at V4.1 Flash prices, so this release reverts the price change v3.20.3 made ahead of time and restores the peak tier. This release includes a database migration: `SCHEMA_VERSION` 18 → 19, adding MiniMax Code enable columns to the MCP and Skills tables.\n\n**Release date**: 2026-09-22\n\n**Change size**: 46 commits | 156 files changed | +8,673 \u002F -684 lines\n\n---\n\n## Added\n\n### MiniMax Code Becomes the Tenth Managed App\n\nMiniMax Code (`app_type` is `mcode`) shares one data directory between its terminal and desktop versions; it defaults to `~\u002F.minimax` and can be moved elsewhere with `MINIMAX_DATA_DIR` (or the legacy `MAVIS_DATA_DIR`). ([#7383](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7383), [#7578](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7578))\n\n- **Providers**: additive mode, like OpenCode, Hermes and Pi. Each provider is an entry under `custom_provider` in `~\u002F.minimax\u002Fconfig.yaml`, and whether a card counts as \"Added\" depends only on whether its key is in the file. The form reuses the OpenCode-style structured editor, plus a JSON editor, and supports three API formats: `anthropic-messages`, `openai-completions` and `openai-responses`; presets are derived from Pi's preset catalog, 41 at release. Custom providers created in MiniMax Code are imported when the list loads, and edits made there sync back too; account-type providers (those whose `kind` is not `custom`) are neither imported nor overwritten. Writes preserve every other key in `config.yaml` and respect MiniMax Code's own `config.yaml.lock` directory lock (a lock older than 10 seconds is reclaimed; otherwise the save fails with a prompt to retry), and database changes roll back when the native file write fails. After a provider is deleted from `config.yaml`, its card immediately refreshes to the not-added state and can be added again ([#7578](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7578)).\n- **The default model belongs to MiniMax Code**: CC Switch never writes `defaultModel` \u002F `defaultLightModel`. While a provider or model is referenced by either of them, CC Switch refuses to delete or disable it; switch to a different default model in MiniMax Code first.\n- **MCP**: syncs both ways with `~\u002F.minimax\u002Fmcp.json`. Edits replace only the transport fields (`command`, `args`, `env`, `url`, `headers`, `type`), so native options such as `timeout` are preserved; a server with the same id but a different transport is skipped with a notice rather than overwritten; a full resync does not remove entries whose toggle is off — only an explicit disable or delete removes them. The native file is restored when the database commit fails.\n- **Skills and prompts**: Skills are deployed to `~\u002F.minimax\u002Fskills\u002F` using the same ownership check as Pi, so a same-named Skill that CC Switch did not deploy is never touched. The prompt library writes the enabled prompt into `~\u002F.minimax\u002FAGENTS.md`: before switching, external edits in the file are first written back into the current prompt; when no MiniMax Code prompt has been enabled yet, unmatched content in the file is first saved as a backup prompt. Disabling the last prompt clears the file; a single prompt is capped at 32 KiB (counted in UTF-8 bytes).\n- **Deep links**: the `apps` field of MCP deep links accepts `mcode`; provider deep links for MiniMax Code are rejected.\n- **Not in this release**: MiniMax Code's native sign-in and cloud features, local proxy takeover and failover, a tray entry, the common-config snippet, universal providers, Profiles (the MiniMax Code page hides the Profile switcher), per-card provider testing, a directory override in Settings, and installing or upgrading it from \"Settings → About\".\n\n### MiniMax Code Sessions and Usage in the Dashboard\n\nThe session browser opens `~\u002F.minimax\u002Fv2\u002Fsqlite\u002Fruntime-state.sqlite` read-only and lists MiniMax Code conversations (hidden, archived and child sessions, as well as peek\u002Fchannel\u002Fcron sessions, are not listed); each session offers the resume command `env MINIMAX_DATA_DIR=\u003Cdir> mcode --session \u003Cid>` (in PowerShell syntax on Windows). Sessions are tied to MiniMax Code's runtime state, so they cannot be deleted from the UI, and the backend refuses as well.\n\nUsage is imported incrementally from the `local_runtime_token_usage` table in the same database under the \"MiniMax Code (Session)\" source, with its own app filter in the dashboard. Reasoning tokens count as output; the model id is the part after the first `\u002F` (`custom_provider:router\u002Fvendor\u002Fmodel` is recorded as `vendor\u002Fmodel`). When MiniMax Code's own `cost_usd` is a finite non-negative number it is used directly; when it is missing, negative or non-finite, the cost is computed from CC Switch's pricing table instead. Rows whose native cost is exactly $0 are stored at $0, but, like any other $0 row with tokens, they are repriced by the shared cost backfill once the model gets a price in the pricing table. As with Pi, totals that include MiniMax Code carry a caveat that cache-write data is incomplete. ([#7383](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7383))\n\n### Claude Desktop Third-Party Configuration Supports Linux\n\nPreviously, writing Claude Desktop's third-party configuration on Linux failed outright with an unsupported-platform error. Linux now uses the same file layout as macOS and Windows: the config root is `$XDG_CONFIG_HOME` (which must be an absolute path), or `~\u002F.config` when it is not set, and CC Switch maintains the config files in the `Claude\u002F` and `Claude-3p\u002F` directories under it. When CC Switch runs as a Flatpak (detected through `\u002F.flatpak-info`), it always writes the host's `~\u002F.config`, never the sandbox-private `XDG_CONFIG_HOME`; if your Claude Desktop uses a custom XDG directory, use the native package instead. The bundled Flatpak manifest already grants home directory access. The macOS and Windows paths are unchanged; the user manual (zh\u002Fen\u002Fja) adds the Linux paths and the support scope table. ([#7331](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7331), fixes [#4855](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F4855))\n\n### Request Log Shows Output Tokens per Second\n\nThe request log table shows the generation rate next to the output tokens (e.g. `1,234\u002F56 tps`), and the request detail panel shows it in parentheses after the output tokens. When a streaming request has a recorded first-token time, rate = output tokens ÷ (total latency − first-token time), counting only the generation after the first token; non-streaming requests use the full latency, so their rate includes the wait for the first token. Rates of 1 or more are rounded to whole numbers, and rates below 1 keep one decimal place. Rows without output tokens or without a valid time window show nothing, including rows imported from Claude Code, Codex and Gemini session logs, which have no latency data. The rate is computed at display time from stored fields, with no schema or logging changes. ([#3369](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F3369), fixes [#5936](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5936))\n\n### OpenCode Provider Form: Search and Bulk-Add Models\n\nAfter clicking \"Fetch Models\", a searchable multi-select list appears above the form: filter by model ID or owner, check the models you want (your selections are kept when you change the search term), then click \"Add selected (N)\" to add them in one go; the model ID serves as both the config key and the initial display name. Models already configured show as checked, cannot be selected, and are labeled \"Already added\"; the names, limits and options of existing entries stay unchanged. Changing the Base URL or API Key clears the candidate list and discards a late response from the previous endpoint; pressing Enter in the search box does not submit the form. The existing per-row dropdown picker remains; the MiniMax Code provider form, which reuses the OpenCode fields, has the same picker. ([#7515](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7515), fixes [#7423](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7423))\n\n### New Presets\n\nKimi Global and Kimi For Coding Global ([#7526](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7526)), FluxA Token Plan and Soshow join seven apps — Claude Code, Claude Desktop, Codex, Hermes, OpenClaw, OpenCode and Pi; the two Kimi Global presets are for Kimi's international site (kimi.ai). Codex also gains native Responses presets for StepFun API (domestic and international), Baidu Qianfan (pay-as-you-go) and iFlytek Astron Coding Plan. Existing providers are unaffected.\n\n### Other Additions\n\n- **Pricing for five models**: `grok-4.7`, `glm-5.3-flashx`, `hy4-preview` (Hunyuan Hy4 Preview), `qwen3.8-2.4t-a95b` and `qwen3.8-27b` had no pricing rows before, so their requests were all recorded at $0. After upgrading, the backfill at startup fills in costs for the historical $0 requests under these ids. Grok 4.7 is priced at the base tier for prompts under 200K tokens.\n- **Star prompt on the About card**: the \"Settings → About\" card adds a GitHub Star prompt line between the title and the buttons, which opens the repository when clicked; the GitHub button moves to the front of the button row.\n\n---\n\n## Changed\n\n### Domestic Codex Presets Aligned With Each Vendor's Responses Documentation\n\n- **Kimi For Coding**: `kimi-for-coding` is now served by K2.8 Preview; its catalog row is renamed \"Kimi For Coding (K2.8 Preview)\", the context window grows from 262144 to 1048576, it declares text+image input, and its reasoning tiers expand from `high` only to `low` \u002F `high` \u002F `max` (default `high`). `kimi-for-coding-highspeed` stays at 262144 with `high` only.\n- **DeepSeek**: the preset now defaults to `deepseek-flash` (V4.1 Flash, text+image) instead of the old alias `deepseek-v4-flash`; the `deepseek-v4-pro` row is declared text-only, and both rows match the bundled official DeepSeek catalog. Cards still on `deepseek-v4-flash` keep working as usual, since the vendor routes that alias to `deepseek-flash`.\n- **Tencent Hunyuan**: adds `hy4-preview` (960K input, text-only); the default model stays `hy3`.\n- **千问AI平台 and QwenCloud pay-as-you-go**: add the open-weight `qwen3.8-2.4t-a95b` (text-only) and `qwen3.8-27b` (text+image).\n- **No preset switches protocol**: the four Tencent Token Plan Enterprise presets stay on Chat, because TokenHub states that Kimi K2.7 Code does not support Responses, and DeepSeek V4 and GLM-5.2 there are likewise just converted to Chat on the server side.\n\n### MiniMax China Site and BaiLing Move to Their Current Official Domains\n\nThe MiniMax China presets move from `api.minimaxi.com` to `api.minimax.cn` across seven apps (Claude Code and Claude Desktop use `\u002Fanthropic`; Codex, Hermes, OpenClaw, OpenCode and Pi use `\u002Fv1`), and the website and API key links move to `platform.minimax.cn`. Coding Plan usage detection recognizes both the new and the old domain, and now matches hostnames label by label, so look-alike hosts such as `api.minimax.cn.example.com` no longer trigger it. In Codex, `minimax.cn` is treated as native Responses and has `web_search` disabled, just like the old domain.\n\nBaiLing moves from `api.tbox.cn` to `api.ant-ling.com` across the same seven apps. The six apps still on `Ling-2.5-1T` (no longer listed in the vendor's docs) now default to `Ling-2.6-1T`, matching Codex; `Ling-2.6-1T` is also registered as a text-only model — see Upgrade Notes.\n\n### Codex `web_search` Disabled on the StepFun, Baidu Qianfan and iFlytek Astron Responses Endpoints\n\nCodex sends the hosted `web_search` tool by default, but StepFun's Responses API only accepts `function` tools, and the Responses docs for Qianfan pay-as-you-go and Astron list no hosted tools either. Native Responses cards on `stepfun.com`, `stepfun.ai`, `qianfan.baidubce.com` and `xf-yun.com` now write `web_search = \"disabled\"` to `~\u002F.codex\u002Fconfig.toml` (for Qianfan and Astron this is preventive; rejection has not been confirmed). These domains also host Chat products (StepFun Step Plan, Qianfan Coding Plan \u002F Token Plan, Astron Chat), so the domains as a whole are not treated as native Responses, and the `web_search` setting of Chat cards is unaffected.\n\n### Other Preset Maintenance\n\n- SudoCode.chat's Claude Code, Claude Desktop, Codex and Grok Build presets gain the backup endpoint `api.sudorelay.com`, which appears in the endpoint speed test; the default address stays `api.sudocode.chat`.\n- APIKEY.FUN's website, sign-up link and Base URL move from `apikey.fun` to `apikey.fan` across nine apps; Claude Code, Claude Desktop, Codex, Gemini and Grok Build keep the old address as a backup endpoint.\n\n---\n\n## Fixed\n\n### Codex 0.154+ Requests With `additional_tools` No Longer Get 400 From Chat Gateways\n\nStarting with 0.154, Codex puts a request's extra tools (the `functions` \u002F `collaboration` execution namespaces, plugins) into a single `additional_tools` input item: `{\"type\":\"additional_tools\",\"role\":\"developer\",\"tools\":[…]}`, which has a `role` but no `content`. Codex's Responses-to-Chat converter treated every item with a `role` as a message and produced `{\"role\":\"system\",\"content\":null}` at `messages[1]`; strict Chat gateways reported `messages[1]: missing field \"content\"` and rejected the whole request, and these tools were also silently dropped on both the Chat and the Anthropic conversion paths. The message walk now skips this carrier; its tools are deduplicated and merged with the top-level `tools` (on a name collision the top-level declaration wins), namespaces are expanded (`exec_command` under `functions` becomes `functions__exec_command`), and on the response side the names are mapped back to the form Codex recognizes. Requests without the carrier convert byte-for-byte as before. ([#7454](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7454), fixes [#7451](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7451), [#6158](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6158))\n\n### A Single `detail: \"original\"` Image No Longer Breaks a Codex Session for Good\n\nWhen a model's Codex catalog entry declares `supports_image_detail_original`, Codex marks images returned by tools (for example `view_image` screenshots) with `detail: \"original\"`, a value that is only valid in the Responses API. On conversion to a Chat upstream it was copied verbatim into `image_url.detail`, and strict OpenAI-compatible gateways (Ark\u002FDoubao, SenseNova, GLM, vLLM and others) returned 400 for the whole request. Codex replays the full history every turn, so a single image made the session fail on every later turn, text-only turns included.\n\nThe fix has two layers: in Chat images the proxy downgrades `original` to `auto` (`auto`, `low` and `high` pass through unchanged), so sessions that are already broken — and Codex versions before 0.155.0, which do not repair their history themselves — recover as soon as you upgrade; and Codex catalogs generated for Chat conversion always write `supports_image_detail_original: false`, so Codex stops sending `original` at the source. Images pasted directly into the conversation were never affected. ([#7476](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7476), fixes [#6495](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6495), [#7458](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7458))\n\n### Editing or Switching Away From a Codex Provider No Longer Wipes the Saved API Key\n\nSome Codex providers carry their own credential source in their `[model_providers.*]` table (`env_key`, an `auth` \u002F `aws` table, or `Authorization` in `http_headers`). Such providers inject no token into `config.toml`, and default mode deletes the shared `~\u002F.codex\u002Fauth.json` every time it switches to a third-party provider, so the auth in the live snapshot is always empty and the `OPENAI_API_KEY` in the database is the only copy of the key. Two paths treated this empty auth as authoritative: the edit dialog for the current provider filled the form from the live snapshot, and the backfill on switching away wrote the live snapshot back into the database. As a result, opening the editor and saving without changes, or simply switching away, silently erased the key; the usage script dialog then treated the keyless card as an official subscription and reset the saved script.\n\nBoth places now treat \"live auth without credentials\" (`auth.json` missing, or holding only the `auth_mode` signed-out marker) as a missing field: the stored auth is kept, while the live `config.toml` is still captured as usual. When the live auth holds actual credentials it still wins, so manually editing `~\u002F.codex\u002Fauth.json` keeps working. ([#7434](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7434), fixes [#7433](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7433))\n\n### After a ChatGPT Account Is Deleted, Codex Cards Bound to It Can Be Rebound or Switched Away From\n\nDeleting a managed ChatGPT account in the Auth Center and signing in again generates a new local account id, even for the same ChatGPT user and workspace. Codex cards still bound to the old id then failed with `账号不存在: \u003Cid>` (account not found) on every route switch, takeover toggle, startup restore and rebind, so users could neither change providers nor pick a new account on that card.\n\nSwitching away now distinguishes \"account deleted\" from \"account still present, but live has no matching token\": for a deleted account, only cc-switch's ownership marker is released and `~\u002F.codex\u002Fauth.json` is left alone, so the same user signing in later with the native Codex CLI is not deleted as a cc-switch-managed login. An account is judged deleted only after the persisted `codex_oauth_auth.json` passes validation; when the file cannot be read, is malformed, or the account is in fact still on disk, the switch aborts and the live files stay unchanged, with no guessing. When the card's own binding is broken, the error suggests clicking \"Choose account\" on the provider card to rebind. There is no automatic rebinding. ([#7395](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7395), fixes [#7392](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7392))\n\n### Tools Without a Description Are No Longer Sent as `null`\n\nThe Claude-to-OpenAI Chat and Claude-to-Responses converters copied each tool's `description` into the request verbatim, so a tool without a description became `\"description\": null`, and strict OpenAI-compatible upstreams rejected the whole turn with 400 `expected string, received null`. Anthropic's hosted tools (such as `web_search`) have no description by definition, and custom tools and MCP tools without a description trigger it too; what breaks is the whole request, not just that one tool. A missing or explicitly `null` description is now omitted, and every other value passes through unchanged; fields are still written in `name` → `description` → `parameters` order, and tools with a description serialize byte-for-byte as before, so the prompt cache is unaffected. Codex's Responses-to-Chat converter had the same problem with function tools and is fixed alongside ([#7378](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7378)). ([#7319](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7319), fixes [#7303](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7303))\n\n### Claude Code's Auto Mode Works Through GitHub Copilot\n\nClaude Code's auto mode classifier sends `stop_sequences` with every safety check. Through GitHub Copilot, the Anthropic-to-OpenAI Chat conversion mapped it to `stop`, and the Chat Completions route Copilot provides for Claude models returns 400 on that parameter, so the classifier failed every time while ordinary conversations worked fine. The converted `stop` is now removed only when the provider is GitHub Copilot; other OpenAI-compatible upstreams (such as OpenRouter) keep it as before. ([#5404](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F5404), fixes [#5175](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5175))\n\n### `\u002Feffort` Tiers Reach OpenAI and Grok Upstreams Intact\n\nConverting Claude Code's reasoning effort to OpenAI format (Chat's `reasoning_effort`, Responses' `reasoning.effort`) had three gaps, all now filled:\n\n- `\u002Feffort xhigh` sends `output_config.effort: \"xhigh\"`, a value the parser did not recognize; and because an explicit `output_config.effort` masks the `thinking` fallback, no tier was sent at all. `xhigh` now maps one-to-one.\n- The list of reasoning-capable models only had the `grok-4.5` series and `grok-build-*`, so Claude models mapped to `grok-4.6` \u002F `grok-4.6-build` lost every tier, `max` included. The list now adds `grok-4.6` and `grok-4.6-*`.\n- An explicit `max` was always downgraded to `xhigh`. `max` is now sent as-is for `gpt-5.6`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna` and `gpt-6-astra`, which support a separate max tier; other models still fall back to `xhigh`.\n\nRequests at `low`, `medium` and `high` are unchanged. ([#7318](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7318), [#7531](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7531), fixes [#7314](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7314), [#6197](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6197), [#3389](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F3389), [#5367](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5367))\n\n### DeepSeek V4 Pro Pricing Restored to the Peak Tier\n\nBased on DeepSeek's announcement that \"V4 Pro is routed to V4.1 Flash from 2026-09-14\", v3.20.3 moved `deepseek-v4-pro` to Flash-tier prices ahead of time ($0.30 \u002F $1.20 per million tokens, $0.006 cache read). DeepSeek withdrew that announcement on 2026-09-12 and V4 Pro continued to be billed at its original price, so V4 Pro requests have been recorded at far below their actual cost. This release restores the pricing to $1.32 input, $3.96 output and $0.044 cache read per million tokens (the peak tier, i.e. CNY 9 \u002F 27 \u002F 0.3). The fix only rewrites rows whose four price columns still hold the values v3.20.3 wrote (0.3 \u002F 1.2 \u002F 0.006 \u002F 0); customized rows are left alone. Flash-family ids such as `deepseek-v4-flash` and `deepseek-flash` are still priced at the V4.1 Flash tier.\n\n### The Prompt List Reads Back External Edits to Live Files\n\nAfter the global `CLAUDE.md`, `AGENTS.md` or another app's live prompt file was edited outside CC Switch, the prompt list kept showing the old content from the database until a restart. Loading the prompt list now reads the live file back and updates the currently enabled prompt when the content differs; when the window regains focus, an open prompt panel refreshes too (waiting while an edit, confirmation or write is in progress). Only the enabled prompt is refreshed, and other templates are untouched; when the file is missing, unreadable, empty or whitespace-only, the stored content is kept; and the refresh is skipped while a sync or restore is in progress. Pi still uses its own `AGENTS.md`-based activation mechanism and is not included. ([#7194](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7194))\n\n### Skills Installation: Ids That Differ From Directory Names, Repositories With Too Many Files\n\n- skills.sh passes a skill's `skillId` as the directory name, but the id is not necessarily the directory name in the repository. For example, `tencent\u002FWeChatReading` publishes `name: weread-skills` at `skills\u002FSKILL.md`, so installation failed; and even once installed, the update check matched by directory name only and could not find it. Lookup now tries the explicit path and a same-named directory first, then accepts a `SKILL.md` whose metadata `name` equals the id (it must be unique; when several directories declare the same name, installation is refused instead of picking one arbitrarily). The update check prefers the saved source path, so a skill keeps updating after it is moved or renamed within the repository. ([#6381](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6381), fixes [#6365](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6365))\n- Installing a skill downloads an archive of the entire GitHub repository, and a repository like `hugohe3\u002Fppt-master`, with 13,248 entries, hit the 10,000-entry limit and failed with `ARCHIVE_TOO_MANY_ENTRIES`. The entry limit for remote archives, local ZIP installs and WebDAV restores is raised to 30,000; the real limit remains the 512 MiB decompression budget. ([#7489](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7489), fixes [#7475](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7475))\n\n### OpenCode Directories on WSL Also Find the OMO Unified Config\n\nWhen the OpenCode config directory points into WSL (`\\\\wsl.localhost\\\u003Cdistro>\\home\\\u003Cuser>\\.config\\opencode` or `\\\\wsl$\\…`), OMO 4.19.3 and later keep the unified config in the home directory on the WSL side (`~\u002F.omo\u002Fomo.jsonc` or `omo.json`). CC Switch only looked in the Windows home directory, and when it found nothing it silently fell back to the old plugin file that OMO no longer reads (`oh-my-opencode.jsonc`), so the switch appeared to succeed but did not actually take effect. The WSL home directory is now derived from the WSL path of the OpenCode directory, and reads, writes and deletes all check there first; when neither side has a unified config, it still falls back to the old file. ([#7550](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7550), fixes [#7363](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7363))\n\n### The Windows Main Window Keeps Its Taskbar Button When Opened From Other Entry Points\n\nAfter a silent start or closing to the tray, the Windows main window is hidden with `skip_taskbar(true)`, and only the tray's \"Open main window\" resets that flag before `show()`. When the window was brought back through any other entry point it had no taskbar button, and a single minimize made it impossible to find. These entry points now all call `set_skip_taskbar(false)` first: launching again from a shortcut or the Start menu while already running, `ccswitch:\u002F\u002F` deep links that focus the main window, URL open events, and the database recovery screen shown on a version mismatch. ([#6348](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6348))\n\n### \"Hide AI Attribution\" Also Hides Claude Code's Session Links\n\nCommits and PRs that Claude Code creates for web and Remote Control sessions carry a claude.ai session link, which is controlled by a separate `attribution.sessionUrl`; clearing only `commit` and `pr` no longer hides all of the attribution. The Claude editor's \"Hide AI Attribution\" toggle now writes `attribution: {commit: \"\", pr: \"\", sessionUrl: false}`, and shows as checked only when all three are satisfied. Unchecking still deletes the whole `attribution` object. ([#7053](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7053))\n\n### Version Detection on the About Page: No More Full npm Metadata Downloads, No More Mistaking Ubuntu Versions for Tool Versions\n\n- To check the latest version of npm-distributed tools, the full npm packument was downloaded (14–25 MB decompressed for frequently released packages such as Codex, OpenCode and OpenClaw) just to read its `dist-tags`; and this was the only probe without the 15-second timeout, falling back to the shared client's 600 seconds. On slow networks the card could stay at \"Loading...\" for several minutes. It now uses the dedicated `\u002F-\u002Fpackage\u002F{package}\u002Fdist-tags` endpoint (responses of only tens of bytes to a few KB) with a 15-second timeout; timeouts, network errors and 404s show \"Unknown\". ([#7346](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7346), fixes [#7339](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7339))\n- On Windows, probing tools inside WSL runs `\u003Ctool> --version` through an interactive login shell and takes the first `x.y.z` in stdout. Ubuntu prints the MOTD on the first login each day (\"Welcome to Ubuntu 24.04.4 LTS …\"), so the Claude Code card showed `24.04.4`. A sentinel string is now printed before running the tool, and only the output after the last sentinel is parsed. ([#7348](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7348), fixes [#7347](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7347))\n\n### Zhipu's Responses Endpoint Can Fetch the Model List\n\nZhipu's OpenAI Responses endpoint (`https:\u002F\u002Fopen.bigmodel.cn\u002Fapi\u002Fv1`, the Base URL of the Zhipu GLM Codex preset) returns `\u002Fmodels` in the Codex remote catalog format (`models[].slug`) rather than OpenAI \u002F Anthropic's `data[].id`, so fetching models in the Codex provider form always came back empty. When there is no `data` field it now falls back to reading `models[].slug`; behavior is unchanged when `data` is present. ([#7330](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7330))\n\n### AICodeWith's Codex-Family Endpoint Changed to `\u002Fv1`\n\nAICodeWith's Responses endpoint is `https:\u002F\u002Fapi.aicodewith.ai\u002Fv1`; the `\u002Fchatgpt\u002Fv1` in the vendor's blog is a documentation error (confirmed with the vendor). The Codex preset and the Hermes, OpenClaw and Pi presets that reuse the same endpoint all move to `\u002Fv1`. Existing cards need to be edited manually — see Upgrade Notes.\n\n### Claude Desktop Offers 1M Context on DeepSeek V4 Routes\n\nThe DeepSeek V4 family has a 1M context, but the Claude Desktop presets pinned to these models did not enable `supports1m`, so Claude Desktop's model list never offered a 1M option. The DeepSeek (`deepseek-v4-pro` for Sonnet \u002F Opus, `deepseek-v4-flash` for Haiku), OpenCode Go (`deepseek-v4-flash`) and Baidu Qianfan Token Plan (`deepseek-v4-pro`) presets now all declare 1M. The `[1m]` suffix only takes effect locally in Claude Desktop; what is sent to the provider is unchanged.\n\n### The Provider List Returns to the Top When Switching Apps\n\nThe provider view reused its scroll container when switching apps and only replaced the animated list inside it, so the previous app's scroll position carried over: after switching away from a long list scrolled to the bottom, the next app could look like a blank page. Now, when switching apps, both the page's main container and the provider list container return to the top-left before painting. ([#5211](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F5211))\n\n### UI Details\n\n- **No more stale usage tiers**: after turning off the usage script or switching to the official subscription template, the provider card no longer shows the multi-tier expand button from the old script result; the same goes for official provider cards.\n- **Monochrome preset icons**: monochrome icons in the preset picker now use the foreground color, matching the form preview and the provider cards (icons such as 9527CODE used to look grayish).\n- **Pi provider icons**: Pi providers without an icon are no longer saved with Pi's app logo; the card shows the name's initial instead, matching custom providers in other apps. ([#6826](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6826))\n- **Traditional Chinese wording**: the duplicate-key hint in the Pi form now uses 「供應商識別碼」, matching the field label. ([#7187](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7187))\n\n---\n\n## Upgrade Notes\n\n### This Release Includes a Database Migration\n\n`SCHEMA_VERSION` 18 → 19: the `mcp_servers` and `skills` tables each gain an `enabled_mcode` column, off by default. The migration runs automatically on first launch. CC Switch tries to back up the database first, placing the backup in `~\u002F.cc-switch\u002Fbackups\u002F` (file names start with `db_backup_`); but a failed backup is only logged and does not abort the upgrade. Once you have run this release, v3.20.3 and earlier refuse to open the database with \"Database version is too new\", and downgrading is only possible by restoring the pre-upgrade backup. To be safe, quit CC Switch before upgrading and make a manual copy:\n\n```bash\ncp ~\u002F.cc-switch\u002Fcc-switch.db ~\u002Fcc-switch-before-v3.20.4.db\n```\n\nOn Windows the default location is `%USERPROFILE%\\.cc-switch\\cc-switch.db`. If you changed the config directory in Settings, both the database and `backups\u002F` are in that directory.\n\n### MiniMax Code Appears in the App Switcher by Default\n\nThis includes installations whose settings predate this release. If you do not need it, turn it off in \"Settings → Homepage Display\".\n\n### Existing MiniMax Code Data Is Picked Up Automatically\n\n- Custom providers already in `~\u002F.minimax\u002Fconfig.yaml` are imported the first time you open the MiniMax Code page.\n- `~\u002F.minimax\u002FAGENTS.md` is imported at startup only when the prompt libraries of all apps are still empty (in practice, a fresh install) and the file is no larger than 32 KiB. Upgrading users who already have Claude, Codex or other prompts do not get an automatic import; the first time a MiniMax Code prompt is enabled, the file's content is first saved as a backup prompt, so nothing is lost.\n- The first usage sync imports the entire history in `local_runtime_token_usage`, so the dashboard's MiniMax Code totals include past usage right away.\n- Existing MCP servers and Skills are off for MiniMax Code by default; until you turn them on manually, CC Switch writes nothing into `~\u002F.minimax`.\n\n### MiniMax Code's Data Directory Comes Only From Environment Variables\n\nCC Switch reads `MINIMAX_DATA_DIR`, then `MAVIS_DATA_DIR`, from its own environment, and uses `~\u002F.minimax` when neither is set. There is no directory override option in Settings; if MiniMax Code uses a custom directory, CC Switch must be started with the same environment variable.\n\n### Change the Default Model in MiniMax Code\n\nTo delete or disable a provider or model referenced by `defaultModel` \u002F `defaultLightModel`, switch to a different default model in MiniMax Code first. While MiniMax Code holds the config lock, saving fails with a prompt to retry instead of waiting indefinitely.\n\n### Codex Cards Bound to a Deleted ChatGPT Account Need One Manual Rebind\n\nThere is no automatic rebinding: click \"Choose account\" on the card and pick the new login. Until the card is rebound, Codex takeover cannot be turned on for it; if takeover was on when you last quit, startup restore turns Codex takeover off because the binding check fails, leaving `~\u002F.codex\u002Fauth.json` untouched. Turn takeover back on after rebinding. ([#7395](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7395))\n\n### Codex API Keys That Were Already Wiped Are Not Restored Automatically\n\nThe fix only prevents future wipes. If a Codex provider's key was already lost in an earlier edit or switch, enter it again; if its usage script was reset as a result, that needs to be configured again as well. ([#7434](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7434))\n\n### \"Hide AI Attribution\" Needs to Be Checked Once More\n\nThe toggle now requires `attribution.sessionUrl` to be `false` as well to count as on, so a config saved in the old `{commit: \"\", pr: \"\"}` format shows as unchecked after upgrading. Checking it once more adds `sessionUrl: false`; existing configs are not rewritten automatically. ([#7053](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7053))\n\n### Opening the Prompt List Adopts External Edits to Live Files\n\nIf an app's live prompt file (`CLAUDE.md`, `AGENTS.md`, etc.) differs from the enabled prompt and is not empty, opening the prompt list overwrites the content stored in the database with the file content. Inactive templates are unaffected, and Pi is not included. ([#7194](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7194))\n\n### Reasoning Effort Is Sent at the Tier You Choose\n\n`\u002Feffort max` on `gpt-5.6`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna` and `gpt-6-astra` now actually requests the `max` tier ([#7531](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7531)); `\u002Feffort xhigh`, and any tier on models mapped to `grok-4.6` \u002F `grok-4.6-*`, now send a reasoning effort, where previously nothing was sent ([#7318](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7318)). Reasoning token usage and latency may rise accordingly.\n\n### Some Converted Requests See One Prefix-Cache Miss After Upgrading\n\nTwo kinds of requests change at the byte level once after upgrading and stay stable afterwards: first, Codex requests carrying the `additional_tools` carrier on lenient Chat or Anthropic upstreams ([#7454](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7454)), where the `content: null` system message disappears and the carrier's tools are merged into `tools`; second, requests containing tools without a description on lenient upstreams that previously accepted `\"description\": null` ([#7319](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7319), [#7378](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7378)). Tools with a description serialize unchanged.\n\n### `Ling-2.6-1T` Is Now Treated as a Text-Only Model\n\nThis applies to every provider using this id, not just the presets: with the proxy's media fallback on, images sent to it are replaced with the `[Unsupported Image]` marker before the request is sent upstream.\n\n### Claude Desktop on Linux Needs No Migration\n\nSwitch to a Claude Desktop provider and restart Claude Desktop, as on other platforms. If your own Flatpak build has narrower permissions than the bundled manifest, grant read-write access to `xdg-config\u002FClaude` and `xdg-config\u002FClaude-3p`, for example (replace the app id at the end with your own build's):\n\n```bash\nflatpak override --user --filesystem=xdg-config\u002FClaude --filesystem=xdg-config\u002FClaude-3p com.ccswitch.desktop\n```\n\n### Old Pi Providers Without an Icon Still Show the Pi Icon\n\nOnly providers saved from now on switch to showing the name's initial. To update an old card, just change its icon in the form. ([#6826](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6826))\n\n### Preset Changes Only Affect Newly Created Providers\n\nExisting cards keep the snapshot taken when they were created. Affected in this release:\n\n- **MiniMax China site**: existing cards stay on `api.minimaxi.com`; usage detection, the Codex native Responses catalog and the `web_search` switch all still recognize this domain, so they keep working.\n- **BaiLing**: existing cards keep `api.tbox.cn`, and apps other than Codex are still on `Ling-2.5-1T`. Edit the Base URL and model, or re-add the preset.\n- **AICodeWith**: manually change existing Codex, Hermes, OpenClaw and Pi cards to `https:\u002F\u002Fapi.aicodewith.ai\u002Fv1`.\n- **APIKEY.FUN**: existing cards keep `api.apikey.fun`.\n- **SudoCode.chat's backup endpoint `api.sudorelay.com`**: only written into newly created Claude Code, Claude Desktop, Codex and Grok Build cards; existing cards can add it as a custom endpoint in the endpoint speed test.\n- **Codex model catalogs**: Kimi For Coding's K2.8 Preview row (1M window, `low` \u002F `high` \u002F `max`), DeepSeek's `deepseek-flash` default and text-only `deepseek-v4-pro` row, Hunyuan's `hy4-preview`, and the Qwen open-weight model rows. Add them manually in the card's model catalog, or re-add the preset.\n- **Claude Desktop's 1M option** (DeepSeek, OpenCode Go and Baidu Qianfan Token Plan presets): check \"Declare 1M\" for the corresponding route in the provider editor, or re-add the preset.\n- **Kimi international site**: existing Kimi cards still use the China domains (`api.moonshot.cn` \u002F `api.kimi.com`); for keys from the international site kimi.ai, use the new Kimi Global \u002F Kimi For Coding Global presets.\n\n### Codex Catalog Fixes Take Effect on the Next Provider Switch\n\n`config.toml` and the catalog files are regenerated on provider switch. Affected in this release: cards on Chat upstreams no longer declare `supports_image_detail_original` ([#7476](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7476)); native Responses cards on `stepfun.com`, `stepfun.ai`, `qianfan.baidubce.com`, `xf-yun.com` and `minimax.cn` write `web_search = \"disabled\"`; cards on `minimax.cn` use the native Responses catalog; and `Ling-2.6-1T` is declared text-only. Switch away and back once on the affected cards. The proxy-side downgrade of `original` to `auto` takes effect immediately, and sessions already broken by a screenshot need no manual history editing either.\n\n### Pricing\n\n- The five new pricing rows are written with `INSERT OR IGNORE` (same-named rows you already added yourself are kept), and the startup backfill fills in costs for historical requests under these ids that were previously recorded at $0; rows that already have a non-zero cost are unchanged.\n- The `deepseek-v4-pro` fix changes the row back to 1.32 \u002F 3.96 \u002F 0.044 only when it still holds exactly the 0.3 \u002F 1.2 \u002F 0.006 \u002F 0 that v3.20.3 wrote; customized rows are left alone, but a row manually set to exactly these values cannot be told apart and is reset too. V4 Pro costs recorded during v3.20.3 are _not_ recomputed, because the backfill only processes rows with a cost of $0 or less and with token usage, so only requests after the upgrade are billed at the restored price.\n- Grok 4.7 is priced at the base tier for prompts under 200K tokens; xAI bills prompts of 200K tokens and above at double ($4 \u002F $12), a tier the pricing table does not distinguish.\n\n---\n\n## Risk Notice\n\n### Carried-Over Notices\n\n**xAI Grok OAuth sign-in**: reuses the public OAuth client identity of the official Grok CLI; using it could lead to account restriction or suspension — see the [v3.18.0 release notes](v3.18.0-en.md#risk-notice) for details.\n\n**Codex OAuth reverse proxy**: using a ChatGPT subscription's Codex OAuth through a reverse proxy may violate OpenAI's terms of service. See the [v3.13.0 release notes](v3.13.0-en.md#️-risk-notice) for details.\n\n**SuperGrok quota queries**: the quota display on provider cards depends on a non-public billing endpoint at grok.com and may stop working once xAI changes the interface — see the [v3.19.0 release notes](v3.19.0-en.md#risk-notice) for details.\n\n**Third-party provider routing**: when the CC Switch local proxy converts and forwards Codex, Claude Desktop, or Grok Build requests to a third-party provider, each provider has different constraints on billing, compliance, and data retention. Please read the target provider's terms of service before use.\n\nBy enabling these features, users accept the associated risks. CC Switch is not responsible for any account restriction, warning, or service suspension resulting from their use.\n\n---\n\n## Thanks\n\n28 of this release's 46 commits come from 22 outside contributors, 11 of them first-time contributors.\n\n### Code Contributions\n\n- Thanks to @SaladDay: the MiniMax Code integration ([#7383](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7383)), and the recovery of Codex cards bound to a deleted ChatGPT account ([#7395](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7395), fixes [#7392](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7392)).\n- Thanks to @thisTom: the card refresh after a MiniMax Code provider is deleted ([#7578](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7578)).\n- Thanks to @Railgun-wiki: Linux support for Claude Desktop's third-party configuration ([#7331](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7331), fixes [#4855](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F4855)), a first contribution; @vianrina submitted the same feature in [#7389](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7389), and two of its improvements — the test gating and the manual's support scope table — are included in this release.\n- Thanks to @SailingLoong: handling the `additional_tools` carrier ([#7454](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7454), fixes [#7451](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7451), [#6158](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6158)), no longer sending `null` for tools without a description ([#7319](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7319), fixes [#7303](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7303); the equivalent fix on the Codex path is [#7378](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7378)), and Grok 4.6 reasoning effort and `xhigh` passthrough ([#7318](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7318), fixes [#7314](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7314), [#6197](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6197), [#3389](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F3389)); @BigStrongSun reported [#6158](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6158) and had submitted a fix in [#6159](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6159).\n- Thanks to @nameserendipity: the two-layer fix for Codex `detail: \"original\"` images ([#7476](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7476), fixes [#6495](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6495), [#7458](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7458)), a first contribution; @szupzj18 had proposed a fix targeting Ark earlier in [#6515](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6515), and @somnifex had also proposed a different fix in [#7104](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7104).\n- Thanks to @YUZHEthefool: the fix for Codex's saved API key being wiped ([#7434](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7434), fixes [#7433](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7433)); @SailingLoong had submitted the same fix in [#7492](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7492).\n- Thanks to @liuziyuan: the fix for the auto mode classifier under GitHub Copilot ([#5404](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F5404), fixes [#5175](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5175)), a first contribution.\n- Thanks to @2doright: keeping the `max` tier for GPT-5.6 and GPT-6 Astra ([#7531](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7531), fixes [#5367](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5367)), a first contribution.\n- Thanks to @juexe: output tokens per second in the request log ([#3369](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F3369), fixes [#5936](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5936)), a first contribution.\n- Thanks to @funkpopo: model search and bulk add in the OpenCode form ([#7515](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7515), fixes [#7423](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7423)), a first contribution.\n- Thanks to @allenxu09: prompts reading back external edits to live files ([#7194](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7194)).\n- Thanks to @xwil1: installing and updating skills.sh skills whose id differs from the directory name ([#6381](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6381), fixes [#6365](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6365)).\n- Thanks to @yovinchen: installing large skill repositories ([#7489](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7489), fixes [#7475](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7475)).\n- Thanks to @fszcd: detecting the OMO unified config on WSL ([#7550](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7550), fixes [#7363](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7363)), continuing their own earlier [#7367](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7367).\n- Thanks to @misaka-myu: the taskbar button of the Windows main window ([#6348](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6348)).\n- Thanks to @sj817: \"Hide AI Attribution\" covering session links ([#7053](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7053)), a first contribution.\n- Thanks to @lyfuci: the npm dist-tags probe ([#7346](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7346), fixes [#7339](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7339)), and the MOTD interference in WSL version detection ([#7348](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7348), fixing [#7347](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7347), which they reported themselves), a first contribution; @NineSu had added a timeout to the same probe earlier in [#7307](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7307).\n- Thanks to @xwwwb: the model list for Zhipu's Responses endpoint ([#7330](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7330)), a first contribution.\n- Thanks to @Muleizhang: resetting the scroll position when switching apps ([#5211](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F5211)), continuing their own earlier [#4397](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F4397).\n- Thanks to @JackieJK: Pi provider icons falling back to the name's initial ([#6826](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6826)), a first contribution.\n- Thanks to @ntdatt812: consistent wording in the Traditional Chinese Pi form ([#7187](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7187)).\n- Thanks to @ysntony: the Kimi international site presets ([#7526](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7526)) and the Kimi link adjustments in the README ([#7522](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7522)), a first contribution.\n\n### Issue Reports\n\n- Thanks to @zhanghuihubei and @BigStrongSun for reporting Codex 0.154's `additional_tools` turning into an empty system message in Chat conversion ([#7451](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7451), [#6158](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6158)).\n- Thanks to @ywy0 and @BAOfanTing for reporting Codex screenshots returning 400 through Ark\u002FDoubao and SenseNova ([#6495](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6495), [#7458](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7458)).\n- Thanks to @paiguFK for reporting the API key being wiped after editing a Codex provider ([#7433](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7433)).\n- Thanks to @phjzs for reporting the dangling binding after deleting a ChatGPT account and signing in again ([#7392](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7392)).\n- Thanks to @Syuryuuki for reporting tools without a description producing `null` and causing 400 ([#7303](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7303)).\n- Thanks to @JoaquinHJ for reporting that the auto mode classifier was unusable under GitHub Copilot ([#5175](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5175)).\n- Thanks to @NorthDream-Y and @xiaodream551-a11y for reporting Grok 4.6 reasoning effort being lost and GPT-5.6's `max` being downgraded ([#7314](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7314), [#5367](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5367)), and to @bowendeng286-cmd and @icannotwait for reporting `xhigh` and other reasoning efforts not taking effect when routed to the OpenAI protocol ([#6197](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6197), [#3389](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F3389)).\n- Thanks to @xngch for requesting Linux support for Claude Desktop ([#4855](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F4855)).\n- Thanks to @Morganwan90 and @CrazyFigure for reporting Skills installation failures ([#6365](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6365), [#7013](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7013), [#7475](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7475)), and to @jambo200 for requesting a higher ZIP entry limit ([#7513](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7513)).\n- Thanks to @liushilongpku for reporting that the OMO unified config was not detected under WSL ([#7363](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7363)).\n- Thanks to @netszzy for reporting that version detection downloaded the full npm metadata with no timeout ([#7339](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7339)).\n- Thanks to @sberry007 for suggesting that the request log show the output rate ([#5936](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5936)).\n- Thanks to @Zingsun for requesting a way to add fetched models directly to the OpenCode config ([#7423](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7423)).\n\n---\n\n## Download & Install\n\nVisit [Releases](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Freleases\u002Flatest) and download the build for your system, or get it from the official site [ccswitch.io](https:\u002F\u002Fccswitch.io) (downloads are distributed through Cloudflare edge nodes and do not depend on GitHub being reachable).\n\n### System Requirements\n\n| System  | Minimum Version      | Architecture                        |\n| ------- | -------------------- | ----------------------------------- |\n| Windows | Windows 10 and later | x64 \u002F ARM64                         |\n| macOS   | macOS 12 (Monterey)+ | Intel (x64) \u002F Apple Silicon (arm64) |\n| Linux   | See table below      | x64 \u002F ARM64                         |\n\n### Windows\n\n| File                                     | Description                                      |\n| ---------------------------------------- | ------------------------------------------------ |\n| `CC-Switch-v3.20.4-Windows.msi`          | **Recommended** - MSI installer with auto-update |\n| `CC-Switch-v3.20.4-Windows-Portable.zip` | Portable build, unzip and run                    |\n\nWindows ARM64 devices should pick the artifact whose file name carries the `arm64` tag.\n\n### macOS\n\n| File                             | Description                                           |\n| -------------------------------- | ----------------------------------------------------- |\n| `CC-Switch-v3.20.4-macOS.dmg`    | **Recommended** - DMG installer, drag to Applications |\n| `CC-Switch-v3.20.4-macOS.zip`    | Unzip and drag to Applications, Universal Binary      |\n| `CC-Switch-v3.20.4-macOS.tar.gz` | For Homebrew install and auto-update                  |\n\nHomebrew install:\n\n```bash\nbrew install --cask cc-switch\n```\n\nUpgrade:\n\n```bash\nbrew upgrade --cask cc-switch\n```\n\n### Linux\n\nLinux assets are available for both **x86_64** and **ARM64** (`aarch64`). Choose the file whose architecture tag matches your machine's `uname -m` output:\n\n- `CC-Switch-v3.20.4-Linux-x86_64.AppImage` \u002F `.deb` \u002F `.rpm`\n- `CC-Switch-v3.20.4-Linux-arm64.AppImage` \u002F `.deb` \u002F `.rpm`\n\n| Distribution                            | Recommended Format | Install Command                                                        |\n| --------------------------------------- | ------------------ | ---------------------------------------------------------------------- |\n| Ubuntu \u002F Debian \u002F Linux Mint \u002F Pop!\\_OS | `.deb`             | `sudo dpkg -i CC-Switch-*.deb` or `sudo apt install .\u002FCC-Switch-*.deb` |\n| Fedora \u002F RHEL \u002F CentOS \u002F Rocky Linux    | `.rpm`             | `sudo rpm -i CC-Switch-*.rpm` or `sudo dnf install .\u002FCC-Switch-*.rpm`  |\n| openSUSE                                | `.rpm`             | `sudo zypper install .\u002FCC-Switch-*.rpm`                                |\n| Arch Linux \u002F Manjaro                    | `.AppImage`        | Make executable and run directly, or use AUR                           |\n| Other distributions \u002F unsure            | `.AppImage`        | `chmod +x CC-Switch-*.AppImage && .\u002FCC-Switch-*.AppImage`              |\n\n\n[Official version release](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Freleases\u002Ftag\u002Fv3.20.4).","2026-09-22T15:45:41Z",626,"2026-10-07T09:38:27.243348Z",[470],{"area":453,"items":471},[472,473,474,475,476],"Manage MiniMax Code sessions, providers and usage.","Show output-token speed; search and bulk-add OpenCode models.","Fix Codex additional_tools and original-detail image handling.","Preserve saved API keys and restore account rebind actions.","Includes a database migration and explicit upgrade cautions.","Adds MiniMax Code management, improves provider presets and usage views, and fixes routing, credential and skills issues.","CC Switch 3.20.4",{"locale":423,"machineTranslated":36,"sourceLocale":423,"status":431},"3.20.4",{"bodyMarkdown":482,"brewCommittedAt":483,"hasNotes":32,"id":484,"isLatest":36,"isPrerelease":36,"machineTranslated":36,"publishedAt":485,"sections":486,"source":460,"sourceLocale":423,"summary":494,"title":495,"translation":496,"version":497},"# CC Switch v3.20.3\n\n> The official APIs of today's mainstream open-source models mostly support the OpenAI Responses format natively. This release moves Kimi's two Codex presets from Chat Completions conversion to **native Responses direct-connect** — with that, the official Codex presets for DeepSeek, Zhipu GLM, Qwen, MiniMax, Xiaomi MiMo, LongCat and Kimi all connect directly to the vendor endpoint, and together with Volcengine Doubao and Tencent Hunyuan they no longer need local routing to convert formats. If your Codex card is still in the Chat format it was added with, re-add the preset once, or set \"Upstream format\" to Responses on the edit page, and it connects directly. The rest is a wave of contributor-led correctness fixes: empty `reasoning_content` placeholders no longer flood Claude Code with empty Thought blocks, Codex agent tasks no longer stop dead after a single progress update, Claude Desktop's model probe no longer misreports \"not available\" on Responses upstreams, every shutdown no longer copies Claude's proxy retry and timeout settings onto Codex\u002FGemini\u002FGrok Build, and universal provider sync no longer wipes child card settings; on the Codex side, proxy routing when `model_provider` is omitted, growing session usage on Windows, and the managed account's quota in the tray are all filled in. Presets and pricing get a maintenance round: the aggregator catalogs are refreshed, 千问AI平台 is rebranded and moved to Qwen 3.8, MiniMax defaults to M3, and the DeepSeek V4 family is repriced to the V4.1 Flash tier. **This release contains no database migration.**\n\n**[中文版 →](v3.20.3-zh.md) | [日本語版 →](v3.20.3-ja.md)**\n\n---\n\n## Highlights: What You Can Do Now\n\n- **Connect to Kimi directly in Codex over native Responses**: the Kimi open platform and Kimi For Coding presets move from `openai_chat` to `openai_responses`, so Codex connects straight to the vendor's `\u002Fv1\u002Fresponses` and no longer needs local routing to convert Responses to Chat. With that, the official Codex presets for DeepSeek, Zhipu GLM, Qwen, MiniMax, Xiaomi MiMo, LongCat and Kimi all connect directly; endpoints that still offer only Chat Completions (Baidu Qianfan, Tencent Token Plan, QwenCloud For Coding, StepFun, BaiLing, ModelScope and the aggregator platforms) keep converting through local routing. If your existing card is still in the Chat format it was added with (Kimi, and the DeepSeek, GLM and others switched in earlier releases), re-add the preset once, or set \"Upstream format\" to Responses on the edit page, and it connects directly; see Upgrade Notes.\n- **Claude Code is no longer flooded with empty Thought blocks** ([#7227](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7227), fixes [#5028](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5028), [#4404](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F4404)): upstreams like GLM, Qwen and DeepSeek that keep an empty `reasoning_content` placeholder in every chunk no longer turn every token into its own line plus an empty thinking block.\n- **Codex agent tasks no longer stop dead after a single progress update** ([#7280](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7280), fixes [#6529](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6529)): on a Chat upstream, commentary and the tool call that directly follows it are merged into the same assistant message, so the upstream no longer `stop`s early.\n- **Claude Desktop no longer reports \"model not available\" on Responses upstreams** ([#7287](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7287), fixes [#7103](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7103)): the probe's `max_tokens=1` is clamped during conversion to 16, the minimum the Responses API allows.\n- **Codex, Gemini and Grok Build proxy retry and timeout settings are no longer overwritten by Claude's after an exit** ([#7210](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7210), fixes [#7204](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7204)).\n- **Syncing a universal provider no longer wipes its children's usage script, common-config opt-out and ordering** ([#7212](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7212), fixes [#7134](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7134)).\n- **A Codex card without `model_provider` also goes through the local proxy on takeover** ([#7263](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7263), fixes [#6256](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6256)), instead of silently connecting straight to `api.openai.com`.\n- **Growing Codex session usage on Windows is no longer missed** ([#7219](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7219), fixes [#6060](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6060)): file size decides too when mtime does not move.\n- **See the quota of the ChatGPT account bound to a managed Codex card in the tray** (fixes [#7267](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7267)): binding several accounts no longer leaves nothing but the name.\n- **See Claude Fable's weekly limit**: the provider card and the tray both parse the usage API's new `limits[]` array.\n- **Disable Claude Code's Artifact tool in one click**: gateways that validate tool schemas strictly, DeepSeek among them, no longer return 400 on every request.\n- **The official DeepSeek Codex preset can read images** ([#7286](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7286), fixes [#7283](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7283)); `deepseek-flash` and the V4 family are billed at the V4.1 Flash tier instead of $0 or the old peak price.\n- **Add 千问AI平台 Token Plan in one click** ([#7183](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7183)); 千问AI平台 moves to Qwen 3.8, MiniMax defaults to M3 ([#7255](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7255)), and the aggregator Codex catalogs are refreshed.\n\n---\n\n## Usage Guides\n\n- **[Adding Providers](..\u002Fuser-manual\u002Fen\u002F2-providers\u002F2.1-add.md)**: the difference between Codex's native Responses direct connection and Chat routing conversion, the Claude quick toggle table (including the new \"Disable Artifact Tool\"), and what \"preset changes only affect newly created providers\" means.\n- **[Request Routing](..\u002Fuser-manual\u002Fen\u002F4-proxy\u002F4.2-routing.md)**: config rewriting and restoration under takeover — this release's routing fix for a Codex card missing `model_provider` lands on this path.\n- **[Usage Statistics](..\u002Fuser-manual\u002Fen\u002F4-proxy\u002F4.4-usage.md)**: Codex session parsing and pricing configuration, plus this release's byte cursor and pricing backfill rules.\n\n---\n\n> [!WARNING]\n>\n> ## Only Official Channels (Please Read)\n>\n> CC Switch is a **fully free and open-source** desktop app, and we **do not charge users any fees**. Please only obtain the software through the official channels listed below:\n>\n> | Channel            | Only Official                                                                  |\n> | ------------------ | ------------------------------------------------------------------------------ |\n> | Website            | **[ccswitch.io](https:\u002F\u002Fccswitch.io)**                                         |\n> | Source             | **[github.com\u002Ffarion1231\u002Fcc-switch](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch)** |\n> | Downloads          | **[GitHub Releases](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Freleases)**        |\n> | Author             | **[@farion1231](https:\u002F\u002Fgithub.com\u002Ffarion1231)**                               |\n> | Report an Imposter | **[GitHub Issues](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues)**            |\n>\n> **Any \"CC Switch\" website or client that asks you for payment, top-ups, or login credentials is fake.** If you have been tricked into paying, stop the transaction immediately and file a report through GitHub Issues.\n\n---\n\n## Overview\n\nThe official APIs of mainstream open-source models now mostly serve an OpenAI Responses endpoint natively, and Responses has long been Codex's only native protocol. Until now CC Switch's Codex presets for these models came in two shapes: a direct connection where the vendor endpoint supports Responses natively, and, where only Chat Completions is offered, a local proxy that converts Codex's Responses request into Chat and converts the streamed response back. The conversion path works, but every extra layer of translation is another place to go wrong — [#7280](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7280), fixed in this release, is exactly that kind of conversion defect. The Kimi open platform and Kimi For Coding endpoints now both serve `\u002Fv1\u002Fresponses` natively, and the official Codex integration guides require `wire_api = \"responses\"`, so the two presets move to native Responses direct-connect. With that, the official Codex presets for these mainstream open-source models — DeepSeek, Zhipu GLM, Qwen (千问AI平台 \u002F QwenCloud), MiniMax, Xiaomi MiMo, LongCat and Kimi — all connect directly to the vendor endpoint, together with Volcengine Doubao and Tencent Hunyuan; endpoints that still offer only Chat Completions (Baidu Qianfan, Tencent Token Plan, QwenCloud For Coding, StepFun, BaiLing, ModelScope and the aggregator platforms) keep converting through local routing, and the user manual's \"Chat-only\" examples now name those providers.\n\nThe rest is a wave of contributor-led correctness fixes that close several issues open for months. On the proxy: OpenAI-compatible upstreams that keep an empty `reasoning_content` placeholder in every chunk no longer flood Claude Code with empty Thought blocks and a line break per token; the Codex Responses-to-Chat converter no longer splits a commentary message from the tool calls directly following it into two assistant messages — which used to end a long task right after a single progress update; Claude Desktop's one-token model probe is clamped to the Responses API minimum, so mapped models are no longer reported as \"not available\"; and Codex image generation under routing picks up three fixes, for pasted full endpoints, mixed-case suffixes and streamed usage. Two data-integrity problems close: every normal exit copied Claude's retry and timeout settings onto the Codex, Gemini and Grok Build proxy rows; and syncing a universal provider wiped its children's usage script, common-config opt-out and endpoint auto-select, and pushed the card to the bottom of the list. On the Codex side: takeover now honors the proxy address when a card omits `model_provider`; usage import recognizes growing rollouts on Windows NTFS through a persisted byte cursor; the tray shows the bound ChatGPT account's quota for managed Codex cards; and Claude Fable's weekly limit appears in the provider card and the tray. The Claude provider editor gains a \"Disable Artifact Tool\" quick toggle, for gateways that reject Claude Code's Artifact tool schema.\n\nOn the preset side: the aggregator Codex presets are refreshed to current catalogs, DashScope\u002FBailian is rebranded as 千问AI平台 and moves to Qwen 3.8 ([#7183](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7183)), MiniMax defaults to M3 ([#7255](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7255)), the bundled DeepSeek Codex catalog mirrors the vision-capable `deepseek-flash` ([#7286](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7286)), and the DeepSeek V4 family is repriced to the V4.1 Flash tier. This release does not change the database schema.\n\n**Release date**: 2026-09-11\n\n**Change size**: 22 commits | 62 files changed | +3,458 \u002F -802 lines\n\n---\n\n## Added\n\n### \"Disable Artifact Tool\" Quick Toggle in the Claude Provider Editor\n\nSome third-party Anthropic-compatible gateways (DeepSeek among them) validate tool JSON Schemas with a strict regex checker and reject the Unicode property escapes (`\\p{Cc}`, `\\p{Cf}`, …) that Claude Code's Artifact tool emits once its `str_replace` database capability is rolled out — every request then fails with 400 `Invalid schema for function 'Artifact'`, independent of the model selected. A sixth checkbox next to the existing Claude quick toggles sets `env.CLAUDE_CODE_DISABLE_ARTIFACT=\"1\"` on the provider, which keeps the Artifact tool out of the tools array entirely; unchecking removes the key like the other toggles do. Labels in all four locales and the user manual's toggle table (zh\u002Fen\u002Fja) are updated.\n\n### Claude Fable's Weekly Limit Appears in the Provider Card and Tray\n\nThe Claude OAuth usage API now reports model-scoped weekly limits in a top-level `limits[]` array (`kind: \"weekly_scoped\"`, with `scope.model.display_name` and `percent`) instead of dedicated top-level windows; the parser only read the legacy windows, so the Fable limit never showed up. `limits[]` is now parsed into `seven_day_fable`, `seven_day_opus` and `seven_day_sonnet` — scoped rows override the legacy window of the same name, duplicates and malformed rows are skipped, and legacy windows, extra usage and unknown windows are all preserved. The tray gives Fable its own label group so it is not merged into the weekly max value, and the \"Fable\" label is added in all four locales.\n\n### New Provider Preset\n\n千问AI平台 Token Plan ([#7183](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7183)) joins the preset library across seven apps — Claude Code, Claude Desktop, Codex, Hermes, OpenClaw, OpenCode and Pi — in the same batch as the rebrand described below. Existing providers are unaffected.\n\n### Pricing Rows for `deepseek-flash` and `deepseek-v4-flash-vision-exp`\n\n`deepseek-flash` is DeepSeek's only currently recommended id and `deepseek-v4-flash-vision-exp` is the legacy vision name the official install script wrote through 1.2.0; both are served by V4.1 Flash and billed at its $0.30\u002F$1.20 per million with $0.006 cache read. Neither had a row before, and the `LIKE '{id}-%'` prefix fallback only matches longer ids, so requests under either id were all billed at $0.\n\n---\n\n## Changed\n\n### Kimi's Codex Presets Move to Native Responses Direct-Connect\n\nBoth the Kimi open platform (`api.moonshot.cn\u002Fv1`) and Kimi For Coding (`api.kimi.com\u002Fcoding\u002Fv1`) now serve `\u002Fv1\u002Fresponses` natively, and their official Codex integration guides require `wire_api = \"responses\"`, so the two presets move from `openai_chat` (local proxy Responses-to-Chat conversion, routing takeover required) to `openai_responses` (Codex connects directly). Both endpoints were verified with real keys against the exact Codex 0.153.4 request shape (`reasoning.encrypted_content`, `reasoning.summary`, hosted web_search, replayed reasoning items), and with `codex exec` end-to-end tool loops. `kimi-k3` becomes the open platform's default model and first catalog row, with `kimi-k2.7-code` kept as the second row; `codexChatReasoning`, which only means something for Chat conversion, is dropped from both presets, and `promptCacheRouting` from Kimi For Coding — on the native path Codex sends `prompt_cache_key` itself; every Kimi row declares `supportsParallelToolCalls`, matching the official Kimi Code `models.json`; and no reasoning default is declared, because `config.toml`'s `model_reasoning_effort` wins over the catalog default, which only marks the `\u002Fmodel` picker. The user manual (zh\u002Fen\u002Fja) now names the providers that still use Chat routing in its \"Chat-only\" examples, and the stale note that Kimi Code rejects the `codex-cli` user agent is corrected. No backend change.\n\n### Aggregator Codex Presets Refreshed to Current Catalogs\n\nSiliconFlow (.cn) defaults to `deepseek-ai\u002FDeepSeek-V4-Flash` (1M window, high\u002Fmax effort, with an explicit `enable_thinking`\u002F`reasoning_effort` contract) now that MiniMax M2.5 is retired on the domestic site; Atlas Cloud moves to `zai-org\u002Fglm-5.2`, the latest GLM its Coding Plan includes (1M window); Novita moves to `zai-org\u002Fglm-5.3` (1M, text-only); NVIDIA NIM moves to `moonshotai\u002Fkimi-k3` (1M, text+image; NIM accepts `reasoning_effort` low\u002Fhigh\u002Fmax and defaults to max when the field is omitted, so the preset pins high explicitly to match its `config.toml`); and OpenCode Go's GLM\u002FKimi entries are updated — `glm-5.3` (the new default), `glm-5.3-flash` and `kimi-k3` replace `glm-5.2`, `glm-5.1` and `kimi-k2.7-code`, with windows, modalities and effort tiers mirrored from models.dev, while the DeepSeek V4 Pro\u002FFlash and MiMo V2.5 Pro rows stay. Where a platform has not documented a thinking\u002Feffort contract for the new model (Atlas Cloud, Novita), the preset carries an explicit no-op override so the backend no longer injects vendor-native thinking fields by model name.\n\n### DashScope\u002FBailian Presets Rebranded as 千问AI平台 With Qwen 3.8 ([#7183](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7183))\n\nThe domestic Bailian presets are renamed 千问AI平台 with a dedicated icon, and the console and API-key links move to `platform.qianwenai.com`; the Qwen family is refreshed to the 3.8 generation across Claude Code, Claude Desktop, Codex, Hermes, OpenClaw, OpenCode and Pi — `qwen3.8-max` \u002F `qwen3.7-plus` \u002F `qwen3.8-flash` for the Opus\u002FSonnet\u002FHaiku roles, with the official 983,616-token window used consistently; the domestic `Bailian For Coding` presets (Claude Code, Claude Desktop, Hermes) become `千问AI平台 Coding Plan` on their existing endpoint; and OpenClaw\u002FOpenCode\u002FPi model metadata is aligned with the official client docs. The international QwenCloud presets keep their names and get their own icon; the pay-as-you-go presets move to Qwen 3.8 and the Token Plan presets are aligned with them (Codex and Hermes already carried the 3.8 rows), while QwenCloud For Coding keeps `qwen3.7-plus`, `qwen3-coder-plus` and its `coding-intl` endpoint. The endpoints have one exception: Pi's QwenCloud Token Plan switches from `\u002Fapps\u002Fanthropic` (Anthropic Messages) to `\u002Fcompatible-mode\u002Fv1` (OpenAI Chat Completions), while the Hermes and OpenClaw Token Plan presets stay on their Anthropic addresses.\n\n### MiniMax Presets Default to M3 and Drop Expired Offers ([#7255](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7255), fixes [#7254](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7254))\n\nThe official MiniMax and MiniMax (en) presets across all seven preset files now default to `MiniMax-M3` — Claude Code declares the 1M context (`MiniMax-M3[1M]` with the official `CLAUDE_CODE_AUTO_COMPACT_WINDOW=1000000`), Claude Desktop enables 1M support, and OpenClaw\u002FOpenCode\u002FPi metadata carries the 1,000,000-token context, 131,072-token output budget, image input and reasoning support. The expired Coding Plan promotions are removed from every preset and all four locales. Existing configurations and third-party defaults are unchanged.\n\n### DouBaoSeed Preset Renamed to Volcengine Doubao\n\nThe display name is localized across the seven app preset files: 「火山 豆包AI」 in zh\u002Fzh-TW and \"Volcengine Doubao\" in en\u002Fja, following the Qiniu\u002FCompshare convention — the top-level name keeps the Latin fallback, so the preset stays searchable in both Chinese and English. The `settingsConfig.name` that OpenCode and Pi write into the client config files is renamed too but keeps its ASCII form (`Volcengine Doubao`). Identifiers in live configs are deliberately untouched: the Codex TOML provider name, the Hermes node key `doubao_seed`, Pi's provider key, the OpenClaw model-ref prefix, the promotion key and the icon.\n\n### DeepSeek V4 Family Repriced to the V4.1 Flash Tier\n\nDeepSeek has retired V4 Flash and announced that from 2026-09-14 12:00 (Beijing) V4 Pro requests are routed to V4.1 Flash and billed at the Flash price; this release executes that callback early. `deepseek-v4-flash`, `deepseek-v4-flash-0731` and `deepseek-v4-pro` move to $0.30\u002F$1.20 with $0.006 cache read, the repair entries only correct rows still on the previous peak tier, and they are chained after the 2026-08-16 peak\u002Foff-peak rows, so older databases hop through the intermediate prices step by step. `deepseek-chat` and `deepseek-reasoner` stay untouched for lack of an authoritative source. `deepseek-v4-pro` also leaves the confirmed text-only table — it now lands on a vision-capable model, so the image sanitizer fails open for it.\n\n### Claude \"Apply to All Roles\" Follows the Form Order\n\nThe one-click button that copies a single model name into every role of the Claude model mapping previously took `ANTHROPIC_MODEL` first; it now reads the panel top to bottom (Sonnet, Opus, Fable, Haiku, subagent) and uses the default model only as the last fallback.\n\n### Atlas Cloud Is No Longer a Sponsor\n\nThe sponsor identity is removed from the README sponsor tables in all four languages, the banner, the `isPartner`\u002F`partnerPromotionKey` flags and the promotion strings; the presets for the seven apps themselves stay, moving from the sponsor group to the non-sponsor group with endpoints, models and icon unchanged.\n\n---\n\n## Fixed\n\n### Empty `reasoning_content` Placeholders No Longer Flood Claude Code With Empty Thought Blocks\n\nSome OpenAI-compatible upstreams (GLM, Qwen, DeepSeek-V4-Pro via ModelScope\u002FDashScope, Bailian, JD Cloud, …) keep a `reasoning_content: \"\"` placeholder in every content chunk instead of omitting the field. The reasoning branch of the OpenAI Chat-to-Anthropic SSE converter only checked whether the field was present, and it shares the open-block state with the content branch, so every content chunk first closed the open text block, opened an empty thinking block, then reopened a text block — N content chunks became 2N content blocks, half of them empty thinking blocks, which Claude Code rendered as one line per token plus dozens of empty Thought blocks, and which bloated the session JSONL along with it. Empty reasoning is now filtered before entering the branch, matching the guard the content branch and the non-streaming converter already had; two regression tests pin block index, type and order for both the placeholder shape and real reasoning. ([#7227](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7227), fixes [#5028](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5028), [#4404](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F4404); supersedes [#4869](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F4869), [#6421](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6421), [#6576](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6576))\n\n### Codex Agent Tasks No Longer Stop After a Progress Update on Chat Upstreams\n\nThe Codex Responses-to-Chat Completions converter emitted two consecutive assistant messages when one model turn contained a commentary message directly followed by `function_call` items; Chat upstreams treat the text-only message as a complete turn and return `finish_reason=stop` before the expected tool call. Pending tool calls are now merged into the directly adjacent assistant message when it carries no `tool_calls` yet, pending reasoning is attached per segment so parallel calls do not duplicate it, and every other boundary shape (user\u002Ftool boundaries, prior tool-call batches, media flushes) keeps the new-message path; the reasoning placeholder backfill still applies to coalesced calls without reasoning. ([#7280](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7280), fixes [#6529](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6529); supersedes [#6530](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6530), [#5895](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F5895); also reported as [#5860](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5860))\n\n### Claude Desktop Model Probes No Longer Fail on Responses Upstreams\n\nThe Responses API rejects `max_output_tokens` below 16, but Anthropic clients legitimately send tiny probe budgets — Claude Desktop's model-availability probe uses `max_tokens=1` — and the Anthropic-to-Responses conversion copied the value verbatim, so strict upstreams returned 400 and Claude Desktop reported the mapped model as unavailable under local routing. Values 1 through 15 are clamped up to 16 during conversion; 16 and above, 0 and non-integer values keep their pass-through semantics, normal session requests convert byte-for-byte as before, and the Codex OAuth path still strips `max_output_tokens` afterwards. ([#7287](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7287), fixes [#7103](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7103))\n\n### Codex Image Generation Under Routing: Pasted Full Endpoints, Mixed-Case Suffixes, Streamed Usage\n\nThe `\u002Fimages\u002Fedits` route and the suffix table shared by Images\u002FResponses\u002FCompact\u002FChat already shipped in v3.20.2; this round closes three gaps around them. When the base URL was pasted as a complete `\u002Fchat\u002Fcompletions` or `\u002Fresponses` endpoint and the \"full URL\" switch is off, the sibling Images and Alpha Search endpoints are now derived the same way the Chat path already tolerated, instead of sending standalone requests to `…\u002Fchat\u002Fcompletions\u002Fimages\u002Fgenerations`. Suffix detection and the sibling rewrite match case-insensitively (`\u002Fv1\u002FImages\u002FEdits\u002F`, `\u002Fv1\u002FResponses\u002FCompact\u002F`) while preserving the original URL prefix, percent-encoding and query. And streaming Images usage is parsed from the `image_generation.completed` event's top-level `usage` (skipping the `partial_image` events that carry none) before falling back to the Chat Completions stream parser, so streamed generations no longer record zero tokens. ([#7177](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7177), follow-up to [#7036](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7036))\n\n### Shutdown and Port Allocation No Longer Overwrite Per-App Proxy Settings\n\nOn normal exit the proxy's restore path called the legacy global proxy-config writer to clear the long-retired `live_takeover_active` flag; that writer reads the Claude row and runs an UPDATE without a WHERE clause, so every shutdown copied Claude's `max_retries` and three timeout fields onto the Codex, Gemini and Grok Build rows — and the UPDATE never carried the flag in the first place, so the step had no effect beyond the clobber. The ephemeral listen-port path did the same on every proxy start. The dead write-back is dropped (live-config restore, backup cleanup and health reset are unchanged) and the resolved ephemeral port is persisted through the global-config interface, which only touches the shared listen\u002Flogging columns; two regression tests seed distinct settings for all four apps and assert they survive both paths. ([#7210](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7210), fixes [#7204](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7204))\n\n### Universal Provider Sync Keeps Its Children's Settings and Position\n\nSyncing a universal provider regenerates its Claude\u002FCodex\u002FGemini child providers. The child's `settings_config` was merged with the existing row, but `meta`, `created_at` and `sort_index` were taken from the generated object, which the universal provider never carries when it comes from the UI — so the UPDATE wiped the child's usage script, common-config opt-out, endpoint auto-select and other per-app settings to `{}` and reset the sort index to NULL, pushing the card to the bottom of the list as if it had been deleted and re-created. Existing children now keep those three fields; name, base URL, key, models, website and notes are still driven by the universal provider, and first-time creation still inherits the parent's metadata. ([#7212](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7212), fixes [#7134](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7134))\n\n### Codex Cards Omitting `model_provider` Honor the Proxy Address on Takeover\n\nWhen a Codex card's TOML has no `model_provider`, Codex falls back to its built-in `openai` provider, but takeover wrote the proxy address as a top-level `base_url` that Codex never reads, so requests bypassed the local proxy and went straight to `api.openai.com`. The missing selector is now treated as the built-in `openai` provider and the proxy address is written to `openai_base_url`; the existing legacy-reroute migration then turns it into a `cc-switch` custom provider table carrying the `PROXY_MANAGED` bearer — the same shape every other third-party takeover uses. Explicit provider selections are unchanged. ([#7263](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7263), fixes [#6256](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6256), refs [#7217](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7217))\n\n### Codex Usage Import Detects Growing Rollouts on Windows\n\nCodex keeps the rollout append handle open for the whole session, so on Windows NTFS the file mtime does not advance while the file grows, and the pure-mtime gate skipped growing rollouts forever. The observed byte length is now stored in the existing `session_log_sync.last_byte_offset` column for Codex rows, and a file is skipped only when both mtime and size are unchanged; the parser splits records on newlines manually so an incomplete trailing record is retried on the next pass without advancing the line cursor. A follow-up counts the bytes of an incomplete tail as observed too: only fully consumed records used to count toward the persisted length, so a rollout ending mid-record or in whitespace (a crashed session that was never resumed) always looked shorter than its file and was fully reparsed on every sync pass — the line cursor still stops before the incomplete record, so it is retried as soon as the file grows, while an unchanged file is skipped on the mtime+size gate. ([#7219](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7219), fixes [#6060](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6060); plus a follow-up commit)\n\n### Tray Shows the Bound ChatGPT Account's Quota for Managed Codex Cards\n\nSince [#6537](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6537) the tray deliberately dropped the usage suffix for Codex official cards bound to a managed ChatGPT account, because it only had an app-wide subscription cache fed by whatever login the Codex CLI currently holds (macOS Keychain first, then `auth.json`), which cannot represent account-scoped quota safely once several accounts are bound; the provider card queried the bound account, but that result never reached the tray, and users with multiple ChatGPT logins saw `Codex · \u003Cname>` with no quota at all. The usage cache gains an account-keyed Codex OAuth snapshot map that the quota query writes through to — transport errors keep the last good snapshot, auth\u002FHTTP failures replace it so the tray hides an invalid quota instead of showing a stale one — and a tray refresh is scheduled on each write. A single `TrayUsageSource` decision is shared by the refresh and display paths: managed Codex cards read only their bound account's snapshot (never falling back to a provider-scoped or CLI snapshot), default to enabled when no usage toggle has been saved (matching the provider card), and the fixed official card takes the managed path too when it carries a binding. Rebinding switches to the new account's snapshot immediately, and a late response for the previous account cannot overwrite the label. (fixes [#7267](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7267))\n\n### DeepSeek's Codex Catalog Mirrors the Vision-Capable `deepseek-flash`\n\nThe bundled DeepSeek official Codex catalog is refreshed to the vendor's current `models.json` (slug `deepseek-flash`, image input modality, `supports_image_detail_original`), and `deepseek-v4-flash` leaves the confirmed text-only table: DeepSeek still accepts the legacy id and routes it to the vision-capable V4.1 Flash, so the proxy's media sanitizer and the generated Codex catalog now fail open for it, instead of replacing images with `[Unsupported Image]` or hiding image input from Codex. ([#7286](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7286), fixes [#7283](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7283))\n\n### Third-Party Token Plan DeepSeek V4 Rows Declared Text-Only\n\nWith the official endpoint routing `deepseek-v4-flash` to a vision model, the id fails open everywhere, but Baidu Qianfan and Tencent Token Plan still host text-only V4 deployments — Qianfan's Coding Plan doc states that image input returns 400, and Tencent's 2026-09-10 plan rosters list V4 only. Their Codex preset rows (the flash and pro families, including `-0731`\u002F`-0813`\u002F`-202605`\u002F`-202606`) now declare `inputModalities: [\"text\"]` explicitly instead of relying on the registry, and a preset test also locks the official DeepSeek preset to stay undeclared (fail-open). (follow-up to [#7283](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7283))\n\n---\n\n## Upgrade Notes\n\n### This Release Contains No Database Migration\n\nThe schema version stays at 18. The Codex byte cursor reuses the existing `session_log_sync.last_byte_offset` column.\n\n### Codex Rollouts Are Re-Parsed Once After Upgrading\n\nCodex rows have no stored byte length yet, so the first sync pass re-reads every rollout on every platform (CPU only; already-imported events are skipped by line offset, so nothing is counted twice). Later passes skip unchanged files.\n\n### Per-App Proxy Settings That Were Already Overwritten Are Not Restored\n\n[#7210](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7210) stops the clobber, but cannot recover the retry\u002Ftimeout values that earlier shutdowns copied from Claude onto Codex, Gemini and Grok Build — check them once in the proxy settings and reset any that differ from what you configured.\n\n### Universal Sync Preserves Child Settings From Now On\n\nSettings a previous sync already wiped (usage script, common-config opt-out, endpoint auto-select, sort position) have to be re-entered once.\n\n### Codex Cards Without `model_provider` Now Route Through the Local Proxy Under Takeover\n\nAfter [#7263](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7263) such cards no longer silently connect straight to `api.openai.com`, matching every other third-party takeover.\n\n### Preset Changes Only Affect Newly Created Providers\n\nExisting cards keep the snapshot taken when they were created. Affected this release: Kimi's two Codex presets — an existing Kimi card is still `openai_chat` and keeps working through routing; to connect directly, set the card's upstream format to Responses or re-import the preset (note that Kimi open platform Tier 0 keys are limited to 3 requests per minute, which is not enough for a multi-request tool loop); the aggregator Codex catalogs; the 千问AI平台 rebrand and Qwen 3.8 (including Pi's QwenCloud Token Plan protocol switch); the MiniMax M3 defaults; the Volcengine Doubao display name; and the text-only declarations on the Qianfan\u002FTencent Token Plan DeepSeek rows (an existing card on those presets still relies on the reactive strip-and-retry for images, or re-import the preset).\n\n### Codex Catalog Fixes Take Effect on the Next Provider Switch\n\nCatalog files are regenerated at switch time: this release's entry is the `deepseek-flash` vision row in the DeepSeek official catalog ([#7286](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7286)). Switch away and back once on the DeepSeek card.\n\n### Pricing\n\n`deepseek-flash` and `deepseek-v4-flash-vision-exp` are new seed rows, so the startup backfill prices the historical requests these ids had recorded at $0. The `deepseek-v4-flash` \u002F `-0731` \u002F `-pro` repair only corrects rows still on the seeded peak-tier values (0.44\u002F1.32\u002F0.014 and 1.32\u002F3.96\u002F0.044); customized rows are left alone, and historical costs are _not_ recomputed. The V4 Pro change lands ahead of DeepSeek's 2026-09-14 cutover, so V4 Pro requests made before then are costed at the Flash price. `deepseek-chat` and `deepseek-reasoner` keep their previous values.\n\n### Anthropic Clients Probing a Responses Upstream With `max_tokens` 1–15 Now Send 16\n\nNothing to configure.\n\n### Chat-Upstream Codex Cards See One Prefix-Cache Miss After Upgrading\n\nThe commentary-plus-tool-call message merged by [#7280](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7280) changes the request bytes once; the shape is then stable turn to turn.\n\n### Managed Codex Cards Show Quota in the Tray by Default\n\nQuota is shown when no usage toggle has been saved, matching the provider card; turn the card's usage toggle off to hide it.\n\n---\n\n## Risk Notice\n\n### Carried-Over Notices\n\n**xAI Grok OAuth sign-in**: reuses the public OAuth client identity of the official Grok CLI; using it could lead to account restriction or suspension — see the [v3.18.0 release notes](v3.18.0-en.md#risk-notice) for details.\n\n**Codex OAuth reverse proxy**: using a ChatGPT subscription's Codex OAuth through a reverse proxy may violate OpenAI's terms of service. See the [v3.13.0 release notes](v3.13.0-en.md#️-risk-notice) for details.\n\n**SuperGrok quota queries**: the quota display on provider cards depends on a non-public billing endpoint at grok.com and may stop working once xAI changes the interface — see the [v3.19.0 release notes](v3.19.0-en.md#risk-notice) for details.\n\n**Third-party provider routing**: when the CC Switch local proxy converts and forwards Codex, Claude Desktop, or Grok Build requests to a third-party provider, each provider has different constraints on billing, compliance, and data retention. Please read the target provider's terms of service before use.\n\nBy enabling these features, users accept the associated risks. CC Switch is not responsible for any account restriction, warning, or service suspension resulting from their use.\n\n---\n\n## Thanks\n\n11 of this release's 22 commits come from 8 outside contributors.\n\n### Code Contributions\n\n- Thanks to @gongzhenhu: filtering empty `reasoning_content` placeholders ([#7227](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7227), fixes [#5028](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5028), [#4404](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F4404)), a first contribution; @AdJIa ([#4869](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F4869)), @U1traTC ([#6421](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6421)) and @Hypocrite000 ([#6576](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6576)) each proposed a fix for the same problem earlier.\n- Thanks to @fszcd: coalescing Codex commentary with its tool calls ([#7280](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7280), fixes [#6529](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6529)), a first contribution; @BigStrongSun self-reported the problem and submitted a fix in [#6530](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6530), and @xu-xiang also attempted one in [#5895](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F5895).\n- Thanks to @SailingLoong: clamping the Claude Desktop probe's `max_tokens` to 16 ([#7287](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7287), fixes [#7103](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7103)) and the DeepSeek vision catalog mirror ([#7286](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7286), fixes [#7283](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7283)); @John1Tang had proposed a fix for the probe clamping earlier in [#7126](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7126).\n- Thanks to @Komikawayi: three fixes — shutdown clobbering per-app proxy settings ([#7210](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7210), fixes [#7204](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7204)), universal provider sync preserving child metadata ([#7212](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7212), fixes [#7134](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7134)) and Codex honoring the proxy address when `model_provider` is missing ([#7263](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7263), fixes [#6256](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6256)).\n- Thanks to @woniuxiaoshu: the persisted byte cursor for Codex usage ([#7219](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7219), fixes [#6060](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6060)), a first contribution; @LimiChan-2026 ([#6080](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6080), also the reporter of #6060), @woshimaxfive ([#6027](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6027), who also reported the same symptom on Windows in [#6023](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6023)) and @puppnn ([#6246](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6246)) each proposed a fix for the same problem earlier.\n- Thanks to @thisTom: the three Codex image-generation follow-ups ([#7177](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7177)), continuing their own [#7036](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7036).\n- Thanks to @shigzz: the 千问AI平台 rebrand and the Qwen 3.8 refresh ([#7183](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7183)), a first contribution.\n- Thanks to @jellyjelly814: the MiniMax M3 defaults and the expired-offer cleanup ([#7255](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F7255)), self-reported and self-fixed in [#7254](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7254), a first contribution; @octo-patch had proposed the M3 default upgrade earlier in [#3567](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F3567), with M3 pricing and modalities in [#6396](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fpull\u002F6396).\n\n### Issue Reports\n\n- Thanks to @Sunshine-SACA and @snowing0427 for reporting the empty thinking-block flood and content-block fragmentation ([#5028](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5028), [#4404](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F4404)), and to @csj-ccc for adding a ModelScope Qwen3-Coder reproduction on v3.20.0 in #4404.\n- Thanks to @BigStrongSun and @aducker2016 for reporting the Responses-to-Chat conversion splitting an assistant turn ([#6529](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6529), [#5860](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F5860)) — the latter traced DeepSeek's endless repetition to the same root cause.\n- Thanks to @haoyubai212 for reporting the Claude Desktop probe's 400 on Responses upstreams ([#7103](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7103)).\n- Thanks to @HEYUESAMA for reporting DeepSeek images being replaced with `[Unsupported Image]` and the catalog declaring text-only ([#7283](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7283)).\n- Thanks to @Jason-purse for reporting Codex's failover settings being overwritten by Claude's after a restart ([#7204](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7204)).\n- Thanks to @auqhjjqdo for reporting that universal provider sync broke settings such as usage queries ([#7134](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7134)).\n- Thanks to @pemagic for reporting Codex connecting straight to `api.openai.com` and bypassing local routing ([#6256](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6256)), and to @Tiacoo for documenting how the same symptom looks on Codex 0.153.x in [#7217](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7217).\n- Thanks to @LimiChan-2026 and @MoEternal for reporting Codex usage being missed on Windows ([#6060](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F6060), [#7264](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7264)).\n- Thanks to @ringzxw for reporting that the tray showed no quota when several ChatGPT accounts are bound ([#7267](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Fissues\u002F7267)).\n\n---\n\n## Download & Install\n\nVisit [Releases](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Freleases\u002Flatest) and download the build for your system, or get it from the official site [ccswitch.io](https:\u002F\u002Fccswitch.io) (downloads are distributed through Cloudflare edge nodes and do not depend on GitHub being reachable).\n\n### System Requirements\n\n| System  | Minimum Version      | Architecture                        |\n| ------- | -------------------- | ----------------------------------- |\n| Windows | Windows 10 and later | x64 \u002F ARM64                         |\n| macOS   | macOS 12 (Monterey)+ | Intel (x64) \u002F Apple Silicon (arm64) |\n| Linux   | See table below      | x64 \u002F ARM64                         |\n\n### Windows\n\n| File                                     | Description                                      |\n| ---------------------------------------- | ------------------------------------------------ |\n| `CC-Switch-v3.20.3-Windows.msi`          | **Recommended** - MSI installer with auto-update |\n| `CC-Switch-v3.20.3-Windows-Portable.zip` | Portable build, unzip and run                    |\n\nWindows ARM64 devices should pick the artifact whose file name carries the `arm64` tag.\n\n### macOS\n\n| File                             | Description                                           |\n| -------------------------------- | ----------------------------------------------------- |\n| `CC-Switch-v3.20.3-macOS.dmg`    | **Recommended** - DMG installer, drag to Applications |\n| `CC-Switch-v3.20.3-macOS.zip`    | Unzip and drag to Applications, Universal Binary      |\n| `CC-Switch-v3.20.3-macOS.tar.gz` | For Homebrew install and auto-update                  |\n\nHomebrew install:\n\n```bash\nbrew install --cask cc-switch\n```\n\nUpgrade:\n\n```bash\nbrew upgrade --cask cc-switch\n```\n\n### Linux\n\nLinux assets are available for both **x86_64** and **ARM64** (`aarch64`). Choose the file whose architecture tag matches your machine's `uname -m` output:\n\n- `CC-Switch-v3.20.3-Linux-x86_64.AppImage` \u002F `.deb` \u002F `.rpm`\n- `CC-Switch-v3.20.3-Linux-arm64.AppImage` \u002F `.deb` \u002F `.rpm`\n\n| Distribution                            | Recommended Format | Install Command                                                        |\n| --------------------------------------- | ------------------ | ---------------------------------------------------------------------- |\n| Ubuntu \u002F Debian \u002F Linux Mint \u002F Pop!\\_OS | `.deb`             | `sudo dpkg -i CC-Switch-*.deb` or `sudo apt install .\u002FCC-Switch-*.deb` |\n| Fedora \u002F RHEL \u002F CentOS \u002F Rocky Linux    | `.rpm`             | `sudo rpm -i CC-Switch-*.rpm` or `sudo dnf install .\u002FCC-Switch-*.rpm`  |\n| openSUSE                                | `.rpm`             | `sudo zypper install .\u002FCC-Switch-*.rpm`                                |\n| Arch Linux \u002F Manjaro                    | `.AppImage`        | Make executable and run directly, or use AUR                           |\n| Other distributions \u002F unsure            | `.AppImage`        | `chmod +x CC-Switch-*.AppImage && .\u002FCC-Switch-*.AppImage`              |\n\n\n[Official version release](https:\u002F\u002Fgithub.com\u002Ffarion1231\u002Fcc-switch\u002Freleases\u002Ftag\u002Fv3.20.3).","2026-09-11T18:46:03Z",627,"0001-01-01T00:00:00Z",[487],{"area":453,"items":488},[489,490,491,492,493],"Add Artifact Tool toggle and Claude Fable quota display.","Refresh Kimi, MiniMax, Qwen and DeepSeek presets and pricing.","Filter empty reasoning chunks; keep Codex tool calls with progress.","Preserve per-app proxy settings and universal-provider metadata.","Fix Responses probes, image usage and Windows rollout imports.","Improves provider presets and pricing, fixes reasoning\u002Fsession conversion, and preserves per-app routing settings.","CC Switch 3.20.3",{"locale":423,"machineTranslated":36,"sourceLocale":423,"status":431},"3.20.3",{"brewCommittedAt":499,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":500,"source":73,"translation":501,"version":502},"2026-09-07T15:38:06Z",[],{"status":75},"3.20.2",{"brewCommittedAt":504,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":505,"source":73,"translation":506,"version":507},"2026-08-28T03:39:58Z",[],{"status":75},"3.20.1",{"brewCommittedAt":509,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":510,"source":73,"translation":511,"version":512},"2026-08-18T09:50:07Z",[],{"status":75},"3.20.0",{"brewCommittedAt":514,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":515,"source":73,"translation":516,"version":517},"2026-08-06T10:25:19Z",[],{"status":75},"3.19.2",{"brewCommittedAt":519,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":520,"source":73,"translation":521,"version":522},"2026-07-31T16:17:10Z",[],{"status":75},"3.19.1",{"brewCommittedAt":524,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":525,"source":73,"translation":526,"version":527},"2026-07-30T07:25:49Z",[],{"status":75},"3.19.0",{"brewCommittedAt":529,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":530,"source":73,"translation":531,"version":532},"2026-07-21T16:14:25Z",[],{"status":75},"3.18.0",{"brewCommittedAt":534,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":535,"source":73,"translation":536,"version":537},"2026-07-14T01:02:08Z",[],{"status":75},"3.17.0",{"brewCommittedAt":539,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":540,"source":73,"translation":541,"version":542},"2026-07-02T01:30:59Z",[],{"status":75},"3.16.5",{"brewCommittedAt":544,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":545,"source":73,"translation":546,"version":547},"2026-06-27T07:37:52Z",[],{"status":75},"3.16.4",{"brewCommittedAt":549,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":550,"source":73,"translation":551,"version":552},"2026-06-15T01:42:07Z",[],{"status":75},"3.16.3",{"brewCommittedAt":554,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":555,"source":73,"translation":556,"version":557},"2026-06-08T16:53:24Z",[],{"status":75},"3.16.2",{"brewCommittedAt":559,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":560,"source":73,"translation":561,"version":562},"2026-06-01T14:40:22Z",[],{"status":75},"3.16.1",{"brewCommittedAt":564,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":565,"source":73,"translation":566,"version":567},"2026-05-29T16:49:31Z",[],{"status":75},"3.16.0",{"brewCommittedAt":569,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":570,"source":73,"translation":571,"version":572},"2026-05-16T07:18:21Z",[],{"status":75},"3.15.0",{"brewCommittedAt":574,"hasNotes":36,"isLatest":36,"isPrerelease":36,"sections":575,"source":73,"translation":576,"version":577},"2026-04-23T16:17:53Z",[],{"status":75},"3.14.1",20,{"brewLag":580,"cadence":418,"count30d":415},{"compared":415,"earlierCount":416,"medianMinutes":417},{"current":442,"records":582,"size":442,"stats":586,"total":412},[583],{"brewCommittedAt":71,"hasNotes":36,"isLatest":32,"isPrerelease":36,"sections":584,"source":73,"translation":585,"version":76},[],{"status":75},{"brewLag":587,"cadence":418,"count30d":415},{"compared":415,"earlierCount":416,"medianMinutes":417}]