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}