use collections::HashMap; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; use settings_macros::MergeFrom; use std::sync::Arc; #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct AllLanguageModelSettingsContent { pub anthropic: Option, pub bedrock: Option, pub deepseek: Option, pub google: Option, pub lmstudio: Option, pub mistral: Option, pub ollama: Option, pub open_router: Option, pub openai: Option, pub openai_compatible: Option, OpenAiCompatibleSettingsContent>>, pub vercel: Option, pub x_ai: Option, #[serde(rename = "zed.dev")] pub zed_dot_dev: Option, } #[skip_serializing_none] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct AnthropicSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct AnthropicAvailableModel { /// The model's name in the Anthropic API. e.g. claude-3-5-sonnet-latest, claude-3-opus-20240229, etc pub name: String, /// The model's name in Zed's UI, such as in the model selector dropdown menu in the assistant panel. pub display_name: Option, /// The model's context window size. pub max_tokens: u64, /// A model `name` to substitute when calling tools, in case the primary model doesn't support tool calling. pub tool_override: Option, /// Configuration of Anthropic's caching API. pub cache_configuration: Option, pub max_output_tokens: Option, pub default_temperature: Option, #[serde(default)] pub extra_beta_headers: Vec, /// The model's mode (e.g. thinking) pub mode: Option, } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct AmazonBedrockSettingsContent { pub available_models: Option>, pub endpoint_url: Option, pub region: Option, pub profile: Option, pub authentication_method: Option, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct BedrockAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub cache_configuration: Option, pub max_output_tokens: Option, pub default_temperature: Option, pub mode: Option, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub enum BedrockAuthMethodContent { #[serde(rename = "named_profile")] NamedProfile, #[serde(rename = "sso")] SingleSignOn, /// IMDSv2, PodIdentity, env vars, etc. #[serde(rename = "default")] Automatic, } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct OllamaSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct OllamaAvailableModel { /// The model name in the Ollama API (e.g. "llama3.2:latest") pub name: String, /// The model's name in Zed's UI, such as in the model selector dropdown menu in the assistant panel. pub display_name: Option, /// The Context Length parameter to the model (aka num_ctx or n_ctx) pub max_tokens: u64, /// The number of seconds to keep the connection open after the last request pub keep_alive: Option, /// Whether the model supports tools pub supports_tools: Option, /// Whether the model supports vision pub supports_images: Option, /// Whether to enable think mode pub supports_thinking: Option, } #[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq, JsonSchema, MergeFrom)] #[serde(untagged)] pub enum KeepAlive { /// Keep model alive for N seconds Seconds(isize), /// Keep model alive for a fixed duration. Accepts durations like "5m", "10m", "1h", "1d", etc. Duration(String), } impl KeepAlive { /// Keep model alive until a new model is loaded or until Ollama shuts down pub fn indefinite() -> Self { Self::Seconds(-1) } } impl Default for KeepAlive { fn default() -> Self { Self::indefinite() } } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct LmStudioSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct LmStudioAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub supports_tool_calls: bool, pub supports_images: bool, } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct DeepseekSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct DeepseekAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub max_output_tokens: Option, } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct MistralSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct MistralAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub max_output_tokens: Option, pub max_completion_tokens: Option, pub supports_tools: Option, pub supports_images: Option, pub supports_thinking: Option, } #[skip_serializing_none] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct OpenAiSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct OpenAiAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub max_output_tokens: Option, pub max_completion_tokens: Option, pub reasoning_effort: Option, } #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, JsonSchema, MergeFrom)] #[serde(rename_all = "lowercase")] pub enum OpenAiReasoningEffort { Minimal, Low, Medium, High, } #[skip_serializing_none] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct OpenAiCompatibleSettingsContent { pub api_url: String, pub available_models: Vec, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct OpenAiCompatibleAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub max_output_tokens: Option, pub max_completion_tokens: Option, #[serde(default)] pub capabilities: OpenAiCompatibleModelCapabilities, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct OpenAiCompatibleModelCapabilities { pub tools: bool, pub images: bool, pub parallel_tool_calls: bool, pub prompt_cache_key: bool, } impl Default for OpenAiCompatibleModelCapabilities { fn default() -> Self { Self { tools: true, images: false, parallel_tool_calls: false, prompt_cache_key: false, } } } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct VercelSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct VercelAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub max_output_tokens: Option, pub max_completion_tokens: Option, } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct GoogleSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct GoogleAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub mode: Option, } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct XAiSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct XaiAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub max_output_tokens: Option, pub max_completion_tokens: Option, } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct ZedDotDevSettingsContent { pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct ZedDotDevAvailableModel { /// The provider of the language model. pub provider: ZedDotDevAvailableProvider, /// The model's name in the provider's API. e.g. claude-3-5-sonnet-20240620 pub name: String, /// The name displayed in the UI, such as in the assistant panel model dropdown menu. pub display_name: Option, /// The size of the context window, indicating the maximum number of tokens the model can process. pub max_tokens: usize, /// The maximum number of output tokens allowed by the model. pub max_output_tokens: Option, /// The maximum number of completion tokens allowed by the model (o1-* only) pub max_completion_tokens: Option, /// Override this model with a different Anthropic model for tool calls. pub tool_override: Option, /// Indicates whether this custom model supports caching. pub cache_configuration: Option, /// The default temperature to use for this model. pub default_temperature: Option, /// Any extra beta headers to provide when using the model. #[serde(default)] pub extra_beta_headers: Vec, /// The model's mode (e.g. thinking) pub mode: Option, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] #[serde(rename_all = "lowercase")] pub enum ZedDotDevAvailableProvider { Anthropic, OpenAi, Google, } #[skip_serializing_none] #[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)] pub struct OpenRouterSettingsContent { pub api_url: Option, pub available_models: Option>, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct OpenRouterAvailableModel { pub name: String, pub display_name: Option, pub max_tokens: u64, pub max_output_tokens: Option, pub max_completion_tokens: Option, pub supports_tools: Option, pub supports_images: Option, pub mode: Option, pub provider: Option, } #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct OpenRouterProvider { order: Option>, #[serde(default = "default_true")] allow_fallbacks: bool, #[serde(default)] require_parameters: bool, #[serde(default)] data_collection: DataCollection, only: Option>, ignore: Option>, quantizations: Option>, sort: Option, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] #[serde(rename_all = "lowercase")] pub enum DataCollection { Allow, Disallow, } impl Default for DataCollection { fn default() -> Self { Self::Allow } } fn default_true() -> bool { true } /// Configuration for caching language model messages. #[skip_serializing_none] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)] pub struct LanguageModelCacheConfiguration { pub max_cache_anchors: usize, pub should_speculate: bool, pub min_total_token: u64, } #[derive( Copy, Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom, )] #[serde(tag = "type", rename_all = "lowercase")] pub enum ModelMode { #[default] Default, Thinking { /// The maximum number of tokens to use for reasoning. Must be lower than the model's `max_output_tokens`. budget_tokens: Option, }, }