Add support for Claude 3.5 Sonnet (#13371)

Antonio Scandurra created

Release Notes:

- Added support for Claude 3.5 Sonnet.

Change summary

crates/anthropic/src/anthropic.rs                   | 8 +++++++-
crates/assistant/src/assistant_settings.rs          | 8 +++++++-
crates/assistant/src/completion_provider/cloud.rs   | 5 ++++-
crates/assistant/src/completion_provider/open_ai.rs | 1 +
4 files changed, 19 insertions(+), 3 deletions(-)

Detailed changes

crates/anthropic/src/anthropic.rs 🔗

@@ -11,6 +11,8 @@ pub const ANTHROPIC_API_URL: &'static str = "https://api.anthropic.com";
 #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
 #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, EnumIter)]
 pub enum Model {
+    #[serde(alias = "claude-3-5-sonnet", rename = "claude-3-5-sonnet-20240620")]
+    Claude3_5Sonnet,
     #[default]
     #[serde(alias = "claude-3-opus", rename = "claude-3-opus-20240229")]
     Claude3Opus,
@@ -22,7 +24,9 @@ pub enum Model {
 
 impl Model {
     pub fn from_id(id: &str) -> Result<Self> {
-        if id.starts_with("claude-3-opus") {
+        if id.starts_with("claude-3-5-sonnet") {
+            Ok(Self::Claude3_5Sonnet)
+        } else if id.starts_with("claude-3-opus") {
             Ok(Self::Claude3Opus)
         } else if id.starts_with("claude-3-sonnet") {
             Ok(Self::Claude3Sonnet)
@@ -35,6 +39,7 @@ impl Model {
 
     pub fn id(&self) -> &'static str {
         match self {
+            Model::Claude3_5Sonnet => "claude-3-5-sonnet-20240620",
             Model::Claude3Opus => "claude-3-opus-20240229",
             Model::Claude3Sonnet => "claude-3-sonnet-20240229",
             Model::Claude3Haiku => "claude-3-opus-20240307",
@@ -43,6 +48,7 @@ impl Model {
 
     pub fn display_name(&self) -> &'static str {
         match self {
+            Self::Claude3_5Sonnet => "Claude 3.5 Sonnet",
             Self::Claude3Opus => "Claude 3 Opus",
             Self::Claude3Sonnet => "Claude 3 Sonnet",
             Self::Claude3Haiku => "Claude 3 Haiku",

crates/assistant/src/assistant_settings.rs 🔗

@@ -24,6 +24,7 @@ pub enum CloudModel {
     Gpt4Turbo,
     #[default]
     Gpt4Omni,
+    Claude3_5Sonnet,
     Claude3Opus,
     Claude3Sonnet,
     Claude3Haiku,
@@ -105,6 +106,7 @@ impl CloudModel {
             Self::Gpt4 => "gpt-4",
             Self::Gpt4Turbo => "gpt-4-turbo-preview",
             Self::Gpt4Omni => "gpt-4o",
+            Self::Claude3_5Sonnet => "claude-3-5-sonnet",
             Self::Claude3Opus => "claude-3-opus",
             Self::Claude3Sonnet => "claude-3-sonnet",
             Self::Claude3Haiku => "claude-3-haiku",
@@ -118,6 +120,7 @@ impl CloudModel {
             Self::Gpt4 => "GPT 4",
             Self::Gpt4Turbo => "GPT 4 Turbo",
             Self::Gpt4Omni => "GPT 4 Omni",
+            Self::Claude3_5Sonnet => "Claude 3.5 Sonnet",
             Self::Claude3Opus => "Claude 3 Opus",
             Self::Claude3Sonnet => "Claude 3 Sonnet",
             Self::Claude3Haiku => "Claude 3 Haiku",
@@ -130,7 +133,10 @@ impl CloudModel {
             Self::Gpt3Point5Turbo => 2048,
             Self::Gpt4 => 4096,
             Self::Gpt4Turbo | Self::Gpt4Omni => 128000,
-            Self::Claude3Opus | Self::Claude3Sonnet | Self::Claude3Haiku => 200000,
+            Self::Claude3_5Sonnet
+            | Self::Claude3Opus
+            | Self::Claude3Sonnet
+            | Self::Claude3Haiku => 200000,
             Self::Custom(_) => 4096, // TODO: Make this configurable
         }
     }

crates/assistant/src/completion_provider/cloud.rs 🔗

@@ -101,7 +101,10 @@ impl CloudCompletionProvider {
                 count_open_ai_tokens(request, cx.background_executor())
             }
             LanguageModel::Cloud(
-                CloudModel::Claude3Opus | CloudModel::Claude3Sonnet | CloudModel::Claude3Haiku,
+                CloudModel::Claude3_5Sonnet
+                | CloudModel::Claude3Opus
+                | CloudModel::Claude3Sonnet
+                | CloudModel::Claude3Haiku,
             ) => {
                 // Can't find a tokenizer for Claude 3, so for now just use the same as OpenAI's as an approximation.
                 count_open_ai_tokens(request, cx.background_executor())

crates/assistant/src/completion_provider/open_ai.rs 🔗

@@ -210,6 +210,7 @@ pub fn count_open_ai_tokens(
 
             match request.model {
                 LanguageModel::Anthropic(_)
+                | LanguageModel::Cloud(CloudModel::Claude3_5Sonnet)
                 | LanguageModel::Cloud(CloudModel::Claude3Opus)
                 | LanguageModel::Cloud(CloudModel::Claude3Sonnet)
                 | LanguageModel::Cloud(CloudModel::Claude3Haiku) => {