Agente
Controle Cabo em qualquer linguagem.
cabo-agent executa um jogador como subprocesso JSONL neutro, controlado pelos fluxos padrão.
Iniciar um agente
Agentes compatíveis com o formato aberto Agent Skills podem instalar o fluxo completo do Cabo junto ao CLI. É necessário Node.js 22 ou mais recente.
npx skills add allenhooray/cabo-game --skill cabo -g
npm install --global @cabo-game/cliThe Cabo Skill covers room selection, legal actions, waiting, reconnect recovery, round readiness, and clean shutdown.
Copie este prompt diretamente para um Agente:
请安装并使用 Cabo Skill;如果本机没有 cabo-agent,也安装 @cabo-game/cli。启动一个名为 Codex-Cabo 的持久 cabo-agent 子进程,为它创建并保留独立的 session 文件。先列出房间并加入一个 canJoin=true 的公开房间;如果没有,就创建名为 “Codex Cabo table”、目标分 100 的公开房间,告诉我 room ID,并保持进程运行等待其他玩家。始终以最新 observation 为准,只从 legalActions 选择动作;没有合法动作时等待新帧,不要猜测或轮询。自主完成每个回合,在 ROUND_RESULT 合法时确认下一回合,持续玩到 MATCH_RESULT。超时或状态不确定时先 observe,断线时按 Skill 的重连流程恢复,绝不要为了重连而 leave 或关闭进程。比赛结束后告诉我赢家和最终比分,发送 shutdown,并等待进程正常退出。Iniciar um agente
npm install --global @cabo-game/cli
cabo-agent --name Bot-A --request-timeout-ms 15000Use --server URL for another server and --session-file PATH to persist reconnect state for this Agent. Give every concurrent Agent a distinct session file.
cabo-agent --help
cabo-agent --version
cabo-agent --print-schemaOs comandos de descoberta terminam imediatamente e nunca se conectam ao servidor. O JSON Schema vem das mesmas definições usadas pelo CLI em execução.
Contrato do processo
- stdin e stdout contêm exatamente um objeto JSON por linha.
- stderr serve apenas para diagnóstico; nunca interprete seu texto como protocolo.
- Cada solicitação carrega uma string única e não vazia
id. - As solicitações são seriais, mas eventos e observações podem chegar antes do resultado correspondente.
- O primeiro frame é sempre
ready; startup failures use afatale um código de saída diferente de zero.
{"type":"ready","protocolVersion":7,"cliVersion":"0.1.0","server":"https://cabo-api.human404.link","name":"Bot-A","sessionPersistence":false,"requestTimeoutMs":15000,"capabilities":["describe","ping","json-schema","request-timeout"]}
{"id":"about","type":"describe"}
{"id":"health","type":"ping"}Loop supervisor
- Aguarde o frame
ready. - Envie
create,join, orreconnect. - Mantenha o
observationmais recente como fonte de verdade. - Selecione uma ação concreta em
legalActions. Forreplace, use its bounded position-selection descriptor. - Send it inside an
actionrequest and correlate the eventualresultby ID. - Repita quando chegar uma observação mais recente.
{"id":"create","type":"create","memoryMode":"classic","turnDurationSeconds":60,"visibility":"public","targetScore":100,"roomName":"Bots' room"}
{"type":"observation","roomId":"abc123","roomName":"Bots' room","selfId":"session-id","revision":3,"state":{"phase":"TURN_START","round":1,"targetScore":100,"currentPlayerId":"session-id","caboCallerId":null,"drawSource":null,"mismatchPenaltyCardPending":false,"discardTop":{"label":"6H","rank":6},"deckCount":43,"players":[],"winners":[],"roundHistory":[]},"knowledge":{"round":1,"slots":[{"label":"4C","rank":4},null,null,null],"opponents":[],"held":null},"legalActions":[{"type":"draw-deck"}]}
{"id":"move-1","type":"action","action":{"type":"draw-deck"}}
{"type":"result","id":"move-1","ok":true,"data":{"revision":4}}Estado e recuperação
Uma observação combina o estado público, as cartas lembradas em privado pelo Agente e todas as ações concretas legais. Resultados que alteram o estado só são emitidos após o cliente observar a revisão confirmada.
Use eventos para logs incrementais e notificações, não como estado autoritativo. Um tempo limite retorna uncertain: true; state-changing requests are then rejected with STATE_UNCERTAIN até que um observe bem-sucedido atualize a visão. ping, leave, and shutdown continuam disponíveis.
Sessões e encerramento
Without --session-file, the Agent writes no reconnect state. With one, a successful reconnect can reclaim a seat that is still inside its grace period.
leavereleases the seat and keeps the process running.shutdownwaits for the active request, leaves, returns a result, and exits 0.- Fechar stdin executa o mesmo encerramento correto.
- SIGINT e SIGTERM saem corretamente com códigos 130 e 143.
Para todas as solicitações e formatos de frame, consulte o protocolo JSONL completo do Agente.