From 46c423b63ca38273cae9605c91c7a10edd4e5625 Mon Sep 17 00:00:00 2001 From: AjayK47 Date: Thu, 20 Aug 2026 16:05:04 +0530 Subject: [PATCH 1/2] feat(providers): add Concentrate provider Adds Concentrate (https://concentrate.ai, an OpenAI-compatible gateway to 150+ models across 20+ providers) as a native chat provider, alongside OpenRouter / Anannas / Chutes etc. - Registers Concentrate in the provider config with its base URL; it uses the existing generic OpenAI adapter (openai::OpenAIAdapter) since Concentrate's API is a standard OpenAI-compatible /v1/chat/completions + /v1/models surface, same pattern as the built-in lettuce-host gateway - Adds Concentrate to PROVIDER_PARAMETER_SUPPORT (temperature, top_p, frequency_penalty, effort-based reasoning) - presencePenalty is intentionally left false since Concentrate's own docs mark that field accepted-but-unsupported - Provider icon, sourced from Concentrate's own logo submission to models.dev (AjayK47/models.dev PR #5049) Verified with tsc --noEmit and cargo check (both clean). --- .../src/chat_manager/provider_adapter/mod.rs | 1 + src-tauri/src/providers/config.rs | 1 + src/assets/concentrate.svg | 1 + src/core/storage/schemas.ts | 63 +++++++++++++++++++ src/core/utils/providerIcons.tsx | 2 + src/ui/components/ModelSelectorButton.tsx | 3 + 6 files changed, 71 insertions(+) create mode 100644 src/assets/concentrate.svg diff --git a/src-tauri/src/chat_manager/provider_adapter/mod.rs b/src-tauri/src/chat_manager/provider_adapter/mod.rs index 21a697a5a..0212f5386 100644 --- a/src-tauri/src/chat_manager/provider_adapter/mod.rs +++ b/src-tauri/src/chat_manager/provider_adapter/mod.rs @@ -359,6 +359,7 @@ pub fn adapter_for(credential: &ProviderCredential) -> Box Box::new(nanogpt::NanoGPTAdapter), "xai" => Box::new(xai::XAIAdapter), "anannas" => Box::new(anannas::AnannasAdapter), + "concentrate" => Box::new(openai::OpenAIAdapter), "google" | "google-gemini" | "gemini" => Box::new(google_gemini::GoogleGeminiAdapter), "gemini-agent-platform-express" => { Box::new(gemini_agent_platform_express::GeminiAgentPlatformExpressAdapter::new()) diff --git a/src-tauri/src/providers/config.rs b/src-tauri/src/providers/config.rs index c9434bcf1..15df7cc75 100644 --- a/src-tauri/src/providers/config.rs +++ b/src-tauri/src/providers/config.rs @@ -158,6 +158,7 @@ fn get_all_provider_configs_internal() -> Vec { "https://integrate.api.nvidia.com/v1", ), ("anannas", "Anannas AI", "https://api.anannas.ai/v1"), + ("concentrate", "Concentrate", "https://api.concentrate.ai/v1"), ("groq", "Groq", "https://api.groq.com"), ("stability", "Stability AI", "https://api.stability.ai"), ( diff --git a/src/assets/concentrate.svg b/src/assets/concentrate.svg new file mode 100644 index 000000000..33f748d93 --- /dev/null +++ b/src/assets/concentrate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/core/storage/schemas.ts b/src/core/storage/schemas.ts index 7a2ddb3f7..8d104f5e5 100644 --- a/src/core/storage/schemas.ts +++ b/src/core/storage/schemas.ts @@ -804,6 +804,14 @@ export const PROVIDER_REASONING_CAPABILITIES: Record = { @@ -57,6 +58,7 @@ const ICON_MAP: Record = { featherless: Featherless, nvidia: NVIDIA, chutes: Chutes, + concentrate: Concentrate, ollama: Ollama, lmstudio: LM Studio, intenserp: IntenseRP Next, diff --git a/src/ui/components/ModelSelectorButton.tsx b/src/ui/components/ModelSelectorButton.tsx index d49da5021..da79ec688 100644 --- a/src/ui/components/ModelSelectorButton.tsx +++ b/src/ui/components/ModelSelectorButton.tsx @@ -6,6 +6,7 @@ import type { Model } from "../../core/storage/schemas"; import { useI18n } from "../../core/i18n/context"; import GroqIcon from "../../assets/groq.svg"; import CerebrasIcon from "../../assets/cerebras.svg"; +import ConcentrateIcon from "../../assets/concentrate.svg"; // Provider icons - matching the character settings function getProviderIcon(providerId: string) { @@ -40,6 +41,8 @@ function getProviderIcon(providerId: string) { ); case "groq": return Groq; + case "concentrate": + return Concentrate; default: return ; } From 2a29984bc08fd93fea842cf8fd713190d04c5e54 Mon Sep 17 00:00:00 2001 From: AjayK47 Date: Thu, 20 Aug 2026 19:08:02 +0530 Subject: [PATCH 2/2] fix(providers): bake in Concentrate's actual black-background brand mark Same fix as the SillyTavern integration: the logo committed earlier used fill="currentColor" on a transparent background so it would theme automatically, but the real Concentrate mark has a solid black background as part of the logo itself. Confirmed against a reference image provided by Concentrate: same 64-dot (8x8) gradient pattern and radii, just with the black square baked in and dots always white. --- src/assets/concentrate.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/concentrate.svg b/src/assets/concentrate.svg index 33f748d93..1c0fd3f85 100644 --- a/src/assets/concentrate.svg +++ b/src/assets/concentrate.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file