Skip to content
Merged
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
44 changes: 35 additions & 9 deletions crates/jcode-provider-metadata/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,17 @@ pub const COMTEGRA_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
requires_api_key: true,
};

pub const FPT_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
id: "fpt",
display_name: "FPT AI Marketplace",
api_base: "https://mkp-api.fptcloud.com",
api_key_env: "FPT_API_KEY",
env_file: "fpt.env",
setup_url: "https://ai-docs.fptcloud.com/api-reference/ai-marketplace/api-reference/api-integration-large-language-model-md",
default_model: Some("GLM-5.1"),
requires_api_key: true,
};

pub const FIRMWARE_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
id: "firmware",
display_name: "Firmware",
Expand Down Expand Up @@ -458,7 +469,7 @@ pub const OPENAI_COMPAT_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfi
requires_api_key: true,
};

const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 29] = [
const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 30] = [
OPENCODE_PROFILE,
OPENCODE_GO_PROFILE,
ZAI_PROFILE,
Expand All @@ -471,6 +482,7 @@ const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 29] = [
CORTECS_PROFILE,
DEEPSEEK_PROFILE,
COMTEGRA_PROFILE,
FPT_PROFILE,
FIRMWARE_PROFILE,
HUGGING_FACE_PROFILE,
MOONSHOT_PROFILE,
Expand Down Expand Up @@ -761,6 +773,19 @@ pub const COMTEGRA_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
order: LoginProviderSurfaceOrder::new(Some(22), Some(22), Some(22), Some(22), Some(22)),
};

pub const FPT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
id: "fpt",
display_name: "FPT AI Marketplace",
auth_kind: LoginProviderAuthKind::ApiKey,
auth_state_key: LoginProviderAuthStateKey::OpenRouterLike,
auth_status_method: "API key",
aliases: &["fpt-ai", "fptcloud", "fpt-cloud"],
menu_detail: "OpenAI-compatible FPT AI Marketplace API",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(FPT_PROFILE),
order: LoginProviderSurfaceOrder::new(Some(23), Some(23), Some(23), Some(23), Some(23)),
};

pub const FIRMWARE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
id: "firmware",
display_name: "Firmware",
Expand All @@ -771,7 +796,7 @@ pub const FIRMWARE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
menu_detail: "API key",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(FIRMWARE_PROFILE),
order: LoginProviderSurfaceOrder::new(Some(22), Some(22), Some(22), Some(22), Some(22)),
order: LoginProviderSurfaceOrder::new(Some(24), Some(24), Some(24), Some(24), Some(24)),
};

pub const HUGGING_FACE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
Expand All @@ -784,7 +809,7 @@ pub const HUGGING_FACE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDe
menu_detail: "API key",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(HUGGING_FACE_PROFILE),
order: LoginProviderSurfaceOrder::new(Some(23), Some(23), Some(23), Some(23), Some(23)),
order: LoginProviderSurfaceOrder::new(Some(25), Some(25), Some(25), Some(25), Some(25)),
};

pub const MOONSHOT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
Expand All @@ -797,7 +822,7 @@ pub const MOONSHOT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
menu_detail: "API key",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(MOONSHOT_PROFILE),
order: LoginProviderSurfaceOrder::new(Some(24), Some(24), Some(24), Some(24), Some(24)),
order: LoginProviderSurfaceOrder::new(Some(26), Some(26), Some(26), Some(26), Some(26)),
};

pub const NEBIUS_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
Expand All @@ -810,7 +835,7 @@ pub const NEBIUS_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescript
menu_detail: "API key",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(NEBIUS_PROFILE),
order: LoginProviderSurfaceOrder::new(Some(25), Some(25), Some(25), Some(25), Some(25)),
order: LoginProviderSurfaceOrder::new(Some(27), Some(27), Some(27), Some(27), Some(27)),
};

pub const SCALEWAY_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
Expand All @@ -823,7 +848,7 @@ pub const SCALEWAY_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
menu_detail: "API key",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(SCALEWAY_PROFILE),
order: LoginProviderSurfaceOrder::new(Some(26), Some(26), Some(26), Some(26), Some(26)),
order: LoginProviderSurfaceOrder::new(Some(28), Some(28), Some(28), Some(28), Some(28)),
};

pub const STACKIT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
Expand All @@ -836,7 +861,7 @@ pub const STACKIT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescrip
menu_detail: "API key",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(STACKIT_PROFILE),
order: LoginProviderSurfaceOrder::new(Some(27), Some(27), Some(27), Some(27), Some(27)),
order: LoginProviderSurfaceOrder::new(Some(29), Some(29), Some(29), Some(29), Some(29)),
};

pub const GROQ_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
Expand All @@ -849,7 +874,7 @@ pub const GROQ_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor
menu_detail: "API key",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(GROQ_PROFILE),
order: LoginProviderSurfaceOrder::new(Some(28), Some(28), Some(28), Some(28), Some(28)),
order: LoginProviderSurfaceOrder::new(Some(30), Some(30), Some(30), Some(30), Some(30)),
};

pub const MISTRAL_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
Expand Down Expand Up @@ -1047,7 +1072,7 @@ pub const GOOGLE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescript
order: LoginProviderSurfaceOrder::new(Some(13), None, None, None, None),
};

const LOGIN_PROVIDERS: [LoginProviderDescriptor; 42] = [
const LOGIN_PROVIDERS: [LoginProviderDescriptor; 43] = [
AUTO_IMPORT_LOGIN_PROVIDER,
CLAUDE_LOGIN_PROVIDER,
OPENAI_LOGIN_PROVIDER,
Expand All @@ -1068,6 +1093,7 @@ const LOGIN_PROVIDERS: [LoginProviderDescriptor; 42] = [
CORTECS_LOGIN_PROVIDER,
DEEPSEEK_LOGIN_PROVIDER,
COMTEGRA_LOGIN_PROVIDER,
FPT_LOGIN_PROVIDER,
FIRMWARE_LOGIN_PROVIDER,
HUGGING_FACE_LOGIN_PROVIDER,
MOONSHOT_LOGIN_PROVIDER,
Expand Down
2 changes: 1 addition & 1 deletion src/cli/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub(crate) enum ProviderAuthArg {
#[command(version = env!("JCODE_VERSION"))]
#[command(about = "J-Code: A coding agent using Claude Max or ChatGPT Pro subscriptions")]
pub(crate) struct Args {
/// Provider to use (jcode, claude, openai, openai-api, openrouter, azure, opencode, opencode-go, zai, 302ai, baseten, cortecs, comtegra, deepseek, firmware, huggingface, moonshotai, nebius, scaleway, stackit, groq, mistral, perplexity, togetherai, deepinfra, xai, lmstudio, ollama, chutes, cerebras, alibaba-coding-plan, openai-compatible, cursor, copilot, gemini, antigravity, google, or auto-detect)
/// Provider to use (jcode, claude, openai, openai-api, openrouter, azure, opencode, opencode-go, zai, 302ai, baseten, cortecs, comtegra, deepseek, fpt, firmware, huggingface, moonshotai, nebius, scaleway, stackit, groq, mistral, perplexity, togetherai, deepinfra, xai, lmstudio, ollama, chutes, cerebras, alibaba-coding-plan, openai-compatible, cursor, copilot, gemini, antigravity, google, or auto-detect)
#[arg(short, long, default_value = "auto", global = true)]
pub(crate) provider: ProviderChoice,

Expand Down
7 changes: 7 additions & 0 deletions src/cli/provider_init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ pub enum ProviderChoice {
#[value(alias = "cgc", alias = "comtegra-gpu-cloud")]
Comtegra,
Deepseek,
#[value(alias = "fpt-ai", alias = "fptcloud", alias = "fpt-cloud")]
Fpt,
Firmware,
#[value(alias = "hugging-face", alias = "hf")]
HuggingFace,
Expand Down Expand Up @@ -132,6 +134,7 @@ impl ProviderChoice {
Self::Cortecs => "cortecs",
Self::Comtegra => "comtegra",
Self::Deepseek => "deepseek",
Self::Fpt => "fpt",
Self::Firmware => "firmware",
Self::HuggingFace => "huggingface",
Self::MoonshotAi => "moonshotai",
Expand Down Expand Up @@ -173,6 +176,7 @@ pub fn profile_for_choice(choice: &ProviderChoice) -> Option<OpenAiCompatiblePro
ProviderChoice::Cortecs => Some(crate::provider_catalog::CORTECS_PROFILE),
ProviderChoice::Comtegra => Some(crate::provider_catalog::COMTEGRA_PROFILE),
ProviderChoice::Deepseek => Some(crate::provider_catalog::DEEPSEEK_PROFILE),
ProviderChoice::Fpt => Some(crate::provider_catalog::FPT_PROFILE),
ProviderChoice::Firmware => Some(crate::provider_catalog::FIRMWARE_PROFILE),
ProviderChoice::HuggingFace => Some(crate::provider_catalog::HUGGING_FACE_PROFILE),
ProviderChoice::MoonshotAi => Some(crate::provider_catalog::MOONSHOT_PROFILE),
Expand Down Expand Up @@ -220,6 +224,7 @@ pub fn login_provider_for_choice(choice: &ProviderChoice) -> Option<LoginProvide
ProviderChoice::Cortecs => Some(crate::provider_catalog::CORTECS_LOGIN_PROVIDER),
ProviderChoice::Comtegra => Some(crate::provider_catalog::COMTEGRA_LOGIN_PROVIDER),
ProviderChoice::Deepseek => Some(crate::provider_catalog::DEEPSEEK_LOGIN_PROVIDER),
ProviderChoice::Fpt => Some(crate::provider_catalog::FPT_LOGIN_PROVIDER),
ProviderChoice::Firmware => Some(crate::provider_catalog::FIRMWARE_LOGIN_PROVIDER),
ProviderChoice::HuggingFace => Some(crate::provider_catalog::HUGGING_FACE_LOGIN_PROVIDER),
ProviderChoice::MoonshotAi => Some(crate::provider_catalog::MOONSHOT_LOGIN_PROVIDER),
Expand Down Expand Up @@ -273,6 +278,7 @@ pub fn choice_for_login_provider(provider: LoginProviderDescriptor) -> Option<Pr
ProviderChoice::Cortecs,
ProviderChoice::Comtegra,
ProviderChoice::Deepseek,
ProviderChoice::Fpt,
ProviderChoice::Firmware,
ProviderChoice::HuggingFace,
ProviderChoice::MoonshotAi,
Expand Down Expand Up @@ -1262,6 +1268,7 @@ async fn init_provider_with_options(
| ProviderChoice::Cortecs
| ProviderChoice::Comtegra
| ProviderChoice::Deepseek
| ProviderChoice::Fpt
| ProviderChoice::Firmware
| ProviderChoice::HuggingFace
| ProviderChoice::MoonshotAi
Expand Down
5 changes: 5 additions & 0 deletions src/provider_catalog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,11 @@ pub fn openai_compatible_profile_static_models(profile: OpenAiCompatibleProfile)
push("gte-qwen2-7b");
push("glm-51-nvfp4");
}
"fpt" => {
push("GLM-5.1");
push("GLM-4.7");
push("Llama-3.3-70B-Instruct");
}
"kimi" => {
push("kimi-for-coding");
}
Expand Down
Loading