核心架构

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─────────────────────────────────────────────────────────────┐
│ FastAPI Server │
├─────────────────────────────────────────────────────────────┤
│ SSE Stream │ Pause/Resume │ Inbox通知 │
│ (推送思考流) │ (异步控制) │ (用户输入) │
└─────────────────────────────────────────────────────────────┘
↓ ↓ ↓
┌─────────────────────────────────────────────────────────────┐
│ Browser Frontend │
├─────────────────────────────────────────────────────────────┤
│ 实时显示思考 │ 暂停/恢复按钮 │ 输入框 │
│ (事件流渲染) │ (状态控制) │ (异步发送) │
└─────────────────────────────────────────────────────────────┘

关键技术实现

1. SSE事件类型

事件类型 含义 触发时机
thinking LLM思考内容 每次LLM响应
tool_call 工具调用 工具执行前
tool_result 工具结果 工具执行后
iteration 迭代计数 每轮开始
waiting 等待用户 无工具调用时
paused 已暂停 暂停后
resumed 已恢复 恢复后

2. 异步控制的实现

1
2
3
4
5
6
7
8
9
10
11
# 暂停机制
pause_event = asyncio.Event()
pause_event.set() # 默认不暂停

# 暂停时
agent_state["paused"] = True
pause_event.clear() # 阻塞

# 恢复时
agent_state["paused"] = False
pause_event.set() # 放行

3. 用户输入通知

1
2
3
4
5
6
7
8
9
user_input_event = asyncio.Event()
user_input_content = ""

# 用户发送时
user_input_content = content
user_input_event.set() # 通知Agent

# Agent等待
await user_input_event.wait()

与Throp框架的对比

维度 Throp Awakened-AI-Web
交互模式 终端 + 文件 Web + SSE
异步控制 Cron wake 暂停/恢复按钮
用户输入 文件修改 HTTP POST + 事件通知
可见性 本地 远程访问
实时性 日志文件 实时推送