| { | |
| "openapi": "3.0.3", | |
| "info": { | |
| "title": "Playwright Runner API", | |
| "version": "0.1.0" | |
| }, | |
| "paths": { | |
| "/tasks": { | |
| "post": { | |
| "summary": "Create tasks (batch)", | |
| "requestBody": { | |
| "required": true, | |
| "content": { | |
| "application/json": { | |
| "schema": { | |
| "type": "object", | |
| "required": ["run_id", "tasks"], | |
| "properties": { | |
| "run_id": { "type": "string" }, | |
| "tasks": { | |
| "type": "array", | |
| "items": { "$ref": "#/components/schemas/TaskCreate" } | |
| } | |
| }, | |
| "additionalProperties": false | |
| } | |
| } | |
| } | |
| }, | |
| "responses": { | |
| "200": { | |
| "description": "Accepted/rejected tasks", | |
| "content": { | |
| "application/json": { | |
| "schema": { | |
| "type": "object", | |
| "required": ["accepted", "rejected"], | |
| "properties": { | |
| "accepted": { | |
| "type": "array", | |
| "items": { | |
| "type": "object", | |
| "required": ["task_id"], | |
| "properties": { "task_id": { "type": "string" } }, | |
| "additionalProperties": false | |
| } | |
| }, | |
| "rejected": { | |
| "type": "array", | |
| "items": { | |
| "type": "object", | |
| "required": ["task_id", "reason"], | |
| "properties": { | |
| "task_id": { "type": "string" }, | |
| "reason": { "type": "string" } | |
| }, | |
| "additionalProperties": false | |
| } | |
| } | |
| }, | |
| "additionalProperties": false | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| "/tasks/{task_id}": { | |
| "get": { | |
| "summary": "Get task status/result", | |
| "parameters": [ | |
| { | |
| "name": "task_id", | |
| "in": "path", | |
| "required": true, | |
| "schema": { "type": "string" } | |
| } | |
| ], | |
| "responses": { | |
| "200": { | |
| "description": "Task status/result", | |
| "content": { | |
| "application/json": { | |
| "schema": { "$ref": "#/components/schemas/RunnerTaskResult" } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| "/tasks/{task_id}/resume": { | |
| "post": { | |
| "summary": "Resume a paused task after human intervention", | |
| "parameters": [ | |
| { | |
| "name": "task_id", | |
| "in": "path", | |
| "required": true, | |
| "schema": { "type": "string" } | |
| } | |
| ], | |
| "requestBody": { | |
| "required": true, | |
| "content": { | |
| "application/json": { | |
| "schema": { | |
| "type": "object", | |
| "required": ["resume_token"], | |
| "properties": { "resume_token": { "type": "string" } }, | |
| "additionalProperties": false | |
| } | |
| } | |
| } | |
| }, | |
| "responses": { | |
| "200": { | |
| "description": "Resume accepted", | |
| "content": { | |
| "application/json": { | |
| "schema": { | |
| "type": "object", | |
| "required": ["ok"], | |
| "properties": { "ok": { "type": "boolean" } }, | |
| "additionalProperties": false | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| "/callbacks/task-finished": { | |
| "post": { | |
| "summary": "Optional callback for task completion", | |
| "requestBody": { | |
| "required": true, | |
| "content": { | |
| "application/json": { | |
| "schema": { "$ref": "#/components/schemas/RunnerTaskResult" } | |
| } | |
| } | |
| }, | |
| "responses": { | |
| "200": { "description": "OK" } | |
| } | |
| } | |
| } | |
| }, | |
| "components": { | |
| "schemas": { | |
| "TaskCreate": { | |
| "type": "object", | |
| "required": ["task_id", "site", "question_id", "question_text", "profile_id"], | |
| "properties": { | |
| "task_id": { "type": "string" }, | |
| "site": { "type": "string" }, | |
| "question_id": { "type": "string" }, | |
| "question_text": { "type": "string" }, | |
| "profile_id": { "type": "string" }, | |
| "locale": { "type": "string" } | |
| }, | |
| "additionalProperties": false | |
| }, | |
| "RunnerTaskResult": { | |
| "type": "object", | |
| "required": ["task_id", "status"], | |
| "properties": { | |
| "task_id": { "type": "string" }, | |
| "status": { | |
| "type": "string", | |
| "enum": ["success", "failed", "needs_human", "running"] | |
| }, | |
| "reason": { "type": "string" }, | |
| "handoff_url": { "type": "string" }, | |
| "result": { | |
| "type": "object", | |
| "required": ["answer_text", "citations", "screenshots"], | |
| "properties": { | |
| "answer_text": { "type": "string" }, | |
| "citations": { | |
| "type": "array", | |
| "items": { | |
| "type": "object", | |
| "required": ["url"], | |
| "properties": { | |
| "url": { "type": "string" }, | |
| "title": { "type": "string" } | |
| }, | |
| "additionalProperties": false | |
| } | |
| }, | |
| "screenshots": { | |
| "type": "array", | |
| "items": { | |
| "type": "object", | |
| "required": ["url", "ts"], | |
| "properties": { | |
| "url": { "type": "string" }, | |
| "ts": { "type": "string" } | |
| }, | |
| "additionalProperties": false | |
| } | |
| }, | |
| "raw_html_url": { "type": "string" }, | |
| "log_url": { "type": "string" } | |
| }, | |
| "additionalProperties": false | |
| } | |
| }, | |
| "additionalProperties": false | |
| } | |
| } | |
| } | |
| } | |