尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

慢任务快回答:VisionClaw异步结果交付的心跳、延迟降级与关键词验证设计

慢任务快回答:VisionClaw异步结果交付的心跳、延迟降级与关键词验证设计 慢任务快回答VisionClaw异步结果交付的心跳、延迟降级与关键词验证设计【免费下载链接】VisionClawReal-time AI assistant for Meta Ray-Ban smart glasses -- voice vision agentic actions via Gemini Live and OpenClaw项目地址: https://gitcode.com/gh_mirrors/vi/VisionClawVisionClaw 是一个专为 Meta Ray-Ban 智能眼镜打造的实时 AI 助手戴上眼镜用语音下达任务——查天气、发消息、网购比价它都能看着你看到的世界直接回答。但真正的难点在于慢任务让 AI 帮你浏览购物网站、操作日历往往要几十秒甚至几分钟。VisionClaw 用一套心跳保活 延迟降级 关键词验证的异步交付设计做到慢任务快回答——语音永远不被卡住结果落地也绝不打丢。痛点眼镜上的 AI等不起在手机 App 里转圈等待尚可接受但在眼镜上用户看不见屏幕唯一的感知渠道是声音。一次实测观察写在源码注释里任务超过十几秒没动静用户就会以为AI 死机了直接挂断——而挂断会连带杀掉会话、工具调用和还没到的答案。所以 VisionClaw 的核心设计目标很明确语音通道永远不能阻塞在慢任务上且结果最终必须可靠送达。整体思路三条防线整套机制集中在语音工作进程 agent/main.py 与任务网关 gateway/src/server.ts 中可以概括为防线触发时机作用⚡ 快速通道结果 10 秒内返回当作普通一问一答直接播报 延迟降级超过 10 秒立刻放话还在做任务转后台 心跳保活每 30 秒插一句简短进度证明 AI 还活着 关键词验证结果落地后确认结果真的被说出口没说到就重播️ 结果停放用户已挂断存进网关下次通话开场补报第一道防线10 秒延迟降级先答后做关键常量定义在 agent/main.py#L345-L366QUICK_ANSWER_S 10 # 工具调用可占用对话回合的秒数上限代理核心逻辑 _run_delegated() 的流程是发起后台任务后只等 10 秒。若结果按时回来一切照旧若没回来立即向模型注入一条指令而非一句固定台词任务需要更长时间请在自己的话里简短告诉用户你还在处理不要猜测答案。选 10 秒不是拍脑袋简单任务在干净会话上实测 8~9 秒完成10 秒恰好让它们一次干净回答而不必走进度提示 后续补报两段式。网关侧是配套的双速回合two-speed turns见 gateway/README.md请求等待上限默认 30 秒一到立即返回一句确认最终结果改走 WebSocket 事件推送。超时时返回的不是给人读的句子而是带[task started]前缀的指令块gateway/src/server.ts#L51-L55——源码注释解释了原因固定台词会被原样念出、像客服播报让模型用自己的话垫场语气才融进当前对话。语音侧则通过GATEWAY_DEFERRAL_PREFIX认出这个前缀永远不会把指令块当成答案转述给用户。第二道防线心跳让活着被听见任务转后台后relay 循环 每隔HEARTBEAT_S 30秒检查一次任务状态。没完成就请模型补一句极短的进度提示——几个词以内融入对话不要宣布、不要复述请求、不要说缺结果。两个细节值得注意上限 4 次MAX_HEARTBEATS 4心跳太多会变成唠叨120 秒后闭嘴静候结果只在通道空闲时插话_session_busy()检测模型正在说话或用户正在说话时绝不抢话避免和打断barge-in处理互相竞争——这个竞争正是早期版本里用户回合无人应答的元凶。注释里有一句设计哲学值得所有做实时语音的开发者收藏一个工作中的 agent永远不能和一个死掉的 agent 无法区分。第三道防线关键词验证确认结果真的被说了结果落地后模型并不保证一定会把它播报出来可能忙着处理新对话。VisionClaw 的答案是关键词验证实现在 agent/main.py#L275-L294提取特征词从结果文本中抽取长度 ≥7 的英文单词过滤掉finished、result、summary等停用词定达标线需要命中的词数随结果长度缩放n // 10至少 1 个——短结果不要求超过它拥有的词数否则一行话的结果永远验证不过只数交棒之后的话这是踩过坑的修正。早期版本把整段通话历史都算数导致一句还在等 Amazon 的结果……包装尺寸、价格、评分因为和结果共享词汇而提前验证成功重播机制随即停手结果实际从没被说轮询 重试 兜底每 5 秒检查一次、最多看 45 秒不达标就等空闲回合后再注入一次更强硬的指令你还没告诉用户结果现在就完整说两轮都不行进入下一道防线。最后一里路结果停放挂断也不丢答案如果用户已经挂断、会话都不存在了_park_result() 会把任务 结果整体 POST 到网关的/pending-notifications端点网关 queuePending() 将其持久化每用户最多保留 20 条超出丢最旧的并记一条result_parked追踪事件。下次用户拨通时语音进程开场第一件事就是 _drain_pending() 取回积压结果并注入专门措辞的指令agent/main.py#L1270-L1329你不在的时候任务完成了下面这段就是你该说的话先别只顾打招呼。 随后同样启动一套关键词验证轮询90 秒18 × 5s——因为取回是破坏性的取走即删若模型这次仍没说到宁可重新停放留给下下次通话。这条停放—补报链路也解释了为什么浏览类任务结束后屏幕上的实时卡片会多保留 90 秒BROWSE_KEEPALIVE_S云端浏览器还停在最终页面让结果在被说出的同时还能被看见。关键参数速查常量值位置含义QUICK_ANSWER_S10sagent/main.py#L350快答预算超过则延迟降级HEARTBEAT_S30sagent/main.py#L354心跳间隔MAX_HEARTBEATS4agent/main.py#L355单次任务心跳上限DELIVER_WAIT_S8sagent/main.py#L358注入播报前等待空闲回合的上限BROWSE_KEEPALIVE_S90sagent/main.py#L362浏览结果卡片保留时长MAX_PENDING20 条gateway/src/notify.ts#L57每用户停放结果上限QUICK_ANSWER_TIMEOUT_MS30sgateway/README.md网关侧快答预算想深入阅读语音工作进程全部逻辑心跳、验证、停放agent/main.py网关双速回合与确认指令gateway/src/server.ts事件推送与结果停放队列gateway/src/notify.ts网关整体说明与端点清单gateway/README.md应用端iOS / Androidsamples/CameraAccess/ 与 samples/CameraAccessAndroid/这套快答 降级 心跳 验证 停放的组合拳本质上是把异步编程里最终一致的思想搬进了口语对话答案可以迟到但不能沉默更不能丢失。如果你也在做实时语音 Agent这套心跳与验证的取舍思路非常值得借鉴。【免费下载链接】VisionClawReal-time AI assistant for Meta Ray-Ban smart glasses -- voice vision agentic actions via Gemini Live and OpenClaw项目地址: https://gitcode.com/gh_mirrors/vi/VisionClaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表