1use std::sync::Arc;
2
3use client::{Client, UserStore};
4use fs::Fs;
5use gpui::{App, Context, Entity};
6use language_model::{LanguageModelProviderId, LanguageModelRegistry, ZED_CLOUD_PROVIDER_ID};
7use provider::deepseek::DeepSeekLanguageModelProvider;
8
9pub mod provider;
10mod settings;
11
12use crate::provider::anthropic::AnthropicLanguageModelProvider;
13use crate::provider::bedrock::BedrockLanguageModelProvider;
14use crate::provider::cloud::CloudLanguageModelProvider;
15use crate::provider::copilot_chat::CopilotChatLanguageModelProvider;
16use crate::provider::google::GoogleLanguageModelProvider;
17use crate::provider::lmstudio::LmStudioLanguageModelProvider;
18use crate::provider::mistral::MistralLanguageModelProvider;
19use crate::provider::ollama::OllamaLanguageModelProvider;
20use crate::provider::open_ai::OpenAiLanguageModelProvider;
21pub use crate::settings::*;
22
23pub fn init(user_store: Entity<UserStore>, client: Arc<Client>, fs: Arc<dyn Fs>, cx: &mut App) {
24 crate::settings::init(fs, cx);
25 let registry = LanguageModelRegistry::global(cx);
26 registry.update(cx, |registry, cx| {
27 register_language_model_providers(registry, user_store, client, cx);
28 });
29}
30
31fn register_language_model_providers(
32 registry: &mut LanguageModelRegistry,
33 user_store: Entity<UserStore>,
34 client: Arc<Client>,
35 cx: &mut Context<LanguageModelRegistry>,
36) {
37 use feature_flags::FeatureFlagAppExt;
38
39 registry.register_provider(
40 AnthropicLanguageModelProvider::new(client.http_client(), cx),
41 cx,
42 );
43 registry.register_provider(
44 OpenAiLanguageModelProvider::new(client.http_client(), cx),
45 cx,
46 );
47 registry.register_provider(
48 OllamaLanguageModelProvider::new(client.http_client(), cx),
49 cx,
50 );
51 registry.register_provider(
52 LmStudioLanguageModelProvider::new(client.http_client(), cx),
53 cx,
54 );
55 registry.register_provider(
56 DeepSeekLanguageModelProvider::new(client.http_client(), cx),
57 cx,
58 );
59 registry.register_provider(
60 GoogleLanguageModelProvider::new(client.http_client(), cx),
61 cx,
62 );
63 registry.register_provider(
64 MistralLanguageModelProvider::new(client.http_client(), cx),
65 cx,
66 );
67 registry.register_provider(
68 BedrockLanguageModelProvider::new(client.http_client(), cx),
69 cx,
70 );
71 registry.register_provider(CopilotChatLanguageModelProvider::new(cx), cx);
72
73 cx.observe_flag::<feature_flags::LanguageModels, _>(move |enabled, cx| {
74 let user_store = user_store.clone();
75 let client = client.clone();
76 LanguageModelRegistry::global(cx).update(cx, move |registry, cx| {
77 if enabled {
78 registry.register_provider(
79 CloudLanguageModelProvider::new(user_store.clone(), client.clone(), cx),
80 cx,
81 );
82 } else {
83 registry.unregister_provider(
84 LanguageModelProviderId::from(ZED_CLOUD_PROVIDER_ID.to_string()),
85 cx,
86 );
87 }
88 });
89 })
90 .detach();
91}