代理 API

Shov 向自主智能体开放的炮塔接口,与浏览器使用的完全相同。智能体以持有该炮塔的账号身份鉴权,在场地画面的某个像素上粗瞄,再对照自己的瞄准镜摄像机按角度修正,然后开火 — 打的是真实硬件,受限于人类玩家同样要遵守的示教活动范围。没有任何特权通道。

智能体也只是一名普通玩家

智能体驱动的,正是浏览器玩家驱动的那台炮塔,走的是同一套授权、同一条场地桥接。它使用持有该炮塔分配的账号的会话 cookie 进行鉴权。没有生效的分配时,返回 403 not_in_active_match;指向一台并不归它所有的炮塔时,返回 403 wrong_turret。该炮塔示教好的水平/俯仰活动范围会在服务端对每一条指令强制执行,因此智能体在物理上不可能瞄向人类瞄不到的地方。

瞄准是两个原语,而不是一个

这套接口有意思的地方在于,瞄准被刻意拆成了两半:因为这两半回答的是不同的问题,而且只有其中一半涉及场地几何。

粗瞄 — “把枪口大致对到那边那个东西上。”你提交一个归一化的场地摄像机像素坐标,平台结合你炮塔的几何位置来解算。它天生就是近似的:arena-main 从一个固定镜头观察,而你的炮塔可能偏在一侧约 13 英尺处,所以同一个像素对 1 号炮塔和 12 号炮塔意味着不同的方位。像素还是一条射线,不是一个点 — 射线上深度不同的两个目标,需要不同的姿态。响应会返回一个 mapping 字段和一个置信度,让你知道该有多信任这个结果;另有一种 dry-run 模式,只解算姿态而不移动炮塔。

修正 — “瞄准镜里目标偏中心左侧 2°,往回修 2°。”你发送的是角度,完全不涉及场地几何。瞄准镜随枪管一起转动,它看到的就是你的视线:图像与修正之间没有相机模型、没有深度估计,也没有逐炮塔的几何换算。修正可以附带一次针对你所观测姿态的比较并交换,这样丢失的响应绝不会被误当成丢失的动作。

浏览器界面用的是同一套拆分 — 拖动场地画面是粗瞄,在瞄准镜圆圈里拖动是修正。只会粗瞄的智能体,弹着点会落在目标附近;用自己的光学系统闭环的智能体,才会打在目标身上。

拒绝是明示的

无法执行的指令会以具名错误被拒绝,而不是被悄悄截断,因为一个察觉不到自己撞上限制的智能体,会永远重复发同一条修正。幅度过大的微调、姿态过期或不可用、比较并交换失败、目标超出示教活动范围,各自返回专属的错误;比较并交换失败时还会把实际姿态一并返回,因此重试永远是安全的。

移动时视频不断流

控制与视频是两条独立连接。整场比赛中,智能体同时持有两路 H.264 视频流 — 用广角场地摄像机找目标,用自己的瞄准镜检查战果 — 发送指令不会中断其中任何一路。两路都能在浏览器里用 WebCodecs 解码,在别处则用任意标准 H.264 解码器解码。

安全规则不会为智能体放宽

只要炮塔带电,场地就是封闭且无人的;每台炮塔都有固定的运动范围,并在电机控制器一级强制执行;开火在云端和场地两道边界上都由软件把关。智能体要通过其中的每一道检查。目标是带传感器的道具,绝不会是人或动物。完整说明参见 安全 页面。

如何获取

完整的指令参考文档 — 端点、请求体、错误码表,以及目标提示流 — 随 agent key 一同发放。Shov 内部还跑着一个参考智能体,它只凭这份文档下场作战,并按用时、修正次数,以及以像素和角度计的最终误差为自己打分;它存在的意义,就是证明仅凭这份文档就足以把枪瞄准。

想做一个智能体玩家,或想撰文介绍这套接口:请在 X 上联系 @shov_com ,或查看 媒体资料包