diff --git a/src/lib.rs b/src/lib.rs index 72cb266..87a8745 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -66,6 +66,9 @@ pub struct AppArgs { #[arg(long)] pub ollama_cloud_api_key: Vec, + #[arg(long)] + pub opencode_console_api_key: Vec, + #[arg(long)] pub openrouter_api_key: Vec, diff --git a/src/server/chat/completions.rs b/src/server/chat/completions.rs index b9d8478..104a091 100644 --- a/src/server/chat/completions.rs +++ b/src/server/chat/completions.rs @@ -96,6 +96,7 @@ enum Provider { NovitaAi, NvidiaNim, Ollama, + OpenCode, OpenRouter, VercelAiGateway, ZAi, @@ -129,6 +130,7 @@ impl Shortcut { "nvidia/nemotron-3.5-lightning-free".into(), ), (P::OpenRouter, "nvidia/nemotron-3.5-lightning:free".into()), + (P::OpenCode, "nemotron-3.5-lightning-free".into()), (P::ZAi, "glm-4.6v-flash".into()), (P::ZAi, "glm-4.5-flash".into()), (P::OpenRouter, "poolside/laguna-xs.2:free".into()), @@ -180,6 +182,7 @@ impl Shortcut { "nvidia/nemotron-3.5-super-vl-120b-a12b".into(), ), (P::OpenRouter, "nvidia/nemotron-3.5-super-vl:free".into()), + (P::OpenCode, "nemotron-3.5-super-vl-free".into()), (P::Mistral, "mistral-medium-3.5".into()), (P::Kilo, "inclusionai-ling-3-0-flash-free".into()), (P::NovitaAi, "inclusionai/ling-3.0-flash-vl".into()), @@ -223,15 +226,19 @@ impl Shortcut { (P::NvidiaNim, "stepfun-ai/step-5-preview".into()), (P::CloudflareWorkersAi, "@cf/zai-org/glm-5.3-flash".into()), (P::NvidiaNim, "z-ai/glm-5-3-flash".into()), + (P::OpenCode, "glm-5.3-flash-free".into()), (P::HuggingFace, "zai-org/GLM-5.3-Flash".into()), (P::HuggingFace, "zai-org/GLM-5.3-Flash-BF16".into()), (P::VercelAiGateway, "openai/gpt-5.2".into()), (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::VercelAiGateway, "inclusionai/ling-3.1-flash".into()), (P::HuggingFace, "inclusionAI/Ling-3.1-flash".into()), (P::Ollama, "beam".into()), + (P::OpenCode, "beam-free".into()), (P::VercelAiGateway, "xiaomi/mimo-v2.6-flash".into()), + (P::OpenCode, "mimo-v2.6-flash-free".into()), (P::HuggingFace, "XiaomiMiMo/MiMo-V2.6-Flash-RL".into()), (P::Kilo, "nex-agi-nex-n2-5-pro-free".into()), (P::VercelAiGateway, "xiaomi/mimo-v2.5".into()), @@ -247,6 +254,7 @@ impl Shortcut { (P::Ollama, "nemotron-3-ultra".into()), (P::NvidiaNim, "nvidia/nemotron-3-ultra-550b-a55b".into()), (P::Kilo, "nvidia-nemotron-3-ultra-550b-a55b-free".into()), + (P::OpenCode, "nemotron-3-ultra-free".into()), ], S::XL => vec![ @@ -254,6 +262,7 @@ impl Shortcut { (P::HuggingFace, "zai-org/GLM-5.3".into()), (P::CloudflareWorkersAi, "@cf/zai-org/glm-5.3".into()), (P::Mistral, "zai-glm-5-3".into()), + (P::OpenCode, "muse-spark-1.3-contributor-free".into()), (P::NvidiaNim, "moonshotai/kimi-k3".into()), (P::HuggingFace, "moonshotai/Kimi-K3".into()), (P::HuggingFace, "tencent/Hy4-preview".into()), @@ -261,6 +270,7 @@ impl Shortcut { (P::Mistral, "mistral-large-4".into()), (P::HuggingFace, "Qwen/Qwen3.8-2.4T-A95B".into()), (P::VercelAiGateway, "xiaomi/mimo-v2.5-pro".into()), + (P::OpenCode, "longcat-2.5-preview-free".into()), (P::OpenRouter, "thinkingmachines/inkling:free".into()), (P::HuggingFace, "thinkingmachines/Inkling".into()), (P::VercelAiGateway, "thinkingmachines/inkling".into()), @@ -270,6 +280,8 @@ impl Shortcut { S::Experimental => vec![ (P::OpenRouter, "space-bunny-alpha".into()), + (P::OpenCode, "space-bunny-free".into()), + (P::OpenCode, "big-pickle".into()), (P::VercelAiGateway, "stealth/glyph-cluster".into()), ], } @@ -479,6 +491,18 @@ pub async fn create_chat_completion( .build() }) .collect(), + Provider::OpenCode => state + .app_args + .opencode_console_api_key + .iter() + .cloned() + .map(|api_key| { + Upstream::builder() + .url("https://opencode.ai/inference/openai/v1/chat/completions".parse().expect("TODO")) + .api_key(api_key) + .build() + }) + .collect(), Provider::VercelAiGateway => state .app_args .vercel_ai_gateway_api_key diff --git a/src/server/system_one.rs b/src/server/system_one.rs index e7168e2..da7306b 100644 --- a/src/server/system_one.rs +++ b/src/server/system_one.rs @@ -39,6 +39,7 @@ pub enum Shortcut { enum Provider { CloudflareWorkersAi, LiquidAi, + OpenCode, OpenRouter, VercelAiGateway, } @@ -63,6 +64,7 @@ impl Shortcut { S::M => { vec![ + (P::OpenCode, "jev-1.13-free".into()), (P::CloudflareWorkersAi, "clef".into()), (P::OpenRouter, "inception/mercury-decide:free".into()), ] @@ -116,13 +118,13 @@ pub async fn create_system_one( api_key, }| { Upstream::builder() - .url( - format!("https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/@cf/cloudflare/{model}") - .parse() - .expect("TODO"), - ) - .api_key(api_key) - .build() + .url( + format!("https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/@cf/cloudflare/{model}") + .parse() + .expect("TODO"), + ) + .api_key(api_key) + .build() }, ) .collect(), @@ -138,6 +140,18 @@ pub async fn create_system_one( .build() }) .collect(), + Provider::OpenCode => state + .app_args + .opencode_console_api_key + .iter() + .cloned() + .map(|api_key| { + Upstream::builder() + .url("https://opencode.ai/inference/systemone/v1/systemone".parse().expect("TODO")) + .api_key(api_key) + .build() + }) + .collect(), Provider::OpenRouter => state .app_args .openrouter_api_key