Skip to content
Go to Dashboard

Sessions 与 Tasks

Session 是一个运行时容器——它持有浏览器、profile(cookies / 登录态)、workspace(文件系统)。Task 是跑在 session 里的一条 instruction。同一 session 可以接连跑多个 task,它们共享前一个 task 留下的状态。

资源形态

text
project
└── session                   id: sess_…
    ├── browser, profile, workspace
    └── task                  id: task_…
        ├── instructions      "搜 Hacker News..."
        ├── status            running | done | …
        └── events (SSE)      task.status_changed, task.message, …

生命周期(7 态)

mermaid
stateDiagram-v2
    [*] --> pending
    pending --> running
    running --> awaiting_input : task.input_request
    awaiting_input --> running : POST /intervene
    running --> paused : POST /pause
    paused --> running : POST /resume
    running --> done
    running --> failed
    pending --> canceled
    running --> canceled : POST /cancel
    awaiting_input --> canceled
    paused --> canceled
状态含义下一步
pending已接收,等 agent slotrunningcanceled
runningagent 在跑donefailedawaiting_inputpausedcanceled
awaiting_inputagent 自己暂停了,等你回应running(通过 intervene
paused你手动暂停runningresume)、canceled
done成功完成;output 已落终态
failed报错;error.code error.detail 已落终态
canceled你取消(或 max_duration 触发)终态

非终态都占 session 资源。用 max_duration_minutes 兜底。

提交一个 task

python
from web_agent import Client
from web_agent.v1.types import CreateSessionRequest, RecordingConfigRequest

session = await client.sessions.create(CreateSessionRequest(
    instructions="找出 24 小时内 Show HN 上 Top 5 的帖子。",
    model="claude-sonnet-4.6",
    max_cost_usd="0.50",
    max_duration_minutes=10,
    recording=RecordingConfigRequest(enabled=True),
    keep_alive=True,
))
task = session.tasks[0]
字段类型说明
instructionsstring一段中文 / 英文。最多 10 000 字符
modelstring模型 id,如 claude-sonnet-4.6 / gemini-3-flash
max_cost_usdstringdecimal-as-string;硬上限
max_duration_minutesint1–10 080(一周)
recordingobject{enabled, quality, capture_during_take_control};不传 = 关
keep_alivebooltask 结束后保持 session 热度,方便接 follow-up task
allowed_actionsstring[]允许 agent 调的工具白名单。空数组 = 全允许
profile_idstring复用 profile 的 cookies / 登录态

完整 schema 见 OpenAPI spec

Follow-up task

python
from web_agent.v1.types import CreateTaskRequest

followup = await client.sessions.create_task(
    session.id,
    CreateTaskRequest(instructions="点进第一篇帖子,总结一下评论区。"),
)

跑在同一个浏览器里,cookies 与上一条 task 留下的 DOM 都在。

事件

每个 task 有一条 SSE 流:

http
GET /v1/projects/{pid}/do_anything/sessions/{sid}/tasks/{tid}/events
Authorization: Bearer wa_…

11 种事件类型(envelope 一致;data 内容不同):

类型何时 emit
task.status_changed状态切换
task.messagechat 里多一条(agent 或 user)
task.action.startedagent 调用某工具
task.action.completed工具返回
task.action.failed工具抛错
task.screenshot浏览器新 frame(url 短期签名)
task.input_requestagent 暂停,需要你回应
task.input_request_resolved你的 intervene 已采纳
task.cost_update一步的 cost 增量
task.completed终态;output 已落
stream.heartbeat约 15 s 一次;可忽略

断线干净续传:

http
GET …/events
Last-Event-ID: 142

server 会重放 id > 142 的事件,不漏。

Input request(人在回路)

agent 撞到 captcha、2FA、判断不准的事,会发 task.input_request

json
{
  "type": "task.input_request",
  "data": {
    "input_request_id": "ir_01HXX…",
    "prompt": "我看到一个 'Verify you're human' 挑战,你帮我点过去?",
    "schema": { "type": "object", "properties": { "solved": { "type": "boolean" } } }
  }
}

POST /intervene 回:

python
await client.messages.intervene(
    session.id, task.id,
    input_request_id="ir_01HXX…",
    response={"solved": True},
)

task 切回 running。整轮一次往返,无 polling。

Profiles

Profile = 可复用的浏览器身份:cookies、localStorage、登录态。create session 时引用:

python
await client.sessions.create(CreateSessionRequest(
    instructions="打开 LinkedIn 收件箱,回复最新一条消息。",
    profile_id="prof_linkedin_main",
))

第一次在 Console 里手动设置 profile(登录、点 cookies、做你想做的)。后续 session 直接复用。

Workspaces

Workspace = 持久文件系统。agent 可读可写;task 跑完后用签名 URL 取文件。"抓这个站,写 CSV,丢回来"这种场景常用。

接下来