ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CopilotKit 语音输入 QA 验证指南:Claude Agent SDK(TypeScript)集成的转录链路与端到端测试

CopilotKit 语音输入 QA 验证指南:Claude Agent SDK(TypeScript)集成的转录链路与端到端测试 CopilotKit 语音输入 QA 验证指南Claude Agent SDKTypeScript集成的转录链路与端到端测试【免费下载链接】CopilotKitThe Frontend Stack for Agents Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit导读本文面向需要对 CopilotKit 集成 Demo 进行质量验证的测试工程师与集成开发者以仓库内showcase/integrations/claude-sdk-typescript的语音输入Voice InputDemo 为对象系统梳理从环境准备、人工 QA 到自动化 E2E 的完整验证路径。通过本文你将掌握如何验证基于 OpenAI Whisper 的语音转录链路是否健康、如何区分样例音频注入与真实麦克风转录两条路径、以及缺少OPENAI_API_KEY时应当观察到怎样的确定性错误行为并能在源码层面定位对应实现为排查问题提供依据。一、被测功能概览与文档定位语音输入 Demo 是 Claude Agent SDKTypeScript集成中的一个交互类示例其在 Demo 清单 manifest.yaml 中的描述为Mic sample audio transcription via a guarded OpenAI Whisper service麦克风 通过带守卫的 OpenAI Whisper 服务进行样例音频转录页面路由为/demos/voice。整个 Demo 提供两条语音入口麦克风按钮由CopilotChat /在运行时通过/info端点声明audioFileTranscriptionEnabled: true后自动渲染点击录制、再点击停止音频经/transcribe端点走真实转录链路Play sample样例音频按钮一个确定性的测试/Demo 辅助按钮点击后直接向输入框同步注入预设文本不经过转录端点详见 sample-audio-button.tsx 的注释说明。仓库中与本文主题直接相关的 QA 文档为showcase/integrations/claude-sdk-typescript/qa/voice.md下文将以该清单的四个测试组基础功能、样例音频转录、麦克风录音、错误处理为骨架逐项展开并结合源码、E2E 用例与配置进行深化。二、前置条件与环境准备执行语音 Demo 的 QA 验证前需满足以下条件继承自 QA 清单并补充说明前置条件说明与验证方式Demo 已部署且可访问前端页面Next.js已启动并对外可达能打开/demos/voice本仓库中该 Demo 的页面实现位于 page.tsx运行时路由位于 route.tsAgent 后端健康语音 Demo 的 Agent 后端复用AGENT_URL指向的 Claude 服务默认http://localhost:8000经createClaudeHttpAgent接入运行时需确保后端/health探测与 Agent 运行正常OPENAI_API_KEY已配置转录服务由 OpenAI Whisper 承担。若缺失该 Key转录路径将被显式阻断并返回确定性错误见第五节这也是错误处理测试组的前提需要特别指出的是Demo 的前端声明了useSingleEndpoint{false}与runtimeUrl/api/copilotkit-voice见 page.tsx即前端通过独立的运行时路由与后端通信而非与其它 Demo 共用单端点同时显式设置了enableInspector{false}避免本地开发环境自动挂载的 web-inspector 遮罩拦截样例按钮的点击事件从而保证 QA 与自动化脚本在本地与生产环境行为一致。三、测试步骤一基础功能加载验证对应 QA 清单 Basic Functionality 组逐项检查浏览器访问/demos/voice页面标题h1应显示Voice input——该标题由 voice-chat.tsx 渲染页面头部右侧应可见Play sample按钮实际渲染文案为 Try a sample audio含 图标其data-testid为voice-sample-audio-button点击行为为调用onTranscribed(sampleText)同步注入文本聊天区应渲染麦克风按钮。该按钮并非无条件出现只有当运行时在/info响应中广告audioFileTranscriptionEnabled: true即运行时确实挂载了transcriptionService时react-core的 V2CopilotChatInput才会渲染它其data-testid为copilot-start-transcribe-button。由于它要等客户端完成/info往返后才出现冷启动的开发服务器上可能需要数秒延迟——自动化断言时需预留足够超时E2E 中设为 15 秒见 voice.spec.ts。判读要点若页面加载正常但麦克风按钮缺失优先怀疑运行时/info是否已声明audioFileTranscriptionEnabled即转录服务是否真正被挂载到CopilotRuntime上而不是只停留在前端组件的开关。四、测试步骤二样例音频转录验证对应 QA 清单 Sample audio transcription 组点击Play sample按钮观察按钮状态由 Transcribing… 恢复为空闲验证聊天输入框被填入形如What is the weather in Tokyo?的文本。需要澄清的是Play sample 按钮本身是同步注入、无状态切换的QA 文档描述的是 UI 层面的整体行为预期而从源码看该按钮点击即直接向 textarea 注入预设文案What is the weather in Tokyo?不存在真实的 Transcribing… 中间态见 sample-audio-button.tsx 与 voice-chat.tsx。其注入实现绕过了 React 受控输入的常规 API通过原生HTMLTextAreaElement的 value setter 写入并派发input事件从而让 React 感知到受控组件的值变化见 voice-chat.tsx。因此这组测试实际验证的是样例按钮是否将预设文本成功填充到输入框以及该文本能否作为后续对话的输入发送给 Agent。后续点击发送按钮后语音 Demo 复用后端的中性 Agent 图谱若运行时配置了天气类工具渲染会出现weather-card或get_weather工具卡片否则也会出现普通 assistant 消息——E2E 对此的断言是宽松的只要求某一种 Agent 产出出现在界面上见 voice.spec.ts。相关天气工具定义可在 headless-complete-prompt.ts 中查看。五、测试步骤三麦克风录音与真实转录验证对应 QA 清单 Mic recording 组点击 composer 中的麦克风按钮copilot-start-transcribe-button若浏览器弹出权限请求允许麦克风权限简短说话后再次点击按钮停止录制验证转录文本出现在输入框中。这是唯一真正走转录链路的路径录音结束后音频文件被客户端发送至运行时/transcribe端点由TranscriptionService处理并返回文本麦克风按钮由react-core的 V2CopilotChatInput渲染MediaRecorder逻辑在无头环境下难以稳定模拟因此自动化套件刻意将麦克风路径排除在 E2E 之外交由本文所述的人工 QA 清单覆盖见 voice.spec.ts。5.1 运行时侧转录服务的挂载与守卫/api/copilotkit-voice是一个专用运行时路由route.ts它直接使用 V2CopilotRuntime注释说明 V1 包装器会丢弃transcriptionService选项并将自定义的GuardedOpenAITranscriptionService挂载到运行时上构造时读取process.env.OPENAI_API_KEY若存在则内部创建TranscriptionServiceOpenAI来自copilotkit/voice底层为 OpenAI 客户端若不存在delegate保持为nulltranscribeFile()在delegate为空时直接抛出带明确文案的 Error错误信息提示设置OPENAI_API_KEY以启用语音转录而不是让请求继续打到 Whisper 后再失败。这种守卫Guard设计保证了缺少 Key 时错误在进入外部转录服务之前就被拦截并确定性地暴露这正是 QA 清单中返回干净的 401 而不是 500/503这一预期得以成立的关键从源码结构可以推断守卫抛出的确定性错误由运行时统一映射为 4xx 类响应从而避免 Whisper 底层连接类错误的 5xx 噪音。5.2 转录服务实现配置项与底层调用transcription-service-openai.ts 是copilotkit/voice包导出的转录实现入口见 index.ts其核心行为模型默认whisper-1可通过model覆盖语言languageISO-639-1如en/de/fr——QA 场景中建议显式传入以提升准确率与响应速度提示prompt可选用于引导风格或衔接上一段内容语言需与音频一致温度temperature取值 01越低越确定、越高越有创造性底层调用openai.audio.transcriptions.create()将TranscribeFileOptions中的audioFile与上述参数一并提交返回response.text作为转录结果。在当前集成中运行时只传入了openai实例含 Key模型、语言、温度等均保持默认值见 route.ts。该 Demo 使用的依赖版本为copilotkit/voice1.68.2与openai5.9.0见 package.json。六、测试步骤四缺少 API Key 的错误处理验证对应 QA 清单 Error handling (key missing) 组在一个未配置OPENAI_API_KEY的部署环境中打开/demos/voice点击样例按钮或触发任何需要转录的路径验证界面呈现干净的 401 类错误而非 500/503 服务端错误并携带可读的错误信息。结合 route.ts 的守卫实现此场景下transcribeFile()会立即抛出如下文案的错误OPENAI_API_KEY not configured for this deployment (api key missing). Set OPENAI_API_KEY to enable voice transcription.验证重点是错误类型与可读性错误应能被用户与日志明确归因为配置缺失而不是服务故障。若观察到 500/503 或含 Whisper/OpenAI 底层堆栈的错误说明转录服务未经守卫直接暴露了上游异常属于实现缺陷。七、自动化对照Playwright E2E 与人工 QA 的边界人工 QA 清单qa/voice.md与仓库内自动化套件 voice.spec.ts 是互补关系两者的覆盖边界值得在测试计划中明确覆盖项人工 QAqa/voice.mdPlaywright E2Evoice.spec.ts页面加载、标题、样例按钮、输入框、麦克风按钮✅ 步骤 1✅ 第一条用例麦克风按钮超时放宽至 15s样例按钮注入预设文本✅ 步骤 2✅ 第二条用例断言 textarea 匹配/weather|tokyo/i发送转录文本后出现 Agent 产出—✅ 第三条用例宽松断言超时 45s套件超时放宽至 90s真实麦克风转录✅ 步骤 3❌ 无头环境下 MediaRecorder 难以稳定模拟刻意排除缺少 Key 的 401 行为✅ 步骤 4❌ 依赖无 Key 环境未纳入常规套件E2E 的稳定性预期为对 Railway 部署连续 3 次运行必须全部通过。另外样例音频文件约定存放在 public/demo-audio/README.md 描述的目录中要求为16kHz 单声道、35 秒、小于 100KB 的 WAV内容为朗读 What is the weather in Tokyo?用于客户端主动拉取并 POST 到转录端点、从而在无麦克风权限的情况下也能演练转录流程README 同时给出了 macOSsay ffmpeg、Linuxespeak-ng、Windows PowerShell 三种本地生成方式。八、验收标准与预期结果速查QA 清单给出的验收标准汇总如下可作为 CI 门禁或发布前检查表聊天界面在 3 秒内加载完成含 Voice input 标题、样例按钮与输入框麦克风按钮受/info往返影响首次出现可能更晚自动化断言需放宽超时样例音频的转录在 8 秒内完成人工场景含状态切换预期纯样例按钮路径为同步注入实际耗时接近瞬时E2E 断言超时设为 1s认证失败路径返回 HTTP 401 且错误信息可读由GuardedOpenAITranscriptionService的 Key 守卫保证缺失OPENAI_API_KEY时不产生 5xx。九、常见问题排查指引麦克风按钮未出现检查运行时/info是否声明audioFileTranscriptionEnabled: true确认transcriptionService已传入CopilotRuntime对照 route.ts样例按钮点击无效果确认页面仍使用useSingleEndpoint{false}与独立runtimeUrl并检查 textarea 的注入逻辑是否被 web-inspector 遮罩拦截生产环境无此问题本地开发已通过enableInspector{false}规避转录报错且文案含api key missing即为预期内的确定性守卫错误属于配置问题而非服务故障按提示配置OPENAI_API_KEY即可转录结果不准确或超时可在 TranscriptionServiceOpenAI 的配置中显式指定languageISO-639-1、调整temperature或使用更优的 Whispermodel参数本文集成当前均采用默认值。【免费下载链接】CopilotKitThe Frontend Stack for Agents Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表