diff --git a/openless-all/app/src-tauri/src/coordinator/asr_setup.rs b/openless-all/app/src-tauri/src/coordinator/asr_setup.rs index fe66f248..f1b47e1b 100644 --- a/openless-all/app/src-tauri/src/coordinator/asr_setup.rs +++ b/openless-all/app/src-tauri/src/coordinator/asr_setup.rs @@ -8,6 +8,25 @@ use super::*; +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum CloudAsrCredentialRequirement { + AsrApiKey, + Volcengine, +} + +pub(crate) fn cloud_asr_credential_requirement( + active_asr: &str, +) -> CloudAsrCredentialRequirement { + if is_whisper_compatible_provider(active_asr) + || is_bailian_provider(active_asr) + || is_mimo_provider(active_asr) + { + CloudAsrCredentialRequirement::AsrApiKey + } else { + CloudAsrCredentialRequirement::Volcengine + } +} + pub(crate) fn ensure_microphone_permission(_inner: &Arc) -> Result<(), String> { use crate::permissions::{self, PermissionStatus}; @@ -78,22 +97,25 @@ pub(crate) fn ensure_asr_credentials() -> Result<(), String> { } } - if is_whisper_compatible_provider(&active_asr) || is_bailian_provider(&active_asr) { - let api_key = CredentialsVault::get(CredentialAccount::AsrApiKey) - .ok() - .flatten() - .unwrap_or_default(); - if api_key.trim().is_empty() { - return Err("请先在设置中填写 ASR 服务商 API Key".to_string()); + match cloud_asr_credential_requirement(&active_asr) { + CloudAsrCredentialRequirement::AsrApiKey => { + let api_key = CredentialsVault::get(CredentialAccount::AsrApiKey) + .ok() + .flatten() + .unwrap_or_default(); + if api_key.trim().is_empty() { + return Err("请先在设置中填写 ASR 服务商 API Key".to_string()); + } + Ok(()) + } + CloudAsrCredentialRequirement::Volcengine => { + let creds = read_volc_credentials(); + if creds.app_id.trim().is_empty() || creds.access_token.trim().is_empty() { + Err("请先在设置中填写火山引擎 ASR App Key 和 Access Key".to_string()) + } else { + Ok(()) + } } - return Ok(()); - } - - let creds = read_volc_credentials(); - if creds.app_id.trim().is_empty() || creds.access_token.trim().is_empty() { - Err("请先在设置中填写火山引擎 ASR App Key 和 Access Key".to_string()) - } else { - Ok(()) } } diff --git a/openless-all/app/src-tauri/src/coordinator/tests.rs b/openless-all/app/src-tauri/src/coordinator/tests.rs index 51e01556..38a4c2be 100644 --- a/openless-all/app/src-tauri/src/coordinator/tests.rs +++ b/openless-all/app/src-tauri/src/coordinator/tests.rs @@ -211,6 +211,14 @@ fn windows_local_providers_are_keyless_and_not_whisper_compatible() { )); } +#[test] +fn credential_gate_classifies_mimo_as_api_key_asr_provider() { + assert_eq!( + cloud_asr_credential_requirement(crate::asr::mimo::PROVIDER_ID), + CloudAsrCredentialRequirement::AsrApiKey + ); +} + #[test] fn verbose_json_enabled_only_for_whisper_family() { // verbose_json + 幻听过滤只对返回完整 Whisper 指标的 provider 开启。