diff --git a/crates/language_model/src/fake_provider.rs b/crates/language_model/src/fake_provider.rs index 9ce8ba333ad39eca3d1f559ec6313ecb8272543e..ebf727f93ee7e4e46d7566babc69cd41aaf2640a 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 38b4a10489b181dbea4c8928e491cd83057a75c6..3f4b6e1e079dcc79b548a9e0fb79a526387f5a6b 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 7694455cb78698d71991fe81995b2a45411f3c53..d1e65c56fd917b18bfb25e98f4c2cdde03047104 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 4b84e855919532d67f998532ae80eab34d0afbe0..ec827e5487c0c1570443af680bd9e83694b4f896 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 8fd21748f123a9fef470e416e3666e78c4c745b5..2d4945a004d48fd0934a59b6134abe4f05c0ce46 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 1307fdb5118a84ba2a74c38c4f75ba2c6f3b18e4..2e782278c1949d5e3da1c1b11b975cf6c60b210e 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 1e33e1071be67bba3828cb35f6c6fc13745f9d08..2f0f6f07b05fd36ab390d0d80739d7f639996d18 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 70ce0832c50dbebfe77fe40d1e1df45682a7d30d..a631038e8fd3645400a361565b8128bf6eb8091e 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 dacb0f72bd657b5f085a49d8a6d6b429c92a6857..de7caea1d30beca5462e1a616417a9593791fe28 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 6b509d4b4cdaa474f7cfd7cc06128882526e7c88..12bc5c44ddf9774a3e71baa708e9ba2d50f76e79 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 810c141e488d5739d38010ee2212242d4346194d..e5512d6c57ec9e75928eae7e49aa543cbb4fa2de 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 10c103eefbea17bdc530491cb973226adc6ced51..aa3e8e768041912bc2c140d021f64ad508128c50 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()) }