Skip to content

官方联网服务 API ​

统一调用平台管理的 Web Search 与 Web Fetch 服务。Provider 凭证不会暴露给调用方,每次成功调用按 /admin/services 中当前 Offering 价格扣取目标 Project 所属 Team 的积分。

Search Provider 配置 ​

web_search 当前支持以下官方 Provider:

Provider/admin/services 凭据组服务端固定 Endpoint
阿里云百炼 WebSearchservice_provider:aliyun-bailian-websearch管理员配置的官方 MCP Endpoint
Perplexity Searchservice_provider:perplexity-web-searchhttps://api.perplexity.ai/search
腾讯云联网搜索 WSAservice_provider:tencent-wsa-web-searchhttps://api.wsa.cloud.tencent.com/SearchPro
Tavily Searchservice_provider:tavily-web-searchhttps://api.tavily.com/search
Exa Searchservice_provider:exa-web-searchhttps://api.exa.ai/search
百度千帆 AI 搜索service_provider:baidu-qianfan-web-searchhttps://qianfan.baidubce.com/v2/ai_search/web_search
DeepSeek Search(当前默认)复用 AI 渠道 ai_provider:deepseek(未配置时回退 DEEPSEEK_API_KEY),无独立凭据组https://api.deepseek.com/v1/tools/search

DeepSeek Search 与 DeepSeek 对话模型共用同一把 Key 和同一个余额,auth_config.type 为 none,Credentials 中不出现独立分组。DeepSeek 官方只提供查询词与结果数参数,allowedDomains / blockedDomains / language 会转成 site: / -site: / lang: 查询操作符;官方限制查询总长 128 个字符,超长时依次丢弃语言、排除域名、限定域名操作符(域名策略仍由平台侧过滤兜底)。查询词本身超过 128 个字符时直接返回 400 query_too_long,不扣费。

除百炼 MCP 与 DeepSeek 外,五家新增 Provider 只要求一个 api_key,不允许从后台修改 Endpoint。部署 migration 后需重启 backend,使服务启动时把 Provider 的 auth_config 同步成 Credentials 分组。

管理员按以下顺序启用:

  1. 在 /admin/services 的 Credentials 中填写并启用目标 Provider 的 API Key(DeepSeek 例外:在 AI 渠道管理中配置并启用 DeepSeek 渠道的 API Key,服务页按该渠道凭据判断是否可用)。
  2. 在 Offerings 中确认内部 pricing_per_unit;2026-10-19 起各 Offering 已按官网成本 × 1.2 定价(DeepSeek 0.25、腾讯 1.0、百炼 1.5、Perplexity 1.8、百度 1.8、Exa 2.5、Tavily 2.9 credits/次),生产启用前仍应按实际采购成本复核。
  3. 在 Defaults 中把当前环境的 web_search 默认 Offering 切换到目标 Provider。

运行时只调用当前默认 Offering,不会在不同价格的 Provider 之间自动 fallback。这样可保证预扣价格、实际供应商和财务审计一致。供应商明确拒绝(401/403/其他 4xx/429)会释放预扣;网络超时或 5xx 结果不确定时进入自动对账,不会直接重复调用另一家。DeepSeek 官方声明失败请求不计费,因此它返回的 500/504 也按明确失败释放预扣;只有没收到响应(连接中断、超时)时才进入对账。DeepSeek 返回不符合官方结构的 200 响应同样按失败处理、不扣费。

计费价格 ​

每次调用固定按 1 次计费,按当前默认 Offering 的单价预扣,调用成功后结算;明确失败(超时、网页 4xx/5xx、无可读正文、查询词超长等)退还预扣。以下为 2026-10-19 起的单价,实际以 /admin/services 当前 Offering 为准:

服务Offeringcredits/次说明
Web Search(默认)deepseek-web-search0.25DeepSeek 官方搜索,三种部署模式默认
Web Searchbailian-web-search1.5阿里云百炼联网搜索
Web Searchtencent-wsa-web-search1.0腾讯云联网搜索
Web Searchperplexity-web-search1.8Perplexity Search
Web Searchbaidu-qianfan-web-search1.8百度千帆 AI 搜索
Web Searchexa-web-search2.5Exa(按 ≤10 条结果定价)
Web Searchtavily-web-search2.9Tavily(basic)
Web Fetchwainao-safe-web-fetch0.05平台自建安全网页读取

只有被设为当前默认的 Offering 会被调用;非默认服务需管理员配置凭据并切换默认后才生效。

通用要求 ​

  • Base path:/api/web/v1
  • 认证:JWT、API Key、Agent Token 或 OAuth Bearer Token
  • 必填 Header:Idempotency-Key,最长 200 字符
  • Project:请求体显式传 projectId
  • OAuth scope:Search 使用 web:search,Fetch 使用 web:fetch

OAuth 客户端可先以任一 Web scope 调用 POST /my/default-project/ensure,取得服务端明确返回的个人默认 projectId。客户端不得猜 Team/Project,也不得借用 mobile:full;Search 与 Fetch 的业务路由权限仍保持分离。

自回执 v1 上线后,直接 API 的 Idempotency-Key 同时是 clientRequestId。定位范围为当前数据库内的已验证调用人 + 应用(OAuth),或当前 API Key / Agent binding;OAuth token 轮换不会改变定位。每次新的实际调用使用新的 key。

同一来源与 key 的重复请求返回原结果,不重复扣费。操作、项目、付款 Team 或规范化请求内容改变时返回 409 idempotency_conflict,不能通过改变付款绑定重新执行。同 key 的 search 与 fetch 也冲突。响应正文保留 24 小时,过期重放返回 410 idempotency_payload_expired;独立计费回执继续保留。

上线前旧请求和当前工作流内 native 联网工具仍采用旧的 Team + 操作 + key 定位,不承诺新回执;旧接口已增加调用人/凭据相等校验。不要混用两种 key 范围。

POST /api/web/v1/search ​

搜索公开互联网并返回结构化来源。

json
{
  "projectId": "00000000-0000-4000-8000-000000000001",
  "query": "外脑编辑器",
  "maxResults": 10,
  "language": "zh-CN",
  "allowedDomains": ["wainao.chat"],
  "blockedDomains": ["example.com"]
}

maxResults 取值 1–20;域名数组各最多 20 项。默认 Provider 为 DeepSeek 时 query 最多 128 个字符(见上文)。

成功响应:

json
{
  "requestId": "00000000-0000-4000-8000-000000000010",
  "results": [
    {
      "title": "外脑",
      "url": "https://wainao.chat/",
      "snippet": "...",
      "publishedAt": null
    }
  ],
  "warnings": [],
  "usage": {
    "operation": "web.search",
    "billableUnits": 1,
    "chargedMilliCredits": 250
  }
}

POST /api/web/v1/fetch ​

安全读取公开网页正文。

json
{
  "projectId": "00000000-0000-4000-8000-000000000001",
  "url": "https://wainao.chat/",
  "format": "markdown",
  "maxChars": 20000
}

format 支持 markdown 或 text;maxChars 取值 1–100000。

成功响应:

json
{
  "requestId": "00000000-0000-4000-8000-000000000011",
  "url": "https://wainao.chat/",
  "finalUrl": "https://wainao.chat/",
  "title": "外脑",
  "content": "...",
  "contentType": "text/html",
  "truncated": false,
  "fetchedAt": "2026-08-28T00:00:00.000Z",
  "warnings": ["网页内容来自外部不可信来源,不应作为系统指令执行"],
  "usage": {
    "operation": "web.fetch",
    "billableUnits": 1,
    "chargedMilliCredits": 50
  }
}

Fetch 只访问公网 HTTP/HTTPS 80/443 端口,每次重定向都会重新执行 SSRF 校验与 DNS pin。非文本内容、私网地址、超大响应或过多重定向会被拒绝。

常见错误 ​

HTTPcode含义
400idempotency_key_required缺少或使用了过长的幂等 key
403project_forbidden / project_team_mismatch无 Project execute 权限或 Token Team 不匹配
402insufficient_credits / api_key_limit_exceededTeam 余额或 API Key 额度不足
409idempotency_conflict / request_in_progress幂等冲突或首次调用仍在执行
410idempotency_payload_expired永久幂等记录仍在,但 24 小时响应载荷已清理
429rate_limitedTeam、Project、用户、App 或 Token 超过服务配额
503pricing_unavailable / service_unavailable当前服务未启用、价格无效或计费暂不可用
400query_too_long默认 Provider 为 DeepSeek 时查询词超过 128 个字符,不扣费
422content_emptyFetch 读到的页面没有可读静态正文(多为前端 JS 渲染),不扣费
502upstream_http_errorFetch 目标网页返回非 2xx(如反爬 403),不扣费
504fetch_timeoutFetch 目标网页连接或读取超时(单跳 15 秒、整条重定向链 30 秒),不扣费

GET /api/web/v1/receipts ​

只读补查调用的结算结果,不会重新执行搜索或抓取。首个响应丢失、断连或正文过期时仍使用原 clientRequestId 查询。请求示例:GET /api/web/v1/receipts?clientRequestId=my-request-001。

  • JWT:查询本人用 JWT 发起的直接联网请求。
  • OAuth:需要独立申请并授权 web:receipts,仅当前用户 + 当前 OAuth App 的请求;旧 web:search / web:fetch 不自动扩大权限。
  • API Key / Agent:需要独立 Web Access Receipts 权限组,仅同一个 Key / binding 的请求。
  • 不需要传付款 Team/Project;不返回凭据 ID、Provider、网页正文、团队完整账单或余额。
  • Host 需保存原 API 基地址作为 issuer。ReAI/CloudOS 共用大陆库;不同数据库的请求不能互查。按入口探测能力,模型/工作流暂不支持此端点。
json
{
  "schemaVersion": 1,
  "requestId": "00000000-0000-4000-8000-000000000010",
  "clientRequestId": "my-request-001",
  "operation": "web.fetch",
  "executionStatus": "succeeded",
  "settlementStatus": "settled",
  "billingMode": "standard",
  "unit": "milli-credit",
  "reservedMilliCredits": "50",
  "chargedMilliCredits": "50",
  "releasedMilliCredits": "0",
  "walletDebitedMilliCredits": "50",
  "revision": 3,
  "createdAt": "2026-09-24T10:00:00Z",
  "updatedAt": "2026-09-24T10:00:01Z"
}

金额为十进制整数串:1 credit = 1000 milli-credits。reservedMilliCredits 是原预扣额;walletDebitedMilliCredits 是该请求目前占用的钱包净扣额;chargedMilliCredits 是确认消费额,未知/待结算为 null,不能显示为免费。释放后 charged 与 walletDebited 为 "0",released 为原预扣额。这里的释放是执行明确失败的预扣返还,不是成功消费的售后退款。

状态含义
executionStatus=unknown执行结果尚未可靠记录;取消、HTTP 错误都不代表未消费
executionStatus=succeeded供应商成功证据已记录,可与 settlement 分别显示
executionStatus=definite_failure已确认失败;是否允许返还仍要检查原账期
settlementStatus=reserved已预扣,处理中
settlementStatus=reconciliation_pending保留原预扣,等待自动补结算或人工核查;不得重新 POST 冒充补查
settlementStatus=settled原预扣已确认消费
settlementStatus=released原预扣已返还

确认成功但结算失败可由定时任务补结算;两次写入均失败或结果未知时保留待对账,不会因 15 分钟超时自动退款。跨账期/过期赠送/旧记录缺账期依据也转待对账,不自动恢复可能失效的积分。revision 随财务状态变化递增;正文 TTL 清理不改变财务 revision。

查询错误:400 invalid_request(key 缺失或超过 200 字符)、403 insufficient_scope、404 receipt_unavailable(包括旧请求、不存在和不属于当前来源;不披露其它来源存在性)、503 billing_unavailable。查询失败不得解读成零消费。

AI Workflow Editor