Skip to content

fix(asr): add MiMo provider to credential gate validation#713

Merged
appergb merged 1 commit into
Open-Less:betafrom
GanAO:fix/mimo-credential-gate
Jun 20, 2026
Merged

fix(asr): add MiMo provider to credential gate validation#713
appergb merged 1 commit into
Open-Less:betafrom
GanAO:fix/mimo-credential-gate

Conversation

@GanAO

@GanAO GanAO commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

User description

问题描述

使用 xiaomi-mimo-asr 作为 ASR provider 时,语音输入被拦截,报错:

[WARN] [coord] ASR credential gate failed: 请先在设置中填写火山引擎 ASR App Key 和 Access Key

根本原因

ensure_asr_credentials() 函数(位于 coordinator/asr_wiring.rs)没有处理 MiMo provider。

当前验证逻辑:

  1. ✅ 本地 Qwen3-ASR → 跳过验证
  2. ✅ Foundry Whisper → 跳过验证
  3. ✅ sherpa-onnx → 跳过验证
  4. ✅ Whisper 兼容 / 百炼 → 检查 API Key
  5. 其他所有 provider → 强制检查火山引擎凭证

MiMo provider 不匹配任何条件,fall through 到第 5 步,被火山引擎凭证检查拦截。

修复方式

在第 4 步的条件中添加 is_mimo_provider(&active_asr),让 MiMo 走与其他 API Key 类型 provider 相同的验证路径:

// Before
if is_whisper_compatible_provider(&active_asr) || is_bailian_provider(&active_asr) {

// After
if is_whisper_compatible_provider(&active_asr)
    || is_bailian_provider(&active_asr)
    || is_mimo_provider(&active_asr)
{

测试

  • 使用 xiaomi-mimo-asr provider 成功完成语音输入
  • 历史记录正常保存
  • 无 "ASR credential gate failed" 错误
  • 流式润色正常工作

PR Type

Bug fix


Description

  • Fix MiMo provider credential gate validation

  • Add is_mimo_provider() to condition


Diagram Walkthrough

flowchart LR
  A["Credential gate"] --> B{"Provider?"}
  B -- "Whisper/Bailian/MiMo" --> C["Check API Key"]
  B -- "Other" --> D["Volcengine error"]
Loading

File Walkthrough

Relevant files
Bug fix
asr_wiring.rs
Add MiMo provider to credential gate condition                     

openless-all/app-tauri/src-tauri/src/coordinator/asr_wiring.rs

  • Added is_mimo_provider() to credential gate condition

`ensure_asr_credentials()` did not handle the `xiaomi-mimo-asr` provider,
causing it to fall through to the default Volcengine credential check.
This blocked all MiMo ASR users with "请先在设置中填写火山引擎 ASR App Key".

Added `is_mimo_provider()` to the credential gate condition so MiMo
users are validated via `AsrApiKey` (same as Whisper/Bailian providers).
@github-actions

Copy link
Copy Markdown
Contributor

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ No major issues detected

@appergb

appergb commented Jun 20, 2026

Copy link
Copy Markdown
Collaborator

@claude 请审核(ASR 凭证门控):本 PR 把 MiMo provider 加入 ensure_asr_credentials() 的凭证门控链(+4 行),让 MiMo 走 API Key 验证路径,而不是 fall through 到末尾被火山引擎凭证检查误拦。

重点请确认:

  1. is_mimo_provider(&active_asr) 判定是否正确、与其他 provider 互斥;
  2. MiMo 是否确实只需 API Key(不需要 AK/SK 等额外凭证);
  3. 新增条件分支在 if-else 链中的位置是否会误改其他 provider 的现有行为;
  4. 是否有对应单元测试覆盖该门控路径。

注意:这是 fork PR,主 CI 矩阵(macOS/Linux/Windows/Android checks)尚未运行,仅 pr_agent_job 通过。

@claude

claude Bot commented Jun 20, 2026

Copy link
Copy Markdown

Claude finished @appergb's task in 1m 39s —— View job


ASR 凭证门控审查结果

待办清单

  • 读取变更文件及周边代码
  • 验证 is_mimo_provider 判定逻辑与互斥性
  • 确认 MiMo 所需凭证类型
  • 分析 if-else 链位置影响
  • 检查单元测试覆盖情况

1. is_mimo_provider 判定正确性与互斥性 ✅

is_mimo_providerasr_wiring.rs:335-337)实现如下:

pub(super) fn is_mimo_provider(id: &str) -> bool {
    id == crate::asr::mimo::PROVIDER_ID
}

PROVIDER_ID = "xiaomi-mimo-asr"mimo.rs:20),是简单的字符串相等比较。

与其他 provider 完全互斥:

  • is_whisper_compatible_provider:匹配 "whisper" | "siliconflow" | "zhipu" | "groq" | "openrouter"
  • is_bailian_provider:匹配 "bailian"
  • 本地 provider:"local-qwen3" / "foundry-local-whisper" / "sherpa-onnx-local" / "apple-speech"

不存在重叠可能。active_asr_provider_kind 中也有对应测试(coordinator.rs:2281-2282),确认 MiMo 已被正确分类为独立类别。


2. MiMo 是否只需 API Key ✅

read_mimo_credentials()coordinator.rs:1883-1898)仅读取:

  • CredentialAccount::AsrApiKey → API Key
  • CredentialAccount::AsrEndpoint → base URL(有默认值 https://api.xiaomimimo.com/v1
  • CredentialAccount::AsrModel → 模型(有默认值 mimo-v2.5-asr

MimoBatchASR::transcribe_inner()mimo.rs:57-59)仅校验 api_key.trim().is_empty(),认证方式为 Authorization: Bearer {api_key}

不需要 AK/SK、App ID 等额外凭证,与百炼、Whisper 类 provider 完全一致,走 AsrApiKey 路径合理。


3. if-else 链位置影响 ✅

门控链执行顺序:

  1. is_local_qwen3 → early return(本地模型/macOS 检查)
  2. is_foundry_local_whisper → early return(Windows 平台检查)
  3. is_sherpa_onnx_local → early return(Windows 平台检查)
  4. is_whisper_compatible || is_bailian || is_mimo → 检查 API Key ← 新增 MiMo
  5. else → 检查火山引擎 AK/SK

新增 || is_mimo_provider(&active_asr) 是纯加法变更:

  • 不改变步骤 1-3 的逻辑(均在此前 early return)
  • 不影响其他 API Key 类 provider 的行为(布尔短路求值)
  • 不影响火山引擎路径(MiMo 的 ID 与之无任何重叠)

这与 build_qa_asr_startasr_wiring.rs:494-532)的行为对称——该函数已正确处理 ActiveAsrProviderKind::Mimo,只是凭证门控没有同步更新,本 PR 修复了这一不一致。


4. 单元测试覆盖 ⚠️

ensure_asr_credentials()asr_wiring.rs没有任何单元测试——这是本 PR 前就存在的覆盖缺口,非本次引入。

现有的 #[cfg(test)] 块(asr_wiring.rs:118)仅包含 is_keyless_local_asr_provider 辅助函数。

建议后续为 ensure_asr_credentials 补充以下测试用例(可作为 follow-up,不阻塞本 PR):

  • 各 API Key provider(Whisper / Bailian / MiMo)在无 API Key 时返回预期错误
  • 各 API Key provider 在 API Key 已填时返回 Ok(())
  • Volcengine fallthrough 逻辑

总体评估

修复正确且最小化。4 行改动精准填补了 ensure_asr_credentials 中遗漏 MiMo 的逻辑缺口,与 build_qa_asr_start / active_asr_provider_kind 的处理保持一致,无副作用。

建议:可合并。

注:主 CI 矩阵(macOS/Linux/Windows/Android)尚未运行,建议在正式合并前确认 CI 通过。

@appergb appergb merged commit da9bf15 into Open-Less:beta Jun 20, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants