anthropic: Refactor a bit (#32685)

Marshall Bowers created

This PR applies some refactorings made in our other repos to this
version of the `anthropic` crate.

Release Notes:

- N/A

Change summary

crates/anthropic/src/anthropic.rs | 112 +++++++++++++++++++-------------
1 file changed, 66 insertions(+), 46 deletions(-)

Detailed changes

crates/anthropic/src/anthropic.rs 🔗

@@ -90,46 +90,66 @@ impl Model {
     }
 
     pub fn from_id(id: &str) -> Result<Self> {
+        if id.starts_with("claude-opus-4-thinking") {
+            return Ok(Self::ClaudeOpus4Thinking);
+        }
+
+        if id.starts_with("claude-opus-4") {
+            return Ok(Self::ClaudeOpus4);
+        }
+
+        if id.starts_with("claude-sonnet-4-thinking") {
+            return Ok(Self::ClaudeSonnet4Thinking);
+        }
+
+        if id.starts_with("claude-sonnet-4") {
+            return Ok(Self::ClaudeSonnet4);
+        }
+
+        if id.starts_with("claude-3-7-sonnet-thinking") {
+            return Ok(Self::Claude3_7SonnetThinking);
+        }
+
+        if id.starts_with("claude-3-7-sonnet") {
+            return Ok(Self::Claude3_7Sonnet);
+        }
+
         if id.starts_with("claude-3-5-sonnet") {
-            Ok(Self::Claude3_5Sonnet)
-        } else if id.starts_with("claude-3-7-sonnet-thinking") {
-            Ok(Self::Claude3_7SonnetThinking)
-        } else if id.starts_with("claude-3-7-sonnet") {
-            Ok(Self::Claude3_7Sonnet)
-        } else if id.starts_with("claude-3-5-haiku") {
-            Ok(Self::Claude3_5Haiku)
-        } else if id.starts_with("claude-3-opus") {
-            Ok(Self::Claude3Opus)
-        } else if id.starts_with("claude-3-sonnet") {
-            Ok(Self::Claude3Sonnet)
-        } else if id.starts_with("claude-3-haiku") {
-            Ok(Self::Claude3Haiku)
-        } else if id.starts_with("claude-opus-4-thinking") {
-            Ok(Self::ClaudeOpus4Thinking)
-        } else if id.starts_with("claude-opus-4") {
-            Ok(Self::ClaudeOpus4)
-        } else if id.starts_with("claude-sonnet-4-thinking") {
-            Ok(Self::ClaudeSonnet4Thinking)
-        } else if id.starts_with("claude-sonnet-4") {
-            Ok(Self::ClaudeSonnet4)
-        } else {
-            anyhow::bail!("invalid model id {id}");
+            return Ok(Self::Claude3_5Sonnet);
+        }
+
+        if id.starts_with("claude-3-5-haiku") {
+            return Ok(Self::Claude3_5Haiku);
+        }
+
+        if id.starts_with("claude-3-opus") {
+            return Ok(Self::Claude3Opus);
         }
+
+        if id.starts_with("claude-3-sonnet") {
+            return Ok(Self::Claude3Sonnet);
+        }
+
+        if id.starts_with("claude-3-haiku") {
+            return Ok(Self::Claude3Haiku);
+        }
+
+        Err(anyhow!("invalid model ID: {id}"))
     }
 
     pub fn id(&self) -> &str {
         match self {
-            Model::ClaudeOpus4 => "claude-opus-4-latest",
-            Model::ClaudeOpus4Thinking => "claude-opus-4-thinking-latest",
-            Model::ClaudeSonnet4 => "claude-sonnet-4-latest",
-            Model::ClaudeSonnet4Thinking => "claude-sonnet-4-thinking-latest",
-            Model::Claude3_5Sonnet => "claude-3-5-sonnet-latest",
-            Model::Claude3_7Sonnet => "claude-3-7-sonnet-latest",
-            Model::Claude3_7SonnetThinking => "claude-3-7-sonnet-thinking-latest",
-            Model::Claude3_5Haiku => "claude-3-5-haiku-latest",
-            Model::Claude3Opus => "claude-3-opus-latest",
-            Model::Claude3Sonnet => "claude-3-sonnet-20240229",
-            Model::Claude3Haiku => "claude-3-haiku-20240307",
+            Self::ClaudeOpus4 => "claude-opus-4-latest",
+            Self::ClaudeOpus4Thinking => "claude-opus-4-thinking-latest",
+            Self::ClaudeSonnet4 => "claude-sonnet-4-latest",
+            Self::ClaudeSonnet4Thinking => "claude-sonnet-4-thinking-latest",
+            Self::Claude3_5Sonnet => "claude-3-5-sonnet-latest",
+            Self::Claude3_7Sonnet => "claude-3-7-sonnet-latest",
+            Self::Claude3_7SonnetThinking => "claude-3-7-sonnet-thinking-latest",
+            Self::Claude3_5Haiku => "claude-3-5-haiku-latest",
+            Self::Claude3Opus => "claude-3-opus-latest",
+            Self::Claude3Sonnet => "claude-3-sonnet-20240229",
+            Self::Claude3Haiku => "claude-3-haiku-20240307",
             Self::Custom { name, .. } => name,
         }
     }
@@ -137,24 +157,24 @@ impl Model {
     /// The id of the model that should be used for making API requests
     pub fn request_id(&self) -> &str {
         match self {
-            Model::ClaudeOpus4 | Model::ClaudeOpus4Thinking => "claude-opus-4-20250514",
-            Model::ClaudeSonnet4 | Model::ClaudeSonnet4Thinking => "claude-sonnet-4-20250514",
-            Model::Claude3_5Sonnet => "claude-3-5-sonnet-latest",
-            Model::Claude3_7Sonnet | Model::Claude3_7SonnetThinking => "claude-3-7-sonnet-latest",
-            Model::Claude3_5Haiku => "claude-3-5-haiku-latest",
-            Model::Claude3Opus => "claude-3-opus-latest",
-            Model::Claude3Sonnet => "claude-3-sonnet-20240229",
-            Model::Claude3Haiku => "claude-3-haiku-20240307",
+            Self::ClaudeOpus4 | Self::ClaudeOpus4Thinking => "claude-opus-4-20250514",
+            Self::ClaudeSonnet4 | Self::ClaudeSonnet4Thinking => "claude-sonnet-4-20250514",
+            Self::Claude3_5Sonnet => "claude-3-5-sonnet-latest",
+            Self::Claude3_7Sonnet | Self::Claude3_7SonnetThinking => "claude-3-7-sonnet-latest",
+            Self::Claude3_5Haiku => "claude-3-5-haiku-latest",
+            Self::Claude3Opus => "claude-3-opus-latest",
+            Self::Claude3Sonnet => "claude-3-sonnet-20240229",
+            Self::Claude3Haiku => "claude-3-haiku-20240307",
             Self::Custom { name, .. } => name,
         }
     }
 
     pub fn display_name(&self) -> &str {
         match self {
-            Model::ClaudeOpus4 => "Claude Opus 4",
-            Model::ClaudeOpus4Thinking => "Claude Opus 4 Thinking",
-            Model::ClaudeSonnet4 => "Claude Sonnet 4",
-            Model::ClaudeSonnet4Thinking => "Claude Sonnet 4 Thinking",
+            Self::ClaudeOpus4 => "Claude Opus 4",
+            Self::ClaudeOpus4Thinking => "Claude Opus 4 Thinking",
+            Self::ClaudeSonnet4 => "Claude Sonnet 4",
+            Self::ClaudeSonnet4Thinking => "Claude Sonnet 4 Thinking",
             Self::Claude3_7Sonnet => "Claude 3.7 Sonnet",
             Self::Claude3_5Sonnet => "Claude 3.5 Sonnet",
             Self::Claude3_7SonnetThinking => "Claude 3.7 Sonnet Thinking",