Skip to content

feat(codex): add per-provider option to disable hosted web search - #409

Open
ChanthMiao wants to merge 3 commits into
SaladDay:mainfrom
ChanthMiao:feat/codex-disable-web-search
Open

ChanthMiao wants to merge 3 commits into
SaladDay:mainfrom
ChanthMiao:feat/codex-disable-web-search

Conversation

@ChanthMiao

Copy link
Copy Markdown

动机

Codex 供应商走原生 /responses(NativeResponses)格式直连网关时,部分网关不支持 hosted web-search 工具;此前 cc-switch 只能通过 model catalog 的 supports_search_tool: false 隐式抑制工具声明,无法在 config.toml 顶层显式禁用。本 PR 为这类供应商提供「禁用内置联网搜索」开关,控制 web_search 字段的生成。

行为变化

  • 表单新增开关(Codex 快捷配置菜单),仅对原生 Responses(openai_responses)格式的供应商显示;官方 OAuth 供应商同样可见
  • 开关开启时,生成 live config.toml 写入 web_search = "disabled"
  • 关闭/未设置:不写入;仅清理 cc-switch 之前写入的恰好为 "disabled" 的值,用户手写的 "live" 等偏好保留
  • Anthropic 格式维持现状(恒禁用,Messages 桥无法携带该工具);Chat 格式不受影响(本地代理负责转换)
  • 选项持久化于 settingsConfig.disableWebSearch(布尔),随 provider 经 SQLite / 导入导出 / WebDAV 同步往返,无需数据库迁移

实现要点

  • 写时生成:prepare_codex_config_text_with_model_catalog_payload 根据 profile + 选项推导 disable 条件,覆盖切换、同步、takeover、failover、恢复全部 live 写入入口
  • 代理快照合并:build_effective_live_snapshot 对 Codex 只投影 {auth, config},新增 merge_codex_provider_catalog_options 在 proxy 侧三处写路径补齐选项
  • 表单遵循既有 touched 模式,未触碰开关的保存不产生任何键写入

测试

  • 新增 8 个单测(codex_config 生成 4 个 + 表单 4 个),更新 3 处既有断言
  • cargo test --lib web_search(9 个)、--lib provider_add_form_codex(43 个)全绿
  • cargo fmt --check 通过;改动文件无新增 clippy 警告
  • 两路独立盲审无 findings
  • 注:全量 lib 测试的 16 个失败(theme 15 + proxy catalog 1)与两个 settings 集成目标编译失败均为 HEAD 预先存在的问题(stash 对比验证),与本 PR 无关

@SaladDay

Copy link
Copy Markdown
Owner

Thanks for the PR! The TUI direction looks consistent, but there are a few blockers:

  • The backend currently relies only on settingsConfig.disableWebSearch. Please align it with upstream’s host/model-based detection, keeping the toggle as an optional force-disable override if needed.
  • disableWebSearch is dropped when Codex snapshots are rebuilt during provider backfill or temporary-launch capture, so it does not survive a normal switch cycle.
  • Proxy takeover restore can rebuild the config with the ProxyChat profile and remove web_search = "disabled" from native providers.

Please add lifecycle coverage for switch-away/back, temporary capture, and takeover restore.

@ChanthMiao

Copy link
Copy Markdown
Author

Ok, I will fix them later. But, my laptop failed to boot for unknown problem. I need some time to fix it first.

ChanthMiao added a commit to ChanthMiao/cc-switch-cli that referenced this pull request Aug 13, 2026
…ifecycle

Address maintainer review (PR SaladDay#409):

- Align with upstream d380b410: native /responses gateways on the
  host/model blacklist (xiaomimimo.com, longcat.chat, minimax.io,
  minimaxi.com; model prefixes mimo/longcat/minimax) now get
  web_search = "disabled" automatically, with an optional top-level
  base_url fallback for legacy flat configs. The disableWebSearch
  toggle remains as a force-disable override (additive only).
- Preserve settingsConfig.disableWebSearch when Codex snapshots are
  rebuilt during provider backfill or temporary-launch capture, so the
  option survives a normal switch cycle.
- Proxy takeover restore no longer strips web_search = "disabled"
  from native providers: verbatim restores keep the captured field,
  and takeover writes evaluate the blacklist against the provider's
  stored pre-rewrite config (the live base_url is rewritten to the
  local proxy).
- Lifecycle tests: switch-away/back, temporary capture, backfill,
  takeover restore, and blacklist verdict override.
@ChanthMiao

Copy link
Copy Markdown
Author

All review points are addressed in commit 4436c8d4 (pushed to the PR branch):

  1. Align with upstream host/model-based detection — ported the blacklist from d380b410 verbatim: web_search = "disabled" is now written automatically for native /responses gateways matched by base_url host (xiaomimimo.com, longcat.chat, minimax.io, minimaxi.com) or by model brand prefix (mimo, longcat, minimax, after stripping aggregator vendor/ segments). The host check also falls back to the top-level base_url for legacy flat configs, mirroring upstream's extraction. The disableWebSearch toggle remains as an optional force-disable override (additive only; the blacklist is default-on regardless of the toggle).

  2. Option survives snapshot rebuildsmerge_codex_provider_catalog_options now carries disableWebSearch across backfill_codex_current (both branches) and capture_codex_temp_launch_snapshot, so the option no longer drops on a normal switch cycle.

  3. Takeover restore no longer strips web_search = "disabled" — the provider-less verbatim restore path (write_codex_live_verbatim) now preserves the captured text's web_search state (manage_web_search=false), and takeover writes evaluate the blacklist against the provider's stored pre-rewrite config, since rewrite_live_for_proxy replaces the live base_url with the local proxy address (host check would otherwise miss and clean the sentinel).

  4. Lifecycle test coverage added — switch-away/back cycles the field, temporary-launch capture and backfill preserve the option, takeover/verbatim restore keeps disabled, and a verdict-override test covers the rewritten-base_url takeover path.

Test status: cargo test --lib codex_config::tests (55 passed), services::provider::tests (111 passed), proxy_takeover integration (12 passed), targeted form tests green, cargo fmt --check clean, no new clippy warnings. (The 16 pre-existing flaky failures in the full parallel lib run — theme palette tests plus one proxy catalog test, all pass serially — are unrelated to this PR and reproduce on main without these changes.)

@ChanthMiao

Copy link
Copy Markdown
Author

@SaladDay Any other problems to fix ?

@SaladDay

Copy link
Copy Markdown
Owner

Thanks for the update! I re-reviewed commit 4436c8d4 and the full discussion timeline. Most of the original feedback is addressed, but two blockers remain:

  1. disableWebSearch is still dropped during a real provider switch. After writing the target provider, refresh_provider_snapshot() rebuilds the settings from { auth, config }, while restore_codex_settings_for_backfill() only restores modelCatalog. As a result, the option disappears from the newly active provider. The current switch-away/back test only exercises config-preparation helpers, so it does not catch this. Please preserve the option in the refresh path and add a real ProviderService::switch lifecycle test.

  2. The blacklist is missing the current upstream Qwen3-Coder correction. The PR copies d380b410, but upstream added qwen3-coder in the same-day follow-up 26f0d221, because DashScope rejects hosted web search for Qwen3-Coder models. The current test explicitly treats qwen3-coder-plus as supported; that expectation should be reversed while keeping general Qwen models enabled.

Also, the takeover restore coverage is still helper-level only. Please add a real takeover/restore assertion under proxy_takeover.rs for web_search = "disabled", as requested in the earlier review.

I also checked the #415 cross-reference: it covers the separate Claude-to-Responses WebSearch bridge and does not add scope to this PR.

The PR merges cleanly with current main, and the targeted formatting/config/provider/TUI/takeover tests pass. Once the items above are fixed, it should be ready for another review. Thanks! 🙂

ChanthMiao added a commit to ChanthMiao/cc-switch-cli that referenced this pull request Aug 22, 2026
…wen3-Coder blacklist

Address maintainer round-2 review (PR SaladDay#409):

- restore_codex_settings_for_backfill now restores disableWebSearch
  alongside modelCatalog, so refresh_provider_snapshot keeps the option
  on the newly active provider after a real switch (verified by a full
  ProviderService::switch seed->away->back lifecycle test using a
  non-blacklisted host, proving the disable comes from the option).
- Add qwen3-coder to the web_search reject model prefixes (upstream
  26f0d221): DashScope rejects built-in tools for the coder series.
  qwen3-coder-plus is now blacklisted (incl. behind aggregator vendor/
  prefixes), while general Qwen models (qwen-max, qwen3-max) stay
  enabled.
- Add a real takeover assertion under proxy_takeover.rs: activating a
  managed proxy session for a host-blacklisted native gateway keeps
  web_search = "disabled" after the live base_url is rewritten to the
  local proxy.
@ChanthMiao

Copy link
Copy Markdown
Author

All three round-2 blockers are fixed in commit e95a391d (pushed):

  1. disableWebSearch survives a real provider switchrestore_codex_settings_for_backfill now restores the option alongside modelCatalog, so refresh_provider_snapshot() keeps it on the newly active provider. Added a real ProviderService::switch lifecycle test (switch_codex_cycle_preserves_disable_web_search_option_on_active_provider): seed → switch away → switch back, asserting both the DB snapshot retains the option and the live config.toml carries web_search = "disabled". The provider uses a non-blacklisted host, so the disable provably comes from the preserved option, not the blacklist.

  2. Qwen3-Coder blacklist aligned with upstream 26f0d221qwen3-coder added to the reject model prefixes (model axis only). The test now asserts qwen3-coder-plus is disabled on the DashScope host, on an aggregator host, and behind a qwen/ vendor prefix, while general Qwen models (qwen-max, qwen3-max) stay enabled.

  3. Real takeover assertion under proxy_takeover.rs — new codex_takeover_keeps_web_search_disabled_for_blacklisted_gateway: activates an actual managed proxy session (set_managed_session_for_app) for a host-blacklisted native gateway whose live config already carries the sentinel, and asserts web_search = "disabled" survives after rewrite_live_for_proxy replaces the base_url with 127.0.0.1:<port> (host-only match, model brand deliberately not a reject prefix, so only the stored-config verdict can keep it).

Verification: codex_config::tests (57 passed), services::provider::tests (113 passed), proxy_takeover integration (13 passed, serial), targeted form tests green, cargo fmt --check clean, clippy never-used count unchanged at 30 (no new warnings). The pre-existing parallel-run flakiness (theme palette tests + a proxy catalog test, all green serially) reproduces on main without this PR.

@ChanthMiao
ChanthMiao force-pushed the feat/codex-disable-web-search branch from e95a391 to fa56a7a Compare August 27, 2026 16:15
ChanthMiao added a commit to ChanthMiao/cc-switch-cli that referenced this pull request Aug 27, 2026
…ifecycle

Address maintainer review (PR SaladDay#409):

- Align with upstream d380b410: native /responses gateways on the
  host/model blacklist (xiaomimimo.com, longcat.chat, minimax.io,
  minimaxi.com; model prefixes mimo/longcat/minimax) now get
  web_search = "disabled" automatically, with an optional top-level
  base_url fallback for legacy flat configs. The disableWebSearch
  toggle remains as a force-disable override (additive only).
- Preserve settingsConfig.disableWebSearch when Codex snapshots are
  rebuilt during provider backfill or temporary-launch capture, so the
  option survives a normal switch cycle.
- Proxy takeover restore no longer strips web_search = "disabled"
  from native providers: verbatim restores keep the captured field,
  and takeover writes evaluate the blacklist against the provider's
  stored pre-rewrite config (the live base_url is rewritten to the
  local proxy).
- Lifecycle tests: switch-away/back, temporary capture, backfill,
  takeover restore, and blacklist verdict override.
ChanthMiao added a commit to ChanthMiao/cc-switch-cli that referenced this pull request Aug 27, 2026
…wen3-Coder blacklist

Address maintainer round-2 review (PR SaladDay#409):

- restore_codex_settings_for_backfill now restores disableWebSearch
  alongside modelCatalog, so refresh_provider_snapshot keeps the option
  on the newly active provider after a real switch (verified by a full
  ProviderService::switch seed->away->back lifecycle test using a
  non-blacklisted host, proving the disable comes from the option).
- Add qwen3-coder to the web_search reject model prefixes (upstream
  26f0d221): DashScope rejects built-in tools for the coder series.
  qwen3-coder-plus is now blacklisted (incl. behind aggregator vendor/
  prefixes), while general Qwen models (qwen-max, qwen3-max) stay
  enabled.
- Add a real takeover assertion under proxy_takeover.rs: activating a
  managed proxy session for a host-blacklisted native gateway keeps
  web_search = "disabled" after the live base_url is rewritten to the
  local proxy.
@ChanthMiao

Copy link
Copy Markdown
Author

Rebased onto latest upstream main to resolve conflicts (branch now at fa56a7a).

Upstream advanced past the PR's original base (v5.10.3 release, Pi support, provider presets, skills rework), so the PR was rebased onto the current main
(0f26ed6) and all conflicts resolved:

  • The web-search blacklist implementation now coexists with upstream's own presets-migration copy: upstream's duplicate (2-host/2-model) constants were dropped
    in favor of this PR's complete list (xiaomimimo.com, longcat.chat, minimax.io, minimaxi.com; model prefixes mimo, longcat, minimax, qwen3-coder) with the
    top-level base_url fallback.
  • Both test suites are kept: upstream's preset-gateway test plus this PR's blacklist/lifecycle tests.
  • All feature behavior is unchanged: disableWebSearch toggle, blacklist default-on detection, verbatim takeover restore preserving web_search = "disabled",
    snapshot-rebuild preservation, and the lifecycle/switch/takeover test coverage.

Verification after rebase: codex_config 57 passed, services::provider 120, proxy_takeover/proxy_service 13/30, form tests 44, fmt clean, clippy warnings
unchanged vs upstream baseline. The only failing lib tests are the pre-existing parallel-run flaky ones (theme palette tests, green serially) plus one upstream
time-of-day-sensitive usage test that also fails on main itself.

@ChanthMiao

Copy link
Copy Markdown
Author

@SaladDay May you review the latest changes ?

Add a "禁用内置联网搜索" toggle for native Responses (openai_responses)
Codex providers. When enabled, live config.toml generation writes
web_search = "disabled"; otherwise the field is left untouched except
for removing the exact "disabled" value previously written by cc-switch,
preserving user-owned settings such as "live".

Anthropic gateways keep forcing the disabled value (the bridge cannot
carry the hosted tool); Chat formats are unaffected (the proxy converts
the tool). The option is stored in settingsConfig.disableWebSearch and
round-trips through SQLite/import-export/WebDAV without schema changes.
…ifecycle

Address maintainer review (PR SaladDay#409):

- Align with upstream d380b410: native /responses gateways on the
  host/model blacklist (xiaomimimo.com, longcat.chat, minimax.io,
  minimaxi.com; model prefixes mimo/longcat/minimax) now get
  web_search = "disabled" automatically, with an optional top-level
  base_url fallback for legacy flat configs. The disableWebSearch
  toggle remains as a force-disable override (additive only).
- Preserve settingsConfig.disableWebSearch when Codex snapshots are
  rebuilt during provider backfill or temporary-launch capture, so the
  option survives a normal switch cycle.
- Proxy takeover restore no longer strips web_search = "disabled"
  from native providers: verbatim restores keep the captured field,
  and takeover writes evaluate the blacklist against the provider's
  stored pre-rewrite config (the live base_url is rewritten to the
  local proxy).
- Lifecycle tests: switch-away/back, temporary capture, backfill,
  takeover restore, and blacklist verdict override.
…wen3-Coder blacklist

Address maintainer round-2 review (PR SaladDay#409):

- restore_codex_settings_for_backfill now restores disableWebSearch
  alongside modelCatalog, so refresh_provider_snapshot keeps the option
  on the newly active provider after a real switch (verified by a full
  ProviderService::switch seed->away->back lifecycle test using a
  non-blacklisted host, proving the disable comes from the option).
- Add qwen3-coder to the web_search reject model prefixes (upstream
  26f0d221): DashScope rejects built-in tools for the coder series.
  qwen3-coder-plus is now blacklisted (incl. behind aggregator vendor/
  prefixes), while general Qwen models (qwen-max, qwen3-max) stay
  enabled.
- Add a real takeover assertion under proxy_takeover.rs: activating a
  managed proxy session for a host-blacklisted native gateway keeps
  web_search = "disabled" after the live base_url is rewritten to the
  local proxy.
@ChanthMiao
ChanthMiao force-pushed the feat/codex-disable-web-search branch from fa56a7a to 4cd9a66 Compare August 31, 2026 16:29
@SaladDay

SaladDay commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Sorry, I've been a bit busy lately. I'll review it soon.

social4hyq pushed a commit to social4hyq/homebrew-core that referenced this pull request Sep 20, 2026
cc-switch-cli 5.10.2

Created-by: HarmonybrewBot
Commit-by: HarmonybrewBot
Merged-by: HarmonybrewBot
Description: Created by `brew bump`

---

Created with `brew bump-formula-pr`.<details>
  <summary>release notes</summary>
  <pre># CC Switch CLI v5.10.2

v5.10.2 is a patch release for skill updates, provider configuration persistence, and upstream-compatible database, pricing, backup, and cloud-sync behavior.

## Highlights

- Manually check and apply updates for repository-backed skills from the CLI or TUI. Use `cc-switch skills check-updates`, `cc-switch skills update <name>`, or `cc-switch skills update --all`.
- Provider quick settings and common-config membership now persist correctly after TUI edits, including inherited Claude and Codex values.
- The database now matches upstream schema v17 and keeps a persistent session-usage deduplication ledger.
- SQL backup/restore and WebDAV/S3 synchronization follow the upstream recovery and locking behavior more closely.
- The built-in price catalog and model aliases are refreshed from upstream CC-Switch v3.20.
- OpenModel is available as a named preset for Claude, Codex, Gemini, OpenCode, Hermes, and OpenClaw.

## Upgrade

The database migrates from schema v16 to v17 after creating the normal pre-migration backup. The migration adds the usage-deduplication ledger without rebuilding or deleting existing usage logs.

If multiple installations share snapshots through WebDAV or S3, upgrade all of them before syncing a v17 snapshot. Older versions intentionally reject newer schemas.

Built-in updater:

```bash
cc-switch update
```

Homebrew:

```bash
brew upgrade cc-switch-cli
```

macOS/Linux installer:

```bash
curl -fsSL https://github.com/SaladDay/cc-switch-cli/releases/latest/download/install.sh | bash
```

## Thank you

Thank you to everyone who submitted an issue, shared diagnostics, followed up in a discussion, proposed a change, or opened a pull request during this cycle:

- Issues and follow-up: [@DoubleLT](https://github.com/DoubleLT) ([#415](SaladDay/cc-switch-cli#415)), [@ShatterDusk](https://github.com/ShatterDusk) ([#413](SaladDay/cc-switch-cli#413)), [@PawnMa](https://github.com/PawnMa) ([#410](SaladDay/cc-switch-cli#410)), [@evelyn-jialin-zhang](https://github.com/evelyn-jialin-zhang) ([#408](SaladDay/cc-switch-cli#408)), [@MartinaBarton6](https://github.com/MartinaBarton6) ([#407](SaladDay/cc-switch-cli#407)), [@Wizard-one](https://github.com/Wizard-one) ([#406](SaladDay/cc-switch-cli#406)), [@Kurayuri](https://github.com/Kurayuri) ([#405](SaladDay/cc-switch-cli#405)), [@coderyangyangyang](https://github.com/coderyangyangyang) ([#404](SaladDay/cc-switch-cli#404)), [@CodeCatMeow](https://github.com/CodeCatMeow) ([#403](SaladDay/cc-switch-cli#403)), [@TaichiLi](https://github.com/TaichiLi) ([#402](SaladDay/cc-switch-cli#402)), [@maxwell-feng](https://github.com/maxwell-feng) ([#370](SaladDay/cc-switch-cli#370)), [@Jerrrry666](https://github.com/Jerrrry666) ([#278](SaladDay/cc-switch-cli#278)), and [@AkaChou](https://github.com/AkaChou) ([#89](SaladDay/cc-switch-cli#89)).
- Pull requests and proposals: [@ShatterDusk](https://github.com/ShatterDusk) ([#414](SaladDay/cc-switch-cli#414)), [@XiaoHuo888-hue](https://github.com/XiaoHuo888-hue) ([#412](SaladDay/cc-switch-cli#412)), [@brushax](https://github.com/brushax) ([#411](SaladDay/cc-switch-cli#411)), [@ChanthMiao](https://github.com/ChanthMiao) ([#409](SaladDay/cc-switch-cli#409)), [@wplct](https://github.com/wplct) ([#399](SaladDay/cc-switch-cli#399), [#400](SaladDay/cc-switch-cli#400), [#401](SaladDay/cc-switch-cli#401)), [@louisneal](https://github.com/louisneal) ([#297](SaladDay/cc-switch-cli#297)), [@zhangyang-crazy-one](https://github.com/zhangyang-crazy-one) ([#277](SaladDay/cc-switch-cli#277)), [@tangaac](https://github.com/tangaac) ([#105](SaladDay/cc-switch-cli#105)), and [@hitsmaxft](https://github.com/hitsmaxft) ([#94](SaladDay/cc-switch-cli#94)).
- Discussion participation: [@ToDayL](https://github.com/ToDayL) ([#297](SaladDay/cc-switch-cli#297)).

We also thank [@farion1231](https://github.com/farion1231) and every upstream CC-Switch contributor, especially [@Komikawayi](https://github.com/Komikawayi), [@mhy1227](https://github.com/mhy1227), [@zayokami](https://github.com/zayokami), and [@YUZHEthefool](https://github.com/YUZHEthefool), whose database, pricing, backup, and sync work was adapted here.

Some acknowledged reports and proposals remain open or were not merged; inclusion here is a thank-you, not a change in their status.

See the [full changelog](https://github.com/SaladDay/cc-switch-cli/blob/v5.10.2/CHANGELOG.md) and [all changes since v5.10.1](SaladDay/cc-switch-cli@v5.10.1...v5.10.2).
</pre>
  <p>View the full release notes at <a href="https://github.com/SaladDay/cc-switch-cli/releases/tag/v5.10.2">https://github.com/SaladDay/cc-switch-cli/releases/tag/v5.10.2</a>.</p>
</details>
<hr>

See merge request: Harmonybrew/homebrew-core!17022
social4hyq pushed a commit to social4hyq/homebrew-core that referenced this pull request Sep 20, 2026
cc-switch-cli 5.10.5

Created-by: HarmonybrewBot
Commit-by: HarmonybrewBot
Merged-by: HarmonybrewBot
Description: Created by `brew bump`

---

Created with `brew bump-formula-pr`.<details>
  <summary>release notes</summary>
  <pre># CC Switch CLI v5.10.5

v5.10.5 adds opt-in shared Codex sessions, per-model reasoning controls, local quota reset times, and GPT-6 Astra pricing. It also fixes model-catalog persistence, user-owned catalog paths, Windows session scanning, SQL imports, and Chat Completions compatibility.

## Added

- **Codex / Shared Sessions**: Add opt-in `cc-switch start codex <provider> --shared-sessions` on macOS/Linux. Providers keep separate credentials and configuration while sharing persistent native session history and session locks. Includes [#440](SaladDay/cc-switch-cli#440), addressing [#436](SaladDay/cc-switch-cli#436).
- **Codex / Per-Model Reasoning**: Expose supported reasoning levels and a default for each model in both TUI model-catalog editors, with the existing Auto behavior and contextual help. Includes [#442](SaladDay/cc-switch-cli#442), addressing [#441](SaladDay/cc-switch-cli#441).
- **Providers / PatewayAI**: Add the PatewayAI sponsor preset and its provider setup support.

## Changed

- **Quota / Reset Times**: Show quota reset timestamps in the local timezone, with UTC offsets and remaining time in CLI text; add compact reset countdowns to the TUI. Raw JSON timestamps and upstream quota calculations retain their existing semantics. Includes [#456](SaladDay/cc-switch-cli#456), fixing [#445](SaladDay/cc-switch-cli#445).
- **Pricing / GPT-6 Astra**: Add standard prices per million tokens: $10 input, $50 output, $1 cached input, and $12.50 cache writes. Missing entries are added without replacing user-customized prices or restoring user-deleted entries. Includes [#460](SaladDay/cc-switch-cli#460), fixing [#459](SaladDay/cc-switch-cli#459).

## Fixed

- **Codex / Model Mapping Persistence**: Preserve stored model catalogs and per-model reasoning settings during provider switches and temporary-launch capture. Fixes [#447](SaladDay/cc-switch-cli#447).
- **Codex / User-Owned Catalogs**: Preserve custom `model_catalog_json` paths when generating a cc-switch catalog. Includes [#454](SaladDay/cc-switch-cli#454).
- **Codex / OpenCode Go Reasoning**: Recognize the OpenCode Zen gateway before applying model-vendor reasoning defaults, and constrain effort to the model's catalog settings. Fixes [#443](SaladDay/cc-switch-cli#443).
- **Proxy / Chat Completions Compatibility**: Convert null or missing message content to an empty string when translating Responses requests to Chat Completions, preserving tool payloads and multimodal content. Fixes the Azure compatibility issue in [#448](SaladDay/cc-switch-cli#448).
- **Windows / Session Scanning**: Open existing session-cache files with the access required for synchronization, avoiding `Access denied (os error 5)` without truncating their contents. Includes [#455](SaladDay/cc-switch-cli#455), fixing [#450](SaladDay/cc-switch-cli#450).
- **Configuration / SQL Import**: Acquire the sync lock before synchronous import and live-config projection to avoid a nested-executor panic when importing or restoring SQL backups. Fixes [#453](SaladDay/cc-switch-cli#453).
- **TUI / Claude Quick Config**: Correct the displayed item total in the quick-configuration menu. Fixes [#435](SaladDay/cc-switch-cli#435).

## Upgrade notes

- The database schema remains at v18; upgrading from v5.10.4 requires no schema migration.
- Shared Codex sessions are opt-in and limited to macOS/Linux. Keep the persistent `.cc-switch-launches/` directories, allow only one shared launch per provider, and close a session before continuing it through another provider. See the [shared-session usage notes](https://github.com/SaladDay/cc-switch-cli/blob/v5.10.5/README.md) for argument restrictions and cross-provider limitations.
- GPT-6 Astra uses the existing standard-rate calculator. Long-context and service-tier pricing are outside this release's pricing change.

## Update

```bash
cc-switch update
```

Or use the macOS/Linux installer:

```bash
curl -fsSL https://github.com/SaladDay/cc-switch-cli/releases/latest/download/install.sh | bash
```

## Thank you

Thank you to everyone who opened an issue or pull request, shared diagnostics, reviewed a change, or joined a discussion. This list covers issues and pull requests active since v5.10.4, including participants in their earlier discussions.

| Contributor | Issues and pull requests |
| --- | --- |
| [@6UOOON9](https://github.com/6UOOON9) | [#447](SaladDay/cc-switch-cli#447) |
| [@ChanthMiao](https://github.com/ChanthMiao) | [#409](SaladDay/cc-switch-cli#409) |
| [@Curious-r](https://github.com/Curious-r) | [#441](SaladDay/cc-switch-cli#441), [#443](SaladDay/cc-switch-cli#443) |
| [@czfhhh](https://github.com/czfhhh) | [#454](SaladDay/cc-switch-cli#454) |
| [@Devin-Pi](https://github.com/Devin-Pi) | [#358](SaladDay/cc-switch-cli#358), [#446](SaladDay/cc-switch-cli#446) |
| [@dividduang](https://github.com/dividduang) | [#358](SaladDay/cc-switch-cli#358) |
| [@GMOogway](https://github.com/GMOogway) | [#433](SaladDay/cc-switch-cli#433) |
| [@HappyLiang12](https://github.com/HappyLiang12) | [#448](SaladDay/cc-switch-cli#448) |
| [@jinjiwu](https://github.com/jinjiwu) | [#436](SaladDay/cc-switch-cli#436), [#445](SaladDay/cc-switch-cli#445) |
| [@JounQin](https://github.com/JounQin) | [#457](SaladDay/cc-switch-cli#457) |
| [@kelvkhiu](https://github.com/kelvkhiu) | [#444](SaladDay/cc-switch-cli#444) |
| [@moonjoke001](https://github.com/moonjoke001) | [#358](SaladDay/cc-switch-cli#358) |
| [@netcatty](https://github.com/netcatty) | [#450](SaladDay/cc-switch-cli#450) |
| [@neverdie0710](https://github.com/neverdie0710) | [#451](SaladDay/cc-switch-cli#451) |
| [@odup](https://github.com/odup) | [#453](SaladDay/cc-switch-cli#453) |
| [@paopjian](https://github.com/paopjian) | [#439](SaladDay/cc-switch-cli#439) |
| [@RainyPixel](https://github.com/RainyPixel) | [#449](SaladDay/cc-switch-cli#449) |
| [@SaladDay](https://github.com/SaladDay) | [#440](SaladDay/cc-switch-cli#440), [#442](SaladDay/cc-switch-cli#442), [#455](SaladDay/cc-switch-cli#455), [#456](SaladDay/cc-switch-cli#456), [#460](SaladDay/cc-switch-cli#460) |
| [@suntory1](https://github.com/suntory1) | [#358](SaladDay/cc-switch-cli#358) |
| [@SyaJask](https://github.com/SyaJask) | [#358](SaladDay/cc-switch-cli#358) |
| [@tangjunyi1](https://github.com/tangjunyi1) | [#458](SaladDay/cc-switch-cli#458) |
| [@TheBoYang](https://github.com/TheBoYang) | [#432](SaladDay/cc-switch-cli#432) |
| [@tianzhuwei](https://github.com/tianzhuwei) | [#358](SaladDay/cc-switch-cli#358) |
| [@Tonystarkw12](https://github.com/Tonystarkw12) | [#434](SaladDay/cc-switch-cli#434) |
| [@u1544096979](https://github.com/u1544096979) | [#437](SaladDay/cc-switch-cli#437), [#438](SaladDay/cc-switch-cli#438) |
| [@wangsiqidahaoren](https://github.com/wangsiqidahaoren) | [#459](SaladDay/cc-switch-cli#459) |
| [@wbbo](https://github.com/wbbo) | [#435](SaladDay/cc-switch-cli#435) |
| [@xiaoshidebug](https://github.com/xiaoshidebug) | [#452](SaladDay/cc-switch-cli#452) |

We also thank [@farion1231](https://github.com/farion1231) and upstream CC-Switch contributors, including [@zayokami](https://github.com/zayokami) for the [OpenCode Zen reasoning fix](farion1231/cc-switch#6123), and [@misaka-myu](https://github.com/misaka-myu) for the [user-owned catalog fix](farion1231/cc-switch#6087).

Some acknowledged reports and proposals remain open or are not included in this release; a thank-you does not imply that an issue is fixed or a pull request is merged.

See the [full changelog](https://github.com/SaladDay/cc-switch-cli/blob/v5.10.5/CHANGELOG.md) and [all changes since v5.10.4](SaladDay/cc-switch-cli@v5.10.4...v5.10.5).
</pre>
  <p>View the full release notes at <a href="https://github.com/SaladDay/cc-switch-cli/releases/tag/v5.10.5">https://github.com/SaladDay/cc-switch-cli/releases/tag/v5.10.5</a>.</p>
</details>
<hr>

See merge request: Harmonybrew/homebrew-core!20243
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants