Release Notes: - Added Codestral edit predictions provider which can be enabled by adding an API key in the Mistral section of agent settings.  ## Config Get API key from https://console.mistral.ai/codestral and add it in the Mistral section of the agent settings. ``` "features": { "edit_prediction_provider": "codestral" }, "edit_predictions": { "codestral": { "model": "codestral-latest", "max_tokens": 150 } }, ``` --------- Co-authored-by: Michael Sloan <michael@zed.dev>
167 lines
5.3 KiB
Rust
167 lines
5.3 KiB
Rust
use std::sync::Arc;
|
|
|
|
use ::settings::{Settings, SettingsStore};
|
|
use client::{Client, UserStore};
|
|
use collections::HashSet;
|
|
use gpui::{App, Context, Entity};
|
|
use language_model::{LanguageModelProviderId, LanguageModelRegistry};
|
|
use provider::deepseek::DeepSeekLanguageModelProvider;
|
|
|
|
mod api_key;
|
|
pub mod provider;
|
|
mod settings;
|
|
pub mod ui;
|
|
|
|
use crate::provider::anthropic::AnthropicLanguageModelProvider;
|
|
use crate::provider::bedrock::BedrockLanguageModelProvider;
|
|
use crate::provider::cloud::CloudLanguageModelProvider;
|
|
use crate::provider::copilot_chat::CopilotChatLanguageModelProvider;
|
|
use crate::provider::google::GoogleLanguageModelProvider;
|
|
use crate::provider::lmstudio::LmStudioLanguageModelProvider;
|
|
pub use crate::provider::mistral::MistralLanguageModelProvider;
|
|
use crate::provider::ollama::OllamaLanguageModelProvider;
|
|
use crate::provider::open_ai::OpenAiLanguageModelProvider;
|
|
use crate::provider::open_ai_compatible::OpenAiCompatibleLanguageModelProvider;
|
|
use crate::provider::open_router::OpenRouterLanguageModelProvider;
|
|
use crate::provider::vercel::VercelLanguageModelProvider;
|
|
use crate::provider::x_ai::XAiLanguageModelProvider;
|
|
pub use crate::settings::*;
|
|
|
|
pub fn init(user_store: Entity<UserStore>, client: Arc<Client>, cx: &mut App) {
|
|
crate::settings::init_settings(cx);
|
|
let registry = LanguageModelRegistry::global(cx);
|
|
registry.update(cx, |registry, cx| {
|
|
register_language_model_providers(registry, user_store, client.clone(), cx);
|
|
});
|
|
|
|
let mut openai_compatible_providers = AllLanguageModelSettings::get_global(cx)
|
|
.openai_compatible
|
|
.keys()
|
|
.cloned()
|
|
.collect::<HashSet<_>>();
|
|
|
|
registry.update(cx, |registry, cx| {
|
|
register_openai_compatible_providers(
|
|
registry,
|
|
&HashSet::default(),
|
|
&openai_compatible_providers,
|
|
client.clone(),
|
|
cx,
|
|
);
|
|
});
|
|
cx.observe_global::<SettingsStore>(move |cx| {
|
|
let openai_compatible_providers_new = AllLanguageModelSettings::get_global(cx)
|
|
.openai_compatible
|
|
.keys()
|
|
.cloned()
|
|
.collect::<HashSet<_>>();
|
|
if openai_compatible_providers_new != openai_compatible_providers {
|
|
registry.update(cx, |registry, cx| {
|
|
register_openai_compatible_providers(
|
|
registry,
|
|
&openai_compatible_providers,
|
|
&openai_compatible_providers_new,
|
|
client.clone(),
|
|
cx,
|
|
);
|
|
});
|
|
openai_compatible_providers = openai_compatible_providers_new;
|
|
}
|
|
})
|
|
.detach();
|
|
}
|
|
|
|
fn register_openai_compatible_providers(
|
|
registry: &mut LanguageModelRegistry,
|
|
old: &HashSet<Arc<str>>,
|
|
new: &HashSet<Arc<str>>,
|
|
client: Arc<Client>,
|
|
cx: &mut Context<LanguageModelRegistry>,
|
|
) {
|
|
for provider_id in old {
|
|
if !new.contains(provider_id) {
|
|
registry.unregister_provider(LanguageModelProviderId::from(provider_id.clone()), cx);
|
|
}
|
|
}
|
|
|
|
for provider_id in new {
|
|
if !old.contains(provider_id) {
|
|
registry.register_provider(
|
|
Arc::new(OpenAiCompatibleLanguageModelProvider::new(
|
|
provider_id.clone(),
|
|
client.http_client(),
|
|
cx,
|
|
)),
|
|
cx,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
fn register_language_model_providers(
|
|
registry: &mut LanguageModelRegistry,
|
|
user_store: Entity<UserStore>,
|
|
client: Arc<Client>,
|
|
cx: &mut Context<LanguageModelRegistry>,
|
|
) {
|
|
registry.register_provider(
|
|
Arc::new(CloudLanguageModelProvider::new(
|
|
user_store,
|
|
client.clone(),
|
|
cx,
|
|
)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(AnthropicLanguageModelProvider::new(
|
|
client.http_client(),
|
|
cx,
|
|
)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(OpenAiLanguageModelProvider::new(client.http_client(), cx)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(OllamaLanguageModelProvider::new(client.http_client(), cx)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(LmStudioLanguageModelProvider::new(client.http_client(), cx)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(DeepSeekLanguageModelProvider::new(client.http_client(), cx)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(GoogleLanguageModelProvider::new(client.http_client(), cx)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
MistralLanguageModelProvider::global(client.http_client(), cx),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(BedrockLanguageModelProvider::new(client.http_client(), cx)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(OpenRouterLanguageModelProvider::new(
|
|
client.http_client(),
|
|
cx,
|
|
)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(VercelLanguageModelProvider::new(client.http_client(), cx)),
|
|
cx,
|
|
);
|
|
registry.register_provider(
|
|
Arc::new(XAiLanguageModelProvider::new(client.http_client(), cx)),
|
|
cx,
|
|
);
|
|
registry.register_provider(Arc::new(CopilotChatLanguageModelProvider::new(cx)), cx);
|
|
}
|