extension.rs

 1use ::extension::{
 2    ExtensionHostProxy, ExtensionLanguageModelProviderProxy, LanguageModelProviderRegistration,
 3};
 4use collections::HashMap;
 5use gpui::{App, Entity};
 6use language_model::{LanguageModelProviderId, LanguageModelRegistry};
 7use std::sync::{Arc, LazyLock};
 8
 9/// Maps built-in provider IDs to their corresponding extension IDs.
10/// When an extension with this ID is installed, the built-in provider should be hidden.
11static BUILTIN_TO_EXTENSION_MAP: LazyLock<HashMap<&'static str, &'static str>> =
12    LazyLock::new(|| {
13        let mut map = HashMap::default();
14        map.insert("anthropic", "anthropic");
15        map.insert("openai", "openai");
16        map.insert("google", "google-ai");
17        map.insert("openrouter", "open-router");
18        map.insert("copilot_chat", "copilot-chat");
19        map
20    });
21
22/// Returns the extension ID that should hide the given built-in provider.
23pub fn extension_for_builtin_provider(provider_id: &str) -> Option<&'static str> {
24    BUILTIN_TO_EXTENSION_MAP.get(provider_id).copied()
25}
26
27/// Proxy that registers extension language model providers with the LanguageModelRegistry.
28pub struct LanguageModelProviderRegistryProxy {
29    registry: Entity<LanguageModelRegistry>,
30}
31
32impl LanguageModelProviderRegistryProxy {
33    pub fn new(registry: Entity<LanguageModelRegistry>) -> Self {
34        Self { registry }
35    }
36}
37
38impl ExtensionLanguageModelProviderProxy for LanguageModelProviderRegistryProxy {
39    fn register_language_model_provider(
40        &self,
41        provider_id: Arc<str>,
42        register_fn: LanguageModelProviderRegistration,
43        cx: &mut App,
44    ) {
45        log::info!(
46            "LanguageModelProviderRegistryProxy::register_language_model_provider called for: {}",
47            provider_id
48        );
49        // The register_fn closure will call registry.register_provider internally
50        register_fn(cx);
51    }
52
53    fn unregister_language_model_provider(&self, provider_id: Arc<str>, cx: &mut App) {
54        self.registry.update(cx, |registry, cx| {
55            registry.unregister_provider(LanguageModelProviderId::from(provider_id), cx);
56        });
57    }
58}
59
60/// Initialize the extension language model provider proxy.
61/// This must be called BEFORE extension_host::init to ensure the proxy is available
62/// when extensions try to register their language model providers.
63pub fn init_proxy(cx: &mut App) {
64    let proxy = ExtensionHostProxy::default_global(cx);
65    let registry = LanguageModelRegistry::global(cx);
66    log::info!(
67        "language_models::extension::init_proxy: registering LanguageModelProviderRegistryProxy"
68    );
69    proxy.register_language_model_provider_proxy(LanguageModelProviderRegistryProxy::new(registry));
70}