diff --git a/README.md b/README.md index a849d2e..9137b58 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,9 @@ Generated A2APack agent for Tasks API. - Source OpenAPI: https://tasks.a2acloud.io/openapi.json -- Generated operations: 34 +- Generated operations: 33 - Main skill: `auto` +- Routing mode: direct operation skills The generated code is intentionally editable. Tune prompts, operation grouping, auth names, and safety policy before publishing serious agents. diff --git a/agent.py b/agent.py index d515cf4..59a7b4b 100644 --- a/agent.py +++ b/agent.py @@ -3,6 +3,7 @@ from __future__ import annotations import base64 import json import re +from pathlib import Path from typing import Any import httpx @@ -26,11 +27,15 @@ from a2a_pack import ( DEFAULT_BASE_URL = "https://tasks.a2acloud.io" -OPERATIONS = json.loads("{\n \"create_crm_entity\": {\n \"description\": \"Create Crm Entity\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_crm_entity\",\n \"parameters\": [],\n \"path\": \"/api/crm/entities\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmEntityCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_crm_entity\",\n \"summary\": \"Create Crm Entity\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"create_crm_pipeline\": {\n \"description\": \"Create Crm Pipeline\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_crm_pipeline\",\n \"parameters\": [],\n \"path\": \"/api/crm/pipelines\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_crm_pipeline\",\n \"summary\": \"Create Crm Pipeline\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"create_crm_pipeline_entry\": {\n \"description\": \"Create Crm Pipeline Entry\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_crm_pipeline_entry\",\n \"parameters\": [],\n \"path\": \"/api/crm/pipeline-entries\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineEntryCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_crm_pipeline_entry\",\n \"summary\": \"Create Crm Pipeline Entry\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"create_crm_pipeline_stage\": {\n \"description\": \"Create Crm Pipeline Stage\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_crm_pipeline_stage\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}/stages\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineStageCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_crm_pipeline_stage\",\n \"summary\": \"Create Crm Pipeline Stage\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"create_epic\": {\n \"description\": \"Create Epic\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_epic\",\n \"parameters\": [],\n \"path\": \"/api/epics\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/EpicCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_epic\",\n \"summary\": \"Create Epic\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"create_task\": {\n \"description\": \"Create Task\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_task\",\n \"parameters\": [],\n \"path\": \"/api/tasks\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/TaskCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_task\",\n \"summary\": \"Create Task\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"delete_crm_entity\": {\n \"description\": \"Delete Crm Entity\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_entity\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entity_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entity Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/entities/{entity_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_crm_entity\",\n \"summary\": \"Delete Crm Entity\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"delete_crm_pipeline\": {\n \"description\": \"Delete Crm Pipeline\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_pipeline\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_crm_pipeline\",\n \"summary\": \"Delete Crm Pipeline\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"delete_crm_pipeline_entry\": {\n \"description\": \"Delete Crm Pipeline Entry\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_pipeline_entry\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entry_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entry Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-entries/{entry_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_crm_pipeline_entry\",\n \"summary\": \"Delete Crm Pipeline Entry\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"delete_crm_pipeline_stage\": {\n \"description\": \"Delete Crm Pipeline Stage\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_pipeline_stage\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"stage_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Stage Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-stages/{stage_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_crm_pipeline_stage\",\n \"summary\": \"Delete Crm Pipeline Stage\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"delete_epic\": {\n \"description\": \"Delete Epic\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_epic\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"epic_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Epic Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/epics/{epic_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_epic\",\n \"summary\": \"Delete Epic\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"delete_task\": {\n \"description\": \"Delete Task\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_task\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"task_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Task Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/tasks/{task_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_task\",\n \"summary\": \"Delete Task\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"get_crm_entity\": {\n \"description\": \"Get Crm Entity\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_entity\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entity_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entity Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/entities/{entity_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_crm_entity\",\n \"summary\": \"Get Crm Entity\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"get_crm_pipeline\": {\n \"description\": \"Get Crm Pipeline\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_pipeline\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_crm_pipeline\",\n \"summary\": \"Get Crm Pipeline\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"get_crm_pipeline_entry\": {\n \"description\": \"Get Crm Pipeline Entry\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_pipeline_entry\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entry_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entry Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-entries/{entry_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_crm_pipeline_entry\",\n \"summary\": \"Get Crm Pipeline Entry\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"get_crm_pipeline_stage\": {\n \"description\": \"Get Crm Pipeline Stage\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_pipeline_stage\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"stage_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Stage Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-stages/{stage_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_crm_pipeline_stage\",\n \"summary\": \"Get Crm Pipeline Stage\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"get_epic\": {\n \"description\": \"Get Epic\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_epic\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"epic_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Epic Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/epics/{epic_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_epic\",\n \"summary\": \"Get Epic\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"get_fuck_you\": {\n \"description\": \"Get Fuck You\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_fuck_you\",\n \"parameters\": [],\n \"path\": \"/api/fuck-you\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_fuck_you\",\n \"summary\": \"Get Fuck You\",\n \"tags\": [\n \"Utility\"\n ]\n },\n \"get_task\": {\n \"description\": \"Get Task\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_task\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"task_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Task Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/tasks/{task_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_task\",\n \"summary\": \"Get Task\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"get_tasks_health\": {\n \"description\": \"Healthz\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_tasks_health\",\n \"parameters\": [],\n \"path\": \"/healthz\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_tasks_health\",\n \"summary\": \"Healthz\",\n \"tags\": [\n \"Health\"\n ]\n },\n \"list_crm_entities\": {\n \"description\": \"List Crm Entities\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_crm_entities\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"kind\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 32,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Kind\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/crm/entities\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_crm_entities\",\n \"summary\": \"List Crm Entities\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"list_crm_pipeline_entries\": {\n \"description\": \"List Crm Pipeline Entries\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_crm_pipeline_entries\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"pipeline_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Pipeline Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"stage_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Stage Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"entity_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Entity Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"active\",\n \"won\",\n \"lost\",\n \"archived\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-entries\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_crm_pipeline_entries\",\n \"summary\": \"List Crm Pipeline Entries\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"list_crm_pipeline_stages\": {\n \"description\": \"List Crm Pipeline Stages\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_crm_pipeline_stages\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}/stages\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_crm_pipeline_stages\",\n \"summary\": \"List Crm Pipeline Stages\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"list_crm_pipelines\": {\n \"description\": \"List Crm Pipelines\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_crm_pipelines\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"kind\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 32,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Kind\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"entity_kind\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 32,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Entity Kind\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_crm_pipelines\",\n \"summary\": \"List Crm Pipelines\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"list_epic_tasks\": {\n \"description\": \"List Epic Tasks\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_epic_tasks\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"epic_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Epic Id\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"todo\",\n \"in_progress\",\n \"done\",\n \"canceled\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"due_before\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Due Before\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/epics/{epic_id}/tasks\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_epic_tasks\",\n \"summary\": \"List Epic Tasks\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"list_epics\": {\n \"description\": \"List Epics\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_epics\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"todo\",\n \"in_progress\",\n \"done\",\n \"canceled\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"due_before\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Due Before\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/epics\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_epics\",\n \"summary\": \"List Epics\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"list_tasks\": {\n \"description\": \"List Tasks\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_tasks\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"todo\",\n \"in_progress\",\n \"done\",\n \"canceled\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"due_before\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Due Before\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"epic_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Epic Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"crm_entity_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Crm Entity Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"crm_pipeline_entry_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Crm Pipeline Entry Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/tasks\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_tasks\",\n \"summary\": \"List Tasks\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"search_tasks\": {\n \"description\": \"Search Tasks\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"search_tasks\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"query\",\n \"required\": true,\n \"schema\": {\n \"maxLength\": 500,\n \"minLength\": 1,\n \"title\": \"Query\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"todo\",\n \"in_progress\",\n \"done\",\n \"canceled\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"due_before\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Due Before\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"epic_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Epic Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"crm_entity_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Crm Entity Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"crm_pipeline_entry_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Crm Pipeline Entry Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"maximum\": 50,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"score_threshold\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Score Threshold\"\n }\n }\n ],\n \"path\": \"/api/tasks/search\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"search_tasks\",\n \"summary\": \"Search Tasks\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"update_crm_entity\": {\n \"description\": \"Update Crm Entity\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_crm_entity\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entity_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entity Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/entities/{entity_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmEntityUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_crm_entity\",\n \"summary\": \"Update Crm Entity\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"update_crm_pipeline\": {\n \"description\": \"Update Crm Pipeline\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_crm_pipeline\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_crm_pipeline\",\n \"summary\": \"Update Crm Pipeline\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"update_crm_pipeline_entry\": {\n \"description\": \"Update Crm Pipeline Entry\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_crm_pipeline_entry\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entry_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entry Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-entries/{entry_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineEntryUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_crm_pipeline_entry\",\n \"summary\": \"Update Crm Pipeline Entry\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"update_crm_pipeline_stage\": {\n \"description\": \"Update Crm Pipeline Stage\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_crm_pipeline_stage\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"stage_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Stage Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-stages/{stage_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineStageUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_crm_pipeline_stage\",\n \"summary\": \"Update Crm Pipeline Stage\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"update_epic\": {\n \"description\": \"Update Epic\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_epic\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"epic_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Epic Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/epics/{epic_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/EpicUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_epic\",\n \"summary\": \"Update Epic\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"update_task\": {\n \"description\": \"Update Task\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_task\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"task_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Task Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/tasks/{task_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/TaskUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_task\",\n \"summary\": \"Update Task\",\n \"tags\": [\n \"Tasks\"\n ]\n }\n}") +OPERATIONS = json.loads("{\n \"create_crm_entity\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create Crm Entity\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_crm_entity\",\n \"parameters\": [],\n \"path\": \"/api/crm/entities\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmEntityCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_crm_entity\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Create Crm Entity\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"create_crm_pipeline\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create Crm Pipeline\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_crm_pipeline\",\n \"parameters\": [],\n \"path\": \"/api/crm/pipelines\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_crm_pipeline\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Create Crm Pipeline\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"create_crm_pipeline_entry\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create Crm Pipeline Entry\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_crm_pipeline_entry\",\n \"parameters\": [],\n \"path\": \"/api/crm/pipeline-entries\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineEntryCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_crm_pipeline_entry\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Create Crm Pipeline Entry\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"create_crm_pipeline_stage\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create Crm Pipeline Stage\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_crm_pipeline_stage\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}/stages\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineStageCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_crm_pipeline_stage\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Create Crm Pipeline Stage\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"create_epic\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create Epic\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_epic\",\n \"parameters\": [],\n \"path\": \"/api/epics\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/EpicCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_epic\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Create Epic\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"create_task\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create Task\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_task\",\n \"parameters\": [],\n \"path\": \"/api/tasks\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/TaskCreate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"create_task\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Create Task\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"delete_crm_entity\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete Crm Entity\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_entity\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entity_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entity Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/entities/{entity_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_crm_entity\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Delete Crm Entity\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"delete_crm_pipeline\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete Crm Pipeline\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_pipeline\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_crm_pipeline\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Delete Crm Pipeline\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"delete_crm_pipeline_entry\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete Crm Pipeline Entry\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_pipeline_entry\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entry_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entry Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-entries/{entry_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_crm_pipeline_entry\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Delete Crm Pipeline Entry\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"delete_crm_pipeline_stage\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete Crm Pipeline Stage\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_pipeline_stage\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"stage_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Stage Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-stages/{stage_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_crm_pipeline_stage\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Delete Crm Pipeline Stage\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"delete_epic\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete Epic\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_epic\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"epic_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Epic Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/epics/{epic_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_epic\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Delete Epic\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"delete_task\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete Task\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_task\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"task_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Task Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/tasks/{task_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"delete_task\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Delete Task\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"get_crm_entity\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get Crm Entity\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_entity\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entity_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entity Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/entities/{entity_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_crm_entity\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Get Crm Entity\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"get_crm_pipeline\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get Crm Pipeline\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_pipeline\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_crm_pipeline\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Get Crm Pipeline\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"get_crm_pipeline_entry\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get Crm Pipeline Entry\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_pipeline_entry\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entry_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entry Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-entries/{entry_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_crm_pipeline_entry\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Get Crm Pipeline Entry\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"get_crm_pipeline_stage\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get Crm Pipeline Stage\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_pipeline_stage\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"stage_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Stage Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-stages/{stage_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_crm_pipeline_stage\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Get Crm Pipeline Stage\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"get_epic\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get Epic\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_epic\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"epic_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Epic Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/epics/{epic_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_epic\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Get Epic\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"get_task\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get Task\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_task\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"task_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Task Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/tasks/{task_id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"get_task\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Get Task\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"get_tasks_health\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Healthz\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_tasks_health\",\n \"parameters\": [],\n \"path\": \"/healthz\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_tasks_health\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Healthz\",\n \"tags\": [\n \"Health\"\n ]\n },\n \"list_crm_entities\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List Crm Entities\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_crm_entities\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"kind\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 32,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Kind\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/crm/entities\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_crm_entities\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"List Crm Entities\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"list_crm_pipeline_entries\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List Crm Pipeline Entries\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_crm_pipeline_entries\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"pipeline_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Pipeline Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"stage_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Stage Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"entity_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Entity Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"active\",\n \"won\",\n \"lost\",\n \"archived\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-entries\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_crm_pipeline_entries\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"List Crm Pipeline Entries\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"list_crm_pipeline_stages\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List Crm Pipeline Stages\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_crm_pipeline_stages\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}/stages\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_crm_pipeline_stages\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"List Crm Pipeline Stages\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"list_crm_pipelines\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List Crm Pipelines\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_crm_pipelines\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"kind\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 32,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Kind\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"entity_kind\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 32,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Entity Kind\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_crm_pipelines\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"List Crm Pipelines\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"list_epic_tasks\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List Epic Tasks\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_epic_tasks\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"epic_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Epic Id\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"todo\",\n \"in_progress\",\n \"done\",\n \"canceled\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"due_before\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Due Before\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/epics/{epic_id}/tasks\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_epic_tasks\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"List Epic Tasks\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"list_epics\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List Epics\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_epics\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"todo\",\n \"in_progress\",\n \"done\",\n \"canceled\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"due_before\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Due Before\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/epics\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_epics\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"List Epics\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"list_tasks\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List Tasks\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list_tasks\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"todo\",\n \"in_progress\",\n \"done\",\n \"canceled\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"q\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Q\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"due_before\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Due Before\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"epic_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Epic Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"crm_entity_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Crm Entity Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"crm_pipeline_entry_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Crm Pipeline Entry Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 200,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/api/tasks\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"list_tasks\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"List Tasks\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"search_tasks\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Search Tasks\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"search_tasks\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"query\",\n \"required\": true,\n \"schema\": {\n \"maxLength\": 500,\n \"minLength\": 1,\n \"title\": \"Query\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"todo\",\n \"in_progress\",\n \"done\",\n \"canceled\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Status\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"due_before\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Due Before\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"epic_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Epic Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"crm_entity_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Crm Entity Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"crm_pipeline_entry_id\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maxLength\": 36,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Crm Pipeline Entry Id\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"maximum\": 50,\n \"minimum\": 1,\n \"title\": \"Limit\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"minimum\": 0,\n \"title\": \"Offset\",\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"score_threshold\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Score Threshold\"\n }\n }\n ],\n \"path\": \"/api/tasks/search\",\n \"request_body\": null,\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"search_tasks\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Search Tasks\",\n \"tags\": [\n \"Tasks\"\n ]\n },\n \"update_crm_entity\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update Crm Entity\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_crm_entity\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entity_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entity Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/entities/{entity_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmEntityUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_crm_entity\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Update Crm Entity\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"update_crm_pipeline\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update Crm Pipeline\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_crm_pipeline\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"pipeline_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Pipeline Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipelines/{pipeline_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_crm_pipeline\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Update Crm Pipeline\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"update_crm_pipeline_entry\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update Crm Pipeline Entry\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_crm_pipeline_entry\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"entry_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Entry Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-entries/{entry_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineEntryUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_crm_pipeline_entry\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Update Crm Pipeline Entry\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"update_crm_pipeline_stage\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update Crm Pipeline Stage\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_crm_pipeline_stage\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"stage_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Stage Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/crm/pipeline-stages/{stage_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CrmPipelineStageUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_crm_pipeline_stage\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Update Crm Pipeline Stage\",\n \"tags\": [\n \"CRM\"\n ]\n },\n \"update_epic\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update Epic\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_epic\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"epic_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Epic Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/epics/{epic_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/EpicUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_epic\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Update Epic\",\n \"tags\": [\n \"Epics\"\n ]\n },\n \"update_task\": {\n \"base_url\": \"https://tasks.a2acloud.io\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update Task\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_task\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"task_id\",\n \"required\": true,\n \"schema\": {\n \"title\": \"Task Id\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api/tasks/{task_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/TaskUpdate\"\n },\n \"security\": [\n {\n \"bearerAuth\": []\n },\n {\n \"apiKeyAuth\": []\n }\n ],\n \"skill_name\": \"update_task\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://tasks.a2acloud.io/openapi.json\",\n \"source_title\": \"Tasks API\",\n \"summary\": \"Update Task\",\n \"tags\": [\n \"Tasks\"\n ]\n }\n}") +OPERATION_GROUPS = json.loads("[]") ROOT_SECURITY = json.loads("[]") SECURITY_SCHEMES = json.loads("{\n \"apiKeyAuth\": {\n \"description\": \"Use the configured `TASKS_API_KEY` value.\",\n \"in\": \"header\",\n \"name\": \"x-api-key\",\n \"type\": \"apiKey\"\n },\n \"bearerAuth\": {\n \"description\": \"Use `Authorization: Bearer $TASKS_API_KEY`.\",\n \"scheme\": \"bearer\",\n \"type\": \"http\"\n }\n}") SECURITY_FIELDS = json.loads("{\n \"apiKeyAuth\": {\n \"field\": \"X_API_KEY\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"x-api-key\"\n },\n \"bearerAuth\": {\n \"field\": \"BEARERAUTH_TOKEN\",\n \"kind\": \"http\",\n \"scheme\": \"bearer\"\n }\n}") PATH_PARAMETER_RE = re.compile(r"{([^}/]+)}") +SOURCE_ROOT = Path(globals().get("__file__", "agent.py")).resolve().parent +SOURCE_SKILLS_DIR = SOURCE_ROOT / "skills" +RUNTIME_SKILLS_DIR = ".deepagents/openapi-skills/" class OperationInput(BaseModel): @@ -67,6 +72,8 @@ class TasksApi(A2AAgent): "operation_count": len(OPERATIONS), "default_base_url": DEFAULT_BASE_URL, "source_openapi_url": 'https://tasks.a2acloud.io/openapi.json', + "source_openapi_urls": ['https://tasks.a2acloud.io/openapi.json'], + "server_urls": ['https://tasks.a2acloud.io'], "regenerable": True, "security_schemes": list(SECURITY_SCHEMES), } @@ -103,25 +110,6 @@ class TasksApi(A2AAgent): "messages": [_message_to_dict(message) for message in messages[-8:]], } - @skill( - name="get_fuck_you", - description="GET /api/fuck-you - Get Fuck You", - tags=('Utility',), - timeout_seconds=60, - ) - async def get_fuck_you( - self, - ctx: RunContext, - parameters: dict[str, Any] | None = None, - body: Any | None = None, - ) -> dict[str, Any]: - return await self._request( - ctx, - "get_fuck_you", - parameters=parameters or {}, - body=body, - ) - @skill( name="get_tasks_health", description="GET /healthz - Healthz", @@ -749,9 +737,34 @@ class TasksApi(A2AAgent): body=body, ) - def _operation_tools(self, ctx: RunContext) -> list[StructuredTool]: + def _operation_subagents(self, ctx: RunContext, skills_root: str) -> list[dict[str, Any]]: + subagents: list[dict[str, Any]] = [] + for group in OPERATION_GROUPS: + skill_path = ( + f"{skills_root}{group['skill_dir']}/" + if skills_root + else "" + ) + subagent = { + "name": group["subagent_name"], + "description": group["description"], + "system_prompt": self._subagent_prompt(group), + "tools": self._operation_tools(ctx, set(group["operation_ids"])), + } + if skill_path: + subagent["skills"] = [skill_path] + subagents.append(subagent) + return subagents + + def _operation_tools( + self, + ctx: RunContext, + operation_ids: set[str] | None = None, + ) -> list[StructuredTool]: tools: list[StructuredTool] = [] for operation_id, operation in OPERATIONS.items(): + if operation_ids is not None and operation_id not in operation_ids: + continue async def call( parameters: dict[str, Any] | None = None, body: Any | None = None, @@ -776,6 +789,21 @@ class TasksApi(A2AAgent): return tools def _system_prompt(self) -> str: + if OPERATION_GROUPS: + lines = [ + "You coordinate route-specific OpenAPI subagents.", + "Delegate API work to the matching subagent with the task tool.", + "Do not invent API responses; ask subagents to call their tools for real results.", + "If a subagent reports missing consumer setup, tell the user which setup field is required.", + "If a subagent reports that the generated OpenAPI agent may be stale, ask whether the user wants to refresh it from the latest OpenAPI spec.", + "", + "Available route groups:", + ] + for group in OPERATION_GROUPS: + lines.append( + f"- {group['subagent_name']}: {group['description']}" + ) + return "\n".join(lines) lines = [ "You operate an API through generated OpenAPI tools.", "Call tools to get real results. Do not invent API responses.", @@ -792,6 +820,27 @@ class TasksApi(A2AAgent): ) return "\n".join(lines) + def _subagent_prompt(self, group: dict[str, Any]) -> str: + lines = [ + "You operate one route group from a generated OpenAPI API.", + "Use the available operation tools to make real API calls. Do not invent API responses.", + "Read the route group's SKILL.md when it applies; it lists every route you cover.", + "For write, update, or delete operations, explain the intended action before calling the tool.", + "If an operation reports missing consumer setup, return the exact setup field name.", + "If an operation returns 404, 405, 410, or a schema/validation error that suggests the live API no longer matches these tools, say the generated agent may need to be refreshed from the latest OpenAPI spec.", + "", + f"Route group: {group['label']}", + f"Common prefix: {group.get('common_prefix') or '/'}", + "Available operation tools:", + ] + for operation_id in group["operation_ids"]: + operation = OPERATIONS[operation_id] + marker = "WRITE" if operation.get("destructive") else "READ" + lines.append( + f"- {operation['skill_name']}: {marker} {operation['method']} {operation['path']} - {operation['summary']}" + ) + return "\n".join(lines) + def _tool_description(self, operation: dict[str, Any]) -> str: parts = [ f"{operation['method']} {operation['path']}", @@ -818,7 +867,9 @@ class TasksApi(A2AAgent): body: Any | None, ) -> dict[str, Any]: operation = OPERATIONS[operation_id] - base_url = str(ctx.consumer_config("OPENAPI_BASE_URL", DEFAULT_BASE_URL) or DEFAULT_BASE_URL).rstrip("/") + default_base_url = str(operation.get("base_url") or DEFAULT_BASE_URL).rstrip("/") + base_url_field = str(operation.get("base_url_field") or "OPENAPI_BASE_URL") + base_url = str(ctx.consumer_config(base_url_field, default_base_url) or default_base_url).rstrip("/") url, query, headers = self._request_parts(ctx, operation, parameters) request_kwargs: dict[str, Any] = { "params": query, @@ -961,6 +1012,32 @@ def _consumer_secret_optional(ctx: RunContext, name: str | None) -> str: return "" +def _runtime_skills_root(ctx: RunContext) -> str: + workspace = getattr(ctx, "_workspace", None) + prefixes = tuple(getattr(workspace, "write_prefixes", ()) or ()) + if not prefixes: + outputs_prefix = getattr(workspace, "outputs_prefix", None) + prefixes = (outputs_prefix or "outputs/",) + prefix = str(prefixes[0]).strip("/") + return f"/{prefix}/{RUNTIME_SKILLS_DIR}" if prefix else f"/{RUNTIME_SKILLS_DIR}" + + +def _seed_runtime_skills(backend: Any, ctx: RunContext) -> str: + if not SOURCE_SKILLS_DIR.exists(): + return "" + runtime_root = _runtime_skills_root(ctx) + uploads: list[tuple[str, bytes]] = [] + for path in SOURCE_SKILLS_DIR.rglob("*"): + if not path.is_file(): + continue + rel = path.relative_to(SOURCE_SKILLS_DIR).as_posix() + uploads.append((runtime_root + rel, path.read_bytes())) + if not uploads: + return "" + backend.upload_files(uploads) + return runtime_root + + def _message_text(message: Any) -> Any: content = getattr(message, "content", message) return content diff --git a/openapi.json b/openapi.json index d7e241e..7ce2c79 100644 --- a/openapi.json +++ b/openapi.json @@ -3525,27 +3525,6 @@ ] } }, - "/api/fuck-you": { - "get": { - "operationId": "getFuckYou", - "responses": { - "200": { - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - }, - "description": "Successful Response" - } - }, - "summary": "Get Fuck You", - "tags": [ - "Utility" - ] - } - }, "/api/tasks": { "get": { "operationId": "listTasks",