Skip to content

Commit 36aee22

Browse files
authored
Add FPT AI Marketplace provider
1 parent 3018426 commit 36aee22

4 files changed

Lines changed: 48 additions & 10 deletions

File tree

crates/jcode-provider-metadata/src/lib.rs

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,17 @@ pub const COMTEGRA_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
238238
requires_api_key: true,
239239
};
240240

241+
pub const FPT_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
242+
id: "fpt",
243+
display_name: "FPT AI Marketplace",
244+
api_base: "https://mkp-api.fptcloud.com",
245+
api_key_env: "FPT_API_KEY",
246+
env_file: "fpt.env",
247+
setup_url: "https://ai-docs.fptcloud.com/api-reference/ai-marketplace/api-reference/api-integration-large-language-model-md",
248+
default_model: Some("GLM-5.1"),
249+
requires_api_key: true,
250+
};
251+
241252
pub const FIRMWARE_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
242253
id: "firmware",
243254
display_name: "Firmware",
@@ -458,7 +469,7 @@ pub const OPENAI_COMPAT_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfi
458469
requires_api_key: true,
459470
};
460471

461-
const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 29] = [
472+
const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 30] = [
462473
OPENCODE_PROFILE,
463474
OPENCODE_GO_PROFILE,
464475
ZAI_PROFILE,
@@ -471,6 +482,7 @@ const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 29] = [
471482
CORTECS_PROFILE,
472483
DEEPSEEK_PROFILE,
473484
COMTEGRA_PROFILE,
485+
FPT_PROFILE,
474486
FIRMWARE_PROFILE,
475487
HUGGING_FACE_PROFILE,
476488
MOONSHOT_PROFILE,
@@ -761,6 +773,19 @@ pub const COMTEGRA_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
761773
order: LoginProviderSurfaceOrder::new(Some(22), Some(22), Some(22), Some(22), Some(22)),
762774
};
763775

776+
pub const FPT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
777+
id: "fpt",
778+
display_name: "FPT AI Marketplace",
779+
auth_kind: LoginProviderAuthKind::ApiKey,
780+
auth_state_key: LoginProviderAuthStateKey::OpenRouterLike,
781+
auth_status_method: "API key",
782+
aliases: &["fpt-ai", "fptcloud", "fpt-cloud"],
783+
menu_detail: "OpenAI-compatible FPT AI Marketplace API",
784+
recommended: false,
785+
target: LoginProviderTarget::OpenAiCompatible(FPT_PROFILE),
786+
order: LoginProviderSurfaceOrder::new(Some(23), Some(23), Some(23), Some(23), Some(23)),
787+
};
788+
764789
pub const FIRMWARE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
765790
id: "firmware",
766791
display_name: "Firmware",
@@ -771,7 +796,7 @@ pub const FIRMWARE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
771796
menu_detail: "API key",
772797
recommended: false,
773798
target: LoginProviderTarget::OpenAiCompatible(FIRMWARE_PROFILE),
774-
order: LoginProviderSurfaceOrder::new(Some(22), Some(22), Some(22), Some(22), Some(22)),
799+
order: LoginProviderSurfaceOrder::new(Some(24), Some(24), Some(24), Some(24), Some(24)),
775800
};
776801

777802
pub const HUGGING_FACE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
@@ -784,7 +809,7 @@ pub const HUGGING_FACE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDe
784809
menu_detail: "API key",
785810
recommended: false,
786811
target: LoginProviderTarget::OpenAiCompatible(HUGGING_FACE_PROFILE),
787-
order: LoginProviderSurfaceOrder::new(Some(23), Some(23), Some(23), Some(23), Some(23)),
812+
order: LoginProviderSurfaceOrder::new(Some(25), Some(25), Some(25), Some(25), Some(25)),
788813
};
789814

790815
pub const MOONSHOT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
@@ -797,7 +822,7 @@ pub const MOONSHOT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
797822
menu_detail: "API key",
798823
recommended: false,
799824
target: LoginProviderTarget::OpenAiCompatible(MOONSHOT_PROFILE),
800-
order: LoginProviderSurfaceOrder::new(Some(24), Some(24), Some(24), Some(24), Some(24)),
825+
order: LoginProviderSurfaceOrder::new(Some(26), Some(26), Some(26), Some(26), Some(26)),
801826
};
802827

803828
pub const NEBIUS_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
@@ -810,7 +835,7 @@ pub const NEBIUS_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescript
810835
menu_detail: "API key",
811836
recommended: false,
812837
target: LoginProviderTarget::OpenAiCompatible(NEBIUS_PROFILE),
813-
order: LoginProviderSurfaceOrder::new(Some(25), Some(25), Some(25), Some(25), Some(25)),
838+
order: LoginProviderSurfaceOrder::new(Some(27), Some(27), Some(27), Some(27), Some(27)),
814839
};
815840

816841
pub const SCALEWAY_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
@@ -823,7 +848,7 @@ pub const SCALEWAY_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
823848
menu_detail: "API key",
824849
recommended: false,
825850
target: LoginProviderTarget::OpenAiCompatible(SCALEWAY_PROFILE),
826-
order: LoginProviderSurfaceOrder::new(Some(26), Some(26), Some(26), Some(26), Some(26)),
851+
order: LoginProviderSurfaceOrder::new(Some(28), Some(28), Some(28), Some(28), Some(28)),
827852
};
828853

829854
pub const STACKIT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
@@ -836,7 +861,7 @@ pub const STACKIT_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescrip
836861
menu_detail: "API key",
837862
recommended: false,
838863
target: LoginProviderTarget::OpenAiCompatible(STACKIT_PROFILE),
839-
order: LoginProviderSurfaceOrder::new(Some(27), Some(27), Some(27), Some(27), Some(27)),
864+
order: LoginProviderSurfaceOrder::new(Some(29), Some(29), Some(29), Some(29), Some(29)),
840865
};
841866

842867
pub const GROQ_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
@@ -849,7 +874,7 @@ pub const GROQ_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor
849874
menu_detail: "API key",
850875
recommended: false,
851876
target: LoginProviderTarget::OpenAiCompatible(GROQ_PROFILE),
852-
order: LoginProviderSurfaceOrder::new(Some(28), Some(28), Some(28), Some(28), Some(28)),
877+
order: LoginProviderSurfaceOrder::new(Some(30), Some(30), Some(30), Some(30), Some(30)),
853878
};
854879

855880
pub const MISTRAL_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
@@ -1047,7 +1072,7 @@ pub const GOOGLE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescript
10471072
order: LoginProviderSurfaceOrder::new(Some(13), None, None, None, None),
10481073
};
10491074

1050-
const LOGIN_PROVIDERS: [LoginProviderDescriptor; 42] = [
1075+
const LOGIN_PROVIDERS: [LoginProviderDescriptor; 43] = [
10511076
AUTO_IMPORT_LOGIN_PROVIDER,
10521077
CLAUDE_LOGIN_PROVIDER,
10531078
OPENAI_LOGIN_PROVIDER,
@@ -1068,6 +1093,7 @@ const LOGIN_PROVIDERS: [LoginProviderDescriptor; 42] = [
10681093
CORTECS_LOGIN_PROVIDER,
10691094
DEEPSEEK_LOGIN_PROVIDER,
10701095
COMTEGRA_LOGIN_PROVIDER,
1096+
FPT_LOGIN_PROVIDER,
10711097
FIRMWARE_LOGIN_PROVIDER,
10721098
HUGGING_FACE_LOGIN_PROVIDER,
10731099
MOONSHOT_LOGIN_PROVIDER,

src/cli/args.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub(crate) enum ProviderAuthArg {
3131
#[command(version = env!("JCODE_VERSION"))]
3232
#[command(about = "J-Code: A coding agent using Claude Max or ChatGPT Pro subscriptions")]
3333
pub(crate) struct Args {
34-
/// 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)
34+
/// 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)
3535
#[arg(short, long, default_value = "auto", global = true)]
3636
pub(crate) provider: ProviderChoice,
3737

src/cli/provider_init.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ pub enum ProviderChoice {
6565
#[value(alias = "cgc", alias = "comtegra-gpu-cloud")]
6666
Comtegra,
6767
Deepseek,
68+
#[value(alias = "fpt-ai", alias = "fptcloud", alias = "fpt-cloud")]
69+
Fpt,
6870
Firmware,
6971
#[value(alias = "hugging-face", alias = "hf")]
7072
HuggingFace,
@@ -132,6 +134,7 @@ impl ProviderChoice {
132134
Self::Cortecs => "cortecs",
133135
Self::Comtegra => "comtegra",
134136
Self::Deepseek => "deepseek",
137+
Self::Fpt => "fpt",
135138
Self::Firmware => "firmware",
136139
Self::HuggingFace => "huggingface",
137140
Self::MoonshotAi => "moonshotai",
@@ -173,6 +176,7 @@ pub fn profile_for_choice(choice: &ProviderChoice) -> Option<OpenAiCompatiblePro
173176
ProviderChoice::Cortecs => Some(crate::provider_catalog::CORTECS_PROFILE),
174177
ProviderChoice::Comtegra => Some(crate::provider_catalog::COMTEGRA_PROFILE),
175178
ProviderChoice::Deepseek => Some(crate::provider_catalog::DEEPSEEK_PROFILE),
179+
ProviderChoice::Fpt => Some(crate::provider_catalog::FPT_PROFILE),
176180
ProviderChoice::Firmware => Some(crate::provider_catalog::FIRMWARE_PROFILE),
177181
ProviderChoice::HuggingFace => Some(crate::provider_catalog::HUGGING_FACE_PROFILE),
178182
ProviderChoice::MoonshotAi => Some(crate::provider_catalog::MOONSHOT_PROFILE),
@@ -220,6 +224,7 @@ pub fn login_provider_for_choice(choice: &ProviderChoice) -> Option<LoginProvide
220224
ProviderChoice::Cortecs => Some(crate::provider_catalog::CORTECS_LOGIN_PROVIDER),
221225
ProviderChoice::Comtegra => Some(crate::provider_catalog::COMTEGRA_LOGIN_PROVIDER),
222226
ProviderChoice::Deepseek => Some(crate::provider_catalog::DEEPSEEK_LOGIN_PROVIDER),
227+
ProviderChoice::Fpt => Some(crate::provider_catalog::FPT_LOGIN_PROVIDER),
223228
ProviderChoice::Firmware => Some(crate::provider_catalog::FIRMWARE_LOGIN_PROVIDER),
224229
ProviderChoice::HuggingFace => Some(crate::provider_catalog::HUGGING_FACE_LOGIN_PROVIDER),
225230
ProviderChoice::MoonshotAi => Some(crate::provider_catalog::MOONSHOT_LOGIN_PROVIDER),
@@ -273,6 +278,7 @@ pub fn choice_for_login_provider(provider: LoginProviderDescriptor) -> Option<Pr
273278
ProviderChoice::Cortecs,
274279
ProviderChoice::Comtegra,
275280
ProviderChoice::Deepseek,
281+
ProviderChoice::Fpt,
276282
ProviderChoice::Firmware,
277283
ProviderChoice::HuggingFace,
278284
ProviderChoice::MoonshotAi,
@@ -1262,6 +1268,7 @@ async fn init_provider_with_options(
12621268
| ProviderChoice::Cortecs
12631269
| ProviderChoice::Comtegra
12641270
| ProviderChoice::Deepseek
1271+
| ProviderChoice::Fpt
12651272
| ProviderChoice::Firmware
12661273
| ProviderChoice::HuggingFace
12671274
| ProviderChoice::MoonshotAi

src/provider_catalog.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,11 @@ pub fn openai_compatible_profile_static_models(profile: OpenAiCompatibleProfile)
201201
push("gte-qwen2-7b");
202202
push("glm-51-nvfp4");
203203
}
204+
"fpt" => {
205+
push("GLM-5.1");
206+
push("GLM-4.7");
207+
push("Llama-3.3-70B-Instruct");
208+
}
204209
"kimi" => {
205210
push("kimi-for-coding");
206211
}

0 commit comments

Comments
 (0)