1use std::sync::Arc;
  2
  3use ::settings::{Settings, SettingsStore};
  4use client::{Client, UserStore};
  5use collections::HashSet;
  6use gpui::{App, Context, Entity};
  7use language_model::{LanguageModelProviderId, LanguageModelRegistry};
  8use provider::deepseek::DeepSeekLanguageModelProvider;
  9
 10mod api_key;
 11pub mod provider;
 12mod settings;
 13pub mod ui;
 14
 15use crate::provider::anthropic::AnthropicLanguageModelProvider;
 16use crate::provider::bedrock::BedrockLanguageModelProvider;
 17use crate::provider::cloud::CloudLanguageModelProvider;
 18use crate::provider::copilot_chat::CopilotChatLanguageModelProvider;
 19use crate::provider::google::GoogleLanguageModelProvider;
 20use crate::provider::lmstudio::LmStudioLanguageModelProvider;
 21pub use crate::provider::mistral::MistralLanguageModelProvider;
 22use crate::provider::ollama::OllamaLanguageModelProvider;
 23use crate::provider::open_ai::OpenAiLanguageModelProvider;
 24use crate::provider::open_ai_compatible::OpenAiCompatibleLanguageModelProvider;
 25use crate::provider::open_router::OpenRouterLanguageModelProvider;
 26use crate::provider::vercel::VercelLanguageModelProvider;
 27use crate::provider::x_ai::XAiLanguageModelProvider;
 28pub use crate::settings::*;
 29
 30pub fn init(user_store: Entity<UserStore>, client: Arc<Client>, cx: &mut App) {
 31    crate::settings::init_settings(cx);
 32    let registry = LanguageModelRegistry::global(cx);
 33    registry.update(cx, |registry, cx| {
 34        register_language_model_providers(registry, user_store, client.clone(), cx);
 35    });
 36
 37    let mut openai_compatible_providers = AllLanguageModelSettings::get_global(cx)
 38        .openai_compatible
 39        .keys()
 40        .cloned()
 41        .collect::<HashSet<_>>();
 42
 43    registry.update(cx, |registry, cx| {
 44        register_openai_compatible_providers(
 45            registry,
 46            &HashSet::default(),
 47            &openai_compatible_providers,
 48            client.clone(),
 49            cx,
 50        );
 51    });
 52    cx.observe_global::<SettingsStore>(move |cx| {
 53        let openai_compatible_providers_new = AllLanguageModelSettings::get_global(cx)
 54            .openai_compatible
 55            .keys()
 56            .cloned()
 57            .collect::<HashSet<_>>();
 58        if openai_compatible_providers_new != openai_compatible_providers {
 59            registry.update(cx, |registry, cx| {
 60                register_openai_compatible_providers(
 61                    registry,
 62                    &openai_compatible_providers,
 63                    &openai_compatible_providers_new,
 64                    client.clone(),
 65                    cx,
 66                );
 67            });
 68            openai_compatible_providers = openai_compatible_providers_new;
 69        }
 70    })
 71    .detach();
 72}
 73
 74fn register_openai_compatible_providers(
 75    registry: &mut LanguageModelRegistry,
 76    old: &HashSet<Arc<str>>,
 77    new: &HashSet<Arc<str>>,
 78    client: Arc<Client>,
 79    cx: &mut Context<LanguageModelRegistry>,
 80) {
 81    for provider_id in old {
 82        if !new.contains(provider_id) {
 83            registry.unregister_provider(LanguageModelProviderId::from(provider_id.clone()), cx);
 84        }
 85    }
 86
 87    for provider_id in new {
 88        if !old.contains(provider_id) {
 89            registry.register_provider(
 90                Arc::new(OpenAiCompatibleLanguageModelProvider::new(
 91                    provider_id.clone(),
 92                    client.http_client(),
 93                    cx,
 94                )),
 95                cx,
 96            );
 97        }
 98    }
 99}
100
101fn register_language_model_providers(
102    registry: &mut LanguageModelRegistry,
103    user_store: Entity<UserStore>,
104    client: Arc<Client>,
105    cx: &mut Context<LanguageModelRegistry>,
106) {
107    registry.register_provider(
108        Arc::new(CloudLanguageModelProvider::new(
109            user_store,
110            client.clone(),
111            cx,
112        )),
113        cx,
114    );
115    registry.register_provider(
116        Arc::new(AnthropicLanguageModelProvider::new(
117            client.http_client(),
118            cx,
119        )),
120        cx,
121    );
122    registry.register_provider(
123        Arc::new(OpenAiLanguageModelProvider::new(client.http_client(), cx)),
124        cx,
125    );
126    registry.register_provider(
127        Arc::new(OllamaLanguageModelProvider::new(client.http_client(), cx)),
128        cx,
129    );
130    registry.register_provider(
131        Arc::new(LmStudioLanguageModelProvider::new(client.http_client(), cx)),
132        cx,
133    );
134    registry.register_provider(
135        Arc::new(DeepSeekLanguageModelProvider::new(client.http_client(), cx)),
136        cx,
137    );
138    registry.register_provider(
139        Arc::new(GoogleLanguageModelProvider::new(client.http_client(), cx)),
140        cx,
141    );
142    registry.register_provider(
143        MistralLanguageModelProvider::global(client.http_client(), cx),
144        cx,
145    );
146    registry.register_provider(
147        Arc::new(BedrockLanguageModelProvider::new(client.http_client(), cx)),
148        cx,
149    );
150    registry.register_provider(
151        Arc::new(OpenRouterLanguageModelProvider::new(
152            client.http_client(),
153            cx,
154        )),
155        cx,
156    );
157    registry.register_provider(
158        Arc::new(VercelLanguageModelProvider::new(client.http_client(), cx)),
159        cx,
160    );
161    registry.register_provider(
162        Arc::new(XAiLanguageModelProvider::new(client.http_client(), cx)),
163        cx,
164    );
165    registry.register_provider(Arc::new(CopilotChatLanguageModelProvider::new(cx)), cx);
166}