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
35 changes: 33 additions & 2 deletions crates/jcode-provider-metadata/src/catalog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,21 @@ pub const DEEPSEEK_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
requires_api_key: true,
};

pub const COHERE_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
id: "cohere",
display_name: "Cohere",
// Cohere ships an OpenAI-compatible endpoint under /compatibility/v1.
// It accepts the OpenAI Chat Completions request shape and returns the
// OpenAI streaming chunk schema; see
// https://docs.cohere.com/v2/docs/compatibility-api
api_base: "https://api.cohere.com/compatibility/v1",
api_key_env: "COHERE_API_KEY",
env_file: "cohere.env",
setup_url: "https://docs.cohere.com/v2/docs/compatibility-api",
default_model: Some("command-a-03-2025"),
requires_api_key: true,
};

pub const COMTEGRA_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfile {
id: "comtegra",
display_name: "Comtegra GPU Cloud",
Expand Down Expand Up @@ -359,7 +374,7 @@ pub const OPENAI_COMPAT_PROFILE: OpenAiCompatibleProfile = OpenAiCompatibleProfi
requires_api_key: true,
};

pub(crate) const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 32] = [
pub(crate) const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 33] = [
OPENCODE_PROFILE,
OPENCODE_GO_PROFILE,
ZAI_PROFILE,
Expand All @@ -371,6 +386,7 @@ pub(crate) const OPENAI_COMPAT_PROFILES: [OpenAiCompatibleProfile; 32] = [
BASETEN_PROFILE,
CORTECS_PROFILE,
DEEPSEEK_PROFILE,
COHERE_PROFILE,
COMTEGRA_PROFILE,
FPT_PROFILE,
FIRMWARE_PROFILE,
Expand Down Expand Up @@ -652,6 +668,20 @@ pub const DEEPSEEK_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescri
order: LoginProviderSurfaceOrder::new(Some(21), Some(21), Some(21), Some(21), Some(21)),
};

pub const COHERE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
id: "cohere",
display_name: "Cohere",
auth_kind: LoginProviderAuthKind::ApiKey,
auth_state_key: LoginProviderAuthStateKey::OpenRouterLike,
auth_status_method: "API key",
aliases: &["command-r", "command-a"],
menu_detail: "OpenAI-compatible Cohere API",
recommended: false,
target: LoginProviderTarget::OpenAiCompatible(COHERE_PROFILE),
// Slot in next to DeepSeek (21) since both are RAG/tool-leaning vendors.
order: LoginProviderSurfaceOrder::new(Some(22), Some(22), Some(22), Some(22), Some(22)),
};

pub const COMTEGRA_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescriptor {
id: "comtegra",
display_name: "Comtegra GPU Cloud",
Expand Down Expand Up @@ -990,7 +1020,7 @@ pub const GOOGLE_LOGIN_PROVIDER: LoginProviderDescriptor = LoginProviderDescript
order: LoginProviderSurfaceOrder::new(Some(13), None, None, None, None),
};

pub(crate) const LOGIN_PROVIDERS: [LoginProviderDescriptor; 45] = [
pub(crate) const LOGIN_PROVIDERS: [LoginProviderDescriptor; 46] = [
AUTO_IMPORT_LOGIN_PROVIDER,
CLAUDE_LOGIN_PROVIDER,
OPENAI_LOGIN_PROVIDER,
Expand All @@ -1010,6 +1040,7 @@ pub(crate) const LOGIN_PROVIDERS: [LoginProviderDescriptor; 45] = [
BASETEN_LOGIN_PROVIDER,
CORTECS_LOGIN_PROVIDER,
DEEPSEEK_LOGIN_PROVIDER,
COHERE_LOGIN_PROVIDER,
COMTEGRA_LOGIN_PROVIDER,
FPT_LOGIN_PROVIDER,
FIRMWARE_LOGIN_PROVIDER,
Expand Down
32 changes: 32 additions & 0 deletions crates/jcode-provider-metadata/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,38 @@ mod tests {
assert_eq!(MINIMAX_PROFILE.api_key_env, "OPENAI_API_KEY");
}

#[test]
fn cohere_profile_uses_openai_compatibility_endpoint() {
// Issue #18: Cohere ships an OpenAI-compatible endpoint at
// /compatibility/v1 that accepts the OpenAI Chat Completions request
// shape. Wire it as a first-class provider preset rather than asking
// users to configure it manually as openai-compatible.
assert_eq!(COHERE_PROFILE.id, "cohere");
assert_eq!(
COHERE_PROFILE.api_base,
"https://api.cohere.com/compatibility/v1"
);
assert_eq!(COHERE_PROFILE.api_key_env, "COHERE_API_KEY");
assert_eq!(COHERE_PROFILE.env_file, "cohere.env");
assert_eq!(COHERE_PROFILE.default_model, Some("command-a-03-2025"));
assert!(COHERE_PROFILE.requires_api_key);
assert!(matches!(
COHERE_LOGIN_PROVIDER.target,
LoginProviderTarget::OpenAiCompatible(profile) if profile.id == "cohere"
));
// Aliases must round-trip back to the cohere id so users can type
// `--provider command-a` or `--provider command-r` and land on the
// right preset.
assert_eq!(
resolve_login_provider("command-a").map(|p| p.id),
Some("cohere")
);
assert_eq!(
resolve_login_provider("command-r").map(|p| p.id),
Some("cohere")
);
}

#[test]
fn nvidia_nim_profile_uses_hosted_openai_compatible_configuration() {
assert_eq!(
Expand Down