{"openapi":"3.1.0","info":{"title":"OpenHands","description":"OpenHands: Code Less, Make More","version":"0.0.1"},"paths":{"/api/v1/conversation/{conversation_id}/events/search":{"get":{"tags":["Events"],"summary":"Search Events","description":"Search / List events.","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","StreamingDeltaEvent","TokenEvent","InterruptEvent","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":["Events"],"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","StreamingDeltaEvent","TokenEvent","InterruptEvent","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":["Events"],"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 App Conversations","description":"Search / List sandboxed conversations.","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 App Conversations","description":"Count sandboxed conversations matching the given 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":"Batch Get App Conversations","description":"Get a batch of sandboxed conversations given their ids. Return None for any missing.\n\nAccepts UUIDs as strings (with or without dashes) and converts them internally.\nReturns 400 Bad Request if any string cannot be converted to a valid UUID.","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 App 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"}}}}}}},"/api/v1/app-conversations/{conversation_id}":{"patch":{"tags":["Conversations"],"summary":"Update App 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"}}}}}},"delete":{"tags":["Conversations"],"summary":"Delete App Conversation","description":"Delete an app conversation and its associated data.\n\nThis endpoint deletes the conversation and cleans up sandbox resources\nif no other conversations are using the same sandbox.","operationId":"delete_app_conversation_api_v1_app_conversations__conversation_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation 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/app-conversations/{conversation_id}/send-message":{"post":{"tags":["Conversations"],"summary":"Send Message To Conversation","description":"Send a follow-up message to an existing conversation.\n\nThis REST endpoint provides a simplified way to send messages to a running\nconversation without requiring a WebSocket connection.\n\n**Alternative Approaches:**\n\nThis endpoint is a convenience wrapper. You can also interact with the agent\nserver directly using:\n\n1. **WebSocket**: Connect to the agent server's WebSocket endpoint for\n   real-time bidirectional communication\n2. **Agent Server REST API**: Call the agent server's REST endpoints directly\n   using the `conversation_url` from `GET /api/v1/app-conversations/{id}`\n\n**Design Note:**\n\nThis endpoint is intentionally a thin proxy that forwards messages to the\nagent server without additional processing logic. Any custom processing\n(validation, transformation, side effects) should be implemented via\nwebhook callbacks, not in this endpoint. This ensures that direct agent\nserver invocation and this convenience endpoint remain functionally equivalent.\n\n**Prerequisites:**\n\n- The sandbox must be in RUNNING state\n- If the sandbox is PAUSED, call `POST /api/v1/sandboxes/{sandbox_id}/resume` first\n- If the sandbox is STARTING, wait for it to reach RUNNING state\n\n**Error responses:**\n\n- 404: Conversation or sandbox not found\n- 409: Sandbox exists but is not running (PAUSED, STARTING, STOPPING)\n- 410: Conversation is archived (sandbox no longer exists)\n- 503: Sandbox is in ERROR state or agent server is unavailable\n\nArgs:\n    conversation_id: The UUID of the conversation to send the message to\n    request: The message content and options\n\nReturns:\n    AppSendMessageResponse with success status and sandbox state","operationId":"send_message_to_conversation_api_v1_app_conversations__conversation_id__send_message_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":{"$ref":"#/components/schemas/AppSendMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSendMessageResponse"}}}},"404":{"description":"Conversation or sandbox not found"},"409":{"description":"Sandbox is not running. Resume it first via POST /sandboxes/{id}/resume"},"410":{"description":"Conversation is archived (sandbox no longer exists)"},"503":{"description":"Sandbox is in error state or agent server unavailable"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app-conversations/{conversation_id}/switch_profile":{"post":{"tags":["Conversations"],"summary":"Switch Conversation Profile","description":"Switch the running conversation's LLM to a saved profile.\n\nProfiles live in the app-server's user settings, not on the sandbox FS,\nso we resolve the profile here and hand the LLM directly to the\nagent-server's ``switch_llm`` endpoint.","operationId":"switch_conversation_profile_api_v1_app_conversations__conversation_id__switch_profile_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":{"$ref":"#/components/schemas/SwitchProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Success"}}}},"404":{"description":"Conversation, sandbox, or profile not found"},"409":{"description":"Sandbox is not running"},"502":{"description":"Agent server returned an error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app-conversations/{conversation_id}/switch_acp_model":{"post":{"tags":["Conversations"],"summary":"Switch Conversation Acp Model","description":"Switch the model of a running ACP conversation in place.\n\nProxies to the agent-server's ``switch_acp_model`` endpoint, which issues\na protocol-level ``session/set_model`` call to the ACP subprocess so the\nnew model applies to subsequent turns without losing context. Persists the\nnew model on the conversation record so the UI chip stays current.","operationId":"switch_conversation_acp_model_api_v1_app_conversations__conversation_id__switch_acp_model_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":{"$ref":"#/components/schemas/SwitchAcpModelRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Success"}}}},"400":{"description":"Agent is not ACP, or provider does not support model switching"},"404":{"description":"Conversation or sandbox not found"},"409":{"description":"Sandbox is paused; resume it before switching models"},"502":{"description":"Agent server returned an error"},"504":{"description":"ACP server did not respond to the model switch in time"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app-conversations/stream-start":{"post":{"tags":["Conversations"],"summary":"Stream App Conversation Start","description":"Start an app conversation start task and stream updates from it.\nLeaves the connection open until either the conversation starts or there was an error","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 App Conversation Start Tasks","description":"Search / List conversation start tasks.","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":"Batch Get App Conversation Start Tasks","description":"Get a batch of start app conversation tasks given their ids. Return None for any missing.","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":"Read Conversation File","description":"Read a file from a specific conversation's sandbox workspace.\n\nReturns the content of the file at the specified path if it exists, otherwise returns an empty string.\n\nArgs:\n    conversation_id: The UUID of the conversation\n    file_path: Path to the file to read within the sandbox workspace\n\nReturns:\n    The content of the file or an empty string if the file doesn't exist","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}/git/changes":{"get":{"tags":["Conversations"],"summary":"Get Conversation Git Changes","description":"Proxy ``GET /api/git/changes`` on the conversation's runtime.","operationId":"get_conversation_git_changes_api_v1_app_conversations__conversation_id__git_changes_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","description":"Absolute path to the git repository root (e.g. /workspace/project)","title":"Path"},"description":"Absolute path to the git repository root (e.g. /workspace/project)"},{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional git ref to diff against","title":"Ref"},"description":"Optional git ref to diff against"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Conversation Git Changes Api V1 App Conversations  Conversation Id  Git Changes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app-conversations/{conversation_id}/git/diff":{"get":{"tags":["Conversations"],"summary":"Get Conversation Git Diff","description":"Proxy ``GET /api/git/diff`` on the conversation's runtime.","operationId":"get_conversation_git_diff_api_v1_app_conversations__conversation_id__git_diff_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","description":"The file path to diff","title":"Path"},"description":"The file path to diff"},{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional git ref to diff against","title":"Ref"},"description":"Optional git ref to diff against"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Conversation Git Diff Api V1 App Conversations  Conversation Id  Git Diff 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":"Get all skills associated with the conversation.\n\nThis endpoint returns all skills that are loaded for the v1 conversation.\nSkills are loaded from multiple sources:\n- Sandbox skills (exposed URLs)\n- Global skills (OpenHands/skills/)\n- User skills (~/.openhands/skills/)\n- Organization skills (org/.openhands repository)\n- Repository skills (repo .agents/skills/, .openhands/microagents/, and legacy .openhands/skills/)\n\nReturns:\n    JSONResponse: A JSON response containing the list of skills.\n    Returns an empty list if the sandbox is not running.","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":"Export Conversation","description":"Download a conversation trajectory as a zip file.\n\nReturns a zip file containing all events and metadata for the conversation.\n\nArgs:\n    conversation_id: The UUID of the conversation to download\n\nReturns:\n    A zip file containing the conversation trajectory","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":["Pending Messages"],"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":["Sandbox"],"summary":"Search Sandboxes","description":"Search / list sandboxes owned by the current user.","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":["Sandbox"],"summary":"Batch Get Sandboxes","description":"Get a batch of sandboxes given their ids, returning null for any missing.","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":["Sandbox"],"summary":"Start 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"}}}}}}},"/api/v1/sandboxes/{sandbox_id}/pause":{"post":{"tags":["Sandbox"],"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"}}}}}}},"/api/v1/sandboxes/{sandbox_id}/resume":{"post":{"tags":["Sandbox"],"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"}}}}}}},"/api/v1/sandboxes/{id}":{"delete":{"tags":["Sandbox"],"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":["Sandbox"],"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":["Sandbox"],"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 — 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":["Sandbox"],"summary":"Search Sandbox Specs","description":"Search / List sandbox specs.","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":["Sandbox"],"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":["Settings"],"summary":"Load Settings","description":"Load user settings.\n\nRetrieves the settings for the authenticated user, including LLM configuration,\nprovider tokens, and other user preferences.\n\nReturns:\n    GETSettingsModel: The user settings with token data\n\nRaises:\n    404: Settings not found\n    401: Invalid token","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":["Settings"],"summary":"Store Settings","description":"Store user settings.\n\nAccepts a partial payload and deep-merges ``agent_settings_diff`` and\n``conversation_settings_diff`` with the existing persisted values so that\nsaving one settings page never overwrites fields owned by another.\n\nReturns:\n    200: Settings stored successfully\n    422: Legacy nested settings keys are rejected\n    500: Error storing settings","operationId":"store_settings_api_v1_settings_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"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"}}}},"422":{"description":"Legacy nested settings keys are not accepted","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response 422 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"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/settings/agent-schema":{"get":{"tags":["Settings"],"summary":"Load Settings Schema","description":"Load the schema for settings","operationId":"load_settings_schema_api_v1_settings_agent_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Load Settings Schema Api V1 Settings Agent Schema Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/settings/conversation-schema":{"get":{"tags":["Settings"],"summary":"Load Conversation Settings Schema","description":"Load the schema for conversations","operationId":"load_conversation_settings_schema_api_v1_settings_conversation_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Load Conversation Settings Schema Api V1 Settings Conversation Schema Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/settings/profiles":{"get":{"tags":["Settings"],"summary":"List Profiles","description":"List all saved LLM profiles.\n\nReturns profile names with basic model info. API keys are never exposed.","operationId":"list_profiles_api_v1_settings_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__ProfileListResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/settings/profiles/{name}":{"get":{"tags":["Settings"],"summary":"Get Profile","description":"Get a specific profile's configuration.\n\nReturns the full LLM config with ``api_key`` nulled out; the sibling\n``api_key_set`` flag reports whether a key is stored.","operationId":"get_profile_api_v1_settings_profiles__name__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._-]{1,64}$","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__ProfileDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Settings"],"summary":"Save Profile","description":"Save an LLM configuration as a named profile.\n\nIf ``request.llm`` is supplied, it is saved as the profile's config.\nOtherwise the current ``agent_settings.llm`` is snapshotted. Existing\nprofiles with the same name are overwritten.\n\nRuns inside a per-user lock to prevent lost updates between concurrent\nprofile writes. Returns 409 if the user is already at the profile\ncap (:data:`MAX_PROFILES_PER_USER`).","operationId":"save_profile_api_v1_settings_profiles__name__post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._-]{1,64}$","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__SaveProfileRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__ProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Settings"],"summary":"Delete Profile","description":"Delete a saved profile.\n\nIdempotent: returns success even if the profile didn't exist.","operationId":"delete_profile_api_v1_settings_profiles__name__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._-]{1,64}$","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__ProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/settings/profiles/{name}/activate":{"post":{"tags":["Settings"],"summary":"Activate Profile","description":"Switch ``agent_settings.llm`` to use a saved profile.\n\nApplies the same ``base_url`` fixups as ``POST /api/v1/settings``, so\nactivating a profile that omits ``base_url`` still points at the\nprovider's default endpoint.","operationId":"activate_profile_api_v1_settings_profiles__name__activate_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._-]{1,64}$","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__ActivateProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/settings/profiles/{name}/rename":{"post":{"tags":["Settings"],"summary":"Rename Profile","description":"Rename a saved profile.\n\nPreserves the stored LLM config (including the api_key) and the active\nflag if the renamed profile was active. Returns 409 if ``new_name`` is\nalready in use by a different profile.","operationId":"rename_profile_api_v1_settings_profiles__name__rename_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._-]{1,64}$","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__RenameProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__ProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/secrets/git-providers":{"post":{"tags":["Secrets","Git"],"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","Git"],"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/search":{"get":{"tags":["Secrets"],"summary":"Search Custom Secrets","description":"Search / List custom secrets.\n\nRetrieves the names and descriptions of custom secrets for the authenticated user.\nResults are paginated and can be filtered by name.\n\nIn SaaS mode, includes the system-generated OPENHANDS_API_KEY which cannot be deleted.\n\nReturns:\n    CustomSecretPage: Paginated list of custom secrets (without values)","operationId":"search_custom_secrets_api_v1_secrets_search_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name__contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter by name containing this string"}},{"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/CustomSecretPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/secrets":{"post":{"tags":["Secrets"],"summary":"Create Custom Secret","description":"Create or update a custom secret.\n\nCreates a new custom secret, or overwrites it if it already exists.\n\nReturns:\n    201: Secret saved successfully\n    500: Error saving secret","operationId":"create_custom_secret_api_v1_secrets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomSecretCreate"}}},"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 Custom Secret","description":"Update a custom secret.\n\nUpdates the name and/or description of an existing custom secret.\n\nReturns:\n    200: Secret updated successfully\n    400: Secret name already exists\n    404: Secret not found\n    500: Error updating secret","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/CustomSecretWithoutValue"}}}},"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 Custom Secret","description":"Delete a custom secret.\n\nRemoves a custom secret for the authenticated user.\n\nReturns:\n    200: Secret deleted successfully\n    404: Secret not found\n    500: Error deleting 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":["User"],"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 / list available global and user-level skills.\n\nReturns skill metadata so the frontend can render a toggle list.","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/skills/marketplace-skills":{"post":{"tags":["Skills"],"summary":"Get Marketplace Skills","description":"Get skills from marketplace repositories.\n\nThis endpoint fetches and returns skill metadata from marketplace repos\nwithout requiring an active sandbox session. Useful for previewing what\nskills a marketplace provides before or after adding it.\n\nEach call clones the marketplace repos fresh; this endpoint is admin-only\nand low-traffic, so caching the git clones here would buy little for the\ncross-user / pod-local complexity a shared cache introduces.\n\nArgs:\n    marketplaces: List of marketplace registrations to fetch skills from.\n\nReturns:\n    MarketplaceSkillsPreviewResponse with skill metadata and any errors.","operationId":"get_marketplace_skills_api_v1_skills_marketplace_skills_post","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_models__MarketplaceRegistration"},"type":"array","title":"Marketplaces"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketplaceSkillsPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/v1/webhooks/conversations":{"post":{"tags":["Webhooks"],"summary":"On Conversation Update","description":"Webhook callback for when a conversation starts, pauses, resumes, or deletes.\n\nThe ``ConversationInfo.agent`` field is an ``AgentBase`` discriminated\nunion so both OpenHands (``Agent``) and ACP (``ACPAgent``) payloads are\naccepted on this single endpoint.","operationId":"on_conversation_update_api_v1_webhooks_conversations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationInfo"}}},"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":["Webhooks"],"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":["Webhooks"],"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":["Config"],"summary":"Get Web Client Config","description":"Get the configuration of the web client.\n\nThis endpoint is typically one of the first invoked, and does not require\nauthentication. It provides general settings for the web client independent\nof users.","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 User Installations","description":"Get user installations (GitHub apps) or equivalent for other providers.\n\nReturns a paginated list of installation IDs or workspace IDs depending on the provider.","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":"Get or search repositories.\n\nIf query is provided, searches repositories across the git provider.\nIf query is not provided, returns a paginated list of the authenticated user's repositories.","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 branches in a repository.\n\nReturns a paginated list of branches matching the search query.","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":["Config"],"summary":"Search Models","description":"Search for LLM models with pagination and filtering.\n\nReturns a paginated list of models that can be filtered by name\n(contains), verified status, and provider.","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)"}},{"name":"provider__eq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter by provider name (exact match)"}}],"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/config/providers/search":{"get":{"tags":["Config"],"summary":"Search Providers","description":"Search for LLM providers with pagination and filtering.\n\nReturns a paginated list of providers extracted from the available models.\nEach provider indicates whether it is verified by OpenHands.","operationId":"search_providers_api_v1_config_providers_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 providers 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/ProviderPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/alive":{"get":{"tags":["Status"],"summary":"Alive","description":"Endpoint for liveness probes.\n\nIf this responds then the server is considered alive.","operationId":"alive_alive_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["Status"],"summary":"Health","description":"Health check endpoint.\n\nReturns 'OK' if the service is healthy and ready to accept requests.\nThis is typically used by load balancers and orchestrators (e.g., Kubernetes)\nto determine if the service should receive traffic.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Health Health Get"}}}}}}},"/server_info":{"get":{"tags":["Status"],"summary":"Get Server Info","description":"Server information endpoint.\n\nReturns system information including CPU count, memory usage, and\nother runtime details about the server. Useful for monitoring and\ndebugging purposes.","operationId":"get_server_info_server_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ready":{"get":{"summary":"Is Ready","operationId":"is_ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/saas":{"get":{"summary":"Is Saas","operationId":"is_saas_saas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/authenticate":{"post":{"summary":"Authenticate","operationId":"authenticate_api_authenticate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/accept_tos":{"post":{"summary":"Accept Tos","operationId":"accept_tos_api_accept_tos_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/onboarding_status":{"get":{"summary":"Onboarding Status","description":"Return whether the current user must still complete onboarding.\n\nKept as a dedicated endpoint instead of riding on ``GET /api/v1/settings``\n(the natural home for fields like ``email_verified``) because the settings\nresponse is heavyweight: ``SaasSettingsStore.load`` joins User, Org, and\nOrgMember rows and deep-merges the org-level and member-level\n``agent_settings`` before returning. Onboarding gating runs on every\nprotected-route navigation, so we need a lightweight read of a single\nboolean rather than paying for the full settings aggregation.","operationId":"onboarding_status_api_onboarding_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/complete_onboarding":{"post":{"summary":"Complete Onboarding","description":"Mark onboarding as completed for the current user and fire analytics.\n\nPersists ``user.onboarding_completed = True`` and emits the\n``onboarding completed`` PostHog event (plus an org ``group_identify`` to\nstamp ``onboarding_completed_at``). Analytics failures are swallowed so\nthey never block the user from leaving the onboarding flow.","operationId":"complete_onboarding_api_complete_onboarding_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OnboardingSubmission"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logout":{"post":{"summary":"Logout","operationId":"logout_api_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/refresh-tokens":{"get":{"summary":"Refresh Tokens","description":"Return the latest token for a given provider.","operationId":"refresh_tokens_api_refresh_tokens_get","parameters":[{"name":"provider","in":"query","required":true,"schema":{"$ref":"#/components/schemas/ProviderType"}},{"name":"sid","in":"query","required":true,"schema":{"type":"string","title":"Sid"}},{"name":"X-Session-API-Key","in":"header","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/keycloak/callback":{"get":{"summary":"Keycloak Callback","operationId":"keycloak_callback_oauth_keycloak_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/keycloak/offline/callback":{"get":{"summary":"Keycloak Offline Callback","operationId":"keycloak_offline_callback_oauth_keycloak_offline_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/github/callback":{"get":{"summary":"Github Dummy Callback","description":"Callback for GitHub that just forwards the user to the app base URL.","operationId":"github_dummy_callback_oauth_github_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/device/authorize":{"post":{"summary":"Device Authorization","description":"Start device flow by generating device and user codes.","operationId":"device_authorization_oauth_device_authorize_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceAuthorizationResponse"}}}}}}},"/oauth/device/token":{"post":{"summary":"Device Token","description":"Poll for a token until the user authorizes or the code expires.","operationId":"device_token_oauth_device_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_device_token_oauth_device_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/device/verify-authenticated":{"post":{"summary":"Device Verification Authenticated","description":"Process device verification for authenticated users (called by frontend).","operationId":"device_verification_authenticated_oauth_device_verify_authenticated_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_device_verification_authenticated_oauth_device_verify_authenticated_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/users/app":{"get":{"summary":"Get User App Settings","description":"Get the current user's app settings.\n\nReturns language, analytics consent, sound notifications, and git config.\n\nArgs:\n    service: UserAppSettingsService (injected by dependency)\n\nReturns:\n    UserAppSettingsResponse: The user's app settings\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 404 if user not found\n    HTTPException: 500 if retrieval fails","operationId":"get_user_app_settings_api_users_app_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAppSettingsResponse"}}}}}},"post":{"summary":"Update User App Settings","description":"Update the current user's app settings (partial update).\n\nOnly provided fields will be updated. Pass null to clear a field.\n\nArgs:\n    update_data: Fields to update\n    service: UserAppSettingsService (injected by dependency)\n\nReturns:\n    UserAppSettingsResponse: The updated user's app settings\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 404 if user not found\n    HTTPException: 500 if update fails","operationId":"update_user_app_settings_api_users_app_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAppSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAppSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/credits":{"get":{"tags":["Billing"],"summary":"Get Credits","operationId":"get_credits_api_billing_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCreditsResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/billing/subscription-access":{"get":{"tags":["Billing"],"summary":"Get Subscription Access","description":"Get details of the currently valid subscription for the user.","operationId":"get_subscription_access_api_billing_subscription_access_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionAccessResponse"},{"type":"null"}],"title":"Response Get Subscription Access Api Billing Subscription Access Get"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/billing/has-payment-method":{"post":{"tags":["Billing"],"summary":"Has Payment Method","operationId":"has_payment_method_api_billing_has_payment_method_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Has Payment Method Api Billing Has Payment Method Post"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/billing/create-customer-setup-session":{"post":{"tags":["Billing"],"summary":"Create Customer Setup Session","operationId":"create_customer_setup_session_api_billing_create_customer_setup_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBillingSessionResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/billing/create-checkout-session":{"post":{"tags":["Billing"],"summary":"Create Checkout Session","operationId":"create_checkout_session_api_billing_create_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBillingSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/billing/success":{"get":{"tags":["Billing"],"summary":"Success Callback","operationId":"success_callback_api_billing_success_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/cancel":{"get":{"tags":["Billing"],"summary":"Cancel Callback","operationId":"cancel_callback_api_billing_cancel_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared-conversations":{"get":{"tags":["Sharing"],"summary":"Batch Get Shared Conversations","description":"Get a batch of shared conversations given their ids. Return None for any missing or non-shared.","operationId":"batch_get_shared_conversations_api_shared_conversations_get","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/SharedConversation"},{"type":"null"}]},"title":"Response Batch Get Shared Conversations Api Shared Conversations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared-events/search":{"get":{"tags":["Sharing"],"summary":"Search Shared Events","description":"Search / List events for a shared conversation.\n\nBecause non-viewable events (e.g. ``ConversationStateUpdateEvent``) are\nfiltered out after fetching, a single backend page may yield fewer items\nthan *limit*.  This method transparently fetches additional backend pages\nuntil the requested *limit* is reached or there are no more results.","operationId":"search_shared_events_api_shared_events_search_get","parameters":[{"name":"conversation_id","in":"query","required":true,"schema":{"type":"string","title":"Conversation ID to search events for"}},{"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","StreamingDeltaEvent","TokenEvent","InterruptEvent","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/shared-events/count":{"get":{"tags":["Sharing"],"summary":"Count Shared Events","description":"Count events for a shared conversation matching the given filters.","operationId":"count_shared_events_api_shared_events_count_get","parameters":[{"name":"conversation_id","in":"query","required":true,"schema":{"type":"string","title":"Conversation ID to count events for"}},{"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","StreamingDeltaEvent","TokenEvent","InterruptEvent","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 Shared Events Api Shared Events Count Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared-events":{"get":{"tags":["Sharing"],"summary":"Batch Get Shared Events","description":"Get a batch of events for a shared conversation given their ids, returning null for any missing event.","operationId":"batch_get_shared_events_api_shared_events_get","parameters":[{"name":"conversation_id","in":"query","required":true,"schema":{"type":"string","title":"Conversation ID to get events for"}},{"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 Shared Events Api Shared Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/shared-events/{conversation_id}/{event_id}":{"get":{"tags":["Sharing"],"summary":"Get Shared Event","description":"Get a single event from a shared conversation by conversation_id and event_id.","operationId":"get_shared_event_api_shared_events__conversation_id___event_id__get","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/Event-Output"},{"type":"null"}],"title":"Response Get Shared Event Api Shared Events  Conversation Id   Event Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/github/events":{"post":{"summary":"Github Events","operationId":"github_events_integration_github_events_post","parameters":[{"name":"x-hub-signature-256","in":"header","required":false,"schema":{"type":"string","title":"X-Hub-Signature-256"}},{"name":"x-github-event","in":"header","required":false,"schema":{"type":"string","title":"X-Github-Event"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/gitlab/events":{"post":{"summary":"Gitlab Events","operationId":"gitlab_events_integration_gitlab_events_post","parameters":[{"name":"x-gitlab-token","in":"header","required":false,"schema":{"type":"string","title":"X-Gitlab-Token"}},{"name":"x-openhands-webhook-id","in":"header","required":false,"schema":{"type":"string","title":"X-Openhands-Webhook-Id"}},{"name":"x-openhands-user-id","in":"header","required":false,"schema":{"type":"string","title":"X-Openhands-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/gitlab/resources":{"get":{"summary":"Get Gitlab Resources","description":"Get all GitLab projects and groups where the user has admin access.\n\nReturns a list of resources with their webhook installation status.","operationId":"get_gitlab_resources_integration_gitlab_resources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitLabResourcesResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/integration/gitlab/reinstall-webhook":{"post":{"summary":"Reinstall Gitlab Webhook","description":"Reinstall GitLab webhook for a specific resource immediately.\n\nThis endpoint validates permissions, resets webhook status in the database,\nand immediately installs the webhook on the specified resource.","operationId":"reinstall_gitlab_webhook_integration_gitlab_reinstall_webhook_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReinstallWebhookRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceInstallationResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/integration/bitbucket/events":{"post":{"summary":"Bitbucket Events","operationId":"bitbucket_events_integration_bitbucket_events_post","parameters":[{"name":"x-hub-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Hub-Signature"}},{"name":"x-event-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Event-Key"}},{"name":"x-request-uuid","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Request-Uuid"}},{"name":"x-hook-uuid","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Hook-Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/llm/byor/permitted":{"get":{"tags":["Keys"],"summary":"Check Byor Permitted","description":"Check if BYOR key export is permitted for the request's effective org.","operationId":"check_byor_permitted_api_keys_llm_byor_permitted_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ByorPermittedResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/keys":{"get":{"tags":["Keys"],"summary":"List Api Keys","description":"List API keys for the authenticated user in the effective org.","operationId":"list_api_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Response List Api Keys Api Keys Get"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["Keys"],"summary":"Create Api Key","description":"Create a new API key for the authenticated user.\n\nThe new key is bound to ``key_data.org_id`` when provided. An *omitted*\n``org_id`` falls back to the request's effective org (preserving the\npre-existing API). An *explicit* ``org_id: null`` creates an unbound\nkey whose effective org is resolved per-request via the ``X-Org-Id``\nheader or, as a fallback, the caller's ``user.current_org_id``. When a\nspecific ``org_id`` is supplied, the caller must be a member of that\norg (or hold a super role).","operationId":"create_api_key_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/keys/{key_id}":{"delete":{"tags":["Keys"],"summary":"Delete Api Key","description":"Delete an API key, scoped to the effective org.","operationId":"delete_api_key_api_keys__key_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/current":{"get":{"tags":["Keys"],"summary":"Get Current Api Key","description":"Get information about the currently authenticated API key.\n\nReturns the key's bound org (``bound_org_id``, ``None`` for unbound\nkeys) and the request's effective org (``org_id``, resolved from the\n``X-Org-Id`` header or ``user.current_org_id`` for unbound keys).\n\nReturns 400 if not authenticated via API key (e.g., using cookie auth).","operationId":"get_current_api_key_api_keys_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentApiKeyResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/keys/llm/managed/refresh":{"post":{"tags":["Keys"],"summary":"Refresh Managed Llm Api Key","description":"Refresh the managed OpenHands LiteLLM key for the current user/org.\n\nDelegates the full managed-key lifecycle (effective-config classification,\nalias cleanup, key generation with OpenHands metadata, and persistence) to\n``SaasSettingsStore.rotate_managed_llm_key`` so the route does not\nduplicate the storage-layer machinery. Only managed LiteLLM/OpenHands-\nprovider effective configs are rotated; BYOK/custom and non-managed configs\nare rejected before any key is generated. The previous key token is deleted\nbest-effort only after the replacement is persisted.","operationId":"refresh_managed_llm_api_key_api_keys_llm_managed_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedLlmApiKeyRefreshResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/keys/llm/byor":{"get":{"tags":["Keys"],"summary":"Get Llm Api Key For Byor","description":"Get the LLM API key for BYOR (Bring Your Own Runtime).\n\nThis endpoint validates that the key exists in LiteLLM before returning it.\nIf validation fails, it automatically generates a new key to ensure users\nalways receive a working key.\n\nReturns 402 Payment Required if BYOR export is not enabled for the\nrequest's effective org.","operationId":"get_llm_api_key_for_byor_api_keys_llm_byor_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmApiKeyResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/keys/llm/byor/refresh":{"post":{"tags":["Keys"],"summary":"Refresh Llm Api Key For Byor","description":"Refresh the LLM API key for BYOR (Bring Your Own Runtime).\n\nReturns 402 Payment Required if BYOR export is not enabled for the\nrequest's effective org.","operationId":"refresh_llm_api_key_for_byor_api_keys_llm_byor_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmApiKeyResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/service/health":{"get":{"tags":["Service"],"summary":"Service Health","description":"Health check endpoint for the service API.\n\nThis endpoint does not require authentication and can be used\nto verify the service routes are accessible.","operationId":"service_health_api_service_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Service Health Api Service Health Get"}}}}}}},"/api/service/users/{user_id}/orgs/{org_id}/api-keys":{"post":{"tags":["Service"],"summary":"Get Or Create Api Key For User","description":"Get or create an API key for a user on behalf of the automations service.\n\nIf a key with the given name already exists for the user/org and is not expired,\nreturns the existing key. Otherwise, creates a new key.\n\nThe created/returned keys are system keys and are:\n- Not visible to the user in their API keys list\n- Not deletable by the user\n- Never expire\n\nArgs:\n    user_id: The user ID\n    org_id: The organization ID\n    request: Request body containing name (required)\n    x_service_api_key: Service API key header for authentication\n\nReturns:\n    CreateUserApiKeyResponse: The API key and metadata\n\nRaises:\n    HTTPException: 401 if service key is invalid\n    HTTPException: 404 if user not found\n    HTTPException: 403 if user is not a member of the specified org","operationId":"get_or_create_api_key_for_user_api_service_users__user_id__orgs__org_id__api_keys_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"X-Service-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Service-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserApiKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/service/users/{user_id}/orgs/{org_id}/api-keys/{key_name}":{"delete":{"tags":["Service"],"summary":"Delete User Api Key","description":"Delete a system API key created by the service.\n\nThis endpoint allows the automations service to clean up API keys\nit previously created for users.\n\nArgs:\n    user_id: The user ID\n    org_id: The organization ID\n    key_name: The name of the key to delete (without __SYSTEM__: prefix)\n    x_service_api_key: Service API key header for authentication\n\nReturns:\n    dict: Success message\n\nRaises:\n    HTTPException: 401 if service key is invalid\n    HTTPException: 404 if key not found","operationId":"delete_user_api_key_api_service_users__user_id__orgs__org_id__api_keys__key_name__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"key_name","in":"path","required":true,"schema":{"type":"string","title":"Key Name"}},{"name":"X-Service-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Service-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete User Api Key Api Service Users  User Id  Orgs  Org Id  Api Keys  Key Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations":{"get":{"tags":["Orgs"],"summary":"List User Orgs","description":"List organizations for the authenticated user.\n\nThis endpoint returns a paginated list of all organizations that the\nauthenticated user is a member of.\n\nArgs:\n    page_id: Optional page ID (offset) for pagination\n    limit: Maximum number of organizations to return (1-100, default 100)\n    user_id: Authenticated user ID (injected by dependency)\n\nReturns:\n    OrgPage: Paginated list of organizations\n\nRaises:\n    HTTPException: 500 if retrieval fails","operationId":"list_user_orgs_api_organizations_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}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Orgs"],"summary":"Create Org","description":"Create a new organization.\n\nThis endpoint allows authenticated users that hold the\n``CREATE_ORGANIZATION`` permission to create a new organization. In\npractice this permission is only granted via the ``superadmin``\nrole; no regular,\norg-scoped role carries it. The creator is not automatically added\nas a member; a superadmin can provision the initial org users separately.\n\nArgs:\n    org_data: Organization creation data\n    user_id: Authenticated user ID (injected by ``require_permission``)\n\nReturns:\n    OrgResponse: The created organization details\n\nRaises:\n    HTTPException: 401 if the user is not authenticated\n    HTTPException: 403 if the user lacks ``CREATE_ORGANIZATION``\n    HTTPException: 409 if organization name already exists\n    HTTPException: 500 if creation fails","operationId":"create_org_api_organizations_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/settings":{"get":{"tags":["Orgs"],"summary":"Get Org Defaults Settings","description":"Get org-default settings for a specific organization.","operationId":"get_org_defaults_settings_api_organizations__org_id__settings_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgDefaultsSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Orgs"],"summary":"Update Org Defaults Settings","description":"Update org-default settings for a specific organization.","operationId":"update_org_defaults_settings_api_organizations__org_id__settings_patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgDefaultsSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/llm":{"get":{"tags":["Orgs"],"summary":"Get Legacy Org Defaults Settings","description":"Get org-default settings through the deprecated ``/llm`` wrapper.\n\nThe org is the request's *effective* org (``X-Org-Id`` > API-key\nbinding > ``user.current_org_id``).","operationId":"get_legacy_org_defaults_settings_api_organizations_llm_get","deprecated":true,"security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgDefaultsSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Orgs"],"summary":"Update Legacy Org Defaults Settings","description":"Update org-default settings through the deprecated ``/llm`` wrapper.","operationId":"update_legacy_org_defaults_settings_api_organizations_llm_post","deprecated":true,"security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgDefaultsSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/app":{"get":{"tags":["Orgs"],"summary":"Get Org App Settings","description":"Get organization app settings for the user's current organization.\n\nThis endpoint retrieves application settings for the authenticated user's\ncurrent organization. Access requires the MANAGE_APPLICATION_SETTINGS permission,\nwhich is granted to all organization members (member, admin, and owner roles).\n\nArgs:\n    service: OrgAppSettingsService (injected by dependency)\n\nReturns:\n    OrgAppSettingsResponse: The organization app settings\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 403 if user lacks MANAGE_APPLICATION_SETTINGS permission\n    HTTPException: 404 if current organization not found","operationId":"get_org_app_settings_api_organizations_app_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgAppSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Orgs"],"summary":"Update Org App Settings","description":"Update organization app settings for the user's current organization.\n\nBase access requires MANAGE_APPLICATION_SETTINGS (all members). Editing\norg-wide ``registered_marketplaces`` additionally requires EDIT_ORG_SETTINGS\n(admin/owner), since those defaults apply to every member.\n\nArgs:\n    update_data: App settings update data\n    request: The incoming request (used to resolve the target org for the\n        marketplace permission check)\n    service: OrgAppSettingsService (injected by dependency)\n    user_id: Authenticated user ID (injected by ``require_permission``)\n\nReturns:\n    OrgAppSettingsResponse: The updated organization app settings\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 403 if user lacks the required permission\n    HTTPException: 404 if current organization not found\n    HTTPException: 409 if a concurrent modification is detected\n    HTTPException: 400 if validation errors occur (e.g. duplicate names)\n    HTTPException: 500 if update fails","operationId":"update_org_app_settings_api_organizations_app_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgAppSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgAppSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}":{"get":{"tags":["Orgs"],"summary":"Get Org","description":"Get organization details by ID through the deprecated detail route.","operationId":"get_org_api_organizations__org_id__get","deprecated":true,"security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Orgs"],"summary":"Delete Org","description":"Delete an organization.\n\nThis endpoint permanently deletes an organization and all associated data including\norganization members, conversations, billing data, and external LiteLLM team resources.\nAccess requires the DELETE_ORGANIZATION permission, which is granted only to owners.\n\nArgs:\n    org_id: Organization ID to delete (UUID)\n    user_id: Authenticated user ID (injected by require_permission dependency)\n\nReturns:\n    dict: Confirmation message with deleted organization details\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 403 if user lacks DELETE_ORGANIZATION permission\n    HTTPException: 404 if organization not found\n    HTTPException: 500 if deletion fails","operationId":"delete_org_api_organizations__org_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Org Api Organizations  Org Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Orgs"],"summary":"Update Org","description":"Update an existing organization.\n\nThis endpoint updates organization settings. Access requires the EDIT_ORG_SETTINGS\npermission, which is granted to admin and owner roles.\n\nArgs:\n    org_id: Organization ID to update (UUID)\n    update_data: Organization update data\n    user_id: Authenticated user ID (injected by require_permission dependency)\n\nReturns:\n    OrgResponse: The updated organization details\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 403 if user lacks EDIT_ORG_SETTINGS permission\n    HTTPException: 404 if organization not found\n    HTTPException: 409 if organization name already exists\n    HTTPException: 422 if validation errors occur (handled by FastAPI)\n    HTTPException: 500 if update fails","operationId":"update_org_api_organizations__org_id__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/me":{"get":{"tags":["Orgs"],"summary":"Get Me","description":"Get the current user's membership record for an organization.\n\nReturns the authenticated user's role, status, email, and LLM override\nfields (with masked API keys) within the specified organization.\n\nArgs:\n    org_id: Organization ID (UUID)\n    user_id: Authenticated user ID (injected by dependency)\n\nReturns:\n    MeResponse: The user's membership data\n\nRaises:\n    HTTPException: 404 if user is not a member or org doesn't exist\n    HTTPException: 500 if retrieval fails","operationId":"get_me_api_organizations__org_id__me_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/members":{"get":{"tags":["Orgs"],"summary":"Get Org Members","description":"Get all members of an organization with pagination and optional email filter.\n\nThis endpoint retrieves a paginated list of organization members. Access requires\nthe VIEW_ORG_SETTINGS permission, which is granted to all organization members\n(member, admin, and owner roles).\n\nArgs:\n    org_id: Organization ID (UUID)\n    page_id: Optional page offset for pagination\n    limit: Maximum number of members to return (1-100, default 10)\n    email: Optional email filter (case-insensitive partial match)\n    user_id: Authenticated user ID (injected by require_permission dependency)\n\nReturns:\n    OrgMemberPage: Paginated list of organization members with\n        current_page and per_page metadata. Use the /count endpoint\n        to get the total count separately.\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 403 if user lacks VIEW_ORG_SETTINGS permission\n    HTTPException: 400 if org_id or page_id format is invalid\n    HTTPException: 500 if retrieval fails","operationId":"get_org_members_api_organizations__org_id__members_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"page_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Optional page offset for pagination"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"exclusiveMinimum":0,"title":"The max number of results in the page","default":10}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"title":"Filter members by email (case-insensitive partial match)"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgMemberPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/members/count":{"get":{"tags":["Orgs"],"summary":"Get Org Members Count","description":"Get count of organization members with optional email filter.\n\nThis endpoint returns the total count of organization members matching\nthe filter criteria. Access requires the VIEW_ORG_SETTINGS permission,\nwhich is granted to all organization members (member, admin, and owner roles).\n\nArgs:\n    org_id: Organization ID (UUID)\n    email: Optional email filter (case-insensitive partial match)\n    user_id: Authenticated user ID (injected by require_permission dependency)\n\nReturns:\n    int: Total count of organization members matching the filter\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 403 if user lacks VIEW_ORG_SETTINGS permission or is not a member\n    HTTPException: 400 if org_id format is invalid\n    HTTPException: 500 if retrieval fails","operationId":"get_org_members_count_api_organizations__org_id__members_count_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"title":"Filter members by email (case-insensitive partial match)"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"integer","title":"Response Get Org Members Count Api Organizations  Org Id  Members Count Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/members/financial":{"get":{"tags":["Orgs"],"summary":"Get Org Members Financial","description":"Get paginated financial data for organization members.\n\nReturns financial information (lifetime spend, current budget) for all members\nwithin the specified organization. Access is restricted to:\n- Organization Admins\n- Organization Owners\n- OpenHands members (users with @openhands.dev emails)\n\nArgs:\n    org_id: Organization ID (UUID)\n    page_id: Optional pagination offset encoded as string\n    limit: Maximum items per page (1-100, default 10)\n    email: Optional email filter (case-insensitive partial match)\n    user_id: Authenticated user ID (injected by require_financial_data_access)\n\nReturns:\n    OrgMemberFinancialPage: Paginated response with member financial data\n        - items: List of members with user_id, email, lifetime_spend,\n                 current_budget, and max_budget\n        - current_page: Current page number (1-indexed)\n        - per_page: Items per page\n        - next_page_id: Offset for next page, or None if no more pages\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 403 if user lacks access (not admin/owner and not @openhands.dev)\n    HTTPException: 400 if page_id is invalid\n    HTTPException: 500 if retrieval fails","operationId":"get_org_members_financial_api_organizations__org_id__members_financial_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"page_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pagination offset encoded as string","description":"Offset for pagination (e.g., \"0\", \"10\", \"20\")"},"description":"Offset for pagination (e.g., \"0\", \"10\", \"20\")"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"exclusiveMinimum":0,"title":"Maximum items per page","default":10}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"title":"Filter members by email (case-insensitive partial match)"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgMemberFinancialPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/budgets":{"get":{"tags":["Orgs"],"summary":"Get Org Budget Settings","operationId":"get_org_budget_settings_api_organizations__org_id__budgets_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"users_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Users Page"}},{"name":"users_per_page","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":50,"title":"Users Per Page"}},{"name":"users_search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Users Search"}},{"name":"users_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Users Status"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgBudgetSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Orgs"],"summary":"Update Org Budget Settings","operationId":"update_org_budget_settings_api_organizations__org_id__budgets_patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"users_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Users Page"}},{"name":"users_per_page","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":50,"title":"Users Per Page"}},{"name":"users_search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Users Search"}},{"name":"users_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Users Status"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgBudgetSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgBudgetSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/budgets/overrides/{user_id}":{"put":{"tags":["Orgs"],"summary":"Upsert Org Budget Override","operationId":"upsert_org_budget_override_api_organizations__org_id__budgets_overrides__user_id__put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgBudgetUserOverrideUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgBudgetUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Orgs"],"summary":"Delete Org Budget Override","operationId":"delete_org_budget_override_api_organizations__org_id__budgets_overrides__user_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/members/{user_id}":{"delete":{"tags":["Orgs"],"summary":"Remove Org Member","description":"Remove a member from an organization.\n\nOnly owners and admins can remove members:\n- Owners can remove admins and regular users\n- Admins can only remove regular users\n\nUsers cannot remove themselves. The last owner cannot be removed.","operationId":"remove_org_member_api_organizations__org_id__members__user_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Orgs"],"summary":"Update Org Member","description":"Update a member's role in an organization.\n\nPermission rules:\n- Admins can change roles of regular members to Admin or Member\n- Admins cannot modify other Admins or Owners\n- Owners can change roles of Admins and Members to any role (Owner, Admin, Member)\n- Owners cannot modify other Owners\n\nMembers cannot modify their own role. The last owner cannot be demoted.","operationId":"update_org_member_api_organizations__org_id__members__user_id__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/switch":{"post":{"tags":["Orgs"],"summary":"Switch Org","description":"Switch to a different organization.\n\nThis endpoint allows authenticated users to switch their current active\norganization. The user must be a member of the target organization.\n\nArgs:\n    org_id: Organization ID to switch to (UUID)\n    user_id: Authenticated user ID (injected by dependency)\n\nReturns:\n    OrgResponse: The organization details that was switched to\n\nRaises:\n    HTTPException: 422 if org_id is not a valid UUID (handled by FastAPI)\n    HTTPException: 403 if user is not a member of the organization\n    HTTPException: 404 if organization not found\n    HTTPException: 500 if switch fails","operationId":"switch_org_api_organizations__org_id__switch_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/git-claims":{"get":{"tags":["Orgs"],"summary":"Get Git Claims","description":"Get all Git organization claims for an OpenHands organization.\n\nOnly admin and owner roles can view Git organization claims.\n\nArgs:\n    org_id: OpenHands organization UUID\n    user_id: Authenticated user ID (injected by permission check)\n\nReturns:\n    List of GitOrgClaimResponse with claim details","operationId":"get_git_claims_api_organizations__org_id__git_claims_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GitOrgClaimResponse"},"title":"Response Get Git Claims Api Organizations  Org Id  Git Claims Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Orgs"],"summary":"Claim Git Organization","description":"Claim a Git organization for an OpenHands organization.\n\nOnly admin and owner roles can claim Git organizations.\nA Git organization can only be claimed by one OpenHands organization at a time.\n\nArgs:\n    org_id: OpenHands organization UUID\n    request: Claim request with provider and git_organization\n    user_id: Authenticated user ID (injected by permission check)\n\nReturns:\n    GitOrgClaimResponse with the created claim details\n\nRaises:\n    HTTPException 409: If the Git organization is already claimed\n    HTTPException 403: If user lacks permission","operationId":"claim_git_organization_api_organizations__org_id__git_claims_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitOrgClaimRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitOrgClaimResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/git-claims/{claim_id}":{"delete":{"tags":["Orgs"],"summary":"Disconnect Git Organization","description":"Remove a Git organization claim from an OpenHands organization.\n\nOnly admin and owner roles can disconnect Git organization claims.\n\nArgs:\n    org_id: OpenHands organization UUID\n    claim_id: Claim UUID to remove\n    user_id: Authenticated user ID (injected by permission check)\n\nReturns:\n    dict: Confirmation message on successful deletion\n\nRaises:\n    HTTPException 404: If the claim is not found for this organization\n    HTTPException 403: If user lacks permission","operationId":"disconnect_git_organization_api_organizations__org_id__git_claims__claim_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Disconnect Git Organization Api Organizations  Org Id  Git Claims  Claim Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/conversations":{"get":{"tags":["Orgs"],"summary":"List Org Conversations","description":"List all conversations for an organization.\n\nThis endpoint returns a paginated list of all conversations within an organization,\nincluding details about each conversation such as the creator, timestamps, and metrics.\n\n**Access Control**: Requires VIEW_ORG_CONVERSATIONS permission (Admin or Owner role).\n\nArgs:\n    org_id: Organization UUID\n    search: Search text matching conversation name, creator name, email, or sandbox ID\n    sort_by: Field to sort by (created_at, updated_at, llm_model, accumulated_cost, title)\n    sort_order: Sort order (desc or asc)\n    execution_status: Filter by execution status (idle, running, paused, finished, error, stuck)\n    sandbox_status: Filter by sandbox status (STARTING, RUNNING, PAUSED, ERROR, MISSING)\n    time_window: Time window filter (all, 7d, 30d, 90d)\n    page: Page number (1-indexed)\n    per_page: Items per page (1-100)\n    include_sub_conversations: If True, include sub-conversations in results\n    user_id: Authenticated user ID (injected by require_permission dependency)\n    service: OrgConversationService instance\n\nReturns:\n    OrgConversationPage: Paginated list of conversations with total count\n\nRaises:\n    HTTPException: 401 if user is not authenticated\n    HTTPException: 403 if user lacks VIEW_ORG_CONVERSATIONS permission\n    HTTPException: 500 if retrieval fails","operationId":"list_org_conversations_api_organizations__org_id__conversations_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search text matching conversation name, creator name, email, or sandbox ID"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","title":"Field to sort by","description":"Options: created_at, updated_at, llm_model, accumulated_cost, title","default":"updated_at"},"description":"Options: created_at, updated_at, llm_model, accumulated_cost, title"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","title":"Sort order","description":"Options: desc (default), asc","default":"desc"},"description":"Options: desc (default), asc"},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Filter by execution status","description":"Comma-separated list: idle, running, paused, finished, error, stuck"},"description":"Comma-separated list: idle, running, paused, finished, error, stuck"},{"name":"sandbox_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter by sandbox status","description":"Filter by sandbox status: STARTING, RUNNING, PAUSED, ERROR, MISSING. Note: when filtering by sandbox_status, total_items reflects the unfiltered count since the filter is applied post-query. This may result in pagination showing fewer items per page than expected."},"description":"Filter by sandbox status: STARTING, RUNNING, PAUSED, ERROR, MISSING. Note: when filtering by sandbox_status, total_items reflects the unfiltered count since the filter is applied post-query. This may result in pagination showing fewer items per page than expected."},{"name":"time_window","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time window filter","description":"Options: all, 7d, 30d, 90d"},"description":"Options: all, 7d, 30d, 90d"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"title":"Page number","default":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"title":"Items per page","default":20}},{"name":"include_sub_conversations","in":"query","required":false,"schema":{"type":"boolean","title":"If True, include sub-conversations. If False (default), exclude them.","default":false}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgConversationPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/conversations/stats":{"get":{"tags":["Orgs"],"summary":"Get Org Conversation Stats","description":"Get aggregated statistics for organization conversations.\n\nReturns counts of active conversations, running runtimes, completed conversations,\nand aggregated cost/token usage for the organization.\n\n**Access Control**: Requires VIEW_ORG_CONVERSATIONS permission (Admin or Owner role).\n\nReturns:\n    OrgConversationStats: Aggregated statistics for the org","operationId":"get_org_conversation_stats_api_organizations__org_id__conversations_stats_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgConversationStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/conversations/usage-stats":{"get":{"tags":["Orgs"],"summary":"Get Org Conversation Usage Stats","description":"Get detailed usage statistics for organization dashboard.\n\nReturns detailed metrics including active users, agent runs, token usage,\ndaily breakdown, and team usage for the specified time window.\n\n**Access Control**: Requires VIEW_ORG_CONVERSATIONS permission (Admin or Owner role).\n\nArgs:\n    org_id: The organization ID\n    time_window: Time window filter (7d, 30d, 90d, ytd)\n    days: Number of days to look back (default 7)\n\nReturns:\n    OrgUsageStats: Detailed usage statistics for the org","operationId":"get_org_conversation_usage_stats_api_organizations__org_id__conversations_usage_stats_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"time_window","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time window filter","description":"Options: 7d, 30d, 90d, ytd (overrides days when provided)"},"description":"Options: 7d, 30d, 90d, ytd (overrides days when provided)"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Number of days to look back","title":"Days"},"description":"Number of days to look back"},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUsageStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/conversations/user-usage":{"get":{"tags":["Orgs"],"summary":"Get Org Conversation User Usage Stats","description":"Get per-user usage metrics for organization dashboard.\n\n**Access Control**: Requires VIEW_ORG_CONVERSATIONS permission (Admin or Owner role).\n\nArgs:\n    org_id: The organization ID\n    limit: Maximum number of user rows to return\n    offset: Offset for paginated user rows\n\nReturns:\n    OrgUserUsageStats: Usage statistics aggregated by user","operationId":"get_org_conversation_user_usage_stats_api_organizations__org_id__conversations_user_usage_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"description":"Maximum number of user rows to return","default":500,"title":"Limit"},"description":"Maximum number of user rows to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset for paginated user rows","default":0,"title":"Offset"},"description":"Offset for paginated user rows"},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUserUsageStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/conversations/export":{"get":{"tags":["Orgs"],"summary":"Export Org Conversations Csv","description":"Export organization conversations as CSV.\n\nReturns the filtered conversation dataset as a downloadable CSV file.\n\n**Access Control**: Requires VIEW_ORG_CONVERSATIONS permission (Admin or Owner role).","operationId":"export_org_conversations_csv_api_organizations__org_id__conversations_export_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search text matching conversation name, creator name, email, or sandbox ID"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","title":"Field to sort by","default":"updated_at"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","title":"Sort order","default":"desc"}},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Filter by execution status"}},{"name":"sandbox_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter by sandbox status"}},{"name":"time_window","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time window filter (7d, 30d, 90d)"}},{"name":"include_sub_conversations","in":"query","required":false,"schema":{"type":"boolean","title":"If True, include sub-conversations","default":false}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/conversations/{conversation_id}":{"get":{"tags":["Orgs"],"summary":"Get Org Conversation","description":"Get a specific conversation by ID.\n\nReturns full conversation details including logs/history reference.\n\n**Access Control**: Requires VIEW_ORG_CONVERSATIONS permission (Admin or Owner role).\n\nRaises:\n    HTTPException: 404 if conversation not found or not in org","operationId":"get_org_conversation_api_organizations__org_id__conversations__conversation_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/conversations/{conversation_id}/stop":{"post":{"tags":["Orgs"],"summary":"Stop Org Conversation","description":"Stop a running conversation and its runtime.\n\nSafely terminates active agent loops and shuts down the underlying\nruntime execution cell.\n\n**Access Control**: Requires VIEW_ORG_CONVERSATIONS permission (Admin or Owner role).\n\nReturns:\n    Success message with stopped conversation details\n\nRaises:\n    HTTPException: 404 if conversation not found\n    HTTPException: 409 if conversation is not running\n    HTTPException: 503 if runtime stop fails","operationId":"stop_org_conversation_api_organizations__org_id__conversations__conversation_id__stop_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/super-admins":{"get":{"tags":["Admin"],"summary":"List Super Admins","description":"List all current super admins. Requires ``MANAGE_SUPER_ADMINS``.","operationId":"list_super_admins_api_admin_super_admins_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin"],"summary":"Grant Super Admin","description":"Grant the super-admin role to an existing user.\n\nIdempotent: granting to a user who is already a super admin succeeds and\nreturns their record. Requires ``MANAGE_SUPER_ADMINS``.","operationId":"grant_super_admin_api_admin_super_admins_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantSuperAdminRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/super-admins/{user_id}":{"delete":{"tags":["Admin"],"summary":"Revoke Super Admin","description":"Revoke the super-admin role from a user (including oneself).\n\nRefuses with ``409 Conflict`` if the target is the only remaining super\nadmin. Requires ``MANAGE_SUPER_ADMINS``.","operationId":"revoke_super_admin_api_admin_super_admins__user_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/profiles":{"get":{"tags":["Organization Profiles"],"summary":"List Profiles","description":"List all LLM profiles for this organization.","operationId":"list_profiles_api_organizations__org_id__profiles_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__routes__org_profiles__ProfileListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/profiles/{name}":{"get":{"tags":["Organization Profiles"],"summary":"Get Profile","description":"Get details of a specific profile.","operationId":"get_profile_api_organizations__org_id__profiles__name__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__routes__org_profiles__ProfileDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Organization Profiles"],"summary":"Save Profile","description":"Create or update an LLM profile.\n\nIf ``llm`` is omitted, saves a copy of the current org LLM defaults.","operationId":"save_profile_api_organizations__org_id__profiles__name__post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__routes__org_profiles__SaveProfileRequest","default":{"include_secrets":true,"preserve_existing_api_key":false}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__routes__org_profiles__ProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Organization Profiles"],"summary":"Delete Profile","description":"Delete an LLM profile.\n\nBlocked with 409 if any of the org's Agent Profiles still reference this LLM\nprofile by ``llm_profile_ref`` (the SDK ``find_referrers`` FK guard) — both\ncollections live on the same org row, so the ``SELECT ... FOR UPDATE`` lock\nmakes the referrer check and the delete atomic.","operationId":"delete_profile_api_organizations__org_id__profiles__name__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__routes__org_profiles__ProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/profiles/{name}/activate":{"post":{"tags":["Organization Profiles"],"summary":"Activate Profile","description":"Activate a profile for the current user.\n\nTwo side effects: updates the org-wide ``profiles.active`` marker and\nwrites the profile's LLM into the calling member's\n``agent_settings_diff``. Both writes share a single transaction so a\nfailure in the second can't leave the org marker advanced without the\nmember's settings catching up. Because the first effect is org-level\nstate, this requires ``EDIT_ORG_SETTINGS`` — matching the CRUD endpoints\nrather than the read-only listing. For personal orgs the owner has the\npermission natively; for team orgs this scopes \"set org default profile\"\nto admins.","operationId":"activate_profile_api_organizations__org_id__profiles__name__activate_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__routes__org_profiles__ActivateProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/profiles/{name}/rename":{"post":{"tags":["Organization Profiles"],"summary":"Rename Profile","description":"Rename an LLM profile, cascading the rename to any Agent Profiles that\nreference it.\n\nThe SDK ``rename_llm_profile`` renames the LLM profile and repoints every\n``agent_profiles.*.llm_profile_ref == name`` to ``new_name`` under the org\nrow lock, so a referencing Agent Profile never dangles. Both collections are\nwritten back in the same transaction.","operationId":"rename_profile_api_organizations__org_id__profiles__name__rename_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__routes__org_profiles__RenameProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/server__routes__org_profiles__ProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-profiles":{"get":{"tags":["Agent Profiles"],"summary":"List Agent Profiles","description":"List agent profiles and the effective active pointer for this member.\n\nNo implicit writes: an org with no profiles yet just returns an empty\nlist. Profile creation is always an explicit ``save_agent_profile`` call\n(``EDIT_ORG_SETTINGS``).","operationId":"list_agent_profiles_api_agent_profiles_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-profiles/{name}":{"get":{"tags":["Agent Profiles"],"summary":"Get Agent Profile","description":"Get a stored profile — secret-free at rest, nothing to mask.\n\nUnlike the LLM-profile GET in ``org_profiles``, there is no\n``X-Expose-Secrets`` handling here at all: the profile carries only\nreferences (``llm_profile_ref``, ``mcp_server_refs``) and a\n``disabled_skills`` deny-list of names.","operationId":"get_agent_profile_api_agent_profiles__name__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$","title":"Name"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Agent Profiles"],"summary":"Save Agent Profile","description":"Create or update an agent profile under ``name`` (path name is authoritative).\n\nServer-managed id/revision: overwrite keeps the namesake's id and bumps\nrevision; create mints a fresh id (``save_profile_preserving_identity``).\nReturns 422 on invalid payloads (secret-safe detail) and 409 when creating a\nnew profile would exceed ``MAX_AGENT_PROFILES``.","operationId":"save_agent_profile_api_agent_profiles__name__post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$","title":"Name"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Agent Profiles"],"summary":"Delete Agent Profile","description":"Delete a profile (idempotent). Clears every org member's pointer to it.\n\nA missing name resolves 200, matching the ts-client ``AgentProfilesClient``\ncontract and the local agent-server ``delete_profile`` (canvas's delete\nmutation has no 404 branch).","operationId":"delete_agent_profile_api_agent_profiles__name__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$","title":"Name"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-profiles/{name}/rename":{"post":{"tags":["Agent Profiles"],"summary":"Rename Agent Profile","description":"Rename a profile atomically.\n\nThe stable id is preserved, so active pointers (keyed on id) survive\nuntouched.","operationId":"rename_agent_profile_api_agent_profiles__name__rename_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$","title":"Name"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameAgentProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileMutationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-profiles/{profile_id}/activate":{"post":{"tags":["Agent Profiles"],"summary":"Activate Agent Profile","description":"Activate a profile for the calling member — pointer only.\n\nWrites the per-member ``OrgMember.active_agent_profile_id`` and nothing else\n(no ``agent_settings`` materialization, and the profiles collection itself\nis untouched — the transaction helper skips the write-back when nothing\nmutated; #15044 §3). Member-facing, so it requires only\n``VIEW_ORG_SETTINGS`` (each member picks their own active profile); profile\nCRUD requires ``EDIT_ORG_SETTINGS``. 404 if no stored profile has that id.","operationId":"activate_agent_profile_api_agent_profiles__profile_id__activate_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Profile Id"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateAgentProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-profiles/{name}/materialize":{"post":{"tags":["Agent Profiles"],"summary":"Materialize Agent Profile","description":"Dry-run resolve a profile's LLM/MCP references into a diagnostics report.\n\nDangling refs are reported in the body (``valid=False``), not raised; the\nonly error status is 404 (unknown profile name). ``resolved_settings`` is\nredacted. Delegates entirely to ``resolve_agent_profile_dry_run``.","operationId":"materialize_agent_profile_api_agent_profiles__name__materialize_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$","title":"Name"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileDiagnostics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/verified-models":{"get":{"tags":["Verified Models"],"summary":"Search Verified Models","description":"List all verified models, optionally filtered by provider.","operationId":"search_verified_models_api_admin_verified_models_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}},{"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/VerifiedModelPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Verified Models"],"summary":"Create Verified Model","description":"Create a new verified model.","operationId":"create_verified_model_api_admin_verified_models_post","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifiedModelCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifiedModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/verified-models/{provider}/{model_name}":{"put":{"tags":["Verified Models"],"summary":"Update Verified Model","description":"Update a verified model by provider and model name.","operationId":"update_verified_model_api_admin_verified_models__provider___model_name__put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"model_name","in":"path","required":true,"schema":{"type":"string","title":"Model Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifiedModelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifiedModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Verified Models"],"summary":"Delete Verified Model","description":"Delete a verified model by provider and model name.","operationId":"delete_verified_model_api_admin_verified_models__provider___model_name__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"model_name","in":"path","required":true,"schema":{"type":"string","title":"Model Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Delete Verified Model Api Admin Verified Models  Provider   Model Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me":{"get":{"tags":["User"],"summary":"Get Current User Saas","description":"Get the current authenticated user with SAAS-specific org info.\n\nReturns user settings along with organization context:\n- org_id: Current organization ID\n- org_name: Current organization name\n- role: User's role in the organization\n- permissions: List of permission strings for the role","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"}}}}}}},"/api/v1/users/git-organizations":{"get":{"tags":["User"],"summary":"Get Current User Git Organizations","description":"Return the Git organizations, groups, or workspaces the user belongs to\non their active provider.\n\nIn SAAS mode users sign in with one provider at a time, so the response\nreflects that single provider.","operationId":"get_current_user_git_organizations_api_v1_users_git_organizations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GitOrganizationsResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/organizations/{org_id}/members/invite":{"post":{"summary":"Create Invitation","description":"Create organization invitations for multiple email addresses.\n\nSends emails to invitees with secure links to join the organization.\nSupports batch invitations - some may succeed while others fail.\n\nPermission rules:\n- Only owners and admins can create invitations\n- Admins can only invite with 'member' or 'admin' role (not 'owner')\n- Owners can invite with any role\n\nArgs:\n    org_id: Organization UUID\n    invitation_data: Invitation details (emails array, role)\n    request: FastAPI request\n    user_id: Authenticated user ID (from dependency)\n\nReturns:\n    BatchInvitationResponse: Lists of successful and failed invitations\n\nRaises:\n    HTTPException 400: Invalid role or organization not found\n    HTTPException 403: User lacks permission to invite\n    HTTPException 429: Rate limit exceeded","operationId":"create_invitation_api_organizations__org_id__members_invite_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchInvitationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Pending Invitations","description":"List an organization's pending invitations, including invite links.\n\nGated on the invite permission (admins/owners): responses include each\ninvitation's acceptance link so inviters can share it directly when no\nemail provider is configured.","operationId":"list_pending_invitations_api_organizations__org_id__members_invite_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingInvitationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{org_id}/members/invite/{invitation_id}":{"delete":{"summary":"Revoke Invitation","description":"Revoke a pending invitation, invalidating its token and invite link.\n\nGated on the invite permission (admins/owners), same as creating and\nlisting invitations.\n\nRaises:\n    HTTPException 404: Unknown invitation, or it belongs to another org\n    HTTPException 409: Invitation is not pending (already accepted/expired)","operationId":"revoke_invitation_api_organizations__org_id__members_invite__invitation_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"org_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},{"name":"invitation_id","in":"path","required":true,"schema":{"type":"integer","title":"Invitation Id"}},{"name":"X-Org-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Org-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/members/invite/accept":{"get":{"summary":"Accept Invitation Redirect","description":"Redirect invitation acceptance to frontend.\n\nThis endpoint is accessed via the link in the invitation email.\nIt always redirects to the home page with the invitation token,\nallowing the frontend to handle the acceptance flow via a modal.\n\nThis approach works with SameSite='strict' cookies because:\n- Cross-site navigation (clicking email link) doesn't send cookies\n- But same-origin POST requests (from frontend) DO send cookies\n\nArgs:\n    token: The invitation token from the email link\n    request: FastAPI request\n\nReturns:\n    RedirectResponse: Redirect to home page with invitation_token query param","operationId":"accept_invitation_redirect_api_organizations_members_invite_accept_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Accept Invitation","description":"Accept an organization invitation via authenticated POST request.\n\nThis endpoint is called by the frontend after displaying the acceptance modal.\nRequires authentication - cookies are sent because this is a same-origin request.\n\nArgs:\n    request_data: Contains the invitation token\n    user_id: Authenticated user ID (from dependency)\n\nReturns:\n    AcceptInvitationResponse: Success response with organization details\n\nRaises:\n    HTTPException 400: Invalid or expired token\n    HTTPException 403: Email mismatch\n    HTTPException 409: User already a member","operationId":"accept_invitation_api_organizations_members_invite_accept_post","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInvitationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInvitationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/install":{"get":{"summary":"Install","description":"Forward into Slack OAuth.","operationId":"install_slack_install_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/install-callback":{"get":{"summary":"Install Callback","description":"Callback from slack authentication. Verifies, then forwards into keycloak authentication.","operationId":"install_callback_slack_install_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/keycloak-callback":{"get":{"summary":"Keycloak Callback","operationId":"keycloak_callback_slack_keycloak_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/slack/on-event":{"post":{"summary":"On Event","operationId":"on_event_slack_on_event_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/on-options-load":{"post":{"summary":"On Options Load","description":"Handle external_select options loading (block_suggestion payload).\n\nThis endpoint is called by Slack when a user interacts with an external_select\nelement. It supports dynamic repository search with pagination.\n\nThe endpoint:\n1. Authenticates the Slack user\n2. Searches for repositories matching the user's query\n3. Returns up to 100 options for the dropdown\n\nNote: \"No Repository\" is handled by a separate button in the form, so it's\nnot included in the dropdown options. Error cases return an empty list.\n\nConfiguration: Set the Options Load URL in Slack App settings to:\nhttps://your-domain/slack/on-options-load","operationId":"on_options_load_slack_on_options_load_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/on-form-interaction":{"post":{"summary":"On Form Interaction","description":"Handle repository selection form submission.\n\nWhen a user selects a repository from the external_select dropdown,\nthis endpoint passes the payload to the manager which retrieves the\noriginal user message from Redis and starts the conversation.","operationId":"on_form_interaction_slack_on_form_interaction_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/integration/jira/events":{"post":{"summary":"Jira Events","description":"Handle Jira webhook events.","operationId":"jira_events_integration_jira_events_post","parameters":[{"name":"x-hub-signature","in":"header","required":false,"schema":{"type":"string","title":"X-Hub-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/jira/workspaces":{"post":{"summary":"Create Jira Workspace","description":"Create a new Jira workspace registration.","operationId":"create_jira_workspace_integration_jira_workspaces_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraWorkspaceCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/jira/workspaces/link":{"get":{"summary":"Get Current Workspace Link","description":"Get current user's Jira integration details.","operationId":"get_current_workspace_link_integration_jira_workspaces_link_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraUserResponse"}}}}}},"post":{"summary":"Create Workspace Link","description":"Register a user mapping to a Jira workspace.","operationId":"create_workspace_link_integration_jira_workspaces_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraLinkCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/jira/callback":{"get":{"summary":"Jira Callback","operationId":"jira_callback_integration_jira_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integration/jira/workspaces/unlink":{"post":{"summary":"Unlink Workspace","description":"Unlink user from Jira integration by setting status to inactive.","operationId":"unlink_workspace_integration_jira_workspaces_unlink_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/integration/jira/workspaces/validate/{workspace_name}":{"get":{"summary":"Validate Workspace Integration","description":"Validate if the user's organization has an active Jira integration.","operationId":"validate_workspace_integration_integration_jira_workspaces_validate__workspace_name__get","parameters":[{"name":"workspace_name","in":"path","required":true,"schema":{"type":"string","title":"Workspace Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraValidateWorkspaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/email":{"post":{"summary":"Update Email","operationId":"update_email_api_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/email/resend":{"put":{"summary":"Resend Email Verification","operationId":"resend_email_verification_api_email_resend_put","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ResendEmailVerificationRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/email/verified":{"get":{"summary":"Verified Email","operationId":"verified_email_api_email_verified_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/analytics/events":{"post":{"tags":["Analytics"],"summary":"Track Frontend Event","description":"Capture a frontend-initiated analytics event.\n\n``body.event_type`` selects the PostHog event name; the remaining fields\non the validated model become the event's properties. Telemetry failures\nare isolated so they never bubble up to the user's primary action.","operationId":"track_frontend_event_api_analytics_events_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePrButtonClickedEvent"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsEventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}}},"components":{"schemas":{"ACPAgent":{"properties":{"llm":{"$ref":"#/components/schemas/LLM-Input"},"tools":{"items":{"$ref":"#/components/schemas/openhands__sdk__tool__spec__Tool"},"type":"array","title":"Tools"},"mcp_config":{"additionalProperties":{"$ref":"#/components/schemas/MCPServer-Input"},"type":"object","title":"Mcp Config","description":"Optional MCP servers to expose as tools.","examples":[{"fetch":{"args":["--with","mcp==1.29.0","mcp-server-fetch==2026.7.10"],"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"},"agent_context":{"anyOf":[{"$ref":"#/components/schemas/AgentContext-Input"},{"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":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt","description":"Inline system prompt string.  When provided, the agent uses this text verbatim as the system message instead of rendering from `system_prompt_filename`.  Mutually exclusive with a non-default `system_prompt_filename`.\n\n**Warning**: This is not recommended unless you know what you are doing (e.g. customising agent behaviour for a completely different task).  Setting this will override OpenHands' built-in system instructions that govern default agent behaviour."},"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 filename. The default 'security_policy.j2' is a back-compat sentinel (the file was removed) that selects the built-in default policy from the prompt registry -- it is not loaded from disk. Any other value names a custom policy file whose contents are inserted verbatim (NOT rendered as a Jinja template). Can be either:\n- A relative filename (e.g., 'custom_security_policy.md') loaded from the agent's prompts directory\n- An absolute path (e.g., '/path/to/custom_security_policy.md')\n- Empty string to disable security policy","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-Input"},{"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/openai/gpt-5.5"},"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},"acp_command":{"items":{"type":"string"},"type":"array","title":"Acp Command","description":"Command to start the ACP server, e.g. ['npx', '-y', '@agentclientprotocol/claude-agent-acp']"},"acp_server":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Server","description":"Provider registry key identifying which ACP CLI this agent runs ('claude-code', 'codex', 'gemini-cli', or 'custom'); None when the agent is built directly rather than via ACPAgentSettings. Set by ACPAgentSettings.create_agent() from ACPAgentSettings.acp_server so the authoritative key survives onto the agent — and thus onto ConversationInfo.agent — because the launch command in acp_command does not reliably reverse-map to a provider. Informational only: consumers use it to resolve a provider brand label / model list; the subprocess is still launched from acp_command."},"acp_args":{"items":{"type":"string"},"type":"array","title":"Acp Args","description":"Additional arguments for the ACP server command"},"acp_session_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Session Mode","description":"Session mode ID to set after creating a session. If None (default), auto-detected from the ACP server type: 'bypassPermissions' for claude-agent-acp, 'agent-full-access' for codex-acp."},"acp_prompt_timeout":{"type":"number","title":"Acp Prompt Timeout","description":"Inactivity timeout in seconds for a single ACP prompt() call. The deadline resets on every update from the ACP server (token, thought, tool-call progress, usage), so a steadily-progressing agent runs as long as it keeps making progress; the prompt is only aborted after this many seconds with no activity at all. Prevents indefinite hangs when the ACP server stops responding without killing legitimately long-running work.","default":1800.0},"acp_startup_timeout":{"type":"number","title":"Acp Startup Timeout","description":"Timeout in seconds for ACP server startup: spawning the subprocess, the initialize/authenticate handshake, and new_session()/load_session(). Unlike acp_prompt_timeout, this is a hard deadline rather than an idle deadline, since startup has no intermediate progress signal to reset it against. Prevents an indefinite hang when the ACP server blocks on authentication (e.g. an expired token) without ever raising.","default":90.0},"acp_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Model","description":"Model for the ACP server to use (e.g. 'sonnet' or 'gpt-5.5'). Applied via the protocol — set_config_option(model) for configOptions-based servers (codex, claude), else set_session_model. If None, the server picks its default."},"acp_resume_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Resume Session Id","description":"Optional explicit ACP session id to resume. When set, takes precedence over the id persisted in ``state.agent_state`` and is used to call ``session/load`` on the ACP server. Designed for environments where the per-conversation filesystem (and therefore ``base_state.json``) does not survive across restarts (e.g. cloud sandbox recycles), but the id has been mirrored into durable storage elsewhere. Falls back to a fresh session if the server cannot load the id. Treated as a secret on the wire — possession of the id is enough to resume the underlying ACP session, so default serialization redacts it; pass ``expose_secrets='plaintext'`` (trusted backend) or ``expose_secrets='encrypted'`` plus a cipher (frontend round-trip) when the value must cross a serialization boundary."},"acp_file_secrets":{"items":{"$ref":"#/components/schemas/ACPFileSecretSpec"},"type":"array","title":"Acp File Secrets","description":"Reserved 'file-content' credential secrets to materialise to disk before launching the subprocess (e.g. Codex auth.json, Gemini Vertex SA JSON). The SDK owns the mechanism (write the file in the runtime pod, set the env var, seed-if-absent); these specs are the policy. Defaults to the built-in supported providers; a downstream application may override or extend this to support other ACP servers with different file-auth schemes."},"acp_isolate_data_dir":{"type":"boolean","title":"Acp Isolate Data Dir","description":"Give the ACP subprocess a per-conversation CLI data/config root instead of the shared user ``HOME``. When True and the provider is recognised, point its data-dir env var (``CODEX_HOME`` / ``CLAUDE_CONFIG_DIR`` / ``HOME``; see ``ACPProviderInfo.data_dir_env_var``) at ``<persistence_dir>/acp/<provider>`` — the same per-conversation tree materialised file-secrets use. Required for correctness when several of a user's conversations share one sandbox (``SandboxGroupingStrategy != NO_GROUPING``), where they would otherwise race on one set of CLI auth/config/cache/lock files (see #1019). Off by default: with one sandbox per conversation the shared HOME is already private, and relocating it would hide a pre-existing interactive login. Downstream policy decides when to enable it; the SDK owns where the root lives.","default":false},"kind":{"type":"string","const":"ACPAgent","title":"Kind"}},"type":"object","required":["acp_command"],"title":"ACPAgent","description":"Agent that delegates to an ACP-compatible subprocess server."},"ACPAgentProfile":{"properties":{"schema_version":{"type":"integer","minimum":1.0,"title":"Schema Version","default":2},"id":{"type":"string","format":"uuid","title":"Id","description":"Stable provenance handle for this profile. Conversations record this UUID; it never changes, even when the profile is renamed."},"name":{"type":"string","minLength":1,"title":"Name","description":"Human-facing, renameable key shown in the profile picker."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Monotonic revision counter, bumped on each saved edit.","default":0},"mcp_server_refs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mcp Server Refs","description":"Which of the user's globally configured MCP servers to expose. null = all; [] = none; a non-null list = filter to the named keys."},"agent_kind":{"type":"string","const":"acp","title":"Agent Kind","description":"Discriminator for the ``AgentProfile`` union. ``'acp'`` selects an ACP-delegating agent.","default":"acp"},"acp_server":{"type":"string","enum":["claude-code","codex","gemini-cli","custom"],"title":"Acp Server","description":"Which ACP-compatible backend to launch. The provider's credential env-var name is derived from this via the ACP_PROVIDERS registry.","default":"claude-code"},"acp_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Model","description":"Model identifier for the ACP server (e.g. 'claude-opus-4-8'). Leave blank to let the server pick its default."},"acp_session_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Session Mode","description":"Session mode ID (e.g. 'bypassPermissions'). Leave blank to auto-detect from the ACP server type."},"acp_prompt_timeout":{"type":"number","exclusiveMinimum":0.0,"title":"Acp Prompt Timeout","description":"Inactivity timeout (seconds) for a single ACP prompt() round-trip; resets on every update from the server.","default":1800.0},"acp_startup_timeout":{"type":"number","exclusiveMinimum":0.0,"title":"Acp Startup Timeout","description":"Timeout (seconds) for ACP server startup: spawn, initialize/authenticate, and new_session()/load_session().","default":90.0},"acp_command":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Command","description":"Optional explicit command to launch the ACP subprocess. Leave blank to use the default for ``acp_server``."},"acp_args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Acp Args","description":"Additional arguments appended to the ACP server command."}},"additionalProperties":false,"type":"object","required":["name"],"title":"ACPAgentProfile","description":"``agent_kind=\"acp\"`` profile — names an ACP backend, stores no credential.\n\nThere is no ``llm_profile_ref`` and no embedded credential: the ACP\nsubprocess makes its own model calls, and the provider's credential\n(env-var name) is derived from :attr:`acp_server` via the\n:data:`~openhands.sdk.settings.acp_providers.ACP_PROVIDERS` registry. The\nvalue rides the conversation secrets channel, never the profile."},"ACPAgentSettings":{"properties":{"schema_version":{"type":"integer","minimum":1.0,"title":"Schema Version","default":5},"agent_kind":{"type":"string","const":"acp","title":"Agent Kind","description":"Discriminator for the ``AgentSettings`` union. ``'acp'`` selects an ACP-delegating agent.","default":"acp"},"acp_server":{"type":"string","enum":["claude-code","codex","gemini-cli","custom"],"title":"Acp Server","description":"Which ACP-compatible backend to launch. Each choice maps to a default subprocess command (see ``acp_command`` to override).","default":"claude-code","openhands_settings":{"depends_on":[],"label":"ACP server","prominence":"critical"},"openhands_settings_section":{"key":"acp","label":"ACP (Agent Client Protocol)","variant":"acp"}},"acp_command":{"items":{"type":"string"},"type":"array","title":"Acp Command","description":"Optional explicit command to launch the ACP subprocess. Leave empty to use the default for :attr:`acp_server` (e.g. ``npx -y @agentclientprotocol/claude-agent-acp`` for ``claude-code``). Must be set when :attr:`acp_server` is ``'custom'``.","openhands_settings":{"depends_on":[],"label":"ACP command (custom override)","prominence":"minor"},"openhands_settings_section":{"key":"acp","label":"ACP (Agent Client Protocol)","variant":"acp"}},"acp_args":{"items":{"type":"string"},"type":"array","title":"Acp Args","description":"Additional arguments appended to the ACP server command.","openhands_settings":{"depends_on":[],"label":"ACP extra args","prominence":"minor"},"openhands_settings_section":{"key":"acp","label":"ACP (Agent Client Protocol)","variant":"acp"}},"acp_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Model","description":"Model identifier for the ACP server to use (e.g. ``'sonnet'`` or ``'gpt-5.5'``). Applied via the protocol — set_config_option(model) for configOptions-based servers (codex, claude), else set_session_model. Leave blank to let the server pick its default.","openhands_settings":{"depends_on":[],"label":"ACP model","prominence":"critical"},"openhands_settings_section":{"key":"acp","label":"ACP (Agent Client Protocol)","variant":"acp"}},"acp_session_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Session Mode","description":"Session mode ID (e.g. ``bypassPermissions``). Leave blank to auto-detect from the ACP server type.","openhands_settings":{"depends_on":[],"label":"ACP session mode","prominence":"minor"},"openhands_settings_section":{"key":"acp","label":"ACP (Agent Client Protocol)","variant":"acp"}},"acp_prompt_timeout":{"type":"number","exclusiveMinimum":0.0,"title":"Acp Prompt Timeout","description":"Inactivity timeout (seconds) for a single ACP prompt() round-trip. The deadline resets on every update from the ACP server, so a steadily-progressing agent keeps running; the prompt is only aborted after this many seconds with no activity at all.","default":1800.0,"openhands_settings":{"depends_on":[],"label":"ACP prompt inactivity timeout (seconds)","prominence":"minor"},"openhands_settings_section":{"key":"acp","label":"ACP (Agent Client Protocol)","variant":"acp"}},"acp_startup_timeout":{"type":"number","exclusiveMinimum":0.0,"title":"Acp Startup Timeout","description":"Timeout (seconds) for ACP server startup: spawning the subprocess, the initialize/authenticate handshake, and new_session()/load_session(). A hard deadline, unlike acp_prompt_timeout, since startup has no intermediate progress signal to reset it against.","default":90.0,"openhands_settings":{"depends_on":[],"label":"ACP startup timeout (seconds)","prominence":"minor"},"openhands_settings_section":{"key":"acp","label":"ACP (Agent Client Protocol)","variant":"acp"}},"mcp_config":{"additionalProperties":{"$ref":"#/components/schemas/MCPServer-Output"},"type":"object","title":"Mcp Config","description":"MCP servers to make available to the ACP subprocess. Unlike the OpenHands agent — where these become in-process MCP tools — the servers are forwarded to the ACP server at session creation and it owns the connection. Remote (http/sse) servers are only forwarded when the ACP server advertises support for that transport; stdio servers (which run inside the runtime) are always forwarded.","openhands_settings":{"depends_on":[],"label":"MCP servers","prominence":"minor","variant":"acp"}},"acp_isolate_data_dir":{"type":"boolean","title":"Acp Isolate Data Dir","description":"Give the ACP subprocess a per-conversation CLI data/config root instead of the shared user HOME. Forwarded to :attr:`~openhands.sdk.agent.ACPAgent.acp_isolate_data_dir`; off by default. Enable from the deploying application when several conversations share one sandbox (see #1019).","default":false},"acp_file_secrets":{"items":{"$ref":"#/components/schemas/ACPFileSecretSpec"},"type":"array","title":"Acp File Secrets","description":"Reserved 'file-content' credential secrets the SDK materialises to disk before launching the ACP subprocess (e.g. Codex auth.json, Gemini Vertex SA JSON). Defaults to the built-in supported providers; override to support other ACP servers with different file-auth schemes."},"llm":{"$ref":"#/components/schemas/LLM-Output","description":"DEPRECATED (removed in 1.33.0): LLM identity used for cost/token attribution. The ACP subprocess makes its own model calls; ``acp_model`` is the model identity. Credentials set here (``api_key`` / ``base_url``) are ignored — route provider credentials through the conversation secrets channel (agent_context.secrets / StartConversationRequest.secrets, which route through state.secret_registry), keyed by the provider's env var name.","openhands_settings_section":{"key":"llm","label":"LLM (for metrics)","variant":"acp"}},"agent_context":{"anyOf":[{"$ref":"#/components/schemas/AgentContext-Output"},{"type":"null"}],"description":"Prompt-only context for the ACP server. ``secrets`` here are advertised to the agent (names/descriptions) and reach the subprocess env through ``state.secret_registry``: ``LocalConversation`` seeds ``agent_context.secrets`` into the registry at conversation init (below ``request.secrets``), so callers that build the request outside Python (e.g. canvas-local) are covered too, not just the ``create_request`` path. Provider credentials belong here (or in ``request.secrets``) keyed by the provider's env var name."}},"type":"object","title":"ACPAgentSettings","description":"Settings for an ACP (Agent Client Protocol) agent.\n\n``create_agent()`` returns an :class:`ACPAgent` that delegates to a\nsubprocess ACP server.  The ACP server manages its own system prompt,\ntools, MCP, and (primary) LLM calls; those fields from\n:class:`OpenHandsAgentSettings` do not apply here.\n\n``ACPAgent`` uses the :attr:`llm` field purely for cost/token attribution,\nnever for LLM requests; :attr:`acp_model` is the model identity. Any\ncredentials set on it (``llm.api_key`` / ``llm.base_url``) are ignored —\nprovider credentials ride the conversation secrets channel\n(``request.secrets`` / ``agent_context.secrets`` → ``state.secret_registry``)\nkeyed by the provider's env var name (:attr:`api_key_env_var`)."},"ACPFileSecretSpec":{"properties":{"secret_name":{"type":"string","minLength":1,"title":"Secret Name"},"filename":{"type":"string","minLength":1,"title":"Filename"},"env_var":{"type":"string","minLength":1,"title":"Env Var"},"subdir":{"type":"string","minLength":1,"title":"Subdir"},"env_points_to":{"type":"string","enum":["dir","file"],"title":"Env Points To","default":"file"},"warn_if_unset":{"items":{"type":"string"},"type":"array","title":"Warn If Unset","default":[]}},"type":"object","required":["secret_name","filename","env_var","subdir"],"title":"ACPFileSecretSpec","description":"Declarative mapping from a reserved \"file-content\" secret to a credential\nfile the ACP subprocess authenticates from.\n\nSome providers read their credential from a *file on disk* rather than an\nenv var: Codex reads ``$CODEX_HOME/auth.json``; Gemini (Vertex AI) reads a\nservice-account JSON pointed at by ``GOOGLE_APPLICATION_CREDENTIALS``. The\nuser supplies that credential as a pasted blob — a reserved secret named\n:attr:`secret_name` — and :class:`~openhands.sdk.agent.ACPAgent` materialises\nit to :attr:`filename` under the conversation's durable per-conversation root\n(seed-if-absent), then sets :attr:`env_var` so the CLI can find it.\n\nMaterialisation is keyed off :attr:`secret_name` (not the launch command),\nso a custom or aliased ``acp_command`` still works as long as the reserved\nsecret is supplied.\n\nThe SDK owns the *mechanism* (writing the file in the runtime pod, setting\nthe env var, seed-if-absent, permissions); the *policy* — which secrets map\nto which files for which CLIs — lives in these specs. Built-in defaults\ncover the supported providers, but downstream applications can override\n:attr:`~openhands.sdk.agent.ACPAgent.acp_file_secrets` to support other ACP\nservers with different file-auth schemes without an SDK change."},"ACPModelInfo":{"properties":{"model_id":{"type":"string","title":"Model Id","description":"Server-assigned model identifier. May be concrete (e.g. ``\"gpt-5.5\"``) or an opaque alias (e.g. ``\"default\"``, ``\"auto\"``). This is the value to pass back to the server to switch to this model."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Human-readable label, e.g. ``\"GPT-5.5\"``."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional longer description supplied by the server."}},"type":"object","required":["model_id"],"title":"ACPModelInfo","description":"One model an ACP server offers for a session.\n\nA normalized, stable mirror of the ACP protocol's ``ModelInfo``. The\nprotocol ``models`` capability is flagged **UNSTABLE**, so we re-map it\ninto our own type at the SDK boundary rather than re-serializing the\nvendored ``acp.schema`` type onto the agent-server's public API — clients\nget a stable shape regardless of upstream protocol churn.\n\nCarries everything a client needs to render a picker and resolve a\n``current_model_id`` to a display label *itself*; the SDK deliberately\ndoes no name curation."},"ACPModelOption":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"}},"type":"object","required":["id","label"],"title":"ACPModelOption"},"ACPProviderConfig":{"properties":{"key":{"type":"string","title":"Key"},"display_name":{"type":"string","title":"Display Name"},"default_command":{"items":{"type":"string"},"type":"array","title":"Default Command"},"default_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Model"},"available_models":{"items":{"$ref":"#/components/schemas/ACPModelOption"},"type":"array","title":"Available Models"},"api_key_env_var":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Env Var"},"base_url_env_var":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url Env Var"}},"type":"object","required":["key","display_name","default_command"],"title":"ACPProviderConfig"},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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`` — 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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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`` — 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://llm-proxy.app.all-hands.dev/vllm"},"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"},"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."},"issue_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Issue Threshold","description":"APIBasedCritic-specific probability threshold for agent issue labels that should trigger iterative refinement.","default":0.75},"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/InvokeSkillAction-Input"},{"$ref":"#/components/schemas/SwitchLLMAction-Input"},{"$ref":"#/components/schemas/ThinkAction-Input"},{"$ref":"#/components/schemas/VisionInspectAction-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"},{"$ref":"#/components/schemas/WorkflowAction-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__invoke_skill__InvokeSkillAction-Input__1":"#/components/schemas/InvokeSkillAction-Input","openhands__sdk__tool__builtins__switch_llm__SwitchLLMAction-Input__1":"#/components/schemas/SwitchLLMAction-Input","openhands__sdk__tool__builtins__think__ThinkAction-Input__1":"#/components/schemas/ThinkAction-Input","openhands__sdk__tool__builtins__vision_inspect__VisionInspectAction-Input__1":"#/components/schemas/VisionInspectAction-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","openhands__tools__workflow__definition__WorkflowAction-Input__1":"#/components/schemas/WorkflowAction-Input"}}},"Action-Output":{"oneOf":[{"$ref":"#/components/schemas/MCPToolAction-Output"},{"$ref":"#/components/schemas/FinishAction-Output"},{"$ref":"#/components/schemas/InvokeSkillAction-Output"},{"$ref":"#/components/schemas/SwitchLLMAction-Output"},{"$ref":"#/components/schemas/ThinkAction-Output"},{"$ref":"#/components/schemas/VisionInspectAction-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"},{"$ref":"#/components/schemas/WorkflowAction-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__invoke_skill__InvokeSkillAction-Output__1":"#/components/schemas/InvokeSkillAction-Output","openhands__sdk__tool__builtins__switch_llm__SwitchLLMAction-Output__1":"#/components/schemas/SwitchLLMAction-Output","openhands__sdk__tool__builtins__think__ThinkAction-Output__1":"#/components/schemas/ThinkAction-Output","openhands__sdk__tool__builtins__vision_inspect__VisionInspectAction-Output__1":"#/components/schemas/VisionInspectAction-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","openhands__tools__workflow__definition__WorkflowAction-Output__1":"#/components/schemas/WorkflowAction-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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"ActivateAgentProfileResponse":{"properties":{"id":{"type":"string","title":"Id"},"message":{"type":"string","title":"Message"},"agent_settings_applied":{"type":"boolean","title":"Agent Settings Applied","default":false}},"type":"object","required":["id","message"],"title":"ActivateAgentProfileResponse"},"Agent":{"properties":{"llm":{"$ref":"#/components/schemas/LLM-Input","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/openai/gpt-5.5"}]},"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":{"$ref":"#/components/schemas/MCPServer-Input"},"type":"object","title":"Mcp Config","description":"Optional MCP servers to expose as tools.","examples":[{"fetch":{"args":["--with","mcp==1.29.0","mcp-server-fetch==2026.7.10"],"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-Input"},{"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":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt","description":"Inline system prompt string.  When provided, the agent uses this text verbatim as the system message instead of rendering from `system_prompt_filename`.  Mutually exclusive with a non-default `system_prompt_filename`.\n\n**Warning**: This is not recommended unless you know what you are doing (e.g. customising agent behaviour for a completely different task).  Setting this will override OpenHands' built-in system instructions that govern default agent behaviour."},"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 filename. The default 'security_policy.j2' is a back-compat sentinel (the file was removed) that selects the built-in default policy from the prompt registry -- it is not loaded from disk. Any other value names a custom policy file whose contents are inserted verbatim (NOT rendered as a Jinja template). Can be either:\n- A relative filename (e.g., 'custom_security_policy.md') loaded from the agent's prompts directory\n- An absolute path (e.g., '/path/to/custom_security_policy.md')\n- Empty string to disable security policy","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-Input"},{"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/openai/gpt-5.5"},"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    system_prompt: Inline system prompt string. When provided the agent\n        uses this text verbatim instead of rendering from a template.\n        Mutually exclusive with a non-default ``system_prompt_filename``.\n        **Not recommended** unless you know what you are doing (e.g.\n        customising agent behaviour for a completely different task) —\n        this will override OpenHands' built-in system instructions.\n    system_prompt_filename: Jinja2 template filename resolved relative to\n        the agent's prompts directory, or an absolute path. Defaults to\n        ``\"system_prompt.j2\"``.\n    system_prompt_kwargs: Extra kwargs forwarded to the Jinja2 template.\n\nExample:\n    ```python\n    from openhands.sdk import LLM, Agent, Tool\n    from pydantic import SecretStr\n\n    llm = LLM(model=\"gpt-5.5\", api_key=SecretStr(\"key\"))\n    tools = [Tool(name=\"TerminalTool\"), Tool(name=\"FileEditorTool\")]\n    agent = Agent(llm=llm, tools=tools)\n    ```\n\n    To override the system prompt entirely::\n\n        agent = Agent(\n            llm=llm,\n            tools=tools,\n            system_prompt=\"You are a helpful coding assistant.\",\n        )"},"AgentBase":{"oneOf":[{"$ref":"#/components/schemas/ACPAgent"},{"$ref":"#/components/schemas/Agent"}],"discriminator":{"propertyName":"kind","mapping":{"openhands__sdk__agent__acp_agent__ACPAgent-Input__1":"#/components/schemas/ACPAgent","openhands__sdk__agent__agent__Agent-Input__1":"#/components/schemas/Agent"}}},"AgentContext-Input":{"properties":{"skills":{"items":{"$ref":"#/components/schemas/Skill-Input"},"type":"array","title":"Skills","description":"List of available skills that can extend the user's input.","acp_compatible":true},"system_message_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Message Suffix","description":"Optional suffix to append to the system prompt.","acp_compatible":true},"user_message_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Message Suffix","description":"Optional suffix to append to the user's message.","acp_compatible":true},"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,"acp_compatible":true},"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,"acp_compatible":true},"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","acp_compatible":true},"registered_marketplaces":{"items":{"$ref":"#/components/schemas/openhands__sdk__marketplace__registration__MarketplaceRegistration"},"type":"array","title":"Registered Marketplaces","description":"Marketplace registrations for plugin resolution. Registrations with auto_load=True or a list of plugin names are resolved by LocalConversation at startup.","acp_compatible":true},"load_project_skills":{"type":"boolean","title":"Load Project Skills","description":"Whether to automatically load project skills from the conversation workspace (e.g. .openhands/skills/, AGENTS.md). Unlike load_user_skills / load_public_skills, this flag is not resolved by AgentContext itself (the workspace path is unknown at validation time); LocalConversation resolves it lazily on the first send_message() / run(), when the workspace is known. Also unlike load_user_skills / load_public_skills (which yield to explicit skills on a name conflict), resolved project skills are authoritative: a project skill overrides a same-named skill already present in `skills`.","default":false,"acp_compatible":true},"load_memory":{"type":"boolean","title":"Load Memory","description":"Whether to load persistent agent memory (MEMORY.md indexes under ~/.openhands/memory/ and <workspace>/.openhands/memory/) into the system prompt. Like load_project_skills, this flag is not resolved by AgentContext itself (the workspace path is unknown at validation time); LocalConversation resolves it lazily on the first send_message() / run() and stores the result in memory_context.","default":false,"acp_compatible":true,"openhands_settings":{"depends_on":[],"label":"Persistent memory","prominence":"major"}},"memory_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memory Context","description":"Resolved memory-index text rendered into the <MEMORY_CONTEXT> prompt block. Populated via model_copy by LocalConversation when load_memory is set; excluded from serialization because it is re-resolved from disk each session and must not bloat persisted conversation state.","acp_compatible":true},"disabled_skills":{"items":{"type":"string"},"type":"array","title":"Disabled Skills","description":"Names of skills to EXCLUDE from this context — a deny-list applied after every skill source is loaded (auto-loaded user/public, explicit, and lazily-loaded project skills). A listed name absent from the loaded set is a harmless no-op. [] (the default) keeps every skill. This is the single, drift-tolerant skill-selection mechanism (agent profiles set it from their own deny-list; #4017).","acp_compatible":true},"secrets":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/SecretSource-Input"}]},"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).","acp_compatible":true},"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 (timezone-aware) datetime.","acp_compatible":true}},"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’s 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."},"AgentContext-Output":{"properties":{"skills":{"items":{"$ref":"#/components/schemas/Skill-Output"},"type":"array","title":"Skills","description":"List of available skills that can extend the user's input.","acp_compatible":true},"system_message_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Message Suffix","description":"Optional suffix to append to the system prompt.","acp_compatible":true},"user_message_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Message Suffix","description":"Optional suffix to append to the user's message.","acp_compatible":true},"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,"acp_compatible":true},"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,"acp_compatible":true},"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","acp_compatible":true},"registered_marketplaces":{"items":{"$ref":"#/components/schemas/openhands__sdk__marketplace__registration__MarketplaceRegistration"},"type":"array","title":"Registered Marketplaces","description":"Marketplace registrations for plugin resolution. Registrations with auto_load=True or a list of plugin names are resolved by LocalConversation at startup.","acp_compatible":true},"load_project_skills":{"type":"boolean","title":"Load Project Skills","description":"Whether to automatically load project skills from the conversation workspace (e.g. .openhands/skills/, AGENTS.md). Unlike load_user_skills / load_public_skills, this flag is not resolved by AgentContext itself (the workspace path is unknown at validation time); LocalConversation resolves it lazily on the first send_message() / run(), when the workspace is known. Also unlike load_user_skills / load_public_skills (which yield to explicit skills on a name conflict), resolved project skills are authoritative: a project skill overrides a same-named skill already present in `skills`.","default":false,"acp_compatible":true},"load_memory":{"type":"boolean","title":"Load Memory","description":"Whether to load persistent agent memory (MEMORY.md indexes under ~/.openhands/memory/ and <workspace>/.openhands/memory/) into the system prompt. Like load_project_skills, this flag is not resolved by AgentContext itself (the workspace path is unknown at validation time); LocalConversation resolves it lazily on the first send_message() / run() and stores the result in memory_context.","default":false,"acp_compatible":true,"openhands_settings":{"depends_on":[],"label":"Persistent memory","prominence":"major"}},"disabled_skills":{"items":{"type":"string"},"type":"array","title":"Disabled Skills","description":"Names of skills to EXCLUDE from this context — a deny-list applied after every skill source is loaded (auto-loaded user/public, explicit, and lazily-loaded project skills). A listed name absent from the loaded set is a harmless no-op. [] (the default) keeps every skill. This is the single, drift-tolerant skill-selection mechanism (agent profiles set it from their own deny-list; #4017).","acp_compatible":true},"secrets":{"anyOf":[{"additionalProperties":true,"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).","acp_compatible":true},"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 (timezone-aware) datetime.","acp_compatible":true}},"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’s 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."},"AgentDefinition":{"properties":{"name":{"type":"string","title":"Name","description":"Agent name (from frontmatter or filename)"},"description":{"type":"string","title":"Description","description":"Agent description","default":""},"model":{"type":"string","title":"Model","description":"Model to use ('inherit' uses parent model)","default":"inherit"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","description":"Display color for the agent"},"tools":{"items":{"type":"string"},"type":"array","title":"Tools","description":"List of allowed tools for this agent"},"skills":{"items":{"type":"string"},"type":"array","title":"Skills","description":"List of skill names for this agent. Resolved from project/user directories."},"system_prompt":{"type":"string","title":"System Prompt","description":"System prompt content","default":""},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Source file path for this agent"},"level":{"anyOf":[{"type":"string","enum":["project","user","builtin","plugin","programmatic"]},{"type":"null"}],"title":"Level","description":"Scope where the agent was discovered. Set during discovery; None when loaded directly from a file."},"when_to_use_examples":{"items":{"type":"string"},"type":"array","title":"When To Use Examples","description":"Examples of when to use this agent (for triggering)"},"hooks":{"anyOf":[{"$ref":"#/components/schemas/HookConfig-Output"},{"type":"null"}],"description":"Hook configuration for this agent"},"permission_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permission Mode","description":"How the subagent handles permissions. None inherits the parent policy, 'always_confirm' requires confirmation for every action, 'never_confirm' skips all confirmations, 'confirm_risky' only confirms actions above a risk threshold."},"max_iteration_per_run":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Iteration Per Run","description":"Maximum iterations per run. It must be strictly positive, or None for default."},"max_budget_per_run":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Budget Per Run","description":"Maximum accumulated cost (USD) per run for this sub-agent. Must be strictly positive, or None for no budget."},"mcp_config":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/MCPServer-Output"},"type":"object"},{"type":"null"}],"title":"Mcp Config","description":"MCP servers for this agent.","examples":[{"fetch":{"args":["--with","mcp==1.29.0","mcp-server-fetch==2026.7.10"],"command":"uvx"}}]},"mcp_servers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mcp Servers","description":"Deprecated compatibility alias for mcp_config. Use mcp_config for new clients.","examples":[{"fetch":{"args":["--with","mcp==1.29.0","mcp-server-fetch==2026.7.10"],"command":"uvx"}}]},"profile_store_dir":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Store Dir","description":"Path to the directory where LLM profiles are stored. If None, the default profile store directory is used."},"condenser":{"anyOf":[{"$ref":"#/components/schemas/CondenserBase-Output"},{"type":"null"}],"description":"Context condenser for the sub-agent. None applies a default summarizing condenser; set a NoOpCondenser to disable condensation."},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Additional metadata from frontmatter"}},"type":"object","required":["name"],"title":"AgentDefinition","description":"Agent definition loaded from Markdown file.\n\nAgents are specialized configurations that can be triggered based on\nuser input patterns. They define custom system prompts and tool access."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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)"},"AgentProfileDetailResponse":{"properties":{"name":{"type":"string","title":"Name"},"profile":{"oneOf":[{"$ref":"#/components/schemas/OpenHandsAgentProfile"},{"$ref":"#/components/schemas/ACPAgentProfile"}],"title":"Profile"}},"type":"object","required":["name","profile"],"title":"AgentProfileDetailResponse"},"AgentProfileDiagnostics":{"properties":{"agent_kind":{"type":"string","title":"Agent Kind"},"valid":{"type":"boolean","title":"Valid","default":false},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"llm_profile_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Profile Ref"},"llm_profile_resolved":{"type":"boolean","title":"Llm Profile Resolved","default":false},"llm_api_key_set":{"type":"boolean","title":"Llm Api Key Set","default":false},"mcp_server_refs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mcp Server Refs"},"resolved_mcp_config_keys":{"items":{"type":"string"},"type":"array","title":"Resolved Mcp Config Keys"},"resolved_mcp_servers":{"items":{"type":"string"},"type":"array","title":"Resolved Mcp Servers","description":"Deprecated alias for resolved_mcp_config_keys."},"dangling_mcp_server_refs":{"items":{"type":"string"},"type":"array","title":"Dangling Mcp Server Refs"},"disabled_skills":{"items":{"type":"string"},"type":"array","title":"Disabled Skills"},"resolved_skills":{"items":{"type":"string"},"type":"array","title":"Resolved Skills"},"acp_api_key_secret_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Api Key Secret Name"},"acp_base_url_secret_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Base Url Secret Name"},"acp_file_secret_names":{"items":{"type":"string"},"type":"array","title":"Acp File Secret Names"},"resolved_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Resolved Settings"}},"type":"object","required":["agent_kind"],"title":"AgentProfileDiagnostics","description":"Side-effect-free report of what :func:`resolve_agent_profile` would do.\n\nConsumed by ``POST /{id}/materialize`` (#3719) and the canvas editor. The\nverdict (:attr:`valid`) and the dangling-ref lists match exactly what a real\nresolve produces; :attr:`resolved_settings` is the redacted settings dump\n(present only when :attr:`valid`)."},"AgentProfileInfo":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"type":"string","title":"Name"},"agent_kind":{"type":"string","title":"Agent Kind","default":"openhands"},"revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Revision"},"llm_profile_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Profile Ref"},"mcp_server_refs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mcp Server Refs"}},"type":"object","required":["name"],"title":"AgentProfileInfo","description":"Summary projection of a stored profile (no secret instantiation)."},"AgentProfileListResponse":{"properties":{"profiles":{"items":{"$ref":"#/components/schemas/AgentProfileInfo"},"type":"array","title":"Profiles"},"active_agent_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Agent Profile Id"}},"type":"object","required":["profiles"],"title":"AgentProfileListResponse"},"AgentProfileMutationResponse":{"properties":{"name":{"type":"string","title":"Name"},"message":{"type":"string","title":"Message"}},"type":"object","required":["name","message"],"title":"AgentProfileMutationResponse"},"AgentType":{"type":"string","enum":["default","plan"],"title":"AgentType","description":"Agent type for conversation."},"AgentUsageData":{"properties":{"agent_name":{"type":"string","title":"Agent Name"},"conversation_count":{"type":"integer","title":"Conversation Count","default":0},"total_cost":{"type":"number","title":"Total Cost","default":0.0}},"type":"object","required":["agent_name"],"title":"AgentUsageData","description":"Usage data for a single agent."},"AlwaysConfirm":{"properties":{"kind":{"type":"string","const":"AlwaysConfirm","title":"Kind"}},"type":"object","title":"AlwaysConfirm"},"AnalyticsEventResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"AnalyticsEventResponse"},"ApiKeyCreate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"not_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not Before"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},"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"},"not_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not Before"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"},"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"},"not_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not Before"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"org_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Org Id"}},"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"},"agent_kind":{"type":"string","title":"Agent Kind","default":"openhands"},"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."},"acp_server":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acp Server","description":"Active ACP provider key ('claude-code', 'codex', 'gemini-cli'), else None.\n\nA typed projection of the ``acpserver`` tag (same as agent-canvas) so\nthe conversation UI can resolve a provider brand label without a dedicated\ncolumn. Riding the tag keeps a single source of truth that\nround-trips through the DB ``tags`` column for free. Gated on\n``agent_kind`` so a stray tag never reports a provider for an OpenHands\nconversation.","readOnly":true},"launched_agent_profile":{"anyOf":[{"$ref":"#/components/schemas/LaunchedAgentProfile"},{"type":"null"}],"description":"Provenance of the Agent Profile that launched this conversation, else None.\n\nA typed projection of the ``agentprofileid`` / ``agentprofilerevision``\ntags (same pattern as ``acp_server``), so it round-trips through the DB\n``tags`` column for free. Canvas reads exactly\n``launched_agent_profile { agent_profile_id, revision }``.","readOnly":true}},"type":"object","required":["created_by_user_id","sandbox_id","acp_server","launched_agent_profile"],"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"},"agent_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Profile 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"}]},"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"},"observability_metadata":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/TraceMetadataValue"},"type":"object"},{"type":"null"}],"title":"Observability Metadata","description":"Trace-level metadata to attach to observability backends. Values must be scalars or homogeneous scalar lists supported by OpenTelemetry."},"observability_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Observability Tags","description":"Tags to attach to the conversation root observability span."},"observability_span_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Observability Span Name","description":"Optional named child span to emit under the conversation root. Use stable, low-cardinality names because observability backends may use span names for grouping or signal routing."},"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."},"secrets":{"anyOf":[{"additionalProperties":{"type":"string","format":"password","writeOnly":true},"type":"object"},{"type":"null"}],"title":"Secrets","description":"Secrets to pass to the conversation. These are merged with any existing secrets (from database or git providers), with API-provided secrets taking precedence (overriding any existing secret with the same name). Keys are secret names (e.g., \"MY_API_KEY\"), values are the secret values. Warning: Providing a secret that already exists will silently override it."}},"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"},"agent_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Profile 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"}]},"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"},"observability_metadata":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/TraceMetadataValue"},"type":"object"},{"type":"null"}],"title":"Observability Metadata","description":"Trace-level metadata to attach to observability backends. Values must be scalars or homogeneous scalar lists supported by OpenTelemetry."},"observability_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Observability Tags","description":"Tags to attach to the conversation root observability span."},"observability_span_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Observability Span Name","description":"Optional named child span to emit under the conversation root. Use stable, low-cardinality names because observability backends may use span names for grouping or signal routing."},"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."},"secrets":{"anyOf":[{"additionalProperties":{"type":"string","format":"password","writeOnly":true},"type":"object"},{"type":"null"}],"title":"Secrets","description":"Secrets to pass to the conversation. These are merged with any existing secrets (from database or git providers), with API-provided secrets taking precedence (overriding any existing secret with the same name). Keys are secret names (e.g., \"MY_API_KEY\"), values are the secret values. Warning: Providing a secret that already exists will silently override it."}},"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":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"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"],"title":"AppMode"},"AppSendMessageRequest":{"properties":{"role":{"type":"string","const":"user","title":"Role","description":"The role of the message sender. Currently only \"user\" is supported.","default":"user"},"content":{"items":{"anyOf":[{"$ref":"#/components/schemas/TextContent"},{"$ref":"#/components/schemas/ImageContent"}]},"type":"array","minItems":1,"title":"Content","description":"The message content as a list of text and/or image content blocks."},"run":{"type":"boolean","title":"Run","description":"Whether to automatically run the agent after sending the message.","default":true}},"type":"object","required":["content"],"title":"AppSendMessageRequest","description":"Request to send a follow-up message to a conversation.\n\nThis is used to send messages to an existing conversation via REST API,\nas an alternative to WebSocket communication."},"AppSendMessageResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the message was successfully sent to the agent."},"sandbox_status":{"$ref":"#/components/schemas/SandboxStatus","description":"The current status of the sandbox after the operation."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Optional message with additional details (e.g., if sandbox was resumed)."}},"type":"object","required":["success","sandbox_status"],"title":"AppSendMessageResponse","description":"Response from sending a message to a conversation."},"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."},"ArgTransformConfig":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"The new name for the argument."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"The new description for the argument."},"default":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}],"title":"Default","description":"The new default value for the argument."},"hide":{"type":"boolean","title":"Hide","description":"Whether to hide the argument from the tool.","default":false},"required":{"anyOf":[{"type":"boolean","const":true},{"type":"null"}],"title":"Required","description":"Whether the argument is required."},"examples":{"anyOf":[{},{"type":"null"}],"title":"Examples","description":"Examples of the argument."}},"additionalProperties":false,"type":"object","title":"ArgTransformConfig","description":"A model for requesting a single argument transform."},"BaseWorkspace":{"oneOf":[{"$ref":"#/components/schemas/LocalWorkspace-Input"},{"$ref":"#/components/schemas/RemoteWorkspace"}],"discriminator":{"propertyName":"kind","mapping":{"openhands__sdk__workspace__local__LocalWorkspace-Input__1":"#/components/schemas/LocalWorkspace-Input","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"},"email_delivery_configured":{"type":"boolean","title":"Email Delivery Configured","default":true}},"type":"object","required":["successful","failed"],"title":"BatchInvitationResponse","description":"Response model for batch invitation creation."},"BitbucketV1CallbackProcessor-Input":{"properties":{"bitbucket_view_data":{"additionalProperties":true,"type":"object","title":"Bitbucket View Data"},"should_request_summary":{"type":"boolean","title":"Should Request Summary","default":true},"kind":{"type":"string","const":"BitbucketV1CallbackProcessor","title":"Kind"}},"type":"object","title":"BitbucketV1CallbackProcessor","description":"V1 callback processor for the Bitbucket Cloud resolver.\n\nPosts a summary comment back to the originating PR when the agent\nfinishes successfully. Mirrors :class:`GitlabV1CallbackProcessor`."},"BitbucketV1CallbackProcessor-Output":{"properties":{"bitbucket_view_data":{"additionalProperties":true,"type":"object","title":"Bitbucket View Data"},"should_request_summary":{"type":"boolean","title":"Should Request Summary","default":true},"kind":{"type":"string","const":"BitbucketV1CallbackProcessor","title":"Kind"}},"type":"object","required":["kind"],"title":"BitbucketV1CallbackProcessor","description":"V1 callback processor for the Bitbucket Cloud resolver.\n\nPosts a summary comment back to the originating PR when the agent\nfinishes successfully. Mirrors :class:`GitlabV1CallbackProcessor`."},"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"},"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"},"ClientTool-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"},"client_tool_name":{"type":"string","title":"Client Tool Name","description":"Per-instance tool name from the ClientToolSpec."},"input_schema":{"additionalProperties":true,"type":"object","title":"Input Schema","description":"The original JSON Schema for the tool's parameters, as provided by the client. Used verbatim when exporting the tool to the LLM so client-defined constraints (enum, nested objects, bounds, additionalProperties, ...) are preserved."},"kind":{"type":"string","const":"ClientTool","title":"Kind"}},"type":"object","required":["description","action_type","client_tool_name","input_schema"],"title":"ClientTool","description":"A tool whose execution is deferred to the external client.\n\nCreated from a :class:`ClientToolSpec` at conversation start. The agent\nsees it as a normal tool and can call it; the ActionEvent is emitted\nover WebSocket for the client to handle."},"ClientTool-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"},"client_tool_name":{"type":"string","title":"Client Tool Name","description":"Per-instance tool name from the ClientToolSpec."},"input_schema":{"additionalProperties":true,"type":"object","title":"Input Schema","description":"The original JSON Schema for the tool's parameters, as provided by the client. Used verbatim when exporting the tool to the LLM so client-defined constraints (enum, nested objects, bounds, additionalProperties, ...) are preserved."},"kind":{"type":"string","const":"ClientTool","title":"Kind"},"title":{"type":"string","title":"Title","readOnly":true}},"type":"object","required":["description","action_type","client_tool_name","input_schema","kind","title"],"title":"ClientTool","description":"A tool whose execution is deferred to the external client.\n\nCreated from a :class:`ClientToolSpec` at conversation start. The agent\nsees it as a normal tool and can call it; the ActionEvent is emitted\nover WebSocket for the client to handle."},"ClientToolObservation-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":"ClientToolObservation","title":"Kind"}},"additionalProperties":false,"type":"object","title":"ClientToolObservation","description":"Observation returned when a client tool is called.\n\nThe actual execution happens on the client side; the SDK returns\nthis acknowledgment so the agent loop can continue."},"ClientToolObservation-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":"ClientToolObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["kind"],"title":"ClientToolObservation","description":"Observation returned when a client tool is called.\n\nThe actual execution happens on the client side; the SDK returns\nthis acknowledgment so the agent loop can continue."},"ClientToolSpec":{"properties":{"name":{"type":"string","title":"Name","description":"Unique tool name the agent will use to call this tool."},"description":{"type":"string","title":"Description","description":"Description shown to the LLM explaining when and how to use this tool."},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters","description":"JSON Schema describing the tool's input parameters. Must be an object schema."},"annotations":{"anyOf":[{"$ref":"#/components/schemas/openhands__sdk__tool__tool__ToolAnnotations"},{"type":"null"}],"description":"Optional MCP-style annotations for the tool. When omitted, the tool is treated conservatively (not read-only), so the agent is asked to predict a security risk before calling it."}},"type":"object","required":["name","description"],"title":"ClientToolSpec","description":"A tool defined by the client, executed externally (not by the SDK).\n\nClients pass these specs in ``POST /conversations`` to register tools\nwhose execution is handled outside the SDK (e.g., by a frontend\nlistening for ActionEvents over WebSocket)."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"forgotten_event_ids":{"items":{"type":"string"},"type":"array","uniqueItems":true,"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"forgotten_event_ids":{"items":{"type":"string"},"type":"array","uniqueItems":true,"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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-Input":{"oneOf":[{"$ref":"#/components/schemas/LLMSummarizingCondenser-Input"},{"$ref":"#/components/schemas/NoOpCondenser-Input"},{"$ref":"#/components/schemas/PipelineCondenser-Input"}],"discriminator":{"propertyName":"kind","mapping":{"openhands__sdk__context__condenser__llm_summarizing_condenser__LLMSummarizingCondenser-Input__1":"#/components/schemas/LLMSummarizingCondenser-Input","openhands__sdk__context__condenser__no_op_condenser__NoOpCondenser-Input__1":"#/components/schemas/NoOpCondenser-Input","openhands__sdk__context__condenser__pipeline_condenser__PipelineCondenser-Input__1":"#/components/schemas/PipelineCondenser-Input"}}},"CondenserBase-Output":{"oneOf":[{"$ref":"#/components/schemas/LLMSummarizingCondenser-Output"},{"$ref":"#/components/schemas/NoOpCondenser-Output"},{"$ref":"#/components/schemas/PipelineCondenser-Output"}],"discriminator":{"propertyName":"kind","mapping":{"openhands__sdk__context__condenser__llm_summarizing_condenser__LLMSummarizingCondenser-Output__1":"#/components/schemas/LLMSummarizingCondenser-Output","openhands__sdk__context__condenser__no_op_condenser__NoOpCondenser-Output__1":"#/components/schemas/NoOpCondenser-Output","openhands__sdk__context__condenser__pipeline_condenser__PipelineCondenser-Output__1":"#/components/schemas/PipelineCondenser-Output"}}},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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":{"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"},"invoked_skills":{"items":{"type":"string"},"type":"array","title":"Invoked Skills","description":"Names of progressive-disclosure skills explicitly invoked via the `invoke_skill` tool."},"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)."},"leaf_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Leaf Event Id","description":"HEAD of the conversation tree: the parent of the next appended event. ``None`` means an empty tree (or, for pre-feature conversations, the linear tail). Moving it via ``navigate`` re-roots the active branch the agent runs on."},"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-Input"},{"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"},"forked_from_conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Forked From Conversation Id","description":"ID of the conversation this one was forked from. ``None`` for conversations created directly (not via fork)."},"forked_from_event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forked From Event Id","description":"Event ID this conversation was forked at. ``None`` for non-forked conversations or whole-conversation forks."},"parent_conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Conversation Id","description":"ID of the conversation that owns this one. ``None`` for top-level conversations."},"sub_conversation_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Sub Conversation Ids","description":"IDs of conversations naming this one as their parent. Derived from the server catalog; empty on webhook payloads. Name mirrors the Cloud API field."},"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."},"current_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Model Id","description":"Model the agent is actually using for this session. For ACP agents, this is lifted off ``ACPAgent.current_model_id`` (populated from the ``models.currentModelId`` field on the ACP session response, or from ``acp_model`` when the caller forced an override). May be an opaque alias (e.g. claude-agent-acp's ``\"default\"``); match it against ``available_models`` to get a display label. ``None`` for older ACP servers that don't surface the field, or while the agent is still initializing. Native OpenHands agents leave this ``None`` — consumers should read ``agent.llm.model`` for those."},"available_models":{"items":{"$ref":"#/components/schemas/ACPModelInfo"},"type":"array","title":"Available Models","description":"Models the ACP server offers for this session, lifted off ``ACPAgent.available_models`` (the ``models.availableModels`` field on the ACP session response). Each entry carries a ``model_id`` plus an optional ``name``/``description``. Surfaced verbatim so clients can render a model picker and resolve ``current_model_id`` to a display label themselves — the server does no name curation. Empty for ACP servers that don't surface the (UNSTABLE) capability and for native OpenHands agents. Client contract: ``current_model_id`` is NOT guaranteed to be a member — a forced ``acp_model`` override may name a model absent from the list — so treat a miss as 'show the raw id'. Some entries are opaque aliases whose human identity lives in ``description`` (e.g. claude-agent-acp's ``\"default\"`` -> ``\"Opus 4.7 with 1M context · ...\"``)."},"supports_runtime_model_switch":{"type":"boolean","title":"Supports Runtime Model Switch","description":"Whether a live, mid-conversation model switch will be attempted for this conversation — tells the inline picker whether to offer a live-switch control. Mirrors the SDK's switch gate: ``True`` for known switch-capable providers; ``False`` for unknown/custom ACP servers because their generic config writes are not guaranteed live-switch primitives. ``False`` for native OpenHands agents, for a known provider that declares no support, and before the conversation has started a session.","default":false},"launched_agent_profile":{"anyOf":[{"$ref":"#/components/schemas/LaunchedAgentProfile"},{"type":"null"}],"description":"Provenance snapshot of the agent profile that launched this conversation. Set at creation when the conversation was started via ``agent_profile_id``; ``None`` for conversations started directly with ``agent`` or ``agent_settings``. Clients use this to identify which agent profile is current without fragile settings-comparison."},"agent":{"$ref":"#/components/schemas/AgentBase","description":"The agent running in the conversation."},"client_tools":{"items":{"$ref":"#/components/schemas/ClientToolSpec"},"type":"array","title":"Client Tools","description":"Client-defined tool specs registered for this conversation. Surfaced so that a client re-attaching by conversation id can register the dynamic ClientAction_* action types before syncing persisted events, avoiding 'Unknown kind' deserialization errors."}},"type":"object","required":["id","workspace","agent"],"title":"ConversationInfo","description":"Information about a conversation running locally without a Runtime sandbox."},"ConversationSettings":{"properties":{"schema_version":{"type":"integer","minimum":1.0,"title":"Schema Version","default":1},"max_iterations":{"type":"integer","minimum":1.0,"title":"Max Iterations","description":"Maximum number of iterations the conversation will run before stopping.","default":500,"openhands_settings":{"depends_on":[],"label":"Max iterations","prominence":"major"}},"confirmation_mode":{"type":"boolean","title":"Confirmation Mode","description":"Require user confirmation before executing risky actions.","default":false,"openhands_settings":{"depends_on":[],"label":"Confirmation mode","prominence":"critical"},"openhands_settings_section":{"key":"verification","label":"Verification"}},"security_analyzer":{"anyOf":[{"type":"string","enum":["llm","none"]},{"type":"null"}],"title":"Security Analyzer","description":"Security analyzer that evaluates actions before execution.","default":"llm","openhands_settings":{"depends_on":["confirmation_mode"],"label":"Security analyzer","prominence":"major"},"openhands_settings_section":{"key":"verification","label":"Verification"}}},"type":"object","title":"ConversationSettings"},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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."},"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"},"CreatePrButtonClickedEvent":{"properties":{"event_type":{"type":"string","const":"create pr button clicked","title":"Event Type"},"git_provider":{"anyOf":[{"type":"string","enum":["github","gitlab","bitbucket","bitbucket_data_center","azure_devops","forgejo","enterprise_sso"]},{"type":"null"}],"title":"Git Provider"}},"type":"object","required":["event_type"],"title":"CreatePrButtonClickedEvent","description":"``create pr button clicked``: Pull Request button click in chat UI.\n\nDrives PostHog surveys (e.g. NPS) keyed off the PR action. The event\nname uses the lowercase-with-spaces convention shared by every other\nPostHog event in ``openhands/analytics/analytics_constants.py``."},"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"},"bound_org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bound Org Id"},"user_id":{"type":"string","title":"User Id"},"auth_type":{"type":"string","title":"Auth Type"}},"type":"object","required":["id","name","org_id","bound_org_id","user_id","auth_type"],"title":"CurrentApiKeyResponse","description":"Response model for the current API key endpoint.\n\n``org_id`` is the *effective* org id of the current request: the\nkey's bound org for org-bound keys, or the resolved org (from the\n``X-Org-Id`` header or ``user.current_org_id``) for unbound keys.\n``bound_org_id`` distinguishes the two cases -- it is the org\npersisted on the key, or ``None`` when the key is unbound."},"CustomSecretCreate":{"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":"CustomSecretCreate","description":"Custom secret model with value (for creating secrets)."},"CustomSecretPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CustomSecretWithoutValue"},"type":"array","title":"Items"},"next_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Id"}},"type":"object","required":["items"],"title":"CustomSecretPage","description":"Paginated response for custom secrets search."},"CustomSecretWithoutValue":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"CustomSecretWithoutValue","description":"Custom secret model without value (for listing secrets)."},"DailyUsageData":{"properties":{"date":{"type":"string","title":"Date"},"tokens":{"type":"integer","title":"Tokens","default":0},"conversations":{"type":"integer","title":"Conversations","default":0}},"type":"object","required":["date"],"title":"DailyUsageData","description":"Daily usage data for a single day."},"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."},"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."},"EnsembleSecurityAnalyzer":{"properties":{"analyzers":{"items":{"$ref":"#/components/schemas/SecurityAnalyzerBase"},"type":"array","minItems":1,"title":"Analyzers","description":"Analyzers whose assessments are combined via max-severity"},"propagate_unknown":{"type":"boolean","title":"Propagate Unknown","description":"When True, any child returning UNKNOWN causes the ensemble to return UNKNOWN. When False (default), UNKNOWN is filtered out if any child returns a concrete level.","default":false},"kind":{"type":"string","const":"EnsembleSecurityAnalyzer","title":"Kind"}},"type":"object","required":["analyzers"],"title":"EnsembleSecurityAnalyzer","description":"Wire multiple analyzers together and take the worst-case risk.\n\nUse this as the top-level analyzer you set on a conversation. It\ncalls each child analyzer, collects their risk assessments, and\nreturns the highest concrete risk. It does not perform any detection,\nextraction, or normalization of its own.\n\nHow UNKNOWN works (default, ``propagate_unknown=False``): if *all*\nchildren return UNKNOWN, the ensemble returns UNKNOWN (which\n``ConfirmRisky`` confirms by default). If any child returns a\nconcrete level, UNKNOWN results are filtered out and the highest\nconcrete level wins.\n\nWith ``propagate_unknown=True``: if *any* child returns UNKNOWN, the\nensemble returns UNKNOWN regardless of other results. Use this in\nstricter environments where incomplete assessment should trigger\nconfirmation.\n\nIf a child analyzer raises an exception, it contributes HIGH\n(fail-closed, logged). This prevents a broken analyzer from silently\ndegrading safety.\n\nExample::\n\n    from openhands.sdk.security import (\n        EnsembleSecurityAnalyzer,\n        PatternSecurityAnalyzer,\n        PolicyRailSecurityAnalyzer,\n        ConfirmRisky,\n        SecurityRisk,\n    )\n\n    analyzer = EnsembleSecurityAnalyzer(\n        analyzers=[\n            PolicyRailSecurityAnalyzer(),\n            PatternSecurityAnalyzer(),\n        ]\n    )\n    policy = ConfirmRisky(threshold=SecurityRisk.MEDIUM)"},"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/StreamingDeltaEvent-Input"},{"$ref":"#/components/schemas/TokenEvent-Input"},{"$ref":"#/components/schemas/InterruptEvent-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__streaming_delta__StreamingDeltaEvent-Input__1":"#/components/schemas/StreamingDeltaEvent-Input","openhands__sdk__event__token__TokenEvent-Input__1":"#/components/schemas/TokenEvent-Input","openhands__sdk__event__user_action__InterruptEvent-Input__1":"#/components/schemas/InterruptEvent-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/StreamingDeltaEvent-Output"},{"$ref":"#/components/schemas/TokenEvent-Output"},{"$ref":"#/components/schemas/InterruptEvent-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__streaming_delta__StreamingDeltaEvent-Output__1":"#/components/schemas/StreamingDeltaEvent-Output","openhands__sdk__event__token__TokenEvent-Output__1":"#/components/schemas/TokenEvent-Output","openhands__sdk__event__user_action__InterruptEvent-Output__1":"#/components/schemas/InterruptEvent-Output","openhands__sdk__event__user_action__PauseEvent-Output__1":"#/components/schemas/PauseEvent-Output"}}},"EventCallbackProcessor-Input":{"oneOf":[{"$ref":"#/components/schemas/BitbucketV1CallbackProcessor-Input"},{"$ref":"#/components/schemas/GithubV1CallbackProcessor-Input"},{"$ref":"#/components/schemas/GitlabV1CallbackProcessor-Input"},{"$ref":"#/components/schemas/JiraV1CallbackProcessor-Input"},{"$ref":"#/components/schemas/JiraDcV1CallbackProcessor-Input"},{"$ref":"#/components/schemas/SlackV1CallbackProcessor-Input"},{"$ref":"#/components/schemas/LoggingCallbackProcessor-Input"},{"$ref":"#/components/schemas/SetTitleCallbackProcessor-Input"}],"discriminator":{"propertyName":"kind","mapping":{"integrations__bitbucket__bitbucket_v1_callback_processor__BitbucketV1CallbackProcessor-Input__1":"#/components/schemas/BitbucketV1CallbackProcessor-Input","integrations__github__github_v1_callback_processor__GithubV1CallbackProcessor-Input__1":"#/components/schemas/GithubV1CallbackProcessor-Input","integrations__gitlab__gitlab_v1_callback_processor__GitlabV1CallbackProcessor-Input__1":"#/components/schemas/GitlabV1CallbackProcessor-Input","integrations__jira__jira_v1_callback_processor__JiraV1CallbackProcessor-Input__1":"#/components/schemas/JiraV1CallbackProcessor-Input","integrations__jira_dc__jira_dc_v1_callback_processor__JiraDcV1CallbackProcessor-Input__1":"#/components/schemas/JiraDcV1CallbackProcessor-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/BitbucketV1CallbackProcessor-Output"},{"$ref":"#/components/schemas/GithubV1CallbackProcessor-Output"},{"$ref":"#/components/schemas/GitlabV1CallbackProcessor-Output"},{"$ref":"#/components/schemas/JiraV1CallbackProcessor-Output"},{"$ref":"#/components/schemas/JiraDcV1CallbackProcessor-Output"},{"$ref":"#/components/schemas/SlackV1CallbackProcessor-Output"},{"$ref":"#/components/schemas/LoggingCallbackProcessor-Output"},{"$ref":"#/components/schemas/SetTitleCallbackProcessor-Output"}],"discriminator":{"propertyName":"kind","mapping":{"integrations__bitbucket__bitbucket_v1_callback_processor__BitbucketV1CallbackProcessor-Output__1":"#/components/schemas/BitbucketV1CallbackProcessor-Output","integrations__github__github_v1_callback_processor__GithubV1CallbackProcessor-Output__1":"#/components/schemas/GithubV1CallbackProcessor-Output","integrations__gitlab__gitlab_v1_callback_processor__GitlabV1CallbackProcessor-Output__1":"#/components/schemas/GitlabV1CallbackProcessor-Output","integrations__jira__jira_v1_callback_processor__JiraV1CallbackProcessor-Output__1":"#/components/schemas/JiraV1CallbackProcessor-Output","integrations__jira_dc__jira_dc_v1_callback_processor__JiraDcV1CallbackProcessor-Output__1":"#/components/schemas/JiraDcV1CallbackProcessor-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"}}},"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."},"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."},"GETSettingsModel":{"properties":{"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"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":{"title":"Secrets Store"},"enable_sound_notifications":{"type":"boolean","title":"Enable Sound Notifications","default":false},"enable_proactive_conversation_starters":{"type":"boolean","title":"Enable Proactive Conversation Starters","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"},"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"},"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"},"title_llm_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Llm Profile"},"git_full_clone":{"type":"boolean","title":"Git Full Clone","default":false},"v1_enabled":{"type":"boolean","title":"V1 Enabled","default":true},"agent_settings":{"additionalProperties":true,"type":"object","title":"Agent Settings"},"conversation_settings":{"$ref":"#/components/schemas/ConversationSettings"},"sandbox_grouping_strategy":{"$ref":"#/components/schemas/SandboxGroupingStrategy","default":"NO_GROUPING"},"default_sandbox_spec_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Sandbox Spec Id"},"llm_profiles":{"$ref":"#/components/schemas/LLMProfiles","description":"Saved LLM profiles and the currently active profile name. See ``LLMProfiles`` for the profile-management API."},"active_agent_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Agent Profile Id"},"active_agent_profile_revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Agent Profile Revision"},"registered_marketplaces":{"items":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_models__MarketplaceRegistration"},"type":"array","title":"Registered Marketplaces","description":"List of marketplace registrations for plugin resolution. Marketplaces with auto_load=True will have their plugins loaded automatically at conversation start. See MarketplaceRegistration for details."},"inherited_marketplaces":{"items":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_models__MarketplaceRegistration"},"type":"array","title":"Inherited Marketplaces","description":"Marketplaces inherited from instance or organization level. These are read-only and cannot be modified by the user. Computed at runtime: Instance defaults + Org defaults."},"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."},"GitOrganizationsResponse":{"properties":{"provider":{"$ref":"#/components/schemas/ProviderType"},"organizations":{"items":{"type":"string"},"type":"array","title":"Organizations"}},"type":"object","required":["provider","organizations"],"title":"GitOrganizationsResponse","description":"Response model for the Git organizations the user belongs to on their active provider."},"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."},"GitlabV1CallbackProcessor-Input":{"properties":{"gitlab_view_data":{"additionalProperties":true,"type":"object","title":"Gitlab View Data"},"should_request_summary":{"type":"boolean","title":"Should Request Summary","default":true},"inline_mr_comment":{"type":"boolean","title":"Inline Mr Comment","default":false},"kind":{"type":"string","const":"GitlabV1CallbackProcessor","title":"Kind"}},"type":"object","title":"GitlabV1CallbackProcessor","description":"Callback processor for GitLab V1 integrations."},"GitlabV1CallbackProcessor-Output":{"properties":{"gitlab_view_data":{"additionalProperties":true,"type":"object","title":"Gitlab View Data"},"should_request_summary":{"type":"boolean","title":"Should Request Summary","default":true},"inline_mr_comment":{"type":"boolean","title":"Inline Mr Comment","default":false},"kind":{"type":"string","const":"GitlabV1CallbackProcessor","title":"Kind"}},"type":"object","required":["kind"],"title":"GitlabV1CallbackProcessor","description":"Callback processor for GitLab 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."},"GrantSuperAdminRequest":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Target user id (Keycloak sub / UUID string)."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Target user email. Resolved to a user id before granting."}},"type":"object","title":"GrantSuperAdminRequest","description":"Identify the user to promote to super admin.\n\nProvide exactly one of ``user_id`` or ``email``. ``email`` is a\nconvenience for installers/operators who key on email rather than the\nKeycloak ``sub``; it is resolved to a user id before the grant."},"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-Input":{"properties":{"pre_tool_use":{"items":{"$ref":"#/components/schemas/HookMatcher-Input"},"type":"array","title":"Pre Tool Use","description":"Hooks that run before tool execution"},"post_tool_use":{"items":{"$ref":"#/components/schemas/HookMatcher-Input"},"type":"array","title":"Post Tool Use","description":"Hooks that run after tool execution"},"user_prompt_submit":{"items":{"$ref":"#/components/schemas/HookMatcher-Input"},"type":"array","title":"User Prompt Submit","description":"Hooks that run when user submits a prompt"},"session_start":{"items":{"$ref":"#/components/schemas/HookMatcher-Input"},"type":"array","title":"Session Start","description":"Hooks that run when a session starts"},"session_end":{"items":{"$ref":"#/components/schemas/HookMatcher-Input"},"type":"array","title":"Session End","description":"Hooks that run when a session ends"},"stop":{"items":{"$ref":"#/components/schemas/HookMatcher-Input"},"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\")"},"HookConfig-Output":{"properties":{"pre_tool_use":{"items":{"$ref":"#/components/schemas/HookMatcher-Output"},"type":"array","title":"Pre Tool Use","description":"Hooks that run before tool execution"},"post_tool_use":{"items":{"$ref":"#/components/schemas/HookMatcher-Output"},"type":"array","title":"Post Tool Use","description":"Hooks that run after tool execution"},"user_prompt_submit":{"items":{"$ref":"#/components/schemas/HookMatcher-Output"},"type":"array","title":"User Prompt Submit","description":"Hooks that run when user submits a prompt"},"session_start":{"items":{"$ref":"#/components/schemas/HookMatcher-Output"},"type":"array","title":"Session Start","description":"Hooks that run when a session starts"},"session_end":{"items":{"$ref":"#/components/schemas/HookMatcher-Output"},"type":"array","title":"Session End","description":"Hooks that run when a session ends"},"stop":{"items":{"$ref":"#/components/schemas/HookMatcher-Output"},"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"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"command":{"type":"string","title":"Command"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"},"tools":{"items":{"type":"string"},"type":"array","title":"Tools"},"timeout":{"type":"integer","title":"Timeout","default":60},"max_iterations":{"type":"integer","title":"Max Iterations","default":3},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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-Input":{"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/)."},"HookMatcher-Output":{"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","agent"],"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"},"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."},"InterruptEvent-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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"kind":{"type":"string","const":"InterruptEvent","title":"Kind"}},"additionalProperties":false,"type":"object","title":"InterruptEvent","description":"Event indicating the agent was interrupted mid-operation.\n\nUnlike :class:`PauseEvent` which takes effect between agent steps,\nan interrupt cancels the in-flight LLM call immediately.  The\nconversation state is set to PAUSED so it can be resumed later."},"InterruptEvent-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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"kind":{"type":"string","const":"InterruptEvent","title":"Kind"}},"additionalProperties":false,"type":"object","required":["kind"],"title":"InterruptEvent","description":"Event indicating the agent was interrupted mid-operation.\n\nUnlike :class:`PauseEvent` which takes effect between agent steps,\nan interrupt cancels the in-flight LLM call immediately.  The\nconversation state is set to PAUSED so it can be resumed later."},"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"},"invite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Url"}},"type":"object","required":["id","email","role","status","created_at","expires_at"],"title":"InvitationResponse","description":"Response model for invitation details."},"InvokeSkillAction-Input":{"properties":{"name":{"type":"string","title":"Name","description":"Name of the loaded skill to invoke."},"kind":{"type":"string","const":"InvokeSkillAction","title":"Kind"}},"additionalProperties":false,"type":"object","required":["name"],"title":"InvokeSkillAction"},"InvokeSkillAction-Output":{"properties":{"name":{"type":"string","title":"Name","description":"Name of the loaded skill to invoke."},"kind":{"type":"string","const":"InvokeSkillAction","title":"Kind"}},"additionalProperties":false,"type":"object","required":["name","kind"],"title":"InvokeSkillAction"},"InvokeSkillObservation-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},"skill_name":{"type":"string","title":"Skill Name","description":"Name of the skill this observation corresponds to."},"kind":{"type":"string","const":"InvokeSkillObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["skill_name"],"title":"InvokeSkillObservation"},"InvokeSkillObservation-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},"skill_name":{"type":"string","title":"Skill Name","description":"Name of the skill this observation corresponds to."},"kind":{"type":"string","const":"InvokeSkillObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["skill_name","kind"],"title":"InvokeSkillObservation"},"InvokeSkillTool-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":"InvokeSkillTool","title":"Kind"}},"type":"object","required":["description","action_type"],"title":"InvokeSkillTool","description":"Built-in tool for explicit invocation of progressive-disclosure skills."},"InvokeSkillTool-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":"InvokeSkillTool","title":"Kind"},"title":{"type":"string","title":"Title","readOnly":true}},"type":"object","required":["description","action_type","kind","title"],"title":"InvokeSkillTool","description":"Built-in tool for explicit invocation of progressive-disclosure skills."},"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"},"JiraDcV1CallbackProcessor-Input":{"properties":{"should_request_summary":{"type":"boolean","title":"Should Request Summary","default":true},"issue_key":{"type":"string","title":"Issue Key"},"workspace_name":{"type":"string","title":"Workspace Name"},"base_api_url":{"type":"string","title":"Base Api Url"},"kind":{"type":"string","const":"JiraDcV1CallbackProcessor","title":"Kind"}},"type":"object","required":["issue_key","workspace_name","base_api_url"],"title":"JiraDcV1CallbackProcessor","description":"Callback processor for Jira Data Center V1 integrations."},"JiraDcV1CallbackProcessor-Output":{"properties":{"should_request_summary":{"type":"boolean","title":"Should Request Summary","default":true},"issue_key":{"type":"string","title":"Issue Key"},"workspace_name":{"type":"string","title":"Workspace Name"},"base_api_url":{"type":"string","title":"Base Api Url"},"kind":{"type":"string","const":"JiraDcV1CallbackProcessor","title":"Kind"}},"type":"object","required":["issue_key","workspace_name","base_api_url","kind"],"title":"JiraDcV1CallbackProcessor","description":"Callback processor for Jira Data Center V1 integrations."},"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"},"JiraV1CallbackProcessor-Input":{"properties":{"should_request_summary":{"type":"boolean","title":"Should Request Summary","default":true},"svc_acc_email":{"type":"string","title":"Svc Acc Email"},"decrypted_api_key":{"type":"string","title":"Decrypted Api Key"},"issue_key":{"type":"string","title":"Issue Key"},"jira_cloud_id":{"type":"string","title":"Jira Cloud Id"},"kind":{"type":"string","const":"JiraV1CallbackProcessor","title":"Kind"}},"type":"object","required":["svc_acc_email","decrypted_api_key","issue_key","jira_cloud_id"],"title":"JiraV1CallbackProcessor","description":"Callback processor for Jira V1 integrations."},"JiraV1CallbackProcessor-Output":{"properties":{"should_request_summary":{"type":"boolean","title":"Should Request Summary","default":true},"svc_acc_email":{"type":"string","title":"Svc Acc Email"},"decrypted_api_key":{"type":"string","title":"Decrypted Api Key"},"issue_key":{"type":"string","title":"Issue Key"},"jira_cloud_id":{"type":"string","title":"Jira Cloud Id"},"kind":{"type":"string","const":"JiraV1CallbackProcessor","title":"Kind"}},"type":"object","required":["svc_acc_email","decrypted_api_key","issue_key","jira_cloud_id","kind"],"title":"JiraV1CallbackProcessor","description":"Callback processor for Jira V1 integrations."},"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-Input":{"properties":{"model":{"type":"string","title":"Model","description":"Model name.","default":"gpt-5.5","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"}},"auth_type":{"type":"string","enum":["api_key","subscription"],"title":"Auth Type","description":"Authentication mode for the LLM.","default":"api_key","openhands_settings":{"depends_on":[],"label":"Authentication","prominence":"critical"}},"subscription_vendor":{"anyOf":[{"type":"string","const":"openai"},{"type":"null"}],"title":"Subscription Vendor","description":"Subscription provider for subscription-backed LLM access.","openhands_settings":{"depends_on":["auth_type"],"label":"Subscription provider","prominence":"critical"}},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"Custom base URL.","openhands_settings":{"depends_on":[],"prominence":"major"}},"api_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Version","description":"API version (e.g., Azure).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_access_key_id":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Access Key Id","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_secret_access_key":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Secret Access Key","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_session_token":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Session Token","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_region_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Region Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Profile Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_role_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Role Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_session_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Session Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_bedrock_runtime_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Bedrock Runtime Endpoint","openhands_settings":{"depends_on":[],"prominence":"minor"}},"openrouter_site_url":{"type":"string","title":"Openrouter Site Url","default":"https://docs.all-hands.dev/","openhands_settings":{"depends_on":[],"prominence":"minor"}},"openrouter_app_name":{"type":"string","title":"Openrouter App Name","default":"OpenHands","openhands_settings":{"depends_on":[],"prominence":"minor"}},"num_retries":{"type":"integer","minimum":0.0,"title":"Num Retries","default":5,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_multiplier":{"type":"number","minimum":0.0,"title":"Retry Multiplier","default":8.0,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_min_wait":{"type":"integer","minimum":0.0,"title":"Retry Min Wait","default":8,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_max_wait":{"type":"integer","minimum":0.0,"title":"Retry Max Wait","default":64,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"top_k":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Top K","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"api_mode":{"type":"string","enum":["auto","chat","responses"],"title":"Api Mode","description":"LLM API endpoint mode. 'auto' resolves from model metadata and SDK fallbacks; use 'chat' or 'responses' to override endpoint selection for proxy aliases and newly released models.","default":"auto","openhands_settings":{"depends_on":[],"prominence":"minor"}},"capability_overrides":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object","title":"Capability Overrides","description":"Explicit model capability overrides. Supported keys include supports_reasoning_effort, thinking_mode (adaptive, manual, none, or unknown), supports_sampling_params, supports_prompt_cache, supports_stop_words, supports_responses_api, supports_vision, and supports_prompt_cache_retention. Overrides take precedence over LiteLLM metadata and SDK fallbacks.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"extra_headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Extra Headers","description":"Optional HTTP headers to forward to LiteLLM requests.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"ollama_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ollama Base Url","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"drop_params":{"type":"boolean","title":"Drop Params","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"disable_stop_word":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disable Stop Word","description":"Disable using of stop word.","default":false,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"caching_prompt":{"type":"boolean","title":"Caching Prompt","description":"Enable caching of prompts.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"log_completions":{"type":"boolean","title":"Log Completions","description":"Enable logging of completions.","default":false,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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","openhands_settings":{"depends_on":[],"prominence":"minor"}},"custom_tokenizer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Tokenizer","description":"A custom tokenizer to use for token counting.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"native_tool_calling":{"type":"boolean","title":"Native Tool Calling","description":"Whether to use native tool calling.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"inline_image_urls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inline Image Urls","description":"If True, fetch any http(s) image URL in outgoing messages and inline it as a base64 ``data:`` URL before sending. If None (default), auto-detect based on model (some APIs such as Moonshot's public Kimi endpoint reject URL-formatted images and require base64). Set this explicitly when the model is reached through a proxy alias that hides the underlying provider (e.g. ``litellm_proxy/<custom-alias>``). Note: inlining only runs when ``vision_is_active()`` is True, so the alias must still be recognised as vision-capable by the SDK feature registry or proxy model metadata.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"reasoning_effort":{"anyOf":[{"type":"string","enum":["low","medium","high","xhigh","none"]},{"type":"null"}],"title":"Reasoning Effort","description":"Provider-neutral reasoning effort. Common values include 'none', 'minimal', 'low', 'medium', 'high', 'xhigh', and 'max'. The SDK accepts future provider values and lets LiteLLM translate them.","default":"high","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"enable_encrypted_reasoning":{"type":"boolean","title":"Enable Encrypted Reasoning","description":"If True, ask for ['reasoning.encrypted_content'] in Responses API include.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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","openhands_settings":{"depends_on":[],"prominence":"minor"}},"extended_thinking_budget":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extended Thinking Budget","description":"Legacy token budget for models confirmed to use manual Anthropic extended thinking. Ignored for adaptive-thinking models. Prefer reasoning_effort for new integrations.","default":200000,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed","description":"The seed to use for random number generation.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"usage_id":{"type":"string","title":"Usage Id","description":"Unique usage identifier for the LLM. Used for registry lookups, telemetry, and spend tracking.","default":"default","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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}","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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., \"gpt-5.5\").\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=\"gpt-5.5\",\n        api_key=SecretStr(\"your-api-key\"),\n        usage_id=\"my-agent\"\n    )\n    # Use with agent or conversation\n    ```"},"LLM-Output":{"properties":{"model":{"type":"string","title":"Model","description":"Model name.","default":"gpt-5.5","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"}},"auth_type":{"type":"string","enum":["api_key","subscription"],"title":"Auth Type","description":"Authentication mode for the LLM.","default":"api_key","openhands_settings":{"depends_on":[],"label":"Authentication","prominence":"critical"}},"subscription_vendor":{"anyOf":[{"type":"string","const":"openai"},{"type":"null"}],"title":"Subscription Vendor","description":"Subscription provider for subscription-backed LLM access.","openhands_settings":{"depends_on":["auth_type"],"label":"Subscription provider","prominence":"critical"}},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"Custom base URL.","openhands_settings":{"depends_on":[],"prominence":"major"}},"api_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Version","description":"API version (e.g., Azure).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_access_key_id":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Access Key Id","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_secret_access_key":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Secret Access Key","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_session_token":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Session Token","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_region_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Region Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Profile Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_role_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Role Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_session_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Session Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_bedrock_runtime_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Bedrock Runtime Endpoint","openhands_settings":{"depends_on":[],"prominence":"minor"}},"openrouter_site_url":{"type":"string","title":"Openrouter Site Url","default":"https://docs.all-hands.dev/","openhands_settings":{"depends_on":[],"prominence":"minor"}},"openrouter_app_name":{"type":"string","title":"Openrouter App Name","default":"OpenHands","openhands_settings":{"depends_on":[],"prominence":"minor"}},"num_retries":{"type":"integer","minimum":0.0,"title":"Num Retries","default":5,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_multiplier":{"type":"number","minimum":0.0,"title":"Retry Multiplier","default":8.0,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_min_wait":{"type":"integer","minimum":0.0,"title":"Retry Min Wait","default":8,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_max_wait":{"type":"integer","minimum":0.0,"title":"Retry Max Wait","default":64,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"top_k":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Top K","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"api_mode":{"type":"string","enum":["auto","chat","responses"],"title":"Api Mode","description":"LLM API endpoint mode. 'auto' resolves from model metadata and SDK fallbacks; use 'chat' or 'responses' to override endpoint selection for proxy aliases and newly released models.","default":"auto","openhands_settings":{"depends_on":[],"prominence":"minor"}},"capability_overrides":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object","title":"Capability Overrides","description":"Explicit model capability overrides. Supported keys include supports_reasoning_effort, thinking_mode (adaptive, manual, none, or unknown), supports_sampling_params, supports_prompt_cache, supports_stop_words, supports_responses_api, supports_vision, and supports_prompt_cache_retention. Overrides take precedence over LiteLLM metadata and SDK fallbacks.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"extra_headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Extra Headers","description":"Optional HTTP headers to forward to LiteLLM requests.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"ollama_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ollama Base Url","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"drop_params":{"type":"boolean","title":"Drop Params","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"disable_stop_word":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disable Stop Word","description":"Disable using of stop word.","default":false,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"caching_prompt":{"type":"boolean","title":"Caching Prompt","description":"Enable caching of prompts.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"log_completions":{"type":"boolean","title":"Log Completions","description":"Enable logging of completions.","default":false,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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","openhands_settings":{"depends_on":[],"prominence":"minor"}},"custom_tokenizer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Tokenizer","description":"A custom tokenizer to use for token counting.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"native_tool_calling":{"type":"boolean","title":"Native Tool Calling","description":"Whether to use native tool calling.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"inline_image_urls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inline Image Urls","description":"If True, fetch any http(s) image URL in outgoing messages and inline it as a base64 ``data:`` URL before sending. If None (default), auto-detect based on model (some APIs such as Moonshot's public Kimi endpoint reject URL-formatted images and require base64). Set this explicitly when the model is reached through a proxy alias that hides the underlying provider (e.g. ``litellm_proxy/<custom-alias>``). Note: inlining only runs when ``vision_is_active()`` is True, so the alias must still be recognised as vision-capable by the SDK feature registry or proxy model metadata.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"reasoning_effort":{"anyOf":[{"type":"string","enum":["low","medium","high","xhigh","none"]},{"type":"null"}],"title":"Reasoning Effort","description":"Provider-neutral reasoning effort. Common values include 'none', 'minimal', 'low', 'medium', 'high', 'xhigh', and 'max'. The SDK accepts future provider values and lets LiteLLM translate them.","default":"high","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"enable_encrypted_reasoning":{"type":"boolean","title":"Enable Encrypted Reasoning","description":"If True, ask for ['reasoning.encrypted_content'] in Responses API include.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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","openhands_settings":{"depends_on":[],"prominence":"minor"}},"extended_thinking_budget":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extended Thinking Budget","description":"Legacy token budget for models confirmed to use manual Anthropic extended thinking. Ignored for adaptive-thinking models. Prefer reasoning_effort for new integrations.","default":200000,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed","description":"The seed to use for random number generation.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"usage_id":{"type":"string","title":"Usage Id","description":"Unique usage identifier for the LLM. Used for registry lookups, telemetry, and spend tracking.","default":"default","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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}","openhands_settings":{"depends_on":[],"prominence":"minor"}},"is_subscription":{"type":"boolean","title":"Is Subscription","description":"Whether this LLM uses subscription-based authentication. Serialized so that subscription-specific request handling survives transport to a remote agent-server.","readOnly":true}},"type":"object","required":["is_subscription"],"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., \"gpt-5.5\").\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=\"gpt-5.5\",\n        api_key=SecretStr(\"your-api-key\"),\n        usage_id=\"my-agent\"\n    )\n    # Use with agent or conversation\n    ```"},"LLMAgentSettings":{"properties":{"schema_version":{"type":"integer","minimum":1.0,"title":"Schema Version","default":5},"agent_kind":{"type":"string","const":"llm","title":"Agent Kind","description":"Discriminator for the ``AgentSettings`` union. ``'llm'`` selects the standard LLM-backed agent. Deprecated; use ``'openhands'``.","default":"llm"},"agent":{"type":"string","title":"Agent","description":"Agent class to use.","default":"CodeActAgent","openhands_settings":{"depends_on":[],"label":"Agent","prominence":"major","variant":"openhands"}},"llm":{"$ref":"#/components/schemas/LLM-Output","description":"LLM settings for the agent.","openhands_settings_section":{"key":"llm","label":"LLM","variant":"openhands"}},"tools":{"anyOf":[{"items":{"$ref":"#/components/schemas/openhands__sdk__tool__spec__Tool"},"type":"array"},{"type":"null"}],"title":"Tools","description":"Tools available to the agent. None (the default) resolves to the standard exec set (see openhands.sdk.tool.defaults), plus the sub-agent tool set when enable_sub_agents is set; [] is an explicitly bare agent; a non-empty list is used exactly as given. Environment-dependent tools (browser) are injected by the serving layer, not the default.","openhands_settings":{"depends_on":[],"label":"Tools","prominence":"major","variant":"openhands"}},"enable_sub_agents":{"type":"boolean","title":"Enable Sub Agents","description":"Enable sub-agent delegation via TaskToolSet.","default":false,"openhands_settings":{"depends_on":[],"label":"Enable sub-agents","prominence":"major","variant":"openhands"}},"enable_switch_llm_tool":{"type":"boolean","title":"Enable Switch Llm Tool","description":"Enable the built-in switch_llm tool for switching between saved LLM profiles.","default":true,"openhands_settings":{"depends_on":[],"label":"Enable LLM switching tool","prominence":"minor","variant":"openhands"}},"tool_concurrency_limit":{"type":"integer","minimum":1.0,"title":"Tool Concurrency Limit","description":"Maximum number of tool calls to execute concurrently per agent step. 1 = sequential (default). Values > 1 enable parallel tool calls; concurrent tools share the conversation object, filesystem, and working directory, so mutations to shared state may race.","default":1,"openhands_settings":{"depends_on":[],"label":"Parallel tool calls","prominence":"major","variant":"openhands"}},"mcp_config":{"additionalProperties":{"$ref":"#/components/schemas/MCPServer-Output"},"type":"object","title":"Mcp Config","description":"MCP servers available to the agent.","openhands_settings":{"depends_on":[],"label":"MCP servers","prominence":"minor","variant":"openhands"}},"agent_context":{"$ref":"#/components/schemas/AgentContext-Output","description":"Context for the agent (skills, secrets, message suffixes).","openhands_settings_section":{"key":"agent_context","label":"Memory","variant":"openhands"}},"condenser":{"oneOf":[{"$ref":"#/components/schemas/LLMSummarizingCondenserSettings"},{"$ref":"#/components/schemas/NoOpCondenserSettings"}],"title":"Condenser","description":"Condenser settings for the agent.","openhands_settings_section":{"key":"condenser","label":"Condenser","variant":"openhands"}},"verification":{"$ref":"#/components/schemas/VerificationSettings","description":"Verification settings for the agent critic.","openhands_settings_section":{"key":"verification","label":"Verification","variant":"openhands"}}},"type":"object","title":"LLMAgentSettings","description":"Legacy ``agent_kind='llm'`` variant of :class:`OpenHandsAgentSettings`.\n\n``LLMAgentSettings`` was the public class name before the v1.19.0 rename.\nThe public import aliases (``from openhands.sdk import LLMAgentSettings`` and\n``from openhands.sdk.settings import LLMAgentSettings``) were removed in\nv1.24.0 — use :class:`OpenHandsAgentSettings` for all new code.\n\nThe class itself is retained (reachable at\n``openhands.sdk.settings.model.LLMAgentSettings``) because it remains a\nmember of the settings discriminated union: it keeps ``agent_kind='llm'`` so\npersisted legacy payloads still deserialize and the API-breakage checker\nsees no field-value change versus the published release."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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},"hidden":{"type":"boolean","title":"Hidden","description":"Whether the model is served but not promoted: it must not be offered as a dropdown option, yet an already-saved setting referencing it is still valid (e.g. a legacy alias route on a managed LiteLLM proxy)","default":false},"canonical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical","description":"For a hidden model only: the name of the visible model (same provider) this one aliases, so clients can display a saved hidden model under its canonical name"}},"type":"object","required":["name"],"title":"LLMModel","description":"LLM Model object for API responses."},"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."},"LLMProfiles":{"properties":{"profiles":{"additionalProperties":true,"type":"object","title":"Profiles"},"active":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active"}},"type":"object","title":"LLMProfiles","description":"Container for saved LLM configurations.\n\nStores a named collection of ``LLM`` configurations plus the name of the\ncurrently active one (if any). All profile-management logic lives here;\n``Settings`` holds a single ``LLMProfiles`` instance and delegates to it.\n\nInvariants (enforced on validate + assignment):\n- ``active`` is either ``None`` or a key of ``profiles``.\n- Individual profiles that fail to parse (schema drift) are dropped with\n  a warning rather than failing the whole ``Settings`` load."},"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-Input":{"properties":{"llm":{"$ref":"#/components/schemas/LLM-Input"},"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."},"LLMSummarizingCondenser-Output":{"properties":{"llm":{"$ref":"#/components/schemas/LLM-Output"},"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","kind"],"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."},"LLMSummarizingCondenserSettings":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Enable conversation memory condensation.","default":true,"openhands_settings":{"depends_on":[],"label":"Enable memory condensation","prominence":"critical"}},"max_size":{"type":"integer","minimum":20.0,"title":"Max Size","description":"Maximum number of events kept before the condenser runs. Kept on the base settings class for compatibility; concrete condenser-settings variants may opt out when this does not apply.","default":240,"openhands_settings":{"depends_on":["enabled"],"label":"Max size","prominence":"minor"}},"condenser_kind":{"type":"string","const":"llm_summarizing","title":"Condenser Kind","description":"Discriminator for the condenser settings union. ``'llm_summarizing'`` selects the default LLM summarizing condenser.","default":"llm_summarizing","openhands_settings":{"depends_on":[],"prominence":"minor"}},"max_tokens":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Tokens","description":"Maximum number of tokens allowed before the condenser runs. When unset, condensation is only based on event count.","openhands_settings":{"depends_on":["enabled"],"label":"Max tokens","prominence":"minor"}},"keep_first":{"type":"integer","minimum":0.0,"title":"Keep First","description":"Minimum number of initial events to preserve before condensation.","default":2,"openhands_settings":{"depends_on":["enabled"],"label":"Keep first","prominence":"minor"}},"minimum_progress":{"type":"number","exclusiveMaximum":1.0,"exclusiveMinimum":0.0,"title":"Minimum Progress","description":"Minimum fraction of events that must be condensed for condensation to be considered successful.","default":0.1,"openhands_settings":{"depends_on":["enabled"],"label":"Minimum progress","prominence":"minor"}},"hard_context_reset_max_retries":{"type":"integer","exclusiveMinimum":0.0,"title":"Hard Context Reset Max Retries","description":"Number of hard context reset attempts before raising an error.","default":5,"openhands_settings":{"depends_on":["enabled"],"label":"Hard reset retries","prominence":"minor"}},"hard_context_reset_context_scaling":{"type":"number","exclusiveMaximum":1.0,"exclusiveMinimum":0.0,"title":"Hard Context Reset Context Scaling","description":"Factor used to reduce event string size after a hard context reset summarization failure.","default":0.8,"openhands_settings":{"depends_on":["enabled"],"label":"Hard reset scaling","prominence":"minor"}}},"type":"object","title":"LLMSummarizingCondenserSettings","description":"Settings for the default LLM summarizing condenser."},"LaunchedAgentProfile":{"properties":{"agent_profile_id":{"type":"string","format":"uuid","title":"Agent Profile Id","description":"Stable id of the agent profile that launched the conversation."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Revision of the agent profile at launch time."}},"type":"object","required":["agent_profile_id","revision"],"title":"LaunchedAgentProfile","description":"Provenance snapshot recorded when an agent profile launches a conversation.\n\nStored on ``StoredConversation`` and projected onto ``ConversationInfo`` so\nts-client ``deriveSwitchPlan`` can identify which agent profile is current\nwithout fragile settings-comparison. See #3720."},"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-Input":{"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\")"},"LocalWorkspace-Output":{"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","kind"],"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-Input":{"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"},"LookupSecret-Output":{"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","kind"],"title":"LookupSecret","description":"A secret looked up from some external url"},"MCPApiKeyAuthCredential-Input":{"properties":{"strategy":{"type":"string","const":"api_key","title":"Strategy"},"value":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Value"},"header_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Name"}},"type":"object","required":["strategy"],"title":"MCPApiKeyAuthCredential"},"MCPApiKeyAuthCredential-Output":{"properties":{"strategy":{"type":"string","const":"api_key","title":"Strategy"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"header_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Name"}},"type":"object","required":["strategy"],"title":"MCPApiKeyAuthCredential"},"MCPBasicAuthCredential-Input":{"properties":{"strategy":{"type":"string","const":"basic","title":"Strategy"},"username":{"type":"string","title":"Username"},"password":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Password"}},"type":"object","required":["strategy","username"],"title":"MCPBasicAuthCredential"},"MCPBasicAuthCredential-Output":{"properties":{"strategy":{"type":"string","const":"basic","title":"Strategy"},"username":{"type":"string","title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["strategy","username"],"title":"MCPBasicAuthCredential"},"MCPBearerAuthCredential-Input":{"properties":{"strategy":{"type":"string","const":"bearer","title":"Strategy"},"value":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Value"}},"type":"object","required":["strategy"],"title":"MCPBearerAuthCredential"},"MCPBearerAuthCredential-Output":{"properties":{"strategy":{"type":"string","const":"bearer","title":"Strategy"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"}},"type":"object","required":["strategy"],"title":"MCPBearerAuthCredential"},"MCPConfig":{"properties":{"mcpServers":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/TransformingStdioMCPServer"},{"$ref":"#/components/schemas/TransformingRemoteMCPServer"},{"$ref":"#/components/schemas/StdioMCPServer"},{"$ref":"#/components/schemas/RemoteMCPServer"}]},"type":"object","title":"Mcpservers"}},"additionalProperties":true,"type":"object","title":"MCPConfig","description":"A configuration object for MCP Servers that conforms to the canonical MCP configuration format\nwhile adding additional fields for enabling FastMCP-specific features like tool transformations\nand filtering by tags.\n\nFor an MCPConfig that is strictly canonical, see the `CanonicalMCPConfig` class."},"MCPHeaderAuthCredential-Input":{"properties":{"strategy":{"type":"string","const":"header","title":"Strategy"},"headers":{"additionalProperties":{"type":"string","format":"password","writeOnly":true},"type":"object","title":"Headers"}},"type":"object","required":["strategy"],"title":"MCPHeaderAuthCredential"},"MCPHeaderAuthCredential-Output":{"properties":{"strategy":{"type":"string","const":"header","title":"Strategy"},"headers":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Headers"}},"type":"object","required":["strategy"],"title":"MCPHeaderAuthCredential"},"MCPNoneAuthCredential":{"properties":{"strategy":{"type":"string","const":"none","title":"Strategy"}},"type":"object","required":["strategy"],"title":"MCPNoneAuthCredential"},"MCPOAuthAuthCredential-Input":{"properties":{"strategy":{"type":"string","const":"oauth2","title":"Strategy"},"authentication":{"anyOf":[{"$ref":"#/components/schemas/MCPOAuthAuthentication-Input"},{"type":"null"}]},"state":{"anyOf":[{"$ref":"#/components/schemas/MCPOAuthState-Input"},{"type":"null"}]}},"type":"object","required":["strategy"],"title":"MCPOAuthAuthCredential"},"MCPOAuthAuthCredential-Output":{"properties":{"strategy":{"type":"string","const":"oauth2","title":"Strategy"},"authentication":{"anyOf":[{"$ref":"#/components/schemas/MCPOAuthAuthentication-Output"},{"type":"null"}]},"state":{"anyOf":[{"$ref":"#/components/schemas/MCPOAuthState-Output"},{"type":"null"}]}},"type":"object","required":["strategy"],"title":"MCPOAuthAuthCredential"},"MCPOAuthAuthentication-Input":{"properties":{"type":{"type":"string","const":"oauth","title":"Type"},"client_auth_method":{"anyOf":[{"type":"string","enum":["none","client_secret_post","client_secret_basic","private_key_jwt"]},{"type":"null"}],"title":"Client Auth Method"},"scopes":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"client_metadata_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Metadata Url"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Client Secret"},"additional_client_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Additional Client Metadata"}},"additionalProperties":false,"type":"object","required":["type"],"title":"MCPOAuthAuthentication"},"MCPOAuthAuthentication-Output":{"properties":{"type":{"type":"string","const":"oauth","title":"Type"},"client_auth_method":{"anyOf":[{"type":"string","enum":["none","client_secret_post","client_secret_basic","private_key_jwt"]},{"type":"null"}],"title":"Client Auth Method"},"scopes":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"client_metadata_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Metadata Url"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"additional_client_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Additional Client Metadata"}},"additionalProperties":false,"type":"object","required":["type"],"title":"MCPOAuthAuthentication"},"MCPOAuthClientInfoState-Input":{"properties":{"client_secret":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Client Secret"}},"additionalProperties":true,"type":"object","title":"MCPOAuthClientInfoState"},"MCPOAuthClientInfoState-Output":{"properties":{"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"additionalProperties":true,"type":"object","title":"MCPOAuthClientInfoState"},"MCPOAuthState-Input":{"properties":{"tokens":{"anyOf":[{"$ref":"#/components/schemas/MCPOAuthTokenState-Input"},{"type":"null"}]},"client_info":{"anyOf":[{"$ref":"#/components/schemas/MCPOAuthClientInfoState-Input"},{"type":"null"}]},"token_expires_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Token Expires At"}},"type":"object","title":"MCPOAuthState"},"MCPOAuthState-Output":{"properties":{"tokens":{"anyOf":[{"$ref":"#/components/schemas/MCPOAuthTokenState-Output"},{"type":"null"}]},"client_info":{"anyOf":[{"$ref":"#/components/schemas/MCPOAuthClientInfoState-Output"},{"type":"null"}]},"token_expires_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Token Expires At"}},"type":"object","title":"MCPOAuthState"},"MCPOAuthTokenState-Input":{"properties":{"access_token":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Refresh Token"}},"additionalProperties":true,"type":"object","title":"MCPOAuthTokenState"},"MCPOAuthTokenState-Output":{"properties":{"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"additionalProperties":true,"type":"object","title":"MCPOAuthTokenState"},"MCPServer-Input":{"properties":{"url":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Url"},"transport":{"anyOf":[{"type":"string","enum":["stdio","http","sse","streamable-http"]},{"type":"null"}],"title":"Transport"},"command":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Command"},"args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Args"},"env":{"anyOf":[{"additionalProperties":{"type":"string","format":"password","writeOnly":true},"type":"object"},{"type":"null"}],"title":"Env"},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cwd"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"timeout":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timeout"},"sse_read_timeout":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sse Read Timeout"},"keep_alive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Keep Alive"},"headers":{"anyOf":[{"additionalProperties":{"type":"string","format":"password","writeOnly":true},"type":"object"},{"type":"null"}],"title":"Headers"},"auth":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/MCPNoneAuthCredential"},{"$ref":"#/components/schemas/MCPApiKeyAuthCredential-Input"},{"$ref":"#/components/schemas/MCPBearerAuthCredential-Input"},{"$ref":"#/components/schemas/MCPBasicAuthCredential-Input"},{"$ref":"#/components/schemas/MCPHeaderAuthCredential-Input"},{"$ref":"#/components/schemas/MCPOAuthAuthCredential-Input"}],"discriminator":{"propertyName":"strategy","mapping":{"api_key":"#/components/schemas/MCPApiKeyAuthCredential-Input","basic":"#/components/schemas/MCPBasicAuthCredential-Input","bearer":"#/components/schemas/MCPBearerAuthCredential-Input","header":"#/components/schemas/MCPHeaderAuthCredential-Input","none":"#/components/schemas/MCPNoneAuthCredential","oauth2":"#/components/schemas/MCPOAuthAuthCredential-Input"}}},{"type":"null"}],"title":"Auth"},"enabled":{"type":"boolean","title":"Enabled","description":"Whether this server is exposed to the agent. A disabled server stays fully configured -- including its secrets -- but is skipped when MCP tools are created and when servers are forwarded to an ACP subprocess.","default":true}},"additionalProperties":false,"type":"object","title":"MCPServer","description":"One MCP server in the settings DataModel."},"MCPServer-Output":{"properties":{"url":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Url"},"transport":{"anyOf":[{"type":"string","enum":["stdio","http","sse","streamable-http"]},{"type":"null"}],"title":"Transport"},"command":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Command"},"args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Args"},"env":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Env"},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cwd"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"timeout":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timeout"},"sse_read_timeout":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sse Read Timeout"},"keep_alive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Keep Alive"},"headers":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Headers"},"auth":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/MCPNoneAuthCredential"},{"$ref":"#/components/schemas/MCPApiKeyAuthCredential-Output"},{"$ref":"#/components/schemas/MCPBearerAuthCredential-Output"},{"$ref":"#/components/schemas/MCPBasicAuthCredential-Output"},{"$ref":"#/components/schemas/MCPHeaderAuthCredential-Output"},{"$ref":"#/components/schemas/MCPOAuthAuthCredential-Output"}],"discriminator":{"propertyName":"strategy","mapping":{"api_key":"#/components/schemas/MCPApiKeyAuthCredential-Output","basic":"#/components/schemas/MCPBasicAuthCredential-Output","bearer":"#/components/schemas/MCPBearerAuthCredential-Output","header":"#/components/schemas/MCPHeaderAuthCredential-Output","none":"#/components/schemas/MCPNoneAuthCredential","oauth2":"#/components/schemas/MCPOAuthAuthCredential-Output"}}},{"type":"null"}],"title":"Auth"},"enabled":{"type":"boolean","title":"Enabled","description":"Whether this server is exposed to the agent. A disabled server stays fully configured -- including its secrets -- but is skipped when MCP tools are created and when servers are forwarded to an ACP subprocess.","default":true}},"additionalProperties":false,"type":"object","title":"MCPServer","description":"One MCP server in the settings DataModel."},"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/mcp__types__Tool","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."},"ManagedLlmApiKeyRefreshResponse":{"properties":{"refreshed":{"type":"boolean","title":"Refreshed"}},"type":"object","required":["refreshed"],"title":"ManagedLlmApiKeyRefreshResponse"},"MarketplacePluginPreview":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source":{"type":"string","title":"Source"},"marketplace":{"type":"string","title":"Marketplace"}},"type":"object","required":["name","source","marketplace"],"title":"MarketplacePluginPreview","description":"A plugin advertised by a marketplace manifest.\n\nThe UI operates at the plugin level, so a plugin's bundled skills are not\nexpanded here; only the plugin itself is surfaced."},"MarketplaceScope":{"type":"string","enum":["instance","org","personal"],"title":"MarketplaceScope","description":"Scope of a marketplace registration."},"MarketplaceSkillsPreviewResponse":{"properties":{"skills":{"items":{"$ref":"#/components/schemas/SkillInfo"},"type":"array","title":"Skills"},"plugins":{"items":{"$ref":"#/components/schemas/MarketplacePluginPreview"},"type":"array","title":"Plugins"},"marketplace_skills":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Marketplace Skills"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["skills","plugins","marketplace_skills","errors"],"title":"MarketplaceSkillsPreviewResponse","description":"Response for marketplace skills preview endpoint."},"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"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"llm_api_key":{"type":"string","title":"Llm Api Key"},"llm_api_key_for_byor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Api Key For Byor"},"agent_settings_diff":{"additionalProperties":true,"type":"object","title":"Agent Settings Diff"},"conversation_settings_diff":{"additionalProperties":true,"type":"object","title":"Conversation Settings Diff"},"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.\n\n``agent_settings_diff`` and ``conversation_settings_diff`` carry the\nmember-level overrides on top of the organization defaults."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"responses_item_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Responses Item Id","description":"Original Responses function_call.id, echoed verbatim on replay"},"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."},"ModelUsageData":{"properties":{"model_name":{"type":"string","title":"Model Name"},"conversation_count":{"type":"integer","title":"Conversation Count","default":0},"total_tokens":{"type":"integer","title":"Total Tokens","default":0},"total_cost":{"type":"number","title":"Total Cost","default":0.0}},"type":"object","required":["model_name"],"title":"ModelUsageData","description":"Usage data for a single model."},"NeverConfirm":{"properties":{"kind":{"type":"string","const":"NeverConfirm","title":"Kind"}},"type":"object","title":"NeverConfirm"},"NoOpCondenser-Input":{"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."},"NoOpCondenser-Output":{"properties":{"kind":{"type":"string","const":"NoOpCondenser","title":"Kind"}},"type":"object","required":["kind"],"title":"NoOpCondenser","description":"Simple condenser that returns a view un-manipulated.\n\nPrimarily intended for testing purposes."},"NoOpCondenserSettings":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Enable conversation memory condensation.","default":true,"openhands_settings":{"depends_on":[],"label":"Enable memory condensation","prominence":"critical"}},"condenser_kind":{"type":"string","const":"no_op","title":"Condenser Kind","description":"Discriminator for the condenser settings union. ``'no_op'`` selects a condenser that leaves conversation views unchanged.","default":"no_op","openhands_settings":{"depends_on":[],"prominence":"minor"}}},"type":"object","title":"NoOpCondenserSettings","description":"Settings for a condenser that leaves conversation views unchanged."},"Observation-Input":{"oneOf":[{"$ref":"#/components/schemas/MCPToolObservation-Input"},{"$ref":"#/components/schemas/FinishObservation-Input"},{"$ref":"#/components/schemas/InvokeSkillObservation-Input"},{"$ref":"#/components/schemas/SwitchLLMObservation-Input"},{"$ref":"#/components/schemas/ThinkObservation-Input"},{"$ref":"#/components/schemas/VisionInspectObservation-Input"},{"$ref":"#/components/schemas/ClientToolObservation-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"},{"$ref":"#/components/schemas/WorkflowObservation-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__invoke_skill__InvokeSkillObservation-Input__1":"#/components/schemas/InvokeSkillObservation-Input","openhands__sdk__tool__builtins__switch_llm__SwitchLLMObservation-Input__1":"#/components/schemas/SwitchLLMObservation-Input","openhands__sdk__tool__builtins__think__ThinkObservation-Input__1":"#/components/schemas/ThinkObservation-Input","openhands__sdk__tool__builtins__vision_inspect__VisionInspectObservation-Input__1":"#/components/schemas/VisionInspectObservation-Input","openhands__sdk__tool__client_tool__ClientToolObservation-Input__1":"#/components/schemas/ClientToolObservation-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","openhands__tools__workflow__definition__WorkflowObservation-Input__1":"#/components/schemas/WorkflowObservation-Input"}}},"Observation-Output":{"oneOf":[{"$ref":"#/components/schemas/MCPToolObservation-Output"},{"$ref":"#/components/schemas/FinishObservation-Output"},{"$ref":"#/components/schemas/InvokeSkillObservation-Output"},{"$ref":"#/components/schemas/SwitchLLMObservation-Output"},{"$ref":"#/components/schemas/ThinkObservation-Output"},{"$ref":"#/components/schemas/VisionInspectObservation-Output"},{"$ref":"#/components/schemas/ClientToolObservation-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"},{"$ref":"#/components/schemas/WorkflowObservation-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__invoke_skill__InvokeSkillObservation-Output__1":"#/components/schemas/InvokeSkillObservation-Output","openhands__sdk__tool__builtins__switch_llm__SwitchLLMObservation-Output__1":"#/components/schemas/SwitchLLMObservation-Output","openhands__sdk__tool__builtins__think__ThinkObservation-Output__1":"#/components/schemas/ThinkObservation-Output","openhands__sdk__tool__builtins__vision_inspect__VisionInspectObservation-Output__1":"#/components/schemas/VisionInspectObservation-Output","openhands__sdk__tool__client_tool__ClientToolObservation-Output__1":"#/components/schemas/ClientToolObservation-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","openhands__tools__workflow__definition__WorkflowObservation-Output__1":"#/components/schemas/WorkflowObservation-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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"extended_content":{"items":{"$ref":"#/components/schemas/TextContent"},"type":"array","title":"Extended Content","description":"Content added by agent context (e.g. path-scoped rules triggered by the touched file), appended after the tool result in to_llm_message."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"extended_content":{"items":{"$ref":"#/components/schemas/TextContent"},"type":"array","title":"Extended Content","description":"Content added by agent context (e.g. path-scoped rules triggered by the touched file), appended after the tool result in to_llm_message."},"kind":{"type":"string","const":"ObservationEvent","title":"Kind"}},"additionalProperties":false,"type":"object","required":["tool_name","tool_call_id","observation","action_id","kind"],"title":"ObservationEvent"},"OnboardingSubmission":{"properties":{"selections":{"additionalProperties":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object","title":"Selections","default":{}}},"type":"object","title":"OnboardingSubmission","description":"Payload posted from the onboarding form.\n\n``selections`` maps onboarding question_id -> selected option(s), e.g.\n``{\"role\": \"software_engineer\", \"org_size\": \"solo\",\n   \"use_case\": [\"new_features\", \"fixing_bugs\"]}``.\n\nThe field is optional so the endpoint stays backwards-compatible with any\nclient that previously called it with an empty body, but the current\nfrontend always submits a populated mapping."},"OpenHandsAgentProfile":{"properties":{"schema_version":{"type":"integer","minimum":1.0,"title":"Schema Version","default":2},"id":{"type":"string","format":"uuid","title":"Id","description":"Stable provenance handle for this profile. Conversations record this UUID; it never changes, even when the profile is renamed."},"name":{"type":"string","minLength":1,"title":"Name","description":"Human-facing, renameable key shown in the profile picker."},"revision":{"type":"integer","minimum":0.0,"title":"Revision","description":"Monotonic revision counter, bumped on each saved edit.","default":0},"mcp_server_refs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mcp Server Refs","description":"Which of the user's globally configured MCP servers to expose. null = all; [] = none; a non-null list = filter to the named keys."},"agent_kind":{"type":"string","const":"openhands","title":"Agent Kind","description":"Discriminator for the ``AgentProfile`` union. ``'openhands'`` selects the standard built-in OpenHands agent.","default":"openhands"},"llm_profile_ref":{"type":"string","minLength":1,"title":"Llm Profile Ref","description":"Name of the saved LLM profile to resolve for this agent. The profile itself stores no LLM credential — it lives on the referenced LLM profile."},"agent":{"type":"string","title":"Agent","description":"Agent class to build.","default":"CodeActAgent"},"tools":{"anyOf":[{"items":{"$ref":"#/components/schemas/openhands__sdk__tool__spec__Tool"},"type":"array"},{"type":"null"}],"title":"Tools","description":"Tool selection for the resolved agent. None (the default) = the server's standard tool set; [] = an explicitly bare agent; a non-empty list is used exactly as given."},"system_message_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Message Suffix","description":"Optional suffix appended to the system prompt."},"disabled_skills":{"items":{"type":"string"},"type":"array","title":"Disabled Skills","description":"Names of server-discovered skills to EXCLUDE from this agent's prompt — a deny-list over the discovered catalog. [] (the default) = all discovered skills; a listed name that is absent from the catalog is simply a no-op, so the field never fails a launch when the catalog drifts. Replaces the former allow-list ``skill_refs`` (#4017): skills are discovered from many incomplete sources, so exclusion is the only selection model that can't dangle."},"condenser":{"oneOf":[{"$ref":"#/components/schemas/LLMSummarizingCondenserSettings"},{"$ref":"#/components/schemas/NoOpCondenserSettings"}],"title":"Condenser","description":"Condenser settings for the agent."},"verification":{"$ref":"#/components/schemas/ProfileVerificationSettings","description":"Critic/verification policy (secret-free; no critic_api_key)."},"enable_sub_agents":{"type":"boolean","title":"Enable Sub Agents","description":"Enable sub-agent delegation via TaskToolSet.","default":false},"enable_switch_llm_tool":{"type":"boolean","title":"Enable Switch Llm Tool","description":"Enable the built-in switch_llm tool for switching between saved LLM profiles. Defaults True to match the global agent settings default (AgentSettingsConfig.enable_switch_llm_tool).","default":true},"tool_concurrency_limit":{"type":"integer","minimum":1.0,"title":"Tool Concurrency Limit","description":"Maximum number of tool calls to execute concurrently per agent step. 1 = sequential (default).","default":1}},"additionalProperties":false,"type":"object","required":["name","llm_profile_ref"],"title":"OpenHandsAgentProfile","description":"``agent_kind=\"openhands\"`` profile — references an LLM profile by name.\n\nMirrors the configurable surface of\n:class:`~openhands.sdk.settings.model.OpenHandsAgentSettings`, except the\nconcrete ``llm`` is replaced by :attr:`llm_profile_ref` (resolved against\nthe LLM profile store) and ``mcp_config`` by the inherited\n:attr:`~AgentProfileBase.mcp_server_refs`."},"OpenHandsAgentSettings":{"properties":{"schema_version":{"type":"integer","minimum":1.0,"title":"Schema Version","default":5},"agent_kind":{"type":"string","const":"openhands","title":"Agent Kind","description":"Discriminator for the ``AgentSettings`` union. ``'openhands'`` selects the standard built-in OpenHands agent.","default":"openhands"},"agent":{"type":"string","title":"Agent","description":"Agent class to use.","default":"CodeActAgent","openhands_settings":{"depends_on":[],"label":"Agent","prominence":"major","variant":"openhands"}},"llm":{"$ref":"#/components/schemas/LLM-Output","description":"LLM settings for the agent.","openhands_settings_section":{"key":"llm","label":"LLM","variant":"openhands"}},"tools":{"anyOf":[{"items":{"$ref":"#/components/schemas/openhands__sdk__tool__spec__Tool"},"type":"array"},{"type":"null"}],"title":"Tools","description":"Tools available to the agent. None (the default) resolves to the standard exec set (see openhands.sdk.tool.defaults), plus the sub-agent tool set when enable_sub_agents is set; [] is an explicitly bare agent; a non-empty list is used exactly as given. Environment-dependent tools (browser) are injected by the serving layer, not the default.","openhands_settings":{"depends_on":[],"label":"Tools","prominence":"major","variant":"openhands"}},"enable_sub_agents":{"type":"boolean","title":"Enable Sub Agents","description":"Enable sub-agent delegation via TaskToolSet.","default":false,"openhands_settings":{"depends_on":[],"label":"Enable sub-agents","prominence":"major","variant":"openhands"}},"enable_switch_llm_tool":{"type":"boolean","title":"Enable Switch Llm Tool","description":"Enable the built-in switch_llm tool for switching between saved LLM profiles.","default":true,"openhands_settings":{"depends_on":[],"label":"Enable LLM switching tool","prominence":"minor","variant":"openhands"}},"tool_concurrency_limit":{"type":"integer","minimum":1.0,"title":"Tool Concurrency Limit","description":"Maximum number of tool calls to execute concurrently per agent step. 1 = sequential (default). Values > 1 enable parallel tool calls; concurrent tools share the conversation object, filesystem, and working directory, so mutations to shared state may race.","default":1,"openhands_settings":{"depends_on":[],"label":"Parallel tool calls","prominence":"major","variant":"openhands"}},"mcp_config":{"additionalProperties":{"$ref":"#/components/schemas/MCPServer-Output"},"type":"object","title":"Mcp Config","description":"MCP servers available to the agent.","openhands_settings":{"depends_on":[],"label":"MCP servers","prominence":"minor","variant":"openhands"}},"agent_context":{"$ref":"#/components/schemas/AgentContext-Output","description":"Context for the agent (skills, secrets, message suffixes).","openhands_settings_section":{"key":"agent_context","label":"Memory","variant":"openhands"}},"condenser":{"oneOf":[{"$ref":"#/components/schemas/LLMSummarizingCondenserSettings"},{"$ref":"#/components/schemas/NoOpCondenserSettings"}],"title":"Condenser","description":"Condenser settings for the agent.","openhands_settings_section":{"key":"condenser","label":"Condenser","variant":"openhands"}},"verification":{"$ref":"#/components/schemas/VerificationSettings","description":"Verification settings for the agent critic.","openhands_settings_section":{"key":"verification","label":"Verification","variant":"openhands"}}},"type":"object","title":"OpenHandsAgentSettings","description":"Settings for a standard LLM-backed :class:`Agent`.\n\nThis is the long-standing ``AgentSettings`` shape; fields here build\nthe default ``Agent`` (LLM + tools + MCP + condenser + critic)."},"OrgAppSettingsResponse":{"properties":{"enable_proactive_conversation_starters":{"type":"boolean","title":"Enable Proactive Conversation Starters","default":true},"max_budget_per_task":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Budget Per Task"},"registered_marketplaces":{"items":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_models__MarketplaceRegistration"},"type":"array","title":"Registered Marketplaces"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"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"},"max_budget_per_task":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Budget Per Task"},"registered_marketplaces":{"anyOf":[{"items":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_models__MarketplaceRegistration"},"type":"array"},{"type":"null"}],"title":"Registered Marketplaces"},"last_known_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Known Updated At"}},"type":"object","title":"OrgAppSettingsUpdate","description":"Request model for updating organization app settings."},"OrgBudgetSettingsResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"monthly_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Limit"},"litellm_last_sync_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Litellm Last Sync At"},"litellm_last_sync_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Litellm Last Sync Status"},"litellm_last_sync_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Litellm Last Sync Error"},"reset_day":{"type":"integer","title":"Reset Day"},"slack_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Channel"},"slack_team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Team Id"},"default_user_monthly_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Default User Monthly Limit"},"cycle_start_at":{"type":"string","format":"date-time","title":"Cycle Start At"},"cycle_end_at":{"type":"string","format":"date-time","title":"Cycle End At"},"current_spend":{"type":"number","title":"Current Spend","default":0.0},"current_spend_percentage":{"type":"number","title":"Current Spend Percentage","default":0.0},"thresholds":{"items":{"$ref":"#/components/schemas/OrgBudgetThresholdResponse"},"type":"array","title":"Thresholds"},"users":{"items":{"$ref":"#/components/schemas/OrgBudgetUserResponse"},"type":"array","title":"Users"},"users_total":{"type":"integer","title":"Users Total","default":0},"users_page":{"type":"integer","title":"Users Page","default":1},"users_per_page":{"type":"integer","title":"Users Per Page","default":50}},"type":"object","required":["enabled","reset_day","cycle_start_at","cycle_end_at"],"title":"OrgBudgetSettingsResponse"},"OrgBudgetSettingsUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"monthly_limit":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Monthly Limit"},"reset_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reset Day"},"default_user_monthly_limit":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Default User Monthly Limit"},"slack_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Channel"},"slack_team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Team Id"},"thresholds":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrgBudgetThresholdUpdate"},"type":"array"},{"type":"null"}],"title":"Thresholds"}},"type":"object","title":"OrgBudgetSettingsUpdate"},"OrgBudgetThresholdResponse":{"properties":{"id":{"type":"integer","title":"Id"},"percentage":{"type":"integer","title":"Percentage"},"email_enabled":{"type":"boolean","title":"Email Enabled"},"slack_enabled":{"type":"boolean","title":"Slack Enabled"}},"type":"object","required":["id","percentage","email_enabled","slack_enabled"],"title":"OrgBudgetThresholdResponse"},"OrgBudgetThresholdUpdate":{"properties":{"percentage":{"type":"integer","maximum":100.0,"exclusiveMinimum":0.0,"title":"Percentage"},"email_enabled":{"type":"boolean","title":"Email Enabled","default":true},"slack_enabled":{"type":"boolean","title":"Slack Enabled","default":false}},"type":"object","required":["percentage"],"title":"OrgBudgetThresholdUpdate"},"OrgBudgetUserOverrideUpdate":{"properties":{"monthly_limit":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Monthly Limit"},"is_disabled":{"type":"boolean","title":"Is Disabled","default":false}},"type":"object","title":"OrgBudgetUserOverrideUpdate"},"OrgBudgetUserResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"current_spend":{"type":"number","title":"Current Spend","default":0.0},"monthly_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Limit"},"effective_monthly_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Effective Monthly Limit"},"is_disabled":{"type":"boolean","title":"Is Disabled","default":false},"is_override":{"type":"boolean","title":"Is Override","default":false}},"type":"object","required":["user_id"],"title":"OrgBudgetUserResponse"},"OrgConversationPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrgConversationResponse"},"type":"array","title":"Items"},"total_items":{"type":"integer","title":"Total Items","default":0},"page":{"type":"integer","title":"Page","default":1},"per_page":{"type":"integer","title":"Per Page","default":100},"total_pages":{"type":"integer","title":"Total Pages","default":0},"pagination_accurate":{"type":"boolean","title":"Pagination Accurate","default":true}},"type":"object","required":["items"],"title":"OrgConversationPage","description":"Paginated response for organization conversations."},"OrgConversationResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"llm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model"},"agent_kind":{"type":"string","title":"Agent Kind","default":"openhands"},"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"sandbox_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sandbox Id"},"sandbox_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sandbox Status"},"runtime_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runtime Url"},"execution_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Execution Status"},"selected_repository":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Repository"},"selected_branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Branch"},"git_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Provider"},"trigger":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger"},"pr_number":{"items":{"type":"integer"},"type":"array","title":"Pr Number"},"pr_merged":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pr Merged"},"tags":{"additionalProperties":{"type":"string"},"type":"object","title":"Tags"},"accumulated_cost":{"type":"number","title":"Accumulated Cost","default":0.0},"prompt_tokens":{"type":"integer","title":"Prompt Tokens","default":0},"completion_tokens":{"type":"integer","title":"Completion Tokens","default":0},"total_tokens":{"type":"integer","title":"Total Tokens","default":0},"cache_read_tokens":{"type":"integer","title":"Cache Read Tokens","default":0},"cache_write_tokens":{"type":"integer","title":"Cache Write Tokens","default":0}},"type":"object","required":["id","user_id"],"title":"OrgConversationResponse","description":"Response model for a single conversation in an organization."},"OrgConversationStats":{"properties":{"active_conversations":{"type":"integer","title":"Active Conversations","default":0},"running_runtimes":{"type":"integer","title":"Running Runtimes","default":0},"completed_24h":{"type":"integer","title":"Completed 24H","default":0},"completed_7d":{"type":"integer","title":"Completed 7D","default":0},"completed_30d":{"type":"integer","title":"Completed 30D","default":0},"total_cost":{"type":"number","title":"Total Cost","default":0.0},"total_prompt_tokens":{"type":"integer","title":"Total Prompt Tokens","default":0},"total_completion_tokens":{"type":"integer","title":"Total Completion Tokens","default":0},"total_tokens":{"type":"integer","title":"Total Tokens","default":0}},"type":"object","title":"OrgConversationStats","description":"Aggregated statistics for organization conversations."},"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."},"OrgDefaultsSettingsResponse":{"properties":{"agent_settings":{"oneOf":[{"$ref":"#/components/schemas/OpenHandsAgentSettings"},{"$ref":"#/components/schemas/LLMAgentSettings"},{"$ref":"#/components/schemas/ACPAgentSettings"}],"title":"Agent Settings"},"conversation_settings":{"$ref":"#/components/schemas/ConversationSettings"},"llm_api_key_set":{"type":"boolean","title":"Llm Api Key Set","default":false},"search_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Api Key"}},"type":"object","title":"OrgDefaultsSettingsResponse","description":"Response model for organization default settings."},"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"},"remote_runtime_resource_factor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remote Runtime Resource Factor"},"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},"agent_settings":{"oneOf":[{"$ref":"#/components/schemas/OpenHandsAgentSettings"},{"$ref":"#/components/schemas/LLMAgentSettings"},{"$ref":"#/components/schemas/ACPAgentSettings"}],"title":"Agent Settings"},"conversation_settings":{"$ref":"#/components/schemas/ConversationSettings"},"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"},"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"},"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"},"v1_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"V1 Enabled"},"search_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Api Key"},"llm_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Api Key"},"agent_settings_diff":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Agent Settings Diff"},"conversation_settings_diff":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Conversation Settings Diff"}},"type":"object","title":"OrgUpdate","description":"Request model for updating an organization.\n\n``agent_settings_diff`` and ``conversation_settings_diff`` are sparse diffs\nthat are deep-merged into the org row and then validated as full settings\nbefore persistence."},"OrgUsageStats":{"properties":{"active_users":{"type":"integer","title":"Active Users","default":0},"agent_runs":{"type":"integer","title":"Agent Runs","default":0},"usage_conversation_count":{"type":"integer","title":"Usage Conversation Count","default":0},"total_tokens":{"type":"integer","title":"Total Tokens","default":0},"estimated_spend":{"type":"number","title":"Estimated Spend","default":0.0},"daily_usage":{"items":{"$ref":"#/components/schemas/DailyUsageData"},"type":"array","title":"Daily Usage"},"team_usage":{"items":{"$ref":"#/components/schemas/TeamUsageData"},"type":"array","title":"Team Usage"},"model_usage":{"items":{"$ref":"#/components/schemas/ModelUsageData"},"type":"array","title":"Model Usage"},"agent_usage":{"items":{"$ref":"#/components/schemas/AgentUsageData"},"type":"array","title":"Agent Usage"}},"type":"object","title":"OrgUsageStats","description":"Detailed usage statistics for organization dashboard."},"OrgUserUsageRow":{"properties":{"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"conversation_count":{"type":"integer","title":"Conversation Count","default":0},"first_conversation_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Conversation At"},"last_conversation_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Conversation At"},"first_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Login At"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"spend_mtd":{"type":"number","title":"Spend Mtd","default":0.0},"spend_ytd":{"type":"number","title":"Spend Ytd","default":0.0},"spend_lifetime":{"type":"number","title":"Spend Lifetime","default":0.0},"budget_monthly_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Monthly Limit"},"budget_is_disabled":{"type":"boolean","title":"Budget Is Disabled","default":false},"prs_merged":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prs Merged"}},"type":"object","required":["user_id"],"title":"OrgUserUsageRow","description":"Usage summary for a single user."},"OrgUserUsageStats":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrgUserUsageRow"},"type":"array","title":"Items"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","title":"OrgUserUsageStats","description":"Detailed usage stats by user for the admin dashboard."},"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"},"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."},"PathTrigger":{"properties":{"type":{"type":"string","const":"path","title":"Type","default":"path"},"paths":{"items":{"type":"string"},"type":"array","title":"Paths"}},"type":"object","required":["paths"],"title":"PathTrigger","description":"Trigger for path-scoped skills (\"rules\").\n\nThese skills are activated when the agent touches a file whose path matches\none of the ``paths`` glob patterns (gitignore-style ``**`` semantics)."},"PatternSecurityAnalyzer":{"properties":{"high_patterns":{"items":{"prefixItems":[{"type":"string"},{"type":"string"},{"type":"string"}],"type":"array","maxItems":3,"minItems":3},"type":"array","title":"High Patterns","description":"HIGH patterns scanned against executable fields only"},"medium_patterns":{"items":{"prefixItems":[{"type":"string"},{"type":"string"},{"type":"string"}],"type":"array","maxItems":3,"minItems":3},"type":"array","title":"Medium Patterns","description":"MEDIUM patterns scanned against executable fields only"},"injection_high_patterns":{"items":{"prefixItems":[{"type":"string"},{"type":"string"},{"type":"string"}],"type":"array","maxItems":3,"minItems":3},"type":"array","title":"Injection High Patterns","description":"HIGH patterns scanned against all fields"},"injection_medium_patterns":{"items":{"prefixItems":[{"type":"string"},{"type":"string"},{"type":"string"}],"type":"array","maxItems":3,"minItems":3},"type":"array","title":"Injection Medium Patterns","description":"MEDIUM patterns scanned against all fields"},"kind":{"type":"string","const":"PatternSecurityAnalyzer","title":"Kind"}},"type":"object","title":"PatternSecurityAnalyzer","description":"Catch dangerous agent actions through deterministic signature scanning.\n\nUse this when you want fast, local, no-network threat detection at the\naction boundary. It returns ``SecurityRisk.HIGH``, ``MEDIUM``, or ``LOW``\n-- pair it with ``ConfirmRisky`` to decide what gets confirmed.\n\nThe key design choice: shell-destructive patterns only scan what the\nagent will *execute* (tool arguments), never what it *thought about*\n(reasoning text). Injection patterns scan everything, because\n\"ignore all previous instructions\" is dangerous wherever it appears.\n\nNormalization is always on -- invisible characters and fullwidth\nsubstitutions are collapsed before matching.\n\nExample::\n\n    from openhands.sdk.security import PatternSecurityAnalyzer, ConfirmRisky\n\n    analyzer = PatternSecurityAnalyzer()\n    policy = ConfirmRisky(threshold=SecurityRisk.MEDIUM)"},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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."},"PendingInvitationsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/InvitationResponse"},"type":"array","title":"Items"},"email_delivery_configured":{"type":"boolean","title":"Email Delivery Configured","default":true},"auto_add_enabled":{"type":"boolean","title":"Auto Add Enabled","default":false}},"type":"object","required":["items"],"title":"PendingInvitationsResponse","description":"Response model for listing an org's pending invitations."},"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-Input":{"properties":{"condensers":{"items":{"$ref":"#/components/schemas/CondenserBase-Input"},"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"},"PipelineCondenser-Output":{"properties":{"condensers":{"items":{"$ref":"#/components/schemas/CondenserBase-Output"},"type":"array","title":"Condensers"},"kind":{"type":"string","const":"PipelineCondenser","title":"Kind"}},"type":"object","required":["condensers","kind"],"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."},"PluginSource":{"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."}},"type":"object","required":["source"],"title":"PluginSource","description":"Specification for a plugin to load.\n\nThis model describes where to find a plugin and is used by load_plugins()\nto fetch and load plugins from various sources.\n\nExamples:\n    >>> # GitHub repository\n    >>> PluginSource(source=\"github:owner/repo\", ref=\"v1.0.0\")\n\n    >>> # Plugin from monorepo subdirectory\n    >>> PluginSource(\n    ...     source=\"github:owner/monorepo\",\n    ...     repo_path=\"plugins/my-plugin\"\n    ... )\n\n    >>> # Local path\n    >>> PluginSource(source=\"/path/to/plugin\")"},"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."},"PolicyRailSecurityAnalyzer":{"properties":{"kind":{"type":"string","const":"PolicyRailSecurityAnalyzer","title":"Kind"}},"type":"object","title":"PolicyRailSecurityAnalyzer","description":"Catch composed threats that plain regex signatures would miss.\n\nUse this when you need to detect threats defined by *combinations*\nof tokens (e.g., ``curl`` piped to ``bash``) rather than individual\nsignatures. While these rails *could* each be expressed as a single\nregex, keeping them as named rules with per-segment evaluation makes\nthe threat model more interpretable, the rules easier to maintain,\nand the audit trail clearer than a flat pattern list.\n\nEvaluates normalized executable segments only -- reasoning text is\nnever scanned.\n\nReturns ``SecurityRisk.HIGH`` when a rail fires, ``LOW`` otherwise.\nPair with ``ConfirmRisky`` and compose via ``EnsembleSecurityAnalyzer``.\n\nv1 rails: fetch-to-exec, raw-disk-op, catastrophic-delete.\n\nExample::\n\n    from openhands.sdk.security import PolicyRailSecurityAnalyzer\n\n    analyzer = PolicyRailSecurityAnalyzer()\n    # risk = analyzer.security_risk(action)"},"ProfileVerificationSettings":{"properties":{"critic_enabled":{"type":"boolean","title":"Critic Enabled","default":false},"critic_mode":{"type":"string","enum":["finish_and_message","all_actions"],"title":"Critic Mode","default":"finish_and_message"},"enable_iterative_refinement":{"type":"boolean","title":"Enable Iterative Refinement","default":false},"critic_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Critic Threshold","default":0.6},"max_refinement_iterations":{"type":"integer","minimum":1.0,"title":"Max Refinement Iterations","default":3},"critic_server_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Critic Server Url"},"critic_model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Critic Model Name"}},"type":"object","title":"ProfileVerificationSettings","description":"Secret-free critic/refinement policy for a profile.\n\nThe non-credential subset of\n:class:`~openhands.sdk.settings.model.VerificationSettings`: ``critic_api_key``\nis omitted so the profile holds no secret. The critic reuses the resolved\nLLM profile's key (the existing ``critic_api_key=None`` behavior)."},"Provider":{"properties":{"name":{"type":"string","title":"Name","description":"The provider name"},"verified":{"type":"boolean","title":"Verified","description":"Whether the provider is verified by OpenHands","default":false}},"type":"object","required":["name"],"title":"Provider","description":"LLM Provider object for API responses."},"ProviderPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Provider"},"type":"array","title":"Items"},"next_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Id"}},"type":"object","required":["items"],"title":"ProviderPage","description":"Paginated response for LLM providers."},"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"},"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"},"RemoteMCPServer":{"properties":{"url":{"type":"string","title":"Url"},"transport":{"anyOf":[{"type":"string","enum":["http","streamable-http","sse"]},{"type":"null"}],"title":"Transport"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers"},"auth":{"anyOf":[{"type":"string"},{"type":"string","const":"oauth"},{"type":"null"}],"title":"Auth","description":"Either a string representing a Bearer token, the literal \"oauth\" to use OAuth authentication, or an httpx.Auth instance for custom authentication."},"sse_read_timeout":{"anyOf":[{"type":"string","format":"duration"},{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Sse Read Timeout"},"timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timeout"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"authentication":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Authentication"}},"additionalProperties":true,"type":"object","required":["url"],"title":"RemoteMCPServer","description":"MCP server configuration for HTTP/SSE transport.\n\nThis is the canonical configuration format for MCP servers using remote transports."},"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\nSupports optional completion callbacks on exit via environment variables:\n  - ``AUTOMATION_CALLBACK_URL`` — URL to POST completion status to\n  - ``AUTOMATION_CALLBACK_API_KEY`` — Bearer token for callback auth (optional)\n  - ``AUTOMATION_RUN_ID`` — Run ID to include in callback payload (optional)\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\")"},"RenameAgentProfileRequest":{"properties":{"new_name":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$","title":"New Name"}},"type":"object","required":["new_name"],"title":"RenameAgentProfileRequest"},"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."},"SaasUserInfo":{"properties":{"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"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":{"title":"Secrets Store"},"enable_sound_notifications":{"type":"boolean","title":"Enable Sound Notifications","default":false},"enable_proactive_conversation_starters":{"type":"boolean","title":"Enable Proactive Conversation Starters","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"},"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"},"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"},"title_llm_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Llm Profile"},"git_full_clone":{"type":"boolean","title":"Git Full Clone","default":false},"v1_enabled":{"type":"boolean","title":"V1 Enabled","default":true},"agent_settings":{"additionalProperties":true,"type":"object","title":"Agent Settings"},"conversation_settings":{"$ref":"#/components/schemas/ConversationSettings"},"sandbox_grouping_strategy":{"$ref":"#/components/schemas/SandboxGroupingStrategy","default":"NO_GROUPING"},"default_sandbox_spec_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Sandbox Spec Id"},"llm_profiles":{"$ref":"#/components/schemas/LLMProfiles","description":"Saved LLM profiles and the currently active profile name. See ``LLMProfiles`` for the profile-management API."},"active_agent_profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Agent Profile Id"},"active_agent_profile_revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Active Agent Profile Revision"},"registered_marketplaces":{"items":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_models__MarketplaceRegistration"},"type":"array","title":"Registered Marketplaces","description":"List of marketplace registrations for plugin resolution. Marketplaces with auto_load=True will have their plugins loaded automatically at conversation start. See MarketplaceRegistration for details."},"inherited_marketplaces":{"items":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_models__MarketplaceRegistration"},"type":"array","title":"Inherited Marketplaces","description":"Marketplaces inherited from instance or organization level. These are read-only and cannot be modified by the user. Computed at runtime: Instance defaults + Org defaults."},"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"},"status_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Detail","description":"Last pod/scheduling reason from the runtime (e.g. insufficient kvm, ImagePullBackOff), surfaced when a sandbox is stuck or errored."}},"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-Input"},"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-Input":{"oneOf":[{"$ref":"#/components/schemas/LookupSecret-Input"},{"$ref":"#/components/schemas/StaticSecret-Input"}],"discriminator":{"propertyName":"kind","mapping":{"openhands__sdk__secret__secrets__LookupSecret-Input__1":"#/components/schemas/LookupSecret-Input","openhands__sdk__secret__secrets__StaticSecret-Input__1":"#/components/schemas/StaticSecret-Input"}}},"SecretSource-Output":{"oneOf":[{"$ref":"#/components/schemas/LookupSecret-Output"},{"$ref":"#/components/schemas/StaticSecret-Output"}],"discriminator":{"propertyName":"kind","mapping":{"openhands__sdk__secret__secrets__LookupSecret-Output__1":"#/components/schemas/LookupSecret-Output","openhands__sdk__secret__secrets__StaticSecret-Output__1":"#/components/schemas/StaticSecret-Output"}}},"SecurityAnalyzerBase":{"oneOf":[{"$ref":"#/components/schemas/PatternSecurityAnalyzer"},{"$ref":"#/components/schemas/PolicyRailSecurityAnalyzer"},{"$ref":"#/components/schemas/EnsembleSecurityAnalyzer"},{"$ref":"#/components/schemas/GraySwanAnalyzer"},{"$ref":"#/components/schemas/LLMSecurityAnalyzer"},{"$ref":"#/components/schemas/ToolShieldLLMSecurityAnalyzer"}],"discriminator":{"propertyName":"kind","mapping":{"openhands__sdk__security__defense_in_depth__pattern__PatternSecurityAnalyzer-Input__1":"#/components/schemas/PatternSecurityAnalyzer","openhands__sdk__security__defense_in_depth__policy_rails__PolicyRailSecurityAnalyzer-Input__1":"#/components/schemas/PolicyRailSecurityAnalyzer","openhands__sdk__security__ensemble__EnsembleSecurityAnalyzer-Input__1":"#/components/schemas/EnsembleSecurityAnalyzer","openhands__sdk__security__grayswan__analyzer__GraySwanAnalyzer-Input__1":"#/components/schemas/GraySwanAnalyzer","openhands__sdk__security__llm_analyzer__LLMSecurityAnalyzer-Input__1":"#/components/schemas/LLMSecurityAnalyzer","openhands__sdk__security__toolshield_llm_analyzer__ToolShieldLLMSecurityAnalyzer-Input__1":"#/components/schemas/ToolShieldLLMSecurityAnalyzer"}}},"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."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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."},"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-Input":{"properties":{"name":{"type":"string","title":"Name"},"content":{"type":"string","title":"Content"},"trigger":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/KeywordTrigger"},{"$ref":"#/components/schemas/TaskTrigger"},{"$ref":"#/components/schemas/PathTrigger"}],"discriminator":{"propertyName":"type","mapping":{"keyword":"#/components/schemas/KeywordTrigger","path":"#/components/schemas/PathTrigger","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":{"$ref":"#/components/schemas/MCPServer-Input"},"type":"object"},{"type":"null"}],"title":"Mcp Tools","description":"MCP servers for the skill (repo skills only)."},"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 <available_skills> 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},"version":{"type":"string","title":"Version","description":"Skill version (AgentSkills standard field).","default":"1.0.0"},"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)."},"disable_model_invocation":{"type":"boolean","title":"Disable Model Invocation","description":"Whether this skill can only be activated by trigger matching and should not be advertised to the model for direct invocation.","default":false},"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 <available_skills> 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 <available_skills>, content injected on trigger\n- Without triggers (None): Full content in <REPO_CONTEXT>, always active\n\nThis model supports both OpenHands-specific fields and AgentSkills standard\nfields (https://agentskills.io/specification) for cross-platform compatibility."},"Skill-Output":{"properties":{"name":{"type":"string","title":"Name"},"content":{"type":"string","title":"Content"},"trigger":{"anyOf":[{"oneOf":[{"$ref":"#/components/schemas/KeywordTrigger"},{"$ref":"#/components/schemas/TaskTrigger"},{"$ref":"#/components/schemas/PathTrigger"}],"discriminator":{"propertyName":"type","mapping":{"keyword":"#/components/schemas/KeywordTrigger","path":"#/components/schemas/PathTrigger","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":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Mcp Tools","description":"MCP servers for the skill (repo skills only)."},"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 <available_skills> 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},"version":{"type":"string","title":"Version","description":"Skill version (AgentSkills standard field).","default":"1.0.0"},"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)."},"disable_model_invocation":{"type":"boolean","title":"Disable Model Invocation","description":"Whether this skill can only be activated by trigger matching and should not be advertised to the model for direct invocation.","default":false},"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 <available_skills> 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 <available_skills>, content injected on trigger\n- Without triggers (None): Full content in <REPO_CONTEXT>, 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-Input":{"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"},"StaticSecret-Output":{"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","required":["kind"],"title":"StaticSecret","description":"A secret stored locally"},"StdioMCPServer":{"properties":{"command":{"type":"string","title":"Command"},"args":{"items":{"type":"string"},"type":"array","title":"Args"},"env":{"additionalProperties":true,"type":"object","title":"Env"},"transport":{"type":"string","const":"stdio","title":"Transport","default":"stdio"},"type":{"anyOf":[{"type":"string","const":"stdio"},{"type":"null"}],"title":"Type"},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cwd"},"timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timeout"},"keep_alive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Keep Alive"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"authentication":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Authentication"}},"additionalProperties":true,"type":"object","required":["command"],"title":"StdioMCPServer","description":"MCP server configuration for stdio transport.\n\nThis is the canonical configuration format for MCP servers using stdio transport."},"StreamingDeltaEvent-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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"reasoning_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning Content"},"kind":{"type":"string","const":"StreamingDeltaEvent","title":"Kind"}},"additionalProperties":false,"type":"object","title":"StreamingDeltaEvent","description":"Transient LLM token delta for real-time WebSocket delivery.\n\nNot persisted to the conversation event log: these events are published\ndirectly to PubSub, bypassing the callback chain that writes to\nConversationState.events. Clients reconnecting mid-stream will receive\nthe final MessageEvent from history but none of the deltas that produced\nit — deltas are a UX affordance, not part of the durable conversation\nrecord."},"StreamingDeltaEvent-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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"reasoning_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning Content"},"kind":{"type":"string","const":"StreamingDeltaEvent","title":"Kind"}},"additionalProperties":false,"type":"object","required":["kind"],"title":"StreamingDeltaEvent","description":"Transient LLM token delta for real-time WebSocket delivery.\n\nNot persisted to the conversation event log: these events are published\ndirectly to PubSub, bypassing the callback chain that writes to\nConversationState.events. Clients reconnecting mid-stream will receive\nthe final MessageEvent from history but none of the deltas that produced\nit — deltas are a UX affordance, not part of the durable conversation\nrecord."},"StrictLLM":{"properties":{"model":{"type":"string","title":"Model","description":"Model name.","default":"gpt-5.5","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"}},"auth_type":{"type":"string","enum":["api_key","subscription"],"title":"Auth Type","description":"Authentication mode for the LLM.","default":"api_key","openhands_settings":{"depends_on":[],"label":"Authentication","prominence":"critical"}},"subscription_vendor":{"anyOf":[{"type":"string","const":"openai"},{"type":"null"}],"title":"Subscription Vendor","description":"Subscription provider for subscription-backed LLM access.","openhands_settings":{"depends_on":["auth_type"],"label":"Subscription provider","prominence":"critical"}},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"Custom base URL.","openhands_settings":{"depends_on":[],"prominence":"major"}},"api_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Version","description":"API version (e.g., Azure).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_access_key_id":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Access Key Id","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_secret_access_key":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Secret Access Key","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_session_token":{"anyOf":[{"type":"string"},{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Aws Session Token","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_region_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Region Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Profile Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_role_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Role Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_session_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Session Name","openhands_settings":{"depends_on":[],"prominence":"minor"}},"aws_bedrock_runtime_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aws Bedrock Runtime Endpoint","openhands_settings":{"depends_on":[],"prominence":"minor"}},"openrouter_site_url":{"type":"string","title":"Openrouter Site Url","default":"https://docs.all-hands.dev/","openhands_settings":{"depends_on":[],"prominence":"minor"}},"openrouter_app_name":{"type":"string","title":"Openrouter App Name","default":"OpenHands","openhands_settings":{"depends_on":[],"prominence":"minor"}},"num_retries":{"type":"integer","minimum":0.0,"title":"Num Retries","default":5,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_multiplier":{"type":"number","minimum":0.0,"title":"Retry Multiplier","default":8.0,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_min_wait":{"type":"integer","minimum":0.0,"title":"Retry Min Wait","default":8,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"retry_max_wait":{"type":"integer","minimum":0.0,"title":"Retry Max Wait","default":64,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"top_k":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Top K","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"api_mode":{"type":"string","enum":["auto","chat","responses"],"title":"Api Mode","description":"LLM API endpoint mode. 'auto' resolves from model metadata and SDK fallbacks; use 'chat' or 'responses' to override endpoint selection for proxy aliases and newly released models.","default":"auto","openhands_settings":{"depends_on":[],"prominence":"minor"}},"capability_overrides":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"object","title":"Capability Overrides","description":"Explicit model capability overrides. Supported keys include supports_reasoning_effort, thinking_mode (adaptive, manual, none, or unknown), supports_sampling_params, supports_prompt_cache, supports_stop_words, supports_responses_api, supports_vision, and supports_prompt_cache_retention. Overrides take precedence over LiteLLM metadata and SDK fallbacks.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"extra_headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Extra Headers","description":"Optional HTTP headers to forward to LiteLLM requests.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"ollama_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ollama Base Url","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"drop_params":{"type":"boolean","title":"Drop Params","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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).","openhands_settings":{"depends_on":[],"prominence":"minor"}},"disable_stop_word":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disable Stop Word","description":"Disable using of stop word.","default":false,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"caching_prompt":{"type":"boolean","title":"Caching Prompt","description":"Enable caching of prompts.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"log_completions":{"type":"boolean","title":"Log Completions","description":"Enable logging of completions.","default":false,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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","openhands_settings":{"depends_on":[],"prominence":"minor"}},"custom_tokenizer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Tokenizer","description":"A custom tokenizer to use for token counting.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"native_tool_calling":{"type":"boolean","title":"Native Tool Calling","description":"Whether to use native tool calling.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"inline_image_urls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inline Image Urls","description":"If True, fetch any http(s) image URL in outgoing messages and inline it as a base64 ``data:`` URL before sending. If None (default), auto-detect based on model (some APIs such as Moonshot's public Kimi endpoint reject URL-formatted images and require base64). Set this explicitly when the model is reached through a proxy alias that hides the underlying provider (e.g. ``litellm_proxy/<custom-alias>``). Note: inlining only runs when ``vision_is_active()`` is True, so the alias must still be recognised as vision-capable by the SDK feature registry or proxy model metadata.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"reasoning_effort":{"anyOf":[{"type":"string","enum":["low","medium","high","xhigh","none"]},{"type":"null"}],"title":"Reasoning Effort","description":"Provider-neutral reasoning effort. Common values include 'none', 'minimal', 'low', 'medium', 'high', 'xhigh', and 'max'. The SDK accepts future provider values and lets LiteLLM translate them.","default":"high","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"enable_encrypted_reasoning":{"type":"boolean","title":"Enable Encrypted Reasoning","description":"If True, ask for ['reasoning.encrypted_content'] in Responses API include.","default":true,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"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","openhands_settings":{"depends_on":[],"prominence":"minor"}},"extended_thinking_budget":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extended Thinking Budget","description":"Legacy token budget for models confirmed to use manual Anthropic extended thinking. Ignored for adaptive-thinking models. Prefer reasoning_effort for new integrations.","default":200000,"openhands_settings":{"depends_on":[],"prominence":"minor"}},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed","description":"The seed to use for random number generation.","openhands_settings":{"depends_on":[],"prominence":"minor"}},"usage_id":{"type":"string","title":"Usage Id","description":"Unique usage identifier for the LLM. Used for registry lookups, telemetry, and spend tracking.","default":"default","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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}","openhands_settings":{"depends_on":[],"prominence":"minor"}},"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."}},"additionalProperties":false,"type":"object","title":"StrictLLM","description":"LLM variant that rejects unknown fields.\n\nThe base ``LLM`` model has ``extra='ignore'``, so typos and renamed keys\nsilently disappear. For API input we want to fail loud, otherwise users\ncan POST ``{\"llm\": {\"custom_header\": \"x\"}}`` and get a 201 with the\nfield quietly dropped."},"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."},"SuperAdminListResponse":{"properties":{"super_admins":{"items":{"$ref":"#/components/schemas/SuperAdminResponse"},"type":"array","title":"Super Admins"}},"type":"object","required":["super_admins"],"title":"SuperAdminListResponse","description":"The full set of current super admins."},"SuperAdminResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["user_id"],"title":"SuperAdminResponse","description":"A single super admin."},"SwitchAcpModelRequest":{"properties":{"model":{"type":"string","minLength":1,"title":"Model","description":"Model identifier to switch to (must be supported by the provider)."}},"type":"object","required":["model"],"title":"SwitchAcpModelRequest","description":"Request to switch a running ACP conversation's model in place."},"SwitchLLMAction-Input":{"properties":{"profile_name":{"type":"string","title":"Profile Name","description":"Name of the saved LLM profile to use for future agent steps."},"reason":{"type":"string","title":"Reason","description":"Brief reason why this profile is a better fit for the next step."},"kind":{"type":"string","const":"SwitchLLMAction","title":"Kind"}},"additionalProperties":false,"type":"object","required":["profile_name","reason"],"title":"SwitchLLMAction","description":"Action for switching this conversation to a saved LLM profile."},"SwitchLLMAction-Output":{"properties":{"profile_name":{"type":"string","title":"Profile Name","description":"Name of the saved LLM profile to use for future agent steps."},"reason":{"type":"string","title":"Reason","description":"Brief reason why this profile is a better fit for the next step."},"kind":{"type":"string","const":"SwitchLLMAction","title":"Kind"}},"additionalProperties":false,"type":"object","required":["profile_name","reason","kind"],"title":"SwitchLLMAction","description":"Action for switching this conversation to a saved LLM profile."},"SwitchLLMObservation-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},"profile_name":{"type":"string","title":"Profile Name","description":"Name of the profile that the tool attempted to activate."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Reason the agent gave for attempting this LLM profile switch."},"active_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Model","description":"Model configured by the activated profile, when available."},"kind":{"type":"string","const":"SwitchLLMObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["profile_name"],"title":"SwitchLLMObservation","description":"Observation returned after switching this conversation's LLM profile."},"SwitchLLMObservation-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},"profile_name":{"type":"string","title":"Profile Name","description":"Name of the profile that the tool attempted to activate."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Reason the agent gave for attempting this LLM profile switch."},"active_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Model","description":"Model configured by the activated profile, when available."},"kind":{"type":"string","const":"SwitchLLMObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["profile_name","kind"],"title":"SwitchLLMObservation","description":"Observation returned after switching this conversation's LLM profile."},"SwitchLLMTool-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":"SwitchLLMTool","title":"Kind"}},"type":"object","required":["description","action_type"],"title":"SwitchLLMTool","description":"Tool for switching a conversation to a saved LLM profile."},"SwitchLLMTool-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":"SwitchLLMTool","title":"Kind"},"title":{"type":"string","title":"Title","readOnly":true}},"type":"object","required":["description","action_type","kind","title"],"title":"SwitchLLMTool","description":"Tool for switching a conversation to a saved LLM profile."},"SwitchProfileRequest":{"properties":{"profile_name":{"type":"string","minLength":1,"title":"Profile Name","description":"Name of a profile previously saved via /api/v1/settings/profiles."}},"type":"object","required":["profile_name"],"title":"SwitchProfileRequest","description":"Request to switch a running conversation's LLM to a saved profile."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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":"general-purpose"},"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":"general-purpose"},"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"],"title":"TaskType"},"TeamUsageData":{"properties":{"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"conversation_count":{"type":"integer","title":"Conversation Count","default":0},"total_tokens":{"type":"integer","title":"Total Tokens","default":0},"percentage":{"type":"number","title":"Percentage","default":0.0}},"type":"object","required":["user_id"],"title":"TeamUsageData","description":"Usage data for a single user/team."},"TerminalAction-Input":{"properties":{"command":{"type":"string","title":"Command","description":"The shell command to execute. Can be empty string to view additional logs when the previous exit code is `-1`. Can be a special key name when `is_input` is True: `C-c` (Ctrl+C), `C-d` (Ctrl+D/EOF), `C-z` (Ctrl+Z), or any `C-<letter>` for Ctrl sequences; navigation keys `UP`, `DOWN`, `LEFT`, `RIGHT`, `HOME`, `END`, `PGUP`, `PGDN`; and `TAB`, `ESC`, `BS` (Backspace), `ENTER`. You can only execute one command at a time. Use the platform-appropriate shell syntax described in the tool description when chaining commands."},"is_input":{"type":"boolean","title":"Is Input","description":"If True, the command is an input to the running process. If False, the command is executed in the terminal session. 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’ll be asked whether to continue or stop it. If you don’t 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 terminal command execution."},"TerminalAction-Output":{"properties":{"command":{"type":"string","title":"Command","description":"The shell command to execute. Can be empty string to view additional logs when the previous exit code is `-1`. Can be a special key name when `is_input` is True: `C-c` (Ctrl+C), `C-d` (Ctrl+D/EOF), `C-z` (Ctrl+Z), or any `C-<letter>` for Ctrl sequences; navigation keys `UP`, `DOWN`, `LEFT`, `RIGHT`, `HOME`, `END`, `PGUP`, `PGDN`; and `TAB`, `ESC`, `BS` (Backspace), `ENTER`. You can only execute one command at a time. Use the platform-appropriate shell syntax described in the tool description when chaining commands."},"is_input":{"type":"boolean","title":"Is Input","description":"If True, the command is an input to the running process. If False, the command is executed in the terminal session. 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’ll be asked whether to continue or stop it. If you don’t 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 terminal 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 shell 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 shell 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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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."},"ToolDefinition-Input":{"oneOf":[{"$ref":"#/components/schemas/MCPToolDefinition-Input"},{"$ref":"#/components/schemas/FinishTool-Input"},{"$ref":"#/components/schemas/InvokeSkillTool-Input"},{"$ref":"#/components/schemas/SwitchLLMTool-Input"},{"$ref":"#/components/schemas/ThinkTool-Input"},{"$ref":"#/components/schemas/VisionInspectTool-Input"},{"$ref":"#/components/schemas/ClientTool-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/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"},{"$ref":"#/components/schemas/WorkflowTool-Input"},{"$ref":"#/components/schemas/WorkflowToolSet-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__invoke_skill__InvokeSkillTool-Input__1":"#/components/schemas/InvokeSkillTool-Input","openhands__sdk__tool__builtins__switch_llm__SwitchLLMTool-Input__1":"#/components/schemas/SwitchLLMTool-Input","openhands__sdk__tool__builtins__think__ThinkTool-Input__1":"#/components/schemas/ThinkTool-Input","openhands__sdk__tool__builtins__vision_inspect__VisionInspectTool-Input__1":"#/components/schemas/VisionInspectTool-Input","openhands__sdk__tool__client_tool__ClientTool-Input__1":"#/components/schemas/ClientTool-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__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","openhands__tools__workflow__definition__WorkflowTool-Input__1":"#/components/schemas/WorkflowTool-Input","openhands__tools__workflow__definition__WorkflowToolSet-Input__1":"#/components/schemas/WorkflowToolSet-Input"}}},"ToolDefinition-Output":{"oneOf":[{"$ref":"#/components/schemas/MCPToolDefinition-Output"},{"$ref":"#/components/schemas/FinishTool-Output"},{"$ref":"#/components/schemas/InvokeSkillTool-Output"},{"$ref":"#/components/schemas/SwitchLLMTool-Output"},{"$ref":"#/components/schemas/ThinkTool-Output"},{"$ref":"#/components/schemas/VisionInspectTool-Output"},{"$ref":"#/components/schemas/ClientTool-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/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"},{"$ref":"#/components/schemas/WorkflowTool-Output"},{"$ref":"#/components/schemas/WorkflowToolSet-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__invoke_skill__InvokeSkillTool-Output__1":"#/components/schemas/InvokeSkillTool-Output","openhands__sdk__tool__builtins__switch_llm__SwitchLLMTool-Output__1":"#/components/schemas/SwitchLLMTool-Output","openhands__sdk__tool__builtins__think__ThinkTool-Output__1":"#/components/schemas/ThinkTool-Output","openhands__sdk__tool__builtins__vision_inspect__VisionInspectTool-Output__1":"#/components/schemas/VisionInspectTool-Output","openhands__sdk__tool__client_tool__ClientTool-Output__1":"#/components/schemas/ClientTool-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__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","openhands__tools__workflow__definition__WorkflowTool-Output__1":"#/components/schemas/WorkflowTool-Output","openhands__tools__workflow__definition__WorkflowToolSet-Output__1":"#/components/schemas/WorkflowToolSet-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."},"ToolShieldLLMSecurityAnalyzer":{"properties":{"llm":{"$ref":"#/components/schemas/LLM-Input","description":"LLM used as the guardrail. Can be a smaller/cheaper model than the actor LLM; only the model's ability to classify action risk matters."},"history_window":{"type":"integer","title":"History Window","description":"Number of prior actions to include as context.","default":20},"safety_experiences":{"type":"string","title":"Safety Experiences","description":"Pre-generated safety guidelines injected into the guardrail's system prompt.\n- ``\"\"`` (default): bare guardrail -- no experiences. The analyzer still separates actor from judge; it just classifies without distilled tool-specific guidance.\n- Any non-empty string: used as-is. The intended pattern is to call one of the helpers (``default_safety_experiences()``, ``load_safety_experiences(tool_names)``, ``auto_detect_safety_experiences()``) which require the ``[toolshield]`` optional extra (``pip install openhands-sdk[toolshield]``). Callers with their own source of guidelines can pass any custom string.","default":""},"kind":{"type":"string","const":"ToolShieldLLMSecurityAnalyzer","title":"Kind"}},"type":"object","required":["llm"],"title":"ToolShieldLLMSecurityAnalyzer","description":"Evaluate each action via a separate guardrail LLM.\n\nPairs with the existing ``ConfirmRisky`` policy unchanged: this\nanalyzer only *assigns* the risk level; ``ConfirmRisky`` decides\nwhether to pause for user confirmation.\n\nBy default the analyzer runs as a bare guardrail (no distilled\nsafety experiences). To enable the ToolShield seed, install\n``pip install openhands-sdk[toolshield]`` and pass the rendered\nexperiences via the ``safety_experiences`` field -- typically via\none of the helpers (``default_safety_experiences()``,\n``load_safety_experiences(...)``, ``auto_detect_safety_experiences()``).\nTested against ``toolshield>=0.1.3,<0.2``.\n\nNote: ``reasoning_content`` and ``thinking_blocks`` from extended-\nthinking models are deliberately excluded from the guardrail\ncontext. The risk signal lives in the tool call's name and\narguments; including reasoning text would inflate the prompt\nwithout proportional safety gain. Subclasses needing reasoning\nvisibility should override :func:`_format_action_for_guardrail`.\n\nLifecycle: instances maintain a per-conversation deque of recent\nactions (``history_window`` items) for guardrail context. Each\ninstance is intended for SINGLE-CONVERSATION use. Reusing one\nanalyzer instance across multiple conversations will leak action\nhistory between them, which is both a privacy issue (conversation\nA's tool arguments visible in conversation B's guardrail prompt)\nand a correctness issue (the guardrail evaluates conversation B's\nactions against irrelevant history). Construct one analyzer per\nconversation, OR call :meth:`reset_history` at conversation\nboundaries.\n\nThe recent-action-context propagation across analyzers (this one,\n:class:`LLMSecurityAnalyzer`, :class:`GraySwanAnalyzer`) is tracked\nfor convergence in a separate follow-up; until that lands,\nsingle-conversation lifecycle is the contract.\n\nFailure modes are consistent and ensemble-safe -- both an\ninfrastructure error (network, rate limit) and a parse failure\n(the guardrail responded but its output had no parseable\n``RISK:`` label) return ``SecurityRisk.UNKNOWN``. ``ConfirmRisky``\nwith ``confirm_unknown=True`` then pauses for user confirmation,\nmatching the conservative posture without dominating ``max()`` in\nensemble fusion."},"ToolTransformConfig":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"The new name for the tool."},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"The new version for the tool."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The new title of the tool."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"The new description of the tool."},"tags":{"items":{"type":"string"},"type":"array","uniqueItems":true,"title":"Tags","description":"The new tags for the tool."},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"The new meta information for the tool."},"enabled":{"type":"boolean","title":"Enabled","description":"Whether the tool is enabled. If False, the tool will be hidden from clients.","default":true},"arguments":{"additionalProperties":{"$ref":"#/components/schemas/ArgTransformConfig"},"type":"object","title":"Arguments","description":"A dictionary of argument transforms to apply to the tool."}},"additionalProperties":false,"type":"object","title":"ToolTransformConfig","description":"Provides a way to transform a tool."},"TraceMetadataValue":{"anyOf":[{"type":"string"},{"type":"boolean"},{"type":"integer"},{"type":"number"},{"items":{"type":"string"},"type":"array"},{"items":{"type":"boolean"},"type":"array"},{"items":{"type":"integer"},"type":"array"},{"items":{"type":"number"},"type":"array"}]},"TransformingRemoteMCPServer":{"properties":{"url":{"type":"string","title":"Url"},"transport":{"anyOf":[{"type":"string","enum":["http","streamable-http","sse"]},{"type":"null"}],"title":"Transport"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers"},"auth":{"anyOf":[{"type":"string"},{"type":"string","const":"oauth"},{"type":"null"}],"title":"Auth","description":"Either a string representing a Bearer token, the literal \"oauth\" to use OAuth authentication, or an httpx.Auth instance for custom authentication."},"sse_read_timeout":{"anyOf":[{"type":"string","format":"duration"},{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Sse Read Timeout"},"timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timeout"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"authentication":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Authentication"},"tools":{"additionalProperties":{"$ref":"#/components/schemas/ToolTransformConfig"},"type":"object","title":"Tools"},"include_tags":{"anyOf":[{"items":{"type":"string"},"type":"array","uniqueItems":true},{"type":"null"}],"title":"Include Tags","description":"The tags to include in the proxy."},"exclude_tags":{"anyOf":[{"items":{"type":"string"},"type":"array","uniqueItems":true},{"type":"null"}],"title":"Exclude Tags","description":"The tags to exclude in the proxy."}},"additionalProperties":true,"type":"object","required":["url"],"title":"TransformingRemoteMCPServer","description":"A Remote server with tool transforms."},"TransformingStdioMCPServer":{"properties":{"command":{"type":"string","title":"Command"},"args":{"items":{"type":"string"},"type":"array","title":"Args"},"env":{"additionalProperties":true,"type":"object","title":"Env"},"transport":{"type":"string","const":"stdio","title":"Transport","default":"stdio"},"type":{"anyOf":[{"type":"string","const":"stdio"},{"type":"null"}],"title":"Type"},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cwd"},"timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timeout"},"keep_alive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Keep Alive"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"authentication":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Authentication"},"tools":{"additionalProperties":{"$ref":"#/components/schemas/ToolTransformConfig"},"type":"object","title":"Tools"},"include_tags":{"anyOf":[{"items":{"type":"string"},"type":"array","uniqueItems":true},{"type":"null"}],"title":"Include Tags","description":"The tags to include in the proxy."},"exclude_tags":{"anyOf":[{"items":{"type":"string"},"type":"array","uniqueItems":true},{"type":"null"}],"title":"Exclude Tags","description":"The tags to exclude in the proxy."}},"additionalProperties":true,"type":"object","required":["command"],"title":"TransformingStdioMCPServer","description":"A Stdio server with tool transforms."},"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"},"git_full_clone":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Git Full Clone"}},"type":"object","title":"UserAppSettingsResponse","description":"Response model for user app settings."},"UserAppSettingsUpdate":{"properties":{"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"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"},"git_full_clone":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Git Full Clone"}},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent event id in the conversation tree. None for the root, or for legacy events predating the tree (see EventLog's effective-parent rule). Events sharing a parent_id are sibling branches."},"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"},"VerificationSettings":{"properties":{"critic_enabled":{"type":"boolean","title":"Critic Enabled","description":"Enable critic evaluation for the agent.","default":false,"openhands_settings":{"depends_on":[],"label":"Enable critic","prominence":"critical"}},"critic_mode":{"type":"string","enum":["finish_and_message","all_actions"],"title":"Critic Mode","description":"When critic evaluation should run.","default":"finish_and_message","openhands_settings":{"depends_on":["critic_enabled"],"label":"Critic mode","prominence":"minor"}},"enable_iterative_refinement":{"type":"boolean","title":"Enable Iterative Refinement","description":"Automatically retry tasks when critic scores fall below the threshold.","default":false,"openhands_settings":{"depends_on":["critic_enabled"],"label":"Enable iterative refinement","prominence":"critical"}},"critic_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Critic Threshold","description":"Critic success threshold used for iterative refinement.","default":0.6,"openhands_settings":{"depends_on":["critic_enabled","enable_iterative_refinement"],"label":"Critic threshold","prominence":"minor"}},"max_refinement_iterations":{"type":"integer","minimum":1.0,"title":"Max Refinement Iterations","description":"Maximum number of refinement attempts after critic feedback.","default":3,"openhands_settings":{"depends_on":["critic_enabled","enable_iterative_refinement"],"label":"Max refinement iterations","prominence":"minor"}},"critic_server_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Critic Server Url","description":"Override the critic service URL. When None, the APIBasedCritic default is used.","openhands_settings":{"depends_on":["critic_enabled"],"label":"Critic server URL","prominence":"minor"}},"critic_model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Critic Model Name","description":"Override the critic model name. When None, the APIBasedCritic default is used.","openhands_settings":{"depends_on":["critic_enabled"],"label":"Critic model name","prominence":"minor"}},"critic_api_key":{"title":"Critic Api Key","description":"API key used to authenticate with the critic service. When None, the LLM's ``api_key`` is reused, which preserves the auto-configuration path for the All-Hands LLM proxy.","openhands_settings":{"depends_on":["critic_enabled"],"label":"Critic API Key","prominence":"critical"}}},"type":"object","title":"VerificationSettings","description":"Critic and iterative-refinement settings for the agent."},"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"},"VisionInspectAction-Input":{"properties":{"image_index":{"type":"integer","minimum":0.0,"title":"Image Index","description":"Zero-based index of the image to inspect from the latest user message."},"question":{"type":"string","minLength":1,"title":"Question","description":"Question to ask the vision model about the selected image."},"profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Name","description":"Optional saved vision-capable LLM profile name. If omitted, the first available vision profile listed in the tool description is used."},"kind":{"type":"string","const":"VisionInspectAction","title":"Kind"}},"additionalProperties":false,"type":"object","required":["image_index","question"],"title":"VisionInspectAction","description":"Action for asking a vision model about an attached image."},"VisionInspectAction-Output":{"properties":{"image_index":{"type":"integer","minimum":0.0,"title":"Image Index","description":"Zero-based index of the image to inspect from the latest user message."},"question":{"type":"string","minLength":1,"title":"Question","description":"Question to ask the vision model about the selected image."},"profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Name","description":"Optional saved vision-capable LLM profile name. If omitted, the first available vision profile listed in the tool description is used."},"kind":{"type":"string","const":"VisionInspectAction","title":"Kind"}},"additionalProperties":false,"type":"object","required":["image_index","question","kind"],"title":"VisionInspectAction","description":"Action for asking a vision model about an attached image."},"VisionInspectObservation-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},"image_index":{"type":"integer","title":"Image Index","description":"Image index that was inspected."},"question":{"type":"string","title":"Question","description":"Question asked of the vision model."},"profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Name","description":"Vision-capable profile used for inspection."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Vision-capable model used for inspection."},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"Vision-capable LLM endpoint used for inspection."},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer","description":"Text answer returned by the vision model."},"kind":{"type":"string","const":"VisionInspectObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["image_index","question"],"title":"VisionInspectObservation","description":"Observation returned after a vision model inspects an image."},"VisionInspectObservation-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},"image_index":{"type":"integer","title":"Image Index","description":"Image index that was inspected."},"question":{"type":"string","title":"Question","description":"Question asked of the vision model."},"profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Name","description":"Vision-capable profile used for inspection."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Vision-capable model used for inspection."},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url","description":"Vision-capable LLM endpoint used for inspection."},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer","description":"Text answer returned by the vision model."},"kind":{"type":"string","const":"VisionInspectObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["image_index","question","kind"],"title":"VisionInspectObservation","description":"Observation returned after a vision model inspects an image."},"VisionInspectTool-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":"VisionInspectTool","title":"Kind"}},"type":"object","required":["description","action_type"],"title":"VisionInspectTool","description":"Tool for one-off image inspection through a saved vision profile."},"VisionInspectTool-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":"VisionInspectTool","title":"Kind"},"title":{"type":"string","title":"Title","readOnly":true}},"type":"object","required":["description","action_type","kind","title"],"title":"VisionInspectTool","description":"Tool for one-off image inspection through a saved vision profile."},"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"},"gitlab_enabled":{"type":"boolean","title":"Gitlab Enabled","default":false},"provider_default_hosts":{"additionalProperties":{"type":"string"},"type":"object","title":"Provider Default Hosts"},"slack_enabled":{"type":"boolean","title":"Slack Enabled","default":false},"email_enabled":{"type":"boolean","title":"Email Enabled","default":false},"email_change_enabled":{"type":"boolean","title":"Email Change Enabled","default":true},"acp_providers":{"items":{"$ref":"#/components/schemas/ACPProviderConfig"},"type":"array","title":"Acp Providers"},"jira_dc_oauth_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jira Dc Oauth Host"},"jira_dc_service_account_managed":{"type":"boolean","title":"Jira Dc Service Account Managed","default":false},"jira_dc_service_account_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jira Dc Service Account Email"},"jira_dc_service_account_config_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jira Dc Service Account Config Error"},"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},"hide_personal_workspaces":{"type":"boolean","title":"Hide Personal Workspaces","default":false},"allow_user_llm_configuration":{"type":"boolean","title":"Allow User Llm Configuration","default":true},"enable_acp":{"type":"boolean","title":"Enable Acp","default":true},"deployment_mode":{"anyOf":[{"type":"string","enum":["cloud","self_hosted"]},{"type":"null"}],"title":"Deployment Mode"},"enable_onboarding":{"type":"boolean","title":"Enable Onboarding","default":false},"enable_automations":{"type":"boolean","title":"Enable Automations","default":true},"enable_agent_canvas_banner":{"type":"boolean","title":"Enable Agent Canvas Banner","default":false}},"type":"object","title":"WebClientFeatureFlags"},"WorkflowAction-Input":{"properties":{"name":{"type":"string","title":"Name","description":"A short name for this workflow run."},"script":{"type":"string","title":"Script","description":"Python workflow script to run. It must define `async def main(wf):` and coordinate work only through the provided `wf` object."},"max_concurrency":{"type":"integer","maximum":64.0,"minimum":1.0,"title":"Max Concurrency","description":"Maximum number of sub-agent tasks to run concurrently. Consider 2–4 for LLM-heavy workflows to avoid hitting API rate limits.","default":8},"kind":{"type":"string","const":"WorkflowAction","title":"Kind"}},"additionalProperties":false,"type":"object","required":["name","script"],"title":"WorkflowAction","description":"Schema for running a Python dynamic workflow script."},"WorkflowAction-Output":{"properties":{"name":{"type":"string","title":"Name","description":"A short name for this workflow run."},"script":{"type":"string","title":"Script","description":"Python workflow script to run. It must define `async def main(wf):` and coordinate work only through the provided `wf` object."},"max_concurrency":{"type":"integer","maximum":64.0,"minimum":1.0,"title":"Max Concurrency","description":"Maximum number of sub-agent tasks to run concurrently. Consider 2–4 for LLM-heavy workflows to avoid hitting API rate limits.","default":8},"kind":{"type":"string","const":"WorkflowAction","title":"Kind"}},"additionalProperties":false,"type":"object","required":["name","script","kind"],"title":"WorkflowAction","description":"Schema for running a Python dynamic workflow script."},"WorkflowObservation-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},"name":{"type":"string","title":"Name","description":"The workflow name that was executed."},"status":{"type":"string","enum":["completed","error"],"title":"Status","description":"The workflow execution status."},"kind":{"type":"string","const":"WorkflowObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["name","status"],"title":"WorkflowObservation","description":"Observation from a dynamic workflow run."},"WorkflowObservation-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},"name":{"type":"string","title":"Name","description":"The workflow name that was executed."},"status":{"type":"string","enum":["completed","error"],"title":"Status","description":"The workflow execution status."},"kind":{"type":"string","const":"WorkflowObservation","title":"Kind"}},"additionalProperties":false,"type":"object","required":["name","status","kind"],"title":"WorkflowObservation","description":"Observation from a dynamic workflow run."},"WorkflowTool-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":"WorkflowTool","title":"Kind"}},"type":"object","required":["description","action_type"],"title":"WorkflowTool","description":"Low-level tool for explicit executor injection.\n\nPrefer ``WorkflowToolSet`` for standard SDK auto-create usage.\nUse ``WorkflowTool`` when you need to inject a custom executor\n(e.g., in tests or extensions)."},"WorkflowTool-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":"WorkflowTool","title":"Kind"},"title":{"type":"string","title":"Title","readOnly":true}},"type":"object","required":["description","action_type","kind","title"],"title":"WorkflowTool","description":"Low-level tool for explicit executor injection.\n\nPrefer ``WorkflowToolSet`` for standard SDK auto-create usage.\nUse ``WorkflowTool`` when you need to inject a custom executor\n(e.g., in tests or extensions)."},"WorkflowToolSet-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":"WorkflowToolSet","title":"Kind"}},"type":"object","required":["description","action_type"],"title":"WorkflowToolSet","description":"Tool set that creates the dynamic workflow tool."},"WorkflowToolSet-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":"WorkflowToolSet","title":"Kind"},"title":{"type":"string","title":"Title","readOnly":true}},"type":"object","required":["description","action_type","kind","title"],"title":"WorkflowToolSet","description":"Tool set that creates the dynamic workflow tool."},"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__app_server__settings__settings_models__MarketplaceRegistration":{"properties":{"name":{"type":"string","title":"Name","description":"Identifier for this marketplace registration"},"source":{"type":"string","title":"Source","description":"Marketplace source: 'github:owner/repo', 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 containing the marketplace (e.g., 'marketplaces/internal' for monorepos). Only relevant for git sources, not local paths."},"auto_load":{"type":"boolean","title":"Auto Load","description":"Auto-load behavior for this marketplace. True = load all plugins at conversation start. False = registered for resolution but not auto-loaded.","default":false},"scope":{"anyOf":[{"$ref":"#/components/schemas/MarketplaceScope"},{"type":"null"}],"description":"Scope of this marketplace registration. Set automatically by backend based on storage layer: \"instance\" for system defaults, \"org\" for organization-level, \"personal\" for user-level. Frontend should NOT send this field in save requests."}},"type":"object","required":["name","source"],"title":"MarketplaceRegistration","description":"Registration for a plugin marketplace.\n\nRepresents a marketplace that can be registered for plugin resolution.\nMarketplaces can be auto-loaded (plugins loaded at conversation start)\nor registered only (available for explicit plugin references).\n\nWire-compatible with ``openhands.sdk.marketplace.MarketplaceRegistration``\n(the model the agent-server ``/api/skills`` endpoint consumes): dumping this\nmodel with ``exclude={'scope'}`` yields exactly the SDK model's fields\n(``name``/``source``/``ref``/``repo_path``/``auto_load``), and our ``bool``\n``auto_load`` and stricter field validators are a subset of what the SDK\naccepts, so any value we produce validates upstream.\n\nThis is intentionally kept as a separate model rather than importing the SDK\none, because it carries a backend-only ``scope`` (set per storage layer for\nAPI responses/UI, stripped at the wire boundary and re-derived during\ncomposition) and enforces input validation the SDK model does not (source /\n``repo_path`` traversal guards, name format).\n\nExamples:\n    >>> # Auto-load all plugins from a marketplace\n    >>> MarketplaceRegistration(\n    ...     name=\"public\",\n    ...     source=\"github:OpenHands/skills\",\n    ...     auto_load=True\n    ... )\n\n    >>> # Register marketplace without auto-loading\n    >>> MarketplaceRegistration(\n    ...     name=\"experimental\",\n    ...     source=\"github:acme/experimental\"\n    ... )\n\n    >>> # Marketplace in monorepo subdirectory\n    >>> MarketplaceRegistration(\n    ...     name=\"team\",\n    ...     source=\"github:acme/monorepo\",\n    ...     repo_path=\"marketplaces/internal\",\n    ...     auto_load=True\n    ... )"},"openhands__app_server__settings__settings_router__ActivateProfileResponse":{"properties":{"name":{"type":"string","title":"Name"},"message":{"type":"string","title":"Message"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"type":"object","required":["name","message"],"title":"ActivateProfileResponse","description":"Response body for activating a profile."},"openhands__app_server__settings__settings_router__ProfileDetailResponse":{"properties":{"name":{"type":"string","title":"Name"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"api_key_set":{"type":"boolean","title":"Api Key Set","default":false}},"type":"object","required":["name","config"],"title":"ProfileDetailResponse","description":"Response body for fetching a single profile.\n\n``config.api_key`` is always ``None`` in the response; the sibling\n``api_key_set`` bool reports whether a key is stored. This matches\nthe ``/api/v1/settings`` convention and prevents the \"GET → edit →\nPOST\" flow from poisoning the stored key with a mask string."},"openhands__app_server__settings__settings_router__ProfileInfo":{"properties":{"name":{"type":"string","title":"Name"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"api_key_set":{"type":"boolean","title":"Api Key Set","default":false}},"type":"object","required":["name"],"title":"ProfileInfo","description":"Profile summary returned by the list endpoint.\n\n``api_key_set`` follows the same convention as ``llm_api_key_set`` on\nthe main settings response — the frontend uses it to show \"key stored\"\nwithout exposing (or accidentally round-tripping) a mask string."},"openhands__app_server__settings__settings_router__ProfileListResponse":{"properties":{"profiles":{"items":{"$ref":"#/components/schemas/openhands__app_server__settings__settings_router__ProfileInfo"},"type":"array","title":"Profiles"},"active_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Profile"}},"type":"object","required":["profiles"],"title":"ProfileListResponse","description":"Response body for listing profiles."},"openhands__app_server__settings__settings_router__ProfileMutationResponse":{"properties":{"name":{"type":"string","title":"Name"},"message":{"type":"string","title":"Message"}},"type":"object","required":["name","message"],"title":"ProfileMutationResponse","description":"Response body for save/delete operations."},"openhands__app_server__settings__settings_router__RenameProfileRequest":{"properties":{"new_name":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9._-]{1,64}$","title":"New Name"}},"type":"object","required":["new_name"],"title":"RenameProfileRequest","description":"Request body for renaming a profile.\n\n``new_name`` is validated against the same regex as the path-level\n``{name}`` param so the two stay in sync."},"openhands__app_server__settings__settings_router__SaveProfileRequest":{"properties":{"include_secrets":{"type":"boolean","title":"Include Secrets","default":true},"llm":{"anyOf":[{"$ref":"#/components/schemas/StrictLLM"},{"type":"null"}]},"preserve_existing_api_key":{"type":"boolean","title":"Preserve Existing Api Key","default":false}},"type":"object","title":"SaveProfileRequest","description":"Request body for saving a profile.\n\nIf ``llm`` is provided, it is used as the profile config; otherwise the\ncurrent ``agent_settings.llm`` is saved. The ``llm`` field is typed as\n:class:`StrictLLM`, which forbids unknown keys — so a typo like\n``{\"llm\": {\"custom_header\": \"x\"}}`` returns 422 instead of being silently\ndropped.\n\n**Security note:** when ``llm.api_key`` is included in the request body,\nit is transmitted in plaintext over the wire and present in any request\nlog or error trace that captures request bodies. ``SecretStr`` masks it\nin Pydantic reprs, but callers and operators should still avoid logging\nraw request bodies on this endpoint."},"openhands__sdk__marketplace__registration__MarketplaceRegistration":{"properties":{"name":{"type":"string","title":"Name","description":"Identifier for this marketplace registration"},"source":{"type":"string","title":"Source","description":"Marketplace source: 'github:owner/repo', git URL, or local path"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref","description":"Optional branch, tag, or commit for git sources"},"repo_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repo Path","description":"Subdirectory path within the git repository containing the marketplace. Only relevant for git sources."},"auto_load":{"anyOf":[{"type":"boolean"},{"items":{"type":"string"},"type":"array"}],"title":"Auto Load","description":"Whether to load marketplace plugins and standalone skills at conversation start. Use True for all, False or [] for none, or a list of plugin/skill names for selective loading.","default":false}},"type":"object","required":["name","source"],"title":"MarketplaceRegistration","description":"Registration for a marketplace source used for plugin resolution."},"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.<module>` 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"},"server__routes__org_profiles__ActivateProfileResponse":{"properties":{"name":{"type":"string","title":"Name"},"message":{"type":"string","title":"Message"},"llm":{"additionalProperties":true,"type":"object","title":"Llm"}},"type":"object","required":["name","message","llm"],"title":"ActivateProfileResponse","description":"Response for activating a profile."},"server__routes__org_profiles__ProfileDetailResponse":{"properties":{"name":{"type":"string","title":"Name"},"llm":{"additionalProperties":true,"type":"object","title":"Llm"}},"type":"object","required":["name","llm"],"title":"ProfileDetailResponse","description":"Response for getting a single profile's details."},"server__routes__org_profiles__ProfileInfo":{"properties":{"name":{"type":"string","title":"Name"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"api_key_set":{"type":"boolean","title":"Api Key Set"}},"type":"object","required":["name","model","base_url","api_key_set"],"title":"ProfileInfo","description":"Summary info for a profile (no secrets)."},"server__routes__org_profiles__ProfileListResponse":{"properties":{"profiles":{"items":{"$ref":"#/components/schemas/server__routes__org_profiles__ProfileInfo"},"type":"array","title":"Profiles"},"active_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Profile"}},"type":"object","required":["profiles","active_profile"],"title":"ProfileListResponse","description":"Response for listing profiles."},"server__routes__org_profiles__ProfileMutationResponse":{"properties":{"name":{"type":"string","title":"Name"},"message":{"type":"string","title":"Message"}},"type":"object","required":["name","message"],"title":"ProfileMutationResponse","description":"Response for profile mutations (save, delete, rename)."},"server__routes__org_profiles__RenameProfileRequest":{"properties":{"new_name":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$","title":"New Name"}},"type":"object","required":["new_name"],"title":"RenameProfileRequest","description":"Request body for renaming a profile.\n\n``new_name`` is constrained to ``PROFILE_NAME_PATTERN`` because\n``rename_llm_profile`` (the SDK FK-cascade helper backing this endpoint)\nvalidates the new name against that same pattern before renaming and\nrepointing any referencing Agent Profiles — a name outside it always 422s\nthere. Declaring the constraint here makes the schema honest and gives a\nfield-level 422 instead of one raised deep inside the handler. ``save``\n(create/update) is intentionally left permissive: it never calls the FK\nhelper, so it has no such requirement."},"server__routes__org_profiles__SaveProfileRequest":{"properties":{"include_secrets":{"type":"boolean","title":"Include Secrets","default":true},"llm":{"anyOf":[{"$ref":"#/components/schemas/StrictLLM"},{"type":"null"}]},"preserve_existing_api_key":{"type":"boolean","title":"Preserve Existing Api Key","default":false}},"type":"object","title":"SaveProfileRequest","description":"Request body for saving a profile."}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-Access-Token"}}}}