From 00fa0ad1c253d6a742be161a9f954d81ecaf36d6 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 19 Apr 2026 11:35:38 +0000 Subject: [PATCH 1/4] Add V1 REST API Reference docs for OpenHands Cloud - Create V1_openapi.json with 41 V1 API endpoints extracted from the live OpenHands Cloud API (https://app.all-hands.dev/openapi.json) - Add V1 REST API Reference section to Cloud tab in docs.json - Update openhands/usage/api/v1.mdx with comprehensive overview including authentication, key resources table, and quick start example The V1 API reference includes: - Conversations: Start, search, get, update, delete conversations - Sandboxes: Search, pause, resume sandbox execution environments - Configuration: List available models and settings - Users: Get current user info - Secrets: Manage custom secrets - Git: Search installations, repositories, branches - Skills: Search available skills - Webhooks: Event webhook endpoints Co-authored-by: openhands --- docs.json | 6 +- openapi/V1_openapi.json | 25401 +++++++++++++++++++++++++++++++++++ openhands/usage/api/v1.mdx | 198 +- 3 files changed, 25581 insertions(+), 24 deletions(-) create mode 100644 openapi/V1_openapi.json diff --git a/docs.json b/docs.json index 62905d8df..5bd627b7a 100644 --- a/docs.json +++ b/docs.json @@ -405,7 +405,11 @@ "pages": [ "openhands/usage/cloud/cloud-api", "openhands/usage/cloud/plugin-launcher", - "openhands/usage/api/v1" + "openhands/usage/api/v1", + { + "group": "V1 REST API Reference", + "openapi": "openapi/V1_openapi.json" + } ] } ] diff --git a/openapi/V1_openapi.json b/openapi/V1_openapi.json new file mode 100644 index 000000000..26d42dbc5 --- /dev/null +++ b/openapi/V1_openapi.json @@ -0,0 +1,25401 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "OpenHands Cloud API (V1)", + "description": "OpenHands Cloud V1 REST API for programmatic access to conversations, sandboxes, and more.\n\n## Authentication\n\nAll API requests require authentication via an API key. Include your API key in the `Authorization` header:\n\n```\nAuthorization: Bearer YOUR_API_KEY\n```\n\nOr use the `X-Access-Token` header:\n\n```\nX-Access-Token: YOUR_API_KEY\n```\n\nTo obtain an API key, log in to [OpenHands Cloud](https://app.all-hands.dev) and navigate to Settings > API Keys.\n\n## Rate Limits\n\nIf you have too many conversations running at once, older conversations will be paused. Contact support for higher limits.\n\n## Base URL\n\nProduction: `https://app.all-hands.dev`\n", + "version": "1.0.0" + }, + "servers": [ + { + "url": "https://app.all-hands.dev", + "description": "OpenHands Cloud Production" + } + ], + "paths": { + "/api/v1/conversation/{conversation_id}/events/search": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Search Conversation Events", + "description": "Search and list events (messages, actions, observations) from a conversation.", + "operationId": "search_events_api_v1_conversation__conversation_id__events_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Conversation Id" + } + }, + { + "name": "kind__eq", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "enum": [ + "ServerErrorEvent", + "ACPToolCallEvent", + "Condensation", + "CondensationRequest", + "CondensationSummaryEvent", + "ConversationErrorEvent", + "ConversationStateUpdateEvent", + "HookExecutionEvent", + "LLMCompletionLogEvent", + "ActionEvent", + "MessageEvent", + "AgentErrorEvent", + "ObservationEvent", + "UserRejectObservation", + "SystemPromptEvent", + "TokenEvent", + "PauseEvent" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional filter by event kind" + } + }, + { + "name": "timestamp__gte", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Optional filter by timestamp greater than or equal to" + } + }, + { + "name": "timestamp__lt", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Optional filter by timestamp less than" + } + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/EventSortOrder", + "title": "Sort order for results", + "default": "TIMESTAMP" + } + }, + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EventPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/conversation/{conversation_id}/events/count": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Count Events", + "description": "Count events matching the given filters.", + "operationId": "count_events_api_v1_conversation__conversation_id__events_count_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Conversation Id" + } + }, + { + "name": "kind__eq", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "enum": [ + "ServerErrorEvent", + "ACPToolCallEvent", + "Condensation", + "CondensationRequest", + "CondensationSummaryEvent", + "ConversationErrorEvent", + "ConversationStateUpdateEvent", + "HookExecutionEvent", + "LLMCompletionLogEvent", + "ActionEvent", + "MessageEvent", + "AgentErrorEvent", + "ObservationEvent", + "UserRejectObservation", + "SystemPromptEvent", + "TokenEvent", + "PauseEvent" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional filter by event kind" + } + }, + { + "name": "timestamp__gte", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Optional filter by timestamp greater than or equal to" + } + }, + { + "name": "timestamp__lt", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Optional filter by timestamp less than" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "integer", + "title": "Response Count Events Api V1 Conversation Conversation Id Events Count Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/conversation/{conversation_id}/events": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Batch Get Events", + "description": "Get a batch of events given their ids, returning null for any missing event.", + "operationId": "batch_get_events_api_v1_conversation__conversation_id__events_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Conversation Id" + } + }, + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/Event-Output" + }, + { + "type": "null" + } + ] + }, + "title": "Response Batch Get Events Api V1 Conversation Conversation Id Events Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations/search": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Search Conversations", + "description": "Search and list conversations with optional filters. Returns paginated results.", + "operationId": "search_app_conversations_api_v1_app_conversations_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "title__contains", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filter by title containing this string" + } + }, + { + "name": "created_at__gte", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by created_at greater than or equal to this datetime" + } + }, + { + "name": "created_at__lt", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by created_at less than this datetime" + } + }, + { + "name": "updated_at__gte", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by updated_at greater than or equal to this datetime" + } + }, + { + "name": "updated_at__lt", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by updated_at less than this datetime" + } + }, + { + "name": "sandbox_id__eq", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filter by exact sandbox_id" + } + }, + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 100 + } + }, + { + "name": "include_sub_conversations", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "title": "If True, include sub-conversations in the results. If False (default), exclude all sub-conversations.", + "default": false + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppConversationPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations/count": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Count Conversations", + "description": "Get the total count of conversations matching the specified filters.", + "operationId": "count_app_conversations_api_v1_app_conversations_count_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "title__contains", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filter by title containing this string" + } + }, + { + "name": "created_at__gte", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by created_at greater than or equal to this datetime" + } + }, + { + "name": "created_at__lt", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by created_at less than this datetime" + } + }, + { + "name": "updated_at__gte", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by updated_at greater than or equal to this datetime" + } + }, + { + "name": "updated_at__lt", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by updated_at less than this datetime" + } + }, + { + "name": "sandbox_id__eq", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filter by exact sandbox_id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "integer", + "title": "Response Count App Conversations Api V1 App Conversations Count Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Get Conversations by IDs", + "description": "Retrieve one or more conversations by their IDs. Pass multiple IDs as a comma-separated list.", + "operationId": "batch_get_app_conversations_api_v1_app_conversations_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "ids", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Ids" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/AppConversation" + }, + { + "type": "null" + } + ] + }, + "title": "Response Batch Get App Conversations Api V1 App Conversations Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "Conversations" + ], + "summary": "Start a Conversation", + "operationId": "start_app_conversation_api_v1_app_conversations_post", + "security": [ + { + "APIKeyHeader": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppConversationStartRequest-Input" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppConversationStartTask" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "description": "Create and start a new OpenHands conversation. Returns a start task that can be polled for completion status." + } + }, + "/api/v1/app-conversations/{conversation_id}": { + "patch": { + "tags": [ + "Conversations" + ], + "summary": "Update Conversation", + "operationId": "update_app_conversation_api_v1_app_conversations__conversation_id__patch", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Conversation Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppConversationUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppConversation" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "description": "Update conversation metadata such as title or other properties." + } + }, + "/api/v1/app-conversations/stream-start": { + "post": { + "tags": [ + "Conversations" + ], + "summary": "Start Conversation with Streaming", + "description": "Start a new conversation and receive real-time status updates as a streaming response.", + "operationId": "stream_app_conversation_start_api_v1_app_conversations_stream_start_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppConversationStartRequest-Input" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/AppConversationStartTask" + }, + "type": "array", + "title": "Response Stream App Conversation Start Api V1 App Conversations Stream Start Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + } + }, + "/api/v1/app-conversations/start-tasks/search": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Search Start Tasks", + "description": "Search and list conversation start tasks with optional filters.", + "operationId": "search_app_conversation_start_tasks_api_v1_app_conversations_start_tasks_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id__eq", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Filter by conversation ID equal to this value" + } + }, + { + "name": "created_at__gte", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by created_at greater than or equal to this datetime" + } + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/AppConversationStartTaskSortOrder", + "title": "Sort order for the results", + "default": "CREATED_AT_DESC" + } + }, + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AppConversationStartTaskPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations/start-tasks/count": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Count App Conversation Start Tasks", + "description": "Count conversation start tasks matching the given filters.", + "operationId": "count_app_conversation_start_tasks_api_v1_app_conversations_start_tasks_count_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id__eq", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Filter by conversation ID equal to this value" + } + }, + { + "name": "created_at__gte", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Filter by created_at greater than or equal to this datetime" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "integer", + "title": "Response Count App Conversation Start Tasks Api V1 App Conversations Start Tasks Count Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations/start-tasks": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Get Start Tasks by IDs", + "description": "Retrieve the status of conversation start tasks. Use this to poll for conversation readiness.", + "operationId": "batch_get_app_conversation_start_tasks_api_v1_app_conversations_start_tasks_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "ids", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + }, + "title": "Ids" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/AppConversationStartTask" + }, + { + "type": "null" + } + ] + }, + "title": "Response Batch Get App Conversation Start Tasks Api V1 App Conversations Start Tasks Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations/{conversation_id}/file": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Get File from Conversation", + "description": "Retrieve a file from the conversation's workspace.", + "operationId": "read_conversation_file_api_v1_app_conversations__conversation_id__file_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Conversation Id" + } + }, + { + "name": "file_path", + "in": "query", + "required": false, + "schema": { + "type": "string", + "title": "Path to the file to read within the sandbox workspace", + "default": "/workspace/project/PLAN.md" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Read Conversation File Api V1 App Conversations Conversation Id File Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations/{conversation_id}/skills": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Get Conversation Skills", + "description": "Retrieve the skills loaded for a specific conversation.", + "operationId": "get_conversation_skills_api_v1_app_conversations__conversation_id__skills_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Conversation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations/{conversation_id}/hooks": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Get Conversation Hooks", + "description": "Get hooks currently configured in the workspace for this conversation.\n\nThis endpoint loads hooks from the conversation's project directory in the\nworkspace (i.e. `{project_dir}/.openhands/hooks.json`) at request time.\n\nNote:\n This is intentionally a \"live\" view of the workspace configuration.\n If `.openhands/hooks.json` changes over time, this endpoint reflects the\n latest file content and may not match the hooks that were used when the\n conversation originally started.\n\nReturns:\n JSONResponse: A JSON response containing the list of hook event types.\n Returns an empty list if the sandbox is not running.", + "operationId": "get_conversation_hooks_api_v1_app_conversations__conversation_id__hooks_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Conversation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/app-conversations/{conversation_id}/download": { + "get": { + "tags": [ + "Conversations" + ], + "summary": "Download Conversation Workspace", + "description": "Download the entire workspace as a zip archive.", + "operationId": "export_conversation_api_v1_app_conversations__conversation_id__download_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Conversation Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/conversations/{conversation_id}/pending-messages": { + "post": { + "tags": [ + "Conversations" + ], + "summary": "Queue Pending Message", + "description": "Queue a message for delivery when conversation becomes ready.\n\nThis endpoint allows users to submit messages even when the conversation's\nWebSocket connection is not yet established. Messages are stored server-side\nand delivered automatically when the conversation transitions to READY status.\n\nArgs:\n conversation_id: The conversation ID (can be task ID before conversation is ready)\n request: The FastAPI request containing message content\n\nReturns:\n PendingMessageResponse with the message ID and queue position\n\nRaises:\n HTTPException 400: If the request body is invalid\n HTTPException 429: If too many pending messages are queued (limit: 10)", + "operationId": "queue_pending_message_api_v1_conversations__conversation_id__pending_messages_post", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Conversation Id" + } + } + ], + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PendingMessageResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/sandboxes/search": { + "get": { + "tags": [ + "Sandboxes" + ], + "summary": "Search Sandboxes", + "description": "Search and list sandboxes (execution environments) with optional filters.", + "operationId": "search_sandboxes_api_v1_sandboxes_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboxPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/sandboxes": { + "get": { + "tags": [ + "Sandboxes" + ], + "summary": "Get Sandboxes by IDs", + "description": "Retrieve one or more sandboxes by their IDs.", + "operationId": "batch_get_sandboxes_api_v1_sandboxes_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/SandboxInfo" + }, + { + "type": "null" + } + ] + }, + "title": "Response Batch Get Sandboxes Api V1 Sandboxes Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "Sandboxes" + ], + "summary": "Create Sandbox", + "operationId": "start_sandbox_api_v1_sandboxes_post", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "sandbox_spec_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Spec Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboxInfo" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "description": "Create a new sandbox execution environment." + } + }, + "/api/v1/sandboxes/{sandbox_id}/pause": { + "post": { + "tags": [ + "Sandboxes" + ], + "summary": "Pause Sandbox", + "operationId": "pause_sandbox_api_v1_sandboxes__sandbox_id__pause_post", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "sandbox_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Sandbox Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Success" + } + } + } + }, + "404": { + "description": "Item not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "description": "Pause a running sandbox to save resources. The sandbox can be resumed later." + } + }, + "/api/v1/sandboxes/{sandbox_id}/resume": { + "post": { + "tags": [ + "Sandboxes" + ], + "summary": "Resume Sandbox", + "operationId": "resume_sandbox_api_v1_sandboxes__sandbox_id__resume_post", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "sandbox_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Sandbox Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Success" + } + } + } + }, + "404": { + "description": "Item not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "description": "Resume a paused sandbox to continue execution." + } + }, + "/api/v1/sandboxes/{id}": { + "delete": { + "tags": [ + "Sandboxes" + ], + "summary": "Delete Sandbox", + "operationId": "delete_sandbox_api_v1_sandboxes__id__delete", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "sandbox_id", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Sandbox Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Success" + } + } + } + }, + "404": { + "description": "Item not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/sandboxes/{sandbox_id}/settings/secrets": { + "get": { + "tags": [ + "Sandboxes" + ], + "summary": "List Secret Names", + "description": "List available secret names (no raw values).\n\nIncludes both custom secrets and provider tokens (e.g. github_token).", + "operationId": "list_secret_names_api_v1_sandboxes__sandbox_id__settings_secrets_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "sandbox_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Sandbox Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SecretNamesResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/sandboxes/{sandbox_id}/settings/secrets/{secret_name}": { + "get": { + "tags": [ + "Sandboxes" + ], + "summary": "Get Secret Value", + "description": "Return a single secret value as plain text.\n\nCalled by ``LookupSecret`` inside the sandbox. Checks custom secrets\nfirst, then falls back to provider tokens \u2014 always resolving the\nlatest token at call time.", + "operationId": "get_secret_value_api_v1_sandboxes__sandbox_id__settings_secrets__secret_name__get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "secret_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Secret Name" + } + }, + { + "name": "sandbox_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Sandbox Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/sandbox-specs/search": { + "get": { + "tags": [ + "Sandboxes" + ], + "summary": "Search Sandbox Specs", + "description": "Search available sandbox specifications (templates/presets).", + "operationId": "search_sandbox_specs_api_v1_sandbox_specs_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboxSpecInfoPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/sandbox-specs": { + "get": { + "tags": [ + "Sandboxes" + ], + "summary": "Batch Get Sandbox Specs", + "description": "Get a batch of sandbox specs given their ids, returning null for any missing.", + "operationId": "batch_get_sandbox_specs_api_v1_sandbox_specs_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/SandboxSpecInfo" + }, + { + "type": "null" + } + ] + }, + "title": "Response Batch Get Sandbox Specs Api V1 Sandbox Specs Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/settings": { + "get": { + "tags": [ + "Configuration" + ], + "summary": "Get User Settings", + "description": "Retrieve the current user's settings and preferences.", + "operationId": "load_settings_api_v1_settings_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GETSettingsModel" + } + } + } + }, + "404": { + "description": "Settings not found", + "content": { + "application/json": { + "schema": { + "additionalProperties": true, + "type": "object", + "title": "Response 404 Load Settings Api V1 Settings Get" + } + } + } + }, + "401": { + "description": "Invalid token", + "content": { + "application/json": { + "schema": { + "additionalProperties": true, + "type": "object", + "title": "Response 401 Load Settings Api V1 Settings Get" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + }, + "post": { + "tags": [ + "Configuration" + ], + "summary": "Update User Settings", + "description": "Update the current user's settings and preferences.", + "operationId": "store_settings_api_v1_settings_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Settings" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Settings stored successfully", + "content": { + "application/json": { + "schema": { + "additionalProperties": true, + "type": "object", + "title": "Response 200 Store Settings Api V1 Settings Post" + } + } + } + }, + "500": { + "description": "Error storing settings", + "content": { + "application/json": { + "schema": { + "additionalProperties": true, + "type": "object", + "title": "Response 500 Store Settings Api V1 Settings Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + } + }, + "/api/v1/secrets/git-providers": { + "post": { + "tags": [ + "Secrets" + ], + "summary": "Store Provider Tokens", + "description": "Store git provider tokens.\n\nSaves the git provider tokens (GitHub, GitLab, Bitbucket, etc.) for the authenticated user.\n\nReturns:\n 200: Git providers stored successfully\n 401: Invalid token\n 500: Error storing git providers", + "operationId": "store_provider_tokens_api_v1_secrets_git_providers_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/POSTProviderModel" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EditResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + }, + "delete": { + "tags": [ + "Secrets" + ], + "summary": "Unset Provider Tokens", + "description": "Unset (delete) all git provider tokens.\n\nRemoves all git provider tokens for the authenticated user.\n\nReturns:\n 200: Git provider tokens unset successfully\n 500: Error unsetting git provider tokens", + "operationId": "unset_provider_tokens_api_v1_secrets_git_providers_delete", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EditResponse" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + } + }, + "/api/v1/secrets": { + "get": { + "tags": [ + "Secrets" + ], + "summary": "List Secrets", + "description": "List all custom secrets for the current user. Only secret names are returned, not values.", + "operationId": "load_custom_secrets_names_api_v1_secrets_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GETCustomSecrets" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + }, + "post": { + "tags": [ + "Secrets" + ], + "summary": "Create Secret", + "description": "Create a new custom secret that can be used in conversations.", + "operationId": "create_custom_secret_api_v1_secrets_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomSecretModel" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EditResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + } + }, + "/api/v1/secrets/{secret_id}": { + "put": { + "tags": [ + "Secrets" + ], + "summary": "Update Secret", + "description": "Update an existing secret's value.", + "operationId": "update_custom_secret_api_v1_secrets__secret_id__put", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "secret_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Secret Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomSecretWithoutValueModel" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EditResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Secrets" + ], + "summary": "Delete Secret", + "description": "Permanently delete a custom secret.", + "operationId": "delete_custom_secret_api_v1_secrets__secret_id__delete", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "secret_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Secret Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EditResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/users/git-info": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get Current User Git Info", + "description": "Get the current authenticated user's metadata from the git provider.", + "operationId": "get_current_user_git_info_api_v1_users_git_info_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserGitInfo" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + } + }, + "/api/v1/skills/search": { + "get": { + "tags": [ + "Skills" + ], + "summary": "Search Skills", + "description": "Search for available skills that can be used by agents.", + "operationId": "search_skills_api_v1_skills_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SkillPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/webhooks/conversations": { + "post": { + "tags": [ + "Conversations" + ], + "summary": "On Conversation Update", + "description": "Webhook callback for when a conversation starts, pauses, resumes, or deletes.", + "operationId": "on_conversation_update_api_v1_webhooks_conversations_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConversationInfo-Input" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Success" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + } + }, + "/api/v1/webhooks/events/{conversation_id}": { + "post": { + "tags": [ + "Conversations" + ], + "summary": "On Event", + "description": "Webhook callback for when event stream events occur.", + "operationId": "on_event_api_v1_webhooks_events__conversation_id__post", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "conversation_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Conversation Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Event-Input" + }, + "title": "Events" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Success" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/webhooks/secrets": { + "get": { + "tags": [ + "Secrets" + ], + "summary": "Get Secret", + "description": "Given an access token, retrieve a user secret. The access token\nis limited by user and provider type, and may include a timeout, limiting\nthe damage in the event that a token is ever leaked", + "operationId": "get_secret_api_v1_webhooks_secrets_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ] + } + }, + "/api/v1/web-client/config": { + "get": { + "tags": [ + "Configuration" + ], + "summary": "Get Web Client Configuration", + "description": "Retrieve configuration for the web client including feature flags and provider settings.", + "operationId": "get_web_client_config_api_v1_web_client_config_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebClientConfig" + } + } + } + } + } + } + }, + "/api/v1/git/installations/search": { + "get": { + "tags": [ + "Git" + ], + "summary": "Search Git Installations", + "description": "Search for Git provider installations (GitHub, GitLab, Bitbucket) connected to the user's account.", + "operationId": "search_user_installations_api_v1_git_installations_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "provider", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/ProviderType" + } + }, + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InstallationPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/git/repositories/search": { + "get": { + "tags": [ + "Git" + ], + "summary": "Search Repositories", + "description": "Search for repositories accessible through connected Git providers.", + "operationId": "search_repositories_api_v1_git_repositories_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "provider", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/ProviderType" + } + }, + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Search query for finding repositories. If not provided, returns user repositories." + } + }, + { + "name": "installation_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filter by installation/app ID" + } + }, + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 100 + } + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/SortOrder" + }, + { + "type": "null" + } + ], + "title": "Sort order for search results (e.g., stars-desc, forks-asc)" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RepositoryPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/git/branches/search": { + "get": { + "tags": [ + "Git" + ], + "summary": "Search Branches", + "description": "Search for branches in a specified repository.", + "operationId": "search_branches_api_v1_git_branches_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "provider", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/ProviderType" + } + }, + { + "name": "repository", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Repository name in format owner/repo" + } + }, + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Branch name search query" + } + }, + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 30 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BranchPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/git/suggested-tasks/search": { + "get": { + "tags": [ + "Git" + ], + "summary": "Search Suggested Tasks", + "description": "Get suggested tasks for the user.\n\nReturns a paginated list of suggested tasks including:\n- PRs owned by the user\n- Issues assigned to the user", + "operationId": "search_suggested_tasks_api_v1_git_suggested_tasks_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 30 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuggestedTaskPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/config/models/search": { + "get": { + "tags": [ + "Configuration" + ], + "summary": "Search Available Models", + "description": "Search and list available LLM models configured on the server.", + "operationId": "search_models_api_v1_config_models_search_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "page_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Optional next_page_id from the previously returned page" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "exclusiveMinimum": 0, + "title": "The max number of results in the page", + "default": 50 + } + }, + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filter models by name (case-insensitive substring match)" + } + }, + { + "name": "verified__eq", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Filter by verified status (true/false, omit for all)" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LLMModelPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/api/v1/users/me": { + "get": { + "tags": [ + "Users" + ], + "summary": "Get Current User", + "description": "Retrieve information about the currently authenticated user.", + "operationId": "get_current_user_saas_api_v1_users_me_get", + "security": [ + { + "APIKeyHeader": [] + } + ], + "parameters": [ + { + "name": "expose_secrets", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "If true, return unmasked secret values (e.g. llm_api_key). Requires a valid X-Session-API-Key header for an active sandbox owned by the authenticated user.", + "default": false, + "title": "Expose Secrets" + }, + "description": "If true, return unmasked secret values (e.g. llm_api_key). Requires a valid X-Session-API-Key header for an active sandbox owned by the authenticated user." + }, + { + "name": "x-session-api-key", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Session-Api-Key" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SaasUserInfo" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ACPToolCallEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "agent" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id" + }, + "title": { + "type": "string", + "title": "Title" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + }, + "tool_kind": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Tool Kind" + }, + "raw_input": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Raw Input" + }, + "raw_output": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Raw Output" + }, + "content": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Content" + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "default": false + }, + "kind": { + "type": "string", + "const": "ACPToolCallEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_call_id", + "title" + ], + "title": "ACPToolCallEvent", + "description": "Event representing a tool call executed by an ACP server.\n\nCaptures the tool name, inputs, outputs, and status from ACP\n``ToolCallStart`` / ``ToolCallProgress`` notifications so they can\nbe surfaced in the OpenHands event stream and visualizer.\n\nThis is *not* an ``LLMConvertibleEvent`` \u2014 ACP tool calls do not\nparticipate in LLM message conversion." + }, + "ACPToolCallEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "agent" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id" + }, + "title": { + "type": "string", + "title": "Title" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + }, + "tool_kind": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Tool Kind" + }, + "raw_input": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Raw Input" + }, + "raw_output": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Raw Output" + }, + "content": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Content" + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "default": false + }, + "kind": { + "type": "string", + "const": "ACPToolCallEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_call_id", + "title", + "kind" + ], + "title": "ACPToolCallEvent", + "description": "Event representing a tool call executed by an ACP server.\n\nCaptures the tool name, inputs, outputs, and status from ACP\n``ToolCallStart`` / ``ToolCallProgress`` notifications so they can\nbe surfaced in the OpenHands event stream and visualizer.\n\nThis is *not* an ``LLMConvertibleEvent`` \u2014 ACP tool calls do not\nparticipate in LLM message conversion." + }, + "APIBasedCritic": { + "properties": { + "server_url": { + "type": "string", + "title": "Server Url", + "description": "Base URL of the vLLM classification service", + "default": "https://all-hands-ai--critic-qwen3-4b-serve.modal.run" + }, + "api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "format": "password", + "writeOnly": true + } + ], + "title": "Api Key", + "description": "API key for authenticating with the vLLM service" + }, + "model_name": { + "type": "string", + "title": "Model Name", + "description": "Name of the model to use", + "default": "critic-qwen3-4b" + }, + "tokenizer_name": { + "type": "string", + "title": "Tokenizer Name", + "description": "HuggingFace tokenizer name for loading chat template", + "default": "Qwen/Qwen3-4B-Instruct-2507" + }, + "pass_tools_definitions": { + "type": "boolean", + "title": "Pass Tools Definitions", + "description": "Whether to pass tool definitions to the model", + "default": true + }, + "timeout_seconds": { + "type": "number", + "title": "Timeout Seconds", + "description": "Timeout for requests to the model", + "default": 300.0 + }, + "has_success_label": { + "type": "boolean", + "title": "Has Success Label", + "description": "Whether the model predicts success label at index 0", + "default": true + }, + "sentiment_labels": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Sentiment Labels", + "default": [ + "sentiment_positive", + "sentiment_neutral", + "sentiment_negative" + ] + }, + "agent_issue_labels": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Agent Issue Labels", + "default": [ + "misunderstood_intention", + "did_not_follow_instruction", + "insufficient_analysis", + "insufficient_clarification", + "improper_tool_use_or_setup", + "loop_behavior", + "insufficient_testing", + "insufficient_debugging", + "incomplete_implementation", + "file_management_errors", + "scope_creep", + "risky_actions_or_permission", + "other_agent_issue" + ] + }, + "infra_labels": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Infra Labels", + "default": [ + "infrastructure_external_issue", + "infrastructure_agent_caused_issue" + ] + }, + "user_followup_labels": { + "items": { + "type": "string" + }, + "type": "array", + "title": "User Followup Labels", + "default": [ + "clarification_or_restatement", + "correction", + "direction_change", + "vcs_update_requests", + "progress_or_scope_concern", + "frustration_or_complaint", + "removal_or_reversion_request", + "other_user_issue" + ] + }, + "sentiment_map": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Sentiment Map", + "default": { + "Positive": "sentiment_positive", + "Neutral": "sentiment_neutral", + "Negative": "sentiment_negative" + } + }, + "mode": { + "type": "string", + "enum": [ + "finish_and_message", + "all_actions" + ], + "title": "Mode", + "description": "When to run critic evaluation:\n- 'finish_and_message': Evaluate on FinishAction and agent MessageEvent (default, minimal performance impact)\n- 'all_actions': Evaluate after every agent action (WARNING: significantly slower due to API calls on each action)", + "default": "finish_and_message" + }, + "iterative_refinement": { + "anyOf": [ + { + "$ref": "#/components/schemas/IterativeRefinementConfig" + }, + { + "type": "null" + } + ], + "description": "Optional configuration for iterative refinement. When set, Conversation.run() will automatically retry the task if the critic score is below the success_threshold, up to max_iterations." + }, + "kind": { + "type": "string", + "const": "APIBasedCritic", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "api_key" + ], + "title": "APIBasedCritic" + }, + "AcceptInvitationRequest": { + "properties": { + "token": { + "type": "string", + "title": "Token" + } + }, + "type": "object", + "required": [ + "token" + ], + "title": "AcceptInvitationRequest", + "description": "Request model for accepting an invitation via POST." + }, + "AcceptInvitationResponse": { + "properties": { + "success": { + "type": "boolean", + "title": "Success" + }, + "org_id": { + "type": "string", + "title": "Org Id" + }, + "org_name": { + "type": "string", + "title": "Org Name" + }, + "role": { + "type": "string", + "title": "Role" + } + }, + "type": "object", + "required": [ + "success", + "org_id", + "org_name", + "role" + ], + "title": "AcceptInvitationResponse", + "description": "Response model for successful invitation acceptance." + }, + "Action-Input": { + "oneOf": [ + { + "$ref": "#/components/schemas/MCPToolAction-Input" + }, + { + "$ref": "#/components/schemas/FinishAction-Input" + }, + { + "$ref": "#/components/schemas/ThinkAction-Input" + }, + { + "$ref": "#/components/schemas/ApplyPatchAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserClickAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserCloseTabAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserGetContentAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserGetStateAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserGetStorageAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserGoBackAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserListTabsAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserNavigateAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserScrollAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserSetStorageAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserStartRecordingAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserStopRecordingAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserSwitchTabAction-Input" + }, + { + "$ref": "#/components/schemas/BrowserTypeAction-Input" + }, + { + "$ref": "#/components/schemas/DelegateAction-Input" + }, + { + "$ref": "#/components/schemas/FileEditorAction-Input" + }, + { + "$ref": "#/components/schemas/EditAction-Input" + }, + { + "$ref": "#/components/schemas/ListDirectoryAction-Input" + }, + { + "$ref": "#/components/schemas/ReadFileAction-Input" + }, + { + "$ref": "#/components/schemas/WriteFileAction-Input" + }, + { + "$ref": "#/components/schemas/GlobAction-Input" + }, + { + "$ref": "#/components/schemas/GrepAction-Input" + }, + { + "$ref": "#/components/schemas/PlanningFileEditorAction-Input" + }, + { + "$ref": "#/components/schemas/TaskAction-Input" + }, + { + "$ref": "#/components/schemas/TaskTrackerAction-Input" + }, + { + "$ref": "#/components/schemas/TerminalAction-Input" + }, + { + "$ref": "#/components/schemas/ConsultTomAction-Input" + }, + { + "$ref": "#/components/schemas/SleeptimeComputeAction-Input" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__mcp__definition__MCPToolAction-Input__1": "#/components/schemas/MCPToolAction-Input", + "openhands__sdk__tool__builtins__finish__FinishAction-Input__1": "#/components/schemas/FinishAction-Input", + "openhands__sdk__tool__builtins__think__ThinkAction-Input__1": "#/components/schemas/ThinkAction-Input", + "openhands__tools__apply_patch__definition__ApplyPatchAction-Input__1": "#/components/schemas/ApplyPatchAction-Input", + "openhands__tools__browser_use__definition__BrowserAction-Input__1": "#/components/schemas/BrowserAction-Input", + "openhands__tools__browser_use__definition__BrowserClickAction-Input__1": "#/components/schemas/BrowserClickAction-Input", + "openhands__tools__browser_use__definition__BrowserCloseTabAction-Input__1": "#/components/schemas/BrowserCloseTabAction-Input", + "openhands__tools__browser_use__definition__BrowserGetContentAction-Input__1": "#/components/schemas/BrowserGetContentAction-Input", + "openhands__tools__browser_use__definition__BrowserGetStateAction-Input__1": "#/components/schemas/BrowserGetStateAction-Input", + "openhands__tools__browser_use__definition__BrowserGetStorageAction-Input__1": "#/components/schemas/BrowserGetStorageAction-Input", + "openhands__tools__browser_use__definition__BrowserGoBackAction-Input__1": "#/components/schemas/BrowserGoBackAction-Input", + "openhands__tools__browser_use__definition__BrowserListTabsAction-Input__1": "#/components/schemas/BrowserListTabsAction-Input", + "openhands__tools__browser_use__definition__BrowserNavigateAction-Input__1": "#/components/schemas/BrowserNavigateAction-Input", + "openhands__tools__browser_use__definition__BrowserScrollAction-Input__1": "#/components/schemas/BrowserScrollAction-Input", + "openhands__tools__browser_use__definition__BrowserSetStorageAction-Input__1": "#/components/schemas/BrowserSetStorageAction-Input", + "openhands__tools__browser_use__definition__BrowserStartRecordingAction-Input__1": "#/components/schemas/BrowserStartRecordingAction-Input", + "openhands__tools__browser_use__definition__BrowserStopRecordingAction-Input__1": "#/components/schemas/BrowserStopRecordingAction-Input", + "openhands__tools__browser_use__definition__BrowserSwitchTabAction-Input__1": "#/components/schemas/BrowserSwitchTabAction-Input", + "openhands__tools__browser_use__definition__BrowserTypeAction-Input__1": "#/components/schemas/BrowserTypeAction-Input", + "openhands__tools__delegate__definition__DelegateAction-Input__1": "#/components/schemas/DelegateAction-Input", + "openhands__tools__file_editor__definition__FileEditorAction-Input__1": "#/components/schemas/FileEditorAction-Input", + "openhands__tools__gemini__edit__definition__EditAction-Input__1": "#/components/schemas/EditAction-Input", + "openhands__tools__gemini__list_directory__definition__ListDirectoryAction-Input__1": "#/components/schemas/ListDirectoryAction-Input", + "openhands__tools__gemini__read_file__definition__ReadFileAction-Input__1": "#/components/schemas/ReadFileAction-Input", + "openhands__tools__gemini__write_file__definition__WriteFileAction-Input__1": "#/components/schemas/WriteFileAction-Input", + "openhands__tools__glob__definition__GlobAction-Input__1": "#/components/schemas/GlobAction-Input", + "openhands__tools__grep__definition__GrepAction-Input__1": "#/components/schemas/GrepAction-Input", + "openhands__tools__planning_file_editor__definition__PlanningFileEditorAction-Input__1": "#/components/schemas/PlanningFileEditorAction-Input", + "openhands__tools__task__definition__TaskAction-Input__1": "#/components/schemas/TaskAction-Input", + "openhands__tools__task_tracker__definition__TaskTrackerAction-Input__1": "#/components/schemas/TaskTrackerAction-Input", + "openhands__tools__terminal__definition__TerminalAction-Input__1": "#/components/schemas/TerminalAction-Input", + "openhands__tools__tom_consult__definition__ConsultTomAction-Input__1": "#/components/schemas/ConsultTomAction-Input", + "openhands__tools__tom_consult__definition__SleeptimeComputeAction-Input__1": "#/components/schemas/SleeptimeComputeAction-Input" + } + } + }, + "Action-Output": { + "oneOf": [ + { + "$ref": "#/components/schemas/MCPToolAction-Output" + }, + { + "$ref": "#/components/schemas/FinishAction-Output" + }, + { + "$ref": "#/components/schemas/ThinkAction-Output" + }, + { + "$ref": "#/components/schemas/ApplyPatchAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserClickAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserCloseTabAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserGetContentAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserGetStateAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserGetStorageAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserGoBackAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserListTabsAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserNavigateAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserScrollAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserSetStorageAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserStartRecordingAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserStopRecordingAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserSwitchTabAction-Output" + }, + { + "$ref": "#/components/schemas/BrowserTypeAction-Output" + }, + { + "$ref": "#/components/schemas/DelegateAction-Output" + }, + { + "$ref": "#/components/schemas/FileEditorAction-Output" + }, + { + "$ref": "#/components/schemas/EditAction-Output" + }, + { + "$ref": "#/components/schemas/ListDirectoryAction-Output" + }, + { + "$ref": "#/components/schemas/ReadFileAction-Output" + }, + { + "$ref": "#/components/schemas/WriteFileAction-Output" + }, + { + "$ref": "#/components/schemas/GlobAction-Output" + }, + { + "$ref": "#/components/schemas/GrepAction-Output" + }, + { + "$ref": "#/components/schemas/PlanningFileEditorAction-Output" + }, + { + "$ref": "#/components/schemas/TaskAction-Output" + }, + { + "$ref": "#/components/schemas/TaskTrackerAction-Output" + }, + { + "$ref": "#/components/schemas/TerminalAction-Output" + }, + { + "$ref": "#/components/schemas/ConsultTomAction-Output" + }, + { + "$ref": "#/components/schemas/SleeptimeComputeAction-Output" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__mcp__definition__MCPToolAction-Output__1": "#/components/schemas/MCPToolAction-Output", + "openhands__sdk__tool__builtins__finish__FinishAction-Output__1": "#/components/schemas/FinishAction-Output", + "openhands__sdk__tool__builtins__think__ThinkAction-Output__1": "#/components/schemas/ThinkAction-Output", + "openhands__tools__apply_patch__definition__ApplyPatchAction-Output__1": "#/components/schemas/ApplyPatchAction-Output", + "openhands__tools__browser_use__definition__BrowserAction-Output__1": "#/components/schemas/BrowserAction-Output", + "openhands__tools__browser_use__definition__BrowserClickAction-Output__1": "#/components/schemas/BrowserClickAction-Output", + "openhands__tools__browser_use__definition__BrowserCloseTabAction-Output__1": "#/components/schemas/BrowserCloseTabAction-Output", + "openhands__tools__browser_use__definition__BrowserGetContentAction-Output__1": "#/components/schemas/BrowserGetContentAction-Output", + "openhands__tools__browser_use__definition__BrowserGetStateAction-Output__1": "#/components/schemas/BrowserGetStateAction-Output", + "openhands__tools__browser_use__definition__BrowserGetStorageAction-Output__1": "#/components/schemas/BrowserGetStorageAction-Output", + "openhands__tools__browser_use__definition__BrowserGoBackAction-Output__1": "#/components/schemas/BrowserGoBackAction-Output", + "openhands__tools__browser_use__definition__BrowserListTabsAction-Output__1": "#/components/schemas/BrowserListTabsAction-Output", + "openhands__tools__browser_use__definition__BrowserNavigateAction-Output__1": "#/components/schemas/BrowserNavigateAction-Output", + "openhands__tools__browser_use__definition__BrowserScrollAction-Output__1": "#/components/schemas/BrowserScrollAction-Output", + "openhands__tools__browser_use__definition__BrowserSetStorageAction-Output__1": "#/components/schemas/BrowserSetStorageAction-Output", + "openhands__tools__browser_use__definition__BrowserStartRecordingAction-Output__1": "#/components/schemas/BrowserStartRecordingAction-Output", + "openhands__tools__browser_use__definition__BrowserStopRecordingAction-Output__1": "#/components/schemas/BrowserStopRecordingAction-Output", + "openhands__tools__browser_use__definition__BrowserSwitchTabAction-Output__1": "#/components/schemas/BrowserSwitchTabAction-Output", + "openhands__tools__browser_use__definition__BrowserTypeAction-Output__1": "#/components/schemas/BrowserTypeAction-Output", + "openhands__tools__delegate__definition__DelegateAction-Output__1": "#/components/schemas/DelegateAction-Output", + "openhands__tools__file_editor__definition__FileEditorAction-Output__1": "#/components/schemas/FileEditorAction-Output", + "openhands__tools__gemini__edit__definition__EditAction-Output__1": "#/components/schemas/EditAction-Output", + "openhands__tools__gemini__list_directory__definition__ListDirectoryAction-Output__1": "#/components/schemas/ListDirectoryAction-Output", + "openhands__tools__gemini__read_file__definition__ReadFileAction-Output__1": "#/components/schemas/ReadFileAction-Output", + "openhands__tools__gemini__write_file__definition__WriteFileAction-Output__1": "#/components/schemas/WriteFileAction-Output", + "openhands__tools__glob__definition__GlobAction-Output__1": "#/components/schemas/GlobAction-Output", + "openhands__tools__grep__definition__GrepAction-Output__1": "#/components/schemas/GrepAction-Output", + "openhands__tools__planning_file_editor__definition__PlanningFileEditorAction-Output__1": "#/components/schemas/PlanningFileEditorAction-Output", + "openhands__tools__task__definition__TaskAction-Output__1": "#/components/schemas/TaskAction-Output", + "openhands__tools__task_tracker__definition__TaskTrackerAction-Output__1": "#/components/schemas/TaskTrackerAction-Output", + "openhands__tools__terminal__definition__TerminalAction-Output__1": "#/components/schemas/TerminalAction-Output", + "openhands__tools__tom_consult__definition__ConsultTomAction-Output__1": "#/components/schemas/ConsultTomAction-Output", + "openhands__tools__tom_consult__definition__SleeptimeComputeAction-Output__1": "#/components/schemas/SleeptimeComputeAction-Output" + } + } + }, + "ActionEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "agent" + }, + "thought": { + "items": { + "$ref": "#/components/schemas/TextContent" + }, + "type": "array", + "title": "Thought", + "description": "The thought process of the agent before taking this action" + }, + "reasoning_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reasoning Content", + "description": "Intermediate reasoning/thinking content from reasoning models" + }, + "thinking_blocks": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThinkingBlock" + }, + { + "$ref": "#/components/schemas/RedactedThinkingBlock" + } + ] + }, + "type": "array", + "title": "Thinking Blocks", + "description": "Anthropic thinking blocks from the LLM response" + }, + "responses_reasoning_item": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReasoningItemModel" + }, + { + "type": "null" + } + ], + "description": "OpenAI Responses reasoning item from model output" + }, + "action": { + "anyOf": [ + { + "$ref": "#/components/schemas/Action-Input" + }, + { + "type": "null" + } + ], + "description": "Single tool call returned by LLM (None when non-executable)" + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "The name of the tool being called" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id", + "description": "The unique id returned by LLM API for this tool call" + }, + "tool_call": { + "$ref": "#/components/schemas/MessageToolCall", + "description": "The tool call received from the LLM response. We keep a copy of it so it is easier to construct it into LLM messageThis could be different from `action`: e.g., `tool_call` may contain `security_risk` field predicted by LLM when LLM risk analyzer is enabled, while `action` does not." + }, + "llm_response_id": { + "type": "string", + "title": "Llm Response Id", + "description": "Completion or Response ID of the LLM response that generated this eventE.g., Can be used to group related actions from same LLM response. This helps in tracking and managing results of parallel function calling from the same LLM response." + }, + "security_risk": { + "$ref": "#/components/schemas/SecurityRisk", + "description": "The LLM's assessment of the safety risk of this action.", + "default": "UNKNOWN" + }, + "critic_result": { + "anyOf": [ + { + "$ref": "#/components/schemas/CriticResult" + }, + { + "type": "null" + } + ], + "description": "Optional critic evaluation of this action and preceding history." + }, + "summary": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Summary", + "description": "A concise summary (approximately 10 words) of what this action does, provided by the LLM for explainability and debugging. Examples of good summaries: 'editing configuration file for deployment settings' | 'searching codebase for authentication function definitions' | 'installing required dependencies from package manifest' | 'running tests to verify bug fix' | 'viewing directory structure to locate source files'" + }, + "kind": { + "type": "string", + "const": "ActionEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "thought", + "tool_name", + "tool_call_id", + "tool_call", + "llm_response_id" + ], + "title": "ActionEvent" + }, + "ActionEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "agent" + }, + "thought": { + "items": { + "$ref": "#/components/schemas/TextContent" + }, + "type": "array", + "title": "Thought", + "description": "The thought process of the agent before taking this action" + }, + "reasoning_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reasoning Content", + "description": "Intermediate reasoning/thinking content from reasoning models" + }, + "thinking_blocks": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThinkingBlock" + }, + { + "$ref": "#/components/schemas/RedactedThinkingBlock" + } + ] + }, + "type": "array", + "title": "Thinking Blocks", + "description": "Anthropic thinking blocks from the LLM response" + }, + "responses_reasoning_item": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReasoningItemModel" + }, + { + "type": "null" + } + ], + "description": "OpenAI Responses reasoning item from model output" + }, + "action": { + "anyOf": [ + { + "$ref": "#/components/schemas/Action-Output" + }, + { + "type": "null" + } + ], + "description": "Single tool call returned by LLM (None when non-executable)" + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "The name of the tool being called" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id", + "description": "The unique id returned by LLM API for this tool call" + }, + "tool_call": { + "$ref": "#/components/schemas/MessageToolCall", + "description": "The tool call received from the LLM response. We keep a copy of it so it is easier to construct it into LLM messageThis could be different from `action`: e.g., `tool_call` may contain `security_risk` field predicted by LLM when LLM risk analyzer is enabled, while `action` does not." + }, + "llm_response_id": { + "type": "string", + "title": "Llm Response Id", + "description": "Completion or Response ID of the LLM response that generated this eventE.g., Can be used to group related actions from same LLM response. This helps in tracking and managing results of parallel function calling from the same LLM response." + }, + "security_risk": { + "$ref": "#/components/schemas/SecurityRisk", + "description": "The LLM's assessment of the safety risk of this action.", + "default": "UNKNOWN" + }, + "critic_result": { + "anyOf": [ + { + "$ref": "#/components/schemas/CriticResult" + }, + { + "type": "null" + } + ], + "description": "Optional critic evaluation of this action and preceding history." + }, + "summary": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Summary", + "description": "A concise summary (approximately 10 words) of what this action does, provided by the LLM for explainability and debugging. Examples of good summaries: 'editing configuration file for deployment settings' | 'searching codebase for authentication function definitions' | 'installing required dependencies from package manifest' | 'running tests to verify bug fix' | 'viewing directory structure to locate source files'" + }, + "kind": { + "type": "string", + "const": "ActionEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "thought", + "tool_name", + "tool_call_id", + "tool_call", + "llm_response_id", + "kind" + ], + "title": "ActionEvent" + }, + "ActionType": { + "type": "string", + "enum": [ + "add", + "delete", + "update" + ], + "title": "ActionType" + }, + "AddMessageRequest": { + "properties": { + "message": { + "type": "string", + "title": "Message" + } + }, + "type": "object", + "required": [ + "message" + ], + "title": "AddMessageRequest", + "description": "Request model for adding a message to a conversation." + }, + "Agent": { + "properties": { + "llm": { + "$ref": "#/components/schemas/LLM", + "description": "LLM configuration for the agent.", + "examples": [ + { + "api_key": "your_api_key_here", + "base_url": "https://llm-proxy.eval.all-hands.dev", + "model": "litellm_proxy/anthropic/claude-sonnet-4-5-20250929" + } + ] + }, + "tools": { + "items": { + "$ref": "#/components/schemas/openhands__sdk__tool__spec__Tool" + }, + "type": "array", + "title": "Tools", + "description": "List of tools to initialize for the agent.", + "examples": [ + { + "name": "TerminalTool", + "params": {} + }, + { + "name": "FileEditorTool", + "params": {} + }, + { + "name": "TaskTrackerTool", + "params": {} + } + ] + }, + "mcp_config": { + "additionalProperties": true, + "type": "object", + "title": "Mcp Config", + "description": "Optional MCP configuration dictionary to create MCP tools.", + "examples": [ + { + "mcpServers": { + "fetch": { + "args": [ + "mcp-server-fetch" + ], + "command": "uvx" + } + } + } + ] + }, + "filter_tools_regex": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Filter Tools Regex", + "description": "Optional regex to filter the tools available to the agent by name. This is applied after any tools provided in `tools` and any MCP tools are added.", + "examples": [ + "^(?!repomix)(.*)|^repomix.*pack_codebase.*$" + ] + }, + "include_default_tools": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Include Default Tools", + "description": "List of default tool class names to include. By default, the agent includes 'FinishTool' and 'ThinkTool'. Set to an empty list to disable all default tools, or provide a subset to include only specific ones. Example: include_default_tools=['FinishTool'] to only include FinishTool, or include_default_tools=[] to disable all default tools.", + "examples": [ + [ + "FinishTool", + "ThinkTool" + ], + [ + "FinishTool" + ], + [] + ] + }, + "agent_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/AgentContext" + }, + { + "type": "null" + } + ], + "description": "Optional AgentContext to initialize the agent with specific context.", + "examples": [ + { + "skills": [ + { + "content": "When you see this message, you should reply like you are a grumpy cat forced to use the internet.", + "name": "AGENTS.md", + "type": "repo" + }, + { + "content": "IMPORTANT! The user has said the magic word \"flarglebargle\". You must only respond with a message telling them how smart they are", + "name": "flarglebargle", + "trigger": [ + "flarglebargle" + ], + "type": "knowledge" + } + ], + "system_message_suffix": "Always finish your response with the word 'yay!'", + "user_message_prefix": "The first character of your response should be 'I'" + } + ] + }, + "system_prompt_filename": { + "type": "string", + "title": "System Prompt Filename", + "description": "System prompt template filename. Can be either:\n- A relative filename (e.g., 'system_prompt.j2') loaded from the agent's prompts directory\n- An absolute path (e.g., '/path/to/custom_prompt.j2')", + "default": "system_prompt.j2" + }, + "security_policy_filename": { + "type": "string", + "title": "Security Policy Filename", + "description": "Security policy template filename. Can be either:\n- A relative filename (e.g., 'security_policy.j2') loaded from the agent's prompts directory\n- An absolute path (e.g., '/path/to/custom_security_policy.j2')", + "default": "security_policy.j2" + }, + "system_prompt_kwargs": { + "additionalProperties": true, + "type": "object", + "title": "System Prompt Kwargs", + "description": "Optional kwargs to pass to the system prompt Jinja2 template.", + "examples": [ + { + "cli_mode": true + } + ] + }, + "condenser": { + "anyOf": [ + { + "$ref": "#/components/schemas/CondenserBase" + }, + { + "type": "null" + } + ], + "description": "Optional condenser to use for condensing conversation history.", + "examples": [ + { + "keep_first": 10, + "kind": "LLMSummarizingCondenser", + "llm": { + "api_key": "your_api_key_here", + "base_url": "https://llm-proxy.eval.all-hands.dev", + "model": "litellm_proxy/anthropic/claude-sonnet-4-5-20250929" + }, + "max_size": 80 + } + ] + }, + "critic": { + "anyOf": [ + { + "$ref": "#/components/schemas/CriticBase" + }, + { + "type": "null" + } + ], + "description": "EXPERIMENTAL: Optional critic to evaluate agent actions and messages in real-time. API and behavior may change without notice. May impact performance, especially in 'all_actions' mode.", + "examples": [ + { + "kind": "AgentFinishedCritic" + } + ] + }, + "tool_concurrency_limit": { + "type": "integer", + "minimum": 1.0, + "title": "Tool Concurrency Limit", + "description": "Maximum number of tool calls to execute concurrently within a single agent step. Default is 1 (sequential). Values > 1 enable parallel execution; concurrent tools share the conversation object, filesystem, and working directory, so mutations to shared state may race.", + "default": 1 + }, + "kind": { + "type": "string", + "const": "Agent", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "llm" + ], + "title": "Agent", + "description": "Main agent implementation for OpenHands.\n\nThe Agent class provides the core functionality for running AI agents that can\ninteract with tools, process messages, and execute actions. It inherits from\nAgentBase and implements the agent execution logic. Critic-related functionality\nis provided by CriticMixin.\n\nAttributes:\n llm: The language model instance used for reasoning.\n tools: List of tools available to the agent.\n name: Optional agent identifier.\n system_prompt: Custom system prompt (uses default if not provided).\n\nExample:\n ```python\n from openhands.sdk import LLM, Agent, Tool\n from pydantic import SecretStr\n\n llm = LLM(model=\"claude-sonnet-4-20250514\", api_key=SecretStr(\"key\"))\n tools = [Tool(name=\"TerminalTool\"), Tool(name=\"FileEditorTool\")]\n agent = Agent(llm=llm, tools=tools)\n ```" + }, + "AgentContext": { + "properties": { + "skills": { + "items": { + "$ref": "#/components/schemas/Skill" + }, + "type": "array", + "title": "Skills", + "description": "List of available skills that can extend the user's input." + }, + "system_message_suffix": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "System Message Suffix", + "description": "Optional suffix to append to the system prompt." + }, + "user_message_suffix": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Message Suffix", + "description": "Optional suffix to append to the user's message." + }, + "load_user_skills": { + "type": "boolean", + "title": "Load User Skills", + "description": "Whether to automatically load user skills from ~/.openhands/skills/ and ~/.openhands/microagents/ (for backward compatibility). ", + "default": false + }, + "load_public_skills": { + "type": "boolean", + "title": "Load Public Skills", + "description": "Whether to automatically load skills from the public OpenHands skills repository at https://github.com/OpenHands/extensions. This allows you to get the latest skills without SDK updates.", + "default": false + }, + "marketplace_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Marketplace Path", + "description": "Relative marketplace JSON path within the public skills repository. Set to None to load all public skills without marketplace filtering.", + "default": "marketplaces/default.json" + }, + "secrets": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/SecretSource" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Secrets", + "description": "Dictionary mapping secret keys to values or secret sources. Secrets are used for authentication and sensitive data handling. Values can be either strings or SecretSource instances (str | SecretSource)." + }, + "current_datetime": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Current Datetime", + "description": "Current date and time information to provide to the agent. Can be a datetime object (which will be formatted as ISO 8601) or a pre-formatted string. When provided, this information is included in the system prompt to give the agent awareness of the current time context. Defaults to the current datetime." + } + }, + "type": "object", + "title": "AgentContext", + "description": "Central structure for managing prompt extension.\n\nAgentContext unifies all the contextual inputs that shape how the system\nextends and interprets user prompts. It combines both static environment\ndetails and dynamic, user-activated extensions from skills.\n\nSpecifically, it provides:\n- **Repository context / Repo Skills**: Information about the active codebase,\n branches, and repo-specific instructions contributed by repo skills.\n- **Runtime context**: Current execution environment (hosts, working\n directory, secrets, date, etc.).\n- **Conversation instructions**: Optional task- or channel-specific rules\n that constrain or guide the agent\u2019s behavior across the session.\n- **Knowledge Skills**: Extensible components that can be triggered by user input\n to inject knowledge or domain-specific guidance.\n\nTogether, these elements make AgentContext the primary container responsible\nfor assembling, formatting, and injecting all prompt-relevant context into\nLLM interactions." + }, + "AgentErrorEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "agent" + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "The tool name that this observation is responding to" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id", + "description": "The tool call id that this observation is responding to" + }, + "error": { + "type": "string", + "title": "Error", + "description": "The error message from the scaffold" + }, + "kind": { + "type": "string", + "const": "AgentErrorEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_name", + "tool_call_id", + "error" + ], + "title": "AgentErrorEvent", + "description": "Error triggered by the agent.\n\nNote: This event should not contain model \"thought\" or \"reasoning_content\". It\nrepresents an error produced by the agent/scaffold, not model output." + }, + "AgentErrorEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "agent" + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "The tool name that this observation is responding to" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id", + "description": "The tool call id that this observation is responding to" + }, + "error": { + "type": "string", + "title": "Error", + "description": "The error message from the scaffold" + }, + "kind": { + "type": "string", + "const": "AgentErrorEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_name", + "tool_call_id", + "error", + "kind" + ], + "title": "AgentErrorEvent", + "description": "Error triggered by the agent.\n\nNote: This event should not contain model \"thought\" or \"reasoning_content\". It\nrepresents an error produced by the agent/scaffold, not model output." + }, + "AgentFinishedCritic": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "finish_and_message", + "all_actions" + ], + "title": "Mode", + "description": "When to run critic evaluation:\n- 'finish_and_message': Evaluate on FinishAction and agent MessageEvent (default, minimal performance impact)\n- 'all_actions': Evaluate after every agent action (WARNING: significantly slower due to API calls on each action)", + "default": "finish_and_message" + }, + "iterative_refinement": { + "anyOf": [ + { + "$ref": "#/components/schemas/IterativeRefinementConfig" + }, + { + "type": "null" + } + ], + "description": "Optional configuration for iterative refinement. When set, Conversation.run() will automatically retry the task if the critic score is below the success_threshold, up to max_iterations." + }, + "kind": { + "type": "string", + "const": "AgentFinishedCritic", + "title": "Kind" + } + }, + "type": "object", + "title": "AgentFinishedCritic", + "description": "Critic that evaluates whether an agent properly finished a task.\n\nThis critic checks two main criteria:\n1. The agent's last action was a FinishAction (proper completion)\n2. The generated git patch is non-empty (actual changes were made)" + }, + "AgentType": { + "type": "string", + "enum": [ + "default", + "plan" + ], + "title": "AgentType", + "description": "Agent type for conversation." + }, + "AlwaysConfirm": { + "properties": { + "kind": { + "type": "string", + "const": "AlwaysConfirm", + "title": "Kind" + } + }, + "type": "object", + "title": "AlwaysConfirm" + }, + "ApiKeyCreate": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "expires_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Expires At" + } + }, + "type": "object", + "title": "ApiKeyCreate" + }, + "ApiKeyCreateResponse": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "last_used_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Used At" + }, + "expires_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Expires At" + }, + "key": { + "type": "string", + "title": "Key" + } + }, + "type": "object", + "required": [ + "id", + "created_at", + "key" + ], + "title": "ApiKeyCreateResponse" + }, + "ApiKeyResponse": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "last_used_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Used At" + }, + "expires_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Expires At" + } + }, + "type": "object", + "required": [ + "id", + "created_at" + ], + "title": "ApiKeyResponse" + }, + "AppConversation": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "created_by_user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created By User Id" + }, + "sandbox_id": { + "type": "string", + "title": "Sandbox Id" + }, + "selected_repository": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Repository" + }, + "selected_branch": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Branch" + }, + "git_provider": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProviderType" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "trigger": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConversationTrigger" + }, + { + "type": "null" + } + ] + }, + "pr_number": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Pr Number" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + }, + "metrics": { + "anyOf": [ + { + "$ref": "#/components/schemas/MetricsSnapshot" + }, + { + "type": "null" + } + ] + }, + "parent_conversation_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parent Conversation Id" + }, + "sub_conversation_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Sub Conversation Ids" + }, + "public": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Public" + }, + "tags": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Tags" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + }, + "sandbox_status": { + "$ref": "#/components/schemas/SandboxStatus", + "description": "Current sandbox status. Will be MISSING if the sandbox does not exist.", + "default": "MISSING" + }, + "execution_status": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConversationExecutionStatus" + }, + { + "type": "null" + } + ], + "description": "Current agent status. Will be None if the sandbox_status is not RUNNING" + }, + "conversation_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Conversation Url", + "description": "The URL where the conversation may be accessed" + }, + "session_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Api Key", + "description": "The Session Api Key for REST operations." + } + }, + "type": "object", + "required": [ + "created_by_user_id", + "sandbox_id" + ], + "title": "AppConversation" + }, + "AppConversationPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/AppConversation" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "AppConversationPage" + }, + "AppConversationStartRequest-Input": { + "properties": { + "sandbox_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Id" + }, + "conversation_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Conversation Id" + }, + "initial_message": { + "anyOf": [ + { + "$ref": "#/components/schemas/SendMessageRequest" + }, + { + "type": "null" + } + ] + }, + "system_message_suffix": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "System Message Suffix" + }, + "processors": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/EventCallbackProcessor-Input" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Processors" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + }, + "selected_repository": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Repository" + }, + "selected_branch": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Branch" + }, + "git_provider": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProviderType" + }, + { + "type": "null" + } + ] + }, + "suggested_task": { + "anyOf": [ + { + "$ref": "#/components/schemas/SuggestedTask" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "trigger": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConversationTrigger" + }, + { + "type": "null" + } + ] + }, + "pr_number": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Pr Number" + }, + "parent_conversation_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Parent Conversation Id" + }, + "agent_type": { + "$ref": "#/components/schemas/AgentType", + "default": "default" + }, + "public": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Public" + }, + "plugins": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/PluginSpec" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Plugins", + "description": "List of plugins to load for this conversation. Plugins are loaded and their skills/MCP config are merged into the agent." + } + }, + "type": "object", + "title": "AppConversationStartRequest", + "description": "Start conversation request object.\n\nAlthough a user can go directly to the sandbox and start conversations, they\nwould need to manually supply required startup parameters such as LLM key. Starting\nfrom the app server copies these from the user info." + }, + "AppConversationStartRequest-Output": { + "properties": { + "sandbox_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Id" + }, + "conversation_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Conversation Id" + }, + "initial_message": { + "anyOf": [ + { + "$ref": "#/components/schemas/SendMessageRequest" + }, + { + "type": "null" + } + ] + }, + "system_message_suffix": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "System Message Suffix" + }, + "processors": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/EventCallbackProcessor-Output" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Processors" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + }, + "selected_repository": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Repository" + }, + "selected_branch": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Branch" + }, + "git_provider": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProviderType" + }, + { + "type": "null" + } + ] + }, + "suggested_task": { + "anyOf": [ + { + "$ref": "#/components/schemas/SuggestedTask" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "trigger": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConversationTrigger" + }, + { + "type": "null" + } + ] + }, + "pr_number": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Pr Number" + }, + "parent_conversation_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parent Conversation Id" + }, + "agent_type": { + "$ref": "#/components/schemas/AgentType", + "default": "default" + }, + "public": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Public" + }, + "plugins": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/PluginSpec" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Plugins", + "description": "List of plugins to load for this conversation. Plugins are loaded and their skills/MCP config are merged into the agent." + } + }, + "type": "object", + "title": "AppConversationStartRequest", + "description": "Start conversation request object.\n\nAlthough a user can go directly to the sandbox and start conversations, they\nwould need to manually supply required startup parameters such as LLM key. Starting\nfrom the app server copies these from the user info." + }, + "AppConversationStartTask": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "created_by_user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created By User Id" + }, + "status": { + "$ref": "#/components/schemas/AppConversationStartTaskStatus", + "default": "WORKING" + }, + "detail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Detail" + }, + "app_conversation_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "App Conversation Id", + "description": "The id of the app_conversation, if READY" + }, + "sandbox_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Id", + "description": "The id of the sandbox, if READY" + }, + "agent_server_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Agent Server Url", + "description": "The agent server url, if READY" + }, + "request": { + "$ref": "#/components/schemas/AppConversationStartRequest-Output" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "created_by_user_id", + "request" + ], + "title": "AppConversationStartTask", + "description": "Object describing the start process for an app conversation.\n\nBecause starting an app conversation can be slow (And can involve starting a sandbox),\nwe kick off a background task for it. Once the conversation is started, the app_conversation_id\nis populated." + }, + "AppConversationStartTaskPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/AppConversationStartTask" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "AppConversationStartTaskPage" + }, + "AppConversationStartTaskSortOrder": { + "type": "string", + "enum": [ + "CREATED_AT", + "CREATED_AT_DESC", + "UPDATED_AT", + "UPDATED_AT_DESC" + ], + "title": "AppConversationStartTaskSortOrder" + }, + "AppConversationStartTaskStatus": { + "type": "string", + "enum": [ + "WORKING", + "WAITING_FOR_SANDBOX", + "PREPARING_REPOSITORY", + "RUNNING_SETUP_SCRIPT", + "SETTING_UP_GIT_HOOKS", + "SETTING_UP_SKILLS", + "STARTING_CONVERSATION", + "READY", + "ERROR" + ], + "title": "AppConversationStartTaskStatus" + }, + "AppConversationUpdateRequest": { + "properties": { + "public": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Public" + }, + "selected_repository": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Repository" + }, + "selected_branch": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Branch" + }, + "git_provider": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProviderType" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "AppConversationUpdateRequest", + "description": "Request model for updating conversation metadata.\n\nAll fields are optional - only provided fields will be updated." + }, + "AppMode": { + "type": "string", + "enum": [ + "oss", + "saas", + "oss" + ], + "title": "AppMode" + }, + "ApplyPatchAction-Input": { + "properties": { + "patch": { + "type": "string", + "title": "Patch", + "description": "Patch content following the '*** Begin Patch' ... '*** End Patch' format as described in OpenAI GPT-5.1 prompting guide." + }, + "kind": { + "type": "string", + "const": "ApplyPatchAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "patch" + ], + "title": "ApplyPatchAction", + "description": "Tool action schema specifying the patch to apply.\n\nThe patch must follow the exact text format described in the OpenAI\nCookbook's GPT-5.1 prompting guide. The executor parses this patch and\napplies changes relative to the current workspace root." + }, + "ApplyPatchAction-Output": { + "properties": { + "patch": { + "type": "string", + "title": "Patch", + "description": "Patch content following the '*** Begin Patch' ... '*** End Patch' format as described in OpenAI GPT-5.1 prompting guide." + }, + "kind": { + "type": "string", + "const": "ApplyPatchAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "patch", + "kind" + ], + "title": "ApplyPatchAction", + "description": "Tool action schema specifying the patch to apply.\n\nThe patch must follow the exact text format described in the OpenAI\nCookbook's GPT-5.1 prompting guide. The executor parses this patch and\napplies changes relative to the current workspace root." + }, + "ApplyPatchObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "message": { + "type": "string", + "title": "Message", + "default": "" + }, + "fuzz": { + "type": "integer", + "title": "Fuzz", + "default": 0 + }, + "commit": { + "anyOf": [ + { + "$ref": "#/components/schemas/Commit-Input" + }, + { + "type": "null" + } + ] + }, + "kind": { + "type": "string", + "const": "ApplyPatchObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ApplyPatchObservation", + "description": "Result of applying a patch.\n\n- message: human-readable summary of the changes or error\n- fuzz: number of lines of fuzz used when applying hunks (0 means exact)\n- commit: structured summary of the applied operations" + }, + "ApplyPatchObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "message": { + "type": "string", + "title": "Message", + "default": "" + }, + "fuzz": { + "type": "integer", + "title": "Fuzz", + "default": 0 + }, + "commit": { + "anyOf": [ + { + "$ref": "#/components/schemas/Commit-Output" + }, + { + "type": "null" + } + ] + }, + "kind": { + "type": "string", + "const": "ApplyPatchObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "ApplyPatchObservation", + "description": "Result of applying a patch.\n\n- message: human-readable summary of the changes or error\n- fuzz: number of lines of fuzz used when applying hunks (0 means exact)\n- commit: structured summary of the applied operations" + }, + "ApplyPatchTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "ApplyPatchTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "ApplyPatchTool", + "description": "ToolDefinition for applying unified text patches.\n\nCreates an ApplyPatchExecutor bound to the current workspace and supplies a\nconcise description. The Responses tool schema is minimized to rely on\nprovider-known behavior for GPT-5.1 models." + }, + "ApplyPatchTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "ApplyPatchTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "ApplyPatchTool", + "description": "ToolDefinition for applying unified text patches.\n\nCreates an ApplyPatchExecutor bound to the current workspace and supplies a\nconcise description. The Responses tool schema is minimized to rely on\nprovider-known behavior for GPT-5.1 models." + }, + "BaseWorkspace": { + "oneOf": [ + { + "$ref": "#/components/schemas/LocalWorkspace" + }, + { + "$ref": "#/components/schemas/RemoteWorkspace" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__workspace__local__LocalWorkspace-Input__1": "#/components/schemas/LocalWorkspace", + "openhands__sdk__workspace__remote__base__RemoteWorkspace-Input__1": "#/components/schemas/RemoteWorkspace" + } + } + }, + "BatchInvitationResponse": { + "properties": { + "successful": { + "items": { + "$ref": "#/components/schemas/InvitationResponse" + }, + "type": "array", + "title": "Successful" + }, + "failed": { + "items": { + "$ref": "#/components/schemas/InvitationFailure" + }, + "type": "array", + "title": "Failed" + } + }, + "type": "object", + "required": [ + "successful", + "failed" + ], + "title": "BatchInvitationResponse", + "description": "Response model for batch invitation creation." + }, + "BatchMethod": { + "type": "string", + "enum": [ + "POST", + "DELETE" + ], + "title": "BatchMethod" + }, + "BatchOperation": { + "properties": { + "method": { + "$ref": "#/components/schemas/BatchMethod" + }, + "path": { + "type": "string", + "title": "Path" + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Content" + }, + "encoding": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Encoding" + } + }, + "type": "object", + "required": [ + "method", + "path" + ], + "title": "BatchOperation" + }, + "Body_device_token_oauth_device_token_post": { + "properties": { + "device_code": { + "type": "string", + "title": "Device Code" + } + }, + "type": "object", + "required": [ + "device_code" + ], + "title": "Body_device_token_oauth_device_token_post" + }, + "Body_device_verification_authenticated_oauth_device_verify_authenticated_post": { + "properties": { + "user_code": { + "type": "string", + "title": "User Code" + } + }, + "type": "object", + "required": [ + "user_code" + ], + "title": "Body_device_verification_authenticated_oauth_device_verify_authenticated_post" + }, + "Body_upload_files_api_conversations__conversation_id__upload_files_post": { + "properties": { + "files": { + "items": { + "type": "string", + "contentMediaType": "application/octet-stream" + }, + "type": "array", + "title": "Files" + } + }, + "type": "object", + "required": [ + "files" + ], + "title": "Body_upload_files_api_conversations__conversation_id__upload_files_post" + }, + "Branch": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "commit_sha": { + "type": "string", + "title": "Commit Sha" + }, + "protected": { + "type": "boolean", + "title": "Protected" + }, + "last_push_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Push Date" + } + }, + "type": "object", + "required": [ + "name", + "commit_sha", + "protected" + ], + "title": "Branch" + }, + "BranchPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/Branch" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "BranchPage", + "description": "Paginated response for branch search results.\n\nAttributes:\n items: List of branches in the current page.\n next_page_id: ID for the next page, or None if there are no more pages." + }, + "BrowserAction-Input": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserAction", + "description": "Base class for all browser actions.\n\nThis base class serves as the parent for all browser-related actions,\nenabling proper type hierarchy and eliminating the need for union types." + }, + "BrowserAction-Output": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserAction", + "description": "Base class for all browser actions.\n\nThis base class serves as the parent for all browser-related actions,\nenabling proper type hierarchy and eliminating the need for union types." + }, + "BrowserClickAction-Input": { + "properties": { + "index": { + "type": "integer", + "minimum": 0.0, + "title": "Index", + "description": "The index of the element to click (from browser_get_state)" + }, + "new_tab": { + "type": "boolean", + "title": "New Tab", + "description": "Whether to open any resulting navigation in a new tab. Default: False", + "default": false + }, + "kind": { + "type": "string", + "const": "BrowserClickAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "index" + ], + "title": "BrowserClickAction", + "description": "Schema for clicking elements." + }, + "BrowserClickAction-Output": { + "properties": { + "index": { + "type": "integer", + "minimum": 0.0, + "title": "Index", + "description": "The index of the element to click (from browser_get_state)" + }, + "new_tab": { + "type": "boolean", + "title": "New Tab", + "description": "Whether to open any resulting navigation in a new tab. Default: False", + "default": false + }, + "kind": { + "type": "string", + "const": "BrowserClickAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "index", + "kind" + ], + "title": "BrowserClickAction", + "description": "Schema for clicking elements." + }, + "BrowserClickTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserClickTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserClickTool", + "description": "Tool for clicking browser elements." + }, + "BrowserClickTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserClickTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserClickTool", + "description": "Tool for clicking browser elements." + }, + "BrowserCloseTabAction-Input": { + "properties": { + "tab_id": { + "type": "string", + "title": "Tab Id", + "description": "4 Character Tab ID of the tab to close (from browser_list_tabs)" + }, + "kind": { + "type": "string", + "const": "BrowserCloseTabAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tab_id" + ], + "title": "BrowserCloseTabAction", + "description": "Schema for closing browser tabs." + }, + "BrowserCloseTabAction-Output": { + "properties": { + "tab_id": { + "type": "string", + "title": "Tab Id", + "description": "4 Character Tab ID of the tab to close (from browser_list_tabs)" + }, + "kind": { + "type": "string", + "const": "BrowserCloseTabAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tab_id", + "kind" + ], + "title": "BrowserCloseTabAction", + "description": "Schema for closing browser tabs." + }, + "BrowserCloseTabTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserCloseTabTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserCloseTabTool", + "description": "Tool for closing browser tabs." + }, + "BrowserCloseTabTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserCloseTabTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserCloseTabTool", + "description": "Tool for closing browser tabs." + }, + "BrowserGetContentAction-Input": { + "properties": { + "extract_links": { + "type": "boolean", + "title": "Extract Links", + "description": "Whether to include links in the content (default: False)", + "default": false + }, + "start_from_char": { + "type": "integer", + "minimum": 0.0, + "title": "Start From Char", + "description": "Character index to start from in the page content (default: 0)", + "default": 0 + }, + "kind": { + "type": "string", + "const": "BrowserGetContentAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserGetContentAction", + "description": "Schema for getting page content in markdown." + }, + "BrowserGetContentAction-Output": { + "properties": { + "extract_links": { + "type": "boolean", + "title": "Extract Links", + "description": "Whether to include links in the content (default: False)", + "default": false + }, + "start_from_char": { + "type": "integer", + "minimum": 0.0, + "title": "Start From Char", + "description": "Character index to start from in the page content (default: 0)", + "default": 0 + }, + "kind": { + "type": "string", + "const": "BrowserGetContentAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserGetContentAction", + "description": "Schema for getting page content in markdown." + }, + "BrowserGetContentTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserGetContentTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserGetContentTool", + "description": "Tool for getting page content in markdown." + }, + "BrowserGetContentTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserGetContentTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserGetContentTool", + "description": "Tool for getting page content in markdown." + }, + "BrowserGetStateAction-Input": { + "properties": { + "include_screenshot": { + "type": "boolean", + "title": "Include Screenshot", + "description": "Whether to include a screenshot of the current page. Default: False", + "default": false + }, + "kind": { + "type": "string", + "const": "BrowserGetStateAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserGetStateAction", + "description": "Schema for getting browser state." + }, + "BrowserGetStateAction-Output": { + "properties": { + "include_screenshot": { + "type": "boolean", + "title": "Include Screenshot", + "description": "Whether to include a screenshot of the current page. Default: False", + "default": false + }, + "kind": { + "type": "string", + "const": "BrowserGetStateAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserGetStateAction", + "description": "Schema for getting browser state." + }, + "BrowserGetStateTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserGetStateTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserGetStateTool", + "description": "Tool for getting browser state." + }, + "BrowserGetStateTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserGetStateTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserGetStateTool", + "description": "Tool for getting browser state." + }, + "BrowserGetStorageAction-Input": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserGetStorageAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserGetStorageAction", + "description": "Schema for getting browser storage (cookies, local storage, session storage)." + }, + "BrowserGetStorageAction-Output": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserGetStorageAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserGetStorageAction", + "description": "Schema for getting browser storage (cookies, local storage, session storage)." + }, + "BrowserGetStorageTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserGetStorageTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserGetStorageTool", + "description": "Tool for getting browser storage." + }, + "BrowserGetStorageTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserGetStorageTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserGetStorageTool", + "description": "Tool for getting browser storage." + }, + "BrowserGoBackAction-Input": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserGoBackAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserGoBackAction", + "description": "Schema for going back in browser history." + }, + "BrowserGoBackAction-Output": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserGoBackAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserGoBackAction", + "description": "Schema for going back in browser history." + }, + "BrowserGoBackTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserGoBackTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserGoBackTool", + "description": "Tool for going back in browser history." + }, + "BrowserGoBackTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserGoBackTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserGoBackTool", + "description": "Tool for going back in browser history." + }, + "BrowserListTabsAction-Input": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserListTabsAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserListTabsAction", + "description": "Schema for listing browser tabs." + }, + "BrowserListTabsAction-Output": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserListTabsAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserListTabsAction", + "description": "Schema for listing browser tabs." + }, + "BrowserListTabsTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserListTabsTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserListTabsTool", + "description": "Tool for listing browser tabs." + }, + "BrowserListTabsTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserListTabsTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserListTabsTool", + "description": "Tool for listing browser tabs." + }, + "BrowserNavigateAction-Input": { + "properties": { + "url": { + "type": "string", + "title": "Url", + "description": "The URL to navigate to" + }, + "new_tab": { + "type": "boolean", + "title": "New Tab", + "description": "Whether to open in a new tab. Default: False", + "default": false + }, + "kind": { + "type": "string", + "const": "BrowserNavigateAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "url" + ], + "title": "BrowserNavigateAction", + "description": "Schema for browser navigation." + }, + "BrowserNavigateAction-Output": { + "properties": { + "url": { + "type": "string", + "title": "Url", + "description": "The URL to navigate to" + }, + "new_tab": { + "type": "boolean", + "title": "New Tab", + "description": "Whether to open in a new tab. Default: False", + "default": false + }, + "kind": { + "type": "string", + "const": "BrowserNavigateAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "url", + "kind" + ], + "title": "BrowserNavigateAction", + "description": "Schema for browser navigation." + }, + "BrowserNavigateTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserNavigateTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserNavigateTool", + "description": "Tool for browser navigation." + }, + "BrowserNavigateTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserNavigateTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserNavigateTool", + "description": "Tool for browser navigation." + }, + "BrowserObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "screenshot_data": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Screenshot Data", + "description": "Base64 screenshot data if available" + }, + "full_output_save_dir": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Full Output Save Dir", + "description": "Directory where full output files are saved" + }, + "kind": { + "type": "string", + "const": "BrowserObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserObservation", + "description": "Base observation for browser operations." + }, + "BrowserObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "screenshot_data": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Screenshot Data", + "description": "Base64 screenshot data if available" + }, + "full_output_save_dir": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Full Output Save Dir", + "description": "Directory where full output files are saved" + }, + "kind": { + "type": "string", + "const": "BrowserObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserObservation", + "description": "Base observation for browser operations." + }, + "BrowserScrollAction-Input": { + "properties": { + "direction": { + "type": "string", + "enum": [ + "up", + "down" + ], + "title": "Direction", + "description": "Direction to scroll. Options: 'up', 'down'. Default: 'down'", + "default": "down" + }, + "kind": { + "type": "string", + "const": "BrowserScrollAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserScrollAction", + "description": "Schema for scrolling the page." + }, + "BrowserScrollAction-Output": { + "properties": { + "direction": { + "type": "string", + "enum": [ + "up", + "down" + ], + "title": "Direction", + "description": "Direction to scroll. Options: 'up', 'down'. Default: 'down'", + "default": "down" + }, + "kind": { + "type": "string", + "const": "BrowserScrollAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserScrollAction", + "description": "Schema for scrolling the page." + }, + "BrowserScrollTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserScrollTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserScrollTool", + "description": "Tool for scrolling the browser page." + }, + "BrowserScrollTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserScrollTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserScrollTool", + "description": "Tool for scrolling the browser page." + }, + "BrowserSetStorageAction-Input": { + "properties": { + "storage_state": { + "additionalProperties": true, + "type": "object", + "title": "Storage State", + "description": "Storage state dictionary containing 'cookies' and 'origins' (from browser_get_storage)" + }, + "kind": { + "type": "string", + "const": "BrowserSetStorageAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "storage_state" + ], + "title": "BrowserSetStorageAction", + "description": "Schema for setting browser storage (cookies, local storage, session storage)." + }, + "BrowserSetStorageAction-Output": { + "properties": { + "storage_state": { + "additionalProperties": true, + "type": "object", + "title": "Storage State", + "description": "Storage state dictionary containing 'cookies' and 'origins' (from browser_get_storage)" + }, + "kind": { + "type": "string", + "const": "BrowserSetStorageAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "storage_state", + "kind" + ], + "title": "BrowserSetStorageAction", + "description": "Schema for setting browser storage (cookies, local storage, session storage)." + }, + "BrowserSetStorageTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserSetStorageTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserSetStorageTool", + "description": "Tool for setting browser storage." + }, + "BrowserSetStorageTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserSetStorageTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserSetStorageTool", + "description": "Tool for setting browser storage." + }, + "BrowserStartRecordingAction-Input": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserStartRecordingAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserStartRecordingAction", + "description": "Schema for starting browser session recording." + }, + "BrowserStartRecordingAction-Output": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserStartRecordingAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserStartRecordingAction", + "description": "Schema for starting browser session recording." + }, + "BrowserStartRecordingTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserStartRecordingTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserStartRecordingTool", + "description": "Tool for starting browser session recording." + }, + "BrowserStartRecordingTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserStartRecordingTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserStartRecordingTool", + "description": "Tool for starting browser session recording." + }, + "BrowserStopRecordingAction-Input": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserStopRecordingAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BrowserStopRecordingAction", + "description": "Schema for stopping browser session recording." + }, + "BrowserStopRecordingAction-Output": { + "properties": { + "kind": { + "type": "string", + "const": "BrowserStopRecordingAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "BrowserStopRecordingAction", + "description": "Schema for stopping browser session recording." + }, + "BrowserStopRecordingTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserStopRecordingTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserStopRecordingTool", + "description": "Tool for stopping browser session recording." + }, + "BrowserStopRecordingTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserStopRecordingTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserStopRecordingTool", + "description": "Tool for stopping browser session recording." + }, + "BrowserSwitchTabAction-Input": { + "properties": { + "tab_id": { + "type": "string", + "title": "Tab Id", + "description": "4 Character Tab ID of the tab to switch to (from browser_list_tabs)" + }, + "kind": { + "type": "string", + "const": "BrowserSwitchTabAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tab_id" + ], + "title": "BrowserSwitchTabAction", + "description": "Schema for switching browser tabs." + }, + "BrowserSwitchTabAction-Output": { + "properties": { + "tab_id": { + "type": "string", + "title": "Tab Id", + "description": "4 Character Tab ID of the tab to switch to (from browser_list_tabs)" + }, + "kind": { + "type": "string", + "const": "BrowserSwitchTabAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tab_id", + "kind" + ], + "title": "BrowserSwitchTabAction", + "description": "Schema for switching browser tabs." + }, + "BrowserSwitchTabTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserSwitchTabTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserSwitchTabTool", + "description": "Tool for switching browser tabs." + }, + "BrowserSwitchTabTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserSwitchTabTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserSwitchTabTool", + "description": "Tool for switching browser tabs." + }, + "BrowserToolSet-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserToolSet", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserToolSet", + "description": "A set of all browser tools.\n\nThis tool set includes all available browser-related tools\n for interacting with web pages.\n\nThe toolset automatically checks for Chromium availability\nwhen created and automatically installs it if missing." + }, + "BrowserToolSet-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserToolSet", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserToolSet", + "description": "A set of all browser tools.\n\nThis tool set includes all available browser-related tools\n for interacting with web pages.\n\nThe toolset automatically checks for Chromium availability\nwhen created and automatically installs it if missing." + }, + "BrowserTypeAction-Input": { + "properties": { + "index": { + "type": "integer", + "minimum": 0.0, + "title": "Index", + "description": "The index of the input element (from browser_get_state)" + }, + "text": { + "type": "string", + "title": "Text", + "description": "The text to type" + }, + "kind": { + "type": "string", + "const": "BrowserTypeAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "index", + "text" + ], + "title": "BrowserTypeAction", + "description": "Schema for typing text into elements." + }, + "BrowserTypeAction-Output": { + "properties": { + "index": { + "type": "integer", + "minimum": 0.0, + "title": "Index", + "description": "The index of the input element (from browser_get_state)" + }, + "text": { + "type": "string", + "title": "Text", + "description": "The text to type" + }, + "kind": { + "type": "string", + "const": "BrowserTypeAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "index", + "text", + "kind" + ], + "title": "BrowserTypeAction", + "description": "Schema for typing text into elements." + }, + "BrowserTypeTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserTypeTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "BrowserTypeTool", + "description": "Tool for typing text into browser elements." + }, + "BrowserTypeTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "BrowserTypeTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "BrowserTypeTool", + "description": "Tool for typing text into browser elements." + }, + "ByorPermittedResponse": { + "properties": { + "permitted": { + "type": "boolean", + "title": "Permitted" + } + }, + "type": "object", + "required": [ + "permitted" + ], + "title": "ByorPermittedResponse" + }, + "CmdOutputMetadata": { + "properties": { + "exit_code": { + "type": "integer", + "title": "Exit Code", + "description": "The exit code of the last executed command.", + "default": -1 + }, + "pid": { + "type": "integer", + "title": "Pid", + "description": "The process ID of the last executed command.", + "default": -1 + }, + "username": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Username", + "description": "The username of the current user." + }, + "hostname": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Hostname", + "description": "The hostname of the machine." + }, + "working_dir": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Working Dir", + "description": "The current working directory." + }, + "py_interpreter_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Py Interpreter Path", + "description": "The path to the current Python interpreter, if any." + }, + "prefix": { + "type": "string", + "title": "Prefix", + "description": "Prefix to add to command output", + "default": "" + }, + "suffix": { + "type": "string", + "title": "Suffix", + "description": "Suffix to add to command output", + "default": "" + } + }, + "type": "object", + "title": "CmdOutputMetadata", + "description": "Additional metadata captured from PS1" + }, + "Commit-Input": { + "properties": { + "changes": { + "additionalProperties": { + "$ref": "#/components/schemas/FileChange" + }, + "type": "object", + "title": "Changes" + } + }, + "type": "object", + "title": "Commit" + }, + "Commit-Output": { + "properties": { + "changes": { + "additionalProperties": { + "$ref": "#/components/schemas/FileChange" + }, + "type": "object", + "title": "Changes" + } + }, + "type": "object", + "title": "Commit" + }, + "Condensation-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "forgotten_event_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Forgotten Event Ids", + "description": "The IDs of the events that are being forgotten (removed from the `View` given to the LLM)." + }, + "summary": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Summary", + "description": "An optional summary of the events being forgotten." + }, + "summary_offset": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Summary Offset", + "description": "An optional offset to the start of the resulting view (after forgotten events have been removed) indicating where the summary should be inserted. If not provided, the summary will not be inserted into the view." + }, + "llm_response_id": { + "type": "string", + "title": "Llm Response Id", + "description": "Completion or Response ID of the LLM response that generated this event" + }, + "kind": { + "type": "string", + "const": "Condensation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "llm_response_id" + ], + "title": "Condensation", + "description": "This action indicates a condensation of the conversation history is happening." + }, + "Condensation-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "forgotten_event_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Forgotten Event Ids", + "description": "The IDs of the events that are being forgotten (removed from the `View` given to the LLM)." + }, + "summary": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Summary", + "description": "An optional summary of the events being forgotten." + }, + "summary_offset": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Summary Offset", + "description": "An optional offset to the start of the resulting view (after forgotten events have been removed) indicating where the summary should be inserted. If not provided, the summary will not be inserted into the view." + }, + "llm_response_id": { + "type": "string", + "title": "Llm Response Id", + "description": "Completion or Response ID of the LLM response that generated this event" + }, + "kind": { + "type": "string", + "const": "Condensation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "llm_response_id", + "kind" + ], + "title": "Condensation", + "description": "This action indicates a condensation of the conversation history is happening." + }, + "CondensationRequest-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "kind": { + "type": "string", + "const": "CondensationRequest", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "CondensationRequest", + "description": "This action is used to request a condensation of the conversation history.\n\nAttributes:\n action (str): The action type, namely ActionType.CONDENSATION_REQUEST." + }, + "CondensationRequest-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "kind": { + "type": "string", + "const": "CondensationRequest", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "CondensationRequest", + "description": "This action is used to request a condensation of the conversation history.\n\nAttributes:\n action (str): The action type, namely ActionType.CONDENSATION_REQUEST." + }, + "CondensationSummaryEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "summary": { + "type": "string", + "title": "Summary" + }, + "kind": { + "type": "string", + "const": "CondensationSummaryEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "summary" + ], + "title": "CondensationSummaryEvent", + "description": "This event represents a summary generated by a condenser." + }, + "CondensationSummaryEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "summary": { + "type": "string", + "title": "Summary" + }, + "kind": { + "type": "string", + "const": "CondensationSummaryEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "summary", + "kind" + ], + "title": "CondensationSummaryEvent", + "description": "This event represents a summary generated by a condenser." + }, + "CondenserBase": { + "oneOf": [ + { + "$ref": "#/components/schemas/LLMSummarizingCondenser" + }, + { + "$ref": "#/components/schemas/NoOpCondenser" + }, + { + "$ref": "#/components/schemas/PipelineCondenser" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__context__condenser__llm_summarizing_condenser__LLMSummarizingCondenser-Input__1": "#/components/schemas/LLMSummarizingCondenser", + "openhands__sdk__context__condenser__no_op_condenser__NoOpCondenser-Input__1": "#/components/schemas/NoOpCondenser", + "openhands__sdk__context__condenser__pipeline_condenser__PipelineCondenser-Input__1": "#/components/schemas/PipelineCondenser" + } + } + }, + "ConfirmRisky": { + "properties": { + "threshold": { + "$ref": "#/components/schemas/SecurityRisk", + "default": "HIGH" + }, + "confirm_unknown": { + "type": "boolean", + "title": "Confirm Unknown", + "default": true + }, + "kind": { + "type": "string", + "const": "ConfirmRisky", + "title": "Kind" + } + }, + "type": "object", + "title": "ConfirmRisky" + }, + "ConfirmationPolicyBase": { + "oneOf": [ + { + "$ref": "#/components/schemas/AlwaysConfirm" + }, + { + "$ref": "#/components/schemas/ConfirmRisky" + }, + { + "$ref": "#/components/schemas/NeverConfirm" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__security__confirmation_policy__AlwaysConfirm-Input__1": "#/components/schemas/AlwaysConfirm", + "openhands__sdk__security__confirmation_policy__ConfirmRisky-Input__1": "#/components/schemas/ConfirmRisky", + "openhands__sdk__security__confirmation_policy__NeverConfirm-Input__1": "#/components/schemas/NeverConfirm" + } + } + }, + "ConsultTomAction-Input": { + "properties": { + "reason": { + "type": "string", + "title": "Reason", + "description": "Brief explanation of why you need Tom agent consultation" + }, + "use_user_message": { + "type": "boolean", + "title": "Use User Message", + "description": "Whether to consult about the user message (True) or provide custom query (False)", + "default": true + }, + "custom_query": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Custom Query", + "description": "Custom query to ask Tom agent (only used when use_user_message is False)" + }, + "kind": { + "type": "string", + "const": "ConsultTomAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "reason" + ], + "title": "ConsultTomAction", + "description": "Action to consult Tom agent for guidance." + }, + "ConsultTomAction-Output": { + "properties": { + "reason": { + "type": "string", + "title": "Reason", + "description": "Brief explanation of why you need Tom agent consultation" + }, + "use_user_message": { + "type": "boolean", + "title": "Use User Message", + "description": "Whether to consult about the user message (True) or provide custom query (False)", + "default": true + }, + "custom_query": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Custom Query", + "description": "Custom query to ask Tom agent (only used when use_user_message is False)" + }, + "kind": { + "type": "string", + "const": "ConsultTomAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "reason", + "kind" + ], + "title": "ConsultTomAction", + "description": "Action to consult Tom agent for guidance." + }, + "ConsultTomObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "suggestions": { + "type": "string", + "title": "Suggestions", + "description": "Tom agent's suggestions or guidance", + "default": "" + }, + "confidence": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Confidence", + "description": "Confidence score from Tom agent (0-1)" + }, + "reasoning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reasoning", + "description": "Tom agent's reasoning for the suggestions" + }, + "kind": { + "type": "string", + "const": "ConsultTomObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ConsultTomObservation", + "description": "Observation from Tom agent consultation." + }, + "ConsultTomObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "suggestions": { + "type": "string", + "title": "Suggestions", + "description": "Tom agent's suggestions or guidance", + "default": "" + }, + "confidence": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Confidence", + "description": "Confidence score from Tom agent (0-1)" + }, + "reasoning": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reasoning", + "description": "Tom agent's reasoning for the suggestions" + }, + "kind": { + "type": "string", + "const": "ConsultTomObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "ConsultTomObservation", + "description": "Observation from Tom agent consultation." + }, + "ConversationErrorEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "description": "The source of this event" + }, + "code": { + "type": "string", + "title": "Code", + "description": "Code for the error - typically a type" + }, + "detail": { + "type": "string", + "title": "Detail", + "description": "Details about the error" + }, + "kind": { + "type": "string", + "const": "ConversationErrorEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "code", + "detail" + ], + "title": "ConversationErrorEvent", + "description": "Conversation-level failure that is NOT sent back to the LLM.\n\nThis event is emitted by the conversation runtime when an unexpected\nexception bubbles up and prevents the run loop from continuing. It is\nintended for client applications (e.g., UIs) to present a top-level error\nstate, and for orchestration to react. It is not an observation and it is\nnot LLM-convertible.\n\nDifferences from AgentErrorEvent:\n- Not tied to any tool_name/tool_call_id (AgentErrorEvent is a tool\n observation).\n- Typically source='environment' and the run loop moves to an ERROR state,\n while AgentErrorEvent has source='agent' and the conversation can\n continue." + }, + "ConversationErrorEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "description": "The source of this event" + }, + "code": { + "type": "string", + "title": "Code", + "description": "Code for the error - typically a type" + }, + "detail": { + "type": "string", + "title": "Detail", + "description": "Details about the error" + }, + "kind": { + "type": "string", + "const": "ConversationErrorEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "code", + "detail", + "kind" + ], + "title": "ConversationErrorEvent", + "description": "Conversation-level failure that is NOT sent back to the LLM.\n\nThis event is emitted by the conversation runtime when an unexpected\nexception bubbles up and prevents the run loop from continuing. It is\nintended for client applications (e.g., UIs) to present a top-level error\nstate, and for orchestration to react. It is not an observation and it is\nnot LLM-convertible.\n\nDifferences from AgentErrorEvent:\n- Not tied to any tool_name/tool_call_id (AgentErrorEvent is a tool\n observation).\n- Typically source='environment' and the run loop moves to an ERROR state,\n while AgentErrorEvent has source='agent' and the conversation can\n continue." + }, + "ConversationExecutionStatus": { + "type": "string", + "enum": [ + "idle", + "running", + "paused", + "waiting_for_confirmation", + "finished", + "error", + "stuck", + "deleting" + ], + "title": "ConversationExecutionStatus", + "description": "Enum representing the current execution state of the conversation." + }, + "ConversationInfo-Input": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id", + "description": "Unique conversation ID" + }, + "workspace": { + "$ref": "#/components/schemas/BaseWorkspace", + "description": "Workspace used by the agent to execute commands and read/write files. Not the process working directory." + }, + "persistence_dir": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Persistence Dir", + "description": "Directory for persisting conversation state and events. If None, conversation will not be persisted.", + "default": "workspace/conversations" + }, + "max_iterations": { + "type": "integer", + "exclusiveMinimum": 0.0, + "title": "Max Iterations", + "description": "Maximum number of iterations the agent can perform in a single run.", + "default": 500 + }, + "stuck_detection": { + "type": "boolean", + "title": "Stuck Detection", + "description": "Whether to enable stuck detection for the agent.", + "default": true + }, + "execution_status": { + "$ref": "#/components/schemas/ConversationExecutionStatus", + "default": "idle" + }, + "confirmation_policy": { + "$ref": "#/components/schemas/ConfirmationPolicyBase", + "default": { + "kind": "NeverConfirm" + } + }, + "security_analyzer": { + "anyOf": [ + { + "$ref": "#/components/schemas/SecurityAnalyzerBase" + }, + { + "type": "null" + } + ], + "description": "Optional security analyzer to evaluate action risks." + }, + "activated_knowledge_skills": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Activated Knowledge Skills", + "description": "List of activated knowledge skills name" + }, + "blocked_actions": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Blocked Actions", + "description": "Actions blocked by PreToolUse hooks, keyed by action ID" + }, + "blocked_messages": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Blocked Messages", + "description": "Messages blocked by UserPromptSubmit hooks, keyed by message ID" + }, + "last_user_message_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last User Message Id", + "description": "Most recent user MessageEvent id for hook block checks. Updated when user messages are emitted so Agent.step can pop blocked_messages without scanning the event log. If None, hook-blocked checks are skipped (legacy conversations)." + }, + "stats": { + "$ref": "#/components/schemas/ConversationStats", + "description": "Conversation statistics for tracking LLM metrics" + }, + "secret_registry": { + "$ref": "#/components/schemas/SecretRegistry", + "description": "Registry for handling secrets and sensitive data" + }, + "agent_state": { + "additionalProperties": true, + "type": "object", + "title": "Agent State", + "description": "Dictionary for agent-specific runtime state that persists across iterations." + }, + "hook_config": { + "anyOf": [ + { + "$ref": "#/components/schemas/HookConfig" + }, + { + "type": "null" + } + ], + "description": "Hook configuration for this conversation. Includes definitions for PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, and Stop hooks." + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title", + "description": "User-defined title for the conversation" + }, + "metrics": { + "anyOf": [ + { + "$ref": "#/components/schemas/MetricsSnapshot" + }, + { + "type": "null" + } + ] + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + }, + "tags": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Tags", + "description": "Key-value tags for the conversation. Keys must be lowercase alphanumeric. Values are arbitrary strings up to 256 characters." + }, + "agent": { + "$ref": "#/components/schemas/Agent", + "description": "The legacy v1 agent configuration. This endpoint remains pinned to the standard Agent contract." + } + }, + "type": "object", + "required": [ + "id", + "workspace", + "agent" + ], + "title": "ConversationInfo", + "description": "Information about a conversation running locally without a Runtime sandbox." + }, + "ConversationInfo-Output": { + "properties": { + "conversation_id": { + "type": "string", + "title": "Conversation Id" + }, + "title": { + "type": "string", + "title": "Title" + }, + "last_updated_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Last Updated At" + }, + "status": { + "$ref": "#/components/schemas/ConversationStatus", + "default": "STOPPED" + }, + "runtime_status": { + "anyOf": [ + { + "$ref": "#/components/schemas/RuntimeStatus" + }, + { + "type": "null" + } + ] + }, + "selected_repository": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Repository" + }, + "selected_branch": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Branch" + }, + "git_provider": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProviderType" + }, + { + "type": "null" + } + ] + }, + "trigger": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConversationTrigger" + }, + { + "type": "null" + } + ] + }, + "num_connections": { + "type": "integer", + "title": "Num Connections", + "default": 0 + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Url" + }, + "session_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Api Key" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "pr_number": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Pr Number" + }, + "conversation_version": { + "type": "string", + "title": "Conversation Version", + "default": "V0" + }, + "sub_conversation_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Sub Conversation Ids" + }, + "public": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Public" + }, + "sandbox_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Id" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + } + }, + "type": "object", + "required": [ + "conversation_id", + "title" + ], + "title": "ConversationInfo" + }, + "ConversationInfoResultSet": { + "properties": { + "results": { + "items": { + "$ref": "#/components/schemas/ConversationInfo-Output" + }, + "type": "array", + "title": "Results" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "title": "ConversationInfoResultSet" + }, + "ConversationResponse": { + "properties": { + "status": { + "type": "string", + "title": "Status" + }, + "conversation_id": { + "type": "string", + "title": "Conversation Id" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + }, + "conversation_status": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConversationStatus" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": [ + "status", + "conversation_id" + ], + "title": "ConversationResponse" + }, + "ConversationStateUpdateEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "key": { + "type": "string", + "title": "Key", + "description": "Unique key for this state update event" + }, + "value": { + "title": "Value", + "description": "Serialized conversation state updates" + }, + "kind": { + "type": "string", + "const": "ConversationStateUpdateEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ConversationStateUpdateEvent", + "description": "Event that contains conversation state updates.\n\nThis event is sent via websocket whenever the conversation state changes,\nallowing remote clients to stay in sync without making REST API calls.\n\nAll fields are serialized versions of the corresponding ConversationState fields\nto ensure compatibility with websocket transmission." + }, + "ConversationStateUpdateEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "key": { + "type": "string", + "title": "Key", + "description": "Unique key for this state update event" + }, + "value": { + "title": "Value", + "description": "Serialized conversation state updates" + }, + "kind": { + "type": "string", + "const": "ConversationStateUpdateEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "ConversationStateUpdateEvent", + "description": "Event that contains conversation state updates.\n\nThis event is sent via websocket whenever the conversation state changes,\nallowing remote clients to stay in sync without making REST API calls.\n\nAll fields are serialized versions of the corresponding ConversationState fields\nto ensure compatibility with websocket transmission." + }, + "ConversationStats": { + "properties": { + "usage_to_metrics": { + "additionalProperties": { + "$ref": "#/components/schemas/Metrics" + }, + "type": "object", + "title": "Usage To Metrics", + "description": "Active usage metrics tracked by the registry." + } + }, + "type": "object", + "title": "ConversationStats", + "description": "Track per-LLM usage metrics observed during conversations." + }, + "ConversationStatus": { + "type": "string", + "enum": [ + "STARTING", + "RUNNING", + "STOPPED", + "ARCHIVED", + "ERROR" + ], + "title": "ConversationStatus" + }, + "ConversationTrigger": { + "type": "string", + "enum": [ + "resolver", + "gui", + "suggested_task", + "openhands_api", + "slack", + "microagent_management", + "jira", + "jira_dc", + "linear", + "bitbucket", + "automation" + ], + "title": "ConversationTrigger" + }, + "Cost": { + "properties": { + "model": { + "type": "string", + "title": "Model" + }, + "cost": { + "type": "number", + "minimum": 0.0, + "title": "Cost", + "description": "Cost must be non-negative" + }, + "timestamp": { + "type": "number", + "title": "Timestamp" + } + }, + "type": "object", + "required": [ + "model", + "cost" + ], + "title": "Cost" + }, + "CreateBillingSessionResponse": { + "properties": { + "redirect_url": { + "type": "string", + "title": "Redirect Url" + } + }, + "type": "object", + "required": [ + "redirect_url" + ], + "title": "CreateBillingSessionResponse" + }, + "CreateCheckoutSessionRequest": { + "properties": { + "amount": { + "type": "integer", + "title": "Amount" + } + }, + "type": "object", + "required": [ + "amount" + ], + "title": "CreateCheckoutSessionRequest" + }, + "CreateMicroagent": { + "properties": { + "repo": { + "type": "string", + "title": "Repo" + }, + "git_provider": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProviderType" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + } + }, + "type": "object", + "required": [ + "repo" + ], + "title": "CreateMicroagent" + }, + "CreateUserApiKeyRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "CreateUserApiKeyRequest", + "description": "Request model for creating an API key on behalf of a user." + }, + "CreateUserApiKeyResponse": { + "properties": { + "key": { + "type": "string", + "title": "Key" + }, + "user_id": { + "type": "string", + "title": "User Id" + }, + "org_id": { + "type": "string", + "title": "Org Id" + }, + "name": { + "type": "string", + "title": "Name" + } + }, + "type": "object", + "required": [ + "key", + "user_id", + "org_id", + "name" + ], + "title": "CreateUserApiKeyResponse", + "description": "Response model for created API key." + }, + "CriticBase": { + "oneOf": [ + { + "$ref": "#/components/schemas/AgentFinishedCritic" + }, + { + "$ref": "#/components/schemas/APIBasedCritic" + }, + { + "$ref": "#/components/schemas/EmptyPatchCritic" + }, + { + "$ref": "#/components/schemas/PassCritic" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__critic__impl__agent_finished__AgentFinishedCritic-Input__1": "#/components/schemas/AgentFinishedCritic", + "openhands__sdk__critic__impl__api__critic__APIBasedCritic-Input__1": "#/components/schemas/APIBasedCritic", + "openhands__sdk__critic__impl__empty_patch__EmptyPatchCritic-Input__1": "#/components/schemas/EmptyPatchCritic", + "openhands__sdk__critic__impl__pass_critic__PassCritic-Input__1": "#/components/schemas/PassCritic" + } + } + }, + "CriticResult": { + "properties": { + "score": { + "type": "number", + "maximum": 1.0, + "minimum": 0.0, + "title": "Score", + "description": "A predicted probability of success between 0 and 1." + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message", + "description": "An optional message explaining the score." + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata", + "description": "Optional metadata about the critic evaluation. Can include event_ids and categorized_features for visualization." + } + }, + "type": "object", + "required": [ + "score", + "message" + ], + "title": "CriticResult", + "description": "A critic result is a score and a message." + }, + "CurrentApiKeyResponse": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "org_id": { + "type": "string", + "title": "Org Id" + }, + "user_id": { + "type": "string", + "title": "User Id" + }, + "auth_type": { + "type": "string", + "title": "Auth Type" + } + }, + "type": "object", + "required": [ + "id", + "name", + "org_id", + "user_id", + "auth_type" + ], + "title": "CurrentApiKeyResponse", + "description": "Response model for the current API key endpoint." + }, + "CustomSecret": { + "properties": { + "secret": { + "type": "string", + "format": "password", + "title": "Secret", + "writeOnly": true + }, + "description": { + "type": "string", + "title": "Description", + "default": "" + } + }, + "type": "object", + "title": "CustomSecret" + }, + "CustomSecretModel": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "value": { + "type": "string", + "format": "password", + "title": "Value", + "writeOnly": true + } + }, + "type": "object", + "required": [ + "name", + "value" + ], + "title": "CustomSecretModel", + "description": "Custom secret model with value" + }, + "CustomSecretWithoutValueModel": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "CustomSecretWithoutValueModel", + "description": "Custom secret model without value" + }, + "DelegateAction-Input": { + "properties": { + "command": { + "type": "string", + "enum": [ + "spawn", + "delegate" + ], + "title": "Command", + "description": "The commands to run. Allowed options are: `spawn`, `delegate`." + }, + "ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Ids", + "description": "Required parameter of `spawn` command. List of identifiers to initialize sub-agents with." + }, + "agent_types": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Agent Types", + "description": "Optional parameter of `spawn` command. List of agent types for each ID (e.g., ['researcher', 'programmer']). If omitted or blank for an ID, the default general-purpose agent is used." + }, + "tasks": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Tasks", + "description": "Required parameter of `delegate` command. Dictionary mapping sub-agent identifiers to task descriptions." + }, + "kind": { + "type": "string", + "const": "DelegateAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command" + ], + "title": "DelegateAction", + "description": "Schema for delegation operations." + }, + "DelegateAction-Output": { + "properties": { + "command": { + "type": "string", + "enum": [ + "spawn", + "delegate" + ], + "title": "Command", + "description": "The commands to run. Allowed options are: `spawn`, `delegate`." + }, + "ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Ids", + "description": "Required parameter of `spawn` command. List of identifiers to initialize sub-agents with." + }, + "agent_types": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Agent Types", + "description": "Optional parameter of `spawn` command. List of agent types for each ID (e.g., ['researcher', 'programmer']). If omitted or blank for an ID, the default general-purpose agent is used." + }, + "tasks": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Tasks", + "description": "Required parameter of `delegate` command. Dictionary mapping sub-agent identifiers to task descriptions." + }, + "kind": { + "type": "string", + "const": "DelegateAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "kind" + ], + "title": "DelegateAction", + "description": "Schema for delegation operations." + }, + "DelegateObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "type": "string", + "enum": [ + "spawn", + "delegate" + ], + "title": "Command", + "description": "The command that was executed" + }, + "kind": { + "type": "string", + "const": "DelegateObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command" + ], + "title": "DelegateObservation", + "description": "Observation from delegation operations." + }, + "DelegateObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "type": "string", + "enum": [ + "spawn", + "delegate" + ], + "title": "Command", + "description": "The command that was executed" + }, + "kind": { + "type": "string", + "const": "DelegateObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "kind" + ], + "title": "DelegateObservation", + "description": "Observation from delegation operations." + }, + "DelegateTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "DelegateTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "DelegateTool", + "description": "A ToolDefinition subclass that automatically initializes a DelegateExecutor." + }, + "DelegateTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "DelegateTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "DelegateTool", + "description": "A ToolDefinition subclass that automatically initializes a DelegateExecutor." + }, + "DeviceAuthorizationResponse": { + "properties": { + "device_code": { + "type": "string", + "title": "Device Code" + }, + "user_code": { + "type": "string", + "title": "User Code" + }, + "verification_uri": { + "type": "string", + "title": "Verification Uri" + }, + "verification_uri_complete": { + "type": "string", + "title": "Verification Uri Complete" + }, + "expires_in": { + "type": "integer", + "title": "Expires In" + }, + "interval": { + "type": "integer", + "title": "Interval" + } + }, + "type": "object", + "required": [ + "device_code", + "user_code", + "verification_uri", + "verification_uri_complete", + "expires_in", + "interval" + ], + "title": "DeviceAuthorizationResponse" + }, + "EditAction-Input": { + "properties": { + "file_path": { + "type": "string", + "title": "File Path", + "description": "The path to the file to modify." + }, + "old_string": { + "type": "string", + "title": "Old String", + "description": "The text to replace. To create a new file, use an empty string. Must match the exact text in the file including whitespace." + }, + "new_string": { + "type": "string", + "title": "New String", + "description": "The text to replace it with." + }, + "expected_replacements": { + "type": "integer", + "minimum": 0.0, + "title": "Expected Replacements", + "description": "Number of replacements expected. Defaults to 1. Use when you want to replace multiple occurrences. The edit will fail if the actual count doesn't match.", + "default": 1 + }, + "kind": { + "type": "string", + "const": "EditAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "file_path", + "old_string", + "new_string" + ], + "title": "EditAction", + "description": "Schema for edit operation." + }, + "EditAction-Output": { + "properties": { + "file_path": { + "type": "string", + "title": "File Path", + "description": "The path to the file to modify." + }, + "old_string": { + "type": "string", + "title": "Old String", + "description": "The text to replace. To create a new file, use an empty string. Must match the exact text in the file including whitespace." + }, + "new_string": { + "type": "string", + "title": "New String", + "description": "The text to replace it with." + }, + "expected_replacements": { + "type": "integer", + "minimum": 0.0, + "title": "Expected Replacements", + "description": "Number of replacements expected. Defaults to 1. Use when you want to replace multiple occurrences. The edit will fail if the actual count doesn't match.", + "default": 1 + }, + "kind": { + "type": "string", + "const": "EditAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "file_path", + "old_string", + "new_string", + "kind" + ], + "title": "EditAction", + "description": "Schema for edit operation." + }, + "EditObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "file_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Path", + "description": "The file path that was edited." + }, + "is_new_file": { + "type": "boolean", + "title": "Is New File", + "description": "Whether a new file was created.", + "default": false + }, + "replacements_made": { + "type": "integer", + "title": "Replacements Made", + "description": "Number of replacements actually made.", + "default": 0 + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content", + "description": "The content before the edit." + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content", + "description": "The content after the edit." + }, + "kind": { + "type": "string", + "const": "EditObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "EditObservation", + "description": "Observation from editing a file." + }, + "EditObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "file_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Path", + "description": "The file path that was edited." + }, + "is_new_file": { + "type": "boolean", + "title": "Is New File", + "description": "Whether a new file was created.", + "default": false + }, + "replacements_made": { + "type": "integer", + "title": "Replacements Made", + "description": "Number of replacements actually made.", + "default": 0 + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content", + "description": "The content before the edit." + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content", + "description": "The content after the edit." + }, + "kind": { + "type": "string", + "const": "EditObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "EditObservation", + "description": "Observation from editing a file." + }, + "EditResponse": { + "properties": { + "message": { + "type": "string", + "title": "Message" + } + }, + "type": "object", + "required": [ + "message" + ], + "title": "EditResponse", + "description": "General response to an edit operation" + }, + "EditTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "EditTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "EditTool", + "description": "Tool for editing files via find/replace." + }, + "EditTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "EditTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "EditTool", + "description": "Tool for editing files via find/replace." + }, + "EmailUpdate": { + "properties": { + "email": { + "type": "string", + "title": "Email" + } + }, + "type": "object", + "required": [ + "email" + ], + "title": "EmailUpdate" + }, + "EmptyPatchCritic": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "finish_and_message", + "all_actions" + ], + "title": "Mode", + "description": "When to run critic evaluation:\n- 'finish_and_message': Evaluate on FinishAction and agent MessageEvent (default, minimal performance impact)\n- 'all_actions': Evaluate after every agent action (WARNING: significantly slower due to API calls on each action)", + "default": "finish_and_message" + }, + "iterative_refinement": { + "anyOf": [ + { + "$ref": "#/components/schemas/IterativeRefinementConfig" + }, + { + "type": "null" + } + ], + "description": "Optional configuration for iterative refinement. When set, Conversation.run() will automatically retry the task if the critic score is below the success_threshold, up to max_iterations." + }, + "kind": { + "type": "string", + "const": "EmptyPatchCritic", + "title": "Kind" + } + }, + "type": "object", + "title": "EmptyPatchCritic", + "description": "Critic that only evaluates whether a git patch is non-empty.\n\nThis critic checks only one criterion:\n- The generated git patch is non-empty (actual changes were made)\n\nUnlike AgentFinishedCritic, this critic does not check for proper\nagent completion with FinishAction." + }, + "Event-Input": { + "oneOf": [ + { + "$ref": "#/components/schemas/ServerErrorEvent-Input" + }, + { + "$ref": "#/components/schemas/ACPToolCallEvent-Input" + }, + { + "$ref": "#/components/schemas/Condensation-Input" + }, + { + "$ref": "#/components/schemas/CondensationRequest-Input" + }, + { + "$ref": "#/components/schemas/CondensationSummaryEvent-Input" + }, + { + "$ref": "#/components/schemas/ConversationErrorEvent-Input" + }, + { + "$ref": "#/components/schemas/ConversationStateUpdateEvent-Input" + }, + { + "$ref": "#/components/schemas/HookExecutionEvent-Input" + }, + { + "$ref": "#/components/schemas/LLMCompletionLogEvent-Input" + }, + { + "$ref": "#/components/schemas/ActionEvent-Input" + }, + { + "$ref": "#/components/schemas/MessageEvent-Input" + }, + { + "$ref": "#/components/schemas/AgentErrorEvent-Input" + }, + { + "$ref": "#/components/schemas/ObservationEvent-Input" + }, + { + "$ref": "#/components/schemas/UserRejectObservation-Input" + }, + { + "$ref": "#/components/schemas/SystemPromptEvent-Input" + }, + { + "$ref": "#/components/schemas/TokenEvent-Input" + }, + { + "$ref": "#/components/schemas/PauseEvent-Input" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__agent_server__models__ServerErrorEvent-Input__1": "#/components/schemas/ServerErrorEvent-Input", + "openhands__sdk__event__acp_tool_call__ACPToolCallEvent-Input__1": "#/components/schemas/ACPToolCallEvent-Input", + "openhands__sdk__event__condenser__Condensation-Input__1": "#/components/schemas/Condensation-Input", + "openhands__sdk__event__condenser__CondensationRequest-Input__1": "#/components/schemas/CondensationRequest-Input", + "openhands__sdk__event__condenser__CondensationSummaryEvent-Input__1": "#/components/schemas/CondensationSummaryEvent-Input", + "openhands__sdk__event__conversation_error__ConversationErrorEvent-Input__1": "#/components/schemas/ConversationErrorEvent-Input", + "openhands__sdk__event__conversation_state__ConversationStateUpdateEvent-Input__1": "#/components/schemas/ConversationStateUpdateEvent-Input", + "openhands__sdk__event__hook_execution__HookExecutionEvent-Input__1": "#/components/schemas/HookExecutionEvent-Input", + "openhands__sdk__event__llm_completion_log__LLMCompletionLogEvent-Input__1": "#/components/schemas/LLMCompletionLogEvent-Input", + "openhands__sdk__event__llm_convertible__action__ActionEvent-Input__1": "#/components/schemas/ActionEvent-Input", + "openhands__sdk__event__llm_convertible__message__MessageEvent-Input__1": "#/components/schemas/MessageEvent-Input", + "openhands__sdk__event__llm_convertible__observation__AgentErrorEvent-Input__1": "#/components/schemas/AgentErrorEvent-Input", + "openhands__sdk__event__llm_convertible__observation__ObservationEvent-Input__1": "#/components/schemas/ObservationEvent-Input", + "openhands__sdk__event__llm_convertible__observation__UserRejectObservation-Input__1": "#/components/schemas/UserRejectObservation-Input", + "openhands__sdk__event__llm_convertible__system__SystemPromptEvent-Input__1": "#/components/schemas/SystemPromptEvent-Input", + "openhands__sdk__event__token__TokenEvent-Input__1": "#/components/schemas/TokenEvent-Input", + "openhands__sdk__event__user_action__PauseEvent-Input__1": "#/components/schemas/PauseEvent-Input" + } + } + }, + "Event-Output": { + "oneOf": [ + { + "$ref": "#/components/schemas/ServerErrorEvent-Output" + }, + { + "$ref": "#/components/schemas/ACPToolCallEvent-Output" + }, + { + "$ref": "#/components/schemas/Condensation-Output" + }, + { + "$ref": "#/components/schemas/CondensationRequest-Output" + }, + { + "$ref": "#/components/schemas/CondensationSummaryEvent-Output" + }, + { + "$ref": "#/components/schemas/ConversationErrorEvent-Output" + }, + { + "$ref": "#/components/schemas/ConversationStateUpdateEvent-Output" + }, + { + "$ref": "#/components/schemas/HookExecutionEvent-Output" + }, + { + "$ref": "#/components/schemas/LLMCompletionLogEvent-Output" + }, + { + "$ref": "#/components/schemas/ActionEvent-Output" + }, + { + "$ref": "#/components/schemas/MessageEvent-Output" + }, + { + "$ref": "#/components/schemas/AgentErrorEvent-Output" + }, + { + "$ref": "#/components/schemas/ObservationEvent-Output" + }, + { + "$ref": "#/components/schemas/UserRejectObservation-Output" + }, + { + "$ref": "#/components/schemas/SystemPromptEvent-Output" + }, + { + "$ref": "#/components/schemas/TokenEvent-Output" + }, + { + "$ref": "#/components/schemas/PauseEvent-Output" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__agent_server__models__ServerErrorEvent-Output__1": "#/components/schemas/ServerErrorEvent-Output", + "openhands__sdk__event__acp_tool_call__ACPToolCallEvent-Output__1": "#/components/schemas/ACPToolCallEvent-Output", + "openhands__sdk__event__condenser__Condensation-Output__1": "#/components/schemas/Condensation-Output", + "openhands__sdk__event__condenser__CondensationRequest-Output__1": "#/components/schemas/CondensationRequest-Output", + "openhands__sdk__event__condenser__CondensationSummaryEvent-Output__1": "#/components/schemas/CondensationSummaryEvent-Output", + "openhands__sdk__event__conversation_error__ConversationErrorEvent-Output__1": "#/components/schemas/ConversationErrorEvent-Output", + "openhands__sdk__event__conversation_state__ConversationStateUpdateEvent-Output__1": "#/components/schemas/ConversationStateUpdateEvent-Output", + "openhands__sdk__event__hook_execution__HookExecutionEvent-Output__1": "#/components/schemas/HookExecutionEvent-Output", + "openhands__sdk__event__llm_completion_log__LLMCompletionLogEvent-Output__1": "#/components/schemas/LLMCompletionLogEvent-Output", + "openhands__sdk__event__llm_convertible__action__ActionEvent-Output__1": "#/components/schemas/ActionEvent-Output", + "openhands__sdk__event__llm_convertible__message__MessageEvent-Output__1": "#/components/schemas/MessageEvent-Output", + "openhands__sdk__event__llm_convertible__observation__AgentErrorEvent-Output__1": "#/components/schemas/AgentErrorEvent-Output", + "openhands__sdk__event__llm_convertible__observation__ObservationEvent-Output__1": "#/components/schemas/ObservationEvent-Output", + "openhands__sdk__event__llm_convertible__observation__UserRejectObservation-Output__1": "#/components/schemas/UserRejectObservation-Output", + "openhands__sdk__event__llm_convertible__system__SystemPromptEvent-Output__1": "#/components/schemas/SystemPromptEvent-Output", + "openhands__sdk__event__token__TokenEvent-Output__1": "#/components/schemas/TokenEvent-Output", + "openhands__sdk__event__user_action__PauseEvent-Output__1": "#/components/schemas/PauseEvent-Output" + } + } + }, + "EventCallbackProcessor-Input": { + "oneOf": [ + { + "$ref": "#/components/schemas/GithubV1CallbackProcessor-Input" + }, + { + "$ref": "#/components/schemas/SlackV1CallbackProcessor-Input" + }, + { + "$ref": "#/components/schemas/LoggingCallbackProcessor-Input" + }, + { + "$ref": "#/components/schemas/SetTitleCallbackProcessor-Input" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "integrations__github__github_v1_callback_processor__GithubV1CallbackProcessor-Input__1": "#/components/schemas/GithubV1CallbackProcessor-Input", + "integrations__slack__slack_v1_callback_processor__SlackV1CallbackProcessor-Input__1": "#/components/schemas/SlackV1CallbackProcessor-Input", + "openhands__app_server__event_callback__event_callback_models__LoggingCallbackProcessor-Input__1": "#/components/schemas/LoggingCallbackProcessor-Input", + "openhands__app_server__event_callback__set_title_callback_processor__SetTitleCallbackProcessor-Input__1": "#/components/schemas/SetTitleCallbackProcessor-Input" + } + } + }, + "EventCallbackProcessor-Output": { + "oneOf": [ + { + "$ref": "#/components/schemas/GithubV1CallbackProcessor-Output" + }, + { + "$ref": "#/components/schemas/SlackV1CallbackProcessor-Output" + }, + { + "$ref": "#/components/schemas/LoggingCallbackProcessor-Output" + }, + { + "$ref": "#/components/schemas/SetTitleCallbackProcessor-Output" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "integrations__github__github_v1_callback_processor__GithubV1CallbackProcessor-Output__1": "#/components/schemas/GithubV1CallbackProcessor-Output", + "integrations__slack__slack_v1_callback_processor__SlackV1CallbackProcessor-Output__1": "#/components/schemas/SlackV1CallbackProcessor-Output", + "openhands__app_server__event_callback__event_callback_models__LoggingCallbackProcessor-Output__1": "#/components/schemas/LoggingCallbackProcessor-Output", + "openhands__app_server__event_callback__set_title_callback_processor__SetTitleCallbackProcessor-Output__1": "#/components/schemas/SetTitleCallbackProcessor-Output" + } + } + }, + "EventFilter": { + "properties": { + "exclude_hidden": { + "type": "boolean", + "title": "Exclude Hidden", + "default": false + }, + "query": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Query" + }, + "include_types": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Include Types" + }, + "exclude_types": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Exclude Types" + }, + "source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source" + }, + "start_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Start Date" + }, + "end_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "End Date" + } + }, + "type": "object", + "title": "EventFilter" + }, + "EventPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/Event-Output" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "EventPage" + }, + "EventSortOrder": { + "type": "string", + "enum": [ + "TIMESTAMP", + "TIMESTAMP_DESC" + ], + "title": "EventSortOrder", + "description": "Enum for event sorting options." + }, + "ExposedUrl": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "url": { + "type": "string", + "title": "Url" + }, + "port": { + "type": "integer", + "title": "Port" + } + }, + "type": "object", + "required": [ + "name", + "url", + "port" + ], + "title": "ExposedUrl", + "description": "URL to access some named service within the container." + }, + "FallbackStrategy": { + "properties": { + "fallback_llms": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Fallback Llms", + "description": "Ordered list of LLM profile names to try on transient failure." + }, + "profile_store_dir": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "format": "path" + }, + { + "type": "null" + } + ], + "title": "Profile Store Dir", + "description": "Path to directory containing profiles. If not specified, defaults to `.openhands/profiles`." + } + }, + "type": "object", + "required": [ + "fallback_llms" + ], + "title": "FallbackStrategy", + "description": "Encapsulates fallback behavior for LLM calls.\n\nWhen the primary LLM fails with a transient error (after retries),\nthis strategy tries alternate LLMs loaded from LLMProfileStore profiles.\nFallback is per-call: each new request starts with the primary model." + }, + "FeedbackRequest": { + "properties": { + "conversation_id": { + "type": "string", + "title": "Conversation Id" + }, + "event_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Event Id" + }, + "rating": { + "type": "integer", + "maximum": 5.0, + "minimum": 1.0, + "title": "Rating" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason" + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata" + } + }, + "type": "object", + "required": [ + "conversation_id", + "rating" + ], + "title": "FeedbackRequest" + }, + "FileChange": { + "properties": { + "type": { + "$ref": "#/components/schemas/ActionType" + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content" + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content" + }, + "move_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Move Path" + } + }, + "type": "object", + "required": [ + "type" + ], + "title": "FileChange" + }, + "FileEditorAction-Input": { + "properties": { + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "undo_edit" + ], + "title": "Command", + "description": "The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`, `undo_edit`." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Absolute path to file or directory." + }, + "file_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Text", + "description": "Required parameter of `create` command, with the content of the file to be created." + }, + "old_str": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Str", + "description": "Required parameter of `str_replace` command containing the string in `path` to replace." + }, + "new_str": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Str", + "description": "Optional parameter of `str_replace` command containing the new string (if not given, no string will be added). Required parameter of `insert` command containing the string to insert." + }, + "insert_line": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Insert Line", + "description": "Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`." + }, + "view_range": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "View Range", + "description": "Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file." + }, + "kind": { + "type": "string", + "const": "FileEditorAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "path" + ], + "title": "FileEditorAction", + "description": "Schema for file editor operations." + }, + "FileEditorAction-Output": { + "properties": { + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "undo_edit" + ], + "title": "Command", + "description": "The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`, `undo_edit`." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Absolute path to file or directory." + }, + "file_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Text", + "description": "Required parameter of `create` command, with the content of the file to be created." + }, + "old_str": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Str", + "description": "Required parameter of `str_replace` command containing the string in `path` to replace." + }, + "new_str": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Str", + "description": "Optional parameter of `str_replace` command containing the new string (if not given, no string will be added). Required parameter of `insert` command containing the string to insert." + }, + "insert_line": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Insert Line", + "description": "Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`." + }, + "view_range": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "View Range", + "description": "Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file." + }, + "kind": { + "type": "string", + "const": "FileEditorAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "path", + "kind" + ], + "title": "FileEditorAction", + "description": "Schema for file editor operations." + }, + "FileEditorObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "undo_edit" + ], + "title": "Command", + "description": "The command that was run: `view`, `create`, `str_replace`, `insert`, or `undo_edit`." + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path", + "description": "The file path that was edited." + }, + "prev_exist": { + "type": "boolean", + "title": "Prev Exist", + "description": "Indicates if the file previously existed. If not, it was created.", + "default": true + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content", + "description": "The content of the file before the edit." + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content", + "description": "The content of the file after the edit." + }, + "kind": { + "type": "string", + "const": "FileEditorObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command" + ], + "title": "FileEditorObservation", + "description": "A ToolResult that can be rendered as a CLI output." + }, + "FileEditorObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "undo_edit" + ], + "title": "Command", + "description": "The command that was run: `view`, `create`, `str_replace`, `insert`, or `undo_edit`." + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path", + "description": "The file path that was edited." + }, + "prev_exist": { + "type": "boolean", + "title": "Prev Exist", + "description": "Indicates if the file previously existed. If not, it was created.", + "default": true + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content", + "description": "The content of the file before the edit." + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content", + "description": "The content of the file after the edit." + }, + "kind": { + "type": "string", + "const": "FileEditorObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "kind" + ], + "title": "FileEditorObservation", + "description": "A ToolResult that can be rendered as a CLI output." + }, + "FileEditorTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "FileEditorTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "FileEditorTool", + "description": "A ToolDefinition subclass that automatically initializes a FileEditorExecutor." + }, + "FileEditorTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "FileEditorTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "FileEditorTool", + "description": "A ToolDefinition subclass that automatically initializes a FileEditorExecutor." + }, + "FileEntry": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the file or directory" + }, + "path": { + "type": "string", + "title": "Path", + "description": "Absolute path to the file or directory" + }, + "is_directory": { + "type": "boolean", + "title": "Is Directory", + "description": "Whether this entry is a directory" + }, + "size": { + "type": "integer", + "title": "Size", + "description": "Size of the file in bytes (0 for directories)" + }, + "modified_time": { + "type": "string", + "format": "date-time", + "title": "Modified Time", + "description": "Last modified timestamp" + } + }, + "type": "object", + "required": [ + "name", + "path", + "is_directory", + "size", + "modified_time" + ], + "title": "FileEntry", + "description": "Information about a file or directory." + }, + "FinishAction-Input": { + "properties": { + "message": { + "type": "string", + "title": "Message", + "description": "Final message to send to the user." + }, + "kind": { + "type": "string", + "const": "FinishAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "message" + ], + "title": "FinishAction" + }, + "FinishAction-Output": { + "properties": { + "message": { + "type": "string", + "title": "Message", + "description": "Final message to send to the user." + }, + "kind": { + "type": "string", + "const": "FinishAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "message", + "kind" + ], + "title": "FinishAction" + }, + "FinishObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "kind": { + "type": "string", + "const": "FinishObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "FinishObservation", + "description": "Observation returned after finishing a task.\nThe FinishAction itself contains the message sent to the user so no\nextra fields are needed here." + }, + "FinishObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "kind": { + "type": "string", + "const": "FinishObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "FinishObservation", + "description": "Observation returned after finishing a task.\nThe FinishAction itself contains the message sent to the user so no\nextra fields are needed here." + }, + "FinishTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "FinishTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "FinishTool", + "description": "Tool for signaling the completion of a task or conversation." + }, + "FinishTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "FinishTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "FinishTool", + "description": "Tool for signaling the completion of a task or conversation." + }, + "GETCustomSecrets": { + "properties": { + "custom_secrets": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/CustomSecretWithoutValueModel" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Custom Secrets" + } + }, + "type": "object", + "title": "GETCustomSecrets", + "description": "Custom secrets names" + }, + "GETSettingsModel": { + "properties": { + "language": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Language" + }, + "agent": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Agent" + }, + "max_iterations": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Iterations" + }, + "security_analyzer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Security Analyzer" + }, + "confirmation_mode": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Confirmation Mode" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + }, + "llm_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Llm Api Key" + }, + "llm_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Base Url" + }, + "user_version": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "User Version" + }, + "remote_runtime_resource_factor": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Remote Runtime Resource Factor" + }, + "secrets_store": { + "$ref": "#/components/schemas/Secrets-Output" + }, + "enable_default_condenser": { + "type": "boolean", + "title": "Enable Default Condenser", + "default": true + }, + "enable_sound_notifications": { + "type": "boolean", + "title": "Enable Sound Notifications", + "default": false + }, + "enable_proactive_conversation_starters": { + "type": "boolean", + "title": "Enable Proactive Conversation Starters", + "default": true + }, + "enable_solvability_analysis": { + "type": "boolean", + "title": "Enable Solvability Analysis", + "default": true + }, + "user_consents_to_analytics": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "User Consents To Analytics" + }, + "sandbox_base_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Base Container Image" + }, + "sandbox_runtime_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Runtime Container Image" + }, + "mcp_config": { + "anyOf": [ + { + "$ref": "#/components/schemas/MCPConfig" + }, + { + "type": "null" + } + ] + }, + "disabled_skills": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Disabled Skills" + }, + "search_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Search Api Key" + }, + "sandbox_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Sandbox Api Key" + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task" + }, + "condenser_max_size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Condenser Max Size" + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + }, + "email_verified": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Email Verified" + }, + "git_user_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git User Name" + }, + "git_user_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git User Email" + }, + "v1_enabled": { + "type": "boolean", + "title": "V1 Enabled", + "default": true + }, + "sandbox_grouping_strategy": { + "$ref": "#/components/schemas/SandboxGroupingStrategy", + "default": "NO_GROUPING" + }, + "provider_tokens_set": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "propertyNames": { + "$ref": "#/components/schemas/ProviderType" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Provider Tokens Set" + }, + "llm_api_key_set": { + "type": "boolean", + "title": "Llm Api Key Set" + }, + "search_api_key_set": { + "type": "boolean", + "title": "Search Api Key Set", + "default": false + } + }, + "type": "object", + "required": [ + "llm_api_key_set" + ], + "title": "GETSettingsModel", + "description": "Settings with additional token data for the frontend" + }, + "GetCreditsResponse": { + "properties": { + "credits": { + "anyOf": [ + { + "type": "string", + "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" + }, + { + "type": "null" + } + ], + "title": "Credits" + } + }, + "type": "object", + "title": "GetCreditsResponse" + }, + "GitLabResourceType": { + "type": "string", + "enum": [ + "group", + "subgroup", + "project" + ], + "title": "GitLabResourceType" + }, + "GitLabResourcesResponse": { + "properties": { + "resources": { + "items": { + "$ref": "#/components/schemas/ResourceWithWebhookStatus" + }, + "type": "array", + "title": "Resources" + } + }, + "type": "object", + "required": [ + "resources" + ], + "title": "GitLabResourcesResponse" + }, + "GitOrgClaimRequest": { + "properties": { + "provider": { + "type": "string", + "title": "Provider" + }, + "git_organization": { + "type": "string", + "title": "Git Organization" + } + }, + "type": "object", + "required": [ + "provider", + "git_organization" + ], + "title": "GitOrgClaimRequest", + "description": "Request model for claiming a Git organization." + }, + "GitOrgClaimResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "org_id": { + "type": "string", + "title": "Org Id" + }, + "provider": { + "type": "string", + "title": "Provider" + }, + "git_organization": { + "type": "string", + "title": "Git Organization" + }, + "claimed_by": { + "type": "string", + "title": "Claimed By" + }, + "claimed_at": { + "type": "string", + "title": "Claimed At" + } + }, + "type": "object", + "required": [ + "id", + "org_id", + "provider", + "git_organization", + "claimed_by", + "claimed_at" + ], + "title": "GitOrgClaimResponse", + "description": "Response model for a Git organization claim." + }, + "GithubV1CallbackProcessor-Input": { + "properties": { + "github_view_data": { + "additionalProperties": true, + "type": "object", + "title": "Github View Data" + }, + "should_request_summary": { + "type": "boolean", + "title": "Should Request Summary", + "default": true + }, + "inline_pr_comment": { + "type": "boolean", + "title": "Inline Pr Comment", + "default": false + }, + "kind": { + "type": "string", + "const": "GithubV1CallbackProcessor", + "title": "Kind" + } + }, + "type": "object", + "title": "GithubV1CallbackProcessor", + "description": "Callback processor for GitHub V1 integrations." + }, + "GithubV1CallbackProcessor-Output": { + "properties": { + "github_view_data": { + "additionalProperties": true, + "type": "object", + "title": "Github View Data" + }, + "should_request_summary": { + "type": "boolean", + "title": "Should Request Summary", + "default": true + }, + "inline_pr_comment": { + "type": "boolean", + "title": "Inline Pr Comment", + "default": false + }, + "kind": { + "type": "string", + "const": "GithubV1CallbackProcessor", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "kind" + ], + "title": "GithubV1CallbackProcessor", + "description": "Callback processor for GitHub V1 integrations." + }, + "GlobAction-Input": { + "properties": { + "pattern": { + "type": "string", + "title": "Pattern", + "description": "The glob pattern to match files (e.g., \"**/*.js\", \"src/**/*.ts\")" + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path", + "description": "The directory (absolute path) to search in. Defaults to the current working directory." + }, + "kind": { + "type": "string", + "const": "GlobAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "pattern" + ], + "title": "GlobAction", + "description": "Schema for glob pattern matching operations." + }, + "GlobAction-Output": { + "properties": { + "pattern": { + "type": "string", + "title": "Pattern", + "description": "The glob pattern to match files (e.g., \"**/*.js\", \"src/**/*.ts\")" + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path", + "description": "The directory (absolute path) to search in. Defaults to the current working directory." + }, + "kind": { + "type": "string", + "const": "GlobAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "pattern", + "kind" + ], + "title": "GlobAction", + "description": "Schema for glob pattern matching operations." + }, + "GlobObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "files": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Files", + "description": "List of matching file paths sorted by modification time" + }, + "pattern": { + "type": "string", + "title": "Pattern", + "description": "The glob pattern that was used" + }, + "search_path": { + "type": "string", + "title": "Search Path", + "description": "The directory that was searched" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "Whether results were truncated to 100 files", + "default": false + }, + "kind": { + "type": "string", + "const": "GlobObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "files", + "pattern", + "search_path" + ], + "title": "GlobObservation", + "description": "Observation from glob pattern matching operations." + }, + "GlobObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "files": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Files", + "description": "List of matching file paths sorted by modification time" + }, + "pattern": { + "type": "string", + "title": "Pattern", + "description": "The glob pattern that was used" + }, + "search_path": { + "type": "string", + "title": "Search Path", + "description": "The directory that was searched" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "Whether results were truncated to 100 files", + "default": false + }, + "kind": { + "type": "string", + "const": "GlobObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "files", + "pattern", + "search_path", + "kind" + ], + "title": "GlobObservation", + "description": "Observation from glob pattern matching operations." + }, + "GlobTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "GlobTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "GlobTool", + "description": "A ToolDefinition subclass that automatically initializes a GlobExecutor." + }, + "GlobTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "GlobTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "GlobTool", + "description": "A ToolDefinition subclass that automatically initializes a GlobExecutor." + }, + "GraySwanAnalyzer": { + "properties": { + "history_limit": { + "type": "integer", + "title": "History Limit", + "description": "Number of recent events to include as context", + "default": 20 + }, + "max_message_chars": { + "type": "integer", + "title": "Max Message Chars", + "description": "Max characters for conversation processing", + "default": 30000 + }, + "timeout": { + "type": "number", + "title": "Timeout", + "description": "Request timeout in seconds", + "default": 30.0 + }, + "low_threshold": { + "type": "number", + "title": "Low Threshold", + "description": "Risk threshold for LOW classification (score <= threshold)", + "default": 0.3 + }, + "medium_threshold": { + "type": "number", + "title": "Medium Threshold", + "description": "Risk threshold for MEDIUM classification (score <= threshold)", + "default": 0.7 + }, + "api_url": { + "type": "string", + "title": "Api Url", + "description": "GraySwan Cygnal API endpoint", + "default": "https://api.grayswan.ai/cygnal/monitor" + }, + "api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Api Key", + "description": "GraySwan API key (via GRAYSWAN_API_KEY env var)" + }, + "policy_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Policy Id", + "description": "GraySwan policy ID (via GRAYSWAN_POLICY_ID env var)" + }, + "kind": { + "type": "string", + "const": "GraySwanAnalyzer", + "title": "Kind" + } + }, + "type": "object", + "title": "GraySwanAnalyzer", + "description": "Security analyzer using GraySwan's Cygnal API for AI safety monitoring.\n\nThis analyzer sends conversation history and pending actions to the GraySwan\nCygnal API for security analysis. The API returns a violation score which is\nmapped to SecurityRisk levels.\n\nEnvironment Variables:\n GRAYSWAN_API_KEY: Required API key for GraySwan authentication\n GRAYSWAN_POLICY_ID: Optional policy ID for custom GraySwan policy\n\nExample:\n >>> from openhands.sdk.security.grayswan import GraySwanAnalyzer\n >>> analyzer = GraySwanAnalyzer()\n >>> risk = analyzer.security_risk(action_event)" + }, + "GrepAction-Input": { + "properties": { + "pattern": { + "type": "string", + "title": "Pattern", + "description": "The regex pattern to search for in file contents" + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path", + "description": "The directory (absolute path) to search in. Defaults to the current working directory." + }, + "include": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Include", + "description": "Optional file pattern to filter which files to search (e.g., \"*.js\", \"*.{ts,tsx}\")" + }, + "kind": { + "type": "string", + "const": "GrepAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "pattern" + ], + "title": "GrepAction", + "description": "Schema for grep content search operations." + }, + "GrepAction-Output": { + "properties": { + "pattern": { + "type": "string", + "title": "Pattern", + "description": "The regex pattern to search for in file contents" + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path", + "description": "The directory (absolute path) to search in. Defaults to the current working directory." + }, + "include": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Include", + "description": "Optional file pattern to filter which files to search (e.g., \"*.js\", \"*.{ts,tsx}\")" + }, + "kind": { + "type": "string", + "const": "GrepAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "pattern", + "kind" + ], + "title": "GrepAction", + "description": "Schema for grep content search operations." + }, + "GrepObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "matches": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Matches", + "description": "List of file paths containing the pattern" + }, + "pattern": { + "type": "string", + "title": "Pattern", + "description": "The regex pattern that was used" + }, + "search_path": { + "type": "string", + "title": "Search Path", + "description": "The directory that was searched" + }, + "include_pattern": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Include Pattern", + "description": "The file pattern filter that was used" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "Whether results were truncated to 100 files", + "default": false + }, + "kind": { + "type": "string", + "const": "GrepObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "matches", + "pattern", + "search_path" + ], + "title": "GrepObservation", + "description": "Observation from grep content search operations." + }, + "GrepObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "matches": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Matches", + "description": "List of file paths containing the pattern" + }, + "pattern": { + "type": "string", + "title": "Pattern", + "description": "The regex pattern that was used" + }, + "search_path": { + "type": "string", + "title": "Search Path", + "description": "The directory that was searched" + }, + "include_pattern": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Include Pattern", + "description": "The file pattern filter that was used" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "Whether results were truncated to 100 files", + "default": false + }, + "kind": { + "type": "string", + "const": "GrepObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "matches", + "pattern", + "search_path", + "kind" + ], + "title": "GrepObservation", + "description": "Observation from grep content search operations." + }, + "GrepTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "GrepTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "GrepTool", + "description": "A ToolDefinition subclass that automatically initializes a GrepExecutor." + }, + "GrepTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "GrepTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "GrepTool", + "description": "A ToolDefinition subclass that automatically initializes a GrepExecutor." + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "HookConfig": { + "properties": { + "pre_tool_use": { + "items": { + "$ref": "#/components/schemas/HookMatcher" + }, + "type": "array", + "title": "Pre Tool Use", + "description": "Hooks that run before tool execution" + }, + "post_tool_use": { + "items": { + "$ref": "#/components/schemas/HookMatcher" + }, + "type": "array", + "title": "Post Tool Use", + "description": "Hooks that run after tool execution" + }, + "user_prompt_submit": { + "items": { + "$ref": "#/components/schemas/HookMatcher" + }, + "type": "array", + "title": "User Prompt Submit", + "description": "Hooks that run when user submits a prompt" + }, + "session_start": { + "items": { + "$ref": "#/components/schemas/HookMatcher" + }, + "type": "array", + "title": "Session Start", + "description": "Hooks that run when a session starts" + }, + "session_end": { + "items": { + "$ref": "#/components/schemas/HookMatcher" + }, + "type": "array", + "title": "Session End", + "description": "Hooks that run when a session ends" + }, + "stop": { + "items": { + "$ref": "#/components/schemas/HookMatcher" + }, + "type": "array", + "title": "Stop", + "description": "Hooks that run when the agent attempts to stop" + } + }, + "additionalProperties": false, + "type": "object", + "title": "HookConfig", + "description": "Configuration for all hooks.\n\nHooks can be configured either by loading from `.openhands/hooks.json` or\nby directly instantiating with typed fields:\n\n # Direct instantiation with typed fields (recommended):\n config = HookConfig(\n pre_tool_use=[\n HookMatcher(\n matcher=\"terminal\",\n hooks=[HookDefinition(command=\"block_dangerous.sh\")]\n )\n ]\n )\n\n # Load from JSON file:\n config = HookConfig.load(\".openhands/hooks.json\")" + }, + "HookDefinition": { + "properties": { + "type": { + "$ref": "#/components/schemas/HookType", + "default": "command" + }, + "command": { + "type": "string", + "title": "Command" + }, + "timeout": { + "type": "integer", + "title": "Timeout", + "default": 60 + }, + "async": { + "type": "boolean", + "title": "Async", + "default": false + } + }, + "type": "object", + "required": [ + "command" + ], + "title": "HookDefinition", + "description": "A single hook definition." + }, + "HookExecutionEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "description": "Source is always 'hook' for hook execution events", + "default": "hook" + }, + "hook_event_type": { + "type": "string", + "enum": [ + "PreToolUse", + "PostToolUse", + "UserPromptSubmit", + "SessionStart", + "SessionEnd", + "Stop" + ], + "title": "Hook Event Type", + "description": "The type of hook event that triggered this execution" + }, + "hook_command": { + "type": "string", + "title": "Hook Command", + "description": "The hook command that was executed" + }, + "tool_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Tool Name", + "description": "Tool name for PreToolUse/PostToolUse hooks" + }, + "success": { + "type": "boolean", + "title": "Success", + "description": "Whether the hook executed successfully" + }, + "blocked": { + "type": "boolean", + "title": "Blocked", + "description": "Whether the hook blocked the operation (exit code 2 or deny)", + "default": false + }, + "exit_code": { + "type": "integer", + "title": "Exit Code", + "description": "Exit code from the hook command" + }, + "stdout": { + "type": "string", + "title": "Stdout", + "description": "Standard output from the hook", + "default": "" + }, + "stderr": { + "type": "string", + "title": "Stderr", + "description": "Standard error from the hook", + "default": "" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason", + "description": "Reason provided by hook (for blocking)" + }, + "additional_context": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Additional Context", + "description": "Additional context injected by hook (e.g., for UserPromptSubmit)" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error", + "description": "Error message if hook execution failed" + }, + "action_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Action Id", + "description": "ID of the action this hook is associated with (PreToolUse/PostToolUse)" + }, + "message_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message Id", + "description": "ID of the message this hook is associated with (UserPromptSubmit)" + }, + "hook_input": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Hook Input", + "description": "The input data that was passed to the hook" + }, + "kind": { + "type": "string", + "const": "HookExecutionEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "hook_event_type", + "hook_command", + "success", + "exit_code" + ], + "title": "HookExecutionEvent", + "description": "Event emitted when a hook is executed.\n\nThis event provides observability into hook execution, including:\n- Which hook type was triggered\n- The command that was run\n- The result (success/blocked/error)\n- Any output from the hook\n\nThis allows clients to track hook execution via the event stream." + }, + "HookExecutionEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "description": "Source is always 'hook' for hook execution events", + "default": "hook" + }, + "hook_event_type": { + "type": "string", + "enum": [ + "PreToolUse", + "PostToolUse", + "UserPromptSubmit", + "SessionStart", + "SessionEnd", + "Stop" + ], + "title": "Hook Event Type", + "description": "The type of hook event that triggered this execution" + }, + "hook_command": { + "type": "string", + "title": "Hook Command", + "description": "The hook command that was executed" + }, + "tool_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Tool Name", + "description": "Tool name for PreToolUse/PostToolUse hooks" + }, + "success": { + "type": "boolean", + "title": "Success", + "description": "Whether the hook executed successfully" + }, + "blocked": { + "type": "boolean", + "title": "Blocked", + "description": "Whether the hook blocked the operation (exit code 2 or deny)", + "default": false + }, + "exit_code": { + "type": "integer", + "title": "Exit Code", + "description": "Exit code from the hook command" + }, + "stdout": { + "type": "string", + "title": "Stdout", + "description": "Standard output from the hook", + "default": "" + }, + "stderr": { + "type": "string", + "title": "Stderr", + "description": "Standard error from the hook", + "default": "" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason", + "description": "Reason provided by hook (for blocking)" + }, + "additional_context": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Additional Context", + "description": "Additional context injected by hook (e.g., for UserPromptSubmit)" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error", + "description": "Error message if hook execution failed" + }, + "action_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Action Id", + "description": "ID of the action this hook is associated with (PreToolUse/PostToolUse)" + }, + "message_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message Id", + "description": "ID of the message this hook is associated with (UserPromptSubmit)" + }, + "hook_input": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Hook Input", + "description": "The input data that was passed to the hook" + }, + "kind": { + "type": "string", + "const": "HookExecutionEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "hook_event_type", + "hook_command", + "success", + "exit_code", + "kind" + ], + "title": "HookExecutionEvent", + "description": "Event emitted when a hook is executed.\n\nThis event provides observability into hook execution, including:\n- Which hook type was triggered\n- The command that was run\n- The result (success/blocked/error)\n- Any output from the hook\n\nThis allows clients to track hook execution via the event stream." + }, + "HookMatcher": { + "properties": { + "matcher": { + "type": "string", + "title": "Matcher", + "default": "*" + }, + "hooks": { + "items": { + "$ref": "#/components/schemas/HookDefinition" + }, + "type": "array", + "title": "Hooks" + } + }, + "type": "object", + "title": "HookMatcher", + "description": "Matches events to hooks based on patterns.\n\nSupports exact match, wildcard (*), and regex (auto-detected or /pattern/)." + }, + "HookType": { + "type": "string", + "enum": [ + "command", + "prompt" + ], + "title": "HookType", + "description": "Types of hooks that can be executed." + }, + "Icon": { + "properties": { + "src": { + "type": "string", + "title": "Src" + }, + "mimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mimetype" + }, + "sizes": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Sizes" + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "src" + ], + "title": "Icon", + "description": "An icon for display in user interfaces." + }, + "ImageContent": { + "properties": { + "cache_prompt": { + "type": "boolean", + "title": "Cache Prompt", + "default": false + }, + "type": { + "type": "string", + "const": "image", + "title": "Type", + "default": "image" + }, + "image_urls": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Image Urls" + } + }, + "type": "object", + "required": [ + "image_urls" + ], + "title": "ImageContent" + }, + "InitSessionRequest": { + "properties": { + "repository": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Repository" + }, + "git_provider": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProviderType" + }, + { + "type": "null" + } + ] + }, + "selected_branch": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Branch" + }, + "initial_user_msg": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Initial User Msg" + }, + "image_urls": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Image Urls" + }, + "replay_json": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Replay Json" + }, + "suggested_task": { + "anyOf": [ + { + "$ref": "#/components/schemas/SuggestedTask" + }, + { + "type": "null" + } + ] + }, + "create_microagent": { + "anyOf": [ + { + "$ref": "#/components/schemas/CreateMicroagent" + }, + { + "type": "null" + } + ] + }, + "conversation_instructions": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Conversation Instructions" + }, + "mcp_config": { + "anyOf": [ + { + "$ref": "#/components/schemas/MCPConfig" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "type": "object", + "title": "InitSessionRequest" + }, + "InputMetadata": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the input parameter" + }, + "description": { + "type": "string", + "title": "Description", + "description": "Description of the input parameter" + } + }, + "type": "object", + "required": [ + "name", + "description" + ], + "title": "InputMetadata", + "description": "Metadata for task skill inputs." + }, + "InstallationPage": { + "properties": { + "items": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "InstallationPage", + "description": "Paginated response for installations.\n\nAttributes:\n items: List of installation IDs.\n next_page_id: ID for the next page, or None if there are no more pages." + }, + "InvitationCreate": { + "properties": { + "emails": { + "items": { + "type": "string", + "format": "email" + }, + "type": "array", + "title": "Emails" + }, + "role": { + "type": "string", + "title": "Role", + "default": "member" + } + }, + "type": "object", + "required": [ + "emails" + ], + "title": "InvitationCreate", + "description": "Request model for creating invitation(s)." + }, + "InvitationFailure": { + "properties": { + "email": { + "type": "string", + "title": "Email" + }, + "error": { + "type": "string", + "title": "Error" + } + }, + "type": "object", + "required": [ + "email", + "error" + ], + "title": "InvitationFailure", + "description": "Response model for a failed invitation." + }, + "InvitationResponse": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "email": { + "type": "string", + "title": "Email" + }, + "role": { + "type": "string", + "title": "Role" + }, + "status": { + "type": "string", + "title": "Status" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "expires_at": { + "type": "string", + "title": "Expires At" + }, + "inviter_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Inviter Email" + } + }, + "type": "object", + "required": [ + "id", + "email", + "role", + "status", + "created_at", + "expires_at" + ], + "title": "InvitationResponse", + "description": "Response model for invitation details." + }, + "IterativeRefinementConfig": { + "properties": { + "success_threshold": { + "type": "number", + "maximum": 1.0, + "minimum": 0.0, + "title": "Success Threshold", + "description": "Score threshold (0-1) to consider task successful.", + "default": 0.6 + }, + "max_iterations": { + "type": "integer", + "minimum": 1.0, + "title": "Max Iterations", + "description": "Maximum number of iterations before giving up.", + "default": 3 + } + }, + "type": "object", + "title": "IterativeRefinementConfig", + "description": "Configuration for iterative refinement based on critic feedback.\n\nWhen attached to a CriticBase, the Conversation.run() method will\nautomatically retry the task if the critic score is below the threshold.\n\nExample:\n critic = APIBasedCritic(\n server_url=\"...\",\n api_key=\"...\",\n model_name=\"critic\",\n iterative_refinement=IterativeRefinementConfig(\n success_threshold=0.7,\n max_iterations=3,\n ),\n )\n agent = Agent(llm=llm, tools=tools, critic=critic)\n conversation = Conversation(agent=agent, workspace=workspace)\n conversation.send_message(\"Create a calculator module...\")\n conversation.run() # Will automatically retry if critic score < 0.7" + }, + "JiraLinkCreate": { + "properties": { + "workspace_name": { + "type": "string", + "title": "Workspace Name", + "description": "Name of the Jira workspace to link to" + } + }, + "type": "object", + "required": [ + "workspace_name" + ], + "title": "JiraLinkCreate" + }, + "JiraUserResponse": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "keycloak_user_id": { + "type": "string", + "title": "Keycloak User Id" + }, + "jira_workspace_id": { + "type": "integer", + "title": "Jira Workspace Id" + }, + "status": { + "type": "string", + "title": "Status" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "title": "Updated At" + }, + "workspace": { + "$ref": "#/components/schemas/JiraWorkspaceResponse" + } + }, + "type": "object", + "required": [ + "id", + "keycloak_user_id", + "jira_workspace_id", + "status", + "created_at", + "updated_at", + "workspace" + ], + "title": "JiraUserResponse" + }, + "JiraValidateWorkspaceResponse": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "status": { + "type": "string", + "title": "Status" + }, + "message": { + "type": "string", + "title": "Message" + } + }, + "type": "object", + "required": [ + "name", + "status", + "message" + ], + "title": "JiraValidateWorkspaceResponse" + }, + "JiraWorkspaceCreate": { + "properties": { + "workspace_name": { + "type": "string", + "title": "Workspace Name", + "description": "Workspace display name" + }, + "webhook_secret": { + "type": "string", + "title": "Webhook Secret", + "description": "Webhook secret for verification" + }, + "svc_acc_email": { + "type": "string", + "title": "Svc Acc Email", + "description": "Service account email" + }, + "svc_acc_api_key": { + "type": "string", + "title": "Svc Acc Api Key", + "description": "Service account API token" + }, + "is_active": { + "type": "boolean", + "title": "Is Active", + "description": "Indicates if the workspace integration is active", + "default": false + } + }, + "type": "object", + "required": [ + "workspace_name", + "webhook_secret", + "svc_acc_email", + "svc_acc_api_key" + ], + "title": "JiraWorkspaceCreate" + }, + "JiraWorkspaceResponse": { + "properties": { + "id": { + "type": "integer", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "jira_cloud_id": { + "type": "string", + "title": "Jira Cloud Id" + }, + "status": { + "type": "string", + "title": "Status" + }, + "editable": { + "type": "boolean", + "title": "Editable" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "id", + "name", + "jira_cloud_id", + "status", + "editable", + "created_at", + "updated_at" + ], + "title": "JiraWorkspaceResponse" + }, + "KeywordTrigger": { + "properties": { + "type": { + "type": "string", + "const": "keyword", + "title": "Type", + "default": "keyword" + }, + "keywords": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Keywords" + } + }, + "type": "object", + "required": [ + "keywords" + ], + "title": "KeywordTrigger", + "description": "Trigger for keyword-based skills.\n\nThese skills are activated when specific keywords appear in the user's query." + }, + "LLM": { + "properties": { + "model": { + "type": "string", + "title": "Model", + "description": "Model name.", + "default": "claude-sonnet-4-20250514", + "openhands_settings": { + "depends_on": [], + "prominence": "critical" + } + }, + "api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Api Key", + "description": "API key.", + "openhands_settings": { + "depends_on": [], + "label": "API Key", + "prominence": "critical" + } + }, + "base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Base Url", + "description": "Custom base URL.", + "openhands_settings": { + "depends_on": [], + "prominence": "critical" + } + }, + "api_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Api Version", + "description": "API version (e.g., Azure)." + }, + "aws_access_key_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Aws Access Key Id" + }, + "aws_secret_access_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Aws Secret Access Key" + }, + "aws_session_token": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Aws Session Token" + }, + "aws_region_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Aws Region Name" + }, + "aws_profile_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Aws Profile Name" + }, + "aws_role_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Aws Role Name" + }, + "aws_session_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Aws Session Name" + }, + "aws_bedrock_runtime_endpoint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Aws Bedrock Runtime Endpoint" + }, + "openrouter_site_url": { + "type": "string", + "title": "Openrouter Site Url", + "default": "https://docs.all-hands.dev/" + }, + "openrouter_app_name": { + "type": "string", + "title": "Openrouter App Name", + "default": "OpenHands" + }, + "num_retries": { + "type": "integer", + "minimum": 0.0, + "title": "Num Retries", + "default": 5 + }, + "retry_multiplier": { + "type": "number", + "minimum": 0.0, + "title": "Retry Multiplier", + "default": 8.0 + }, + "retry_min_wait": { + "type": "integer", + "minimum": 0.0, + "title": "Retry Min Wait", + "default": 8 + }, + "retry_max_wait": { + "type": "integer", + "minimum": 0.0, + "title": "Retry Max Wait", + "default": 64 + }, + "timeout": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Timeout", + "description": "HTTP timeout in seconds. Default is 300s (5 minutes). Set to None to disable timeout (not recommended for production).", + "default": 300 + }, + "max_message_chars": { + "type": "integer", + "minimum": 1.0, + "title": "Max Message Chars", + "description": "Approx max chars in each event/content sent to the LLM.", + "default": 30000 + }, + "temperature": { + "anyOf": [ + { + "type": "number", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Temperature", + "description": "Sampling temperature for response generation. Defaults to None (uses provider default temperature). Set to 0.0 for deterministic outputs, or higher values (0.7-1.0) for more creative responses." + }, + "top_p": { + "anyOf": [ + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Top P", + "description": "Nucleus sampling parameter. Defaults to None (uses provider default). Set to a value between 0 and 1 to control diversity of outputs." + }, + "top_k": { + "anyOf": [ + { + "type": "number", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Top K" + }, + "max_input_tokens": { + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], + "title": "Max Input Tokens", + "description": "The maximum number of input tokens. Note that this is currently unused, and the value at runtime is actually the total tokens in OpenAI (e.g. 128,000 tokens for GPT-4)." + }, + "max_output_tokens": { + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], + "title": "Max Output Tokens", + "description": "The maximum number of output tokens. This is sent to the LLM." + }, + "model_canonical_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Canonical Name", + "description": "Optional canonical model name for feature registry lookups. The OpenHands SDK maintains a model feature registry that maps model names to capabilities (e.g., vision support, prompt caching, responses API support). When using proxied or aliased model identifiers, set this field to the canonical model name (e.g., 'openai/gpt-4o') to ensure correct capability detection. If not provided, the 'model' field will be used for capability lookups." + }, + "extra_headers": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Extra Headers", + "description": "Optional HTTP headers to forward to LiteLLM requests." + }, + "input_cost_per_token": { + "anyOf": [ + { + "type": "number", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Input Cost Per Token", + "description": "The cost per input token. This will available in logs for user." + }, + "output_cost_per_token": { + "anyOf": [ + { + "type": "number", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Output Cost Per Token", + "description": "The cost per output token. This will available in logs for user." + }, + "ollama_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Ollama Base Url" + }, + "stream": { + "type": "boolean", + "title": "Stream", + "description": "Enable streaming responses from the LLM. When enabled, the provided `on_token` callback in .completions and .responses will be invoked for each chunk of tokens.", + "default": false + }, + "drop_params": { + "type": "boolean", + "title": "Drop Params", + "default": true + }, + "modify_params": { + "type": "boolean", + "title": "Modify Params", + "description": "Modify params allows litellm to do transformations like adding a default message, when a message is empty.", + "default": true + }, + "disable_vision": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Disable Vision", + "description": "If model is vision capable, this option allows to disable image processing (useful for cost reduction)." + }, + "disable_stop_word": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Disable Stop Word", + "description": "Disable using of stop word.", + "default": false + }, + "caching_prompt": { + "type": "boolean", + "title": "Caching Prompt", + "description": "Enable caching of prompts.", + "default": true + }, + "log_completions": { + "type": "boolean", + "title": "Log Completions", + "description": "Enable logging of completions.", + "default": false + }, + "log_completions_folder": { + "type": "string", + "title": "Log Completions Folder", + "description": "The folder to log LLM completions to. Required if log_completions is True.", + "default": "logs/completions" + }, + "custom_tokenizer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Custom Tokenizer", + "description": "A custom tokenizer to use for token counting." + }, + "native_tool_calling": { + "type": "boolean", + "title": "Native Tool Calling", + "description": "Whether to use native tool calling.", + "default": true + }, + "force_string_serializer": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Force String Serializer", + "description": "Force using string content serializer when sending to LLM API. If None (default), auto-detect based on model. Useful for providers that do not support list content, like HuggingFace and Groq." + }, + "reasoning_effort": { + "anyOf": [ + { + "type": "string", + "enum": [ + "low", + "medium", + "high", + "xhigh", + "none" + ] + }, + { + "type": "null" + } + ], + "title": "Reasoning Effort", + "description": "The effort to put into reasoning. This is a string that can be one of 'low', 'medium', 'high', 'xhigh', or 'none'. Can apply to all reasoning models.", + "default": "high" + }, + "reasoning_summary": { + "anyOf": [ + { + "type": "string", + "enum": [ + "auto", + "concise", + "detailed" + ] + }, + { + "type": "null" + } + ], + "title": "Reasoning Summary", + "description": "The level of detail for reasoning summaries. This is a string that can be one of 'auto', 'concise', or 'detailed'. Requires verified OpenAI organization. Only sent when explicitly set." + }, + "enable_encrypted_reasoning": { + "type": "boolean", + "title": "Enable Encrypted Reasoning", + "description": "If True, ask for ['reasoning.encrypted_content'] in Responses API include.", + "default": true + }, + "prompt_cache_retention": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Prompt Cache Retention", + "description": "Retention policy for prompt cache. Only sent for supported models (GPT-5+ and GPT-4.1, excluding Azure deployments); explicitly stripped for all others.", + "default": "24h" + }, + "extended_thinking_budget": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Extended Thinking Budget", + "description": "The budget tokens for extended thinking, supported by Anthropic models.", + "default": 200000 + }, + "seed": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Seed", + "description": "The seed to use for random number generation." + }, + "safety_settings": { + "anyOf": [ + { + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Safety Settings", + "description": "No-op. Safety settings are no longer applied. Deprecated since v1.15.0 and scheduled for removal in v1.20.0.", + "deprecated": true + }, + "usage_id": { + "type": "string", + "title": "Usage Id", + "description": "Unique usage identifier for the LLM. Used for registry lookups, telemetry, and spend tracking.", + "default": "default" + }, + "litellm_extra_body": { + "additionalProperties": true, + "type": "object", + "title": "Litellm Extra Body", + "description": "Additional key-value pairs to pass to litellm's extra_body parameter. This is useful for custom inference endpoints that need additional parameters for configuration, routing, or advanced features. NOTE: Not all LLM providers support extra_body parameters. Some providers (e.g., OpenAI) may reject requests with unrecognized options. This is commonly supported by: - LiteLLM proxy servers (routing metadata, tracing) - vLLM endpoints (return_token_ids, etc.) - Custom inference clusters Examples: - Proxy routing: {'trace_version': '1.0.0', 'tags': ['agent:my-agent']} - vLLM features: {'return_token_ids': True}" + }, + "fallback_strategy": { + "anyOf": [ + { + "$ref": "#/components/schemas/FallbackStrategy" + }, + { + "type": "null" + } + ], + "description": "Optional fallback strategy for trying alternate LLMs on transient failure. Construct with FallbackStrategy(fallback_llms=[...]).Excluded from serialization; must be reconfigured after load." + } + }, + "type": "object", + "title": "LLM", + "description": "Language model interface for OpenHands agents.\n\nThe LLM class provides a unified interface for interacting with various\nlanguage models through the litellm library. It handles model configuration,\nAPI authentication, retry logic, and tool calling capabilities.\n\nAttributes:\n model: Model name (e.g., \"claude-sonnet-4-20250514\").\n api_key: API key for authentication.\n base_url: Custom API base URL.\n num_retries: Number of retry attempts for failed requests.\n timeout: Request timeout in seconds.\n\nExample:\n ```python\n from openhands.sdk import LLM\n from pydantic import SecretStr\n\n llm = LLM(\n model=\"claude-sonnet-4-20250514\",\n api_key=SecretStr(\"your-api-key\"),\n usage_id=\"my-agent\"\n )\n # Use with agent or conversation\n ```" + }, + "LLMCompletionLogEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "filename": { + "type": "string", + "title": "Filename", + "description": "The intended filename for this log (relative to log directory)" + }, + "log_data": { + "type": "string", + "title": "Log Data", + "description": "The JSON-encoded log data to be written to the file" + }, + "model_name": { + "type": "string", + "title": "Model Name", + "description": "The model name for context", + "default": "unknown" + }, + "usage_id": { + "type": "string", + "title": "Usage Id", + "description": "The LLM usage_id that produced this log", + "default": "default" + }, + "kind": { + "type": "string", + "const": "LLMCompletionLogEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "filename", + "log_data" + ], + "title": "LLMCompletionLogEvent", + "description": "Event containing LLM completion log data.\n\nWhen an LLM is configured with log_completions=True in a remote conversation,\nthis event streams the completion log data back to the client through WebSocket\ninstead of writing it to a file inside the Docker container." + }, + "LLMCompletionLogEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "filename": { + "type": "string", + "title": "Filename", + "description": "The intended filename for this log (relative to log directory)" + }, + "log_data": { + "type": "string", + "title": "Log Data", + "description": "The JSON-encoded log data to be written to the file" + }, + "model_name": { + "type": "string", + "title": "Model Name", + "description": "The model name for context", + "default": "unknown" + }, + "usage_id": { + "type": "string", + "title": "Usage Id", + "description": "The LLM usage_id that produced this log", + "default": "default" + }, + "kind": { + "type": "string", + "const": "LLMCompletionLogEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "filename", + "log_data", + "kind" + ], + "title": "LLMCompletionLogEvent", + "description": "Event containing LLM completion log data.\n\nWhen an LLM is configured with log_completions=True in a remote conversation,\nthis event streams the completion log data back to the client through WebSocket\ninstead of writing it to a file inside the Docker container." + }, + "LLMModel": { + "properties": { + "provider": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Provider", + "description": "The name of the provider for this model" + }, + "name": { + "type": "string", + "title": "Name", + "description": "The name of this model" + }, + "verified": { + "type": "boolean", + "title": "Verified", + "description": "Whether the model is verified by OpenHands", + "default": false + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "LLMModel", + "description": "LLM Model object for API responses.\n\nAttributes:\n name: The model name.\n verified: Whether the model is verified by OpenHands." + }, + "LLMModelPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/LLMModel" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "LLMModelPage", + "description": "Paginated response for LLM models.\n\nAttributes:\n items: List of LLM models in the current page.\n next_page_id: ID for the next page, or None if there are no more pages." + }, + "LLMSecurityAnalyzer": { + "properties": { + "kind": { + "type": "string", + "const": "LLMSecurityAnalyzer", + "title": "Kind" + } + }, + "type": "object", + "title": "LLMSecurityAnalyzer", + "description": "LLM-based security analyzer.\n\nThis analyzer respects the security_risk attribute that can be set by the LLM\nwhen generating actions, similar to OpenHands' LLMRiskAnalyzer.\n\nIt provides a lightweight security analysis approach that leverages the LLM's\nunderstanding of action context and potential risks." + }, + "LLMSummarizingCondenser": { + "properties": { + "llm": { + "$ref": "#/components/schemas/LLM" + }, + "max_size": { + "type": "integer", + "exclusiveMinimum": 0.0, + "title": "Max Size", + "default": 240 + }, + "max_tokens": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Tokens" + }, + "keep_first": { + "type": "integer", + "minimum": 0.0, + "title": "Keep First", + "default": 2 + }, + "minimum_progress": { + "type": "number", + "exclusiveMaximum": 1.0, + "exclusiveMinimum": 0.0, + "title": "Minimum Progress", + "default": 0.1 + }, + "hard_context_reset_max_retries": { + "type": "integer", + "exclusiveMinimum": 0.0, + "title": "Hard Context Reset Max Retries", + "default": 5 + }, + "hard_context_reset_context_scaling": { + "type": "number", + "exclusiveMaximum": 1.0, + "exclusiveMinimum": 0.0, + "title": "Hard Context Reset Context Scaling", + "default": 0.8 + }, + "kind": { + "type": "string", + "const": "LLMSummarizingCondenser", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "llm" + ], + "title": "LLMSummarizingCondenser", + "description": "LLM-based condenser that summarizes forgotten events.\n\nUses an independent LLM (stored in the `llm` attribute) for generating summaries\nof forgotten events. The optional `agent_llm` parameter passed to condense() is\nthe LLM used by the agent for token counting purposes, and you should not assume\nit is the same as the one defined in this condenser." + }, + "ListDirectoryAction-Input": { + "properties": { + "dir_path": { + "type": "string", + "title": "Dir Path", + "description": "The path to the directory to list. Defaults to current directory.", + "default": "." + }, + "recursive": { + "type": "boolean", + "title": "Recursive", + "description": "Whether to list subdirectories recursively (up to 2 levels).", + "default": false + }, + "kind": { + "type": "string", + "const": "ListDirectoryAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ListDirectoryAction", + "description": "Schema for list directory operation." + }, + "ListDirectoryAction-Output": { + "properties": { + "dir_path": { + "type": "string", + "title": "Dir Path", + "description": "The path to the directory to list. Defaults to current directory.", + "default": "." + }, + "recursive": { + "type": "boolean", + "title": "Recursive", + "description": "Whether to list subdirectories recursively (up to 2 levels).", + "default": false + }, + "kind": { + "type": "string", + "const": "ListDirectoryAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "ListDirectoryAction", + "description": "Schema for list directory operation." + }, + "ListDirectoryObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "dir_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Dir Path", + "description": "The directory path that was listed." + }, + "entries": { + "items": { + "$ref": "#/components/schemas/FileEntry" + }, + "type": "array", + "title": "Entries", + "description": "List of files and directories found." + }, + "total_count": { + "type": "integer", + "title": "Total Count", + "description": "Total number of entries found.", + "default": 0 + }, + "is_truncated": { + "type": "boolean", + "title": "Is Truncated", + "description": "Whether the listing was truncated due to too many entries.", + "default": false + }, + "kind": { + "type": "string", + "const": "ListDirectoryObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ListDirectoryObservation", + "description": "Observation from listing a directory." + }, + "ListDirectoryObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "dir_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Dir Path", + "description": "The directory path that was listed." + }, + "entries": { + "items": { + "$ref": "#/components/schemas/FileEntry" + }, + "type": "array", + "title": "Entries", + "description": "List of files and directories found." + }, + "total_count": { + "type": "integer", + "title": "Total Count", + "description": "Total number of entries found.", + "default": 0 + }, + "is_truncated": { + "type": "boolean", + "title": "Is Truncated", + "description": "Whether the listing was truncated due to too many entries.", + "default": false + }, + "kind": { + "type": "string", + "const": "ListDirectoryObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "ListDirectoryObservation", + "description": "Observation from listing a directory." + }, + "ListDirectoryTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "ListDirectoryTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "ListDirectoryTool", + "description": "Tool for listing directory contents with metadata." + }, + "ListDirectoryTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "ListDirectoryTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "ListDirectoryTool", + "description": "Tool for listing directory contents with metadata." + }, + "LlmApiKeyResponse": { + "properties": { + "key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Key" + } + }, + "type": "object", + "required": [ + "key" + ], + "title": "LlmApiKeyResponse" + }, + "LocalWorkspace": { + "properties": { + "working_dir": { + "type": "string", + "title": "Working Dir", + "description": "The working directory for agent operations and tool execution. Accepts both string paths and Path objects. Path objects are automatically converted to strings." + }, + "kind": { + "type": "string", + "const": "LocalWorkspace", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "working_dir" + ], + "title": "LocalWorkspace", + "description": "Local workspace implementation that operates on the host filesystem.\n\nLocalWorkspace provides direct access to the local filesystem and command execution\nenvironment. It's suitable for development and testing scenarios where the agent\nshould operate directly on the host system.\n\nExample:\n >>> workspace = LocalWorkspace(working_dir=\"/path/to/project\")\n >>> with workspace:\n ... result = workspace.execute_command(\"ls -la\")\n ... content = workspace.read_file(\"README.md\")" + }, + "LoggingCallbackProcessor-Input": { + "properties": { + "kind": { + "type": "string", + "const": "LoggingCallbackProcessor", + "title": "Kind" + } + }, + "type": "object", + "title": "LoggingCallbackProcessor", + "description": "Example implementation which logs callbacks." + }, + "LoggingCallbackProcessor-Output": { + "properties": { + "kind": { + "type": "string", + "const": "LoggingCallbackProcessor", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "kind" + ], + "title": "LoggingCallbackProcessor", + "description": "Example implementation which logs callbacks." + }, + "LookupSecret": { + "properties": { + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Optional description for this secret" + }, + "url": { + "type": "string", + "title": "Url" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Headers" + }, + "kind": { + "type": "string", + "const": "LookupSecret", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "url" + ], + "title": "LookupSecret", + "description": "A secret looked up from some external url" + }, + "MCPConfig": { + "properties": { + "sse_servers": { + "items": { + "$ref": "#/components/schemas/MCPSSEServerConfig" + }, + "type": "array", + "title": "Sse Servers" + }, + "stdio_servers": { + "items": { + "$ref": "#/components/schemas/MCPStdioServerConfig" + }, + "type": "array", + "title": "Stdio Servers" + }, + "shttp_servers": { + "items": { + "$ref": "#/components/schemas/MCPSHTTPServerConfig" + }, + "type": "array", + "title": "Shttp Servers" + } + }, + "additionalProperties": false, + "type": "object", + "title": "MCPConfig", + "description": "Configuration for MCP (Message Control Protocol) settings.\n\nAttributes:\n sse_servers: List of MCP SSE server configs\n stdio_servers: List of MCP stdio server configs. These servers will be added to the MCP Router running inside runtime container.\n shttp_servers: List of MCP HTTP server configs." + }, + "MCPSHTTPServerConfig": { + "properties": { + "url": { + "type": "string", + "title": "Url" + }, + "api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Api Key" + }, + "timeout": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Timeout", + "default": 60 + } + }, + "type": "object", + "required": [ + "url" + ], + "title": "MCPSHTTPServerConfig", + "description": "Configuration for a MCP server that uses SHTTP.\n\nAttributes:\n url: The server URL\n api_key: Optional API key for authentication\n timeout: Timeout in seconds for tool calls (default: 60s)" + }, + "MCPSSEServerConfig": { + "properties": { + "url": { + "type": "string", + "title": "Url" + }, + "api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Api Key" + } + }, + "type": "object", + "required": [ + "url" + ], + "title": "MCPSSEServerConfig", + "description": "Configuration for a single MCP server.\n\nAttributes:\n url: The server URL\n api_key: Optional API key for authentication" + }, + "MCPStdioServerConfig": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "command": { + "type": "string", + "title": "Command" + }, + "args": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Args" + }, + "env": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Env" + } + }, + "type": "object", + "required": [ + "name", + "command" + ], + "title": "MCPStdioServerConfig", + "description": "Configuration for a MCP server that uses stdio.\n\nAttributes:\n name: The name of the server\n command: The command to run the server\n args: The arguments to pass to the server\n env: The environment variables to set for the server" + }, + "MCPToolAction-Input": { + "properties": { + "data": { + "additionalProperties": true, + "type": "object", + "title": "Data", + "description": "Dynamic data fields from the tool call" + }, + "kind": { + "type": "string", + "const": "MCPToolAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "MCPToolAction", + "description": "Schema for MCP input action.\n\nIt is just a thin wrapper around raw JSON and does\nnot do any validation.\n\nValidation will be performed by MCPTool.__call__\nby constructing dynamically created Pydantic model\nfrom the MCP tool input schema." + }, + "MCPToolAction-Output": { + "properties": { + "data": { + "additionalProperties": true, + "type": "object", + "title": "Data", + "description": "Dynamic data fields from the tool call" + }, + "kind": { + "type": "string", + "const": "MCPToolAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "MCPToolAction", + "description": "Schema for MCP input action.\n\nIt is just a thin wrapper around raw JSON and does\nnot do any validation.\n\nValidation will be performed by MCPTool.__call__\nby constructing dynamically created Pydantic model\nfrom the MCP tool input schema." + }, + "MCPToolDefinition-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "mcp_tool": { + "$ref": "#/components/schemas/mcp__types__Tool", + "description": "The MCP tool definition." + }, + "kind": { + "type": "string", + "const": "MCPToolDefinition", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "mcp_tool" + ], + "title": "MCPToolDefinition", + "description": "MCP Tool that wraps an MCP client and provides tool functionality." + }, + "MCPToolDefinition-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "mcp_tool": { + "$ref": "#/components/schemas/Tool-Output", + "description": "The MCP tool definition." + }, + "kind": { + "type": "string", + "const": "MCPToolDefinition", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "mcp_tool", + "kind", + "title" + ], + "title": "MCPToolDefinition", + "description": "MCP Tool that wraps an MCP client and provides tool functionality." + }, + "MCPToolObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "Name of the tool that was called" + }, + "kind": { + "type": "string", + "const": "MCPToolObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_name" + ], + "title": "MCPToolObservation", + "description": "Observation from MCP tool execution." + }, + "MCPToolObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "Name of the tool that was called" + }, + "kind": { + "type": "string", + "const": "MCPToolObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_name", + "kind" + ], + "title": "MCPToolObservation", + "description": "Observation from MCP tool execution." + }, + "MeResponse": { + "properties": { + "org_id": { + "type": "string", + "title": "Org Id" + }, + "user_id": { + "type": "string", + "title": "User Id" + }, + "email": { + "type": "string", + "title": "Email" + }, + "role": { + "type": "string", + "title": "Role" + }, + "llm_api_key": { + "type": "string", + "title": "Llm Api Key" + }, + "max_iterations": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Iterations" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + }, + "llm_api_key_for_byor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Api Key For Byor" + }, + "llm_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Base Url" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + "type": "object", + "required": [ + "org_id", + "user_id", + "email", + "role", + "llm_api_key" + ], + "title": "MeResponse", + "description": "Response model for the current user's membership in an organization." + }, + "Message": { + "properties": { + "role": { + "type": "string", + "enum": [ + "user", + "system", + "assistant", + "tool" + ], + "title": "Role" + }, + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content" + }, + "tool_calls": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/MessageToolCall" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Tool Calls" + }, + "tool_call_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Tool Call Id" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "reasoning_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reasoning Content", + "description": "Intermediate reasoning/thinking content from reasoning models" + }, + "thinking_blocks": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ThinkingBlock" + }, + { + "$ref": "#/components/schemas/RedactedThinkingBlock" + } + ] + }, + "type": "array", + "title": "Thinking Blocks", + "description": "Raw Anthropic thinking blocks for extended thinking feature" + }, + "responses_reasoning_item": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReasoningItemModel" + }, + { + "type": "null" + } + ], + "description": "OpenAI Responses reasoning item from model output" + } + }, + "type": "object", + "required": [ + "role" + ], + "title": "Message" + }, + "MessageEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source" + }, + "llm_message": { + "$ref": "#/components/schemas/Message", + "description": "The exact LLM message for this message event" + }, + "llm_response_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Response Id", + "description": "Completion or Response ID of the LLM response that generated this eventIf the source != 'agent', this field is None" + }, + "activated_skills": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Activated Skills", + "description": "List of activated skill name" + }, + "extended_content": { + "items": { + "$ref": "#/components/schemas/TextContent" + }, + "type": "array", + "title": "Extended Content", + "description": "List of content added by agent context" + }, + "sender": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sender", + "description": "Optional identifier of the sender. Can be used to track message origin in multi-agent scenarios." + }, + "critic_result": { + "anyOf": [ + { + "$ref": "#/components/schemas/CriticResult" + }, + { + "type": "null" + } + ], + "description": "Optional critic evaluation of this message and preceding history." + }, + "kind": { + "type": "string", + "const": "MessageEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "llm_message" + ], + "title": "MessageEvent", + "description": "Message from either agent or user.\n\nThis is originally the \"MessageAction\", but it suppose not to be tool call." + }, + "MessageEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source" + }, + "llm_message": { + "$ref": "#/components/schemas/Message", + "description": "The exact LLM message for this message event" + }, + "llm_response_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Response Id", + "description": "Completion or Response ID of the LLM response that generated this eventIf the source != 'agent', this field is None" + }, + "activated_skills": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Activated Skills", + "description": "List of activated skill name" + }, + "extended_content": { + "items": { + "$ref": "#/components/schemas/TextContent" + }, + "type": "array", + "title": "Extended Content", + "description": "List of content added by agent context" + }, + "sender": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sender", + "description": "Optional identifier of the sender. Can be used to track message origin in multi-agent scenarios." + }, + "critic_result": { + "anyOf": [ + { + "$ref": "#/components/schemas/CriticResult" + }, + { + "type": "null" + } + ], + "description": "Optional critic evaluation of this message and preceding history." + }, + "kind": { + "type": "string", + "const": "MessageEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "llm_message", + "kind" + ], + "title": "MessageEvent", + "description": "Message from either agent or user.\n\nThis is originally the \"MessageAction\", but it suppose not to be tool call." + }, + "MessageResponse": { + "properties": { + "message": { + "type": "string", + "title": "Message" + } + }, + "type": "object", + "required": [ + "message" + ], + "title": "MessageResponse" + }, + "MessageToolCall": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Canonical tool call id" + }, + "name": { + "type": "string", + "title": "Name", + "description": "Tool/function name" + }, + "arguments": { + "type": "string", + "title": "Arguments", + "description": "JSON string of arguments" + }, + "origin": { + "type": "string", + "enum": [ + "completion", + "responses" + ], + "title": "Origin", + "description": "Originating API family" + } + }, + "type": "object", + "required": [ + "id", + "name", + "arguments", + "origin" + ], + "title": "MessageToolCall", + "description": "Transport-agnostic tool call representation.\n\nOne canonical id is used for linking across actions/observations and\nfor Responses function_call_output call_id." + }, + "Metrics": { + "properties": { + "model_name": { + "type": "string", + "title": "Model Name", + "description": "Name of the model", + "default": "default" + }, + "accumulated_cost": { + "type": "number", + "minimum": 0.0, + "title": "Accumulated Cost", + "description": "Total accumulated cost, must be non-negative", + "default": 0.0 + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task", + "description": "Maximum budget per task" + }, + "accumulated_token_usage": { + "anyOf": [ + { + "$ref": "#/components/schemas/TokenUsage" + }, + { + "type": "null" + } + ], + "description": "Accumulated token usage across all calls" + }, + "costs": { + "items": { + "$ref": "#/components/schemas/Cost" + }, + "type": "array", + "title": "Costs", + "description": "List of individual costs" + }, + "response_latencies": { + "items": { + "$ref": "#/components/schemas/ResponseLatency" + }, + "type": "array", + "title": "Response Latencies", + "description": "List of response latencies" + }, + "token_usages": { + "items": { + "$ref": "#/components/schemas/TokenUsage" + }, + "type": "array", + "title": "Token Usages", + "description": "List of token usage records" + } + }, + "type": "object", + "title": "Metrics", + "description": "Metrics class can record various metrics during running and evaluation.\nWe track:\n - accumulated_cost and costs\n - max_budget_per_task (budget limit)\n - A list of ResponseLatency\n - A list of TokenUsage (one per call)." + }, + "MetricsSnapshot": { + "properties": { + "model_name": { + "type": "string", + "title": "Model Name", + "description": "Name of the model", + "default": "default" + }, + "accumulated_cost": { + "type": "number", + "minimum": 0.0, + "title": "Accumulated Cost", + "description": "Total accumulated cost, must be non-negative", + "default": 0.0 + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task", + "description": "Maximum budget per task" + }, + "accumulated_token_usage": { + "anyOf": [ + { + "$ref": "#/components/schemas/TokenUsage" + }, + { + "type": "null" + } + ], + "description": "Accumulated token usage across all calls" + } + }, + "type": "object", + "title": "MetricsSnapshot", + "description": "A snapshot of metrics at a point in time.\n\nDoes not include lists of individual costs, latencies, or token usages." + }, + "MicroagentContentResponse": { + "properties": { + "content": { + "type": "string", + "title": "Content" + }, + "path": { + "type": "string", + "title": "Path" + }, + "triggers": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Triggers", + "default": [] + }, + "git_provider": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git Provider" + } + }, + "type": "object", + "required": [ + "content", + "path" + ], + "title": "MicroagentContentResponse", + "description": "Response model for individual microagent content endpoint." + }, + "MicroagentResponse": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "path": { + "type": "string", + "title": "Path" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "name", + "path", + "created_at" + ], + "title": "MicroagentResponse", + "description": "Response model for microagents endpoint.\n\nNote: This model only includes basic metadata that can be determined\nwithout parsing microagent content. Use the separate content API\nto get detailed microagent information." + }, + "ModelsResponse": { + "properties": { + "models": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Models" + }, + "verified_models": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Verified Models" + }, + "verified_providers": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Verified Providers" + }, + "default_model": { + "type": "string", + "title": "Default Model" + } + }, + "type": "object", + "required": [ + "models", + "verified_models", + "verified_providers", + "default_model" + ], + "title": "ModelsResponse", + "description": "Structured response from the models endpoint.\n\n* ``models`` \u2014 flat list of ``provider/model`` strings (same shape as\n before, but bare names are now properly prefixed).\n* ``verified_models`` \u2014 model names (without provider prefix) that\n OpenHands has verified to work well.\n* ``verified_providers`` \u2014 provider names shown in the \"Verified\"\n section of the model selector.\n* ``default_model`` \u2014 the recommended default model id." + }, + "NeverConfirm": { + "properties": { + "kind": { + "type": "string", + "const": "NeverConfirm", + "title": "Kind" + } + }, + "type": "object", + "title": "NeverConfirm" + }, + "NoOpCondenser": { + "properties": { + "kind": { + "type": "string", + "const": "NoOpCondenser", + "title": "Kind" + } + }, + "type": "object", + "title": "NoOpCondenser", + "description": "Simple condenser that returns a view un-manipulated.\n\nPrimarily intended for testing purposes." + }, + "Observation-Input": { + "oneOf": [ + { + "$ref": "#/components/schemas/MCPToolObservation-Input" + }, + { + "$ref": "#/components/schemas/FinishObservation-Input" + }, + { + "$ref": "#/components/schemas/ThinkObservation-Input" + }, + { + "$ref": "#/components/schemas/ApplyPatchObservation-Input" + }, + { + "$ref": "#/components/schemas/BrowserObservation-Input" + }, + { + "$ref": "#/components/schemas/DelegateObservation-Input" + }, + { + "$ref": "#/components/schemas/FileEditorObservation-Input" + }, + { + "$ref": "#/components/schemas/EditObservation-Input" + }, + { + "$ref": "#/components/schemas/ListDirectoryObservation-Input" + }, + { + "$ref": "#/components/schemas/ReadFileObservation-Input" + }, + { + "$ref": "#/components/schemas/WriteFileObservation-Input" + }, + { + "$ref": "#/components/schemas/GlobObservation-Input" + }, + { + "$ref": "#/components/schemas/GrepObservation-Input" + }, + { + "$ref": "#/components/schemas/PlanningFileEditorObservation-Input" + }, + { + "$ref": "#/components/schemas/TaskObservation-Input" + }, + { + "$ref": "#/components/schemas/TaskTrackerObservation-Input" + }, + { + "$ref": "#/components/schemas/TerminalObservation-Input" + }, + { + "$ref": "#/components/schemas/ConsultTomObservation-Input" + }, + { + "$ref": "#/components/schemas/SleeptimeComputeObservation-Input" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__mcp__definition__MCPToolObservation-Input__1": "#/components/schemas/MCPToolObservation-Input", + "openhands__sdk__tool__builtins__finish__FinishObservation-Input__1": "#/components/schemas/FinishObservation-Input", + "openhands__sdk__tool__builtins__think__ThinkObservation-Input__1": "#/components/schemas/ThinkObservation-Input", + "openhands__tools__apply_patch__definition__ApplyPatchObservation-Input__1": "#/components/schemas/ApplyPatchObservation-Input", + "openhands__tools__browser_use__definition__BrowserObservation-Input__1": "#/components/schemas/BrowserObservation-Input", + "openhands__tools__delegate__definition__DelegateObservation-Input__1": "#/components/schemas/DelegateObservation-Input", + "openhands__tools__file_editor__definition__FileEditorObservation-Input__1": "#/components/schemas/FileEditorObservation-Input", + "openhands__tools__gemini__edit__definition__EditObservation-Input__1": "#/components/schemas/EditObservation-Input", + "openhands__tools__gemini__list_directory__definition__ListDirectoryObservation-Input__1": "#/components/schemas/ListDirectoryObservation-Input", + "openhands__tools__gemini__read_file__definition__ReadFileObservation-Input__1": "#/components/schemas/ReadFileObservation-Input", + "openhands__tools__gemini__write_file__definition__WriteFileObservation-Input__1": "#/components/schemas/WriteFileObservation-Input", + "openhands__tools__glob__definition__GlobObservation-Input__1": "#/components/schemas/GlobObservation-Input", + "openhands__tools__grep__definition__GrepObservation-Input__1": "#/components/schemas/GrepObservation-Input", + "openhands__tools__planning_file_editor__definition__PlanningFileEditorObservation-Input__1": "#/components/schemas/PlanningFileEditorObservation-Input", + "openhands__tools__task__definition__TaskObservation-Input__1": "#/components/schemas/TaskObservation-Input", + "openhands__tools__task_tracker__definition__TaskTrackerObservation-Input__1": "#/components/schemas/TaskTrackerObservation-Input", + "openhands__tools__terminal__definition__TerminalObservation-Input__1": "#/components/schemas/TerminalObservation-Input", + "openhands__tools__tom_consult__definition__ConsultTomObservation-Input__1": "#/components/schemas/ConsultTomObservation-Input", + "openhands__tools__tom_consult__definition__SleeptimeComputeObservation-Input__1": "#/components/schemas/SleeptimeComputeObservation-Input" + } + } + }, + "Observation-Output": { + "oneOf": [ + { + "$ref": "#/components/schemas/MCPToolObservation-Output" + }, + { + "$ref": "#/components/schemas/FinishObservation-Output" + }, + { + "$ref": "#/components/schemas/ThinkObservation-Output" + }, + { + "$ref": "#/components/schemas/ApplyPatchObservation-Output" + }, + { + "$ref": "#/components/schemas/BrowserObservation-Output" + }, + { + "$ref": "#/components/schemas/DelegateObservation-Output" + }, + { + "$ref": "#/components/schemas/FileEditorObservation-Output" + }, + { + "$ref": "#/components/schemas/EditObservation-Output" + }, + { + "$ref": "#/components/schemas/ListDirectoryObservation-Output" + }, + { + "$ref": "#/components/schemas/ReadFileObservation-Output" + }, + { + "$ref": "#/components/schemas/WriteFileObservation-Output" + }, + { + "$ref": "#/components/schemas/GlobObservation-Output" + }, + { + "$ref": "#/components/schemas/GrepObservation-Output" + }, + { + "$ref": "#/components/schemas/PlanningFileEditorObservation-Output" + }, + { + "$ref": "#/components/schemas/TaskObservation-Output" + }, + { + "$ref": "#/components/schemas/TaskTrackerObservation-Output" + }, + { + "$ref": "#/components/schemas/TerminalObservation-Output" + }, + { + "$ref": "#/components/schemas/ConsultTomObservation-Output" + }, + { + "$ref": "#/components/schemas/SleeptimeComputeObservation-Output" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__mcp__definition__MCPToolObservation-Output__1": "#/components/schemas/MCPToolObservation-Output", + "openhands__sdk__tool__builtins__finish__FinishObservation-Output__1": "#/components/schemas/FinishObservation-Output", + "openhands__sdk__tool__builtins__think__ThinkObservation-Output__1": "#/components/schemas/ThinkObservation-Output", + "openhands__tools__apply_patch__definition__ApplyPatchObservation-Output__1": "#/components/schemas/ApplyPatchObservation-Output", + "openhands__tools__browser_use__definition__BrowserObservation-Output__1": "#/components/schemas/BrowserObservation-Output", + "openhands__tools__delegate__definition__DelegateObservation-Output__1": "#/components/schemas/DelegateObservation-Output", + "openhands__tools__file_editor__definition__FileEditorObservation-Output__1": "#/components/schemas/FileEditorObservation-Output", + "openhands__tools__gemini__edit__definition__EditObservation-Output__1": "#/components/schemas/EditObservation-Output", + "openhands__tools__gemini__list_directory__definition__ListDirectoryObservation-Output__1": "#/components/schemas/ListDirectoryObservation-Output", + "openhands__tools__gemini__read_file__definition__ReadFileObservation-Output__1": "#/components/schemas/ReadFileObservation-Output", + "openhands__tools__gemini__write_file__definition__WriteFileObservation-Output__1": "#/components/schemas/WriteFileObservation-Output", + "openhands__tools__glob__definition__GlobObservation-Output__1": "#/components/schemas/GlobObservation-Output", + "openhands__tools__grep__definition__GrepObservation-Output__1": "#/components/schemas/GrepObservation-Output", + "openhands__tools__planning_file_editor__definition__PlanningFileEditorObservation-Output__1": "#/components/schemas/PlanningFileEditorObservation-Output", + "openhands__tools__task__definition__TaskObservation-Output__1": "#/components/schemas/TaskObservation-Output", + "openhands__tools__task_tracker__definition__TaskTrackerObservation-Output__1": "#/components/schemas/TaskTrackerObservation-Output", + "openhands__tools__terminal__definition__TerminalObservation-Output__1": "#/components/schemas/TerminalObservation-Output", + "openhands__tools__tom_consult__definition__ConsultTomObservation-Output__1": "#/components/schemas/ConsultTomObservation-Output", + "openhands__tools__tom_consult__definition__SleeptimeComputeObservation-Output__1": "#/components/schemas/SleeptimeComputeObservation-Output" + } + } + }, + "ObservationEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "The tool name that this observation is responding to" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id", + "description": "The tool call id that this observation is responding to" + }, + "observation": { + "$ref": "#/components/schemas/Observation-Input", + "description": "The observation (tool call) sent to LLM" + }, + "action_id": { + "type": "string", + "title": "Action Id", + "description": "The action id that this observation is responding to" + }, + "kind": { + "type": "string", + "const": "ObservationEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_name", + "tool_call_id", + "observation", + "action_id" + ], + "title": "ObservationEvent" + }, + "ObservationEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "The tool name that this observation is responding to" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id", + "description": "The tool call id that this observation is responding to" + }, + "observation": { + "$ref": "#/components/schemas/Observation-Output", + "description": "The observation (tool call) sent to LLM" + }, + "action_id": { + "type": "string", + "title": "Action Id", + "description": "The action id that this observation is responding to" + }, + "kind": { + "type": "string", + "const": "ObservationEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_name", + "tool_call_id", + "observation", + "action_id", + "kind" + ], + "title": "ObservationEvent" + }, + "OrgAppSettingsResponse": { + "properties": { + "enable_proactive_conversation_starters": { + "type": "boolean", + "title": "Enable Proactive Conversation Starters", + "default": true + }, + "enable_solvability_analysis": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Solvability Analysis" + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task" + } + }, + "type": "object", + "title": "OrgAppSettingsResponse", + "description": "Response model for organization app settings." + }, + "OrgAppSettingsUpdate": { + "properties": { + "enable_proactive_conversation_starters": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Proactive Conversation Starters" + }, + "enable_solvability_analysis": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Solvability Analysis" + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task" + } + }, + "type": "object", + "title": "OrgAppSettingsUpdate", + "description": "Request model for updating organization app settings." + }, + "OrgCreate": { + "properties": { + "name": { + "type": "string", + "maxLength": 255, + "minLength": 1, + "title": "Name" + }, + "contact_name": { + "type": "string", + "title": "Contact Name" + }, + "contact_email": { + "type": "string", + "format": "email", + "title": "Contact Email" + } + }, + "type": "object", + "required": [ + "name", + "contact_name", + "contact_email" + ], + "title": "OrgCreate", + "description": "Request model for creating a new organization." + }, + "OrgLLMSettingsResponse": { + "properties": { + "default_llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Model" + }, + "default_llm_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Base Url" + }, + "search_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Search Api Key" + }, + "agent": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Agent" + }, + "confirmation_mode": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Confirmation Mode" + }, + "security_analyzer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Security Analyzer" + }, + "enable_default_condenser": { + "type": "boolean", + "title": "Enable Default Condenser", + "default": true + }, + "condenser_max_size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Condenser Max Size" + }, + "default_max_iterations": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Default Max Iterations" + } + }, + "type": "object", + "title": "OrgLLMSettingsResponse", + "description": "Response model for organization LLM settings." + }, + "OrgLLMSettingsUpdate": { + "properties": { + "default_llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Model" + }, + "default_llm_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Base Url" + }, + "search_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Search Api Key" + }, + "agent": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Agent" + }, + "confirmation_mode": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Confirmation Mode" + }, + "security_analyzer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Security Analyzer" + }, + "enable_default_condenser": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Default Condenser" + }, + "condenser_max_size": { + "anyOf": [ + { + "type": "integer", + "minimum": 20.0 + }, + { + "type": "null" + } + ], + "title": "Condenser Max Size" + }, + "default_max_iterations": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Default Max Iterations" + }, + "llm_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Api Key" + } + }, + "type": "object", + "title": "OrgLLMSettingsUpdate", + "description": "Request model for updating organization LLM settings.\n\nField names match Org DB columns exactly." + }, + "OrgMemberFinancialPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/OrgMemberFinancialResponse" + }, + "type": "array", + "title": "Items" + }, + "current_page": { + "type": "integer", + "title": "Current Page", + "default": 1 + }, + "per_page": { + "type": "integer", + "title": "Per Page", + "default": 10 + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "OrgMemberFinancialPage", + "description": "Paginated response for organization member financial data." + }, + "OrgMemberFinancialResponse": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id" + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + }, + "lifetime_spend": { + "type": "number", + "title": "Lifetime Spend" + }, + "current_budget": { + "type": "number", + "title": "Current Budget" + }, + "max_budget": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget" + } + }, + "type": "object", + "required": [ + "user_id", + "email", + "lifetime_spend", + "current_budget", + "max_budget" + ], + "title": "OrgMemberFinancialResponse", + "description": "Financial data for a single organization member." + }, + "OrgMemberPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/OrgMemberResponse" + }, + "type": "array", + "title": "Items" + }, + "current_page": { + "type": "integer", + "title": "Current Page", + "default": 1 + }, + "per_page": { + "type": "integer", + "title": "Per Page", + "default": 10 + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "OrgMemberPage", + "description": "Paginated response for organization members." + }, + "OrgMemberResponse": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id" + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + }, + "role_id": { + "type": "integer", + "title": "Role Id" + }, + "role": { + "type": "string", + "title": "Role" + }, + "role_rank": { + "type": "integer", + "title": "Role Rank" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + "type": "object", + "required": [ + "user_id", + "email", + "role_id", + "role", + "role_rank", + "status" + ], + "title": "OrgMemberResponse", + "description": "Response model for a single organization member." + }, + "OrgMemberUpdate": { + "properties": { + "role": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Role" + } + }, + "type": "object", + "title": "OrgMemberUpdate", + "description": "Request model for updating an organization member." + }, + "OrgPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/OrgResponse" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + }, + "current_org_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Current Org Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "OrgPage", + "description": "Paginated response model for organization list." + }, + "OrgResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "contact_name": { + "type": "string", + "title": "Contact Name" + }, + "contact_email": { + "type": "string", + "title": "Contact Email" + }, + "conversation_expiration": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Conversation Expiration" + }, + "agent": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Agent" + }, + "default_max_iterations": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Default Max Iterations" + }, + "security_analyzer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Security Analyzer" + }, + "confirmation_mode": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Confirmation Mode" + }, + "default_llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Model" + }, + "default_llm_api_key_for_byor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Api Key For Byor" + }, + "default_llm_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Base Url" + }, + "remote_runtime_resource_factor": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Remote Runtime Resource Factor" + }, + "enable_default_condenser": { + "type": "boolean", + "title": "Enable Default Condenser", + "default": true + }, + "billing_margin": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Billing Margin" + }, + "enable_proactive_conversation_starters": { + "type": "boolean", + "title": "Enable Proactive Conversation Starters", + "default": true + }, + "sandbox_base_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Base Container Image" + }, + "sandbox_runtime_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Runtime Container Image" + }, + "org_version": { + "type": "integer", + "title": "Org Version", + "default": 0 + }, + "mcp_config": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Mcp Config" + }, + "search_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Search Api Key" + }, + "sandbox_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Api Key" + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task" + }, + "enable_solvability_analysis": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Solvability Analysis" + }, + "v1_enabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "V1 Enabled" + }, + "credits": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Credits" + }, + "is_personal": { + "type": "boolean", + "title": "Is Personal", + "default": false + } + }, + "type": "object", + "required": [ + "id", + "name", + "contact_name", + "contact_email" + ], + "title": "OrgResponse", + "description": "Response model for organization." + }, + "OrgUpdate": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "contact_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Contact Name" + }, + "contact_email": { + "anyOf": [ + { + "type": "string", + "format": "email" + }, + { + "type": "null" + } + ], + "title": "Contact Email" + }, + "conversation_expiration": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Conversation Expiration" + }, + "default_max_iterations": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Default Max Iterations" + }, + "remote_runtime_resource_factor": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Remote Runtime Resource Factor" + }, + "billing_margin": { + "anyOf": [ + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Billing Margin" + }, + "enable_proactive_conversation_starters": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Proactive Conversation Starters" + }, + "sandbox_base_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Base Container Image" + }, + "sandbox_runtime_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Runtime Container Image" + }, + "sandbox_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Api Key" + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number", + "exclusiveMinimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task" + }, + "enable_solvability_analysis": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Solvability Analysis" + }, + "v1_enabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "V1 Enabled" + }, + "default_llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Model" + }, + "default_llm_api_key_for_byor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Api Key For Byor" + }, + "default_llm_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Default Llm Base Url" + }, + "search_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Search Api Key" + }, + "security_analyzer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Security Analyzer" + }, + "agent": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Agent" + }, + "confirmation_mode": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Confirmation Mode" + }, + "enable_default_condenser": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Default Condenser" + }, + "condenser_max_size": { + "anyOf": [ + { + "type": "integer", + "minimum": 20.0 + }, + { + "type": "null" + } + ], + "title": "Condenser Max Size" + } + }, + "type": "object", + "title": "OrgUpdate", + "description": "Request model for updating an organization." + }, + "OwnerType": { + "type": "string", + "enum": [ + "user", + "organization" + ], + "title": "OwnerType" + }, + "POSTProviderModel": { + "properties": { + "mcp_config": { + "anyOf": [ + { + "$ref": "#/components/schemas/MCPConfig" + }, + { + "type": "null" + } + ] + }, + "provider_tokens": { + "additionalProperties": { + "$ref": "#/components/schemas/ProviderToken" + }, + "propertyNames": { + "$ref": "#/components/schemas/ProviderType" + }, + "type": "object", + "title": "Provider Tokens", + "default": {} + } + }, + "type": "object", + "title": "POSTProviderModel", + "description": "Settings for POST requests" + }, + "POSTUploadFilesModel": { + "properties": { + "file_urls": { + "items": { + "type": "string" + }, + "type": "array", + "title": "File Urls" + }, + "skipped_files": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Skipped Files" + } + }, + "type": "object", + "required": [ + "file_urls", + "skipped_files" + ], + "title": "POSTUploadFilesModel", + "description": "Upload files response model" + }, + "PaginatedBranchesResponse": { + "properties": { + "branches": { + "items": { + "$ref": "#/components/schemas/Branch" + }, + "type": "array", + "title": "Branches" + }, + "has_next_page": { + "type": "boolean", + "title": "Has Next Page" + }, + "current_page": { + "type": "integer", + "title": "Current Page" + }, + "per_page": { + "type": "integer", + "title": "Per Page" + }, + "total_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Total Count" + } + }, + "type": "object", + "required": [ + "branches", + "has_next_page", + "current_page", + "per_page" + ], + "title": "PaginatedBranchesResponse" + }, + "PassCritic": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "finish_and_message", + "all_actions" + ], + "title": "Mode", + "description": "When to run critic evaluation:\n- 'finish_and_message': Evaluate on FinishAction and agent MessageEvent (default, minimal performance impact)\n- 'all_actions': Evaluate after every agent action (WARNING: significantly slower due to API calls on each action)", + "default": "finish_and_message" + }, + "iterative_refinement": { + "anyOf": [ + { + "$ref": "#/components/schemas/IterativeRefinementConfig" + }, + { + "type": "null" + } + ], + "description": "Optional configuration for iterative refinement. When set, Conversation.run() will automatically retry the task if the critic score is below the success_threshold, up to max_iterations." + }, + "kind": { + "type": "string", + "const": "PassCritic", + "title": "Kind" + } + }, + "type": "object", + "title": "PassCritic", + "description": "Critic that always returns success.\n\nThis critic can be used when no evaluation is needed or when\nall instances should be considered successful regardless of their output." + }, + "PauseEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "user" + }, + "kind": { + "type": "string", + "const": "PauseEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "PauseEvent", + "description": "Event indicating that the agent execution was paused by user request." + }, + "PauseEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "user" + }, + "kind": { + "type": "string", + "const": "PauseEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "PauseEvent", + "description": "Event indicating that the agent execution was paused by user request." + }, + "PendingMessageResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "queued": { + "type": "boolean", + "title": "Queued" + }, + "position": { + "type": "integer", + "title": "Position", + "description": "Position in the queue (1-based)" + } + }, + "type": "object", + "required": [ + "id", + "queued", + "position" + ], + "title": "PendingMessageResponse", + "description": "Response when queueing a pending message." + }, + "PipelineCondenser": { + "properties": { + "condensers": { + "items": { + "$ref": "#/components/schemas/CondenserBase" + }, + "type": "array", + "title": "Condensers" + }, + "kind": { + "type": "string", + "const": "PipelineCondenser", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "condensers" + ], + "title": "PipelineCondenser", + "description": "A condenser that applies a sequence of condensers in order.\n\nAll condensers are defined primarily by their `condense` method, which takes a\n`View` and an optional `agent_llm` parameter, returning either a new `View` or a\n`Condensation` event. That means we can chain multiple condensers together by\npassing `View`s along and exiting early if any condenser returns a `Condensation`.\n\nFor example:\n\n # Use the pipeline condenser to chain multiple other condensers together\n condenser = PipelineCondenser(condensers=[\n CondenserA(...),\n CondenserB(...),\n CondenserC(...),\n ])\n\n result = condenser.condense(view, agent_llm=agent_llm)\n\n # Doing the same thing without the pipeline condenser requires more boilerplate\n # for the monadic chaining\n other_result = view\n\n if isinstance(other_result, View):\n other_result = CondenserA(...).condense(other_result, agent_llm=agent_llm)\n\n if isinstance(other_result, View):\n other_result = CondenserB(...).condense(other_result, agent_llm=agent_llm)\n\n if isinstance(other_result, View):\n other_result = CondenserC(...).condense(other_result, agent_llm=agent_llm)\n\n assert result == other_result" + }, + "PlanningFileEditorAction-Input": { + "properties": { + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "undo_edit" + ], + "title": "Command", + "description": "The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`, `undo_edit`." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Absolute path to file or directory." + }, + "file_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Text", + "description": "Required parameter of `create` command, with the content of the file to be created." + }, + "old_str": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Str", + "description": "Required parameter of `str_replace` command containing the string in `path` to replace." + }, + "new_str": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Str", + "description": "Optional parameter of `str_replace` command containing the new string (if not given, no string will be added). Required parameter of `insert` command containing the string to insert." + }, + "insert_line": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Insert Line", + "description": "Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`." + }, + "view_range": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "View Range", + "description": "Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file." + }, + "kind": { + "type": "string", + "const": "PlanningFileEditorAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "path" + ], + "title": "PlanningFileEditorAction", + "description": "Schema for planning file editor operations.\n\nInherits from FileEditorAction but restricts editing to PLAN.md only.\nAllows viewing any file but only editing PLAN.md." + }, + "PlanningFileEditorAction-Output": { + "properties": { + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "undo_edit" + ], + "title": "Command", + "description": "The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`, `undo_edit`." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Absolute path to file or directory." + }, + "file_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Text", + "description": "Required parameter of `create` command, with the content of the file to be created." + }, + "old_str": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Str", + "description": "Required parameter of `str_replace` command containing the string in `path` to replace." + }, + "new_str": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Str", + "description": "Optional parameter of `str_replace` command containing the new string (if not given, no string will be added). Required parameter of `insert` command containing the string to insert." + }, + "insert_line": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Insert Line", + "description": "Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`." + }, + "view_range": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "View Range", + "description": "Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file." + }, + "kind": { + "type": "string", + "const": "PlanningFileEditorAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "path", + "kind" + ], + "title": "PlanningFileEditorAction", + "description": "Schema for planning file editor operations.\n\nInherits from FileEditorAction but restricts editing to PLAN.md only.\nAllows viewing any file but only editing PLAN.md." + }, + "PlanningFileEditorObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "undo_edit" + ], + "title": "Command", + "description": "The command that was run: `view`, `create`, `str_replace`, `insert`, or `undo_edit`." + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path", + "description": "The file path that was edited." + }, + "prev_exist": { + "type": "boolean", + "title": "Prev Exist", + "description": "Indicates if the file previously existed. If not, it was created.", + "default": true + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content", + "description": "The content of the file before the edit." + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content", + "description": "The content of the file after the edit." + }, + "kind": { + "type": "string", + "const": "PlanningFileEditorObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command" + ], + "title": "PlanningFileEditorObservation", + "description": "Observation from planning file editor operations.\n\nInherits from FileEditorObservation - same structure, just different type." + }, + "PlanningFileEditorObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "type": "string", + "enum": [ + "view", + "create", + "str_replace", + "insert", + "undo_edit" + ], + "title": "Command", + "description": "The command that was run: `view`, `create`, `str_replace`, `insert`, or `undo_edit`." + }, + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Path", + "description": "The file path that was edited." + }, + "prev_exist": { + "type": "boolean", + "title": "Prev Exist", + "description": "Indicates if the file previously existed. If not, it was created.", + "default": true + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content", + "description": "The content of the file before the edit." + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content", + "description": "The content of the file after the edit." + }, + "kind": { + "type": "string", + "const": "PlanningFileEditorObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "kind" + ], + "title": "PlanningFileEditorObservation", + "description": "Observation from planning file editor operations.\n\nInherits from FileEditorObservation - same structure, just different type." + }, + "PlanningFileEditorTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "PlanningFileEditorTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "PlanningFileEditorTool", + "description": "A planning file editor tool with read-all, edit-PLAN.md-only access." + }, + "PlanningFileEditorTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "PlanningFileEditorTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "PlanningFileEditorTool", + "description": "A planning file editor tool with read-all, edit-PLAN.md-only access." + }, + "PluginSpec": { + "properties": { + "source": { + "type": "string", + "title": "Source", + "description": "Plugin source: 'github:owner/repo', any git URL, or local path" + }, + "ref": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Ref", + "description": "Optional branch, tag, or commit (only for git sources)" + }, + "repo_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Repo Path", + "description": "Subdirectory path within the git repository (e.g., 'plugins/my-plugin' for monorepos). Only relevant for git sources, not local paths." + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Parameters", + "description": "User-provided values for plugin input parameters" + } + }, + "type": "object", + "required": [ + "source" + ], + "title": "PluginSpec", + "description": "Specification for loading a plugin into a conversation.\n\nExtends SDK's PluginSource with user-provided plugin configuration parameters.\nInherits source, ref, and repo_path fields along with their validation." + }, + "ProviderToken": { + "properties": { + "token": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Token" + }, + "user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Id" + }, + "host": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Host" + } + }, + "type": "object", + "title": "ProviderToken" + }, + "ProviderType": { + "type": "string", + "enum": [ + "github", + "gitlab", + "bitbucket", + "bitbucket_data_center", + "forgejo", + "azure_devops", + "enterprise_sso" + ], + "title": "ProviderType" + }, + "ProvidersSetModel": { + "properties": { + "providers_set": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/ProviderType" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Providers Set" + } + }, + "type": "object", + "title": "ProvidersSetModel" + }, + "ReadFileAction-Input": { + "properties": { + "file_path": { + "type": "string", + "title": "File Path", + "description": "The path to the file to read." + }, + "offset": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Offset", + "description": "Optional: The 0-based line number to start reading from. Use for paginating through large files." + }, + "limit": { + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], + "title": "Limit", + "description": "Optional: Maximum number of lines to read. Use with 'offset' to paginate through large files." + }, + "kind": { + "type": "string", + "const": "ReadFileAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "file_path" + ], + "title": "ReadFileAction", + "description": "Schema for read file operation." + }, + "ReadFileAction-Output": { + "properties": { + "file_path": { + "type": "string", + "title": "File Path", + "description": "The path to the file to read." + }, + "offset": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Offset", + "description": "Optional: The 0-based line number to start reading from. Use for paginating through large files." + }, + "limit": { + "anyOf": [ + { + "type": "integer", + "minimum": 1.0 + }, + { + "type": "null" + } + ], + "title": "Limit", + "description": "Optional: Maximum number of lines to read. Use with 'offset' to paginate through large files." + }, + "kind": { + "type": "string", + "const": "ReadFileAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "file_path", + "kind" + ], + "title": "ReadFileAction", + "description": "Schema for read file operation." + }, + "ReadFileObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "file_path": { + "type": "string", + "title": "File Path", + "description": "The file path that was read." + }, + "file_content": { + "type": "string", + "title": "File Content", + "description": "The content read from the file.", + "default": "" + }, + "is_truncated": { + "type": "boolean", + "title": "Is Truncated", + "description": "Whether the content was truncated due to size limits.", + "default": false + }, + "lines_shown": { + "anyOf": [ + { + "prefixItems": [ + { + "type": "integer" + }, + { + "type": "integer" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 + }, + { + "type": "null" + } + ], + "title": "Lines Shown", + "description": "If truncated, the range of lines shown (start, end) - 1-indexed." + }, + "total_lines": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Total Lines", + "description": "Total number of lines in the file." + }, + "kind": { + "type": "string", + "const": "ReadFileObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "file_path" + ], + "title": "ReadFileObservation", + "description": "Observation from reading a file." + }, + "ReadFileObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "file_path": { + "type": "string", + "title": "File Path", + "description": "The file path that was read." + }, + "file_content": { + "type": "string", + "title": "File Content", + "description": "The content read from the file.", + "default": "" + }, + "is_truncated": { + "type": "boolean", + "title": "Is Truncated", + "description": "Whether the content was truncated due to size limits.", + "default": false + }, + "lines_shown": { + "anyOf": [ + { + "prefixItems": [ + { + "type": "integer" + }, + { + "type": "integer" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 + }, + { + "type": "null" + } + ], + "title": "Lines Shown", + "description": "If truncated, the range of lines shown (start, end) - 1-indexed." + }, + "total_lines": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Total Lines", + "description": "Total number of lines in the file." + }, + "kind": { + "type": "string", + "const": "ReadFileObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "file_path", + "kind" + ], + "title": "ReadFileObservation", + "description": "Observation from reading a file." + }, + "ReadFileTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "ReadFileTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "ReadFileTool", + "description": "Tool for reading file contents with pagination support." + }, + "ReadFileTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "ReadFileTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "ReadFileTool", + "description": "Tool for reading file contents with pagination support." + }, + "ReasoningItemModel": { + "properties": { + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "summary": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Summary" + }, + "content": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Content" + }, + "encrypted_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Encrypted Content" + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status" + } + }, + "type": "object", + "title": "ReasoningItemModel", + "description": "OpenAI Responses reasoning item (non-stream, subset we consume).\n\nDo not log or render encrypted_content." + }, + "RedactedThinkingBlock": { + "properties": { + "type": { + "type": "string", + "const": "redacted_thinking", + "title": "Type", + "default": "redacted_thinking" + }, + "data": { + "type": "string", + "title": "Data", + "description": "The redacted thinking content" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "RedactedThinkingBlock", + "description": "Redacted thinking block for previous responses without extended thinking.\n\nThis is used as a placeholder for assistant messages that were generated\nbefore extended thinking was enabled." + }, + "ReinstallWebhookRequest": { + "properties": { + "resource": { + "$ref": "#/components/schemas/ResourceIdentifier" + } + }, + "type": "object", + "required": [ + "resource" + ], + "title": "ReinstallWebhookRequest" + }, + "RemoteWorkspace": { + "properties": { + "working_dir": { + "type": "string", + "title": "Working Dir", + "description": "The working directory for agent operations and tool execution." + }, + "host": { + "type": "string", + "title": "Host", + "description": "The remote host URL for the workspace." + }, + "api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Api Key", + "description": "API key for authenticating with the remote host." + }, + "read_timeout": { + "type": "number", + "title": "Read Timeout", + "description": "Timeout in seconds for reading operations of httpx.Client.", + "default": 600.0 + }, + "max_connections": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Connections", + "description": "Maximum number of connections for httpx.Client. None means no limit, useful for running many conversations in parallel." + }, + "kind": { + "type": "string", + "const": "RemoteWorkspace", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "working_dir", + "host" + ], + "title": "RemoteWorkspace", + "description": "Remote workspace implementation that connects to an OpenHands agent server.\n\nRemoteWorkspace provides access to a sandboxed environment running on a remote\nOpenHands agent server. This is the recommended approach for production deployments\nas it provides better isolation and security.\n\nExample:\n >>> workspace = RemoteWorkspace(\n ... host=\"https://agent-server.example.com\",\n ... working_dir=\"/workspace\"\n ... )\n >>> with workspace:\n ... result = workspace.execute_command(\"ls -la\")\n ... content = workspace.read_file(\"README.md\")" + }, + "Repository": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "full_name": { + "type": "string", + "title": "Full Name" + }, + "git_provider": { + "$ref": "#/components/schemas/ProviderType" + }, + "is_public": { + "type": "boolean", + "title": "Is Public" + }, + "stargazers_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Stargazers Count" + }, + "link_header": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Link Header" + }, + "pushed_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Pushed At" + }, + "owner_type": { + "anyOf": [ + { + "$ref": "#/components/schemas/OwnerType" + }, + { + "type": "null" + } + ] + }, + "main_branch": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Main Branch" + } + }, + "type": "object", + "required": [ + "id", + "full_name", + "git_provider", + "is_public" + ], + "title": "Repository" + }, + "RepositoryPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/Repository" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "RepositoryPage", + "description": "Paginated response for repositories.\n\nAttributes:\n items: List of repositories in the current page.\n next_page_id: ID for the next page, or None if there are no more pages." + }, + "ResendEmailVerificationRequest": { + "properties": { + "user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Id" + }, + "is_auth_flow": { + "type": "boolean", + "title": "Is Auth Flow", + "default": false + } + }, + "type": "object", + "title": "ResendEmailVerificationRequest" + }, + "ResourceIdentifier": { + "properties": { + "type": { + "$ref": "#/components/schemas/GitLabResourceType" + }, + "id": { + "type": "string", + "title": "Id" + } + }, + "type": "object", + "required": [ + "type", + "id" + ], + "title": "ResourceIdentifier" + }, + "ResourceInstallationResult": { + "properties": { + "resource_id": { + "type": "string", + "title": "Resource Id" + }, + "resource_type": { + "type": "string", + "title": "Resource Type" + }, + "success": { + "type": "boolean", + "title": "Success" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error" + } + }, + "type": "object", + "required": [ + "resource_id", + "resource_type", + "success", + "error" + ], + "title": "ResourceInstallationResult" + }, + "ResourceWithWebhookStatus": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "full_path": { + "type": "string", + "title": "Full Path" + }, + "type": { + "type": "string", + "title": "Type" + }, + "webhook_installed": { + "type": "boolean", + "title": "Webhook Installed" + }, + "webhook_uuid": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Webhook Uuid" + }, + "last_synced": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Synced" + } + }, + "type": "object", + "required": [ + "id", + "name", + "full_path", + "type", + "webhook_installed", + "webhook_uuid", + "last_synced" + ], + "title": "ResourceWithWebhookStatus" + }, + "ResponseLatency": { + "properties": { + "model": { + "type": "string", + "title": "Model" + }, + "latency": { + "type": "number", + "minimum": 0.0, + "title": "Latency", + "description": "Latency must be non-negative" + }, + "response_id": { + "type": "string", + "title": "Response Id" + } + }, + "type": "object", + "required": [ + "model", + "latency", + "response_id" + ], + "title": "ResponseLatency", + "description": "Metric tracking the round-trip time per completion call." + }, + "RuntimeStatus": { + "type": "string", + "enum": [ + "STATUS$STOPPED", + "STATUS$BUILDING_RUNTIME", + "STATUS$STARTING_RUNTIME", + "STATUS$RUNTIME_STARTED", + "STATUS$SETTING_UP_WORKSPACE", + "STATUS$SETTING_UP_GIT_HOOKS", + "STATUS$READY", + "STATUS$ERROR", + "STATUS$ERROR_RUNTIME_DISCONNECTED", + "STATUS$ERROR_LLM_AUTHENTICATION", + "STATUS$ERROR_LLM_SERVICE_UNAVAILABLE", + "STATUS$ERROR_LLM_INTERNAL_SERVER_ERROR", + "STATUS$ERROR_LLM_OUT_OF_CREDITS", + "STATUS$ERROR_LLM_CONTENT_POLICY_VIOLATION", + "CHAT_INTERFACE$AGENT_RATE_LIMITED_STOPPED_MESSAGE", + "STATUS$GIT_PROVIDER_AUTHENTICATION_ERROR", + "STATUS$LLM_RETRY", + "STATUS$ERROR_MEMORY" + ], + "title": "RuntimeStatus" + }, + "SaasUserInfo": { + "properties": { + "language": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Language" + }, + "agent": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Agent" + }, + "max_iterations": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Iterations" + }, + "security_analyzer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Security Analyzer" + }, + "confirmation_mode": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Confirmation Mode" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + }, + "llm_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Llm Api Key" + }, + "llm_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Base Url" + }, + "user_version": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "User Version" + }, + "remote_runtime_resource_factor": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Remote Runtime Resource Factor" + }, + "secrets_store": { + "$ref": "#/components/schemas/Secrets-Output" + }, + "enable_default_condenser": { + "type": "boolean", + "title": "Enable Default Condenser", + "default": true + }, + "enable_sound_notifications": { + "type": "boolean", + "title": "Enable Sound Notifications", + "default": false + }, + "enable_proactive_conversation_starters": { + "type": "boolean", + "title": "Enable Proactive Conversation Starters", + "default": true + }, + "enable_solvability_analysis": { + "type": "boolean", + "title": "Enable Solvability Analysis", + "default": true + }, + "user_consents_to_analytics": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "User Consents To Analytics" + }, + "sandbox_base_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Base Container Image" + }, + "sandbox_runtime_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Runtime Container Image" + }, + "mcp_config": { + "anyOf": [ + { + "$ref": "#/components/schemas/MCPConfig" + }, + { + "type": "null" + } + ] + }, + "disabled_skills": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Disabled Skills" + }, + "search_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Search Api Key" + }, + "sandbox_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Sandbox Api Key" + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task" + }, + "condenser_max_size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Condenser Max Size" + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + }, + "email_verified": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Email Verified" + }, + "git_user_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git User Name" + }, + "git_user_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git User Email" + }, + "v1_enabled": { + "type": "boolean", + "title": "V1 Enabled", + "default": true + }, + "sandbox_grouping_strategy": { + "$ref": "#/components/schemas/SandboxGroupingStrategy", + "default": "NO_GROUPING" + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Id" + }, + "org_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Org Id" + }, + "org_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Org Name" + }, + "role": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Role" + }, + "permissions": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Permissions" + } + }, + "type": "object", + "title": "SaasUserInfo", + "description": "User info model for SAAS mode with organization context.\n\nExtends the base UserInfo with SAAS-specific fields for organization\nmembership, role, and permissions." + }, + "SandboxGroupingStrategy": { + "type": "string", + "enum": [ + "NO_GROUPING", + "GROUP_BY_NEWEST", + "LEAST_RECENTLY_USED", + "FEWEST_CONVERSATIONS", + "ADD_TO_ANY" + ], + "title": "SandboxGroupingStrategy", + "description": "Strategy for grouping conversations within sandboxes." + }, + "SandboxInfo": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "created_by_user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created By User Id" + }, + "sandbox_spec_id": { + "type": "string", + "title": "Sandbox Spec Id" + }, + "status": { + "$ref": "#/components/schemas/SandboxStatus" + }, + "session_api_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Api Key", + "description": "Key to access sandbox, to be added as an `X-Session-API-Key` header in each request. In cases where the sandbox statues is STARTING or PAUSED, or the current user does not have full access the session_api_key will be None." + }, + "exposed_urls": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/ExposedUrl" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Exposed Urls", + "description": "URLs exposed by the sandbox (App server, Vscode, etc...)Sandboxes with a status STARTING / PAUSED / ERROR may not return urls." + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "id", + "created_by_user_id", + "sandbox_spec_id", + "status", + "session_api_key" + ], + "title": "SandboxInfo", + "description": "Information about a sandbox." + }, + "SandboxPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/SandboxInfo" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "SandboxPage" + }, + "SandboxSpecInfo": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "command": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Command" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "initial_env": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Initial Env", + "description": "Initial Environment Variables" + }, + "working_dir": { + "type": "string", + "title": "Working Dir", + "default": "/home/openhands/workspace" + } + }, + "type": "object", + "required": [ + "id", + "command" + ], + "title": "SandboxSpecInfo", + "description": "A template for creating a Sandbox (e.g: A Docker Image vs Container)." + }, + "SandboxSpecInfoPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/SandboxSpecInfo" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "SandboxSpecInfoPage" + }, + "SandboxStatus": { + "type": "string", + "enum": [ + "STARTING", + "RUNNING", + "PAUSED", + "ERROR", + "MISSING" + ], + "title": "SandboxStatus" + }, + "SecretNameItem": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "The secret name/key" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Optional description of the secret" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "SecretNameItem", + "description": "A secret's name and optional description (value NOT included)." + }, + "SecretNamesResponse": { + "properties": { + "secrets": { + "items": { + "$ref": "#/components/schemas/SecretNameItem" + }, + "type": "array", + "title": "Secrets", + "description": "Available secrets" + } + }, + "type": "object", + "title": "SecretNamesResponse", + "description": "Response listing available secret names (no raw values)." + }, + "SecretRegistry": { + "properties": { + "secret_sources": { + "additionalProperties": { + "$ref": "#/components/schemas/SecretSource" + }, + "type": "object", + "title": "Secret Sources" + } + }, + "type": "object", + "title": "SecretRegistry", + "description": "Manages secrets and injects them into bash commands when needed.\n\nThe secret registry stores a mapping of secret keys to SecretSources\nthat retrieve the actual secret values. When a bash command is about to be\nexecuted, it scans the command for any secret keys and injects the corresponding\nenvironment variables.\n\nSecret sources will redact / encrypt their sensitive values as appropriate when\nserializing, depending on the content of the context. If a context is present\nand contains a 'cipher' object, this is used for encryption. If it contains a\nboolean 'expose_secrets' flag set to True, secrets are dunped in plain text.\nOtherwise secrets are redacted.\n\nAdditionally, it tracks the latest exported values to enable consistent masking\neven when callable secrets fail on subsequent calls." + }, + "SecretSource": { + "oneOf": [ + { + "$ref": "#/components/schemas/LookupSecret" + }, + { + "$ref": "#/components/schemas/StaticSecret" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__secret__secrets__LookupSecret-Input__1": "#/components/schemas/LookupSecret", + "openhands__sdk__secret__secrets__StaticSecret-Input__1": "#/components/schemas/StaticSecret" + } + } + }, + "Secrets-Input": { + "properties": { + "provider_tokens": { + "additionalProperties": { + "$ref": "#/components/schemas/ProviderToken" + }, + "propertyNames": { + "$ref": "#/components/schemas/ProviderType" + }, + "type": "object", + "title": "Provider Tokens" + }, + "custom_secrets": { + "additionalProperties": { + "$ref": "#/components/schemas/CustomSecret" + }, + "type": "object", + "title": "Custom Secrets" + } + }, + "type": "object", + "title": "Secrets" + }, + "Secrets-Output": { + "properties": { + "provider_tokens": { + "additionalProperties": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "type": "object" + }, + "type": "object", + "title": "Provider Tokens" + }, + "custom_secrets": { + "additionalProperties": { + "$ref": "#/components/schemas/CustomSecret" + }, + "type": "object", + "title": "Custom Secrets" + } + }, + "type": "object", + "title": "Secrets" + }, + "SecurityAnalyzerBase": { + "oneOf": [ + { + "$ref": "#/components/schemas/GraySwanAnalyzer" + }, + { + "$ref": "#/components/schemas/LLMSecurityAnalyzer" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__security__grayswan__analyzer__GraySwanAnalyzer-Input__1": "#/components/schemas/GraySwanAnalyzer", + "openhands__sdk__security__llm_analyzer__LLMSecurityAnalyzer-Input__1": "#/components/schemas/LLMSecurityAnalyzer" + } + } + }, + "SecurityRisk": { + "type": "string", + "enum": [ + "UNKNOWN", + "LOW", + "MEDIUM", + "HIGH" + ], + "title": "SecurityRisk", + "description": "Security risk levels for actions.\n\nBased on OpenHands security risk levels but adapted for agent-sdk.\nInteger values allow for easy comparison and ordering." + }, + "SendMessageRequest": { + "properties": { + "role": { + "type": "string", + "enum": [ + "user", + "system", + "assistant", + "tool" + ], + "title": "Role", + "default": "user" + }, + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content" + }, + "run": { + "type": "boolean", + "title": "Run", + "description": "Whether the agent loop should automatically run if not running", + "default": false + } + }, + "type": "object", + "title": "SendMessageRequest", + "description": "Payload to send a message to the agent.\n\nThis is a simplified version of openhands.sdk.Message." + }, + "ServerErrorEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "description": "The source of this event" + }, + "code": { + "type": "string", + "title": "Code", + "description": "Code for the error - typically an error type" + }, + "detail": { + "type": "string", + "title": "Detail", + "description": "Details about the error" + }, + "kind": { + "type": "string", + "const": "ServerErrorEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "code", + "detail" + ], + "title": "ServerErrorEvent", + "description": "Event emitted by the agent server when a server-level error occurs.\n\nThis event is used for errors that originate from the agent server itself,\nsuch as MCP connection failures, WebSocket errors, or other infrastructure\nissues. Unlike ConversationErrorEvent which is for conversation-level failures,\nthis event indicates a problem with the server environment." + }, + "ServerErrorEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "description": "The source of this event" + }, + "code": { + "type": "string", + "title": "Code", + "description": "Code for the error - typically an error type" + }, + "detail": { + "type": "string", + "title": "Detail", + "description": "Details about the error" + }, + "kind": { + "type": "string", + "const": "ServerErrorEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "code", + "detail", + "kind" + ], + "title": "ServerErrorEvent", + "description": "Event emitted by the agent server when a server-level error occurs.\n\nThis event is used for errors that originate from the agent server itself,\nsuch as MCP connection failures, WebSocket errors, or other infrastructure\nissues. Unlike ConversationErrorEvent which is for conversation-level failures,\nthis event indicates a problem with the server environment." + }, + "SetTitleCallbackProcessor-Input": { + "properties": { + "kind": { + "type": "string", + "const": "SetTitleCallbackProcessor", + "title": "Kind" + } + }, + "type": "object", + "title": "SetTitleCallbackProcessor", + "description": "Callback processor which sets conversation titles." + }, + "SetTitleCallbackProcessor-Output": { + "properties": { + "kind": { + "type": "string", + "const": "SetTitleCallbackProcessor", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "kind" + ], + "title": "SetTitleCallbackProcessor", + "description": "Callback processor which sets conversation titles." + }, + "Settings": { + "properties": { + "language": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Language" + }, + "agent": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Agent" + }, + "max_iterations": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Iterations" + }, + "security_analyzer": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Security Analyzer" + }, + "confirmation_mode": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Confirmation Mode" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + }, + "llm_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Llm Api Key" + }, + "llm_base_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Base Url" + }, + "user_version": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "User Version" + }, + "remote_runtime_resource_factor": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Remote Runtime Resource Factor" + }, + "secrets_store": { + "$ref": "#/components/schemas/Secrets-Input" + }, + "enable_default_condenser": { + "type": "boolean", + "title": "Enable Default Condenser", + "default": true + }, + "enable_sound_notifications": { + "type": "boolean", + "title": "Enable Sound Notifications", + "default": false + }, + "enable_proactive_conversation_starters": { + "type": "boolean", + "title": "Enable Proactive Conversation Starters", + "default": true + }, + "enable_solvability_analysis": { + "type": "boolean", + "title": "Enable Solvability Analysis", + "default": true + }, + "user_consents_to_analytics": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "User Consents To Analytics" + }, + "sandbox_base_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Base Container Image" + }, + "sandbox_runtime_container_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Sandbox Runtime Container Image" + }, + "mcp_config": { + "anyOf": [ + { + "$ref": "#/components/schemas/MCPConfig" + }, + { + "type": "null" + } + ] + }, + "disabled_skills": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Disabled Skills" + }, + "search_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Search Api Key" + }, + "sandbox_api_key": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Sandbox Api Key" + }, + "max_budget_per_task": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Max Budget Per Task" + }, + "condenser_max_size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Condenser Max Size" + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + }, + "email_verified": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Email Verified" + }, + "git_user_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git User Name" + }, + "git_user_email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git User Email" + }, + "v1_enabled": { + "type": "boolean", + "title": "V1 Enabled", + "default": true + }, + "sandbox_grouping_strategy": { + "$ref": "#/components/schemas/SandboxGroupingStrategy", + "default": "NO_GROUPING" + } + }, + "type": "object", + "title": "Settings", + "description": "Persisted settings for OpenHands sessions" + }, + "SharedConversation": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "created_by_user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created By User Id" + }, + "sandbox_id": { + "type": "string", + "title": "Sandbox Id" + }, + "selected_repository": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Repository" + }, + "selected_branch": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Selected Branch" + }, + "git_provider": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Git Provider" + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "pr_number": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Pr Number" + }, + "llm_model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Llm Model" + }, + "metrics": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Metrics" + }, + "parent_conversation_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Parent Conversation Id" + }, + "sub_conversation_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Sub Conversation Ids" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "created_by_user_id", + "sandbox_id" + ], + "title": "SharedConversation", + "description": "Shared conversation info model with all fields from AppConversationInfo." + }, + "Skill": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "content": { + "type": "string", + "title": "Content" + }, + "trigger": { + "anyOf": [ + { + "oneOf": [ + { + "$ref": "#/components/schemas/KeywordTrigger" + }, + { + "$ref": "#/components/schemas/TaskTrigger" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "keyword": "#/components/schemas/KeywordTrigger", + "task": "#/components/schemas/TaskTrigger" + } + } + }, + { + "type": "null" + } + ], + "title": "Trigger", + "description": "Trigger determines when skill content is auto-injected. None = no auto-injection (for AgentSkills: agent reads on demand; for legacy: full content always in system prompt). KeywordTrigger = auto-inject when keywords appear in user messages. TaskTrigger = auto-inject for specific tasks, may require user input." + }, + "source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source", + "description": "The source path or identifier of the skill. When it is None, it is treated as a programmatically defined skill." + }, + "mcp_tools": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Mcp Tools", + "description": "MCP tools configuration for the skill (repo skills only). It should conform to the MCPConfig schema: https://gofastmcp.com/clients/client#configuration-format" + }, + "inputs": { + "items": { + "$ref": "#/components/schemas/InputMetadata" + }, + "type": "array", + "title": "Inputs", + "description": "Input metadata for the skill (task skills only)" + }, + "is_agentskills_format": { + "type": "boolean", + "title": "Is Agentskills Format", + "description": "Whether this skill was loaded from a SKILL.md file following the AgentSkills standard. AgentSkills-format skills use progressive disclosure: always listed in with name, description, and location. If the skill also has triggers, content is auto-injected when triggered AND agent can read file anytime.", + "default": false + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "A brief description of what the skill does and when to use it. Descriptions exceeding MAX_DESCRIPTION_LENGTH are truncated with a notice pointing to the skill's source path." + }, + "license": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "License", + "description": "The license under which the skill is distributed. AgentSkills standard field (e.g., 'Apache-2.0', 'MIT')." + }, + "compatibility": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Compatibility", + "description": "Environment requirements or compatibility notes for the skill. AgentSkills standard field (e.g., 'Requires git and docker')." + }, + "metadata": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Metadata", + "description": "Arbitrary key-value metadata for the skill. AgentSkills standard field for extensibility." + }, + "allowed_tools": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Allowed Tools", + "description": "List of pre-approved tools for this skill. AgentSkills standard field (parsed from space-delimited string)." + }, + "resources": { + "anyOf": [ + { + "$ref": "#/components/schemas/SkillResources" + }, + { + "type": "null" + } + ], + "description": "Resource directories for the skill (scripts/, references/, assets/). AgentSkills standard field. Only populated for SKILL.md directory format." + } + }, + "type": "object", + "required": [ + "name", + "content" + ], + "title": "Skill", + "description": "A skill provides specialized knowledge or functionality.\n\nSkill behavior depends on format (is_agentskills_format) and trigger:\n\nAgentSkills format (SKILL.md files):\n- Always listed in with name, description, location\n- Agent reads full content on demand (progressive disclosure)\n- If has triggers: content is ALSO auto-injected when triggered\n\nLegacy OpenHands format:\n- With triggers: Listed in , content injected on trigger\n- Without triggers (None): Full content in , always active\n\nThis model supports both OpenHands-specific fields and AgentSkills standard\nfields (https://agentskills.io/specification) for cross-platform compatibility." + }, + "SkillInfo": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "type": { + "type": "string", + "title": "Type" + }, + "source": { + "type": "string", + "title": "Source" + }, + "triggers": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Triggers" + } + }, + "type": "object", + "required": [ + "name", + "type", + "source" + ], + "title": "SkillInfo", + "description": "Information about a single available skill." + }, + "SkillPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/SkillInfo" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "SkillPage", + "description": "Paginated response for the skills search endpoint." + }, + "SkillResources": { + "properties": { + "skill_root": { + "type": "string", + "title": "Skill Root", + "description": "Root directory of the skill (absolute path)" + }, + "scripts": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Scripts", + "description": "List of script files in scripts/ directory (relative paths)" + }, + "references": { + "items": { + "type": "string" + }, + "type": "array", + "title": "References", + "description": "List of reference files in references/ directory (relative paths)" + }, + "assets": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Assets", + "description": "List of asset files in assets/ directory (relative paths)" + } + }, + "type": "object", + "required": [ + "skill_root" + ], + "title": "SkillResources", + "description": "Resource directories for a skill (AgentSkills standard).\n\nPer the AgentSkills specification, skills can include:\n- scripts/: Executable scripts the agent can run\n- references/: Reference documentation and examples\n- assets/: Static assets (images, data files, etc.)" + }, + "SlackV1CallbackProcessor-Input": { + "properties": { + "slack_view_data": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "type": "object", + "title": "Slack View Data" + }, + "kind": { + "type": "string", + "const": "SlackV1CallbackProcessor", + "title": "Kind" + } + }, + "type": "object", + "title": "SlackV1CallbackProcessor", + "description": "Callback processor for Slack V1 integrations." + }, + "SlackV1CallbackProcessor-Output": { + "properties": { + "slack_view_data": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "type": "object", + "title": "Slack View Data" + }, + "kind": { + "type": "string", + "const": "SlackV1CallbackProcessor", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "kind" + ], + "title": "SlackV1CallbackProcessor", + "description": "Callback processor for Slack V1 integrations." + }, + "SleeptimeComputeAction-Input": { + "properties": { + "kind": { + "type": "string", + "const": "SleeptimeComputeAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "SleeptimeComputeAction", + "description": "Action to index existing conversations for Tom's user modeling.\n\nThis triggers Tom agent's sleeptime_compute function which processes\nconversation history to build and update the user model." + }, + "SleeptimeComputeAction-Output": { + "properties": { + "kind": { + "type": "string", + "const": "SleeptimeComputeAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "SleeptimeComputeAction", + "description": "Action to index existing conversations for Tom's user modeling.\n\nThis triggers Tom agent's sleeptime_compute function which processes\nconversation history to build and update the user model." + }, + "SleeptimeComputeObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "message": { + "type": "string", + "title": "Message", + "description": "Result message from sleeptime compute", + "default": "" + }, + "sessions_processed": { + "type": "integer", + "title": "Sessions Processed", + "description": "Number of conversation sessions indexed", + "default": 0 + }, + "kind": { + "type": "string", + "const": "SleeptimeComputeObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "SleeptimeComputeObservation", + "description": "Observation from sleeptime compute operation." + }, + "SleeptimeComputeObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "message": { + "type": "string", + "title": "Message", + "description": "Result message from sleeptime compute", + "default": "" + }, + "sessions_processed": { + "type": "integer", + "title": "Sessions Processed", + "description": "Number of conversation sessions indexed", + "default": 0 + }, + "kind": { + "type": "string", + "const": "SleeptimeComputeObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "SleeptimeComputeObservation", + "description": "Observation from sleeptime compute operation." + }, + "SleeptimeComputeTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "SleeptimeComputeTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "SleeptimeComputeTool", + "description": "Tool for indexing conversations for Tom's user modeling." + }, + "SleeptimeComputeTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "SleeptimeComputeTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "SleeptimeComputeTool", + "description": "Tool for indexing conversations for Tom's user modeling." + }, + "SortOrder": { + "type": "string", + "enum": [ + "stars-desc", + "stars-asc", + "forks-desc", + "forks-asc", + "updated-desc", + "updated-asc" + ], + "title": "SortOrder", + "description": "Sort order for search results combining sort field and direction.\n\nValues:\n STAR_DESC: Sort by stars, descending\n STAR_ASC: Sort by stars, ascending\n FORKS_DESC: Sort by forks, descending\n FORKS_ASC: Sort by forks, ascending\n UPDATED_DESC: Sort by last updated, descending\n UPDATED_ASC: Sort by last updated, ascending" + }, + "StaticSecret": { + "properties": { + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Optional description for this secret" + }, + "value": { + "anyOf": [ + { + "type": "string", + "format": "password", + "writeOnly": true + }, + { + "type": "null" + } + ], + "title": "Value" + }, + "kind": { + "type": "string", + "const": "StaticSecret", + "title": "Kind" + } + }, + "type": "object", + "title": "StaticSecret", + "description": "A secret stored locally" + }, + "SubscriptionAccessResponse": { + "properties": { + "start_at": { + "type": "string", + "format": "date-time", + "title": "Start At" + }, + "end_at": { + "type": "string", + "format": "date-time", + "title": "End At" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "cancelled_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Cancelled At" + }, + "stripe_subscription_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Stripe Subscription Id" + } + }, + "type": "object", + "required": [ + "start_at", + "end_at", + "created_at" + ], + "title": "SubscriptionAccessResponse" + }, + "Success": { + "properties": { + "success": { + "type": "boolean", + "title": "Success", + "default": true + } + }, + "type": "object", + "title": "Success" + }, + "SuggestedTask": { + "properties": { + "git_provider": { + "$ref": "#/components/schemas/ProviderType" + }, + "task_type": { + "$ref": "#/components/schemas/TaskType" + }, + "repo": { + "type": "string", + "title": "Repo" + }, + "issue_number": { + "type": "integer", + "title": "Issue Number" + }, + "title": { + "type": "string", + "title": "Title" + } + }, + "type": "object", + "required": [ + "git_provider", + "task_type", + "repo", + "issue_number", + "title" + ], + "title": "SuggestedTask" + }, + "SuggestedTaskPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/SuggestedTask" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "SuggestedTaskPage", + "description": "Paginated response for suggested tasks.\n\nAttributes:\n items: List of suggested tasks in the current page.\n next_page_id: ID for the next page, or None if there are no more pages." + }, + "SystemPromptEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "agent" + }, + "system_prompt": { + "$ref": "#/components/schemas/TextContent", + "description": "The system prompt text" + }, + "tools": { + "items": { + "$ref": "#/components/schemas/ToolDefinition-Input" + }, + "type": "array", + "title": "Tools", + "description": "List of tools as ToolDefinition objects" + }, + "dynamic_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "type": "null" + } + ], + "description": "Optional dynamic per-conversation context (runtime info, repo context, secrets). When provided, this is included as a second content block in the system message (not cached)." + }, + "kind": { + "type": "string", + "const": "SystemPromptEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "system_prompt", + "tools" + ], + "title": "SystemPromptEvent", + "description": "System prompt added by the agent.\n\nThe system prompt can optionally include dynamic context that varies between\nconversations. When ``dynamic_context`` is provided, it is included as a\nsecond content block in the same system message. Cache markers are NOT\napplied here - they are applied by ``LLM._apply_prompt_caching()`` when\ncaching is enabled, ensuring provider-specific cache control is only added\nwhen appropriate.\n\nAttributes:\n system_prompt: The static system prompt text (cacheable across conversations)\n tools: List of available tools\n dynamic_context: Optional per-conversation context (hosts, repo info, etc.)\n Sent as a second TextContent block inside the system message." + }, + "SystemPromptEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "agent" + }, + "system_prompt": { + "$ref": "#/components/schemas/TextContent", + "description": "The system prompt text" + }, + "tools": { + "items": { + "$ref": "#/components/schemas/ToolDefinition-Output" + }, + "type": "array", + "title": "Tools", + "description": "List of tools as ToolDefinition objects" + }, + "dynamic_context": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "type": "null" + } + ], + "description": "Optional dynamic per-conversation context (runtime info, repo context, secrets). When provided, this is included as a second content block in the system message (not cached)." + }, + "kind": { + "type": "string", + "const": "SystemPromptEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "system_prompt", + "tools", + "kind" + ], + "title": "SystemPromptEvent", + "description": "System prompt added by the agent.\n\nThe system prompt can optionally include dynamic context that varies between\nconversations. When ``dynamic_context`` is provided, it is included as a\nsecond content block in the same system message. Cache markers are NOT\napplied here - they are applied by ``LLM._apply_prompt_caching()`` when\ncaching is enabled, ensuring provider-specific cache control is only added\nwhen appropriate.\n\nAttributes:\n system_prompt: The static system prompt text (cacheable across conversations)\n tools: List of available tools\n dynamic_context: Optional per-conversation context (hosts, repo info, etc.)\n Sent as a second TextContent block inside the system message." + }, + "TaskAction-Input": { + "properties": { + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "A short (3-5 word) description of the task." + }, + "prompt": { + "type": "string", + "title": "Prompt", + "description": "The task for the agent to perform." + }, + "subagent_type": { + "type": "string", + "title": "Subagent Type", + "description": "The type of specialized agent to use for this task.", + "default": "default" + }, + "resume": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Resume", + "description": "Task ID of the task to resume from." + }, + "kind": { + "type": "string", + "const": "TaskAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "prompt" + ], + "title": "TaskAction", + "description": "Schema for launching a sub-agent task." + }, + "TaskAction-Output": { + "properties": { + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "A short (3-5 word) description of the task." + }, + "prompt": { + "type": "string", + "title": "Prompt", + "description": "The task for the agent to perform." + }, + "subagent_type": { + "type": "string", + "title": "Subagent Type", + "description": "The type of specialized agent to use for this task.", + "default": "default" + }, + "resume": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Resume", + "description": "Task ID of the task to resume from." + }, + "kind": { + "type": "string", + "const": "TaskAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "prompt", + "kind" + ], + "title": "TaskAction", + "description": "Schema for launching a sub-agent task." + }, + "TaskItem": { + "properties": { + "title": { + "type": "string", + "title": "Title", + "description": "A brief title for the task." + }, + "notes": { + "type": "string", + "title": "Notes", + "description": "Additional details or notes about the task.", + "default": "" + }, + "status": { + "type": "string", + "enum": [ + "todo", + "in_progress", + "done" + ], + "title": "Status", + "description": "The current status of the task. One of 'todo', 'in_progress', or 'done'.", + "default": "todo" + } + }, + "type": "object", + "required": [ + "title" + ], + "title": "TaskItem" + }, + "TaskObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "task_id": { + "type": "string", + "title": "Task Id", + "description": "The unique identifier of the task." + }, + "subagent": { + "type": "string", + "title": "Subagent", + "description": "The subagent of the task." + }, + "status": { + "type": "string", + "title": "Status", + "description": "The status of the task." + }, + "kind": { + "type": "string", + "const": "TaskObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "task_id", + "subagent", + "status" + ], + "title": "TaskObservation", + "description": "Observation from a task execution." + }, + "TaskObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "task_id": { + "type": "string", + "title": "Task Id", + "description": "The unique identifier of the task." + }, + "subagent": { + "type": "string", + "title": "Subagent", + "description": "The subagent of the task." + }, + "status": { + "type": "string", + "title": "Status", + "description": "The status of the task." + }, + "kind": { + "type": "string", + "const": "TaskObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "task_id", + "subagent", + "status", + "kind" + ], + "title": "TaskObservation", + "description": "Observation from a task execution." + }, + "TaskTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TaskTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "TaskTool", + "description": "Tool for launching (blocking) sub-agent tasks." + }, + "TaskTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TaskTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "TaskTool", + "description": "Tool for launching (blocking) sub-agent tasks." + }, + "TaskToolSet-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TaskToolSet", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "TaskToolSet", + "description": "Task tool set.\n\nCreates the Task tool backed by a shared TaskManager.\n\nUsage:\n from openhands.tools.task import TaskToolSet\n\n agent = Agent(\n llm=llm,\n tools=[\n Tool(name=TerminalTool.name),\n Tool(name=FileEditorTool.name),\n Tool(name=TaskToolSet.name),\n ],\n )" + }, + "TaskToolSet-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TaskToolSet", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "TaskToolSet", + "description": "Task tool set.\n\nCreates the Task tool backed by a shared TaskManager.\n\nUsage:\n from openhands.tools.task import TaskToolSet\n\n agent = Agent(\n llm=llm,\n tools=[\n Tool(name=TerminalTool.name),\n Tool(name=FileEditorTool.name),\n Tool(name=TaskToolSet.name),\n ],\n )" + }, + "TaskTrackerAction-Input": { + "properties": { + "command": { + "type": "string", + "enum": [ + "view", + "plan" + ], + "title": "Command", + "description": "The command to execute. `view` shows the current task list. `plan` creates or updates the task list based on provided requirements and progress. Always `view` the current list before making changes.", + "default": "view" + }, + "task_list": { + "items": { + "$ref": "#/components/schemas/TaskItem" + }, + "type": "array", + "title": "Task List", + "description": "The full task list. Required parameter of `plan` command." + }, + "kind": { + "type": "string", + "const": "TaskTrackerAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "TaskTrackerAction", + "description": "An action where the agent writes or updates a task list for task management." + }, + "TaskTrackerAction-Output": { + "properties": { + "command": { + "type": "string", + "enum": [ + "view", + "plan" + ], + "title": "Command", + "description": "The command to execute. `view` shows the current task list. `plan` creates or updates the task list based on provided requirements and progress. Always `view` the current list before making changes.", + "default": "view" + }, + "task_list": { + "items": { + "$ref": "#/components/schemas/TaskItem" + }, + "type": "array", + "title": "Task List", + "description": "The full task list. Required parameter of `plan` command." + }, + "kind": { + "type": "string", + "const": "TaskTrackerAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "TaskTrackerAction", + "description": "An action where the agent writes or updates a task list for task management." + }, + "TaskTrackerObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "type": "string", + "enum": [ + "view", + "plan" + ], + "title": "Command", + "description": "The command that was executed: \"view\" or \"plan\"." + }, + "task_list": { + "items": { + "$ref": "#/components/schemas/TaskItem" + }, + "type": "array", + "title": "Task List", + "description": "The current task list" + }, + "kind": { + "type": "string", + "const": "TaskTrackerObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command" + ], + "title": "TaskTrackerObservation", + "description": "This data class represents the result of a task tracking operation." + }, + "TaskTrackerObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "type": "string", + "enum": [ + "view", + "plan" + ], + "title": "Command", + "description": "The command that was executed: \"view\" or \"plan\"." + }, + "task_list": { + "items": { + "$ref": "#/components/schemas/TaskItem" + }, + "type": "array", + "title": "Task List", + "description": "The current task list" + }, + "kind": { + "type": "string", + "const": "TaskTrackerObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "kind" + ], + "title": "TaskTrackerObservation", + "description": "This data class represents the result of a task tracking operation." + }, + "TaskTrackerTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TaskTrackerTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "TaskTrackerTool", + "description": "A ToolDefinition subclass that automatically initializes a TaskTrackerExecutor." + }, + "TaskTrackerTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TaskTrackerTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "TaskTrackerTool", + "description": "A ToolDefinition subclass that automatically initializes a TaskTrackerExecutor." + }, + "TaskTrigger": { + "properties": { + "type": { + "type": "string", + "const": "task", + "title": "Type", + "default": "task" + }, + "triggers": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Triggers" + } + }, + "type": "object", + "required": [ + "triggers" + ], + "title": "TaskTrigger", + "description": "Trigger for task-specific skills.\n\nThese skills are activated for specific task types and can modify prompts." + }, + "TaskType": { + "type": "string", + "enum": [ + "MERGE_CONFLICTS", + "FAILING_CHECKS", + "UNRESOLVED_COMMENTS", + "OPEN_ISSUE", + "OPEN_PR", + "CREATE_MICROAGENT" + ], + "title": "TaskType" + }, + "TerminalAction-Input": { + "properties": { + "command": { + "type": "string", + "title": "Command", + "description": "The bash command to execute. Can be empty string to view additional logs when previous exit code is `-1`. Can be `C-c` (Ctrl+C) to interrupt the currently running process. Note: You can only execute one bash command at a time. If you need to run multiple commands sequentially, you can use `&&` or `;` to chain them together." + }, + "is_input": { + "type": "boolean", + "title": "Is Input", + "description": "If True, the command is an input to the running process. If False, the command is a bash command to be executed in the terminal. Default is False.", + "default": false + }, + "timeout": { + "anyOf": [ + { + "type": "number", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Timeout", + "description": "Optional. Sets a maximum time limit (in seconds) for running the command. If the command takes longer than this limit, you\u2019ll be asked whether to continue or stop it. If you don\u2019t set a value, the command will instead pause and ask for confirmation when it produces no new output for 30 seconds. Use a higher value if the command is expected to take a long time (like installation or testing), or if it has a known fixed duration (like sleep)." + }, + "reset": { + "type": "boolean", + "title": "Reset", + "description": "If True, reset the terminal by creating a new session. Use this only when the terminal becomes unresponsive. Note that all previously set environment variables and session state will be lost after reset. Cannot be used with is_input=True.", + "default": false + }, + "kind": { + "type": "string", + "const": "TerminalAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command" + ], + "title": "TerminalAction", + "description": "Schema for bash command execution." + }, + "TerminalAction-Output": { + "properties": { + "command": { + "type": "string", + "title": "Command", + "description": "The bash command to execute. Can be empty string to view additional logs when previous exit code is `-1`. Can be `C-c` (Ctrl+C) to interrupt the currently running process. Note: You can only execute one bash command at a time. If you need to run multiple commands sequentially, you can use `&&` or `;` to chain them together." + }, + "is_input": { + "type": "boolean", + "title": "Is Input", + "description": "If True, the command is an input to the running process. If False, the command is a bash command to be executed in the terminal. Default is False.", + "default": false + }, + "timeout": { + "anyOf": [ + { + "type": "number", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Timeout", + "description": "Optional. Sets a maximum time limit (in seconds) for running the command. If the command takes longer than this limit, you\u2019ll be asked whether to continue or stop it. If you don\u2019t set a value, the command will instead pause and ask for confirmation when it produces no new output for 30 seconds. Use a higher value if the command is expected to take a long time (like installation or testing), or if it has a known fixed duration (like sleep)." + }, + "reset": { + "type": "boolean", + "title": "Reset", + "description": "If True, reset the terminal by creating a new session. Use this only when the terminal becomes unresponsive. Note that all previously set environment variables and session state will be lost after reset. Cannot be used with is_input=True.", + "default": false + }, + "kind": { + "type": "string", + "const": "TerminalAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "kind" + ], + "title": "TerminalAction", + "description": "Schema for bash command execution." + }, + "TerminalObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Command", + "description": "The bash command that was executed. Can be empty string if the observation is from a previous command that hit soft timeout and is not yet finished." + }, + "exit_code": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Exit Code", + "description": "The exit code of the command. -1 indicates the process hit the soft timeout and is not yet finished." + }, + "timeout": { + "type": "boolean", + "title": "Timeout", + "description": "Whether the command execution timed out.", + "default": false + }, + "metadata": { + "$ref": "#/components/schemas/CmdOutputMetadata", + "description": "Additional metadata captured from PS1 after command execution." + }, + "full_output_save_dir": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Full Output Save Dir", + "description": "Directory where full output files are saved" + }, + "kind": { + "type": "string", + "const": "TerminalObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command" + ], + "title": "TerminalObservation", + "description": "A ToolResult that can be rendered as a CLI output." + }, + "TerminalObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "command": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Command", + "description": "The bash command that was executed. Can be empty string if the observation is from a previous command that hit soft timeout and is not yet finished." + }, + "exit_code": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Exit Code", + "description": "The exit code of the command. -1 indicates the process hit the soft timeout and is not yet finished." + }, + "timeout": { + "type": "boolean", + "title": "Timeout", + "description": "Whether the command execution timed out.", + "default": false + }, + "metadata": { + "$ref": "#/components/schemas/CmdOutputMetadata", + "description": "Additional metadata captured from PS1 after command execution." + }, + "full_output_save_dir": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Full Output Save Dir", + "description": "Directory where full output files are saved" + }, + "kind": { + "type": "string", + "const": "TerminalObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "command", + "kind" + ], + "title": "TerminalObservation", + "description": "A ToolResult that can be rendered as a CLI output." + }, + "TerminalTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TerminalTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "TerminalTool", + "description": "A ToolDefinition subclass that automatically initializes a TerminalExecutor with auto-detection." + }, + "TerminalTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TerminalTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "TerminalTool", + "description": "A ToolDefinition subclass that automatically initializes a TerminalExecutor with auto-detection." + }, + "TextContent": { + "properties": { + "cache_prompt": { + "type": "boolean", + "title": "Cache Prompt", + "default": false + }, + "type": { + "type": "string", + "const": "text", + "title": "Type", + "default": "text" + }, + "text": { + "type": "string", + "title": "Text" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text" + ], + "title": "TextContent" + }, + "ThinkAction-Input": { + "properties": { + "thought": { + "type": "string", + "title": "Thought", + "description": "The thought to log." + }, + "kind": { + "type": "string", + "const": "ThinkAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "thought" + ], + "title": "ThinkAction", + "description": "Action for logging a thought without making any changes." + }, + "ThinkAction-Output": { + "properties": { + "thought": { + "type": "string", + "title": "Thought", + "description": "The thought to log." + }, + "kind": { + "type": "string", + "const": "ThinkAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "thought", + "kind" + ], + "title": "ThinkAction", + "description": "Action for logging a thought without making any changes." + }, + "ThinkObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "kind": { + "type": "string", + "const": "ThinkObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ThinkObservation", + "description": "Observation returned after logging a thought.\nThe ThinkAction itself contains the thought logged so no extra\nfields are needed here." + }, + "ThinkObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "kind": { + "type": "string", + "const": "ThinkObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "ThinkObservation", + "description": "Observation returned after logging a thought.\nThe ThinkAction itself contains the thought logged so no extra\nfields are needed here." + }, + "ThinkTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "ThinkTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "ThinkTool", + "description": "Tool for logging thoughts without making changes." + }, + "ThinkTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "ThinkTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "ThinkTool", + "description": "Tool for logging thoughts without making changes." + }, + "ThinkingBlock": { + "properties": { + "type": { + "type": "string", + "const": "thinking", + "title": "Type", + "default": "thinking" + }, + "thinking": { + "type": "string", + "title": "Thinking", + "description": "The thinking content" + }, + "signature": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Signature", + "description": "Cryptographic signature for the thinking block" + } + }, + "type": "object", + "required": [ + "thinking" + ], + "title": "ThinkingBlock", + "description": "Anthropic thinking block for extended thinking feature.\n\nThis represents the raw thinking blocks returned by Anthropic models\nwhen extended thinking is enabled. These blocks must be preserved\nand passed back to the API for tool use scenarios." + }, + "TokenEvent-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source" + }, + "prompt_token_ids": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Prompt Token Ids", + "description": "The exact prompt token IDs for this message event" + }, + "response_token_ids": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Response Token Ids", + "description": "The exact response token IDs for this message event" + }, + "kind": { + "type": "string", + "const": "TokenEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "prompt_token_ids", + "response_token_ids" + ], + "title": "TokenEvent", + "description": "Event from VLLM representing token IDs used in LLM interaction." + }, + "TokenEvent-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source" + }, + "prompt_token_ids": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Prompt Token Ids", + "description": "The exact prompt token IDs for this message event" + }, + "response_token_ids": { + "items": { + "type": "integer" + }, + "type": "array", + "title": "Response Token Ids", + "description": "The exact response token IDs for this message event" + }, + "kind": { + "type": "string", + "const": "TokenEvent", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "prompt_token_ids", + "response_token_ids", + "kind" + ], + "title": "TokenEvent", + "description": "Event from VLLM representing token IDs used in LLM interaction." + }, + "TokenResponse": { + "properties": { + "token": { + "type": "string", + "title": "Token" + } + }, + "type": "object", + "required": [ + "token" + ], + "title": "TokenResponse" + }, + "TokenUsage": { + "properties": { + "model": { + "type": "string", + "title": "Model", + "default": "" + }, + "prompt_tokens": { + "type": "integer", + "minimum": 0.0, + "title": "Prompt Tokens", + "description": "Prompt tokens must be non-negative", + "default": 0 + }, + "completion_tokens": { + "type": "integer", + "minimum": 0.0, + "title": "Completion Tokens", + "description": "Completion tokens must be non-negative", + "default": 0 + }, + "cache_read_tokens": { + "type": "integer", + "minimum": 0.0, + "title": "Cache Read Tokens", + "description": "Cache read tokens must be non-negative", + "default": 0 + }, + "cache_write_tokens": { + "type": "integer", + "minimum": 0.0, + "title": "Cache Write Tokens", + "description": "Cache write tokens must be non-negative", + "default": 0 + }, + "reasoning_tokens": { + "type": "integer", + "minimum": 0.0, + "title": "Reasoning Tokens", + "description": "Reasoning tokens must be non-negative", + "default": 0 + }, + "context_window": { + "type": "integer", + "minimum": 0.0, + "title": "Context Window", + "description": "Context window must be non-negative", + "default": 0 + }, + "per_turn_token": { + "type": "integer", + "minimum": 0.0, + "title": "Per Turn Token", + "description": "Per turn tokens must be non-negative", + "default": 0 + }, + "response_id": { + "type": "string", + "title": "Response Id", + "default": "" + } + }, + "type": "object", + "title": "TokenUsage", + "description": "Metric tracking detailed token usage per completion call." + }, + "TomConsultTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TomConsultTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "TomConsultTool", + "description": "Tool for consulting Tom agent." + }, + "TomConsultTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "TomConsultTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "TomConsultTool", + "description": "Tool for consulting Tom agent." + }, + "Tool-Output": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "inputSchema": { + "additionalProperties": true, + "type": "object", + "title": "Inputschema" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Outputschema" + }, + "icons": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Icon" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Icons" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/mcp__types__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "_meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "execution": { + "anyOf": [ + { + "$ref": "#/components/schemas/ToolExecution" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "name", + "inputSchema" + ], + "title": "Tool", + "description": "Definition for a tool the client can call." + }, + "ToolDefinition-Input": { + "oneOf": [ + { + "$ref": "#/components/schemas/MCPToolDefinition-Input" + }, + { + "$ref": "#/components/schemas/FinishTool-Input" + }, + { + "$ref": "#/components/schemas/ThinkTool-Input" + }, + { + "$ref": "#/components/schemas/ApplyPatchTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserClickTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserCloseTabTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserGetContentTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserGetStateTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserGetStorageTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserGoBackTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserListTabsTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserNavigateTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserScrollTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserSetStorageTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserStartRecordingTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserStopRecordingTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserSwitchTabTool-Input" + }, + { + "$ref": "#/components/schemas/BrowserToolSet-Input" + }, + { + "$ref": "#/components/schemas/BrowserTypeTool-Input" + }, + { + "$ref": "#/components/schemas/DelegateTool-Input" + }, + { + "$ref": "#/components/schemas/FileEditorTool-Input" + }, + { + "$ref": "#/components/schemas/EditTool-Input" + }, + { + "$ref": "#/components/schemas/ListDirectoryTool-Input" + }, + { + "$ref": "#/components/schemas/ReadFileTool-Input" + }, + { + "$ref": "#/components/schemas/WriteFileTool-Input" + }, + { + "$ref": "#/components/schemas/GlobTool-Input" + }, + { + "$ref": "#/components/schemas/GrepTool-Input" + }, + { + "$ref": "#/components/schemas/PlanningFileEditorTool-Input" + }, + { + "$ref": "#/components/schemas/TaskTool-Input" + }, + { + "$ref": "#/components/schemas/TaskToolSet-Input" + }, + { + "$ref": "#/components/schemas/TaskTrackerTool-Input" + }, + { + "$ref": "#/components/schemas/TerminalTool-Input" + }, + { + "$ref": "#/components/schemas/SleeptimeComputeTool-Input" + }, + { + "$ref": "#/components/schemas/TomConsultTool-Input" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__mcp__tool__MCPToolDefinition-Input__1": "#/components/schemas/MCPToolDefinition-Input", + "openhands__sdk__tool__builtins__finish__FinishTool-Input__1": "#/components/schemas/FinishTool-Input", + "openhands__sdk__tool__builtins__think__ThinkTool-Input__1": "#/components/schemas/ThinkTool-Input", + "openhands__tools__apply_patch__definition__ApplyPatchTool-Input__1": "#/components/schemas/ApplyPatchTool-Input", + "openhands__tools__browser_use__definition__BrowserClickTool-Input__1": "#/components/schemas/BrowserClickTool-Input", + "openhands__tools__browser_use__definition__BrowserCloseTabTool-Input__1": "#/components/schemas/BrowserCloseTabTool-Input", + "openhands__tools__browser_use__definition__BrowserGetContentTool-Input__1": "#/components/schemas/BrowserGetContentTool-Input", + "openhands__tools__browser_use__definition__BrowserGetStateTool-Input__1": "#/components/schemas/BrowserGetStateTool-Input", + "openhands__tools__browser_use__definition__BrowserGetStorageTool-Input__1": "#/components/schemas/BrowserGetStorageTool-Input", + "openhands__tools__browser_use__definition__BrowserGoBackTool-Input__1": "#/components/schemas/BrowserGoBackTool-Input", + "openhands__tools__browser_use__definition__BrowserListTabsTool-Input__1": "#/components/schemas/BrowserListTabsTool-Input", + "openhands__tools__browser_use__definition__BrowserNavigateTool-Input__1": "#/components/schemas/BrowserNavigateTool-Input", + "openhands__tools__browser_use__definition__BrowserScrollTool-Input__1": "#/components/schemas/BrowserScrollTool-Input", + "openhands__tools__browser_use__definition__BrowserSetStorageTool-Input__1": "#/components/schemas/BrowserSetStorageTool-Input", + "openhands__tools__browser_use__definition__BrowserStartRecordingTool-Input__1": "#/components/schemas/BrowserStartRecordingTool-Input", + "openhands__tools__browser_use__definition__BrowserStopRecordingTool-Input__1": "#/components/schemas/BrowserStopRecordingTool-Input", + "openhands__tools__browser_use__definition__BrowserSwitchTabTool-Input__1": "#/components/schemas/BrowserSwitchTabTool-Input", + "openhands__tools__browser_use__definition__BrowserToolSet-Input__1": "#/components/schemas/BrowserToolSet-Input", + "openhands__tools__browser_use__definition__BrowserTypeTool-Input__1": "#/components/schemas/BrowserTypeTool-Input", + "openhands__tools__delegate__definition__DelegateTool-Input__1": "#/components/schemas/DelegateTool-Input", + "openhands__tools__file_editor__definition__FileEditorTool-Input__1": "#/components/schemas/FileEditorTool-Input", + "openhands__tools__gemini__edit__definition__EditTool-Input__1": "#/components/schemas/EditTool-Input", + "openhands__tools__gemini__list_directory__definition__ListDirectoryTool-Input__1": "#/components/schemas/ListDirectoryTool-Input", + "openhands__tools__gemini__read_file__definition__ReadFileTool-Input__1": "#/components/schemas/ReadFileTool-Input", + "openhands__tools__gemini__write_file__definition__WriteFileTool-Input__1": "#/components/schemas/WriteFileTool-Input", + "openhands__tools__glob__definition__GlobTool-Input__1": "#/components/schemas/GlobTool-Input", + "openhands__tools__grep__definition__GrepTool-Input__1": "#/components/schemas/GrepTool-Input", + "openhands__tools__planning_file_editor__definition__PlanningFileEditorTool-Input__1": "#/components/schemas/PlanningFileEditorTool-Input", + "openhands__tools__task__definition__TaskTool-Input__1": "#/components/schemas/TaskTool-Input", + "openhands__tools__task__definition__TaskToolSet-Input__1": "#/components/schemas/TaskToolSet-Input", + "openhands__tools__task_tracker__definition__TaskTrackerTool-Input__1": "#/components/schemas/TaskTrackerTool-Input", + "openhands__tools__terminal__definition__TerminalTool-Input__1": "#/components/schemas/TerminalTool-Input", + "openhands__tools__tom_consult__definition__SleeptimeComputeTool-Input__1": "#/components/schemas/SleeptimeComputeTool-Input", + "openhands__tools__tom_consult__definition__TomConsultTool-Input__1": "#/components/schemas/TomConsultTool-Input" + } + } + }, + "ToolDefinition-Output": { + "oneOf": [ + { + "$ref": "#/components/schemas/MCPToolDefinition-Output" + }, + { + "$ref": "#/components/schemas/FinishTool-Output" + }, + { + "$ref": "#/components/schemas/ThinkTool-Output" + }, + { + "$ref": "#/components/schemas/ApplyPatchTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserClickTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserCloseTabTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserGetContentTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserGetStateTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserGetStorageTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserGoBackTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserListTabsTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserNavigateTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserScrollTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserSetStorageTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserStartRecordingTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserStopRecordingTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserSwitchTabTool-Output" + }, + { + "$ref": "#/components/schemas/BrowserToolSet-Output" + }, + { + "$ref": "#/components/schemas/BrowserTypeTool-Output" + }, + { + "$ref": "#/components/schemas/DelegateTool-Output" + }, + { + "$ref": "#/components/schemas/FileEditorTool-Output" + }, + { + "$ref": "#/components/schemas/EditTool-Output" + }, + { + "$ref": "#/components/schemas/ListDirectoryTool-Output" + }, + { + "$ref": "#/components/schemas/ReadFileTool-Output" + }, + { + "$ref": "#/components/schemas/WriteFileTool-Output" + }, + { + "$ref": "#/components/schemas/GlobTool-Output" + }, + { + "$ref": "#/components/schemas/GrepTool-Output" + }, + { + "$ref": "#/components/schemas/PlanningFileEditorTool-Output" + }, + { + "$ref": "#/components/schemas/TaskTool-Output" + }, + { + "$ref": "#/components/schemas/TaskToolSet-Output" + }, + { + "$ref": "#/components/schemas/TaskTrackerTool-Output" + }, + { + "$ref": "#/components/schemas/TerminalTool-Output" + }, + { + "$ref": "#/components/schemas/SleeptimeComputeTool-Output" + }, + { + "$ref": "#/components/schemas/TomConsultTool-Output" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "openhands__sdk__mcp__tool__MCPToolDefinition-Output__1": "#/components/schemas/MCPToolDefinition-Output", + "openhands__sdk__tool__builtins__finish__FinishTool-Output__1": "#/components/schemas/FinishTool-Output", + "openhands__sdk__tool__builtins__think__ThinkTool-Output__1": "#/components/schemas/ThinkTool-Output", + "openhands__tools__apply_patch__definition__ApplyPatchTool-Output__1": "#/components/schemas/ApplyPatchTool-Output", + "openhands__tools__browser_use__definition__BrowserClickTool-Output__1": "#/components/schemas/BrowserClickTool-Output", + "openhands__tools__browser_use__definition__BrowserCloseTabTool-Output__1": "#/components/schemas/BrowserCloseTabTool-Output", + "openhands__tools__browser_use__definition__BrowserGetContentTool-Output__1": "#/components/schemas/BrowserGetContentTool-Output", + "openhands__tools__browser_use__definition__BrowserGetStateTool-Output__1": "#/components/schemas/BrowserGetStateTool-Output", + "openhands__tools__browser_use__definition__BrowserGetStorageTool-Output__1": "#/components/schemas/BrowserGetStorageTool-Output", + "openhands__tools__browser_use__definition__BrowserGoBackTool-Output__1": "#/components/schemas/BrowserGoBackTool-Output", + "openhands__tools__browser_use__definition__BrowserListTabsTool-Output__1": "#/components/schemas/BrowserListTabsTool-Output", + "openhands__tools__browser_use__definition__BrowserNavigateTool-Output__1": "#/components/schemas/BrowserNavigateTool-Output", + "openhands__tools__browser_use__definition__BrowserScrollTool-Output__1": "#/components/schemas/BrowserScrollTool-Output", + "openhands__tools__browser_use__definition__BrowserSetStorageTool-Output__1": "#/components/schemas/BrowserSetStorageTool-Output", + "openhands__tools__browser_use__definition__BrowserStartRecordingTool-Output__1": "#/components/schemas/BrowserStartRecordingTool-Output", + "openhands__tools__browser_use__definition__BrowserStopRecordingTool-Output__1": "#/components/schemas/BrowserStopRecordingTool-Output", + "openhands__tools__browser_use__definition__BrowserSwitchTabTool-Output__1": "#/components/schemas/BrowserSwitchTabTool-Output", + "openhands__tools__browser_use__definition__BrowserToolSet-Output__1": "#/components/schemas/BrowserToolSet-Output", + "openhands__tools__browser_use__definition__BrowserTypeTool-Output__1": "#/components/schemas/BrowserTypeTool-Output", + "openhands__tools__delegate__definition__DelegateTool-Output__1": "#/components/schemas/DelegateTool-Output", + "openhands__tools__file_editor__definition__FileEditorTool-Output__1": "#/components/schemas/FileEditorTool-Output", + "openhands__tools__gemini__edit__definition__EditTool-Output__1": "#/components/schemas/EditTool-Output", + "openhands__tools__gemini__list_directory__definition__ListDirectoryTool-Output__1": "#/components/schemas/ListDirectoryTool-Output", + "openhands__tools__gemini__read_file__definition__ReadFileTool-Output__1": "#/components/schemas/ReadFileTool-Output", + "openhands__tools__gemini__write_file__definition__WriteFileTool-Output__1": "#/components/schemas/WriteFileTool-Output", + "openhands__tools__glob__definition__GlobTool-Output__1": "#/components/schemas/GlobTool-Output", + "openhands__tools__grep__definition__GrepTool-Output__1": "#/components/schemas/GrepTool-Output", + "openhands__tools__planning_file_editor__definition__PlanningFileEditorTool-Output__1": "#/components/schemas/PlanningFileEditorTool-Output", + "openhands__tools__task__definition__TaskTool-Output__1": "#/components/schemas/TaskTool-Output", + "openhands__tools__task__definition__TaskToolSet-Output__1": "#/components/schemas/TaskToolSet-Output", + "openhands__tools__task_tracker__definition__TaskTrackerTool-Output__1": "#/components/schemas/TaskTrackerTool-Output", + "openhands__tools__terminal__definition__TerminalTool-Output__1": "#/components/schemas/TerminalTool-Output", + "openhands__tools__tom_consult__definition__SleeptimeComputeTool-Output__1": "#/components/schemas/SleeptimeComputeTool-Output", + "openhands__tools__tom_consult__definition__TomConsultTool-Output__1": "#/components/schemas/TomConsultTool-Output" + } + } + }, + "ToolExecution": { + "properties": { + "taskSupport": { + "anyOf": [ + { + "type": "string", + "enum": [ + "forbidden", + "optional", + "required" + ] + }, + { + "type": "null" + } + ], + "title": "Tasksupport" + } + }, + "additionalProperties": true, + "type": "object", + "title": "ToolExecution", + "description": "Execution-related properties for a tool." + }, + "UpdateConversationRequest": { + "properties": { + "title": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Title", + "description": "New conversation title" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "title" + ], + "title": "UpdateConversationRequest", + "description": "Request model for updating conversation metadata." + }, + "UserAppSettingsResponse": { + "properties": { + "language": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Language" + }, + "user_consents_to_analytics": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "User Consents To Analytics" + }, + "enable_sound_notifications": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Sound Notifications" + }, + "git_user_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git User Name" + }, + "git_user_email": { + "anyOf": [ + { + "type": "string", + "format": "email" + }, + { + "type": "null" + } + ], + "title": "Git User Email" + } + }, + "type": "object", + "title": "UserAppSettingsResponse", + "description": "Response model for user app settings." + }, + "UserAppSettingsUpdate": { + "properties": { + "language": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Language" + }, + "user_consents_to_analytics": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "User Consents To Analytics" + }, + "enable_sound_notifications": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Enable Sound Notifications" + }, + "git_user_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Git User Name" + }, + "git_user_email": { + "anyOf": [ + { + "type": "string", + "format": "email" + }, + { + "type": "null" + } + ], + "title": "Git User Email" + } + }, + "type": "object", + "title": "UserAppSettingsUpdate", + "description": "Request model for updating user app settings (partial update)." + }, + "UserGitInfo": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "login": { + "type": "string", + "title": "Login" + }, + "avatar_url": { + "type": "string", + "title": "Avatar Url" + }, + "company": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Company" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + } + }, + "type": "object", + "required": [ + "id", + "login", + "avatar_url" + ], + "title": "UserGitInfo" + }, + "UserRejectObservation-Input": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "The tool name that this observation is responding to" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id", + "description": "The tool call id that this observation is responding to" + }, + "rejection_reason": { + "type": "string", + "title": "Rejection Reason", + "description": "Reason for rejecting the action", + "default": "User rejected the action" + }, + "rejection_source": { + "type": "string", + "enum": [ + "user", + "hook" + ], + "title": "Rejection Source", + "description": "Source of the rejection: 'user' for confirmation mode rejections, 'hook' for PreToolUse hook blocks", + "default": "user" + }, + "action_id": { + "type": "string", + "title": "Action Id", + "description": "The action id that this observation is responding to" + }, + "kind": { + "type": "string", + "const": "UserRejectObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_name", + "tool_call_id", + "action_id" + ], + "title": "UserRejectObservation", + "description": "Observation when an action is rejected by user or hook.\n\nThis event is emitted when:\n- User rejects an action during confirmation mode (rejection_source=\"user\")\n- A PreToolUse hook blocks an action (rejection_source=\"hook\")" + }, + "UserRejectObservation-Output": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "Unique event id (ULID/UUID)" + }, + "timestamp": { + "type": "string", + "title": "Timestamp", + "description": "Event timestamp" + }, + "source": { + "type": "string", + "enum": [ + "agent", + "user", + "environment", + "hook" + ], + "title": "Source", + "default": "environment" + }, + "tool_name": { + "type": "string", + "title": "Tool Name", + "description": "The tool name that this observation is responding to" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id", + "description": "The tool call id that this observation is responding to" + }, + "rejection_reason": { + "type": "string", + "title": "Rejection Reason", + "description": "Reason for rejecting the action", + "default": "User rejected the action" + }, + "rejection_source": { + "type": "string", + "enum": [ + "user", + "hook" + ], + "title": "Rejection Source", + "description": "Source of the rejection: 'user' for confirmation mode rejections, 'hook' for PreToolUse hook blocks", + "default": "user" + }, + "action_id": { + "type": "string", + "title": "Action Id", + "description": "The action id that this observation is responding to" + }, + "kind": { + "type": "string", + "const": "UserRejectObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tool_name", + "tool_call_id", + "action_id", + "kind" + ], + "title": "UserRejectObservation", + "description": "Observation when an action is rejected by user or hook.\n\nThis event is emitted when:\n- User rejects an action during confirmation mode (rejection_source=\"user\")\n- A PreToolUse hook blocks an action (rejection_source=\"hook\")" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + }, + "input": { + "title": "Input" + }, + "ctx": { + "type": "object", + "title": "Context" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "VerifiedModel": { + "properties": { + "model_name": { + "type": "string", + "maxLength": 255, + "title": "Model Name" + }, + "provider": { + "type": "string", + "maxLength": 100, + "title": "Provider" + }, + "is_enabled": { + "type": "boolean", + "title": "Is Enabled", + "default": true + }, + "id": { + "type": "integer", + "title": "Id" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + } + }, + "type": "object", + "required": [ + "model_name", + "provider", + "id", + "created_at", + "updated_at" + ], + "title": "VerifiedModel" + }, + "VerifiedModelCreate": { + "properties": { + "model_name": { + "type": "string", + "maxLength": 255, + "title": "Model Name" + }, + "provider": { + "type": "string", + "maxLength": 100, + "title": "Provider" + }, + "is_enabled": { + "type": "boolean", + "title": "Is Enabled", + "default": true + } + }, + "type": "object", + "required": [ + "model_name", + "provider" + ], + "title": "VerifiedModelCreate" + }, + "VerifiedModelPage": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/VerifiedModel" + }, + "type": "array", + "title": "Items" + }, + "next_page_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Page Id" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "VerifiedModelPage", + "description": "Paginated response model for verified model list." + }, + "VerifiedModelUpdate": { + "properties": { + "is_enabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Is Enabled" + } + }, + "type": "object", + "title": "VerifiedModelUpdate" + }, + "WebClientConfig": { + "properties": { + "app_mode": { + "$ref": "#/components/schemas/AppMode" + }, + "posthog_client_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Posthog Client Key" + }, + "feature_flags": { + "$ref": "#/components/schemas/WebClientFeatureFlags" + }, + "providers_configured": { + "items": { + "$ref": "#/components/schemas/ProviderType" + }, + "type": "array", + "title": "Providers Configured" + }, + "maintenance_start_time": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Maintenance Start Time" + }, + "auth_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Auth Url" + }, + "recaptcha_site_key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Recaptcha Site Key" + }, + "faulty_models": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Faulty Models" + }, + "error_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error Message" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "title": "Updated At" + }, + "github_app_slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Github App Slug" + }, + "kind": { + "type": "string", + "const": "WebClientConfig", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "app_mode", + "posthog_client_key", + "feature_flags", + "providers_configured", + "maintenance_start_time", + "auth_url", + "recaptcha_site_key", + "faulty_models", + "error_message", + "updated_at", + "github_app_slug", + "kind" + ], + "title": "WebClientConfig" + }, + "WebClientFeatureFlags": { + "properties": { + "enable_billing": { + "type": "boolean", + "title": "Enable Billing", + "default": false + }, + "hide_llm_settings": { + "type": "boolean", + "title": "Hide Llm Settings", + "default": false + }, + "enable_jira": { + "type": "boolean", + "title": "Enable Jira", + "default": false + }, + "enable_jira_dc": { + "type": "boolean", + "title": "Enable Jira Dc", + "default": false + }, + "enable_linear": { + "type": "boolean", + "title": "Enable Linear", + "default": false + }, + "hide_users_page": { + "type": "boolean", + "title": "Hide Users Page", + "default": false + }, + "hide_billing_page": { + "type": "boolean", + "title": "Hide Billing Page", + "default": false + }, + "hide_integrations_page": { + "type": "boolean", + "title": "Hide Integrations Page", + "default": false + } + }, + "type": "object", + "title": "WebClientFeatureFlags" + }, + "WriteFileAction-Input": { + "properties": { + "file_path": { + "type": "string", + "title": "File Path", + "description": "The path to the file to write to." + }, + "content": { + "type": "string", + "title": "Content", + "description": "The content to write to the file." + }, + "kind": { + "type": "string", + "const": "WriteFileAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "file_path", + "content" + ], + "title": "WriteFileAction", + "description": "Schema for write file operation." + }, + "WriteFileAction-Output": { + "properties": { + "file_path": { + "type": "string", + "title": "File Path", + "description": "The path to the file to write to." + }, + "content": { + "type": "string", + "title": "Content", + "description": "The content to write to the file." + }, + "kind": { + "type": "string", + "const": "WriteFileAction", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "file_path", + "content", + "kind" + ], + "title": "WriteFileAction", + "description": "Schema for write file operation." + }, + "WriteFileObservation-Input": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "file_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Path", + "description": "The file path that was written." + }, + "is_new_file": { + "type": "boolean", + "title": "Is New File", + "description": "Whether a new file was created.", + "default": false + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content", + "description": "The previous content of the file (if it existed)." + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content", + "description": "The new content written to the file." + }, + "kind": { + "type": "string", + "const": "WriteFileObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "title": "WriteFileObservation", + "description": "Observation from writing a file." + }, + "WriteFileObservation-Output": { + "properties": { + "content": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextContent" + }, + { + "$ref": "#/components/schemas/ImageContent" + } + ] + }, + "type": "array", + "title": "Content", + "description": "Content returned from the tool as a list of TextContent/ImageContent objects. When there is an error, it should be written in this field." + }, + "is_error": { + "type": "boolean", + "title": "Is Error", + "description": "Whether the observation indicates an error", + "default": false + }, + "file_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File Path", + "description": "The file path that was written." + }, + "is_new_file": { + "type": "boolean", + "title": "Is New File", + "description": "Whether a new file was created.", + "default": false + }, + "old_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Old Content", + "description": "The previous content of the file (if it existed)." + }, + "new_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "New Content", + "description": "The new content written to the file." + }, + "kind": { + "type": "string", + "const": "WriteFileObservation", + "title": "Kind" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind" + ], + "title": "WriteFileObservation", + "description": "Observation from writing a file." + }, + "WriteFileTool-Input": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "WriteFileTool", + "title": "Kind" + } + }, + "type": "object", + "required": [ + "description", + "action_type" + ], + "title": "WriteFileTool", + "description": "Tool for writing complete file contents." + }, + "WriteFileTool-Output": { + "properties": { + "description": { + "type": "string", + "title": "Description" + }, + "action_type": { + "type": "string", + "title": "Action Type" + }, + "observation_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Type" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "kind": { + "type": "string", + "const": "WriteFileTool", + "title": "Kind" + }, + "title": { + "type": "string", + "title": "Title", + "readOnly": true + } + }, + "type": "object", + "required": [ + "description", + "action_type", + "kind", + "title" + ], + "title": "WriteFileTool", + "description": "Tool for writing complete file contents." + }, + "mcp__types__Tool": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "inputSchema": { + "additionalProperties": true, + "type": "object", + "title": "Inputschema" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Outputschema" + }, + "icons": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Icon" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Icons" + }, + "annotations": { + "anyOf": [ + { + "$ref": "#/components/schemas/mcp__types__ToolAnnotations" + }, + { + "type": "null" + } + ] + }, + "_meta": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Meta" + }, + "execution": { + "anyOf": [ + { + "$ref": "#/components/schemas/ToolExecution" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "name", + "inputSchema" + ], + "title": "Tool", + "description": "Definition for a tool the client can call." + }, + "mcp__types__ToolAnnotations": { + "properties": { + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "readOnlyHint": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Readonlyhint" + }, + "destructiveHint": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Destructivehint" + }, + "idempotentHint": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Idempotenthint" + }, + "openWorldHint": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Openworldhint" + } + }, + "additionalProperties": true, + "type": "object", + "title": "ToolAnnotations", + "description": "Additional properties describing a Tool to clients.\n\nNOTE: all properties in ToolAnnotations are **hints**.\nThey are not guaranteed to provide a faithful description of\ntool behavior (including descriptive properties like `title`).\n\nClients should never make tool use decisions based on ToolAnnotations\nreceived from untrusted servers." + }, + "openhands__sdk__tool__spec__Tool": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the tool class, e.g., 'TerminalTool'. Import it from an `openhands.tools.` subpackage.", + "examples": [ + "TerminalTool", + "FileEditorTool", + "TaskTrackerTool" + ] + }, + "params": { + "additionalProperties": true, + "type": "object", + "title": "Params", + "description": "Parameters for the tool's .create() method, e.g., {'working_dir': '/app'}", + "examples": [ + { + "working_dir": "/workspace" + } + ] + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "Tool", + "description": "Defines a tool to be initialized for the agent.\n\nThis is only used in agent-sdk for type schema for server use." + }, + "openhands__sdk__tool__tool__ToolAnnotations": { + "properties": { + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title", + "description": "A human-readable title for the tool." + }, + "readOnlyHint": { + "type": "boolean", + "title": "Readonlyhint", + "description": "If true, the tool does not modify its environment. Default: false", + "default": false + }, + "destructiveHint": { + "type": "boolean", + "title": "Destructivehint", + "description": "If true, the tool may perform destructive updates to its environment. If false, the tool performs only additive updates. (This property is meaningful only when `readOnlyHint == false`) Default: true", + "default": true + }, + "idempotentHint": { + "type": "boolean", + "title": "Idempotenthint", + "description": "If true, calling the tool repeatedly with the same arguments will have no additional effect on the its environment. (This property is meaningful only when `readOnlyHint == false`) Default: false", + "default": false + }, + "openWorldHint": { + "type": "boolean", + "title": "Openworldhint", + "description": "If true, this tool may interact with an 'open world' of external entities. If false, the tool's domain of interaction is closed. For example, the world of a web search tool is open, whereas that of a memory tool is not. Default: true", + "default": true + } + }, + "type": "object", + "title": "openhands.sdk.tool.tool.ToolAnnotations", + "description": "Annotations to provide hints about the tool's behavior.\n\nBased on Model Context Protocol (MCP) spec:\nhttps://github.com/modelcontextprotocol/modelcontextprotocol/blob/caf3424488b10b4a7b1f8cb634244a450a1f4400/schema/2025-06-18/schema.ts#L838" + } + }, + "securitySchemes": { + "APIKeyHeader": { + "type": "apiKey", + "in": "header", + "name": "X-Access-Token" + } + } + }, + "tags": [ + { + "name": "Conversations", + "description": "Create, manage, and monitor OpenHands conversations" + }, + { + "name": "Sandboxes", + "description": "Manage execution environments (sandboxes) for conversations" + }, + { + "name": "Configuration", + "description": "Access configuration and models" + }, + { + "name": "Users", + "description": "User information and settings" + }, + { + "name": "Secrets", + "description": "Manage secrets and credentials" + }, + { + "name": "Git", + "description": "Git provider integration endpoints" + }, + { + "name": "Skills", + "description": "Skills management" + }, + { + "name": "Webhooks", + "description": "Webhook endpoints for events" + } + ] +} \ No newline at end of file diff --git a/openhands/usage/api/v1.mdx b/openhands/usage/api/v1.mdx index 52e10fa90..2b11e1193 100644 --- a/openhands/usage/api/v1.mdx +++ b/openhands/usage/api/v1.mdx @@ -1,37 +1,189 @@ --- -title: REST API (V1) -description: Overview of the current V1 REST endpoints used by the Web app. +title: REST API (V1) Overview +description: Overview of the V1 REST API for OpenHands Cloud programmatic access. --- - - OpenHands is in a transition period: legacy (V0) endpoints still exist alongside - the new /api/v1 endpoints. +The OpenHands Cloud V1 REST API provides programmatic access to create and manage conversations, +control sandboxes, and integrate OpenHands into your workflows. - If you need the legacy OpenAPI reference, see the Legacy (V0) section in the Web tab. - + + For the complete API reference with request/response schemas, see the + **V1 REST API Reference** section in the navigation. + -## Overview +## Base URL -OpenHands V1 REST endpoints are mounted under: +All V1 API endpoints are mounted under: -- /api/v1 +``` +https://app.all-hands.dev/api/v1 +``` -These endpoints back the current Web UI and are intended for newer integrations. +## Authentication -## Key resources +All API requests require authentication via an API key. You can include your key using either: -The V1 API is organized around a few core concepts: +**Authorization header (recommended):** +```bash +Authorization: Bearer YOUR_API_KEY +``` -- **App conversations**: create/list conversations and access conversation metadata. - - POST /api/v1/app-conversations - - GET /api/v1/app-conversations +**Or X-Access-Token header:** +```bash +X-Access-Token: YOUR_API_KEY +``` -- **Sandboxes**: list/start/pause/resume the execution environments that power conversations. - - GET /api/v1/sandboxes/search - - POST /api/v1/sandboxes - - POST /api/v1/sandboxes/{id}/pause - - POST /api/v1/sandboxes/{id}/resume +To obtain an API key: +1. Log in to [OpenHands Cloud](https://app.all-hands.dev) +2. Navigate to **Settings > API Keys** +3. Click **Create API Key** and save the generated key securely -- **Sandbox specs**: list the available sandbox “templates” (e.g., Docker image presets). - - GET /api/v1/sandbox-specs/search +## Key Resources +The V1 API is organized around these core concepts: + +### Conversations + +Create, manage, and monitor OpenHands conversations: + +| Endpoint | Description | +|----------|-------------| +| `POST /api/v1/app-conversations` | Start a new conversation | +| `GET /api/v1/app-conversations/search` | List/search conversations | +| `GET /api/v1/app-conversations/{id}` | Get conversation details | +| `DELETE /api/v1/app-conversations/{id}` | Delete a conversation | +| `POST /api/v1/app-conversations/stream-start` | Start with streaming status updates | + +### Start Tasks + +Track conversation startup progress: + +| Endpoint | Description | +|----------|-------------| +| `GET /api/v1/app-conversations/start-tasks` | Get start task status by IDs | +| `GET /api/v1/app-conversations/start-tasks/search` | Search start tasks | + +### Sandboxes + +Manage execution environments: + +| Endpoint | Description | +|----------|-------------| +| `GET /api/v1/sandboxes/search` | List/search sandboxes | +| `POST /api/v1/sandboxes/{id}/pause` | Pause a sandbox | +| `POST /api/v1/sandboxes/{id}/resume` | Resume a paused sandbox | + +### Sandbox Specs + +List available sandbox templates: + +| Endpoint | Description | +|----------|-------------| +| `GET /api/v1/sandbox-specs/search` | Search available specs | + +### Events + +Access conversation events and send messages: + +| Endpoint | Description | +|----------|-------------| +| `GET /api/v1/conversation/{id}/events/search` | Search conversation events | +| `POST /api/v1/conversation/{id}/events` | Send a message to a conversation | + +### Configuration + +Access models and settings: + +| Endpoint | Description | +|----------|-------------| +| `GET /api/v1/config/models/search` | List available LLM models | +| `GET /api/v1/settings` | Get user settings | +| `POST /api/v1/settings` | Update user settings | + +### Git Integration + +Access connected repositories: + +| Endpoint | Description | +|----------|-------------| +| `GET /api/v1/git/installations/search` | List Git provider connections | +| `GET /api/v1/git/repositories/search` | Search repositories | +| `GET /api/v1/git/branches/search` | List branches | + +### Secrets + +Manage custom secrets: + +| Endpoint | Description | +|----------|-------------| +| `GET /api/v1/secrets` | List secrets (names only) | +| `POST /api/v1/secrets` | Create a secret | +| `DELETE /api/v1/secrets/{id}` | Delete a secret | + +## Quick Start Example + +Here's a complete example of starting a conversation and polling for completion: + +```python +import requests +import time + +API_KEY = "your-api-key" +BASE_URL = "https://app.all-hands.dev" + +headers = { + "Authorization": f"Bearer {API_KEY}", + "Content-Type": "application/json" +} + +# 1. Start a conversation +response = requests.post( + f"{BASE_URL}/api/v1/app-conversations", + headers=headers, + json={ + "initial_message": { + "content": [{"type": "text", "text": "Fix the typo in README.md"}] + }, + "selected_repository": "owner/repo" + } +) +start_task = response.json() +task_id = start_task["id"] +print(f"Start task ID: {task_id}") + +# 2. Poll until conversation is ready +conversation_id = None +while not conversation_id: + response = requests.get( + f"{BASE_URL}/api/v1/app-conversations/start-tasks", + headers=headers, + params={"ids": task_id} + ) + tasks = response.json() + if tasks and tasks[0].get("status") == "READY": + conversation_id = tasks[0]["app_conversation_id"] + else: + time.sleep(5) + +print(f"Conversation ready: {BASE_URL}/conversations/{conversation_id}") + +# 3. Poll conversation until agent finishes +while True: + response = requests.get( + f"{BASE_URL}/api/v1/app-conversations", + headers=headers, + params={"ids": conversation_id} + ) + conv = response.json()[0] + status = conv.get("execution_status") + print(f"Status: {status}") + + if status in ["finished", "error", "stuck"]: + break + time.sleep(30) +``` + +## Next Steps + +- **[Cloud API Guide](/openhands/usage/cloud/cloud-api)**: Detailed usage examples and patterns +- **V1 REST API Reference**: Complete endpoint documentation in the navigation From 0a038682b0b7dbf8edef87bc39839eb5557d9049 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 19 Apr 2026 12:58:49 +0000 Subject: [PATCH 2/4] Update API reference link to V1 and remove V0 REST API from nav - Update cloud-api.mdx to link to V1 REST API Reference - Remove V0 REST API group from Documentation > Additional Documentation > V0 Reference Co-authored-by: openhands --- docs.json | 6 +----- openhands/usage/cloud/cloud-api.mdx | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/docs.json b/docs.json index 5bd627b7a..ab950073a 100644 --- a/docs.json +++ b/docs.json @@ -97,11 +97,7 @@ } ] }, - "openhands/usage/v0/advanced/V0_configuration-options", - { - "group": "V0 REST API", - "openapi": "openapi/V0_openapi.json" - } + "openhands/usage/v0/advanced/V0_configuration-options" ] }, { diff --git a/openhands/usage/cloud/cloud-api.mdx b/openhands/usage/cloud/cloud-api.mdx index 6229e336c..b949fac7f 100644 --- a/openhands/usage/cloud/cloud-api.mdx +++ b/openhands/usage/cloud/cloud-api.mdx @@ -5,7 +5,7 @@ description: OpenHands Cloud provides a REST API that allows you to programmatic --- For the available API endpoints, refer to the -[OpenHands API Reference](https://docs.openhands.dev/api-reference). +[V1 REST API Reference](/openhands/usage/api/v1). ## Obtaining an API Key From 89310e692699a1d19cced5147d81900fb4c23e24 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 19 Apr 2026 13:13:13 +0000 Subject: [PATCH 3/4] Consolidate Cloud API docs into V1 API Reference overview - Replace quick start example in v1.mdx with comprehensive API Usage Example from cloud-api.mdx - Add streaming, status polling, and legacy V0 migration sections to v1.mdx - Remove cloud-api.mdx (now consolidated into v1.mdx) - Update docs.json to use v1.mdx as the main Cloud API overview page - Update all internal links from /openhands/usage/cloud/cloud-api to /openhands/usage/api/v1 Co-authored-by: openhands --- docs.json | 3 +- openhands/usage/api/v1.mdx | 554 ++++++++++++++++- openhands/usage/cli/cloud.mdx | 2 +- .../usage/cloud/bitbucket-installation.mdx | 2 +- openhands/usage/cloud/cloud-api.mdx | 570 ------------------ openhands/usage/cloud/cloud-ui.mdx | 4 +- openhands/usage/cloud/github-installation.mdx | 2 +- openhands/usage/cloud/gitlab-installation.mdx | 2 +- openhands/usage/cloud/plugin-launcher.mdx | 4 +- openhands/usage/llms/openhands-llms.mdx | 2 +- .../usage/settings/api-keys-settings.mdx | 2 +- 11 files changed, 533 insertions(+), 614 deletions(-) delete mode 100644 openhands/usage/cloud/cloud-api.mdx diff --git a/docs.json b/docs.json index ab950073a..eb4849c3f 100644 --- a/docs.json +++ b/docs.json @@ -399,9 +399,8 @@ { "group": "Cloud API", "pages": [ - "openhands/usage/cloud/cloud-api", - "openhands/usage/cloud/plugin-launcher", "openhands/usage/api/v1", + "openhands/usage/cloud/plugin-launcher", { "group": "V1 REST API Reference", "openapi": "openapi/V1_openapi.json" diff --git a/openhands/usage/api/v1.mdx b/openhands/usage/api/v1.mdx index 2b11e1193..51abdb529 100644 --- a/openhands/usage/api/v1.mdx +++ b/openhands/usage/api/v1.mdx @@ -34,9 +34,11 @@ X-Access-Token: YOUR_API_KEY ``` To obtain an API key: -1. Log in to [OpenHands Cloud](https://app.all-hands.dev) -2. Navigate to **Settings > API Keys** -3. Click **Create API Key** and save the generated key securely +1. Log in to your [OpenHands Cloud](https://app.all-hands.dev) account. +2. Navigate to the [Settings > API Keys](https://app.all-hands.dev/settings/api-keys) page. +3. Click **Create API Key**. +4. Give your key a descriptive name (Example: "Development" or "Production") and select **Create**. +5. Copy the generated API key and store it securely. It will only be shown once. ## Key Resources @@ -120,70 +122,558 @@ Manage custom secrets: | `POST /api/v1/secrets` | Create a secret | | `DELETE /api/v1/secrets/{id}` | Delete a secret | -## Quick Start Example +## API Usage Example (V1) -Here's a complete example of starting a conversation and polling for completion: +### Starting a New Conversation + +To start a new conversation with OpenHands to perform a task, +make a POST request to the V1 app-conversations endpoint. + + + + ```bash + curl -X POST "https://app.all-hands.dev/api/v1/app-conversations" \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "initial_message": { + "content": [{"type": "text", "text": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so."}] + }, + "selected_repository": "yourusername/your-repo" + }' + ``` + + + ```python + import requests + + api_key = "YOUR_API_KEY" + url = "https://app.all-hands.dev/api/v1/app-conversations" + + headers = { + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json" + } + + data = { + "initial_message": { + "content": [{"type": "text", "text": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so."}] + }, + "selected_repository": "yourusername/your-repo" + } + + response = requests.post(url, headers=headers, json=data) + result = response.json() + + # The response contains a start task with the conversation ID + conversation_id = result.get("app_conversation_id") or result.get("id") + print(f"Conversation Link: https://app.all-hands.dev/conversations/{conversation_id}") + print(f"Status: {result['status']}") + ``` + + + ```typescript + const apiKey = "YOUR_API_KEY"; + const url = "https://app.all-hands.dev/api/v1/app-conversations"; + + const headers = { + "Authorization": `Bearer ${apiKey}`, + "Content-Type": "application/json" + }; + + const data = { + initial_message: { + content: [{ type: "text", text: "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so." }] + }, + selected_repository: "yourusername/your-repo" + }; + + async function startConversation() { + try { + const response = await fetch(url, { + method: "POST", + headers: headers, + body: JSON.stringify(data) + }); + + const result = await response.json(); + + // The response contains a start task with the conversation ID + const conversationId = result.app_conversation_id || result.id; + console.log(`Conversation Link: https://app.all-hands.dev/conversations/${conversationId}`); + console.log(`Status: ${result.status}`); + + return result; + } catch (error) { + console.error("Error starting conversation:", error); + } + } + + startConversation(); + ``` + + + +#### Response + +The API will return a JSON object with details about the conversation start task: + +```json +{ + "id": "550e8400-e29b-41d4-a716-446655440000", + "status": "WORKING", + "app_conversation_id": "660e8400-e29b-41d4-a716-446655440001", + "sandbox_id": "sandbox-abc123", + "created_at": "2025-01-15T10:30:00Z" +} +``` + +The `status` field indicates the current state of the conversation startup process: +- `WORKING` - Initial processing +- `WAITING_FOR_SANDBOX` - Waiting for sandbox to be ready +- `PREPARING_REPOSITORY` - Cloning and setting up the repository +- `SETTING_UP_SKILLS` - Configuring agent skills and tools +- `READY` - Conversation is ready to use +- `ERROR` - An error occurred during startup + +You may receive an authentication error if: + +- You provided an invalid API key. +- You provided the wrong repository name. +- You don't have access to the repository. + +### Streaming Conversation Start (Optional) + +For real-time updates during conversation startup, you can use the streaming endpoint: + +```bash +curl -X POST "https://app.all-hands.dev/api/v1/app-conversations/stream-start" \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "initial_message": { + "content": [{"type": "text", "text": "Your task description here"}] + }, + "selected_repository": "yourusername/your-repo" + }' +``` + +#### Streaming Response + +The endpoint streams a JSON array incrementally. Each element represents a status update: + +```json +[ + {"id": "550e8400-e29b-41d4-a716-446655440000", "status": "WORKING", "created_at": "2025-01-15T10:30:00Z"}, + {"id": "550e8400-e29b-41d4-a716-446655440000", "status": "WAITING_FOR_SANDBOX", "created_at": "2025-01-15T10:30:00Z"}, + {"id": "550e8400-e29b-41d4-a716-446655440000", "status": "PREPARING_REPOSITORY", "created_at": "2025-01-15T10:30:00Z"}, + {"id": "550e8400-e29b-41d4-a716-446655440000", "status": "READY", "app_conversation_id": "660e8400-e29b-41d4-a716-446655440001", "sandbox_id": "sandbox-abc123", "created_at": "2025-01-15T10:30:00Z"} +] +``` + +Each update is streamed as it occurs, allowing you to provide real-time feedback to users about the conversation startup progress. + +### Checking Conversation Status + +After starting a conversation, you can check its status to monitor whether the agent has completed its task. + + + The examples below show basic polling patterns. For production use, add proper error handling, + exponential backoff, and handle network failures gracefully. + + +#### Step 1: Check Start Task Status + +When you start a conversation, you receive a start task ID. Poll this endpoint until `status` becomes `READY` and `app_conversation_id` is available: + +```bash +curl -X GET "https://app.all-hands.dev/api/v1/app-conversations/start-tasks?ids=TASK_ID" \ + -H "Authorization: Bearer YOUR_API_KEY" +``` + +**Response:** +```json +{ + "id": "550e8400-e29b-41d4-a716-446655440000", + "status": "READY", + "app_conversation_id": "660e8400-e29b-41d4-a716-446655440001", + "sandbox_id": "sandbox-abc123" +} +``` + +#### Step 2: Check Conversation Execution Status + +Once you have the `app_conversation_id`, check whether the agent has finished its task: + + + + ```bash + curl -X GET "https://app.all-hands.dev/api/v1/app-conversations?ids=CONVERSATION_ID" \ + -H "Authorization: Bearer YOUR_API_KEY" + ``` + + + ```python + import requests + + api_key = "YOUR_API_KEY" + conversation_id = "YOUR_CONVERSATION_ID" + + headers = { + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json" + } + + response = requests.get( + "https://app.all-hands.dev/api/v1/app-conversations", + headers=headers, + params={"ids": conversation_id} + ) + response.raise_for_status() # Raise exception for HTTP errors + conversations = response.json() + + if conversations: + conv = conversations[0] + print(f"Sandbox Status: {conv.get('sandbox_status')}") + print(f"Execution Status: {conv.get('execution_status')}") + else: + print("Conversation not found") + ``` + + + +**Response:** +```json +[ + { + "id": "660e8400-e29b-41d4-a716-446655440001", + "sandbox_status": "RUNNING", + "execution_status": "finished", + "selected_repository": "yourusername/your-repo", + "title": "Fix README" + } +] +``` + +#### Status Fields + +**`sandbox_status`** - The state of the sandbox environment: +- `STARTING` - Sandbox is being created. **Action:** Continue polling. +- `RUNNING` - Sandbox is active. **Action:** Check `execution_status` for task progress. +- `PAUSED` - Sandbox is paused (due to rate limits or user action). **Action:** The sandbox will resume automatically when resources are available, or resume manually via the UI. +- `ERROR` - Sandbox encountered an error. **Action:** This is a terminal state. Check conversation details in the UI for error information. +- `MISSING` - Sandbox was deleted. **Action:** This is a terminal state. Start a new conversation if needed. + +**`execution_status`** - The state of the agent's task (available when sandbox is `RUNNING`): +- `idle` - Agent is ready to receive tasks. **Action:** Continue polling if task was recently submitted. +- `running` - Agent is actively working. **Action:** Continue polling. +- `paused` - Execution is paused. **Action:** Continue polling; will resume automatically. +- `waiting_for_confirmation` - Agent is waiting for user confirmation. **Action:** This is a blocking state. The agent needs user input via the UI to proceed. Your polling loop should treat this as a terminal state or alert the user. +- `finished` - Agent has completed the task. **Action:** Terminal state. Task is done successfully. +- `error` - Agent encountered an error. **Action:** Terminal state. Check conversation in UI for error details. +- `stuck` - Agent is stuck and unable to proceed. **Action:** Terminal state. Manual intervention may be required. + + + **Terminal states** that should exit your polling loop: `finished`, `error`, `stuck`, `waiting_for_confirmation`. + The `waiting_for_confirmation` state requires user action through the UI before the agent can continue. + + +#### Complete Polling Example + +Here's a complete example that starts a conversation and polls until completion: ```python import requests import time -API_KEY = "your-api-key" -BASE_URL = "https://app.all-hands.dev" +api_key = "YOUR_API_KEY" +base_url = "https://app.all-hands.dev" headers = { - "Authorization": f"Bearer {API_KEY}", + "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } -# 1. Start a conversation -response = requests.post( - f"{BASE_URL}/api/v1/app-conversations", +# Start a conversation +print("Starting conversation...") +start_response = requests.post( + f"{base_url}/api/v1/app-conversations", headers=headers, json={ "initial_message": { - "content": [{"type": "text", "text": "Fix the typo in README.md"}] + "content": [{"type": "text", "text": "Your task here"}] }, - "selected_repository": "owner/repo" + "selected_repository": "yourusername/your-repo" } ) -start_task = response.json() +start_response.raise_for_status() +start_task = start_response.json() task_id = start_task["id"] print(f"Start task ID: {task_id}") -# 2. Poll until conversation is ready +# Poll start task until conversation is ready (with timeout) conversation_id = None -while not conversation_id: - response = requests.get( - f"{BASE_URL}/api/v1/app-conversations/start-tasks", +max_attempts = 60 # 5 minutes with 5-second intervals +attempts = 0 +while not conversation_id and attempts < max_attempts: + task_response = requests.get( + f"{base_url}/api/v1/app-conversations/start-tasks", headers=headers, params={"ids": task_id} ) - tasks = response.json() + task_response.raise_for_status() + tasks = task_response.json() + if tasks and tasks[0].get("status") == "READY": - conversation_id = tasks[0]["app_conversation_id"] + conversation_id = tasks[0].get("app_conversation_id") + print(f"Conversation ready: {base_url}/conversations/{conversation_id}") + elif tasks and tasks[0].get("status") == "ERROR": + print(f"Start task failed: {tasks[0].get('error', 'Unknown error')}") + exit(1) else: + status = tasks[0].get("status") if tasks else "no response" + print(f"Start task status: {status}") time.sleep(5) - -print(f"Conversation ready: {BASE_URL}/conversations/{conversation_id}") - -# 3. Poll conversation until agent finishes -while True: - response = requests.get( - f"{BASE_URL}/api/v1/app-conversations", + attempts += 1 + +if not conversation_id: + print("Timeout waiting for conversation to start") + exit(1) + +# Poll conversation until agent finishes (with timeout) +# Terminal states: finished, error, stuck, waiting_for_confirmation +max_attempts = 120 # 1 hour with 30-second intervals +attempts = 0 +while attempts < max_attempts: + conv_response = requests.get( + f"{base_url}/api/v1/app-conversations", headers=headers, params={"ids": conversation_id} ) - conv = response.json()[0] - status = conv.get("execution_status") - print(f"Status: {status}") + conv_response.raise_for_status() + conversations = conv_response.json() + + if not conversations: + print("Warning: Conversation not found") + time.sleep(30) + attempts += 1 + continue + + conv = conversations[0] + sandbox_status = conv.get("sandbox_status") + exec_status = conv.get("execution_status") + + # Check sandbox health first + if sandbox_status in ["ERROR", "MISSING"]: + print(f"Sandbox failed with status: {sandbox_status}") + exit(1) - if status in ["finished", "error", "stuck"]: + print(f"Execution status: {exec_status}") + + # Check for terminal states + if exec_status in ["finished", "error", "stuck"]: + print(f"Conversation completed with status: {exec_status}") + break + elif exec_status == "waiting_for_confirmation": + print("Agent is waiting for user confirmation in the UI") + print(f"Visit: {base_url}/conversations/{conversation_id}") break + time.sleep(30) + attempts += 1 +else: + print("Timeout waiting for conversation to complete") + exit(1) +``` + +### Listing All Conversations + +To list all your conversations, use the search endpoint: + + + + ```bash + curl -X GET "https://app.all-hands.dev/api/v1/app-conversations/search?limit=20" \ + -H "Authorization: Bearer YOUR_API_KEY" + ``` + + + ```python + import requests + + api_key = "YOUR_API_KEY" + headers = {"Authorization": f"Bearer {api_key}"} + + response = requests.get( + "https://app.all-hands.dev/api/v1/app-conversations/search", + headers=headers, + params={"limit": 20} + ) + response.raise_for_status() + result = response.json() + + for conv in result.get("items", []): + print(f"ID: {conv['id']}, Status: {conv.get('execution_status')}") + ``` + + + +**Response:** +```json +{ + "items": [ + { + "id": "660e8400-e29b-41d4-a716-446655440001", + "sandbox_status": "RUNNING", + "execution_status": "finished", + "selected_repository": "yourusername/your-repo", + "title": "Fix README" + } + ], + "next_page_id": null +} +``` + + + The search endpoint returns conversations in the `items` array. Use `next_page_id` + for pagination if you have more conversations than the `limit`. + + +## Rate Limits + +If you have too many conversations running at once, older conversations will be paused to limit the number of concurrent conversations. +If you're running into issues and need a higher limit for your use case, please contact us at [contact@all-hands.dev](mailto:contact@all-hands.dev). + +--- + +## Migrating from V0 to V1 API + + + The V0 API (`/api/conversations`) is deprecated and scheduled for removal on **April 1, 2026**. + Please migrate to the V1 API (`/api/v1/app-conversations`) as soon as possible. + + +### Key Differences + +| Feature | V0 API | V1 API | +|---------|--------|--------| +| Endpoint | `POST /api/conversations` | `POST /api/v1/app-conversations` | +| Message format | `initial_user_msg` (string) | `initial_message.content` (array of content objects) | +| Repository field | `repository` | `selected_repository` | +| Response | Immediate `conversation_id` | Start task with `status` and eventual `app_conversation_id` | + +### Migration Steps + +1. **Update the endpoint URL**: Change from `/api/conversations` to `/api/v1/app-conversations` + +2. **Update the request body**: + - Change `repository` to `selected_repository` + - Change `initial_user_msg` (string) to `initial_message` (object with content array): + ```json + // V0 format + { "initial_user_msg": "Your message here" } + + // V1 format + { "initial_message": { "content": [{"type": "text", "text": "Your message here"}] } } + ``` + +3. **Update response handling**: The V1 API returns a start task object. The conversation ID is in the `app_conversation_id` field (available when status is `READY`), or use the `id` field for the start task ID. + +--- + +## Legacy API (V0) - Deprecated + + + The V0 API is deprecated since version 1.0.0 and will be removed on **April 1, 2026**. + New integrations should use the V1 API documented above. + + +### Starting a New Conversation (V0) + + + + ```bash + curl -X POST "https://app.all-hands.dev/api/conversations" \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "initial_user_msg": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.", + "repository": "yourusername/your-repo" + }' + ``` + + + ```python + import requests + + api_key = "YOUR_API_KEY" + url = "https://app.all-hands.dev/api/conversations" + + headers = { + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json" + } + + data = { + "initial_user_msg": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.", + "repository": "yourusername/your-repo" + } + + response = requests.post(url, headers=headers, json=data) + conversation = response.json() + + print(f"Conversation Link: https://app.all-hands.dev/conversations/{conversation['conversation_id']}") + print(f"Status: {conversation['status']}") + ``` + + + ```typescript + const apiKey = "YOUR_API_KEY"; + const url = "https://app.all-hands.dev/api/conversations"; + + const headers = { + "Authorization": `Bearer ${apiKey}`, + "Content-Type": "application/json" + }; + + const data = { + initial_user_msg: "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.", + repository: "yourusername/your-repo" + }; + + async function startConversation() { + try { + const response = await fetch(url, { + method: "POST", + headers: headers, + body: JSON.stringify(data) + }); + + const conversation = await response.json(); + + console.log(`Conversation Link: https://app.all-hands.dev/conversations/${conversation.conversation_id}`); + console.log(`Status: ${conversation.status}`); + + return conversation; + } catch (error) { + console.error("Error starting conversation:", error); + } + } + + startConversation(); + ``` + + + +#### Response (V0) + +```json +{ + "status": "ok", + "conversation_id": "abc1234" +} ``` ## Next Steps -- **[Cloud API Guide](/openhands/usage/cloud/cloud-api)**: Detailed usage examples and patterns - **V1 REST API Reference**: Complete endpoint documentation in the navigation diff --git a/openhands/usage/cli/cloud.mdx b/openhands/usage/cli/cloud.mdx index a9a173959..489890108 100644 --- a/openhands/usage/cli/cloud.mdx +++ b/openhands/usage/cli/cloud.mdx @@ -127,4 +127,4 @@ Use OpenHands Cloud for collaboration, on-the-go access, or when you don't want - [OpenHands Cloud](/openhands/usage/cloud/openhands-cloud) - Full cloud documentation - [Cloud UI](/openhands/usage/cloud/cloud-ui) - Web interface guide -- [Cloud API](/openhands/usage/cloud/cloud-api) - Programmatic access +- [Cloud API](/openhands/usage/api/v1) - Programmatic access diff --git a/openhands/usage/cloud/bitbucket-installation.mdx b/openhands/usage/cloud/bitbucket-installation.mdx index eeca47537..a6beeae14 100644 --- a/openhands/usage/cloud/bitbucket-installation.mdx +++ b/openhands/usage/cloud/bitbucket-installation.mdx @@ -46,4 +46,4 @@ OpenHands to access your repositories: ## Next Steps - [Learn about the Cloud UI](/openhands/usage/cloud/cloud-ui). -- [Use the Cloud API](/openhands/usage/cloud/cloud-api) to programmatically interact with OpenHands. +- [Use the Cloud API](/openhands/usage/api/v1) to programmatically interact with OpenHands. diff --git a/openhands/usage/cloud/cloud-api.mdx b/openhands/usage/cloud/cloud-api.mdx deleted file mode 100644 index b949fac7f..000000000 --- a/openhands/usage/cloud/cloud-api.mdx +++ /dev/null @@ -1,570 +0,0 @@ ---- -title: Cloud API -description: OpenHands Cloud provides a REST API that allows you to programmatically interact with OpenHands. - This guide explains how to obtain an API key and use the API to start conversations and retrieve their status. ---- - -For the available API endpoints, refer to the -[V1 REST API Reference](/openhands/usage/api/v1). - -## Obtaining an API Key - -To use the OpenHands Cloud API, you'll need to generate an API key: - -1. Log in to your [OpenHands Cloud](https://app.all-hands.dev) account. -2. Navigate to the [Settings > API Keys](https://app.all-hands.dev/settings/api-keys) page. -3. Click `Create API Key`. -4. Give your key a descriptive name (Example: "Development" or "Production") and select `Create`. -5. Copy the generated API key and store it securely. It will only be shown once. - -## API Usage Example (V1) - -### Starting a New Conversation - -To start a new conversation with OpenHands to perform a task, -make a POST request to the V1 app-conversations endpoint. - - - - ```bash - curl -X POST "https://app.all-hands.dev/api/v1/app-conversations" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -H "Content-Type: application/json" \ - -d '{ - "initial_message": { - "content": [{"type": "text", "text": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so."}] - }, - "selected_repository": "yourusername/your-repo" - }' - ``` - - - ```python - import requests - - api_key = "YOUR_API_KEY" - url = "https://app.all-hands.dev/api/v1/app-conversations" - - headers = { - "Authorization": f"Bearer {api_key}", - "Content-Type": "application/json" - } - - data = { - "initial_message": { - "content": [{"type": "text", "text": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so."}] - }, - "selected_repository": "yourusername/your-repo" - } - - response = requests.post(url, headers=headers, json=data) - result = response.json() - - # The response contains a start task with the conversation ID - conversation_id = result.get("app_conversation_id") or result.get("id") - print(f"Conversation Link: https://app.all-hands.dev/conversations/{conversation_id}") - print(f"Status: {result['status']}") - ``` - - - ```typescript - const apiKey = "YOUR_API_KEY"; - const url = "https://app.all-hands.dev/api/v1/app-conversations"; - - const headers = { - "Authorization": `Bearer ${apiKey}`, - "Content-Type": "application/json" - }; - - const data = { - initial_message: { - content: [{ type: "text", text: "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so." }] - }, - selected_repository: "yourusername/your-repo" - }; - - async function startConversation() { - try { - const response = await fetch(url, { - method: "POST", - headers: headers, - body: JSON.stringify(data) - }); - - const result = await response.json(); - - // The response contains a start task with the conversation ID - const conversationId = result.app_conversation_id || result.id; - console.log(`Conversation Link: https://app.all-hands.dev/conversations/${conversationId}`); - console.log(`Status: ${result.status}`); - - return result; - } catch (error) { - console.error("Error starting conversation:", error); - } - } - - startConversation(); - ``` - - - -#### Response - -The API will return a JSON object with details about the conversation start task: - -```json -{ - "id": "550e8400-e29b-41d4-a716-446655440000", - "status": "WORKING", - "app_conversation_id": "660e8400-e29b-41d4-a716-446655440001", - "sandbox_id": "sandbox-abc123", - "created_at": "2025-01-15T10:30:00Z" -} -``` - -The `status` field indicates the current state of the conversation startup process: -- `WORKING` - Initial processing -- `WAITING_FOR_SANDBOX` - Waiting for sandbox to be ready -- `PREPARING_REPOSITORY` - Cloning and setting up the repository -- `SETTING_UP_SKILLS` - Configuring agent skills and tools -- `READY` - Conversation is ready to use -- `ERROR` - An error occurred during startup - -You may receive an authentication error if: - -- You provided an invalid API key. -- You provided the wrong repository name. -- You don't have access to the repository. - -### Streaming Conversation Start (Optional) - -For real-time updates during conversation startup, you can use the streaming endpoint: - -```bash -curl -X POST "https://app.all-hands.dev/api/v1/app-conversations/stream-start" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -H "Content-Type: application/json" \ - -d '{ - "initial_message": { - "content": [{"type": "text", "text": "Your task description here"}] - }, - "selected_repository": "yourusername/your-repo" - }' -``` - -#### Streaming Response - -The endpoint streams a JSON array incrementally. Each element represents a status update: - -```json -[ - {"id": "550e8400-e29b-41d4-a716-446655440000", "status": "WORKING", "created_at": "2025-01-15T10:30:00Z"}, - {"id": "550e8400-e29b-41d4-a716-446655440000", "status": "WAITING_FOR_SANDBOX", "created_at": "2025-01-15T10:30:00Z"}, - {"id": "550e8400-e29b-41d4-a716-446655440000", "status": "PREPARING_REPOSITORY", "created_at": "2025-01-15T10:30:00Z"}, - {"id": "550e8400-e29b-41d4-a716-446655440000", "status": "READY", "app_conversation_id": "660e8400-e29b-41d4-a716-446655440001", "sandbox_id": "sandbox-abc123", "created_at": "2025-01-15T10:30:00Z"} -] -``` - -Each update is streamed as it occurs, allowing you to provide real-time feedback to users about the conversation startup progress. - -### Checking Conversation Status - -After starting a conversation, you can check its status to monitor whether the agent has completed its task. - - - The examples below show basic polling patterns. For production use, add proper error handling, - exponential backoff, and handle network failures gracefully. - - -#### Step 1: Check Start Task Status - -When you start a conversation, you receive a start task ID. Poll this endpoint until `status` becomes `READY` and `app_conversation_id` is available: - -```bash -curl -X GET "https://app.all-hands.dev/api/v1/app-conversations/start-tasks?ids=TASK_ID" \ - -H "Authorization: Bearer YOUR_API_KEY" -``` - -**Response:** -```json -{ - "id": "550e8400-e29b-41d4-a716-446655440000", - "status": "READY", - "app_conversation_id": "660e8400-e29b-41d4-a716-446655440001", - "sandbox_id": "sandbox-abc123" -} -``` - -#### Step 2: Check Conversation Execution Status - -Once you have the `app_conversation_id`, check whether the agent has finished its task: - - - - ```bash - curl -X GET "https://app.all-hands.dev/api/v1/app-conversations?ids=CONVERSATION_ID" \ - -H "Authorization: Bearer YOUR_API_KEY" - ``` - - - ```python - import requests - - api_key = "YOUR_API_KEY" - conversation_id = "YOUR_CONVERSATION_ID" - - headers = { - "Authorization": f"Bearer {api_key}", - "Content-Type": "application/json" - } - - response = requests.get( - "https://app.all-hands.dev/api/v1/app-conversations", - headers=headers, - params={"ids": conversation_id} - ) - response.raise_for_status() # Raise exception for HTTP errors - conversations = response.json() - - if conversations: - conv = conversations[0] - print(f"Sandbox Status: {conv.get('sandbox_status')}") - print(f"Execution Status: {conv.get('execution_status')}") - else: - print("Conversation not found") - ``` - - - -**Response:** -```json -[ - { - "id": "660e8400-e29b-41d4-a716-446655440001", - "sandbox_status": "RUNNING", - "execution_status": "finished", - "selected_repository": "yourusername/your-repo", - "title": "Fix README" - } -] -``` - -#### Status Fields - -**`sandbox_status`** - The state of the sandbox environment: -- `STARTING` - Sandbox is being created. **Action:** Continue polling. -- `RUNNING` - Sandbox is active. **Action:** Check `execution_status` for task progress. -- `PAUSED` - Sandbox is paused (due to rate limits or user action). **Action:** The sandbox will resume automatically when resources are available, or resume manually via the UI. -- `ERROR` - Sandbox encountered an error. **Action:** This is a terminal state. Check conversation details in the UI for error information. -- `MISSING` - Sandbox was deleted. **Action:** This is a terminal state. Start a new conversation if needed. - -**`execution_status`** - The state of the agent's task (available when sandbox is `RUNNING`): -- `idle` - Agent is ready to receive tasks. **Action:** Continue polling if task was recently submitted. -- `running` - Agent is actively working. **Action:** Continue polling. -- `paused` - Execution is paused. **Action:** Continue polling; will resume automatically. -- `waiting_for_confirmation` - Agent is waiting for user confirmation. **Action:** This is a blocking state. The agent needs user input via the UI to proceed. Your polling loop should treat this as a terminal state or alert the user. -- `finished` - Agent has completed the task. **Action:** Terminal state. Task is done successfully. -- `error` - Agent encountered an error. **Action:** Terminal state. Check conversation in UI for error details. -- `stuck` - Agent is stuck and unable to proceed. **Action:** Terminal state. Manual intervention may be required. - - - **Terminal states** that should exit your polling loop: `finished`, `error`, `stuck`, `waiting_for_confirmation`. - The `waiting_for_confirmation` state requires user action through the UI before the agent can continue. - - -#### Complete Polling Example - -Here's a complete example that starts a conversation and polls until completion: - -```python -import requests -import time - -api_key = "YOUR_API_KEY" -base_url = "https://app.all-hands.dev" - -headers = { - "Authorization": f"Bearer {api_key}", - "Content-Type": "application/json" -} - -# Start a conversation -print("Starting conversation...") -start_response = requests.post( - f"{base_url}/api/v1/app-conversations", - headers=headers, - json={ - "initial_message": { - "content": [{"type": "text", "text": "Your task here"}] - }, - "selected_repository": "yourusername/your-repo" - } -) -start_response.raise_for_status() -start_task = start_response.json() -task_id = start_task["id"] -print(f"Start task ID: {task_id}") - -# Poll start task until conversation is ready (with timeout) -conversation_id = None -max_attempts = 60 # 5 minutes with 5-second intervals -attempts = 0 -while not conversation_id and attempts < max_attempts: - task_response = requests.get( - f"{base_url}/api/v1/app-conversations/start-tasks", - headers=headers, - params={"ids": task_id} - ) - task_response.raise_for_status() - tasks = task_response.json() - - if tasks and tasks[0].get("status") == "READY": - conversation_id = tasks[0].get("app_conversation_id") - print(f"Conversation ready: {base_url}/conversations/{conversation_id}") - elif tasks and tasks[0].get("status") == "ERROR": - print(f"Start task failed: {tasks[0].get('error', 'Unknown error')}") - exit(1) - else: - status = tasks[0].get("status") if tasks else "no response" - print(f"Start task status: {status}") - time.sleep(5) - attempts += 1 - -if not conversation_id: - print("Timeout waiting for conversation to start") - exit(1) - -# Poll conversation until agent finishes (with timeout) -# Terminal states: finished, error, stuck, waiting_for_confirmation -max_attempts = 120 # 1 hour with 30-second intervals -attempts = 0 -while attempts < max_attempts: - conv_response = requests.get( - f"{base_url}/api/v1/app-conversations", - headers=headers, - params={"ids": conversation_id} - ) - conv_response.raise_for_status() - conversations = conv_response.json() - - if not conversations: - print("Warning: Conversation not found") - time.sleep(30) - attempts += 1 - continue - - conv = conversations[0] - sandbox_status = conv.get("sandbox_status") - exec_status = conv.get("execution_status") - - # Check sandbox health first - if sandbox_status in ["ERROR", "MISSING"]: - print(f"Sandbox failed with status: {sandbox_status}") - exit(1) - - print(f"Execution status: {exec_status}") - - # Check for terminal states - if exec_status in ["finished", "error", "stuck"]: - print(f"Conversation completed with status: {exec_status}") - break - elif exec_status == "waiting_for_confirmation": - print("Agent is waiting for user confirmation in the UI") - print(f"Visit: {base_url}/conversations/{conversation_id}") - break - - time.sleep(30) - attempts += 1 -else: - print("Timeout waiting for conversation to complete") - exit(1) -``` - -### Listing All Conversations - -To list all your conversations, use the search endpoint: - - - - ```bash - curl -X GET "https://app.all-hands.dev/api/v1/app-conversations/search?limit=20" \ - -H "Authorization: Bearer YOUR_API_KEY" - ``` - - - ```python - import requests - - api_key = "YOUR_API_KEY" - headers = {"Authorization": f"Bearer {api_key}"} - - response = requests.get( - "https://app.all-hands.dev/api/v1/app-conversations/search", - headers=headers, - params={"limit": 20} - ) - response.raise_for_status() - result = response.json() - - for conv in result.get("items", []): - print(f"ID: {conv['id']}, Status: {conv.get('execution_status')}") - ``` - - - -**Response:** -```json -{ - "items": [ - { - "id": "660e8400-e29b-41d4-a716-446655440001", - "sandbox_status": "RUNNING", - "execution_status": "finished", - "selected_repository": "yourusername/your-repo", - "title": "Fix README" - } - ], - "next_page_id": null -} -``` - - - The search endpoint returns conversations in the `items` array. Use `next_page_id` - for pagination if you have more conversations than the `limit`. - - -## Rate Limits - -If you have too many conversations running at once, older conversations will be paused to limit the number of concurrent conversations. -If you're running into issues and need a higher limit for your use case, please contact us at [contact@all-hands.dev](mailto:contact@all-hands.dev). - ---- - -## Migrating from V0 to V1 API - - - The V0 API (`/api/conversations`) is deprecated and scheduled for removal on **April 1, 2026**. - Please migrate to the V1 API (`/api/v1/app-conversations`) as soon as possible. - - -### Key Differences - -| Feature | V0 API | V1 API | -|---------|--------|--------| -| Endpoint | `POST /api/conversations` | `POST /api/v1/app-conversations` | -| Message format | `initial_user_msg` (string) | `initial_message.content` (array of content objects) | -| Repository field | `repository` | `selected_repository` | -| Response | Immediate `conversation_id` | Start task with `status` and eventual `app_conversation_id` | - -### Migration Steps - -1. **Update the endpoint URL**: Change from `/api/conversations` to `/api/v1/app-conversations` - -2. **Update the request body**: - - Change `repository` to `selected_repository` - - Change `initial_user_msg` (string) to `initial_message` (object with content array): - ```json - // V0 format - { "initial_user_msg": "Your message here" } - - // V1 format - { "initial_message": { "content": [{"type": "text", "text": "Your message here"}] } } - ``` - -3. **Update response handling**: The V1 API returns a start task object. The conversation ID is in the `app_conversation_id` field (available when status is `READY`), or use the `id` field for the start task ID. - ---- - -## Legacy API (V0) - Deprecated - - - The V0 API is deprecated since version 1.0.0 and will be removed on **April 1, 2026**. - New integrations should use the V1 API documented above. - - -### Starting a New Conversation (V0) - - - - ```bash - curl -X POST "https://app.all-hands.dev/api/conversations" \ - -H "Authorization: Bearer YOUR_API_KEY" \ - -H "Content-Type: application/json" \ - -d '{ - "initial_user_msg": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.", - "repository": "yourusername/your-repo" - }' - ``` - - - ```python - import requests - - api_key = "YOUR_API_KEY" - url = "https://app.all-hands.dev/api/conversations" - - headers = { - "Authorization": f"Bearer {api_key}", - "Content-Type": "application/json" - } - - data = { - "initial_user_msg": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.", - "repository": "yourusername/your-repo" - } - - response = requests.post(url, headers=headers, json=data) - conversation = response.json() - - print(f"Conversation Link: https://app.all-hands.dev/conversations/{conversation['conversation_id']}") - print(f"Status: {conversation['status']}") - ``` - - - ```typescript - const apiKey = "YOUR_API_KEY"; - const url = "https://app.all-hands.dev/api/conversations"; - - const headers = { - "Authorization": `Bearer ${apiKey}`, - "Content-Type": "application/json" - }; - - const data = { - initial_user_msg: "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.", - repository: "yourusername/your-repo" - }; - - async function startConversation() { - try { - const response = await fetch(url, { - method: "POST", - headers: headers, - body: JSON.stringify(data) - }); - - const conversation = await response.json(); - - console.log(`Conversation Link: https://app.all-hands.dev/conversations/${conversation.conversation_id}`); - console.log(`Status: ${conversation.status}`); - - return conversation; - } catch (error) { - console.error("Error starting conversation:", error); - } - } - - startConversation(); - ``` - - - -#### Response (V0) - -```json -{ - "status": "ok", - "conversation_id": "abc1234" -} -``` diff --git a/openhands/usage/cloud/cloud-ui.mdx b/openhands/usage/cloud/cloud-ui.mdx index 09cbb9206..3ab9d7f94 100644 --- a/openhands/usage/cloud/cloud-ui.mdx +++ b/openhands/usage/cloud/cloud-ui.mdx @@ -37,7 +37,7 @@ Settings are divided across tabs, with each tab focusing on a specific area of c - `Secrets` - [Manage secrets](/openhands/usage/settings/secrets-settings). - `API Keys` - - [Create API keys to work with OpenHands programmatically](/openhands/usage/cloud/cloud-api). + - [Create API keys to work with OpenHands programmatically](/openhands/usage/api/v1). - `MCP` - [Setup an MCP server](/openhands/usage/settings/mcp-settings) @@ -50,4 +50,4 @@ section of the documentation. - [Use OpenHands with your GitHub repositories](/openhands/usage/cloud/github-installation). - [Use OpenHands with your GitLab repositories](/openhands/usage/cloud/gitlab-installation). -- [Use the Cloud API](/openhands/usage/cloud/cloud-api) to programmatically interact with OpenHands. +- [Use the Cloud API](/openhands/usage/api/v1) to programmatically interact with OpenHands. diff --git a/openhands/usage/cloud/github-installation.mdx b/openhands/usage/cloud/github-installation.mdx index ce4a5de97..823c1d926 100644 --- a/openhands/usage/cloud/github-installation.mdx +++ b/openhands/usage/cloud/github-installation.mdx @@ -76,4 +76,4 @@ permissions to access both repositories. ## Next Steps - [Learn about the Cloud UI](/openhands/usage/cloud/cloud-ui). -- [Use the Cloud API](/openhands/usage/cloud/cloud-api) to programmatically interact with OpenHands. +- [Use the Cloud API](/openhands/usage/api/v1) to programmatically interact with OpenHands. diff --git a/openhands/usage/cloud/gitlab-installation.mdx b/openhands/usage/cloud/gitlab-installation.mdx index 25235fa2e..77cb5edf2 100644 --- a/openhands/usage/cloud/gitlab-installation.mdx +++ b/openhands/usage/cloud/gitlab-installation.mdx @@ -115,4 +115,4 @@ If a webhook is not installed or has failed, you can reinstall it: ## Next Steps - [Learn about the Cloud UI](/openhands/usage/cloud/cloud-ui). -- [Use the Cloud API](/openhands/usage/cloud/cloud-api) to programmatically interact with OpenHands. +- [Use the Cloud API](/openhands/usage/api/v1) to programmatically interact with OpenHands. diff --git a/openhands/usage/cloud/plugin-launcher.mdx b/openhands/usage/cloud/plugin-launcher.mdx index 1daadef89..a6b6f53c5 100644 --- a/openhands/usage/cloud/plugin-launcher.mdx +++ b/openhands/usage/cloud/plugin-launcher.mdx @@ -12,7 +12,7 @@ This is useful for: - building internal test pages for plugin development - `/launch` is a Cloud route, not a standalone REST endpoint. After the user opens the link and confirms the plugin configuration, OpenHands starts a conversation using the normal V1 conversation flow described in the [Cloud API guide](/openhands/usage/cloud/cloud-api). + `/launch` is a Cloud route, not a standalone REST endpoint. After the user opens the link and confirms the plugin configuration, OpenHands starts a conversation using the normal V1 conversation flow described in the [Cloud API guide](/openhands/usage/api/v1). ## Before You Start @@ -103,5 +103,5 @@ This format is convenient for manual testing, but the encoded `plugins` format i ## Next Steps -- Use the [Cloud API guide](/openhands/usage/cloud/cloud-api) for authentication and conversation lifecycle details. +- Use the [Cloud API guide](/openhands/usage/api/v1) for authentication and conversation lifecycle details. - See the [REST API (V1) overview](/openhands/usage/api/v1) for the V1 endpoints behind Cloud conversations. diff --git a/openhands/usage/llms/openhands-llms.mdx b/openhands/usage/llms/openhands-llms.mdx index 326a6551f..7bdb16f3b 100644 --- a/openhands/usage/llms/openhands-llms.mdx +++ b/openhands/usage/llms/openhands-llms.mdx @@ -55,7 +55,7 @@ export LLM_MODEL="openhands/claude-sonnet-4-20250514" Unable to find token in cache or `LiteLLM_VerificationTokenTable` ``` -OpenHands Cloud API Keys work with the [Cloud API](https://docs.openhands.dev/openhands/usage/cloud/cloud-api), while OpenHands LLM API Keys work with your chosen LLM via the OpenHands provider. +OpenHands Cloud API Keys work with the [Cloud API](/openhands/usage/api/v1), while OpenHands LLM API Keys work with your chosen LLM via the OpenHands provider. ### Example diff --git a/openhands/usage/settings/api-keys-settings.mdx b/openhands/usage/settings/api-keys-settings.mdx index 7e03d7d70..57f5d8013 100644 --- a/openhands/usage/settings/api-keys-settings.mdx +++ b/openhands/usage/settings/api-keys-settings.mdx @@ -25,7 +25,7 @@ use credits from your OpenHands Cloud account. If you need to refresh it at anyt ## OpenHands API Key These keys can be used to programmatically interact with OpenHands Cloud. See the guide for using the -[OpenHands Cloud API](/openhands/usage/cloud/cloud-api). +[OpenHands Cloud API](/openhands/usage/api/v1). ### Create API Key From 1cc7e5cbc16d8a8fd81b2d9fa7983c059dd6b612 Mon Sep 17 00:00:00 2001 From: openhands Date: Tue, 21 Apr 2026 17:22:21 +0000 Subject: [PATCH 4/4] Add example for resuming a conversation Add a 'Resuming a Conversation' example section under API Usage Example (V1) that demonstrates how to use the sandbox resume endpoint to resume a paused conversation. Includes cURL, Python, and TypeScript code examples in multi-tab format. --- openhands/usage/api/v1.mdx | 73 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/openhands/usage/api/v1.mdx b/openhands/usage/api/v1.mdx index 51abdb529..da8b8b4e5 100644 --- a/openhands/usage/api/v1.mdx +++ b/openhands/usage/api/v1.mdx @@ -539,6 +539,79 @@ To list all your conversations, use the search endpoint: for pagination if you have more conversations than the `limit`. +### Resuming a Conversation + +To resume a paused conversation, use the sandbox resume endpoint. This restarts the sandbox environment for a conversation that's in a paused state. + + + + ```bash + curl -X POST "https://app.all-hands.dev/api/v1/sandboxes/{sandbox_id}/resume" \ + -H "Authorization: Bearer YOUR_API_KEY" + ``` + + + ```python + import requests + + api_key = "YOUR_API_KEY" + sandbox_id = "sandbox-abc123" # Get this from conversation details + url = f"https://app.all-hands.dev/api/v1/sandboxes/{sandbox_id}/resume" + + headers = {"Authorization": f"Bearer {api_key}"} + + response = requests.post(url, headers=headers) + response.raise_for_status() + result = response.json() + + print(f"Sandbox resumed: {result}") + ``` + + + ```typescript + const apiKey = "YOUR_API_KEY"; + const sandboxId = "sandbox-abc123"; // Get this from conversation details + const url = `https://app.all-hands.dev/api/v1/sandboxes/${sandboxId}/resume`; + + const headers = { + "Authorization": `Bearer ${apiKey}` + }; + + async function resumeSandbox() { + try { + const response = await fetch(url, { + method: "POST", + headers: headers + }); + + const result = await response.json(); + console.log("Sandbox resumed:", result); + + return result; + } catch (error) { + console.error("Error resuming sandbox:", error); + } + } + + resumeSandbox(); + ``` + + + +**Response:** +```json +{ + "status": "success", + "message": "Sandbox resumed" +} +``` + + + You can get the `sandbox_id` from the conversation details using the + `GET /api/v1/app-conversations/{id}` endpoint. The sandbox must be in a + paused state to resume it. + + ## Rate Limits If you have too many conversations running at once, older conversations will be paused to limit the number of concurrent conversations.