




























@@ -4,7 +4,7 @@ import path from "node:path";
44import { describe, expect, it, vi } from "vitest";
55import type { OpenClawConfig } from "../config/types.js";
66import { withEnvAsync } from "../test-utils/env.js";
7-import { runCapability } from "./runner.js";
7+import { clearMediaUnderstandingBinaryCacheForTests, runCapability } from "./runner.js";
88import { withAudioFixture } from "./runner.test-utils.js";
99import type { AudioTranscriptionRequest, MediaUnderstandingProvider } from "./types.js";
1010@@ -52,6 +52,12 @@ function createOpenAiAudioCfg(extra?: Partial<OpenClawConfig>): OpenClawConfig {
5252} as unknown as OpenClawConfig;
5353}
545455+async function createMockExecutable(dir: string, name: string) {
56+const executablePath = path.join(dir, name);
57+await fs.writeFile(executablePath, "#!/bin/sh\necho mocked-local-whisper\n", { mode: 0o755 });
58+return executablePath;
59+}
60+5561async function runAutoAudioCase(params: {
5662transcribeAudio: (req: AudioTranscriptionRequest) => Promise<{ text: string; model: string }>;
5763cfgExtra?: Partial<OpenClawConfig>;
@@ -89,6 +95,37 @@ describe("runCapability auto audio entries", () => {
8995expect(result.decision.outcome).toBe("success");
9096});
919798+it("prefers provider keys over auto-detected local whisper", async () => {
99+const binDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-auto-audio-bin-"));
100+try {
101+await createMockExecutable(binDir, "whisper");
102+clearMediaUnderstandingBinaryCacheForTests();
103+let seenModel: string | undefined;
104+const result = await withEnvAsync(
105+{
106+PATH: binDir,
107+SHERPA_ONNX_MODEL_DIR: undefined,
108+WHISPER_CPP_MODEL: undefined,
109+GEMINI_API_KEY: undefined,
110+},
111+async () =>
112+await runAutoAudioCase({
113+transcribeAudio: async (req) => {
114+seenModel = req.model;
115+return { text: "provider transcription", model: req.model ?? "unknown" };
116+},
117+}),
118+);
119+120+expect(result.outputs[0]?.provider).toBe("openai");
121+expect(result.outputs[0]?.text).toBe("provider transcription");
122+expect(seenModel).toBe("gpt-4o-transcribe");
123+} finally {
124+clearMediaUnderstandingBinaryCacheForTests();
125+await fs.rm(binDir, { recursive: true, force: true });
126+}
127+});
128+92129it("skips auto audio when disabled", async () => {
93130const result = await runAutoAudioCase({
94131transcribeAudio: async () => ({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。