Agent 干活时,终于不用闭嘴了
一个会说话的 Agent最尴尬的时刻是它真正开始干活之后。你让它查一份资料它很自然地回一句「好我去看看」。然后工具开始调用搜索开始转圈后台开始跑任务刚才还像个活人的声音突然没了。屏幕上只剩一个转圈。。。你不知道它卡住了还是忘了你。想追问进度又怕把正在做的事打断。这种体验特别像打电话给一个助理。前半分钟他有问有答真正接到任务以后却啪一下把电话挂了。等十分钟再打过去对方可能还得重新问一句你刚才让我做什么来着我最近翻到一个开源项目Qwen Audio Agent。它的 README 第一行写的是「Agent始终在场」。说真的这句话比一串模型参数更戳我因为它盯上的不是 Agent 会不会说话而是 Agent 忙起来以后还能不能继续和人交流。它不是又造了一个 Agent先把最容易误会的地方讲清楚Qwen Audio Agent 不是一个试图包办所有事情的新模型也不是把 OpenClaw、Codex、OpenCode 全部重写一遍。它更像一个语音前台和运行时。你面对的是同一个语音助理但系统内部把工作拆成了两条路。能直接回答的问题交给 Qwen Audio Realtime 当场说。需要搜索、读文件、调用工具、改代码或者持续几分钟的任务则交给后面的 Agent 去做。前台继续听你说话后台继续干活。这两件事终于不再互相绑架了。很多语音产品的问题不是识别不准也不是合成声音不够自然而是整个交互仍然沿用一问一答的回合制。你说一句它做完一切再回一句。任务只要稍微重一点对话就会塌成等待页面。Qwen Audio Agent 做的事坦率的讲很像给这套回合制挖了一条旁路。项目里的spawn_thinking会把需要持续处理的请求交给后台但它自己不等任务结束。前台先告诉你工作已经接住然后继续留在对话里。注意这里最值钱的不是「异步」两个字。程序员早就会开后台任务了。真正难的是异步以后用户还得面对同一个人任务状态不能丢结果回来不能串台中途追问和取消也不能把上下文搞乱。这才是它真正想解决的东西。一张嘴背后却是两套节奏项目文档把整个系统分成了三个层次。第一层是实时语音前台负责持续收音、理解当前对话、直接回答简单问题也负责把复杂任务派出去。第二层是 Gateway 和协调 Agent管理任务的排队、状态、权限、取消与结果回收。第三层是可选的独立 Agent Session真正进入项目目录调用工具操作文件或者跑一个持续时间更长的任务。这套结构看着有点工程味我还是用大白话讲。你可以把实时前台想成坐在你面前的项目经理。简单问题他自己答。事情一旦需要查资料、跑程序或者进项目里改文件他就把任务交给后面的执行者。但项目经理没有离席你还能继续问他进度补充要求或者说先停一下。后面的执行者做完以后也不是突然从另一个窗口扔回来一坨结果。结果会先回到原来的协调上下文再由同一个语音助理自然地告诉你「已经好了」。你想想看这里有一个特别容易被忽略的细节。人对助理的信任很大一部分不是来自对方从不犯错而是来自你知道事情现在在谁手里做到哪一步了有变化时该找谁。传统聊天框很容易把这层关系压扁。消息发出去界面上只剩一个转圈。Qwen Audio Agent 则给任务留了一张「回执」内部会记录 queued、running、delegated、finalizing、completed、cancelled 这些状态。前端不需要把内部 Session、权限载荷和执行细节全摊给用户但至少能告诉你它是在处理中还是已经完成。这不是更会聊天。这是更会交代。你可以继续说任务也可以继续跑如果只是把工作扔到后台这个项目还没有那么有意思。它更骚的一点是用户可以在任务进行时继续发起新的对话。比如一个任务正在让 Codex 改代码你可以问当前进度也可以取消。另一个需要立即回答的问题不必傻等前一个任务做完。项目会为同一个用户维护任务队列同一个后台协调 Session 内的写入保持串行避免几条请求互相踩上下文。项目文档对这条边界写得很克制。前台负责交流、查询状态和传递明确的权限决定但不替后台选择工具也不擅自决定执行策略。后台 Agent 仍然拥有自己的工具、Skill、MCP 和权限体系。我很喜欢这个判断。因为语音不是万能遥控器。它最适合做的是表达意图、补充上下文、确认风险和接收结果。至于到底用终端还是浏览器开几个步骤是否需要另一个 Session那应该是执行 Agent 的工作。很多产品为了让语音显得厉害会恨不得把所有按钮都塞进一句口令里。结果用户说得累系统也猜得累。这个项目反而承认了语音的边界然后把它放在最适合的位置上作为人与 Agent 之间持续存在的那条线。这条线还能跨过一次重连顺着上面的再聊聊记忆。Qwen Audio Agent 会为每个用户和后台维护一个固定的协调 Session。换一次语音连接不会顺手把后台上下文也清空。已经完成但还没来得及播报的结果也会尽量回到发起它的那次对话里。只有原会话不在了系统才会在同一用户的新连接里恢复未播报结果。这里没有什么玄学记忆。用户档案、长期记忆和任务状态都落在本机配置目录里。USER.md保存稳定偏好frontend-memory.json保存用户明确要求长期记住的内容tasks.json保存任务结果和待通知状态。项目也特意提醒不要把密码、API Key、验证码或者访问令牌塞进这些文件。麦克风音频与实时对话会发送给配置的 Qwen Audio Realtime 服务后台任务还可能访问你选定的模型、工具和外部服务。这块需要注意一下。「本地保存记忆」不等于「所有数据都只在本地」。如果你要把它放进公司项目、客户资料或长期常驻的工作环境数据会流向哪里后台 Agent 能拿到什么权限必须自己先捋清楚。从终端到桌面悬浮球这个项目提供 WebUI、终端 TUI 和 macOS 桌面悬浮球。README 里的两种悬浮球动效一种像流光声波一种像液态渐变。它们并不负责炫技主要是在桌面上给语音状态一个持续可见的入口。平台差异也得说清楚。macOS 的 TUI 使用带回声消除的全双工模式可以直接说话打断。Linux 和 Windows 默认是半双工播报时按x手动打断。虽然也能开启无回声消除的全双工但项目建议戴耳机否则扬声器回声可能被重新识别成用户输入。安装门槛不算零。它需要符合版本要求的 Node.js、npm、DashScope API Key还要明确选择一个后台 Agent。用 npm 全局安装以后先运行qwenaudio config写配置再启动 Gateway随后打开 TUI 或 WebUI。如果只是想偶尔问一句天气或者让模型回答一个知识问题这套架构有点重。你用手机里的现成语音助手可能更省事。但如果你真的想让 Agent 常驻桌面持续接收任务进入项目工作区跑几分钟甚至更久再把结果带回当前对话那它就值得认真看。尤其是那些已经在用 OpenClaw、OpenCode、Qoder 或 Codex 的人它不是让你抛弃原来的 Agent而是给原来的执行能力补上一层持续语音入口。真正稀缺的不是声音是在场我有时候觉得语音 Agent 的第一阶段大家都在追求「像人」。停顿要自然音色要有情绪打断要足够快。于是我们得到了越来越像真人的声音。可一个助理真正让人安心的地方从来不只是声音像不像。你把事情交给他以后他没有消失。你临时想起一个条件可以补一句。你觉得方向不对可以叫停。任务做完他还记得这是从哪段对话里长出来的然后回到你面前把结果讲清楚。这种「在场感」听着很软背后却全是很硬的工程问题。并发、队列、状态、权限、取消、重连、结果去重、播放时机每一块没处理好那个像人的幻觉都会啪一下碎掉。Qwen Audio Agent 现在当然还不是一个装上就能托管全部生活的万能助理。它依赖云端实时语音服务依赖你选择的后台 Agent跨平台全双工体验也不完全一致。当前版本还是 0.9.1README 自己也对不同后端的验证程度做了区分。但我是真的觉得它提出的这个方向很对。过去我们让 Agent 学会说话。下一步可能不是让它说得更像人而是让它在真正开始干活以后仍然留在这场交流里。所以回到开头那个尴尬的瞬间。一个会说话的 Agent不应该一干活就闭嘴。它应该接住任务然后继续在场。