copilot: Add Claude 3.7 Sonnet to Copilot Chat (#25529)

zhaopeng and Peter Tripp created

- Follow-up to: https://github.com/zed-industries/zed/issues/25488

Co-authored-by: Peter Tripp <peter@zed.dev>

Change summary

crates/copilot/src/copilot_chat.rs                  | 14 ++++++++++++--
crates/language_models/src/provider/copilot_chat.rs |  5 ++++-
2 files changed, 16 insertions(+), 3 deletions(-)

Detailed changes

crates/copilot/src/copilot_chat.rs 🔗

@@ -40,6 +40,8 @@ pub enum Model {
     O3Mini,
     #[serde(alias = "claude-3-5-sonnet", rename = "claude-3.5-sonnet")]
     Claude3_5Sonnet,
+    #[serde(alias = "claude-3-7-sonnet", rename = "claude-3.7-sonnet")]
+    Claude3_7Sonnet,
     #[serde(alias = "gemini-2.0-flash", rename = "gemini-2.0-flash-001")]
     Gemini20Flash,
 }
@@ -47,7 +49,11 @@ pub enum Model {
 impl Model {
     pub fn uses_streaming(&self) -> bool {
         match self {
-            Self::Gpt4o | Self::Gpt4 | Self::Gpt3_5Turbo | Self::Claude3_5Sonnet => true,
+            Self::Gpt4o
+            | Self::Gpt4
+            | Self::Gpt3_5Turbo
+            | Self::Claude3_5Sonnet
+            | Self::Claude3_7Sonnet => true,
             Self::O3Mini | Self::O1 | Self::Gemini20Flash => false,
         }
     }
@@ -60,6 +66,7 @@ impl Model {
             "o1" => Ok(Self::O1),
             "o3-mini" => Ok(Self::O3Mini),
             "claude-3-5-sonnet" => Ok(Self::Claude3_5Sonnet),
+            "claude-3-7-sonnet" => Ok(Self::Claude3_7Sonnet),
             "gemini-2.0-flash-001" => Ok(Self::Gemini20Flash),
             _ => Err(anyhow!("Invalid model id: {}", id)),
         }
@@ -73,6 +80,7 @@ impl Model {
             Self::O3Mini => "o3-mini",
             Self::O1 => "o1",
             Self::Claude3_5Sonnet => "claude-3-5-sonnet",
+            Self::Claude3_7Sonnet => "claude-3-7-sonnet",
             Self::Gemini20Flash => "gemini-2.0-flash-001",
         }
     }
@@ -85,6 +93,7 @@ impl Model {
             Self::O3Mini => "o3-mini",
             Self::O1 => "o1",
             Self::Claude3_5Sonnet => "Claude 3.5 Sonnet",
+            Self::Claude3_7Sonnet => "Claude 3.7 Sonnet",
             Self::Gemini20Flash => "Gemini 2.0 Flash",
         }
     }
@@ -96,7 +105,8 @@ impl Model {
             Self::Gpt3_5Turbo => 12_288,
             Self::O3Mini => 64_000,
             Self::O1 => 20_000,
-            Self::Claude3_5Sonnet => 128_000,
+            Self::Claude3_5Sonnet => 200_000,
+            Self::Claude3_7Sonnet => 90_000,
             Model::Gemini20Flash => 128_000,
         }
     }

crates/language_models/src/provider/copilot_chat.rs 🔗

@@ -185,6 +185,7 @@ impl LanguageModel for CopilotChatLanguageModel {
     ) -> BoxFuture<'static, Result<usize>> {
         match self.model {
             CopilotChatModel::Claude3_5Sonnet => count_anthropic_tokens(request, cx),
+            CopilotChatModel::Claude3_7Sonnet => count_anthropic_tokens(request, cx),
             CopilotChatModel::Gemini20Flash => count_google_tokens(request, cx),
             _ => {
                 let model = match self.model {
@@ -192,7 +193,9 @@ impl LanguageModel for CopilotChatLanguageModel {
                     CopilotChatModel::Gpt4 => open_ai::Model::Four,
                     CopilotChatModel::Gpt3_5Turbo => open_ai::Model::ThreePointFiveTurbo,
                     CopilotChatModel::O1 | CopilotChatModel::O3Mini => open_ai::Model::Four,
-                    CopilotChatModel::Claude3_5Sonnet | CopilotChatModel::Gemini20Flash => {
+                    CopilotChatModel::Claude3_5Sonnet
+                    | CopilotChatModel::Claude3_7Sonnet
+                    | CopilotChatModel::Gemini20Flash => {
                         unreachable!()
                     }
                 };