diff --git a/src-tauri/crates/agent-core/src/core/providers/auxiliary_model.rs b/src-tauri/crates/agent-core/src/core/providers/auxiliary_model.rs index dccc60b165..bb380ed77c 100644 --- a/src-tauri/crates/agent-core/src/core/providers/auxiliary_model.rs +++ b/src-tauri/crates/agent-core/src/core/providers/auxiliary_model.rs @@ -147,6 +147,7 @@ fn preferences(spec: &ProviderSpec, codex_oauth: bool) -> &'static [&'static str | provider_id::OPENCODE | provider_id::AIHUBMIX | provider_id::CHERRYIN + | provider_id::CHEAPERINFERENCE | provider_id::ATLASCLOUD | provider_id::SILICONFLOW | provider_id::MODELSCOPE diff --git a/src-tauri/crates/agent-core/src/core/providers/factory.rs b/src-tauri/crates/agent-core/src/core/providers/factory.rs index e1f9aa193f..3995d15535 100644 --- a/src-tauri/crates/agent-core/src/core/providers/factory.rs +++ b/src-tauri/crates/agent-core/src/core/providers/factory.rs @@ -374,6 +374,7 @@ fn api_key_model_type_for_spec(spec: &ProviderSpec) -> Option { provider_id::MODELSCOPE => Some(ModelType::ModelscopeApi), provider_id::AIHUBMIX => Some(ModelType::AihubmixApi), provider_id::CHERRYIN => Some(ModelType::CherryinApi), + provider_id::CHEAPERINFERENCE => Some(ModelType::CheaperinferenceApi), provider_id::BEDROCK => Some(ModelType::BedrockApi), provider_id::CUSTOM => Some(ModelType::CustomApi), provider_id::OPENROUTER => Some(ModelType::OpenrouterApi), @@ -402,6 +403,7 @@ fn spec_for_model_type(model_type: &ModelType) -> Option<&'static ProviderSpec> ModelType::ModelscopeApi => provider_id::MODELSCOPE, ModelType::AihubmixApi => provider_id::AIHUBMIX, ModelType::CherryinApi => provider_id::CHERRYIN, + ModelType::CheaperinferenceApi => provider_id::CHEAPERINFERENCE, ModelType::BedrockApi => provider_id::BEDROCK, ModelType::CustomApi => provider_id::CUSTOM, ModelType::OpenrouterApi => provider_id::OPENROUTER, @@ -1390,6 +1392,7 @@ mod tests { ModelType::ModelscopeApi, ModelType::AihubmixApi, ModelType::CherryinApi, + ModelType::CheaperinferenceApi, ModelType::BedrockApi, ModelType::CustomApi, ModelType::AtlascloudApi, diff --git a/src-tauri/crates/agent-core/src/core/providers/registry.rs b/src-tauri/crates/agent-core/src/core/providers/registry.rs index 9c23e42a5e..598070fb23 100644 --- a/src-tauri/crates/agent-core/src/core/providers/registry.rs +++ b/src-tauri/crates/agent-core/src/core/providers/registry.rs @@ -23,6 +23,7 @@ pub mod provider_id { pub const OPENCODE: &str = "opencode"; pub const AIHUBMIX: &str = "aihubmix"; pub const CHERRYIN: &str = "cherryin"; + pub const CHEAPERINFERENCE: &str = "cheaperinference"; // Standard providers pub const ANTHROPIC: &str = "anthropic"; @@ -128,6 +129,17 @@ pub static PROVIDERS: &[ProviderSpec] = &[ is_local: false, env_key: Some("CHERRYIN_API_KEY"), }, + ProviderSpec { + name: provider_id::CHEAPERINFERENCE, + display_name: "Cheaper Inference", + keywords: &[], + litellm_prefix: None, + skip_prefixes: &["cheaperinference/"], + default_api_base: Some("https://api.cheaperinference.com/v1"), + default_anthropic_api_base: Some("https://api.cheaperinference.com"), + is_local: false, + env_key: Some("CHEAPERINFERENCE_API_KEY"), + }, // ===== Standard Providers ===== ProviderSpec { name: provider_id::ANTHROPIC, diff --git a/src-tauri/crates/key-vault/src/commands/registry/data/api_providers.rs b/src-tauri/crates/key-vault/src/commands/registry/data/api_providers.rs index 5ae6404b76..6974834a28 100644 --- a/src-tauri/crates/key-vault/src/commands/registry/data/api_providers.rs +++ b/src-tauri/crates/key-vault/src/commands/registry/data/api_providers.rs @@ -204,6 +204,17 @@ pub(crate) fn api_provider_registry() -> Vec { popular: false, supports_rust_agents: true, }, + ApiProviderEntry { + name: "cheaperinference_api", + display_name: "Cheaper Inference", + description: "OpenAI-compatible LLM gateway with models from several labs", + brand_color: "#64748B", + docs_url: "https://cheaperinference.com/docs", + icon_provider: "custom", + paired_cli_agent: None, + popular: false, + supports_rust_agents: true, + }, ApiProviderEntry { name: "bedrock_api", display_name: "AWS Bedrock", diff --git a/src-tauri/crates/key-vault/src/commands/validate/dispatch.rs b/src-tauri/crates/key-vault/src/commands/validate/dispatch.rs index 9996be1468..7aa7c58955 100644 --- a/src-tauri/crates/key-vault/src/commands/validate/dispatch.rs +++ b/src-tauri/crates/key-vault/src/commands/validate/dispatch.rs @@ -144,7 +144,8 @@ pub async fn run_validate_key( "atlascloud_api" | "deepseek_api" | "groq_api" | "xai_api" | "zhipu_api" | "dashscope_api" | "moonshot_api" | "minimax_api" | "longcat_api" | "openrouter_api" | "zenmux_api" | "siliconflow_api" | "modelscope_api" | "aihubmix_api" | "cherryin_api" - | "bedrock_api" | "custom_api" | "vllm_api" | "orgii_orchestrator" | "orgii" => { + | "cheaperinference_api" | "bedrock_api" | "custom_api" | "vllm_api" + | "orgii_orchestrator" | "orgii" => { if protocol_lower.as_deref() == Some("anthropic") { let effective_url = base_url .clone() @@ -169,7 +170,7 @@ pub async fn run_validate_key( } _ => Err(format!( - "Unknown agent type: {}. Supported: copilot, cursor_cli, openai, anthropic, google, codex, claude_code, kiro, opencode, openai_api, atlascloud_api, anthropic_api, gemini_api, deepseek_api, groq_api, xai_api, zhipu_api, dashscope_api, moonshot_api, minimax_api, longcat_api, openrouter_api, zenmux_api, siliconflow_api, modelscope_api, aihubmix_api, cherryin_api, bedrock_api, custom_api, vllm_api, azure_openai_api, azure_anthropic_api", + "Unknown agent type: {}. Supported: copilot, cursor_cli, openai, anthropic, google, codex, claude_code, kiro, opencode, openai_api, atlascloud_api, anthropic_api, gemini_api, deepseek_api, groq_api, xai_api, zhipu_api, dashscope_api, moonshot_api, minimax_api, longcat_api, openrouter_api, zenmux_api, siliconflow_api, modelscope_api, aihubmix_api, cherryin_api, cheaperinference_api, bedrock_api, custom_api, vllm_api, azure_openai_api, azure_anthropic_api", agent_type )), } diff --git a/src-tauri/crates/key-vault/src/commands/validate/quota_dispatch.rs b/src-tauri/crates/key-vault/src/commands/validate/quota_dispatch.rs index 2807558f7d..06621c7798 100644 --- a/src-tauri/crates/key-vault/src/commands/validate/quota_dispatch.rs +++ b/src-tauri/crates/key-vault/src/commands/validate/quota_dispatch.rs @@ -65,6 +65,7 @@ pub async fn fetch_key_quota( | "openai_api" | "anthropic_api" | "atlascloud_api" + | "cheaperinference_api" | "gemini_api" | "groq_api" | "xai_api" diff --git a/src-tauri/crates/key-vault/src/key_store/agent_env_builder.rs b/src-tauri/crates/key-vault/src/key_store/agent_env_builder.rs index 822e63101a..9e2740d68e 100644 --- a/src-tauri/crates/key-vault/src/key_store/agent_env_builder.rs +++ b/src-tauri/crates/key-vault/src/key_store/agent_env_builder.rs @@ -425,6 +425,7 @@ impl KeyService { | ModelType::ModelscopeApi | ModelType::AihubmixApi | ModelType::CherryinApi + | ModelType::CheaperinferenceApi | ModelType::BedrockApi | ModelType::CustomApi | ModelType::OpenrouterApi @@ -458,6 +459,7 @@ impl KeyService { ModelType::ModelscopeApi => "MODELSCOPE_API_KEY", ModelType::AihubmixApi => "AIHUBMIX_API_KEY", ModelType::CherryinApi => "CHERRYIN_API_KEY", + ModelType::CheaperinferenceApi => "CHEAPERINFERENCE_API_KEY", ModelType::BedrockApi => "AWS_BEARER_TOKEN_BEDROCK", ModelType::CustomApi => "CUSTOM_API_KEY", ModelType::OpenrouterApi => "OPENROUTER_API_KEY", @@ -598,6 +600,7 @@ impl KeyService { | ModelType::ModelscopeApi | ModelType::AihubmixApi | ModelType::CherryinApi + | ModelType::CheaperinferenceApi | ModelType::BedrockApi | ModelType::CustomApi | ModelType::OpenrouterApi @@ -630,6 +633,7 @@ impl KeyService { ModelType::ModelscopeApi => "MODELSCOPE_API_KEY", ModelType::AihubmixApi => "AIHUBMIX_API_KEY", ModelType::CherryinApi => "CHERRYIN_API_KEY", + ModelType::CheaperinferenceApi => "CHEAPERINFERENCE_API_KEY", ModelType::BedrockApi => "AWS_BEARER_TOKEN_BEDROCK", ModelType::CustomApi => "CUSTOM_API_KEY", ModelType::OpenrouterApi => "OPENROUTER_API_KEY", diff --git a/src-tauri/crates/key-vault/src/key_store/tests/model_type_tests.rs b/src-tauri/crates/key-vault/src/key_store/tests/model_type_tests.rs index 8c76afbb25..3895ddb4a7 100644 --- a/src-tauri/crates/key-vault/src/key_store/tests/model_type_tests.rs +++ b/src-tauri/crates/key-vault/src/key_store/tests/model_type_tests.rs @@ -37,6 +37,7 @@ fn api_providers_are_api_key_providers() { ModelType::AnthropicApi, ModelType::OpenaiApi, ModelType::AtlascloudApi, + ModelType::CheaperinferenceApi, ModelType::DeepseekApi, ModelType::GeminiApi, ModelType::GroqApi, @@ -132,6 +133,7 @@ fn as_str_round_trips_through_from_str() { ModelType::AnthropicApi, ModelType::OpenaiApi, ModelType::AtlascloudApi, + ModelType::CheaperinferenceApi, ModelType::DeepseekApi, ModelType::GeminiApi, ModelType::GroqApi, diff --git a/src-tauri/crates/key-vault/src/key_store/types.rs b/src-tauri/crates/key-vault/src/key_store/types.rs index 03db3148ac..ce9ae79fc9 100644 --- a/src-tauri/crates/key-vault/src/key_store/types.rs +++ b/src-tauri/crates/key-vault/src/key_store/types.rs @@ -129,6 +129,7 @@ pub enum ModelType { ModelscopeApi, AihubmixApi, CherryinApi, + CheaperinferenceApi, /// AWS Bedrock via the `bedrock-mantle` OpenAI/Anthropic-compatible /// surface, authenticated with a Bedrock API key rather than SigV4. BedrockApi, @@ -198,6 +199,7 @@ impl ModelType { ModelType::ModelscopeApi => "modelscope_api", ModelType::AihubmixApi => "aihubmix_api", ModelType::CherryinApi => "cherryin_api", + ModelType::CheaperinferenceApi => "cheaperinference_api", ModelType::BedrockApi => "bedrock_api", ModelType::CustomApi => "custom_api", ModelType::AzureOpenaiApi => "azure_openai_api", @@ -261,6 +263,7 @@ impl ModelType { "modelscope_api" | "modelscope" => Some(ModelType::ModelscopeApi), "aihubmix_api" | "aihubmix" => Some(ModelType::AihubmixApi), "cherryin_api" | "cherryin" => Some(ModelType::CherryinApi), + "cheaperinference_api" | "cheaperinference" => Some(ModelType::CheaperinferenceApi), "bedrock_api" | "bedrock" => Some(ModelType::BedrockApi), "custom_api" | "custom" => Some(ModelType::CustomApi), "azure_openai_api" | "azure_openai" | "azure" => Some(ModelType::AzureOpenaiApi), diff --git a/src-tauri/crates/key-vault/src/provider_config.rs b/src-tauri/crates/key-vault/src/provider_config.rs index 4ef9175765..809fd82c8f 100644 --- a/src-tauri/crates/key-vault/src/provider_config.rs +++ b/src-tauri/crates/key-vault/src/provider_config.rs @@ -210,6 +210,13 @@ const CHERRYIN_ENDPOINTS: &[ProviderEndpointSpec] = &[ProviderEndpointSpec { anthropic_base_url: Some("https://open.cherryin.net"), }]; +const CHEAPERINFERENCE_ENDPOINTS: &[ProviderEndpointSpec] = &[ProviderEndpointSpec { + id: "default", + label: "Cheaper Inference", + base_url: "https://api.cheaperinference.com/v1", + anthropic_base_url: Some("https://api.cheaperinference.com"), +}]; + /// AWS Bedrock via the `bedrock-mantle` endpoint, which serves both an /// OpenAI-compatible (`/openai/v1`) and an Anthropic-compatible (`/anthropic`) /// surface authenticated with a Bedrock API key as a bearer / `x-api-key` @@ -483,6 +490,15 @@ pub fn get_provider_config(model_type: &str) -> ProviderConfig { "openai", ) .with_endpoints(CHERRYIN_ENDPOINTS), + "cheaperinference_api" => ProviderConfig::with_protocols( + "CHEAPERINFERENCE_API_KEY", + None, + true, + None, + &["openai", "anthropic"], + "openai", + ) + .with_endpoints(CHEAPERINFERENCE_ENDPOINTS), "bedrock_api" => ProviderConfig::with_protocols( "AWS_BEARER_TOKEN_BEDROCK", None, @@ -562,6 +578,7 @@ pub fn get_all_provider_configs() -> Vec<(String, ProviderConfig)> { "modelscope_api", "aihubmix_api", "cherryin_api", + "cheaperinference_api", "bedrock_api", "custom_api", "vllm_api", diff --git a/src-tauri/crates/key-vault/src/provider_config_tests.rs b/src-tauri/crates/key-vault/src/provider_config_tests.rs index 896f000cde..b6a4b593d4 100644 --- a/src-tauri/crates/key-vault/src/provider_config_tests.rs +++ b/src-tauri/crates/key-vault/src/provider_config_tests.rs @@ -419,6 +419,7 @@ fn new_aggregators_are_openai_and_anthropic_capable() { "aihubmix_api", "modelscope_api", "cherryin_api", + "cheaperinference_api", "siliconflow_api", ] { let config = get_provider_config(model_type); diff --git a/src/api/tauri/rpc/schemas/validationEnums.ts b/src/api/tauri/rpc/schemas/validationEnums.ts index 851b776ec4..2cfe39c7fd 100644 --- a/src/api/tauri/rpc/schemas/validationEnums.ts +++ b/src/api/tauri/rpc/schemas/validationEnums.ts @@ -102,6 +102,7 @@ export const ApiProviderTypeSchema = z.union([ z.literal("modelscope_api"), z.literal("aihubmix_api"), z.literal("cherryin_api"), + z.literal("cheaperinference_api"), z.literal("bedrock_api"), z.literal("custom_api"), z.literal("vllm_api"), diff --git a/src/assets/providers/index.ts b/src/assets/providers/index.ts index cc72a2d4ca..1cd76ca384 100644 --- a/src/assets/providers/index.ts +++ b/src/assets/providers/index.ts @@ -55,6 +55,7 @@ const API_KEY_PROVIDER_LIST: ApiProviderType[] = [ "atlascloud_api", // Atlas Cloud "azure_anthropic_api", // Azure Anthropic "azure_openai_api", // Azure OpenAI + "cheaperinference_api", // Cheaper Inference "deepseek_api", // DeepSeek "gemini_api", // Google Gemini "groq_api", // Groq diff --git a/src/components/ModelIcon/modelTypeIcons.ts b/src/components/ModelIcon/modelTypeIcons.ts index 05db965a35..8a38a09818 100644 --- a/src/components/ModelIcon/modelTypeIcons.ts +++ b/src/components/ModelIcon/modelTypeIcons.ts @@ -61,6 +61,7 @@ export const MODEL_TYPE_TO_ICON: Record = { modelscope_api: "modelscope", aihubmix_api: "aihubmix", cherryin_api: "cherryin", + cheaperinference_api: "custom", bedrock_api: "aws", custom_api: "custom", moonshot_api: "kimi", diff --git a/src/scaffold/WizardSystem/variants/KeyVault/hooks/useProviderRegistry.ts b/src/scaffold/WizardSystem/variants/KeyVault/hooks/useProviderRegistry.ts index 517fad28a8..b4cbeb750a 100644 --- a/src/scaffold/WizardSystem/variants/KeyVault/hooks/useProviderRegistry.ts +++ b/src/scaffold/WizardSystem/variants/KeyVault/hooks/useProviderRegistry.ts @@ -169,6 +169,7 @@ const PRIMARY_PROVIDER_KEYS = new Set([ "modelscope_api", "aihubmix_api", "cherryin_api", + "cheaperinference_api", "atlascloud_api", "bedrock_api", "custom_api",