From 03554763f3ce840a7aae0dfff2ae35127abbf496 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:21:32 +0000 Subject: [PATCH 1/3] Initial plan From 16584cac47918e463d51552b89ce389b432feeda Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:26:20 +0000 Subject: [PATCH 2/3] feat: update default provider mappings for latest codex sonnet opus models Co-authored-by: CaddyGlow <219252898+CaddyGlow@users.noreply.github.com> --- ccproxy/plugins/claude_shared/model_defaults.py | 8 ++++---- ccproxy/plugins/codex/model_defaults.py | 1 + tests/unit/utils/test_model_mapper.py | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ccproxy/plugins/claude_shared/model_defaults.py b/ccproxy/plugins/claude_shared/model_defaults.py index 5e283c31..0f488a1f 100644 --- a/ccproxy/plugins/claude_shared/model_defaults.py +++ b/ccproxy/plugins/claude_shared/model_defaults.py @@ -105,7 +105,7 @@ ), ModelMappingRule( match="gpt-4o", - target="claude-3-7-sonnet-20250219", + target="claude-sonnet-4-5-20250929", kind="prefix", ), ModelMappingRule( @@ -125,17 +125,17 @@ ), ModelMappingRule( match="o1", - target="claude-opus-4-20250514", + target="claude-opus-4-1-20250805", kind="prefix", ), ModelMappingRule( match="o3-mini", - target="claude-opus-4-20250514", + target="claude-opus-4-1-20250805", kind="exact", ), ModelMappingRule( match="gpt-5", - target="claude-sonnet-4-20250514", + target="claude-sonnet-4-5-20250929", kind="prefix", ), ModelMappingRule( diff --git a/ccproxy/plugins/codex/model_defaults.py b/ccproxy/plugins/codex/model_defaults.py index 852b15c1..b1e58a75 100644 --- a/ccproxy/plugins/codex/model_defaults.py +++ b/ccproxy/plugins/codex/model_defaults.py @@ -26,6 +26,7 @@ DEFAULT_CODEX_MODEL_MAPPINGS: list[ModelMappingRule] = [ + ModelMappingRule(match="gpt-5-codex", target="gpt-5-codex", kind="prefix"), ModelMappingRule(match="gpt-", target="gpt-5", kind="prefix"), ModelMappingRule(match="o3-", target="gpt-5", kind="prefix"), ModelMappingRule(match="o1-", target="gpt-5", kind="prefix"), diff --git a/tests/unit/utils/test_model_mapper.py b/tests/unit/utils/test_model_mapper.py index 17987cb9..b77b35ff 100644 --- a/tests/unit/utils/test_model_mapper.py +++ b/tests/unit/utils/test_model_mapper.py @@ -1,6 +1,8 @@ from __future__ import annotations from ccproxy.models.provider import ModelMappingRule +from ccproxy.plugins.claude_shared.model_defaults import DEFAULT_CLAUDE_MODEL_MAPPINGS +from ccproxy.plugins.codex.model_defaults import DEFAULT_CODEX_MODEL_MAPPINGS from ccproxy.utils.model_mapper import ( ModelMapper, add_model_alias, @@ -51,3 +53,18 @@ def test_restore_model_aliases_updates_nested_payloads() -> None: assert payload["model"] == "gpt-4o-mini" nested: dict[str, Any] = payload["choices"][0]["message"]["metadata"] assert nested["model"] == "gpt-4o-mini" + + +def test_default_claude_mapping_prefers_latest_sonnet_and_opus() -> None: + mapper = ModelMapper(DEFAULT_CLAUDE_MODEL_MAPPINGS) + + assert mapper.map("gpt-4o").mapped == "claude-sonnet-4-5-20250929" + assert mapper.map("gpt-5").mapped == "claude-sonnet-4-5-20250929" + assert mapper.map("o1-preview").mapped == "claude-opus-4-1-20250805" + assert mapper.map("o3-mini").mapped == "claude-opus-4-1-20250805" + + +def test_default_codex_mapping_keeps_latest_codex_model() -> None: + mapper = ModelMapper(DEFAULT_CODEX_MODEL_MAPPINGS) + + assert mapper.map("gpt-5-codex").mapped == "gpt-5-codex" From 7dc2a5b1b02a54cba7925bbbf54465f76d1fb612 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:31:51 +0000 Subject: [PATCH 3/3] feat: align claude and codex defaults with latest model docs Co-authored-by: CaddyGlow <219252898+CaddyGlow@users.noreply.github.com> --- .../plugins/claude_shared/model_defaults.py | 19 +++++++++++-------- ccproxy/plugins/codex/model_defaults.py | 18 +++++++++--------- tests/unit/utils/test_model_mapper.py | 12 +++++++----- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/ccproxy/plugins/claude_shared/model_defaults.py b/ccproxy/plugins/claude_shared/model_defaults.py index 0f488a1f..5f22adda 100644 --- a/ccproxy/plugins/claude_shared/model_defaults.py +++ b/ccproxy/plugins/claude_shared/model_defaults.py @@ -7,11 +7,11 @@ DEFAULT_CLAUDE_MODEL_CARDS: list[ModelCard] = [ ModelCard( - id="claude-sonnet-4-5-20250929", + id="claude-sonnet-4-6", created=1722816000, owned_by="anthropic", permission=[], - root="claude-sonnet-4-5-20250929", + root="claude-sonnet-4-6", parent=None, ), ModelCard( @@ -23,11 +23,11 @@ parent=None, ), ModelCard( - id="claude-opus-4-1-20250805", + id="claude-opus-4-6", created=1722816000, owned_by="anthropic", permission=[], - root="claude-opus-4-1-20250805", + root="claude-opus-4-6", parent=None, ), ModelCard( @@ -105,7 +105,7 @@ ), ModelMappingRule( match="gpt-4o", - target="claude-sonnet-4-5-20250929", + target="claude-sonnet-4-6", kind="prefix", ), ModelMappingRule( @@ -125,19 +125,22 @@ ), ModelMappingRule( match="o1", - target="claude-opus-4-1-20250805", + target="claude-opus-4-6", kind="prefix", ), ModelMappingRule( match="o3-mini", - target="claude-opus-4-1-20250805", + target="claude-opus-4-6", kind="exact", ), ModelMappingRule( match="gpt-5", - target="claude-sonnet-4-5-20250929", + target="claude-sonnet-4-6", kind="prefix", ), + ModelMappingRule(match="sonnet", target="claude-sonnet-4-6"), + ModelMappingRule(match="opus", target="claude-opus-4-6"), + ModelMappingRule(match="haiku", target="claude-haiku-4-5-20251001"), ModelMappingRule( match="claude-3-5-sonnet-latest", target="claude-3-5-sonnet-20241022", diff --git a/ccproxy/plugins/codex/model_defaults.py b/ccproxy/plugins/codex/model_defaults.py index b1e58a75..16005583 100644 --- a/ccproxy/plugins/codex/model_defaults.py +++ b/ccproxy/plugins/codex/model_defaults.py @@ -7,30 +7,30 @@ DEFAULT_CODEX_MODEL_CARDS: list[ModelCard] = [ ModelCard( - id="gpt-5", + id="gpt-5.3-codex", created=1723075200, owned_by="openai", permission=[], - root="gpt-5", + root="gpt-5.3-codex", parent=None, ), ModelCard( - id="gpt-5-codex", + id="gpt-5.2-codex", created=1726444800, owned_by="openai", permission=[], - root="gpt-5-codex", + root="gpt-5.2-codex", parent=None, ), ] DEFAULT_CODEX_MODEL_MAPPINGS: list[ModelMappingRule] = [ - ModelMappingRule(match="gpt-5-codex", target="gpt-5-codex", kind="prefix"), - ModelMappingRule(match="gpt-", target="gpt-5", kind="prefix"), - ModelMappingRule(match="o3-", target="gpt-5", kind="prefix"), - ModelMappingRule(match="o1-", target="gpt-5", kind="prefix"), - ModelMappingRule(match="claude-", target="gpt-5", kind="prefix"), + ModelMappingRule(match="gpt-5-codex", target="gpt-5.3-codex", kind="prefix"), + ModelMappingRule(match="gpt-", target="gpt-5.3-codex", kind="prefix"), + ModelMappingRule(match="o3-", target="gpt-5.3-codex", kind="prefix"), + ModelMappingRule(match="o1-", target="gpt-5.3-codex", kind="prefix"), + ModelMappingRule(match="claude-", target="gpt-5.3-codex", kind="prefix"), ] diff --git a/tests/unit/utils/test_model_mapper.py b/tests/unit/utils/test_model_mapper.py index b77b35ff..9477e4a2 100644 --- a/tests/unit/utils/test_model_mapper.py +++ b/tests/unit/utils/test_model_mapper.py @@ -58,13 +58,15 @@ def test_restore_model_aliases_updates_nested_payloads() -> None: def test_default_claude_mapping_prefers_latest_sonnet_and_opus() -> None: mapper = ModelMapper(DEFAULT_CLAUDE_MODEL_MAPPINGS) - assert mapper.map("gpt-4o").mapped == "claude-sonnet-4-5-20250929" - assert mapper.map("gpt-5").mapped == "claude-sonnet-4-5-20250929" - assert mapper.map("o1-preview").mapped == "claude-opus-4-1-20250805" - assert mapper.map("o3-mini").mapped == "claude-opus-4-1-20250805" + assert mapper.map("gpt-4o").mapped == "claude-sonnet-4-6" + assert mapper.map("gpt-5").mapped == "claude-sonnet-4-6" + assert mapper.map("o1-preview").mapped == "claude-opus-4-6" + assert mapper.map("o3-mini").mapped == "claude-opus-4-6" + assert mapper.map("sonnet").mapped == "claude-sonnet-4-6" + assert mapper.map("opus").mapped == "claude-opus-4-6" def test_default_codex_mapping_keeps_latest_codex_model() -> None: mapper = ModelMapper(DEFAULT_CODEX_MODEL_MAPPINGS) - assert mapper.map("gpt-5-codex").mapped == "gpt-5-codex" + assert mapper.map("gpt-5-codex").mapped == "gpt-5.3-codex"