项目目录

CALL-E / 系统概览

CALL-E

从一次电话工具到持续拥有用户目标的 Agentic 系统:产品边界、三条典型旅程,以及可恢复、可审计的 Goal Runtime 实现。

进行中

CALL-E 不是“会调用电话工具的聊天机器人”。它处理的是一个持续时间可能远长于单次对话的目标:理解用户要什么,确认真实世界副作用,规划一次或多次电话,保存过程证据,并把结果重新交付给用户。今天的 agentic CALL-E 由 OpenAI Agents SDK 驱动(代码在 calle/agentic),一次执行就结束的外呼和长任务 Goal 跑在同一套 Goal Runtime 上;旧的无状态 v1 流水线已被吸收为 Runtime 里的一种 RunSpec 和 Run。

本文建立阅读整个 Project 所需的系统模型。产品侧内容依据知识转移文档 docs/calle-agentic-knowledge-transfer.md(基线 2026-08-12);工程侧依据 s-eleven-mcp revision b36ac02f 的源码审计。实现细节由后续文档展开。

1. 一条主链路

Text
用户消息
  → CALL-E API 创建或恢复 Session
  → MainAgent 澄清请求并 commit Goal
  → GoalIterationRunner 恢复 Goal 上下文
  → GoalAgent 发布 RunSpec 并创建 Run
  → VoiceRunExecutor 组装 Botlab Agent 和 Calling 任务
  → 实时事件、转写与结果写回 Run / Evidence
  → GoalAgent 继续、重试、停止或提交 Report
  → Session Event 让前端恢复并展示结果

这条链路有两个时间尺度。一次聊天 turn 希望快速响应;一个电话目标却可能等待接听、经历多次尝试,甚至跨越服务重启。因此,系统不能把进度只放在模型上下文或内存任务里。

2. 五个核心对象

对象回答的问题
Goal用户最终想完成什么,哪些约束已经确认?跨会话、跨执行持续存在
RunSpec系统准备怎么做?不可变、可追溯的执行版本(话术 + 契约 + 配置)
Run现实中实际发生了哪次尝试?
Evidence / Artifact为什么得到这个结论?只追加,不改写
Delivery系统现在要告诉或问用户什么?GoalAgent 声明,Runtime 投递

Chat history 帮助模型推理,但 GoalRunSpecRunEvidence 才是产品事实。Goal 不等于一通电话:一项长期目标可以产生多个版本化 RunSpec 和多个 Run;执行状态也不是 Goal 状态——一次通话失败不会让目标失败,成功也不会让目标完成。

3. 四条用户体验边界

系统对用户的承诺只有四条,所有评测用例都对应其中一条:

  1. 系统说的状态是真的——「已保存」「已验证」「已批准」「已执行」「已完成」不许互相顶替;
  2. 用户知道系统接下来要做什么——真实电话和热线绑定前,批准对象是确切动作本身;
  3. 系统没有消失——长任务里用户总能看到进度、等待原因和下次继续时间;
  4. 失败不等于重新开始——崩溃、重启、通话失败都不丢失已确认的 Goal、方案和证据。

这四条由 Goal Runtime 的持久状态、protected-tool approval、delivery 契约和 bounded recovery 兑现,代价是更长的链路、多一跳的事实读取和跨 Agent 排障成本。

4. 四个系统边界

边界主要职责当前源码位置
API请求身份、会话接入、消息与事件流calle/apps/api
Agentic RuntimeMainAgent、Goal、Iteration、Run、Report 和持久事件calle/agentic
Voice Runtime冻结语音指令、创建语音 Agent、拨号、监控与结果收集calle/voice_runtime
Platform AdapterBotlab、Calling、IAMS、实时事件等外部能力calle_platform

API 层可以结束一次 HTTP 请求,但 Goal 仍可在后台推进。Agentic Runtime 保存业务事实并决定下一步;Voice Runtime 执行一通电话;Platform Adapter 隔离外部系统协议。模型负责判断,确定性代码负责身份、状态转换、幂等、事务和副作用边界。

5. 为什么能够恢复和审计

CALL-E 把关键进展写成持久记录:Goal 及其 Event、dispatch cursor、不可变 RunSpec、Run 状态与 Event、Report、Session Event,以及 Workspace 中的证据引用。

GoalIterationRunner 通过 claim、lease 和 cursor 避免多个 worker 重复处理同一段 Goal 历史。一次 iteration 只消费已经提交的事实;最终业务状态由外层事务提交,提交后才向用户 Session 发布可见事件和安排 Voice Run。页面刷新、连接中断或进程重启后,系统可以从数据库与事件记录恢复,而不是猜测模型上次做到哪里。

真实电话仍存在外部副作用窗口。CALL-E 能提供稳定的本地身份、状态机、幂等键和证据链,但数据库事务本身不能证明外部供应商永远不会重复执行。文档会明确区分“本地 exactly-once 记录”与“端到端副作用保证”。

6. 怎样继续阅读

先读产品层四页:从「打一通电话」到「持续完成一个 Goal」定义 Goal 与四条体验边界;三条典型产品旅程展开 Outbound、Published Goal 与 Inbound Hotline 的生命周期;Goal 的生命周期 PRD给出开发者视角从创建到生产改进的逐步流程与 P0–P3 拆分;分层定位与迭代 Playbook给出 bad case 归属和发布纪律。

再进入工程层:技术架构与框架取舍解释为什么选择显式 runtime,Agentic Goal 架构和三篇 Runtime Trace 沿真实调用链查看事务、游标与语音执行。工程章节记录仍然成立的延迟优化方法和当前开发状态。最后的源码地图用于从领域概念跳回具体模块。项目动态与独立 Blog/Demo 的关联内容集中在 Updates,不会打乱稳定文档顺序。

稳定文档

从这里继续

Updates

最近动态

  1. 项目动态

    新增产品层文档并按 2026-08-12 基线刷新

    依据知识转移文档 calle-agentic-knowledge-transfer.md 新增 Goal 产品模型、三条产品旅程与迭代 Playbook 三页,并刷新开发状态。

    产品分区新增三页:Goal 定义与四条用户体验边界、Outbound / Published Goal / Inbound 三条旅程、bad case 分层定位与迭代纪律。Overview 与开发状态页同步更新:自动续拨、Published Goal API、评测 runner 与 Domain DRI 仍是待建设项。
  2. 项目动态

    新增 Goal 生命周期 PRD 页

    依据《CALL-E | GOAL 的生命周期》PRD(2026-08-13)新增开发者旅程页:六个验证阶段、状态感知推荐与 P0–P3 任务拆分。

    产品分区新增 goal-lifecycle 页,覆盖创建入口、Goal Understanding、重复任务检测、Simulation / Live / Real Call Test 闭环、API Integration 与生产后 Review 触发;产品旅程页与开发状态页同步补充交叉引用。
  3. 项目动态

    CALL-E Project 文档入口上线

    原本分散在 Blog、系列文章与 Demo 中的 CALL-E 内容迁入统一 Project,并按当前源码重新审计。

    稳定文档现在按 Architecture、Runtime Traces、Engineering 和 Explore 组织;原系列文章使用统一阅读路径,Source Atlas 也进入双语 Project 页面壳。
查看全部动态 →

源码审计版本 b36ac02f