## Summary Fixes #47540 - Anthropic Claude models not appearing in GitHub Copilot Chat model picker. ## Problem Users reported that Anthropic Claude models (Claude Sonnet 4, Claude Opus 4, etc.) were not appearing in the model picker when using GitHub Copilot Chat, even though: - The GitHub Copilot API returns these models - The models have `model_picker_enabled: true` - Users have valid Copilot subscriptions with access to these models ## Root Cause The issue was in the `ModelSupportedEndpoint` enum deserialization. The enum only defined two variants: ```rust pub enum ModelSupportedEndpoint { #[serde(rename = "/chat/completions")] ChatCompletions, #[serde(rename = "/responses")] Responses, } ``` Anthropic Claude models use the `/v1/messages` endpoint, which wasn't defined. When deserializing the API response, serde failed with: ``` Error("unknown variant `/v1/messages`, expected `/chat/completions` or `/responses`") ``` Because the crate uses resilient deserialization via `deserialize_models_skip_errors()`, the entire Claude model was silently skipped rather than causing a hard failure. This meant users saw no error - the models simply didn't appear. ## Solution ### 1. Added `/v1/messages` endpoint variant ```rust pub enum ModelSupportedEndpoint { #[serde(rename = "/chat/completions")] ChatCompletions, #[serde(rename = "/responses")] Responses, #[serde(rename = "/v1/messages")] Messages, // NEW: Anthropic models use this endpoint #[serde(other)] Unknown, // NEW: Future-proofing for unknown endpoints } ``` ### 2. Removed incorrect `dedup_by()` call The previous code deduplicated models by family: ```rust .dedup_by(|a, b| a.capabilities.family == b.capabilities.family) ``` This incorrectly filtered out model variants that share the same family (e.g., `claude-sonnet-4` and `claude-sonnet-4-thinking`). Removed this call to preserve all model variants. ### 3. Removed unused import Removed `use itertools::Itertools;` which was only used for the now-removed `dedup_by()`. ## Changes | File | Change | |------|--------| | `crates/copilot_chat/src/copilot_chat.rs` | Added `Messages` and `Unknown` variants to `ModelSupportedEndpoint` enum | | `crates/copilot_chat/src/copilot_chat.rs` | Removed `.dedup_by()` call that incorrectly filtered models | | `crates/copilot_chat/src/copilot_chat.rs` | Removed unused `itertools::Itertools` import | | `crates/copilot_chat/src/copilot_chat.rs` | Added 8 new unit tests | ## Test Coverage Added 8 new unit tests to ensure the fix works and prevent regression: | Test | Purpose | |------|---------| | `test_models_with_pending_policy_deserialize` | Verifies models with non-"enabled" policy states deserialize correctly (they're filtered later) | | `test_multiple_anthropic_models_preserved` | Verifies multiple Claude models are not incorrectly deduplicated | | `test_models_with_same_family_both_preserved` | Verifies models sharing the same family (e.g., thinking variants) are both preserved | | `test_mixed_vendor_models_all_preserved` | Verifies models from different vendors (OpenAI, Anthropic, Google) are all preserved | | `test_model_with_messages_endpoint_deserializes` | **Critical test**: Verifies `/v1/messages` endpoint deserializes correctly | | `test_model_with_unknown_endpoint_deserializes` | Verifies unknown future endpoints deserialize to `Unknown` variant | | `test_model_with_multiple_endpoints` | Verifies models with multiple endpoints deserialize correctly | | `test_supports_response_method` | Verifies the `supports_response()` method logic for endpoint routing | ### Test Results ``` running 10 tests test tests::test_model_with_messages_endpoint_deserializes ... ok test tests::test_model_with_multiple_endpoints ... ok test tests::test_model_with_unknown_endpoint_deserializes ... ok test tests::test_models_with_pending_policy_deserialize ... ok test tests::test_models_with_same_family_both_preserved ... ok test tests::test_mixed_vendor_models_all_preserved ... ok test tests::test_multiple_anthropic_models_preserved ... ok test tests::test_resilient_model_schema_deserialize ... ok test tests::test_supports_response_method ... ok test tests::test_unknown_vendor_resilience ... ok test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out ``` ## How to Test Manually 1. Sign in to GitHub Copilot in Zed 2. Open the model picker (Agent panel → model selector dropdown) 3. Verify that Anthropic Claude models appear in the list: - Claude Sonnet 4 - Claude Opus 4 - Other Claude variants (if enabled in your GitHub Copilot settings) ## Checklist - [x] Code compiles without errors - [x] `./script/clippy --package copilot_chat` passes with no warnings - [x] All unit tests pass - [x] Change is focused on a single bug fix - [x] No unrelated refactoring or feature additions <img width="320" height="400" alt="Screenshot 2026-01-24 at 11 57 21 PM" src="https://github.com/user-attachments/assets/d5e17e1b-da80-4f4d-a218-d50d35114a21" /> Release Notes: - Fixed Anthropic models not appearing in the Copilot Chat model picker --------- Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
Zed
Welcome to Zed, a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.
Installation
On macOS, Linux, and Windows you can download Zed directly or install Zed via your local package manager (macOS/Linux/Windows).
Other platforms are not yet available:
- Web (tracking issue)
Developing Zed
Contributing
See CONTRIBUTING.md for ways you can contribute to Zed.
Also... we're hiring! Check out our jobs page for open roles.
Licensing
License information for third party dependencies must be correctly provided for CI to pass.
We use cargo-about to automatically comply with open source licenses. If CI is failing, check the following:
- Is it showing a
no license specifiederror for a crate you've created? If so, addpublish = falseunder[package]in your crate's Cargo.toml. - Is the error
failed to satisfy license requirementsfor a dependency? If so, first determine what license the project has and whether this system is sufficient to comply with this license's requirements. If you're unsure, ask a lawyer. Once you've verified that this system is acceptable add the license's SPDX identifier to theacceptedarray inscript/licenses/zed-licenses.toml. - Is
cargo-aboutunable to find the license for a dependency? If so, add a clarification field at the end ofscript/licenses/zed-licenses.toml, as specified in the cargo-about book.
Sponsorship
Zed is developed by Zed Industries, Inc., a for-profit company.
If you’d like to financially support the project, you can do so via GitHub Sponsors. Sponsorships go directly to Zed Industries and are used as general company revenue. There are no perks or entitlements associated with sponsorship.