每个请求都有可引用的 ID

· Hyperouter · 阅读约 3 分钟

当某个请求的表现不符合预期时,沟通最快的方式就是它的 id。Hyperouter 接受的每个请求都有一个 id,它会随响应返回,也是查询该请求记录的键。

id 在哪里

id 是一个 UUID,文档中称为请求 id。它位于响应体中,各接口的字段名不同:

请求id 的位置
POST /v1/chat/completions聊天补全的 id。
POST /v1/images/generations, POST /v1/images/edits图像响应的 id。使用 Prefer: respond-async 时,为 202 中的 id。
POST /v1/videos 及其他视频调用Video 对象的 id。
关于已继续运行的任务的错误,例如图像的 503 timeouterror.generation_id。
在 Idempotency-Key 下重复的聊天补全409 idempotency_key_replayed 的 error.generation_id:即首次请求的 id。

文档中没有定义包含请求 id 的响应头,因此请从响应体中读取 id。 请在你自己的代码中,把 id 和这次调用记录在一起:

res = client.chat.completions.create(
    model="x-ai/grok-4.7",
    messages=[{"role": "user", "content": "Hello"}],
)
log.info("hyperouter request %s cost=%s", res.id, res.usage.cost)

usage.cost 字段是 Hyperouter 在 usage 对象上新增的,因此带类型的 SDK 可能没有声明它;该值就在 JSON 中。

查询请求

GET /v1/generations/{id} 返回你的某个请求的记录,任何类型均可:

curl https://api.hyperouter.app/v1/generations/0194f2c4-7a1e-7b3c-9d02-5f6a1c0e8b21 \
  -H "Authorization: Bearer $HYPEROUTER_API_KEY"

记录包含 kind(chat、image 或 video)、model、status(queued、submitting、running、done 或 failed)、created_at 和 finished_at、usage 及其 cost、ttft_ms 和 latency_ms,请求失败时还有带 code 和 message 的 error。对于已完成的聊天请求,provider_name 说明由哪家服务商处理。对于图像和视频,outputs 包含签名链接,链接有效期 24 小时,记录在请求后保留 30 天。

当服务商没有返回 token 数、由 Hyperouter 自行统计时,usage_estimated 为 true。

记录中从不包含提示词和补全文本。Hyperouter 不会通过任何 API 或控制台页面返回它们。

不是 UUID、不存在或属于其他账户的 id,会返回 404 not_found。你只能读取自己的请求。

在工单中引用

账单、充值和 API 方面的问题,请在控制台中提交工单,工作人员会在同一个工单中回复。反馈具体某个请求时,请附上响应中的 id。

一份有用的反馈包含三点:id、你的预期,以及实际得到的结果。如果有,请贴上 GET /v1/generations/{id} 返回的状态和 error。有了 id,工作人员就能直接找到这个请求,而不必让你再去描述它。

如果错误响应中没有 id,请改为提供其状态码、code 和请求的时间。

核对支出

同一个 id 也能回答一个请求花了多少钱。usage.cost 是以美元计的费用,为 JSON 数字。如果你在自己的数据库中把 id 与每个任务一起保存,就可以把你的记录与 Hyperouter 的逐条对应。聊天、图像和视频的做法完全一致。

下一步