2016 lines
336 KiB
Python
2016 lines
336 KiB
Python
from __future__ import annotations
|
|
|
|
import base64
|
|
import builtins
|
|
import json
|
|
import re
|
|
from typing import Any
|
|
|
|
import httpx
|
|
from a2a_pack.deepagents import create_a2a_deep_agent
|
|
from langchain_core.messages import BaseMessage
|
|
from langchain_core.tools import StructuredTool
|
|
from pydantic import BaseModel, Field
|
|
|
|
from a2a_pack import (
|
|
A2AAgent,
|
|
ConsumerSetup,
|
|
ConsumerSetupField,
|
|
ConsumerSetupMissing,
|
|
EgressPolicy,
|
|
LLMProvisioning,
|
|
Pricing,
|
|
Resources,
|
|
RunContext,
|
|
skill,
|
|
)
|
|
|
|
|
|
DEFAULT_BASE_URL = "https://analytics.a2acloud.io/api"
|
|
OPERATIONS = json.loads("{\n \"delete_manage_clients_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete an API client.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_manage_clients_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/clients/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"delete_manage_clients_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Delete an API client.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"delete_manage_projects_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Soft-delete a project (scheduled for removal in 24 hours).\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_manage_projects_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"delete_manage_projects_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Soft-delete a project (scheduled for removal in 24 hours).\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"delete_manage_references_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"delete_/manage/references/{id}\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_manage_references_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/references/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"delete_manage_references_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"delete_/manage/references/{id}\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_export_charts\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Export aggregated chart/analytics data for a series of events over a time range.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_export_charts\",\n \"parameters\": [\n {\n \"description\": \"Array of dimensions to break down the data by\",\n \"in\": \"query\",\n \"name\": \"breakdowns\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"description\": \"Array of dimensions to break down the data by\",\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"The time interval for data aggregation (e.g., day, week, month)\",\n \"in\": \"query\",\n \"name\": \"interval\",\n \"required\": false,\n \"schema\": {\n \"default\": \"day\",\n \"description\": \"The time interval for data aggregation (e.g., day, week, month)\",\n \"enum\": [\n \"minute\",\n \"day\",\n \"hour\",\n \"week\",\n \"month\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The time range for which data should be displayed\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"30d\",\n \"description\": \"The time range for which data should be displayed\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Whether to show data from the previous period for comparison\",\n \"in\": \"query\",\n \"name\": \"previous\",\n \"required\": false,\n \"schema\": {\n \"default\": false,\n \"description\": \"Whether to show data from the previous period for comparison\",\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"Custom start date for the data range (overrides range if provided)\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Custom start date for the data range (overrides range if provided)\"\n }\n },\n {\n \"description\": \"Custom end date for the data range (overrides range if provided)\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Custom end date for the data range (overrides range if provided)\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"project_id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"projectId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"series\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"filters\": {\n \"default\": [],\n \"description\": \"Filters applied specifically to this event\",\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"property\": {\n \"description\": \"Optional property of the event used for specific segment calculations (e.g., value for property_sum/average)\",\n \"type\": \"string\"\n },\n \"segment\": {\n \"default\": \"event\",\n \"description\": \"Defines how the event data should be segmented or aggregated\",\n \"enum\": [\n \"event\",\n \"user\",\n \"session\",\n \"group\",\n \"user_average\",\n \"one_event_per_user\",\n \"property_sum\",\n \"property_average\",\n \"property_max\",\n \"property_min\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"events\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"filters\": {\n \"default\": [],\n \"description\": \"Filters applied specifically to this event\",\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"property\": {\n \"description\": \"Optional property of the event used for specific segment calculations (e.g., value for property_sum/average)\",\n \"type\": \"string\"\n },\n \"segment\": {\n \"default\": \"event\",\n \"description\": \"Defines how the event data should be segmented or aggregated\",\n \"enum\": [\n \"event\",\n \"user\",\n \"session\",\n \"group\",\n \"user_average\",\n \"one_event_per_user\",\n \"property_sum\",\n \"property_average\",\n \"property_max\",\n \"property_min\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/export/charts\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_export_charts\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Export aggregated chart/analytics data for a series of events over a time range.\",\n \"tags\": [\n \"Export\"\n ]\n },\n \"get_export_events\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Export a paginated list of raw events with optional filtering by date, profile, and event type.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_export_events\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"project_id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"projectId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"profileId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"event\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"start\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"end\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"page\",\n \"required\": false,\n \"schema\": {\n \"default\": 1,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"includes\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/export/events\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_export_events\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Export a paginated list of raw events with optional filtering by date, profile, and event type.\",\n \"tags\": [\n \"Export\"\n ]\n },\n \"get_insights_project_id_active_users\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get rolling active user counts over the last N days.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_active_users\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"days\",\n \"required\": false,\n \"schema\": {\n \"default\": 7,\n \"maximum\": 90,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/active_users\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_active_users\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get rolling active user counts over the last N days.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_brand\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"brand\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_brand\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/brand\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_brand\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"brand\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_browser\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"browser\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_browser\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/browser\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_browser\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"browser\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_browser_version\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"browser_version\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_browser_version\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/browser_version\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_browser_version\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"browser_version\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_city\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"city\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_city\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/city\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_city\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"city\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_country\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"country\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_country\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/country\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_country\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"country\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_device\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"device\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_device\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/device\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_device\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"device\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_engagement\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get engagement metrics for the project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_engagement\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/engagement\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_engagement\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get engagement metrics for the project.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_events\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Query events with optional filters for date range, profile, and properties.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_events\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"eventNames\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"path\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"country\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"city\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"device\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"browser\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"os\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrer\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrerName\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrerType\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"profileId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"properties\",\n \"required\": false,\n \"schema\": {\n \"additionalProperties\": {\n \"type\": \"string\"\n },\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/events\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_events\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Query events with optional filters for date range, profile, and properties.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_events_names\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all distinct event names tracked in the project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_events_names\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/events/names\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_events_names\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"List all distinct event names tracked in the project.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_events_properties\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all property keys for a given event name.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_events_properties\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"eventName\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/events/properties\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_events_properties\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"List all property keys for a given event name.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_events_property_values\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get the top values for a specific event property key.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_events_property_values\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"eventName\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"propertyKey\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/events/property_values\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_events_property_values\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get the top values for a specific event property key.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_funnel\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get funnel conversion rates for a sequence of events.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_funnel\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"steps\",\n \"required\": true,\n \"schema\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"windowHours\",\n \"required\": false,\n \"schema\": {\n \"default\": 24,\n \"maximum\": 720,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"groupBy\",\n \"required\": false,\n \"schema\": {\n \"default\": \"session_id\",\n \"enum\": [\n \"session_id\",\n \"profile_id\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/funnel\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_funnel\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get funnel conversion rates for a sequence of events.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_groups\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Search and filter groups.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_groups\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"type\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"search\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/groups\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_groups\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Search and filter groups.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_groups_group_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single group with its members.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_groups_group_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"memberLimit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"maximum\": 50,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"groupId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/groups/{groupId}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_groups_group_id\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get a single group with its members.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_groups_types\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all group types defined in the project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_groups_types\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/groups/types\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_groups_types\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"List all group types defined in the project.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_cannibalization\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Detect keyword cannibalization across pages in Google Search Console.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_cannibalization\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/cannibalization\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_cannibalization\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Detect keyword cannibalization across pages in Google Search Console.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_overview\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a Google Search Console performance overview (clicks, impressions, CTR, position).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_overview\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"interval\",\n \"required\": false,\n \"schema\": {\n \"default\": \"day\",\n \"enum\": [\n \"day\",\n \"week\",\n \"month\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/overview\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_overview\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get a Google Search Console performance overview (clicks, impressions, CTR, position).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_pages\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top pages from Google Search Console.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_pages\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 100,\n \"maximum\": 1000,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/pages\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_pages\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top pages from Google Search Console.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_pages_details\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get detailed GSC metrics for a specific page URL.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_pages_details\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"page\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/pages/details\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_pages_details\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get detailed GSC metrics for a specific page URL.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_queries\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top search queries from Google Search Console.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_queries\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 100,\n \"maximum\": 1000,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/queries\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_queries\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top search queries from Google Search Console.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_queries_details\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get detailed GSC metrics for a specific search query.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_queries_details\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"query\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/queries/details\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_queries_details\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get detailed GSC metrics for a specific search query.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_gsc_queries_opportunities\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get GSC query opportunities (high impressions, low CTR).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_gsc_queries_opportunities\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"minImpressions\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 9007199254740991,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/gsc/queries/opportunities\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_gsc_queries_opportunities\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get GSC query opportunities (high impressions, low CTR).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_live\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get the current number of live (active) visitors.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_live\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/live\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_live\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get the current number of live (active) visitors.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_metrics\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get aggregated website metrics including sessions, pageviews, and bounce rate.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_metrics\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/metrics\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_metrics\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get aggregated website metrics including sessions, pageviews, and bounce rate.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_model\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"model\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_model\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/model\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_model\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"model\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_os\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"os\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_os\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/os\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_os\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"os\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_os_version\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"os_version\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_os_version\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/os_version\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_os_version\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"os_version\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_overview\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get an overview of key metrics for the project (sessions, pageviews, bounce rate, duration).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_overview\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"interval\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"hour\",\n \"day\",\n \"week\",\n \"month\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/overview\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_overview\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get an overview of key metrics for the project (sessions, pageviews, bounce rate, duration).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_pages\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top pages with pageview counts for the selected date range.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_pages\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/pages\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_pages\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top pages with pageview counts for the selected date range.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_pages_entry_exit\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get entry or exit pages ranked by session count.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_pages_entry_exit\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"mode\",\n \"required\": false,\n \"schema\": {\n \"default\": \"entry\",\n \"enum\": [\n \"entry\",\n \"exit\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/pages/entry_exit\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_pages_entry_exit\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get entry or exit pages ranked by session count.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_pages_performance\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get page-level performance metrics (bounce rate, avg duration, sessions).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_pages_performance\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"search\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"sortBy\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"sessions\",\n \"pageviews\",\n \"bounce_rate\",\n \"avg_duration\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"sortOrder\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 50,\n \"maximum\": 500,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/pages/performance\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_pages_performance\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get page-level performance metrics (bounce rate, avg duration, sessions).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_pages_top\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get the top pages by pageviews for the given date range.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_pages_top\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/pages/top\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_pages_top\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get the top pages by pageviews for the given date range.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_profiles\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Search and filter user profiles.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_profiles\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"name\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"email\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"country\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"city\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"device\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"browser\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"inactiveDays\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 9007199254740991,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"minSessions\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 9007199254740991,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"performedEvent\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"sortOrder\",\n \"required\": false,\n \"schema\": {\n \"default\": \"desc\",\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/profiles\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_profiles\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Search and filter user profiles.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_profiles_profile_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single user profile with their recent events.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_profiles_profile_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"eventLimit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"profileId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/profiles/{profileId}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_profiles_profile_id\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get a single user profile with their recent events.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_profiles_profile_id_metrics\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get aggregated metrics for a specific user profile.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_profiles_profile_id_metrics\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"profileId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/profiles/{profileId}/metrics\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_profiles_profile_id_metrics\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get aggregated metrics for a specific user profile.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_profiles_profile_id_sessions\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get sessions for a specific user profile.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_profiles_profile_id_sessions\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"profileId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/profiles/{profileId}/sessions\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_profiles_profile_id_sessions\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get sessions for a specific user profile.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_referrer\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"referrer\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_referrer\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/referrer\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_referrer\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"referrer\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_referrer_name\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"referrer_name\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_referrer_name\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/referrer_name\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_referrer_name\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"referrer_name\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_referrer_type\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"referrer_type\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_referrer_type\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/referrer_type\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_referrer_type\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"referrer_type\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_region\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"region\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_region\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/region\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_region\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"region\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_reports_report_id_data\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get the data for a saved report.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_reports_report_id_data\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"reportId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/reports/{reportId}/data\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_reports_report_id_data\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get the data for a saved report.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_retention\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get weekly retention series data.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_retention\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/retention\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_retention\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get weekly retention series data.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_retention_cohort\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get retention cohort data.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_retention_cohort\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/retention/cohort\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_retention_cohort\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get retention cohort data.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_sessions\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Query sessions with optional filters.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_sessions\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"country\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"city\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"device\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"browser\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"os\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrer\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrerName\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"referrerType\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"profileId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 20,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/sessions\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_sessions\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Query sessions with optional filters.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_traffic_devices\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get traffic breakdown by device type, browser, or OS.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_traffic_devices\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"breakdown\",\n \"required\": false,\n \"schema\": {\n \"default\": \"device\",\n \"enum\": [\n \"device\",\n \"browser\",\n \"os\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/traffic/devices\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_traffic_devices\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get traffic breakdown by device type, browser, or OS.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_traffic_geo\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get traffic breakdown by geographic dimension (country, region, city).\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_traffic_geo\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"breakdown\",\n \"required\": false,\n \"schema\": {\n \"default\": \"country\",\n \"enum\": [\n \"country\",\n \"region\",\n \"city\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/traffic/geo\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_traffic_geo\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get traffic breakdown by geographic dimension (country, region, city).\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_traffic_referrers\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get traffic breakdown by referrer source.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_traffic_referrers\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"breakdown\",\n \"required\": false,\n \"schema\": {\n \"default\": \"referrer_name\",\n \"enum\": [\n \"referrer_name\",\n \"referrer_type\",\n \"referrer\",\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/traffic/referrers\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_traffic_referrers\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get traffic breakdown by referrer source.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_user_flow\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get user flow paths before, after, or between specified events.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_user_flow\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startEvent\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endEvent\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"mode\",\n \"required\": false,\n \"schema\": {\n \"default\": \"after\",\n \"enum\": [\n \"after\",\n \"before\",\n \"between\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"steps\",\n \"required\": false,\n \"schema\": {\n \"default\": 5,\n \"maximum\": 10,\n \"minimum\": 2,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"exclude\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/user_flow\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_user_flow\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get user flow paths before, after, or between specified events.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_campaign\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_campaign\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_campaign\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_campaign\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_campaign\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_campaign\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_content\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_content\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_content\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_content\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_content\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_content\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_medium\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_medium\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_medium\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_medium\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_medium\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_medium\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_source\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_source\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_source\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_source\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_source\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_source\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_insights_project_id_utm_term\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get top values for the \\\"utm_term\\\" dimension.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_insights_project_id_utm_term\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"filters\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"cohortId\": {\n \"description\": \"DEPRECATED: legacy single-cohort id, kept for saved reports. New code reads cohortIds via getCohortIds(filter).\",\n \"type\": \"string\"\n },\n \"cohortIds\": {\n \"description\": \"Cohort IDs for inCohort/notInCohort. Multiple ids OR-match (matches profiles in any of the listed cohorts).\",\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"description\": \"Unique identifier for the filter\",\n \"type\": \"string\"\n },\n \"name\": {\n \"description\": \"The property name to filter on\",\n \"type\": \"string\"\n },\n \"operator\": {\n \"description\": \"The operator to use for the filter\",\n \"enum\": [\n \"is\",\n \"isNot\",\n \"contains\",\n \"doesNotContain\",\n \"startsWith\",\n \"endsWith\",\n \"regex\",\n \"isNull\",\n \"isNotNull\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"inCohort\",\n \"notInCohort\"\n ],\n \"type\": \"string\"\n },\n \"value\": {\n \"description\": \"The values to filter on\",\n \"items\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n {\n \"type\": \"boolean\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\",\n \"operator\",\n \"value\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"startDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"endDate\",\n \"required\": false,\n \"schema\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"range\",\n \"required\": false,\n \"schema\": {\n \"default\": \"7d\",\n \"enum\": [\n \"30min\",\n \"lastHour\",\n \"last24h\",\n \"today\",\n \"yesterday\",\n \"7d\",\n \"30d\",\n \"3m\",\n \"6m\",\n \"12m\",\n \"monthToDate\",\n \"lastMonth\",\n \"yearToDate\",\n \"lastYear\",\n \"custom\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"type\": \"number\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/insights/{projectId}/utm_term\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_insights_project_id_utm_term\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get top values for the \\\"utm_term\\\" dimension.\",\n \"tags\": [\n \"Insights\"\n ]\n },\n \"get_manage_clients\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all API clients for the organization, optionally filtered by project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_clients\",\n \"parameters\": [],\n \"path\": \"/manage/clients\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_clients\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List all API clients for the organization, optionally filtered by project.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_clients_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single API client by ID.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_clients_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/clients/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_clients_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Get a single API client by ID.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_projects\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all projects for the organization.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_projects\",\n \"parameters\": [],\n \"path\": \"/manage/projects\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_projects\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List all projects for the organization.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_projects_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single project by ID.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_projects_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_projects_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Get a single project by ID.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_projects_project_id_dashboards\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all dashboards for a project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_projects_project_id_dashboards\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{projectId}/dashboards\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_projects_project_id_dashboards\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List all dashboards for a project.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_projects_project_id_dashboards_dashboard_id_reports\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List all reports in a dashboard.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_projects_project_id_dashboards_dashboard_id_reports\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"projectId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"dashboardId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{projectId}/dashboards/{dashboardId}/reports\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_projects_project_id_dashboards_dashboard_id_reports\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List all reports in a dashboard.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_references\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List annotation references for a project.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_references\",\n \"parameters\": [],\n \"path\": \"/manage/references\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_references\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"List annotation references for a project.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_manage_references_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get a single annotation reference by ID.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_manage_references_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/references/{id}\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_manage_references_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Get a single annotation reference by ID.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"get_track_device_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Get or generate a stable device ID and session ID for the current visitor.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_track_device_id\",\n \"parameters\": [],\n \"path\": \"/track/device-id\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"get_track_device_id\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Get or generate a stable device ID and session ID for the current visitor.\",\n \"tags\": [\n \"Track\"\n ]\n },\n \"patch_manage_clients_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an API client name.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_manage_clients_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/clients/{id}\",\n \"request_body\": {\n \"properties\": {\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"patch_manage_clients_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Update an API client name.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"patch_manage_projects_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update project settings (name, domain, CORS, tracking options).\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_manage_projects_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/projects/{id}\",\n \"request_body\": {\n \"properties\": {\n \"allowUnsafeRevenueTracking\": {\n \"type\": \"boolean\"\n },\n \"cors\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"crossDomain\": {\n \"type\": \"boolean\"\n },\n \"domain\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"format\": \"uri\",\n \"type\": \"string\"\n },\n {\n \"const\": \"\",\n \"type\": \"string\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"patch_manage_projects_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Update project settings (name, domain, CORS, tracking options).\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"patch_manage_references_id\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"patch_/manage/references/{id}\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_manage_references_id\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/manage/references/{id}\",\n \"request_body\": {\n \"properties\": {\n \"datetime\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"patch_manage_references_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"patch_/manage/references/{id}\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"post_event\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Deprecated direct event ingestion endpoint. Use /track instead.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_event\",\n \"parameters\": [],\n \"path\": \"/event/\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_event\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Deprecated direct event ingestion endpoint. Use /track instead.\",\n \"tags\": [\n \"Event\"\n ]\n },\n \"post_import_events\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Bulk import historical events.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_import_events\",\n \"parameters\": [],\n \"path\": \"/import/events\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_import_events\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Bulk import historical events.\",\n \"tags\": [\n \"Import\"\n ]\n },\n \"post_manage_clients\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new API client (read, write, or root type) and return its generated secret.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_manage_clients\",\n \"parameters\": [],\n \"path\": \"/manage/clients\",\n \"request_body\": {\n \"properties\": {\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"projectId\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"default\": \"write\",\n \"enum\": [\n \"read\",\n \"write\",\n \"root\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_manage_clients\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Create a new API client (read, write, or root type) and return its generated secret.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"post_manage_projects\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new project and its first write client.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_manage_projects\",\n \"parameters\": [],\n \"path\": \"/manage/projects\",\n \"request_body\": {\n \"properties\": {\n \"cors\": {\n \"default\": [],\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"crossDomain\": {\n \"default\": false,\n \"type\": \"boolean\"\n },\n \"domain\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"format\": \"uri\",\n \"type\": \"string\"\n },\n {\n \"const\": \"\",\n \"type\": \"string\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"types\": {\n \"default\": [],\n \"items\": {\n \"enum\": [\n \"website\",\n \"app\",\n \"backend\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_manage_projects\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"Create a new project and its first write client.\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"post_manage_references\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"post_/manage/references\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_manage_references\",\n \"parameters\": [],\n \"path\": \"/manage/references\",\n \"request_body\": {\n \"properties\": {\n \"datetime\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"projectId\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"projectId\",\n \"title\",\n \"datetime\"\n ],\n \"type\": \"object\"\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_manage_references\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\",\n \"source_title\": \"OpenPanel Admin API\",\n \"summary\": \"post_/manage/references\",\n \"tags\": [\n \"Manage\"\n ]\n },\n \"post_profile\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Identify or update a user profile.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_profile\",\n \"parameters\": [],\n \"path\": \"/profile/\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_profile\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Identify or update a user profile.\",\n \"tags\": [\n \"Profile\"\n ]\n },\n \"post_profile_decrement\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Decrement a numeric property on a user profile.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_profile_decrement\",\n \"parameters\": [],\n \"path\": \"/profile/decrement\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_profile_decrement\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Decrement a numeric property on a user profile.\",\n \"tags\": [\n \"Profile\"\n ]\n },\n \"post_profile_increment\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Increment a numeric property on a user profile.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_profile_increment\",\n \"parameters\": [],\n \"path\": \"/profile/increment\",\n \"request_body\": null,\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_profile_increment\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Increment a numeric property on a user profile.\",\n \"tags\": [\n \"Profile\"\n ]\n },\n \"post_track\": {\n \"base_url\": \"https://analytics.a2acloud.io/api\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Ingest a tracking event (track, identify, group, increment, decrement, replay).\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_track\",\n \"parameters\": [],\n \"path\": \"/track/\",\n \"request_body\": {\n \"allOf\": [\n {\n \"oneOf\": [\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"groups\": {\n \"anyOf\": [\n {\n \"items\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"properties\": {\n \"additionalProperties\": {},\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"track\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Track\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"avatar\": {\n \"format\": \"uri\",\n \"type\": \"string\"\n },\n \"email\": {\n \"format\": \"email\",\n \"pattern\": \"^(?!\\\\.)(?!.*\\\\.\\\\.)([A-Za-z0-9_'+\\\\-\\\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\\\-]*\\\\.)+[A-Za-z]{2,}$\",\n \"type\": \"string\"\n },\n \"firstName\": {\n \"type\": \"string\"\n },\n \"lastName\": {\n \"type\": \"string\"\n },\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"properties\": {\n \"additionalProperties\": {},\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"profileId\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"identify\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Identify\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"property\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"value\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"profileId\",\n \"property\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"increment\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Increment\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"property\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"value\": {\n \"exclusiveMinimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"profileId\",\n \"property\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"decrement\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Decrement\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"alias\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n }\n },\n \"required\": [\n \"profileId\",\n \"alias\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"alias\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Alias\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"chunk_index\": {\n \"maximum\": 65535,\n \"minimum\": 0,\n \"type\": \"integer\"\n },\n \"ended_at\": {\n \"format\": \"date-time\",\n \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?(?:Z))$\",\n \"type\": \"string\"\n },\n \"events_count\": {\n \"maximum\": 9007199254740991,\n \"minimum\": 1,\n \"type\": \"integer\"\n },\n \"is_full_snapshot\": {\n \"type\": \"boolean\"\n },\n \"payload\": {\n \"maxLength\": 2097152,\n \"type\": \"string\"\n },\n \"started_at\": {\n \"format\": \"date-time\",\n \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?(?:Z))$\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"chunk_index\",\n \"events_count\",\n \"is_full_snapshot\",\n \"started_at\",\n \"ended_at\",\n \"payload\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"replay\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Replay\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"id\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"name\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"properties\": {\n \"additionalProperties\": {},\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"type\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"type\",\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"group\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Group\",\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"payload\": {\n \"properties\": {\n \"groupIds\": {\n \"items\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"profileId\": {\n \"anyOf\": [\n {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n }\n },\n \"required\": [\n \"groupIds\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"assign_group\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"payload\"\n ],\n \"title\": \"Assign Group\",\n \"type\": \"object\"\n }\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"clientId\": {\n \"type\": \"string\"\n },\n \"clientSecret\": {\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n }\n ]\n },\n \"security\": [\n {\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": [],\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": []\n }\n ],\n \"skill_name\": \"post_track\",\n \"source_index\": 2,\n \"source_openapi_url\": \"https://analytics.a2acloud.io/api/documentation/project.json\",\n \"source_title\": \"OpenPanel Project API\",\n \"summary\": \"Ingest a tracking event (track, identify, group, increment, decrement, replay).\",\n \"tags\": [\n \"Track\"\n ]\n }\n}")
|
|
ROOT_SECURITY = json.loads("[]")
|
|
SECURITY_SCHEMES = json.loads("{\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": {\n \"description\": \"OpenPanel API client ID.\",\n \"in\": \"header\",\n \"name\": \"openpanel-client-id\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"OpenAPI source: https://analytics.a2acloud.io/api/documentation/admin.json. OpenPanel API client ID. Use a root client for manage/admin operations and a project client for project API operations.\",\n \"x-a2a-field-name\": \"OPENPANEL_CLIENT_ID\",\n \"x-a2a-label\": \"OpenPanel client ID\",\n \"x-a2a-source-title\": \"OpenPanel Admin API\",\n \"x-a2a-source-url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\"\n },\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": {\n \"description\": \"OpenPanel API client secret.\",\n \"in\": \"header\",\n \"name\": \"openpanel-client-secret\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"OpenAPI source: https://analytics.a2acloud.io/api/documentation/admin.json. OpenPanel API client secret. Requests send it in the `openpanel-client-secret` header.\",\n \"x-a2a-field-name\": \"OPENPANEL_CLIENT_SECRET\",\n \"x-a2a-label\": \"OpenPanel client secret\",\n \"x-a2a-source-title\": \"OpenPanel Admin API\",\n \"x-a2a-source-url\": \"https://analytics.a2acloud.io/api/documentation/admin.json\"\n },\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": {\n \"description\": \"OpenPanel API client ID.\",\n \"in\": \"header\",\n \"name\": \"openpanel-client-id\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"OpenAPI source: https://analytics.a2acloud.io/api/documentation/project.json. OpenPanel API client ID. Use a root client for manage/admin operations and a project client for project API operations.\",\n \"x-a2a-field-name\": \"OPENPANEL_CLIENT_ID\",\n \"x-a2a-label\": \"OpenPanel client ID\",\n \"x-a2a-source-title\": \"OpenPanel Project API\",\n \"x-a2a-source-url\": \"https://analytics.a2acloud.io/api/documentation/project.json\"\n },\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": {\n \"description\": \"OpenPanel API client secret.\",\n \"in\": \"header\",\n \"name\": \"openpanel-client-secret\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"OpenAPI source: https://analytics.a2acloud.io/api/documentation/project.json. OpenPanel API client secret. Requests send it in the `openpanel-client-secret` header.\",\n \"x-a2a-field-name\": \"OPENPANEL_CLIENT_SECRET\",\n \"x-a2a-label\": \"OpenPanel client secret\",\n \"x-a2a-source-title\": \"OpenPanel Project API\",\n \"x-a2a-source-url\": \"https://analytics.a2acloud.io/api/documentation/project.json\"\n }\n}")
|
|
SECURITY_FIELDS = json.loads("{\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_id\": {\n \"field\": \"OPENPANEL_CLIENT_ID\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"openpanel-client-id\"\n },\n \"analytics_a2acloud_io_api_documentation_admin_json__openpanel_client_secret\": {\n \"field\": \"OPENPANEL_CLIENT_SECRET\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"openpanel-client-secret\"\n },\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_id\": {\n \"field\": \"OPENPANEL_CLIENT_ID\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"openpanel-client-id\"\n },\n \"analytics_a2acloud_io_api_documentation_project_json__openpanel_client_secret\": {\n \"field\": \"OPENPANEL_CLIENT_SECRET\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"openpanel-client-secret\"\n }\n}")
|
|
PATH_PARAMETER_RE = re.compile(r"{([^}/]+)}")
|
|
|
|
|
|
class OperationInput(BaseModel):
|
|
parameters: dict[str, Any] = Field(
|
|
default_factory=dict,
|
|
description="Path, query, header, and cookie parameters keyed by OpenAPI parameter name.",
|
|
)
|
|
body: Any | None = Field(default=None, description="JSON request body, when the operation accepts one.")
|
|
|
|
|
|
class Openpannel(A2AAgent):
|
|
name = "openpannel"
|
|
description = "Composite OpenAPI agent generated from 2 OpenAPI specs."
|
|
version = "1.0.0"
|
|
consumer_setup = ConsumerSetup.from_fields(
|
|
ConsumerSetupField.config("OPENAPI_BASE_URL", label="API base URL", description="Override the default API server (https://analytics.a2acloud.io/api).", required=False, input_type="url"),
|
|
ConsumerSetupField.secret("OPENPANEL_CLIENT_ID", label="OpenPanel client ID", description="OpenAPI sources: https://analytics.a2acloud.io/api/documentation/admin.json; https://analytics.a2acloud.io/api/documentation/project.json. OpenPanel API client ID. Use a root client for manage/admin operations and a project client for project API operations.", required=True),
|
|
ConsumerSetupField.secret("OPENPANEL_CLIENT_SECRET", label="OpenPanel client secret", description="OpenAPI sources: https://analytics.a2acloud.io/api/documentation/admin.json; https://analytics.a2acloud.io/api/documentation/project.json. OpenPanel API client secret. Requests send it in the `openpanel-client-secret` header.", required=True),
|
|
)
|
|
llm_provisioning = LLMProvisioning.PLATFORM
|
|
pricing = Pricing(
|
|
price_per_call_usd=0.0,
|
|
caller_pays_llm=False,
|
|
notes="Uses a scoped platform LLM grant through ctx.llm.",
|
|
)
|
|
resources = Resources(cpu="200m", memory="512Mi")
|
|
egress = EgressPolicy(
|
|
allow_hosts=('analytics.a2acloud.io',),
|
|
deny_internet_by_default=True,
|
|
)
|
|
tools_used = ("openapi", "deepagents")
|
|
capabilities = {
|
|
"openapi_auto_agent": {
|
|
"operation_count": len(OPERATIONS),
|
|
"default_base_url": DEFAULT_BASE_URL,
|
|
"source_openapi_url": None,
|
|
"source_openapi_urls": ['https://analytics.a2acloud.io/api/documentation/admin.json', 'https://analytics.a2acloud.io/api/documentation/project.json'],
|
|
"server_urls": ['https://analytics.a2acloud.io/api'],
|
|
"regenerable": True,
|
|
"security_schemes": list(SECURITY_SCHEMES),
|
|
}
|
|
}
|
|
|
|
@skill(
|
|
name="auto",
|
|
description="Use the OpenAPI service to complete a natural-language goal.",
|
|
tags=("openapi", "auto"),
|
|
timeout_seconds=180,
|
|
)
|
|
async def auto(self, ctx: RunContext, goal: str) -> dict[str, Any]:
|
|
creds = ctx.llm
|
|
if not creds.api_key:
|
|
return {
|
|
"error": "llm_credentials_missing",
|
|
"final": (
|
|
"LLM credentials were not available for this run. Hosted "
|
|
"generated OpenAPI agents should receive a platform LLM grant."
|
|
),
|
|
"messages": [],
|
|
}
|
|
graph = create_a2a_deep_agent(
|
|
ctx,
|
|
creds=creds,
|
|
tools=self._operation_tools(ctx),
|
|
system_prompt=self._system_prompt(),
|
|
)
|
|
result = await graph.ainvoke({"messages": [{"role": "user", "content": goal}]})
|
|
messages = result.get("messages", []) if isinstance(result, dict) else []
|
|
final = _message_text(messages[-1]) if messages else result
|
|
return {
|
|
"final": final,
|
|
"messages": [_message_to_dict(message) for message in messages[-8:]],
|
|
}
|
|
|
|
@skill(
|
|
name="get_manage_projects",
|
|
description="GET /manage/projects - List all projects for the organization.",
|
|
tags=('Manage',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_manage_projects(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_manage_projects",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_manage_projects",
|
|
description="POST /manage/projects - Create a new project and its first write client.",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_manage_projects(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_manage_projects",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_manage_projects_id",
|
|
description="GET /manage/projects/{id} - Get a single project by ID.",
|
|
tags=('Manage',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_manage_projects_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_manage_projects_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="patch_manage_projects_id",
|
|
description="PATCH /manage/projects/{id} - Update project settings (name, domain, CORS, tracking options).",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def patch_manage_projects_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"patch_manage_projects_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="delete_manage_projects_id",
|
|
description="DELETE /manage/projects/{id} - Soft-delete a project (scheduled for removal in 24 hours).",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def delete_manage_projects_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"delete_manage_projects_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_manage_clients",
|
|
description="GET /manage/clients - List all API clients for the organization, optionally filtered by project.",
|
|
tags=('Manage',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_manage_clients(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_manage_clients",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_manage_clients",
|
|
description="POST /manage/clients - Create a new API client (read, write, or root type) and return its generated secret.",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_manage_clients(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_manage_clients",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_manage_clients_id",
|
|
description="GET /manage/clients/{id} - Get a single API client by ID.",
|
|
tags=('Manage',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_manage_clients_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_manage_clients_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="patch_manage_clients_id",
|
|
description="PATCH /manage/clients/{id} - Update an API client name.",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def patch_manage_clients_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"patch_manage_clients_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="delete_manage_clients_id",
|
|
description="DELETE /manage/clients/{id} - Delete an API client.",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def delete_manage_clients_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"delete_manage_clients_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_manage_references",
|
|
description="GET /manage/references - List annotation references for a project.",
|
|
tags=('Manage',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_manage_references(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_manage_references",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_manage_references",
|
|
description="POST /manage/references - post_/manage/references",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_manage_references(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_manage_references",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_manage_references_id",
|
|
description="GET /manage/references/{id} - Get a single annotation reference by ID.",
|
|
tags=('Manage',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_manage_references_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_manage_references_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="patch_manage_references_id",
|
|
description="PATCH /manage/references/{id} - patch_/manage/references/{id}",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def patch_manage_references_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"patch_manage_references_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="delete_manage_references_id",
|
|
description="DELETE /manage/references/{id} - delete_/manage/references/{id}",
|
|
tags=('Manage',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def delete_manage_references_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"delete_manage_references_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_manage_projects_project_id_dashboards",
|
|
description="GET /manage/projects/{projectId}/dashboards - List all dashboards for a project.",
|
|
tags=('Manage',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_manage_projects_project_id_dashboards(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_manage_projects_project_id_dashboards",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_manage_projects_project_id_dashboards_dashboard_id_reports",
|
|
description="GET /manage/projects/{projectId}/dashboards/{dashboardId}/reports - List all reports in a dashboard.",
|
|
tags=('Manage',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_manage_projects_project_id_dashboards_dashboard_id_reports(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_manage_projects_project_id_dashboards_dashboard_id_reports",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_event",
|
|
description="POST /event/ - Deprecated direct event ingestion endpoint. Use /track instead.",
|
|
tags=('Event',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_event(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_event",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_profile",
|
|
description="POST /profile/ - Identify or update a user profile.",
|
|
tags=('Profile',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_profile(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_profile",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_profile_increment",
|
|
description="POST /profile/increment - Increment a numeric property on a user profile.",
|
|
tags=('Profile',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_profile_increment(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_profile_increment",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_profile_decrement",
|
|
description="POST /profile/decrement - Decrement a numeric property on a user profile.",
|
|
tags=('Profile',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_profile_decrement(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_profile_decrement",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_export_events",
|
|
description="GET /export/events - Export a paginated list of raw events with optional filtering by date, profile, and event type.",
|
|
tags=('Export',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_export_events(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_export_events",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_export_charts",
|
|
description="GET /export/charts - Export aggregated chart/analytics data for a series of events over a time range.",
|
|
tags=('Export',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_export_charts(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_export_charts",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_import_events",
|
|
description="POST /import/events - Bulk import historical events.",
|
|
tags=('Import',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_import_events(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_import_events",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_overview",
|
|
description="GET /insights/{projectId}/overview - Get an overview of key metrics for the project (sessions, pageviews, bounce rate, duration).",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_overview(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_overview",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_active_users",
|
|
description="GET /insights/{projectId}/active_users - Get rolling active user counts over the last N days.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_active_users(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_active_users",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_retention",
|
|
description="GET /insights/{projectId}/retention - Get weekly retention series data.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_retention(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_retention",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_retention_cohort",
|
|
description="GET /insights/{projectId}/retention/cohort - Get retention cohort data.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_retention_cohort(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_retention_cohort",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_pages_top",
|
|
description="GET /insights/{projectId}/pages/top - Get the top pages by pageviews for the given date range.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_pages_top(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_pages_top",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_pages_entry_exit",
|
|
description="GET /insights/{projectId}/pages/entry_exit - Get entry or exit pages ranked by session count.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_pages_entry_exit(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_pages_entry_exit",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_pages_performance",
|
|
description="GET /insights/{projectId}/pages/performance - Get page-level performance metrics (bounce rate, avg duration, sessions).",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_pages_performance(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_pages_performance",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_metrics",
|
|
description="GET /insights/{projectId}/metrics - Get aggregated website metrics including sessions, pageviews, and bounce rate.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_metrics(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_metrics",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_live",
|
|
description="GET /insights/{projectId}/live - Get the current number of live (active) visitors.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_live(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_live",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_pages",
|
|
description="GET /insights/{projectId}/pages - Get top pages with pageview counts for the selected date range.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_pages(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_pages",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_referrer",
|
|
description="GET /insights/{projectId}/referrer - Get top values for the \"referrer\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_referrer(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_referrer",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_referrer_name",
|
|
description="GET /insights/{projectId}/referrer_name - Get top values for the \"referrer_name\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_referrer_name(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_referrer_name",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_referrer_type",
|
|
description="GET /insights/{projectId}/referrer_type - Get top values for the \"referrer_type\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_referrer_type(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_referrer_type",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_utm_source",
|
|
description="GET /insights/{projectId}/utm_source - Get top values for the \"utm_source\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_utm_source(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_utm_source",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_utm_medium",
|
|
description="GET /insights/{projectId}/utm_medium - Get top values for the \"utm_medium\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_utm_medium(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_utm_medium",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_utm_campaign",
|
|
description="GET /insights/{projectId}/utm_campaign - Get top values for the \"utm_campaign\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_utm_campaign(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_utm_campaign",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_utm_term",
|
|
description="GET /insights/{projectId}/utm_term - Get top values for the \"utm_term\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_utm_term(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_utm_term",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_utm_content",
|
|
description="GET /insights/{projectId}/utm_content - Get top values for the \"utm_content\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_utm_content(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_utm_content",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_region",
|
|
description="GET /insights/{projectId}/region - Get top values for the \"region\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_region(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_region",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_country",
|
|
description="GET /insights/{projectId}/country - Get top values for the \"country\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_country(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_country",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_city",
|
|
description="GET /insights/{projectId}/city - Get top values for the \"city\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_city(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_city",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_device",
|
|
description="GET /insights/{projectId}/device - Get top values for the \"device\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_device(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_device",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_brand",
|
|
description="GET /insights/{projectId}/brand - Get top values for the \"brand\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_brand(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_brand",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_model",
|
|
description="GET /insights/{projectId}/model - Get top values for the \"model\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_model(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_model",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_browser",
|
|
description="GET /insights/{projectId}/browser - Get top values for the \"browser\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_browser(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_browser",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_browser_version",
|
|
description="GET /insights/{projectId}/browser_version - Get top values for the \"browser_version\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_browser_version(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_browser_version",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_os",
|
|
description="GET /insights/{projectId}/os - Get top values for the \"os\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_os(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_os",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_os_version",
|
|
description="GET /insights/{projectId}/os_version - Get top values for the \"os_version\" dimension.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_os_version(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_os_version",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_funnel",
|
|
description="GET /insights/{projectId}/funnel - Get funnel conversion rates for a sequence of events.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_funnel(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_funnel",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_traffic_referrers",
|
|
description="GET /insights/{projectId}/traffic/referrers - Get traffic breakdown by referrer source.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_traffic_referrers(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_traffic_referrers",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_traffic_geo",
|
|
description="GET /insights/{projectId}/traffic/geo - Get traffic breakdown by geographic dimension (country, region, city).",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_traffic_geo(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
params = parameters or {}
|
|
project_id = params.get("projectId")
|
|
if not project_id:
|
|
return {
|
|
"ok": False,
|
|
"status_code": 400,
|
|
"operation_id": "get_insights_project_id_traffic_geo",
|
|
"error": "missing required path parameter 'projectId'",
|
|
}
|
|
|
|
geo = await self.get_project_geo_from_events(
|
|
ctx,
|
|
projectId=str(project_id),
|
|
start=params.get("startDate") or params.get("start"),
|
|
end=params.get("endDate") or params.get("end"),
|
|
range=str(params.get("range") or "today"),
|
|
limit=int(params.get("limit") or 250),
|
|
max_pages=int(params.get("max_pages") or 4),
|
|
)
|
|
if not geo.get("ok"):
|
|
geo["operation_id"] = "get_insights_project_id_traffic_geo"
|
|
return geo
|
|
return {
|
|
"ok": True,
|
|
"status_code": 200,
|
|
"operation_id": "get_insights_project_id_traffic_geo",
|
|
"result": {
|
|
"projectId": project_id,
|
|
"geo": geo.get("geo", []),
|
|
"sample_events": geo.get("sample_events", []),
|
|
"events_scanned": geo.get("events_scanned", 0),
|
|
"source": "export/events",
|
|
},
|
|
}
|
|
|
|
@skill(
|
|
name="get_insights_project_id_traffic_devices",
|
|
description="GET /insights/{projectId}/traffic/devices - Get traffic breakdown by device type, browser, or OS.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_traffic_devices(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_traffic_devices",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_user_flow",
|
|
description="GET /insights/{projectId}/user_flow - Get user flow paths before, after, or between specified events.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_user_flow(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_user_flow",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_engagement",
|
|
description="GET /insights/{projectId}/engagement - Get engagement metrics for the project.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_engagement(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_engagement",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_events",
|
|
description="GET /insights/{projectId}/events - Query events with optional filters for date range, profile, and properties.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_events(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_events",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_events_names",
|
|
description="GET /insights/{projectId}/events/names - List all distinct event names tracked in the project.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_events_names(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_events_names",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_events_properties",
|
|
description="GET /insights/{projectId}/events/properties - List all property keys for a given event name.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_events_properties(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_events_properties",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_events_property_values",
|
|
description="GET /insights/{projectId}/events/property_values - Get the top values for a specific event property key.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_events_property_values(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_events_property_values",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_profiles",
|
|
description="GET /insights/{projectId}/profiles - Search and filter user profiles.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_profiles(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_profiles",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_profiles_profile_id",
|
|
description="GET /insights/{projectId}/profiles/{profileId} - Get a single user profile with their recent events.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_profiles_profile_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_profiles_profile_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_profiles_profile_id_sessions",
|
|
description="GET /insights/{projectId}/profiles/{profileId}/sessions - Get sessions for a specific user profile.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_profiles_profile_id_sessions(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_profiles_profile_id_sessions",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_profiles_profile_id_metrics",
|
|
description="GET /insights/{projectId}/profiles/{profileId}/metrics - Get aggregated metrics for a specific user profile.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_profiles_profile_id_metrics(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_profiles_profile_id_metrics",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_sessions",
|
|
description="GET /insights/{projectId}/sessions - Query sessions with optional filters.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_sessions(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_sessions",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_groups_types",
|
|
description="GET /insights/{projectId}/groups/types - List all group types defined in the project.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_groups_types(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_groups_types",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_groups",
|
|
description="GET /insights/{projectId}/groups - Search and filter groups.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_groups(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_groups",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_groups_group_id",
|
|
description="GET /insights/{projectId}/groups/{groupId} - Get a single group with its members.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_groups_group_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_groups_group_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_reports_report_id_data",
|
|
description="GET /insights/{projectId}/reports/{reportId}/data - Get the data for a saved report.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_reports_report_id_data(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_reports_report_id_data",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_gsc_overview",
|
|
description="GET /insights/{projectId}/gsc/overview - Get a Google Search Console performance overview (clicks, impressions, CTR, position).",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_gsc_overview(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_gsc_overview",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_gsc_pages",
|
|
description="GET /insights/{projectId}/gsc/pages - Get top pages from Google Search Console.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_gsc_pages(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_gsc_pages",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_gsc_pages_details",
|
|
description="GET /insights/{projectId}/gsc/pages/details - Get detailed GSC metrics for a specific page URL.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_gsc_pages_details(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_gsc_pages_details",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_gsc_queries",
|
|
description="GET /insights/{projectId}/gsc/queries - Get top search queries from Google Search Console.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_gsc_queries(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_gsc_queries",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_gsc_queries_details",
|
|
description="GET /insights/{projectId}/gsc/queries/details - Get detailed GSC metrics for a specific search query.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_gsc_queries_details(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_gsc_queries_details",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_gsc_queries_opportunities",
|
|
description="GET /insights/{projectId}/gsc/queries/opportunities - Get GSC query opportunities (high impressions, low CTR).",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_gsc_queries_opportunities(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_gsc_queries_opportunities",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_insights_project_id_gsc_cannibalization",
|
|
description="GET /insights/{projectId}/gsc/cannibalization - Detect keyword cannibalization across pages in Google Search Console.",
|
|
tags=('Insights',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_insights_project_id_gsc_cannibalization(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_insights_project_id_gsc_cannibalization",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_track",
|
|
description="POST /track/ - Ingest a tracking event (track, identify, group, increment, decrement, replay).",
|
|
tags=('Track',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_track(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_track",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_track_device_id",
|
|
description="GET /track/device-id - Get or generate a stable device ID and session ID for the current visitor.",
|
|
tags=('Track',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_track_device_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_track_device_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_project_geo_from_events",
|
|
description=(
|
|
"Summarize OpenPanel visitor geography from raw exported events. "
|
|
"Use this instead of the stale /insights/{projectId}/traffic/geo route."
|
|
),
|
|
tags=("Insights", "Geo"),
|
|
timeout_seconds=120,
|
|
)
|
|
async def get_project_geo_from_events(
|
|
self,
|
|
ctx: RunContext,
|
|
projectId: str,
|
|
start: str | None = None,
|
|
end: str | None = None,
|
|
range: str = "today",
|
|
limit: int = 250,
|
|
max_pages: int = 4,
|
|
) -> dict[str, Any]:
|
|
per_page = max(1, min(int(limit), 1000))
|
|
pages = max(1, min(int(max_pages), 10))
|
|
aggregate: dict[str, dict[str, Any]] = {}
|
|
samples: list[dict[str, Any]] = []
|
|
total_events = 0
|
|
|
|
for page in builtins.range(1, pages + 1):
|
|
params: dict[str, Any] = {
|
|
"projectId": projectId,
|
|
"page": page,
|
|
"limit": per_page,
|
|
}
|
|
if start or end:
|
|
if start:
|
|
params["start"] = start
|
|
if end:
|
|
params["end"] = end
|
|
else:
|
|
params["range"] = range
|
|
|
|
response = await self._request(
|
|
ctx,
|
|
"get_export_events",
|
|
parameters=params,
|
|
body=None,
|
|
)
|
|
if not response.get("ok"):
|
|
return response
|
|
|
|
result = response.get("result") if isinstance(response, dict) else None
|
|
data = result.get("data", []) if isinstance(result, dict) else []
|
|
meta = result.get("meta", {}) if isinstance(result, dict) else {}
|
|
if not isinstance(data, list) or not data:
|
|
break
|
|
|
|
total_events += len(data)
|
|
for event in data:
|
|
if not isinstance(event, dict):
|
|
continue
|
|
country = self._clean_geo_value(event.get("country"))
|
|
region = self._clean_geo_value(event.get("region"))
|
|
city = self._clean_geo_value(event.get("city"))
|
|
key = "|".join([country, region, city])
|
|
bucket = aggregate.setdefault(
|
|
key,
|
|
{
|
|
"country": country or None,
|
|
"region": region or None,
|
|
"city": city or None,
|
|
"events": 0,
|
|
"sessions": set(),
|
|
"latest": None,
|
|
},
|
|
)
|
|
bucket["events"] += 1
|
|
session_id = event.get("sessionId") or event.get("session_id")
|
|
if session_id:
|
|
bucket["sessions"].add(str(session_id))
|
|
created_at = event.get("createdAt") or event.get("created_at")
|
|
if created_at and (bucket["latest"] is None or str(created_at) > str(bucket["latest"])):
|
|
bucket["latest"] = created_at
|
|
if len(samples) < 10:
|
|
samples.append(
|
|
{
|
|
"createdAt": created_at,
|
|
"name": event.get("name"),
|
|
"path": event.get("path"),
|
|
"country": country or None,
|
|
"region": region or None,
|
|
"city": city or None,
|
|
"browser": event.get("browser"),
|
|
"os": event.get("os"),
|
|
}
|
|
)
|
|
|
|
if isinstance(meta, dict):
|
|
current = int(meta.get("current") or page)
|
|
page_count = int(meta.get("pages") or page)
|
|
if current >= page_count:
|
|
break
|
|
|
|
rows = []
|
|
for bucket in aggregate.values():
|
|
rows.append(
|
|
{
|
|
"country": bucket["country"],
|
|
"region": bucket["region"],
|
|
"city": bucket["city"],
|
|
"events": bucket["events"],
|
|
"sessions": len(bucket["sessions"]),
|
|
"latest": bucket["latest"],
|
|
}
|
|
)
|
|
rows.sort(key=lambda row: (row["latest"] or "", row["events"]), reverse=True)
|
|
|
|
return {
|
|
"ok": True,
|
|
"operation_id": "get_project_geo_from_events",
|
|
"projectId": projectId,
|
|
"range": {"start": start, "end": end, "range": range},
|
|
"events_scanned": total_events,
|
|
"geo": rows,
|
|
"sample_events": samples,
|
|
}
|
|
|
|
@staticmethod
|
|
def _clean_geo_value(value: Any) -> str:
|
|
text = str(value or "").replace("\x00", "").strip()
|
|
return text
|
|
|
|
def _operation_tools(self, ctx: RunContext) -> list[StructuredTool]:
|
|
tools: list[StructuredTool] = []
|
|
for operation_id, operation in OPERATIONS.items():
|
|
async def call(
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
*,
|
|
_operation_id: str = operation_id,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
_operation_id,
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
tools.append(
|
|
StructuredTool.from_function(
|
|
coroutine=call,
|
|
name=operation["skill_name"],
|
|
description=self._tool_description(operation),
|
|
args_schema=OperationInput,
|
|
)
|
|
)
|
|
return tools
|
|
|
|
def _system_prompt(self) -> str:
|
|
lines = [
|
|
"You operate an API through generated OpenAPI tools.",
|
|
"Call tools to get real results. Do not invent API responses.",
|
|
"For write, update, or delete operations, explain the intended action before calling the tool.",
|
|
"If an operation reports missing consumer setup, tell the user which setup field is required.",
|
|
"If an operation returns 404, 405, 410, or a schema/validation error that suggests the live API no longer matches these tools, tell the user this generated agent may need to be refreshed from the latest OpenAPI spec and ask whether they want to refresh it.",
|
|
"",
|
|
"Available operations:",
|
|
]
|
|
for operation in OPERATIONS.values():
|
|
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']}",
|
|
str(operation.get("description") or operation.get("summary") or ""),
|
|
]
|
|
if operation.get("parameters"):
|
|
parts.append(
|
|
"Parameters: "
|
|
+ ", ".join(
|
|
f"{p['name']} in {p['in']}{' required' if p.get('required') else ''}"
|
|
for p in operation["parameters"]
|
|
)
|
|
)
|
|
if operation.get("request_body") is not None:
|
|
parts.append("Accepts a JSON request body.")
|
|
return "\n".join(part for part in parts if part)
|
|
|
|
async def _request(
|
|
self,
|
|
ctx: RunContext,
|
|
operation_id: str,
|
|
*,
|
|
parameters: dict[str, Any],
|
|
body: Any | None,
|
|
) -> dict[str, Any]:
|
|
operation = OPERATIONS[operation_id]
|
|
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,
|
|
"headers": headers,
|
|
}
|
|
if body is not None:
|
|
if isinstance(body, (bytes, bytearray)):
|
|
body = body.decode("utf-8", errors="replace")
|
|
if isinstance(body, str):
|
|
stripped = body.strip()
|
|
if stripped and stripped[0] in "{[":
|
|
try:
|
|
body = json.loads(stripped)
|
|
except ValueError:
|
|
pass
|
|
request_kwargs["json"] = body
|
|
async with httpx.AsyncClient(timeout=60.0, follow_redirects=True) as client:
|
|
response = await client.request(
|
|
operation["method"],
|
|
f"{base_url}{url}",
|
|
**request_kwargs,
|
|
)
|
|
content_type = response.headers.get("content-type", "")
|
|
try:
|
|
payload: Any = response.json() if "json" in content_type else response.text
|
|
except ValueError:
|
|
payload = response.text
|
|
if response.status_code >= 400:
|
|
out = {
|
|
"ok": False,
|
|
"status_code": response.status_code,
|
|
"operation_id": operation_id,
|
|
"error": payload,
|
|
}
|
|
if response.status_code in {404, 405, 410, 422}:
|
|
out["stale_openapi_hint"] = (
|
|
"This generated OpenAPI agent may be stale. Ask the user "
|
|
"whether they want to refresh it from the latest OpenAPI spec."
|
|
)
|
|
return out
|
|
return {
|
|
"ok": True,
|
|
"status_code": response.status_code,
|
|
"operation_id": operation_id,
|
|
"result": payload,
|
|
}
|
|
|
|
def _request_parts(
|
|
self,
|
|
ctx: RunContext,
|
|
operation: dict[str, Any],
|
|
parameters: dict[str, Any],
|
|
) -> tuple[str, dict[str, Any], dict[str, str]]:
|
|
path = operation["path"]
|
|
query: dict[str, Any] = {}
|
|
headers: dict[str, str] = {}
|
|
cookies: dict[str, Any] = {}
|
|
for param in operation.get("parameters") or []:
|
|
name = param["name"]
|
|
if name not in parameters:
|
|
if param.get("required"):
|
|
raise ValueError(f"missing required parameter {name!r}")
|
|
continue
|
|
value = parameters[name]
|
|
location = param["in"]
|
|
if location == "path":
|
|
path = path.replace("{" + name + "}", str(value))
|
|
elif location == "query":
|
|
query[name] = value
|
|
elif location == "header":
|
|
headers[name] = str(value)
|
|
elif location == "cookie":
|
|
cookies[name] = value
|
|
unresolved = PATH_PARAMETER_RE.findall(path)
|
|
if unresolved:
|
|
missing = ", ".join(sorted(set(unresolved)))
|
|
raise ValueError("missing required path parameter(s): " + missing)
|
|
if cookies:
|
|
headers["cookie"] = "; ".join(f"{key}={value}" for key, value in cookies.items())
|
|
auth_headers, auth_query = self._auth_for_operation(ctx, operation)
|
|
headers.update(auth_headers)
|
|
query.update(auth_query)
|
|
return path, query, headers
|
|
|
|
def _auth_for_operation(self, ctx: RunContext, operation: dict[str, Any]) -> tuple[dict[str, str], dict[str, Any]]:
|
|
requirements = operation.get("security")
|
|
if requirements is None:
|
|
requirements = ROOT_SECURITY
|
|
if requirements == []:
|
|
return {}, {}
|
|
missing: list[str] = []
|
|
for requirement in requirements or []:
|
|
if not isinstance(requirement, dict) or not requirement:
|
|
return {}, {}
|
|
headers: dict[str, str] = {}
|
|
query: dict[str, Any] = {}
|
|
ok = True
|
|
for scheme_name in requirement:
|
|
mapping = SECURITY_FIELDS.get(scheme_name) or {}
|
|
secret_name = mapping.get("field")
|
|
value = _consumer_secret_optional(ctx, secret_name) if secret_name else ""
|
|
if not value:
|
|
ok = False
|
|
if secret_name:
|
|
missing.append(secret_name)
|
|
continue
|
|
kind = mapping.get("kind")
|
|
if kind == "apiKey":
|
|
prefix = mapping.get("prefix") or ""
|
|
sent_value = f"{prefix}{value}"
|
|
if mapping.get("location") == "query":
|
|
query[mapping.get("name") or scheme_name] = sent_value
|
|
else:
|
|
headers[mapping.get("name") or scheme_name] = sent_value
|
|
elif kind in {"http", "oauth2"}:
|
|
scheme = mapping.get("scheme") or "Bearer"
|
|
if scheme.lower() == "basic":
|
|
token = base64.b64encode(value.encode("utf-8")).decode("ascii")
|
|
headers["authorization"] = f"Basic {token}"
|
|
else:
|
|
headers["authorization"] = f"{scheme} {value}"
|
|
else:
|
|
ok = False
|
|
if ok:
|
|
return headers, query
|
|
if missing:
|
|
raise ConsumerSetupMissing(
|
|
"operation requires consumer setup secret(s): "
|
|
+ ", ".join(sorted(set(missing)))
|
|
)
|
|
return {}, {}
|
|
|
|
|
|
def _consumer_secret_optional(ctx: RunContext, name: str | None) -> str:
|
|
if not name:
|
|
return ""
|
|
try:
|
|
return ctx.consumer_secret(name)
|
|
except ConsumerSetupMissing:
|
|
return ""
|
|
|
|
|
|
def _message_text(message: Any) -> Any:
|
|
content = getattr(message, "content", message)
|
|
return content
|
|
|
|
|
|
def _message_to_dict(message: Any) -> dict[str, Any]:
|
|
if isinstance(message, BaseMessage):
|
|
return message.model_dump(mode="json")
|
|
if hasattr(message, "model_dump"):
|
|
return message.model_dump(mode="json")
|
|
if isinstance(message, dict):
|
|
return message
|
|
return {"content": str(message)}
|
|
|
|
|
|
agent = Openpannel()
|