diff --git a/crates/language_model/src/fake_provider.rs b/crates/language_model/src/fake_provider.rs index 9ce8ba333a..ebf727f93e 100644 --- a/crates/language_model/src/fake_provider.rs +++ b/crates/language_model/src/fake_provider.rs @@ -153,6 +153,10 @@ impl LanguageModel for FakeLanguageModel { provider_name() } + fn supports_tools(&self) -> bool { + false + } + fn telemetry_id(&self) -> String { "fake".to_string() } diff --git a/crates/language_model/src/language_model.rs b/crates/language_model/src/language_model.rs index 38b4a10489..3f4b6e1e07 100644 --- a/crates/language_model/src/language_model.rs +++ b/crates/language_model/src/language_model.rs @@ -185,6 +185,9 @@ pub trait LanguageModel: Send + Sync { LanguageModelAvailability::Public } + /// Whether this model supports tools. + fn supports_tools(&self) -> bool; + fn tool_input_format(&self) -> LanguageModelToolSchemaFormat { LanguageModelToolSchemaFormat::JsonSchema } diff --git a/crates/language_models/src/provider/anthropic.rs b/crates/language_models/src/provider/anthropic.rs index 7694455cb7..d1e65c56fd 100644 --- a/crates/language_models/src/provider/anthropic.rs +++ b/crates/language_models/src/provider/anthropic.rs @@ -400,6 +400,10 @@ impl LanguageModel for AnthropicModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + true + } + fn telemetry_id(&self) -> String { format!("anthropic/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/bedrock.rs b/crates/language_models/src/provider/bedrock.rs index 4b84e85591..ec827e5487 100644 --- a/crates/language_models/src/provider/bedrock.rs +++ b/crates/language_models/src/provider/bedrock.rs @@ -365,6 +365,10 @@ impl LanguageModel for BedrockModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + true + } + fn telemetry_id(&self) -> String { format!("bedrock/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/cloud.rs b/crates/language_models/src/provider/cloud.rs index 8fd21748f1..2d4945a004 100644 --- a/crates/language_models/src/provider/cloud.rs +++ b/crates/language_models/src/provider/cloud.rs @@ -557,6 +557,14 @@ impl LanguageModel for CloudLanguageModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + match self.model { + CloudModel::Anthropic(_) => true, + CloudModel::Google(_) => true, + CloudModel::OpenAi(_) => false, + } + } + fn telemetry_id(&self) -> String { format!("zed.dev/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/copilot_chat.rs b/crates/language_models/src/provider/copilot_chat.rs index 1307fdb511..2e782278c1 100644 --- a/crates/language_models/src/provider/copilot_chat.rs +++ b/crates/language_models/src/provider/copilot_chat.rs @@ -180,6 +180,15 @@ impl LanguageModel for CopilotChatLanguageModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + match self.model { + CopilotChatModel::Claude3_5Sonnet + | CopilotChatModel::Claude3_7Sonnet + | CopilotChatModel::Claude3_7SonnetThinking => true, + _ => false, + } + } + fn telemetry_id(&self) -> String { format!("copilot_chat/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/deepseek.rs b/crates/language_models/src/provider/deepseek.rs index 1e33e1071b..2f0f6f07b0 100644 --- a/crates/language_models/src/provider/deepseek.rs +++ b/crates/language_models/src/provider/deepseek.rs @@ -279,6 +279,10 @@ impl LanguageModel for DeepSeekLanguageModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + false + } + fn telemetry_id(&self) -> String { format!("deepseek/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/google.rs b/crates/language_models/src/provider/google.rs index 70ce0832c5..a631038e8f 100644 --- a/crates/language_models/src/provider/google.rs +++ b/crates/language_models/src/provider/google.rs @@ -296,6 +296,10 @@ impl LanguageModel for GoogleLanguageModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + true + } + fn tool_input_format(&self) -> LanguageModelToolSchemaFormat { LanguageModelToolSchemaFormat::JsonSchemaSubset } diff --git a/crates/language_models/src/provider/lmstudio.rs b/crates/language_models/src/provider/lmstudio.rs index dacb0f72bd..de7caea1d3 100644 --- a/crates/language_models/src/provider/lmstudio.rs +++ b/crates/language_models/src/provider/lmstudio.rs @@ -273,6 +273,10 @@ impl LanguageModel for LmStudioLanguageModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + false + } + fn telemetry_id(&self) -> String { format!("lmstudio/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/mistral.rs b/crates/language_models/src/provider/mistral.rs index 6b509d4b4c..12bc5c44dd 100644 --- a/crates/language_models/src/provider/mistral.rs +++ b/crates/language_models/src/provider/mistral.rs @@ -291,6 +291,10 @@ impl LanguageModel for MistralLanguageModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + false + } + fn telemetry_id(&self) -> String { format!("mistral/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/ollama.rs b/crates/language_models/src/provider/ollama.rs index 810c141e48..e5512d6c57 100644 --- a/crates/language_models/src/provider/ollama.rs +++ b/crates/language_models/src/provider/ollama.rs @@ -300,6 +300,10 @@ impl LanguageModel for OllamaLanguageModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + false + } + fn telemetry_id(&self) -> String { format!("ollama/{}", self.model.id()) } diff --git a/crates/language_models/src/provider/open_ai.rs b/crates/language_models/src/provider/open_ai.rs index 10c103eefb..aa3e8e7680 100644 --- a/crates/language_models/src/provider/open_ai.rs +++ b/crates/language_models/src/provider/open_ai.rs @@ -290,6 +290,10 @@ impl LanguageModel for OpenAiLanguageModel { LanguageModelProviderName(PROVIDER_NAME.into()) } + fn supports_tools(&self) -> bool { + false + } + fn telemetry_id(&self) -> String { format!("openai/{}", self.model.id()) }