Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions apps/desktop-tauri/src-tauri/src/commands/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,32 @@ fn fetch_context_defaults_to_manual_cookies_without_browser_import() {
assert_eq!(ctx.source_mode, SourceMode::Web);
}

#[test]
fn fetch_context_huggingface_uses_api_token_lane() {
let settings = Settings::default();
let cookies = ManualCookies::default();
let api_keys = ApiKeys::default();
let token_accounts = HashMap::new();

let ctx = super::build_fetch_context(
ProviderId::HuggingFace,
&settings,
&cookies,
&api_keys,
&token_accounts,
);

assert_eq!(ctx.source_mode, SourceMode::Auto);
let provider = instantiate_provider(ProviderId::HuggingFace);
assert_eq!(
provider.available_sources(),
vec![SourceMode::Auto, SourceMode::OAuth]
);
assert!(!provider.supports_web());
assert!(!provider.supports_cli());
assert_eq!(provider.metadata().display_name, "Hugging Face");
}

#[test]
fn fetch_context_cursor_cookie_off_stays_cli() {
let mut settings = Settings::default();
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions apps/desktop-tauri/src/components/providers/providerIcons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import factory from "./icons/ProviderIcon-factory.svg?raw";
import gemini from "./icons/ProviderIcon-gemini.svg?raw";
import grok from "./icons/ProviderIcon-grok.svg?raw";
import groq from "./icons/ProviderIcon-groq.svg?raw";
import huggingface from "./icons/ProviderIcon-huggingface.svg?raw";
import jetbrains from "./icons/ProviderIcon-jetbrains.svg?raw";
import kilo from "./icons/ProviderIcon-kilo.svg?raw";
import kimi from "./icons/ProviderIcon-kimi.svg?raw";
Expand Down Expand Up @@ -115,6 +116,7 @@ const RAW: Record<string, string> = {
gemini: tint(gemini),
grok: tint(grok),
groq: tint(groq),
huggingface: tint(huggingface),
jetbrains: tint(jetbrains),
kilo: tint(kilo),
kimi: tint(kimi),
Expand Down Expand Up @@ -175,6 +177,7 @@ export const PROVIDER_ICON_REGISTRY: Record<string, ProviderIcon> = {
gemini: { id: "gemini", brandColor: "#ab87ea", fallbackLetter: "✦", svgPath: RAW.gemini },
grok: { id: "grok", brandColor: "#111827", fallbackLetter: "G", svgPath: RAW.grok },
groq: { id: "groq", brandColor: "#f55036", fallbackLetter: "G", svgPath: RAW.groq },
huggingface: { id: "huggingface", brandColor: "#ffd21e", fallbackLetter: "H", svgPath: RAW.huggingface },
jetbrains: { id: "jetbrains", brandColor: "#ff3399", fallbackLetter: "J", svgPath: RAW.jetbrains },
kilo: { id: "kilo", brandColor: "#5d87ff", fallbackLetter: "K", svgPath: RAW.kilo },
bedrock: { id: "bedrock", brandColor: "#ff9900", fallbackLetter: "B", svgPath: RAW.bedrock },
Expand Down
1 change: 1 addition & 0 deletions apps/desktop-tauri/src/test/providerCatalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ export const TEST_PROVIDER_CATALOG: Array<[string, string]> = [
["elevenlabs", "ElevenLabs"],
["deepgram", "Deepgram"],
["groq", "Groq"],
["huggingface", "Hugging Face"],
["llmproxy", "LLM Proxy"],
["chutes", "Chutes"],
["litellm", "LiteLLM"],
Expand Down
4 changes: 4 additions & 0 deletions rust/src/cli/serve/dashboard/icons.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,10 @@ static ICONS: &[(&str, &[u8])] = &[
"ProviderIcon-groq",
include_bytes!("icons/ProviderIcon-groq.svg"),
),
(
"ProviderIcon-huggingface",
include_bytes!("icons/ProviderIcon-huggingface.svg"),
),
(
"ProviderIcon-jetbrains",
include_bytes!("icons/ProviderIcon-jetbrains.svg"),
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 18 additions & 1 deletion rust/src/core/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ pub enum ProviderId {
ElevenLabs,
Deepgram,
Groq,
HuggingFace,
LLMProxy,
Chutes,
LiteLLM,
Expand Down Expand Up @@ -139,6 +140,7 @@ impl ProviderId {
ProviderId::ElevenLabs,
ProviderId::Deepgram,
ProviderId::Groq,
ProviderId::HuggingFace,
ProviderId::LLMProxy,
ProviderId::Chutes,
ProviderId::LiteLLM,
Expand Down Expand Up @@ -218,6 +220,7 @@ impl ProviderId {
ProviderId::ElevenLabs => "elevenlabs",
ProviderId::Deepgram => "deepgram",
ProviderId::Groq => "groq",
ProviderId::HuggingFace => "huggingface",
ProviderId::LLMProxy => "llmproxy",
ProviderId::Chutes => "chutes",
ProviderId::LiteLLM => "litellm",
Expand Down Expand Up @@ -296,6 +299,7 @@ impl ProviderId {
ProviderId::ElevenLabs => "ElevenLabs",
ProviderId::Deepgram => "Deepgram",
ProviderId::Groq => "Groq",
ProviderId::HuggingFace => "Hugging Face",
ProviderId::LLMProxy => "LLM Proxy",
ProviderId::Chutes => "Chutes",
ProviderId::LiteLLM => "LiteLLM",
Expand Down Expand Up @@ -383,6 +387,7 @@ impl ProviderId {
ProviderId::ElevenLabs => None,
ProviderId::Deepgram => None,
ProviderId::Groq => None,
ProviderId::HuggingFace => None,
ProviderId::LLMProxy => None,
ProviderId::Chutes => None,
ProviderId::LiteLLM => None,
Expand Down Expand Up @@ -467,6 +472,7 @@ impl ProviderId {
"elevenlabs" | "eleven-labs" | "11labs" => Some(ProviderId::ElevenLabs),
"deepgram" | "dg" => Some(ProviderId::Deepgram),
"groq" | "groqcloud" | "groq-cloud" | "groq cloud" => Some(ProviderId::Groq),
"huggingface" | "hugging-face" | "hugging face" | "hf" => Some(ProviderId::HuggingFace),
"llmproxy" | "llm-proxy" | "llm proxy" => Some(ProviderId::LLMProxy),
"chutes" | "chutes-ai" | "chutes ai" => Some(ProviderId::Chutes),
"litellm" | "lite-llm" | "lite llm" => Some(ProviderId::LiteLLM),
Expand Down Expand Up @@ -888,6 +894,8 @@ pub fn cli_name_map() -> HashMap<&'static str, ProviderId> {
map.insert("dg", ProviderId::Deepgram);
map.insert("groqcloud", ProviderId::Groq);
map.insert("groq-cloud", ProviderId::Groq);
map.insert("hugging-face", ProviderId::HuggingFace);
map.insert("hf", ProviderId::HuggingFace);
map.insert("chutes-ai", ProviderId::Chutes);
map.insert("lite-llm", ProviderId::LiteLLM);
map.insert("zed-ai", ProviderId::Zed);
Expand Down Expand Up @@ -954,6 +962,7 @@ pub fn brand_color(id: ProviderId) -> &'static str {
ProviderId::ElevenLabs => "#111827",
ProviderId::Deepgram => "#13EF93",
ProviderId::Groq => "#F55036",
ProviderId::HuggingFace => "#FFD21E",
ProviderId::LLMProxy => "#4F46E5",
ProviderId::Chutes => "#FF5C35",
ProviderId::LiteLLM => "#0EA5E9",
Expand Down Expand Up @@ -990,7 +999,7 @@ mod tests {
#[test]
fn test_provider_id_all() {
let all = ProviderId::all();
assert_eq!(all.len(), 71);
assert_eq!(all.len(), 72);
assert!(all.contains(&ProviderId::Claude));
assert!(all.contains(&ProviderId::Codex));
assert!(all.contains(&ProviderId::Fireworks));
Expand Down Expand Up @@ -1021,6 +1030,7 @@ mod tests {
assert!(all.contains(&ProviderId::ElevenLabs));
assert!(all.contains(&ProviderId::Deepgram));
assert!(all.contains(&ProviderId::Groq));
assert!(all.contains(&ProviderId::HuggingFace));
assert!(all.contains(&ProviderId::LLMProxy));
assert!(all.contains(&ProviderId::Chutes));
assert!(all.contains(&ProviderId::LiteLLM));
Expand Down Expand Up @@ -1077,13 +1087,15 @@ mod tests {
assert_eq!(ProviderId::Codex.cli_name(), "codex");
assert_eq!(ProviderId::Factory.cli_name(), "factory");
assert_eq!(ProviderId::Zai.cli_name(), "zai");
assert_eq!(ProviderId::HuggingFace.cli_name(), "huggingface");
}

#[test]
fn test_provider_id_display_name() {
assert_eq!(ProviderId::Claude.display_name(), "Claude");
assert_eq!(ProviderId::Factory.display_name(), "Factory");
assert_eq!(ProviderId::Zai.display_name(), "z.ai");
assert_eq!(ProviderId::HuggingFace.display_name(), "Hugging Face");
}

#[test]
Expand All @@ -1101,6 +1113,10 @@ mod tests {
Some(ProviderId::Claude)
);
assert_eq!(ProviderId::from_cli_name("codex"), Some(ProviderId::Codex));
assert_eq!(
ProviderId::from_cli_name("hf"),
Some(ProviderId::HuggingFace)
);
assert_eq!(ProviderId::from_cli_name("openai"), Some(ProviderId::Codex));
assert_eq!(
ProviderId::from_cli_name("factory"),
Expand Down Expand Up @@ -1183,6 +1199,7 @@ mod tests {
assert_eq!(ProviderId::Zai.cookie_domain(), None);
assert_eq!(ProviderId::VertexAI.cookie_domain(), None);
assert_eq!(ProviderId::JetBrains.cookie_domain(), None);
assert_eq!(ProviderId::HuggingFace.cookie_domain(), None);
}

#[test]
Expand Down
17 changes: 9 additions & 8 deletions rust/src/core/provider_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ use crate::providers::{
CommandCodeProvider, CopilotProvider, CrofProvider, CrossModelProvider, CursorProvider,
DeepInfraProvider, DeepSeekProvider, DeepgramProvider, DevinProvider, DoubaoProvider,
ElevenLabsProvider, FactoryProvider, FireworksProvider, GeminiProvider, GrokProvider,
GroqProvider, InfiniProvider, JetBrainsProvider, KiloProvider, KimiK2Provider, KimiProvider,
KiroProvider, LLMProxyProvider, LiteLLMProvider, LongCatProvider, ManusProvider, MetaProvider,
MiMoProvider, MiniMaxProvider, MistralProvider, NanoGPTProvider, NeuralwattProvider,
NotionProvider, OllamaProvider, OpenAIApiProvider, OpenCodeGoProvider, OpenCodeProvider,
OpenRouterProvider, PerplexityProvider, PoeProvider, QoderProvider, QwenCloudProvider,
SakanaProvider, StepFunProvider, Sub2ApiProvider, T3ChatProvider, VeniceProvider,
VertexAIProvider, WarpProvider, WayfinderProvider, WindsurfProvider, XaiProvider, ZaiProvider,
ZedProvider, ZenMuxProvider, ZoomMateProvider,
GroqProvider, HuggingFaceProvider, InfiniProvider, JetBrainsProvider, KiloProvider,
KimiK2Provider, KimiProvider, KiroProvider, LLMProxyProvider, LiteLLMProvider, LongCatProvider,
ManusProvider, MetaProvider, MiMoProvider, MiniMaxProvider, MistralProvider, NanoGPTProvider,
NeuralwattProvider, NotionProvider, OllamaProvider, OpenAIApiProvider, OpenCodeGoProvider,
OpenCodeProvider, OpenRouterProvider, PerplexityProvider, PoeProvider, QoderProvider,
QwenCloudProvider, SakanaProvider, StepFunProvider, Sub2ApiProvider, T3ChatProvider,
VeniceProvider, VertexAIProvider, WarpProvider, WayfinderProvider, WindsurfProvider,
XaiProvider, ZaiProvider, ZedProvider, ZenMuxProvider, ZoomMateProvider,
};

/// Instantiate the concrete [`Provider`] implementation for a given [`ProviderId`].
Expand Down Expand Up @@ -78,6 +78,7 @@ pub fn instantiate(id: ProviderId) -> Box<dyn Provider> {
ProviderId::ElevenLabs => Box::new(ElevenLabsProvider::new()),
ProviderId::Deepgram => Box::new(DeepgramProvider::new()),
ProviderId::Groq => Box::new(GroqProvider::new()),
ProviderId::HuggingFace => Box::new(HuggingFaceProvider::new()),
ProviderId::LLMProxy => Box::new(LLMProxyProvider::new()),
ProviderId::Chutes => Box::new(ChutesProvider::new()),
ProviderId::LiteLLM => Box::new(LiteLLMProvider::new()),
Expand Down
10 changes: 10 additions & 0 deletions rust/src/core/token_accounts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,16 @@ impl TokenAccountSupport {
requires_manual_cookie_source: false,
cookie_name: None,
}),
ProviderId::HuggingFace => Some(TokenAccountSupport {
title: "API tokens",
subtitle: "Store multiple Hugging Face access tokens.",
placeholder: "Paste a Hugging Face access token",
injection: TokenInjection::Environment {
key: "CODEXBAR_HUGGINGFACE_API_KEY".to_string(),
},
requires_manual_cookie_source: false,
cookie_name: None,
}),
ProviderId::AiAnd => Some(TokenAccountSupport {
title: "API keys",
subtitle: "Store multiple ai& API keys.",
Expand Down
Loading