499 lines · 17.3 KB · Rust
RawDownload
use crate::merge_from::MergeFrom;use collections::HashMap;use language_model_core::ReasoningEffort;use schemars::JsonSchema;use serde::{Deserialize, Serialize};use settings_macros::{MergeFrom, with_fallible_options}; use std::sync::Arc; #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct AllLanguageModelSettingsContent {    pub anthropic: Option<AnthropicSettingsContent>,    pub bedrock: Option<AmazonBedrockSettingsContent>,    pub deepseek: Option<DeepseekSettingsContent>,    pub google: Option<GoogleSettingsContent>,    pub lmstudio: Option<LmStudioSettingsContent>,    pub mistral: Option<MistralSettingsContent>,    pub ollama: Option<OllamaSettingsContent>,    pub opencode: Option<OpenCodeSettingsContent>,    pub open_router: Option<OpenRouterSettingsContent>,    pub openai: Option<OpenAiSettingsContent>,    pub openai_compatible: Option<HashMap<Arc<str>, OpenAiCompatibleSettingsContent>>,    pub vercel_ai_gateway: Option<VercelAiGatewaySettingsContent>,    pub x_ai: Option<XAiSettingsContent>,    #[serde(rename = "zed.dev")]    pub zed_dot_dev: Option<ZedDotDevSettingsContent>,} #[with_fallible_options]#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct AnthropicSettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<AnthropicAvailableModel>>,} #[with_fallible_options]#[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 agent panel.    pub display_name: Option<String>,    /// 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<String>,    /// Configuration of Anthropic's caching API.    pub cache_configuration: Option<LanguageModelCacheConfiguration>,    pub max_output_tokens: Option<u64>,    #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")]    pub default_temperature: Option<f32>,    #[serde(default)]    pub extra_beta_headers: Vec<String>,    /// The model's mode (e.g. thinking)    pub mode: Option<ModelMode>,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct AmazonBedrockSettingsContent {    pub available_models: Option<Vec<BedrockAvailableModel>>,    pub endpoint_url: Option<String>,    pub region: Option<String>,    pub profile: Option<String>,    pub authentication_method: Option<BedrockAuthMethodContent>,    pub allow_global: Option<bool>,    /// The guardrail identifier (ARN or ID) to apply to Bedrock API requests.    pub guardrail_identifier: Option<String>,    /// The guardrail version to use. Defaults to "DRAFT" if not specified.    pub guardrail_version: Option<String>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct BedrockAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub cache_configuration: Option<LanguageModelCacheConfiguration>,    pub max_output_tokens: Option<u64>,    #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")]    pub default_temperature: Option<f32>,    pub mode: Option<ModelMode>,} #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub enum BedrockAuthMethodContent {    #[serde(rename = "named_profile")]    NamedProfile,    #[serde(rename = "sso")]    SingleSignOn,    #[serde(rename = "api_key")]    ApiKey,    /// IMDSv2, PodIdentity, env vars, etc.    #[serde(rename = "default")]    Automatic,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct OllamaSettingsContent {    pub api_url: Option<String>,    pub auto_discover: Option<bool>,    pub available_models: Option<Vec<OllamaAvailableModel>>,    pub context_window: Option<u64>,} #[with_fallible_options]#[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 agent panel.    pub display_name: Option<String>,    /// 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<KeepAlive>,    /// Whether the model supports tools    pub supports_tools: Option<bool>,    /// Whether the model supports vision    pub supports_images: Option<bool>,    /// Whether to enable think mode    pub supports_thinking: Option<bool>,} #[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()    }} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct OpenCodeSettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<OpenCodeAvailableModel>>,    /// Whether to show OpenCode Zen models. Defaults to true.    pub show_zen_models: Option<bool>,    /// Whether to show OpenCode Go models. Defaults to true.    pub show_go_models: Option<bool>,    /// Whether to show OpenCode Free models. Defaults to true.    pub show_free_models: Option<bool>,} #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom)]#[serde(rename_all = "snake_case")]pub enum OpenCodeModelSubscription {    Zen,    Go,    Free,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct OpenCodeAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub max_output_tokens: Option<u64>,    /// The API protocol to use for this model: "anthropic", "openai_responses", "openai_chat", or "google".    pub protocol: String,    /// The subscription for this model: "zen", "go", or "free". Defaults to Zen.    pub subscription: Option<OpenCodeModelSubscription>,    /// Custom Model API URL to use for this model.    pub custom_model_api_url: Option<String>,    /// Supported reasoning effort levels, for example `["low", "medium", "high"].    pub reasoning_effort_levels: Option<Vec<ReasoningEffort>>,    /// When using OpenAiChat protocol, whether thinking tokens are sent as a dedicated `reasoning_content` field or inline in message text.    #[serde(default)]    pub interleaved_reasoning: bool,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct LmStudioSettingsContent {    pub api_url: Option<String>,    pub api_key: Option<String>,    pub available_models: Option<Vec<LmStudioAvailableModel>>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct LmStudioAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub supports_tool_calls: bool,    pub supports_images: bool,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct DeepseekSettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<DeepseekAvailableModel>>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct DeepseekAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub max_output_tokens: Option<u64>,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct MistralSettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<MistralAvailableModel>>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct MistralAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub max_output_tokens: Option<u64>,    pub max_completion_tokens: Option<u64>,    pub supports_tools: Option<bool>,    pub supports_images: Option<bool>,    pub supports_thinking: Option<bool>,} #[with_fallible_options]#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct OpenAiSettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<OpenAiAvailableModel>>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct OpenAiAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub max_output_tokens: Option<u64>,    pub max_completion_tokens: Option<u64>,    pub reasoning_effort: Option<OpenAiReasoningEffort>,    #[serde(default)]    pub capabilities: OpenAiModelCapabilities,} pub use language_model_core::ReasoningEffort as OpenAiReasoningEffort; impl MergeFrom for OpenAiReasoningEffort {    fn merge_from(&mut self, other: &Self) {        *self = *other;    }} #[with_fallible_options]#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct OpenAiCompatibleSettingsContent {    pub api_url: String,    pub available_models: Vec<OpenAiCompatibleAvailableModel>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct OpenAiModelCapabilities {    #[serde(default = "default_true")]    pub chat_completions: bool,    #[serde(default = "default_true")]    pub images: bool,} impl Default for OpenAiModelCapabilities {    fn default() -> Self {        Self {            chat_completions: default_true(),            images: default_true(),        }    }} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct OpenAiCompatibleAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub max_output_tokens: Option<u64>,    pub max_completion_tokens: Option<u64>,    pub reasoning_effort: Option<OpenAiReasoningEffort>,    #[serde(default)]    pub capabilities: OpenAiCompatibleModelCapabilities,} #[with_fallible_options]#[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,    #[serde(default = "default_true")]    pub chat_completions: bool,    #[serde(default)]    pub interleaved_reasoning: bool,} impl Default for OpenAiCompatibleModelCapabilities {    fn default() -> Self {        Self {            tools: true,            images: false,            parallel_tool_calls: false,            prompt_cache_key: false,            chat_completions: default_true(),            interleaved_reasoning: false,        }    }} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct VercelAiGatewaySettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<VercelAiGatewayAvailableModel>>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct VercelAiGatewayAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub max_output_tokens: Option<u64>,    pub max_completion_tokens: Option<u64>,    #[serde(default)]    pub capabilities: OpenAiCompatibleModelCapabilities,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct GoogleSettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<GoogleAvailableModel>>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct GoogleAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub mode: Option<ModelMode>,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct XAiSettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<XaiAvailableModel>>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct XaiAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub max_output_tokens: Option<u64>,    pub max_completion_tokens: Option<u64>,    pub supports_images: Option<bool>,    pub supports_tools: Option<bool>,    pub parallel_tool_calls: Option<bool>,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct ZedDotDevSettingsContent {    pub available_models: Option<Vec<ZedDotDevAvailableModel>>,} #[with_fallible_options]#[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 agent panel model dropdown menu.    pub display_name: Option<String>,    /// 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<u64>,    /// The maximum number of completion tokens allowed by the model (o1-* only)    pub max_completion_tokens: Option<u64>,    /// Override this model with a different Anthropic model for tool calls.    pub tool_override: Option<String>,    /// Indicates whether this custom model supports caching.    pub cache_configuration: Option<LanguageModelCacheConfiguration>,    /// The default temperature to use for this model.    #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")]    pub default_temperature: Option<f32>,    /// Any extra beta headers to provide when using the model.    #[serde(default)]    pub extra_beta_headers: Vec<String>,    /// The model's mode (e.g. thinking)    pub mode: Option<ModelMode>,} #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]#[serde(rename_all = "lowercase")]pub enum ZedDotDevAvailableProvider {    Anthropic,    OpenAi,    Google,} #[with_fallible_options]#[derive(Default, Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]pub struct OpenRouterSettingsContent {    pub api_url: Option<String>,    pub available_models: Option<Vec<OpenRouterAvailableModel>>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct OpenRouterAvailableModel {    pub name: String,    pub display_name: Option<String>,    pub max_tokens: u64,    pub max_output_tokens: Option<u64>,    pub max_completion_tokens: Option<u64>,    pub supports_tools: Option<bool>,    pub supports_images: Option<bool>,    pub mode: Option<ModelMode>,    pub provider: Option<OpenRouterProvider>,} #[with_fallible_options]#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]pub struct OpenRouterProvider {    order: Option<Vec<String>>,    #[serde(default = "default_true")]    allow_fallbacks: bool,    #[serde(default)]    require_parameters: bool,    #[serde(default)]    data_collection: DataCollection,    only: Option<Vec<String>>,    ignore: Option<Vec<String>>,    quantizations: Option<Vec<String>>,    sort: Option<String>,} #[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom)]#[serde(rename_all = "lowercase")]pub enum DataCollection {    #[default]    Allow,    Disallow,} fn default_true() -> bool {    true} /// Configuration for caching language model messages.#[with_fallible_options]#[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,} pub use language_model_core::ModelMode; impl MergeFrom for ModelMode {    fn merge_from(&mut self, other: &Self) {        *self = *other;    }}