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::ollama::OllamaLanguageModelProvider;
19use crate::provider::open_ai::OpenAiLanguageModelProvider;
20pub use crate::settings::*;
21pub use logging::report_assistant_event;
22
23pub fn init(
24 user_store: Model<UserStore>,
25 client: Arc<Client>,
26 fs: Arc<dyn Fs>,
27 cx: &mut AppContext,
28) {
29 crate::settings::init(fs, cx);
30 let registry = LanguageModelRegistry::global(cx);
31 registry.update(cx, |registry, cx| {
32 register_language_model_providers(registry, user_store, client, cx);
33 });
34}
35
36fn register_language_model_providers(
37 registry: &mut LanguageModelRegistry,
38 user_store: Model<UserStore>,
39 client: Arc<Client>,
40 cx: &mut ModelContext<LanguageModelRegistry>,
41) {
42 use feature_flags::FeatureFlagAppExt;
43
44 RefreshLlmTokenListener::register(client.clone(), cx);
45
46 registry.register_provider(
47 AnthropicLanguageModelProvider::new(client.http_client(), cx),
48 cx,
49 );
50 registry.register_provider(
51 OpenAiLanguageModelProvider::new(client.http_client(), cx),
52 cx,
53 );
54 registry.register_provider(
55 OllamaLanguageModelProvider::new(client.http_client(), cx),
56 cx,
57 );
58 registry.register_provider(
59 GoogleLanguageModelProvider::new(client.http_client(), cx),
60 cx,
61 );
62 registry.register_provider(CopilotChatLanguageModelProvider::new(cx), cx);
63
64 cx.observe_flag::<feature_flags::LanguageModels, _>(move |enabled, cx| {
65 let user_store = user_store.clone();
66 let client = client.clone();
67 LanguageModelRegistry::global(cx).update(cx, move |registry, cx| {
68 if enabled {
69 registry.register_provider(
70 CloudLanguageModelProvider::new(user_store.clone(), client.clone(), cx),
71 cx,
72 );
73 } else {
74 registry.unregister_provider(
75 LanguageModelProviderId::from(ZED_CLOUD_PROVIDER_ID.to_string()),
76 cx,
77 );
78 }
79 });
80 })
81 .detach();
82}