实时语音和聊天
麦克风音频以 16 kHz PCM 输入。Gemini Live 返回 24 kHz 语音和实时转录,打字消息可加入同一会话。
为什么它是超级代理
Amos 是嵌入 ERP 的独立 Rust 和 Axum 服务。ADK-Rust 的 RealtimeRunner 在一个实时会话中保持语音、文本、转录、工具调用和中断,用户可以自然说话并在需要精确时输入。
当请求需要操作时,Amos 加载专注的会计技能并通过 MCP 调用 ERP 工具。每个工具都包裹用户的角色范围和审计上下文。 账本记录在 Rust 强制执行的明确审批关卡处停止, 然后在获得批准后使用用户的 ERP 令牌执行。
结果保持可见。Amos 维护工作计划,通过独立浏览器工具驱动真实 ERP,捕获截图证据,存储会话历史,回忆批准的业务上下文,并使用范围有限的后台代理执行定期会计任务。
麦克风音频以 16 kHz PCM 输入。Gemini Live 返回 24 kHz 语音和实时转录,打字消息可加入同一会话。
MCP 连接 Amos 到报告、发票、账单、付款、工资、采购、库存、对账、税务申报和期末结算。
即插即用的 SKILL.md 剧本定义工具顺序、会计检查、确认点以及 Amos 绝不能执行的操作。
工作计划显示每一步。工具活动、徽章发布和完成状态通过会话 WebSocket 传递。
Playwright MCP 服务器导航产品,验证结果,并将截图存档于对话旁。
每次工具调用都会检查角色范围。账本写入在代码强制的确认门处暂停,随后工具执行。
Postgres 和 pgvector 保留业务事实、经验教训和会话摘要。召回、去重和遗忘路径保持内存可维护。
有范围的一次性代理准备简报、管理账户、对账、税务工作、付款提案和业务日历上的结账包。
案例研究 · 管理账目
有用的结果不是通用解释。Amos 查询业务账本,比较期间和预算,计算财务 KPI,命名关键驱动因素,并在答案旁边显示支持工作流。

会话时钟提供用户时区、财务上下文和工作截止日期,确保“上个月”解析一致。
use_skill 工具仅在需要时将财务报告或管理账目工作流带入上下文。
有范围的 MCP 工具运行损益表、预算比较、前期报告、资产负债表、发票、账单、工资单和税务状态。
Amos 从工具结果推导边际、DSO、DPO、流动性、现金覆盖和材料差异,而非凭空造数。
UI 通过当前 WebSocket 会话接收任务进度、工具活动、报告和建议决策。
转录被存储,持久的业务事实或工作流经验可在后续会话中调用。
架构
实时模型从不接收对账本的无限制连接。ADK-Rust 将过滤后的工具集桥接到会话,每次调用都经过授权、确认和审计包装后才到达 ERP 或浏览器。
证据与控制
Amos 使用隔离的 Playwright MCP 服务器打开 ERP,导航到受影响的记录或报告,验证可见状态,并捕获证据卡。浏览器是验证界面;会计操作仍通过有范围的 ERP 工具完成。
ledger:post 发送确认卡并等待。拒绝或超时表示工具不执行。

可组合的会计知识
每个技能都是可版本化的 SKILL.md 剧本。实时提示接收一个简短目录,然后 使用技能 仅在作业需要时加载完整工作流程及其允许的MCP工具。
主动会计
例程在 TOML 中声明其 cron 计划、提示、技能、精确工具、作用域和通知行为。ADK-Rust 为该任务创建短生命周期 LLM 代理,记录运行并将结果发送至 ERP 收件箱。

Amos 背后的 Rust
仓库构建 RealtimeRunner,将 MCP 工具桥接到实时会话,并在模型调用前包装每个工具。审批路径为应用代码,修改提示无法绕过。
阅读完整 Amos crate ↗let mut builder = RealtimeRunner::builder()
.model(state.model.clone())
.config(config);
for tool in mcp_tools {
let scoped = ScopedTool::wrap(
tool,
granted_scopes.clone(),
user_id.clone(),
session_id.clone(),
audit.clone(),
Some(session.clone()),
);
builder = builder.tool_arc(
definition,
Arc::new(ToolBridgeAdapter::new(scoped, context_factory.clone())),
);
}if required_scopes.contains(&"ledger:post") {
if let Err(refusal) = self.confirm_with_user(&args).await {
self.record(self.inner.name(), AuditOutcome::Denied).await;
return Ok(json!({ "error": refusal }));
}
}
self.record(self.inner.name(), AuditOutcome::Allowed).await;
let args = self.with_user_token(args).await;
self.inner.execute(ctx, args).await当前部署合同
构建完整的代理产品
Amos 展示了 ADK-Rust 如何连接本地音频、MCP 工具、技能、记忆、后台代理、产品 UI、授权、审批和证据,围绕一个生产工作流程。