From d11c2d25897e0036955d4e43d40b7f594531158c Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 19 Oct 2026 15:56:06 -0400 Subject: [PATCH] feat: cohere + more models --- src/lib.rs | 3 ++ src/server/chat/completions.rs | 20 +++++++++ src/server/embeddings.rs | 50 +++++++++++++++++++++ src/server/frontend/index.html | 12 +++++ src/server/{frontend.rs => frontend/mod.rs} | 0 5 files changed, 85 insertions(+) create mode 100644 src/server/frontend/index.html rename src/server/{frontend.rs => frontend/mod.rs} (100%) diff --git a/src/lib.rs b/src/lib.rs index 87a8745..5b8f0ff 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -39,6 +39,9 @@ pub struct AppArgs { #[arg(long)] pub cloudflare_workers_ai_credentials: Vec, + #[arg(long)] + pub cohere_api_key: Vec, + #[arg(long)] pub google_ai_studio_api_key: Vec, diff --git a/src/server/chat/completions.rs b/src/server/chat/completions.rs index e94f8c0..5300e70 100644 --- a/src/server/chat/completions.rs +++ b/src/server/chat/completions.rs @@ -88,6 +88,7 @@ impl Display for ShortcutAndMaybeReasoning { #[derive(Debug, Clone)] enum Provider { CloudflareWorkersAi, + Cohere, GoogleAiStudio, Groq, HuggingFace, @@ -123,6 +124,7 @@ impl Shortcut { (P::OpenRouter, "poolside/laguna-xs-2.1:free".into()), (P::ZAi, "glm-4.7-flash".into()), (P::NvidiaNim, "google/diffusiongemma-26b-a4b-it".into()), + (P::Cohere, "north-mini-code-1-0".into()), (P::OpenRouter, "cohere/north-mini-code:free".into()), (P::NvidiaNim, "nvidia/nemotron-3.5-lightning-30b-a3b".into()), ( @@ -207,6 +209,7 @@ impl Shortcut { ), (P::VercelAiGateway, "mistral/mistral-large-3".into()), (P::Ollama, "nemotron-3-super".into()), + (P::Cohere, "command-a-plus-05-2026".into()), (P::NvidiaNim, "nvidia/nemotron-3-super-120b-a12b".into()), (P::Kilo, "nvidia-nemotron-3-super-120b-a12b-free".into()), ( @@ -233,6 +236,7 @@ impl Shortcut { (P::NvidiaNim, "deepseek-ai/deepseek-v4.1-flash".into()), (P::HuggingFace, "deepseek-ai/DeepSeek-V4.1-Flash".into()), (P::OpenCode, "deepseek-v4.1-flash-free".into()), + (P::OpenRouter, "minimax/minimax-m3.1-flash:free".into()), (P::VercelAiGateway, "inclusionai/ling-3.1-flash".into()), (P::HuggingFace, "inclusionAI/Ling-3.1-flash".into()), (P::Ollama, "beam".into()), @@ -395,6 +399,22 @@ pub async fn create_chat_completion( .build() }) .collect(), + Provider::Cohere => state + .app_args + .cohere_api_key + .iter() + .cloned() + .map(|api_key| { + Upstream::builder() + .url( + "https://api.cohere.com/compatibility/v1/chat/completions" + .parse() + .expect("TODO"), + ) + .api_key(api_key) + .build() + }) + .collect(), Provider::Groq => state .app_args .groq_api_key diff --git a/src/server/embeddings.rs b/src/server/embeddings.rs index a8ab903..53a0056 100644 --- a/src/server/embeddings.rs +++ b/src/server/embeddings.rs @@ -34,6 +34,18 @@ pub enum Shortcut { #[strum(serialize = "codestral-embed-2505")] CodestralEmbed2505, + #[strum(serialize = "cohere-embed-v4.0")] + CohereEmbedV4_0, + + #[strum(serialize = "cohere-embed-v5.0-fast")] + CohereEmbedV5_0Fast, + + #[strum(serialize = "cohere-embed-v5.0-pro")] + CohereEmbedV5_0Pro, + + #[strum(serialize = "gemini-embedding-2")] + GeminiEmbedding2, + #[strum(serialize = "lfm2.5-embedding-350m")] Lfm2_5Embedding350M, @@ -46,6 +58,8 @@ pub enum Shortcut { #[derive(Debug, Clone)] enum Provider { + Cohere, + GoogleAiStudio, Mistral, NvidiaNim, OpenRouter, @@ -58,6 +72,10 @@ impl Shortcut { match self { S::CodestralEmbed2505 => vec![(P::Mistral, "codestral-embed-2505".into())], + S::CohereEmbedV4_0 => vec![(P::Cohere, "embed-v4.0".into())], + S::CohereEmbedV5_0Fast => vec![(P::Cohere, "embed-v5.0-fast".into())], + S::CohereEmbedV5_0Pro => vec![(P::Cohere, "embed-v5.0-pro".into())], + S::GeminiEmbedding2 => vec![(P::GoogleAiStudio, "gemini-embedding-2".into())], S::Lfm2_5Embedding350M => { vec![(P::OpenRouter, "liquid/lfm-2.5-embedding-350m:free".into())] } @@ -103,6 +121,22 @@ pub async fn create_embeddings( for (provider, model) in shortcut.suggestions() { let upstreams: Vec = match provider { + Provider::Cohere => state + .app_args + .cohere_api_key + .iter() + .cloned() + .map(|api_key| { + Upstream::builder() + .url( + "https://api.cohere.com/compatibility/v1/embeddings" + .parse() + .expect("TODO"), + ) + .api_key(api_key) + .build() + }) + .collect(), Provider::Mistral => state .app_args .mistral_api_key @@ -119,6 +153,22 @@ pub async fn create_embeddings( .build() }) .collect(), + Provider::GoogleAiStudio => state + .app_args + .google_ai_studio_api_key + .iter() + .cloned() + .map(|api_key| { + Upstream::builder() + .url( + "https://generativelanguage.googleapis.com/v1beta/openai/embeddings" + .parse() + .expect("TODO"), + ) + .api_key(api_key) + .build() + }) + .collect(), Provider::NvidiaNim => state .app_args .nvidia_nim_api_key diff --git a/src/server/frontend/index.html b/src/server/frontend/index.html new file mode 100644 index 0000000..00543ba --- /dev/null +++ b/src/server/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + Basic Page + + +

Hello, world!

+

This is a basic HTML page.

+ + diff --git a/src/server/frontend.rs b/src/server/frontend/mod.rs similarity index 100% rename from src/server/frontend.rs rename to src/server/frontend/mod.rs