diff --git a/openless-all/app/crates/openless-core/src/asr/whisper.rs b/openless-all/app/crates/openless-core/src/asr/whisper.rs index 7eff2fde4..1d566ceef 100644 --- a/openless-all/app/crates/openless-core/src/asr/whisper.rs +++ b/openless-all/app/crates/openless-core/src/asr/whisper.rs @@ -57,6 +57,8 @@ pub struct WhisperBatchASR { /// 一等 `hotwords` 参数(JSON 数组字符串)。StepFun 等厂商不认 `prompt` /// (静默忽略),但提供专门的热词字段——用它词典才真正生效。空 = 不发。 hotwords: Vec, + /// 自定义端点路径(默认 `/audio/transcriptions`;MiniMax 等厂商为 `/speech_to_text`)。 + endpoint_path: Option, buffer: Mutex>, } @@ -80,10 +82,17 @@ impl WhisperBatchASR { language: None, enable_itn: true, hotwords: Vec::new(), + endpoint_path: None, buffer: Mutex::new(Vec::new()), } } + /// 设置自定义端点路径(例如 `"/speech_to_text"`)。 + pub fn with_endpoint_path(mut self, path: impl Into) -> Self { + self.endpoint_path = Some(path.into()); + self + } + /// 设置请求体编码方式(默认 `Multipart`)。OpenRouter 需 `OpenRouterJson`。 /// 用 builder 而非给 `new()` 加参数,避免改动既有 4 处构造点的签名。 pub fn with_request_format(mut self, request_format: AsrRequestFormat) -> Self { @@ -166,7 +175,7 @@ impl WhisperBatchASR { .map(|chunk| i16::from_le_bytes([chunk[0], chunk[1]])) .collect(); let wav = encode_wav_16k_mono(&samples); - let url = transcription_url(&self.base_url)?; + let url = transcription_url(&self.base_url, self.endpoint_path.as_deref())?; let client = crate::net::http(); let request = match self.request_format { @@ -275,6 +284,19 @@ impl WhisperBatchASR { } let json: serde_json::Value = resp.json().await.context("parse Whisper response")?; + if let Some(base_resp) = json.get("base_resp") { + let status_code = base_resp + .get("status_code") + .and_then(|c| c.as_i64()) + .unwrap_or(0); + if status_code != 0 { + let msg = base_resp + .get("status_msg") + .and_then(|m| m.as_str()) + .unwrap_or("unknown error"); + anyhow::bail!("MiniMax API error {}: {}", status_code, msg); + } + } if self.verbose_json { // verbose_json:セグメントのメタデータで幻聴を除いた本文を組む。 // segments が無い応答では内部で従来どおり text にフォールバック。 @@ -402,16 +424,36 @@ pub fn split_pcm_by_duration(pcm: &[u8], max_chunk_duration_ms: Option) -> pcm.chunks(bytes_per_chunk).collect() } -fn transcription_url(base_url: &str) -> Result { +fn transcription_url(base_url: &str, endpoint_path: Option<&str>) -> Result { let parsed = reqwest::Url::parse(base_url.trim()).context("parse Whisper base URL")?; let mut url = parsed.clone(); let path = parsed.path().trim_end_matches('/'); - let next_path = if path.ends_with("/audio/transcriptions") { + let next_path = if let Some(target) = endpoint_path { + let target = target.trim(); + if path.ends_with(target) { + path.to_string() + } else { + format!( + "{path}{}", + if target.starts_with('/') { + target.to_string() + } else { + format!("/{target}") + } + ) + } + } else if path.ends_with("/audio/transcriptions") || path.ends_with("/speech_to_text") { path.to_string() } else if path.ends_with("/audio") { format!("{path}/transcriptions") } else if let Some(prefix) = path.strip_suffix("/chat/completions") { format!("{prefix}/audio/transcriptions") + } else if parsed + .host_str() + .map_or(false, |h| h.ends_with("minimaxi.com") || h.ends_with("minimax.chat") || h.contains("minimax")) + || path.contains("minimax") + { + format!("{path}/speech_to_text") } else { format!("{path}/audio/transcriptions") }; @@ -745,24 +787,54 @@ mod tests { #[test] fn transcription_url_accepts_base_audio_or_full_endpoint() { assert_eq!( - transcription_url("https://open.bigmodel.cn/api/paas/v4").unwrap(), + transcription_url("https://open.bigmodel.cn/api/paas/v4", None).unwrap(), "https://open.bigmodel.cn/api/paas/v4/audio/transcriptions" ); assert_eq!( - transcription_url("https://open.bigmodel.cn/api/paas/v4/audio").unwrap(), + transcription_url("https://open.bigmodel.cn/api/paas/v4/audio", None).unwrap(), "https://open.bigmodel.cn/api/paas/v4/audio/transcriptions" ); assert_eq!( - transcription_url("https://open.bigmodel.cn/api/paas/v4/audio/transcriptions").unwrap(), + transcription_url( + "https://open.bigmodel.cn/api/paas/v4/audio/transcriptions", + None + ) + .unwrap(), "https://open.bigmodel.cn/api/paas/v4/audio/transcriptions" ); assert_eq!( transcription_url( - "https://open.bigmodel.cn/api/paas/v4/audio/transcriptions?api-version=2026-01-01" + "https://open.bigmodel.cn/api/paas/v4/audio/transcriptions?api-version=2026-01-01", + None ) .unwrap(), "https://open.bigmodel.cn/api/paas/v4/audio/transcriptions?api-version=2026-01-01" ); + // MiniMax & speech_to_text tests + assert_eq!( + transcription_url("https://api.minimaxi.com/v1", None).unwrap(), + "https://api.minimaxi.com/v1/speech_to_text" + ); + assert_eq!( + transcription_url("https://api.minimax.chat/v1", None).unwrap(), + "https://api.minimax.chat/v1/speech_to_text" + ); + assert_eq!( + transcription_url("https://custom-proxy.com/v1/speech_to_text", None).unwrap(), + "https://custom-proxy.com/v1/speech_to_text" + ); + assert_eq!( + transcription_url("https://custom-proxy.com/v1", Some("/speech_to_text")).unwrap(), + "https://custom-proxy.com/v1/speech_to_text" + ); + assert_eq!( + transcription_url( + "https://custom-proxy.com/v1/speech_to_text", + Some("/speech_to_text") + ) + .unwrap(), + "https://custom-proxy.com/v1/speech_to_text" + ); } #[test] diff --git a/openless-all/app/crates/openless-core/src/cloud_providers.rs b/openless-all/app/crates/openless-core/src/cloud_providers.rs index 29c31f088..cce9b6ec6 100644 --- a/openless-all/app/crates/openless-core/src/cloud_providers.rs +++ b/openless-all/app/crates/openless-core/src/cloud_providers.rs @@ -60,6 +60,7 @@ pub const SHARED_CLOUD_ASR_PROVIDER_TYPES: &[&str] = &[ "openrouter", "orcarouter", "zenmux", + "minimax", "openai-compatible", "xiaomi-mimo-asr", "iflytek", @@ -539,6 +540,9 @@ async fn build_cloud_transcription_session( ), ) .with_request_format(crate::provider_rules::whisper_request_format(provider_type)); + if provider_type == "minimax" { + provider = provider.with_endpoint_path("/speech_to_text"); + } if crate::provider_rules::whisper_uses_hotwords(provider_type) { provider = provider.with_hotwords(context.polish.hotwords.clone()); } diff --git a/openless-all/app/crates/openless-core/src/provider_rules.rs b/openless-all/app/crates/openless-core/src/provider_rules.rs index 7ed16b35f..9ae9b0ff2 100644 --- a/openless-all/app/crates/openless-core/src/provider_rules.rs +++ b/openless-all/app/crates/openless-core/src/provider_rules.rs @@ -32,6 +32,7 @@ const ASR_PROVIDER_TYPES: &[(&str, &str)] = &[ ("siliconflow", "asrSiliconflow"), ("stepfun", "asrStepfun"), ("zhipu", "asrZhipu"), + ("minimax", "asrMinimax"), ("groq", "asrGroq"), ("whisper", "asrWhisper"), ("openrouter", "asrOpenrouter"), @@ -353,6 +354,7 @@ fn static_models(kind: ProviderKind, provider_type: &str) -> &'static [&'static (ProviderKind::Asr, "xiaomi-mimo-asr") => &[crate::asr::mimo::DEFAULT_MODEL], (ProviderKind::Asr, "bailian-fun-asr-flash") => DASHSCOPE_MODELS, (ProviderKind::Asr, "elevenlabs") => &[crate::asr::elevenlabs::DEFAULT_MODEL], + (ProviderKind::Asr, "minimax") => &["asr-1.0"], (ProviderKind::Llm, crate::polish::CODEX_OAUTH_PROVIDER_ID) => &[ crate::polish::CODEX_DEFAULT_MODEL, "gpt-5.3-codex", @@ -555,6 +557,7 @@ pub fn default_asr_endpoint(provider_type: &str) -> Option<&'static str> { "siliconflow" => Some("https://api.siliconflow.cn/v1"), "stepfun" => Some("https://api.stepfun.com/v1"), "zhipu" => Some("https://open.bigmodel.cn/api/paas/v4"), + "minimax" => Some("https://api.minimaxi.com/v1"), "groq" => Some("https://api.groq.com/openai/v1"), "whisper" => Some("https://api.openai.com/v1"), "openrouter" => Some("https://openrouter.ai/api/v1"), @@ -574,6 +577,7 @@ pub fn default_asr_model(provider_type: &str) -> Option<&'static str> { "siliconflow" => Some("FunAudioLLM/SenseVoiceSmall"), "stepfun" => Some("stepaudio-2.5-asr"), "zhipu" => Some("glm-asr-2512"), + "minimax" => Some("asr-1.0"), "groq" => Some("whisper-large-v3-turbo"), "whisper" => Some("whisper-1"), "openrouter" => Some("openai/whisper-large-v3-turbo"), @@ -787,7 +791,7 @@ pub fn is_tencent_cloud_provider(id: &str) -> bool { pub fn is_whisper_compatible_provider(id: &str) -> bool { matches!( id, - "whisper" | "siliconflow" | "zhipu" | "groq" | "openrouter" | "stepfun" | "zenmux" + "whisper" | "siliconflow" | "zhipu" | "groq" | "openrouter" | "stepfun" | "zenmux" | "minimax" ) || id == OPENAI_COMPATIBLE_ASR_PROVIDER_ID } @@ -1259,6 +1263,26 @@ mod tests { assert!(llm.supported_request_formats.is_empty()); } + #[test] + fn minimax_asr_supplies_defaults_and_whisper_compatibility() { + assert!(crate::cloud_providers::SHARED_CLOUD_ASR_PROVIDER_TYPES.contains(&"minimax")); + let asr = provider_descriptor(ProviderKind::Asr, "minimax").unwrap(); + assert_eq!(asr.label_key, "asrMinimax"); + assert_eq!( + asr.default_endpoint.as_deref(), + Some("https://api.minimaxi.com/v1") + ); + assert_eq!(asr.default_model.as_deref(), Some("asr-1.0")); + assert_eq!(asr.static_models, vec!["asr-1.0"]); + assert_eq!(asr.auth_requirement, AuthRequirement::ApiKey); + assert_eq!(asr.validation_probe, ValidationProbe::AsrSilence); + assert!(is_whisper_compatible_provider("minimax")); + assert_eq!( + active_asr_provider_kind("minimax"), + ActiveAsrProviderKind::WhisperCompatible + ); + } + #[test] fn descriptors_are_the_single_source_for_defaults_auth_and_probes() { let compatible = provider_descriptor(ProviderKind::Asr, "openai-compatible").unwrap(); diff --git a/openless-all/app/src/i18n/de.ts b/openless-all/app/src/i18n/de.ts index 4e04956f3..f7dd310b0 100644 --- a/openless-all/app/src/i18n/de.ts +++ b/openless-all/app/src/i18n/de.ts @@ -1331,6 +1331,7 @@ export const de: typeof zhCN = { asrSiliconflow: 'SiliconFlow SenseVoice', asrStepfun: 'StepFun StepAudio ASR', asrZhipu: 'Zhipu GLM-ASR', + asrMinimax: 'MiniMax ASR', asrGroq: 'Groq Whisper-large-v3', asrWhisper: 'OpenAI Whisper (kompatibel)', asrOpenrouter: 'OpenRouter Whisper', diff --git a/openless-all/app/src/i18n/en.ts b/openless-all/app/src/i18n/en.ts index cd55ef226..764e2456c 100644 --- a/openless-all/app/src/i18n/en.ts +++ b/openless-all/app/src/i18n/en.ts @@ -1297,6 +1297,7 @@ export const en: typeof zhCN = { asrSiliconflow: 'SiliconFlow SenseVoice', asrStepfun: 'StepFun StepAudio ASR', asrZhipu: 'Zhipu GLM-ASR', + asrMinimax: 'MiniMax ASR', asrGroq: 'Groq Whisper-large-v3', asrWhisper: 'OpenAI Whisper (compatible)', asrOpenrouter: 'OpenRouter Whisper', diff --git a/openless-all/app/src/i18n/es.ts b/openless-all/app/src/i18n/es.ts index ec43ba5cf..ac88680bd 100644 --- a/openless-all/app/src/i18n/es.ts +++ b/openless-all/app/src/i18n/es.ts @@ -1323,6 +1323,7 @@ export const es: typeof zhCN = { asrSiliconflow: 'SiliconFlow SenseVoice', asrStepfun: 'StepFun StepAudio ASR', asrZhipu: 'Zhipu GLM-ASR', + asrMinimax: 'MiniMax ASR', asrGroq: 'Groq Whisper-large-v3', asrWhisper: 'OpenAI Whisper (compatible)', asrOpenrouter: 'OpenRouter Whisper', diff --git a/openless-all/app/src/i18n/fr.ts b/openless-all/app/src/i18n/fr.ts index 7a1850fe8..d7b788d05 100644 --- a/openless-all/app/src/i18n/fr.ts +++ b/openless-all/app/src/i18n/fr.ts @@ -1340,6 +1340,7 @@ export const fr: typeof zhCN = { asrSiliconflow: 'SiliconFlow SenseVoice', asrStepfun: 'StepFun StepAudio ASR', asrZhipu: 'Zhipu GLM-ASR', + asrMinimax: 'MiniMax ASR', asrGroq: 'Groq Whisper-large-v3', asrWhisper: 'OpenAI Whisper (compatible)', asrOpenrouter: 'OpenRouter Whisper', diff --git a/openless-all/app/src/i18n/ja.ts b/openless-all/app/src/i18n/ja.ts index 74f7ae579..de3a69b98 100644 --- a/openless-all/app/src/i18n/ja.ts +++ b/openless-all/app/src/i18n/ja.ts @@ -1284,6 +1284,7 @@ export const ja: typeof zhCN = { asrSiliconflow: 'SiliconFlow SenseVoice', asrStepfun: 'StepFun StepAudio ASR', asrZhipu: 'Zhipu GLM-ASR', + asrMinimax: 'MiniMax ASR', asrGroq: 'Groq Whisper-large-v3', asrWhisper: 'OpenAI Whisper(互換)', asrOpenrouter: 'OpenRouter Whisper', diff --git a/openless-all/app/src/i18n/ko.ts b/openless-all/app/src/i18n/ko.ts index b8b7cf6a7..6b5b57c7e 100644 --- a/openless-all/app/src/i18n/ko.ts +++ b/openless-all/app/src/i18n/ko.ts @@ -1276,6 +1276,7 @@ export const ko: typeof zhCN = { asrSiliconflow: 'SiliconFlow SenseVoice', asrStepfun: 'StepFun StepAudio ASR', asrZhipu: 'Zhipu GLM-ASR', + asrMinimax: 'MiniMax ASR', asrGroq: 'Groq Whisper-large-v3', asrWhisper: 'OpenAI Whisper(호환)', asrOpenrouter: 'OpenRouter Whisper', diff --git a/openless-all/app/src/i18n/zh-CN.ts b/openless-all/app/src/i18n/zh-CN.ts index 2753f4b19..831df61fb 100644 --- a/openless-all/app/src/i18n/zh-CN.ts +++ b/openless-all/app/src/i18n/zh-CN.ts @@ -1235,6 +1235,7 @@ export const zhCN = { asrSiliconflow: '硅基流动 SenseVoice', asrStepfun: '阶跃星辰 StepAudio', asrZhipu: '智谱 GLM-ASR', + asrMinimax: 'MiniMax ASR', asrGroq: 'Groq Whisper-large-v3', asrWhisper: 'OpenAI Whisper(兼容)', asrOpenrouter: 'OpenRouter Whisper', diff --git a/openless-all/app/src/i18n/zh-TW.ts b/openless-all/app/src/i18n/zh-TW.ts index dedc72735..855628e11 100644 --- a/openless-all/app/src/i18n/zh-TW.ts +++ b/openless-all/app/src/i18n/zh-TW.ts @@ -1237,6 +1237,7 @@ export const zhTW: typeof zhCN = { asrSiliconflow: '硅基流動 SenseVoice', asrStepfun: '階躍星辰 StepAudio', asrZhipu: '智譜 GLM-ASR', + asrMinimax: 'MiniMax ASR', asrGroq: 'Groq Whisper-large-v3', asrWhisper: 'OpenAI Whisper(兼容)', asrOpenrouter: 'OpenRouter Whisper', diff --git a/openless-all/app/src/lib/ipc/mock-provider-descriptors.json b/openless-all/app/src/lib/ipc/mock-provider-descriptors.json index d47ce5360..cbc02a6ee 100644 --- a/openless-all/app/src/lib/ipc/mock-provider-descriptors.json +++ b/openless-all/app/src/lib/ipc/mock-provider-descriptors.json @@ -1,9 +1,9 @@ [ { - "kind": "llm", - "providerType": "ark", - "labelKey": "ark", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://ark.cn-beijing.volces.com/api/v3", + "defaultModel": "deepseek-v3-2", + "defaultRequestFormat": "chat_completions", "endpointPresets": [ { "endpoint": "https://ark.cn-beijing.volces.com/api/plan/v3", @@ -16,285 +16,360 @@ "name": "Coding Plan" } ], - "defaultModel": "deepseek-v3-2", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", + "kind": "llm", + "labelKey": "ark", + "providerType": "ark", "staticModels": [], - "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "deepseek", - "labelKey": "deepseek", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.deepseek.com/v1", "defaultModel": "deepseek-v4-flash", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "deepseek", + "providerType": "deepseek", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "siliconflow", - "labelKey": "siliconflow", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.siliconflow.cn/v1", "defaultModel": "Qwen/Qwen2.5-7B-Instruct", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "siliconflow", + "providerType": "siliconflow", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "atlascloud", - "labelKey": "atlascloud", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.atlascloud.ai/v1", "defaultModel": "qwen/qwen3.5-flash", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "atlascloud", + "providerType": "atlascloud", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "openai", - "labelKey": "openai", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.openai.com/v1", "defaultModel": "gpt-4o", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "openai", + "providerType": "openai", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "gemini", - "labelKey": "gemini", + "authRequirement": "api_key", "defaultEndpoint": "https://generativelanguage.googleapis.com/v1beta", "defaultModel": "gemini-2.5-flash", - "authRequirement": "api_key", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "llm", + "labelKey": "gemini", + "providerType": "gemini", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "codex_oauth", - "labelKey": "codexOAuth", + "authRequirement": "o_auth", "defaultEndpoint": null, "defaultModel": "gpt-5.5", - "authRequirement": "o_auth", - "validationProbe": "llm_text", - "staticModels": ["gpt-5.5", "gpt-5.3-codex", "gpt-5.4", "gpt-5.5"], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "llm", + "labelKey": "codexOAuth", + "providerType": "codex_oauth", + "staticModels": [ + "gpt-5.5", + "gpt-5.3-codex", + "gpt-5.4", + "gpt-5.5" + ], + "supportedRequestFormats": [], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "mimo", - "labelKey": "mimo", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.xiaomimimo.com/v1", "defaultModel": "xiaomi/mimo-v2-flash", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "mimo", + "providerType": "mimo", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "cometapi", - "labelKey": "cometapi", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.cometapi.com/v1", "defaultModel": "gpt-4o", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "cometapi", + "providerType": "cometapi", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "openrouterFree", - "labelKey": "openrouterFree", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://openrouter.ai/api/v1", "defaultModel": "qwen/qwen3-coder:free", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "openrouterFree", + "providerType": "openrouterFree", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "orcarouter", - "labelKey": "orcarouter", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.orcarouter.ai/v1", "defaultModel": "orcarouter/fusion-flash", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "orcarouter", + "providerType": "orcarouter", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "alibabaCoding", - "labelKey": "alibabaCoding", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://coding-intl.dashscope.aliyuncs.com/v1", "defaultModel": "qwen3-coder-plus", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "alibabaCoding", + "providerType": "alibabaCoding", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "codingPlanX", - "labelKey": "codingPlanX", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.codingplanx.ai/v1", "defaultModel": "gpt-5-mini", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "codingPlanX", + "providerType": "codingPlanX", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "minimax", - "labelKey": "minimax", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.minimaxi.com/v1", "defaultModel": "MiniMax-M3", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "minimax", + "providerType": "minimax", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "stepfun", - "labelKey": "stepfun", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://api.stepfun.com/v1", "defaultModel": "step-1o-turbo-vision", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "stepfun", + "providerType": "stepfun", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "opencode", - "labelKey": "opencode", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://opencode.ai/zen/v1", "defaultModel": "deepseek-v4-flash", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "opencode", + "providerType": "opencode", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "tencentTokenHub", - "labelKey": "tencentTokenHub", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": "https://tokenhub.tencentmaas.com/v1", "defaultModel": "hy3", - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "llm", + "labelKey": "tencentTokenHub", + "providerType": "tencentTokenHub", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "lmstudio", - "labelKey": "lmstudio", + "authRequirement": "endpoint_model_optional_api_key", "defaultEndpoint": "http://localhost:1234/v1", "defaultModel": null, - "authRequirement": "endpoint_model_optional_api_key", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "llm", + "labelKey": "lmstudio", + "providerType": "lmstudio", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "custom", - "labelKey": "customChatCompletions", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "chat_completions", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "customChatCompletions", + "providerType": "custom", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "custom_responses", - "labelKey": "customResponses", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "responses", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "customResponses", + "providerType": "custom_responses", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "llm", - "providerType": "custom_messages", - "labelKey": "customMessages", + "authRequirement": "api_key_unless_custom_endpoint", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "api_key_unless_custom_endpoint", - "validationProbe": "llm_text", - "staticModels": [], "defaultRequestFormat": "messages", - "supportedRequestFormats": ["chat_completions", "responses", "messages"] + "kind": "llm", + "labelKey": "customMessages", + "providerType": "custom_messages", + "staticModels": [], + "supportedRequestFormats": [ + "chat_completions", + "responses", + "messages" + ], + "validationProbe": "llm_text" }, { - "kind": "asr", - "providerType": "volcengine", - "labelKey": "asrVolcengine", + "authRequirement": "volcengine", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "volcengine", - "validationProbe": "asr_silence_allows_no_final", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrVolcengine", + "providerType": "volcengine", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence_allows_no_final" }, { - "kind": "asr", - "providerType": "elevenlabs", - "labelKey": "asrElevenLabs", + "authRequirement": "api_key", "defaultEndpoint": "https://api.elevenlabs.io/v1", "defaultModel": "scribe_v2", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": ["scribe_v2"], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrElevenLabs", + "providerType": "elevenlabs", + "staticModels": [ + "scribe_v2" + ], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "bailian", - "labelKey": "asrBailian", + "authRequirement": "api_key", "defaultEndpoint": "wss://dashscope.aliyuncs.com/api-ws/v1/inference/", "defaultModel": "fun-asr-realtime", - "authRequirement": "api_key", - "validationProbe": "asr_silence", + "defaultRequestFormat": null, + "kind": "asr", + "labelKey": "asrBailian", + "providerType": "bailian", "staticModels": [ "fun-asr-realtime", "fun-asr-flash-8k-realtime", @@ -311,311 +386,330 @@ "fun-asr-mtl-2025-08-25", "paraformer-v2" ], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" + }, + { + "authRequirement": "api_key", + "defaultEndpoint": "wss://dashscope.aliyuncs.com/api-ws/v1/realtime", + "defaultModel": "qwen3-asr-flash-realtime", "defaultRequestFormat": null, - "supportedRequestFormats": [] - }, - { "kind": "asr", - "providerType": "bailian-qwen3-realtime", "labelKey": "asrBailianQwen3", - "defaultEndpoint": "wss://dashscope.aliyuncs.com/api-ws/v1/realtime", - "defaultModel": "qwen3-asr-flash-realtime", - "authRequirement": "api_key", - "validationProbe": "asr_silence", + "providerType": "bailian-qwen3-realtime", "staticModels": [ "qwen3-asr-flash-realtime", "qwen3-asr-flash-realtime-2026-02-10", "qwen3-asr-flash-realtime-2025-10-27" ], - "defaultRequestFormat": null, - "supportedRequestFormats": [] + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "bailian-fun-asr-flash", - "labelKey": "asrBailianFunAsrFlash", + "authRequirement": "api_key", "defaultEndpoint": "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation", "defaultModel": "fun-asr-flash-2026-06-15", - "authRequirement": "api_key", - "validationProbe": "asr_non_silent", - "staticModels": ["qwen-audio-3.0-asr-flash", "fun-asr-flash-2026-06-15"], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrBailianFunAsrFlash", + "providerType": "bailian-fun-asr-flash", + "staticModels": [ + "qwen-audio-3.0-asr-flash", + "fun-asr-flash-2026-06-15" + ], + "supportedRequestFormats": [], + "validationProbe": "asr_non_silent" }, { - "kind": "asr", - "providerType": "siliconflow", - "labelKey": "asrSiliconflow", + "authRequirement": "api_key", "defaultEndpoint": "https://api.siliconflow.cn/v1", "defaultModel": "FunAudioLLM/SenseVoiceSmall", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrSiliconflow", + "providerType": "siliconflow", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "stepfun", - "labelKey": "asrStepfun", + "authRequirement": "api_key", "defaultEndpoint": "https://api.stepfun.com/v1", "defaultModel": "stepaudio-2.5-asr", - "authRequirement": "api_key", - "validationProbe": "stepfun_no_speech", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrStepfun", + "providerType": "stepfun", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "stepfun_no_speech" }, { - "kind": "asr", - "providerType": "zhipu", - "labelKey": "asrZhipu", + "authRequirement": "api_key", "defaultEndpoint": "https://open.bigmodel.cn/api/paas/v4", "defaultModel": "glm-asr-2512", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrZhipu", + "providerType": "zhipu", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { + "authRequirement": "api_key", + "defaultEndpoint": "https://api.minimaxi.com/v1", + "defaultModel": "asr-1.0", + "defaultRequestFormat": null, "kind": "asr", - "providerType": "groq", - "labelKey": "asrGroq", + "labelKey": "asrMinimax", + "providerType": "minimax", + "staticModels": [ + "asr-1.0" + ], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" + }, + { + "authRequirement": "api_key", "defaultEndpoint": "https://api.groq.com/openai/v1", "defaultModel": "whisper-large-v3-turbo", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrGroq", + "providerType": "groq", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "whisper", - "labelKey": "asrWhisper", + "authRequirement": "api_key", "defaultEndpoint": "https://api.openai.com/v1", "defaultModel": "whisper-1", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrWhisper", + "providerType": "whisper", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "openrouter", - "labelKey": "asrOpenrouter", + "authRequirement": "api_key", "defaultEndpoint": "https://openrouter.ai/api/v1", "defaultModel": "openai/whisper-large-v3-turbo", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrOpenrouter", + "providerType": "openrouter", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "orcarouter", - "labelKey": "orcarouter", + "authRequirement": "api_key", "defaultEndpoint": "https://api.orcarouter.ai/v1", "defaultModel": "google/gemini-2.5-flash", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "orcarouter", + "providerType": "orcarouter", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "zenmux", - "labelKey": "asrZenmux", + "authRequirement": "api_key", "defaultEndpoint": "https://zenmux.ai/api/v1", "defaultModel": "qwen/qwen3-asr-flash", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrZenmux", + "providerType": "zenmux", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "openai-compatible", - "labelKey": "asrOpenAiCompatible", + "authRequirement": "endpoint_model_optional_api_key", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "endpoint_model_optional_api_key", - "validationProbe": "asr_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrOpenAiCompatible", + "providerType": "openai-compatible", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "xiaomi-mimo-asr", - "labelKey": "asrXiaomiMimo", + "authRequirement": "api_key", "defaultEndpoint": "https://api.xiaomimimo.com/v1", "defaultModel": "mimo-v2.5-asr", - "authRequirement": "api_key", - "validationProbe": "asr_silence", - "staticModels": ["mimo-v2.5-asr"], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrXiaomiMimo", + "providerType": "xiaomi-mimo-asr", + "staticModels": [ + "mimo-v2.5-asr" + ], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" }, { - "kind": "asr", - "providerType": "iflytek", - "labelKey": "asrIflytek", + "authRequirement": "xfyun", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "xfyun", - "validationProbe": "asr_silence_allows_no_final", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrIflytek", + "providerType": "iflytek", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence_allows_no_final" }, { - "kind": "asr", - "providerType": "tencent-cloud", - "labelKey": "asrTencentCloud", + "authRequirement": "tencent_cloud", "defaultEndpoint": null, "defaultModel": "Hy-ASR-3.0-preview", - "authRequirement": "tencent_cloud", - "validationProbe": "asr_silence_allows_no_final", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrTencentCloud", + "providerType": "tencent-cloud", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence_allows_no_final" }, { - "kind": "asr", - "providerType": "foundry-local-whisper", - "labelKey": "asrFoundryLocalWhisper", + "authRequirement": "none", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "none", - "validationProbe": "unsupported", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrFoundryLocalWhisper", + "providerType": "foundry-local-whisper", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "unsupported" }, { - "kind": "asr", - "providerType": "local-whisper", - "labelKey": "asrLocalWhisper", + "authRequirement": "none", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "none", - "validationProbe": "unsupported", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrLocalWhisper", + "providerType": "local-whisper", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "unsupported" }, { - "kind": "asr", - "providerType": "sherpa-onnx-local", - "labelKey": "asrSherpaOnnxLocal", + "authRequirement": "none", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "none", - "validationProbe": "unsupported", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrSherpaOnnxLocal", + "providerType": "sherpa-onnx-local", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "unsupported" }, { - "kind": "asr", - "providerType": "local-qwen3-mlx", - "labelKey": "asrLocalQwen3Mlx", + "authRequirement": "none", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "none", - "validationProbe": "unsupported", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrLocalQwen3Mlx", + "providerType": "local-qwen3-mlx", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "unsupported" }, { - "kind": "asr", - "providerType": "local-qwen3-c", - "labelKey": "asrLocalQwen3C", + "authRequirement": "none", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "none", - "validationProbe": "unsupported", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrLocalQwen3C", + "providerType": "local-qwen3-c", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "unsupported" }, { - "kind": "asr", - "providerType": "local-qwen3", - "labelKey": "asrLocalQwen3", + "authRequirement": "none", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "none", - "validationProbe": "unsupported", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrLocalQwen3", + "providerType": "local-qwen3", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "unsupported" }, { - "kind": "asr", - "providerType": "apple-speech", - "labelKey": "asrAppleSpeech", + "authRequirement": "none", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "none", - "validationProbe": "asr_native_silence", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "asr", + "labelKey": "asrAppleSpeech", + "providerType": "apple-speech", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_native_silence" }, { - "kind": "omni", - "providerType": "openai", - "labelKey": "omniOpenai", + "authRequirement": "api_key", "defaultEndpoint": "https://api.openai.com/v1", "defaultModel": "gpt-4o-audio-preview", - "authRequirement": "api_key", - "validationProbe": "omni_text", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "omni", + "labelKey": "omniOpenai", + "providerType": "openai", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "omni_text" }, { - "kind": "omni", - "providerType": "gemini", - "labelKey": "omniGemini", + "authRequirement": "api_key", "defaultEndpoint": "https://generativelanguage.googleapis.com/v1beta", "defaultModel": "gemini-2.5-flash", - "authRequirement": "api_key", - "validationProbe": "omni_text", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "omni", + "labelKey": "omniGemini", + "providerType": "gemini", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "omni_text" }, { - "kind": "omni", - "providerType": "dashscope-omni", - "labelKey": "omniDashscope", + "authRequirement": "api_key", "defaultEndpoint": "https://dashscope.aliyuncs.com/compatible-mode/v1", "defaultModel": "qwen3-omni-flash", - "authRequirement": "api_key", - "validationProbe": "omni_text", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "omni", + "labelKey": "omniDashscope", + "providerType": "dashscope-omni", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "omni_text" }, { - "kind": "omni", - "providerType": "custom", - "labelKey": "custom", + "authRequirement": "api_key", "defaultEndpoint": null, "defaultModel": null, - "authRequirement": "api_key", - "validationProbe": "omni_text", - "staticModels": [], "defaultRequestFormat": null, - "supportedRequestFormats": [] + "kind": "omni", + "labelKey": "custom", + "providerType": "custom", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "omni_text" } ] diff --git a/openless-all/app/src/lib/ipc/provider-descriptors.generated.json b/openless-all/app/src/lib/ipc/provider-descriptors.generated.json index dda36caaa..8cef02b82 100644 --- a/openless-all/app/src/lib/ipc/provider-descriptors.generated.json +++ b/openless-all/app/src/lib/ipc/provider-descriptors.generated.json @@ -121,6 +121,20 @@ "supportedRequestFormats": [], "validationProbe": "asr_silence" }, + { + "authRequirement": "api_key", + "defaultEndpoint": "https://api.minimaxi.com/v1", + "defaultModel": "asr-1.0", + "defaultRequestFormat": null, + "kind": "asr", + "labelKey": "asrMinimax", + "providerType": "minimax", + "staticModels": [ + "asr-1.0" + ], + "supportedRequestFormats": [], + "validationProbe": "asr_silence" + }, { "authRequirement": "api_key", "defaultEndpoint": "https://api.groq.com/openai/v1", @@ -219,6 +233,18 @@ "supportedRequestFormats": [], "validationProbe": "asr_silence_allows_no_final" }, + { + "authRequirement": "tencent_cloud", + "defaultEndpoint": null, + "defaultModel": "Hy-ASR-3.0-preview", + "defaultRequestFormat": null, + "kind": "asr", + "labelKey": "asrTencentCloud", + "providerType": "tencent-cloud", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "asr_silence_allows_no_final" + }, { "authRequirement": "none", "defaultEndpoint": null, @@ -301,7 +327,7 @@ "providerType": "apple-speech", "staticModels": [], "supportedRequestFormats": [], - "validationProbe": "unsupported" + "validationProbe": "asr_native_silence" } ], "llm": [ @@ -310,6 +336,18 @@ "defaultEndpoint": "https://ark.cn-beijing.volces.com/api/v3", "defaultModel": "deepseek-v3-2", "defaultRequestFormat": "chat_completions", + "endpointPresets": [ + { + "endpoint": "https://ark.cn-beijing.volces.com/api/plan/v3", + "modelsUrl": "https://console.volcengine.com/ark/subscription/agent-plan", + "name": "Agent Plan" + }, + { + "endpoint": "https://ark.cn-beijing.volces.com/api/coding/v3", + "modelsUrl": "https://console.volcengine.com/ark/subscription/coding-plan", + "name": "Coding Plan" + } + ], "kind": "llm", "labelKey": "ark", "providerType": "ark", @@ -558,6 +596,18 @@ ], "validationProbe": "llm_text" }, + { + "authRequirement": "api_key_unless_custom_endpoint", + "defaultEndpoint": "https://tokenhub.tencentmaas.com/v1", + "defaultModel": "hy3", + "defaultRequestFormat": null, + "kind": "llm", + "labelKey": "tencentTokenHub", + "providerType": "tencentTokenHub", + "staticModels": [], + "supportedRequestFormats": [], + "validationProbe": "llm_text" + }, { "authRequirement": "endpoint_model_optional_api_key", "defaultEndpoint": "http://localhost:1234/v1", diff --git a/openless-all/app/src/pages/settings/ProvidersSection.test.ts b/openless-all/app/src/pages/settings/ProvidersSection.test.ts index 393300951..fdbac50c9 100644 --- a/openless-all/app/src/pages/settings/ProvidersSection.test.ts +++ b/openless-all/app/src/pages/settings/ProvidersSection.test.ts @@ -13,6 +13,9 @@ if (LLM_LABELS.find((p) => p.id === 'tencentTokenHub')?.nameKey !== 'tencentToke if (ASR_LABELS.find((p) => p.id === 'tencent-cloud')?.nameKey !== 'asrTencentCloud') { throw new Error('Tencent Cloud ASR label is missing'); } +if (ASR_LABELS.find((p) => p.id === 'minimax')?.nameKey !== 'asrMinimax') { + throw new Error('MiniMax ASR label is missing'); +} if (!atlascloudPreset) { throw new Error('Atlas Cloud LLM preset is missing'); diff --git a/openless-all/app/src/pages/settings/shared.tsx b/openless-all/app/src/pages/settings/shared.tsx index ad8f81ec1..3c08985ef 100644 --- a/openless-all/app/src/pages/settings/shared.tsx +++ b/openless-all/app/src/pages/settings/shared.tsx @@ -262,6 +262,7 @@ export const ASR_LABELS = [ { id: 'siliconflow', nameKey: 'asrSiliconflow' }, { id: 'stepfun', nameKey: 'asrStepfun' }, { id: 'zhipu', nameKey: 'asrZhipu' }, + { id: 'minimax', nameKey: 'asrMinimax' }, { id: 'groq', nameKey: 'asrGroq' }, { id: 'whisper', nameKey: 'asrWhisper' }, { id: 'openrouter', nameKey: 'asrOpenrouter' },