Run 入口
wesgine 发起 Run 的两个入口及其区别。
两个入口
| 入口 | 返回 | 适用场景 |
|---|---|---|
cell.Runtime().Run(ctx, req) | (<-chan engine.Event, error) | SSE 流式 |
cell.Runtime().Chat(ctx, req) | (string, error) | 同步等待 |
Run(流式)
events, err := cell.Runtime().Run(ctx, AppRunRequest{
Actor: "alice",
SessionID: "s1",
AgentID: "agent-legal",
Messages: []Message{...},
Model: "gpt-4o",
})
// events 是只读 channel,消费方 range 读取
for evt := range events {
switch evt.Type {
case engine.EventStreamDelta:
// 流式文本
case engine.EventToolStart:
// 工具调用开始
case engine.EventDone:
// Run 完成
}
}
Chat(同步)
resp, err := cell.Runtime().Chat(ctx, AppChatRequest{
Actor: "alice",
Messages: []Message{...},
Model: "gpt-4o",
})
// resp 是最终回复文本
必填字段
| 字段 | 说明 | 缺失行为 |
|---|---|---|
Actor | 请求主体(用户标识) | ErrActorRequired |
Model | 模型名称 | ErrModelRequired(INV-MODEL-01) |
Messages | 用户消息 | 空消息无意义 |
Actor 来源
| 产品 | Actor 值 |
|---|---|
| wesclaw desktop | weisyn uid / "local" |
| wescode | "local" |
| wescraft 个人版 | "local" |
| wescraft 团队版 | SSO uid |
| teleclaw | JWT userId |
可选字段
| 字段 | 说明 |
|---|---|
SessionID | 会话 ID(新建或续接) |
AgentID | Agent 配置 ID |
Tags | 审计元数据 |
ThinkingLevel | 推理深度 |
ProviderName | 指定 Provider |
CycleDetectOverride | per-Run CycleDetect 覆盖 |
HTTP 入口
POST /cells/{cellID}/run → SSE 流式
POST /cells/{cellID}/chat → 同步
SSE 事件流
Run 产出的事件类型:
| 事件类型 | 含义 |
|---|---|
stream_delta | 流式文本片段 |
tool_start | 工具调用开始 |
tool_progress | 工具执行进度 |
tool_result | 工具执行结果 |
turn_end | 单轮结束 |
plan_created | Plan 创建 |
plan_updated | Plan 步骤更新 |
plan_completed | Plan 完成 |
plan_interrupted | Plan 中断 |
budget_status | 预算状态 |
error | 错误 |
done | Run 完成 |
SSE 重连
GET /cells/{cellID}/runs/{runID}/events?from_seq=N
断线后用 from_seq 续播(INV-RUN-DETACH)。
Run 生命周期与 SSE 解耦
SSE 断开 ≠ 取消 Run。
取消 Run 的唯一途径:
POST /sessions/{sid}/interrupt(用户主动)- CycleDetector 自愈失败后 HITL 超时
- ErrorStreak HITL 超时
BudgetCheckFn返回 Exhausted- Cell Stop
相关文档
- Run 生命周期 →
run-lifecycle.md - Run 预算管理 →
run-budget-management.md - SSE 重连 →
run-sse-reconnect.md - 终止哲学 →
run-termination-philosophy.md