{"openapi":"3.1.0","info":{"title":"simulate.experiment.sh","summary":"Chess, Go, poker and Connect Four as HTTP environments for training AI agents.","description":"Create matches, read observations and legal actions, and submit actions for many matches in one request with `POST /v1/batch`. The full guide lives at [/](/) and as Markdown at [/llms.txt](/llms.txt).","version":"1.0.0"},"paths":{"/v1/games":{"get":{"tags":["Games"],"summary":"List available games","operationId":"list_games_v1_games_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/games/{game}":{"get":{"tags":["Games"],"summary":"Describe one game and its options","operationId":"describe_game_v1_games__game__get","parameters":[{"name":"game","in":"path","required":true,"schema":{"type":"string","title":"Game"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches":{"post":{"tags":["Matches"],"summary":"Create a match","operationId":"create_match_v1_matches_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMatch"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}":{"get":{"tags":["Matches"],"summary":"Read a match","operationId":"get_match_v1_matches__match_id__get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}},{"name":"view","in":"query","required":false,"schema":{"type":"string","description":"Poker: 'current', 'all' or a seat number.","default":"current","title":"View"},"description":"Poker: 'current', 'all' or a seat number."},{"name":"history","in":"query","required":false,"schema":{"type":"boolean","description":"Include the full move history.","default":false,"title":"History"},"description":"Include the full move history."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Matches"],"summary":"Delete a match","operationId":"delete_v1_matches__match_id__delete","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}/actions":{"post":{"tags":["Matches"],"summary":"Submit actions","operationId":"act_v1_matches__match_id__actions_post","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}/rollout":{"post":{"tags":["Matches"],"summary":"Play random legal moves","operationId":"rollout_v1_matches__match_id__rollout_post","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RolloutRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}/fork":{"post":{"tags":["Matches"],"summary":"Copy a match into a new independent match","operationId":"fork_v1_matches__match_id__fork_post","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ForkRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batch":{"post":{"tags":["Batch"],"summary":"Run many operations in one request","operationId":"batch_v1_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sessions":{"post":{"tags":["Evaluation sessions"],"summary":"Schedule an evaluation session","operationId":"create_session_v1_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSession"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sessions/{session_id}":{"get":{"tags":["Evaluation sessions"],"summary":"Read a session and its report","operationId":"get_session_v1_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"report","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Report"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Evaluation sessions"],"summary":"Delete a session, its results and its unfinished matches","operationId":"delete_session_v1_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sessions/{session_id}/next":{"post":{"tags":["Evaluation sessions"],"summary":"Start the next scheduled matches","operationId":"next_matches_v1_sessions__session_id__next_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/NextRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sessions/{session_id}/results":{"get":{"tags":["Evaluation sessions"],"summary":"Per-match results, in schedule order","operationId":"session_results_v1_sessions__session_id__results_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/bots":{"get":{"tags":["Games"],"summary":"List built-in bots per game","operationId":"list_bots_v1_bots_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ActRequest":{"properties":{"action":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Action","examples":["e2e4"]},"actions":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},{"type":"null"}],"title":"Actions"},"player":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player"},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"expect_ply":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expect Ply"},"view":{"anyOf":[{"type":"integer"},{"type":"string","enum":["current","all"]},{"type":"null"}],"title":"View"}},"additionalProperties":false,"type":"object","title":"ActRequest"},"Batch":{"properties":{"operations":{"items":{"$ref":"#/components/schemas/Operation"},"type":"array","title":"Operations","description":"Up to 1000 operations, run in order."},"atomic":{"type":"boolean","title":"Atomic","description":"Stop at the first failure and save nothing.","default":false},"observation":{"type":"boolean","title":"Observation","description":"Include observations in returned states.","default":true},"legal_actions":{"type":"boolean","title":"Legal Actions","description":"Include legal action lists in returned states.","default":true}},"additionalProperties":false,"type":"object","required":["operations"],"title":"Batch"},"CreateMatch":{"properties":{"game":{"type":"string","title":"Game","examples":["chess"]},"config":{"additionalProperties":true,"type":"object","title":"Config"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"agents":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Agents","examples":[["me","bot:greedy"]]},"view":{"anyOf":[{"type":"integer"},{"type":"string","enum":["current","all"]},{"type":"null"}],"title":"View"}},"additionalProperties":false,"type":"object","required":["game"],"title":"CreateMatch"},"CreateSession":{"properties":{"game":{"type":"string","title":"Game"},"agents":{"items":{"type":"string"},"type":"array","title":"Agents"},"matches":{"type":"integer","title":"Matches"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"duplicate":{"type":"boolean","title":"Duplicate","default":true},"opening_plies":{"type":"integer","title":"Opening Plies","default":0},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},"additionalProperties":false,"type":"object","required":["game","agents","matches"],"title":"CreateSession","examples":[{"agents":["mine","bot:tight"],"game":"poker","matches":2000,"seed":1},{"agents":["v2","v1"],"game":"chess","matches":200,"opening_plies":4}]},"ForkRequest":{"properties":{"reshuffle_seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reshuffle Seed"},"view":{"anyOf":[{"type":"integer"},{"type":"string","enum":["current","all"]},{"type":"null"}],"title":"View"}},"additionalProperties":false,"type":"object","title":"ForkRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"NextRequest":{"properties":{"count":{"type":"integer","title":"Count","default":1},"view":{"anyOf":[{"type":"integer"},{"type":"string","enum":["current","all"]},{"type":"null"}],"title":"View"}},"additionalProperties":false,"type":"object","title":"NextRequest"},"Operation":{"properties":{"op":{"type":"string","enum":["create","get","act","rollout","fork","delete","create_session","next","session","delete_session"],"title":"Op"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Match id, or '@label' for a match created or forked earlier in the same batch."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"create/fork/create_session: name the new match or session so later operations can use '@label'."},"game":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Game","description":"create/create_session: chess, go, poker or connect4."},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config","description":"create/create_session: game options."},"agents":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Agents","description":"create/create_session: one agent name per seat. 'bot:<name>' seats are played by the server."},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent","description":"act: fail unless this agent is the one to act."},"session":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session","description":"next/session/delete_session: session id or '@label'."},"matches":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matches","description":"create_session: matches to schedule."},"duplicate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Duplicate","description":"create_session: replay each deal or opening once per seat rotation (default true)."},"opening_plies":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Opening Plies","description":"create_session (board games): random opening moves before agents take over (default 0)."},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count","description":"next: matches to start (default 1)."},"report":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Report","description":"session: include the report (default true)."},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed","description":"create: deterministic seed (poker deals). rollout: seed for the random policy."},"action":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"title":"Action","description":"act: one action."},"actions":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},{"type":"null"}],"title":"Actions","description":"act: several actions applied in order, all or nothing."},"player":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player","description":"act: fail unless this seat is the one to act."},"expect_ply":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expect Ply","description":"act: fail unless the match is at this ply."},"steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steps","description":"rollout: stop after this many moves (default: play to the end)."},"reshuffle_seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reshuffle Seed","description":"fork (poker): reshuffle the undealt deck with this seed."},"view":{"anyOf":[{"type":"integer"},{"type":"string","enum":["current","all"]},{"type":"null"}],"title":"View","description":"Poker hole cards to show: 'current' (default), 'all', or a seat number."},"history":{"type":"boolean","title":"History","description":"get: include the full move history.","default":false}},"additionalProperties":false,"type":"object","required":["op"],"title":"Operation","description":"One step of a batch. Which fields apply depends on `op`.","examples":[{"game":"chess","label":"a","op":"create"},{"action":"e2e4","id":"@a","op":"act"},{"actions":["D4","E5"],"id":"m_9fJ2kQ0aXr1sT4uV","op":"act"}]},"RolloutRequest":{"properties":{"steps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steps"},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"},"view":{"anyOf":[{"type":"integer"},{"type":"string","enum":["current","all"]},{"type":"null"}],"title":"View"}},"additionalProperties":false,"type":"object","title":"RolloutRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}