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