跳到正文

Python / 原生 HTTP ​

当前仓库没有可安装的 web-agent-sdk Python 包。Python 集成应直接调用 WebAgent REST API;字段和路径以 OpenAPI spec 为准。

安装 HTTP 客户端 ​

bash
pip install httpx

服务端 API key 只放在服务端环境变量中:

python
import os
import httpx

BASE = "https://webagent.qoni.ai"
PROJECT_ID = os.environ["WEBAGENT_PROJECT_ID"]
API_KEY = os.environ["WEBAGENT_API_KEY"]  # wa_...
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

创建 DoAnything run ​

当前推荐的 run 资源路径是 /api/v1/projects/{pid}/do_anything/runs。它会在没有 session_id 时创建新的 session;需要复用 session 时在请求体中传 session_id。

python
async with httpx.AsyncClient(base_url=BASE, headers=HEADERS, timeout=None) as client:
    response = await client.post(
        f"/api/v1/projects/{PROJECT_ID}/do_anything/runs",
        json={
            "instructions": "打开 Hacker News,列出首页前五条故事的标题和链接。",
            "max_duration_minutes": 10,
        },
    )
    response.raise_for_status()
    run = response.json()
    run_id = run["run_id"]

    async with client.stream(
        "GET",
        f"/api/v1/projects/{PROJECT_ID}/do_anything/runs/{run_id}/events",
    ) as stream:
        async for line in stream.aiter_lines():
            if line.startswith("data:"):
                print(line[5:].strip())

DoAnything 的单 run 路径还提供 GET、POST .../cancel、POST .../intervene、POST .../messages、GET .../screenshots 和 SSE .../events。旧的 session-scoped 路径仍被 Console 使用,但新集成优先使用 run-id 路径。

DeepResearch 与 WebSearch ​

python
research = await client.post(
    f"/api/v1/projects/{PROJECT_ID}/deep_research/runs",
    json={"topic": "2026 年浏览器自动化的主要趋势", "depth": "standard"},
)
research.raise_for_status()

search = await client.post(
    f"/api/v1/projects/{PROJECT_ID}/web_search/runs",
    json={
        "queries": ["browser automation 2026"],
        "max_results_per_query": 5,
        "summarize": True,
    },
)
search.raise_for_status()

两个创建接口都会返回 202 和 run envelope;用 GET .../runs/{run_id} 轮询,或订阅 .../events。WebSearch 当前没有 refine、follow-up 或 messages 端点。

Track ​

python
monitor = await client.post(
    f"/api/v1/projects/{PROJECT_ID}/track/tracks",
    json={
        "instructions": "每天上午九点检查这个页面是否有变化。",
        "schedule": {"daily_at": "09:00", "tz": "Asia/Singapore"},
    },
)
monitor.raise_for_status()
monitor_id = monitor.json()["id"]
checks = await client.get(
    f"/api/v1/projects/{PROJECT_ID}/track/tracks/{monitor_id}/checks",
)
checks.raise_for_status()
print(checks.json())

每日调度提前 0–30 分钟;间隔调度用整数 every_seconds(600–2592000)。run_now 只受理并返回任务引用,需查询最近 50 次 checks 确认终态。创建立即启动 first_look,checks 成功状态是 done;当前检查未结束时 run_now 返回 409 task_in_progress,先等终态,不自动重试。pause/delete 不取消在途检查。Track PATCH 直接传 title/instructions/schedule/status;无旧 DSL、通知或 SSE。完整契约见 Track。

认证边界 ​

上面的原生 HTTP 示例使用 wa_... API key。Node SDK 的高层方法不是这样调用:它使用 AK/SK 初始化,再通过 delegateToken() 得到代表终端用户的短期 token。不要把 SDK 内部的 token exchange 路由写进业务代码。