chore(vocero): remove the legacy ApiPilot integration (#3)

Vocero now retrieves AquaPortal content through authenticated MCP. This removes the obsolete ApiPilot integration from the API and browser while preserving the separately deployed speech pipeline.

Release notes:

- Removed ApiPilot endpoints, configuration, credential overrides, and HTTP/realtime tool execution.
- Removed browser ApiPilot catalog loading and prompt generation while retaining authenticated MCP discovery.
- Updated regression coverage and operating documentation for the retired routes and settings.

Reviewed-on: AquaPortal/s2s#3
This commit is contained in:
2026-10-08 11:23:41 -04:00
parent 0311d3f1ff
commit dfed03ac7c
39 changed files with 198 additions and 3314 deletions
+5 -336
View File
@@ -2,7 +2,7 @@
"http": {
"config-default": {
"status": 200,
"body": "{\"search\":false,\"lb\":false,\"allowDirect\":true,\"s2sUrl\":\"\",\"primaryPrompt\":\"\",\"reasoningType\":\"PROXY\",\"injectProfile\":false,\"debugPrompt\":false,\"startSessionMode\":\"\",\"theme\":\"\",\"apipilot\":false}",
"body": "{\"search\":false,\"lb\":false,\"allowDirect\":true,\"s2sUrl\":\"\",\"primaryPrompt\":\"\",\"reasoningType\":\"PROXY\",\"injectProfile\":false,\"debugPrompt\":false,\"startSessionMode\":\"\",\"theme\":\"\"}",
"headers": {
"content-type": "application/json"
},
@@ -10,7 +10,7 @@
},
"config-proxy": {
"status": 200,
"body": "{\"search\":false,\"lb\":false,\"allowDirect\":true,\"s2sUrl\":\"wss://voice.test/v1/realtime\",\"primaryPrompt\":\"\",\"reasoningType\":\"PROXY\",\"injectProfile\":false,\"debugPrompt\":false,\"startSessionMode\":\"\",\"theme\":\"\",\"apipilot\":false}",
"body": "{\"search\":false,\"lb\":false,\"allowDirect\":true,\"s2sUrl\":\"wss://voice.test/v1/realtime\",\"primaryPrompt\":\"\",\"reasoningType\":\"PROXY\",\"injectProfile\":false,\"debugPrompt\":false,\"startSessionMode\":\"\",\"theme\":\"\"}",
"headers": {
"content-type": "application/json"
},
@@ -18,7 +18,7 @@
},
"config-direct": {
"status": 200,
"body": "{\"search\":false,\"lb\":false,\"allowDirect\":true,\"s2sUrl\":\"wss://voice.test/realtime?token=fixture\",\"primaryPrompt\":\"\",\"reasoningType\":\"PROXY\",\"injectProfile\":false,\"debugPrompt\":false,\"startSessionMode\":\"\",\"theme\":\"\",\"apipilot\":false}",
"body": "{\"search\":false,\"lb\":false,\"allowDirect\":true,\"s2sUrl\":\"wss://voice.test/realtime?token=fixture\",\"primaryPrompt\":\"\",\"reasoningType\":\"PROXY\",\"injectProfile\":false,\"debugPrompt\":false,\"startSessionMode\":\"\",\"theme\":\"\"}",
"headers": {
"content-type": "application/json"
},
@@ -26,7 +26,7 @@
},
"config-lb": {
"status": 200,
"body": "{\"search\":false,\"lb\":true,\"allowDirect\":false,\"s2sUrl\":\"\",\"primaryPrompt\":\"\",\"reasoningType\":\"PROXY\",\"injectProfile\":false,\"debugPrompt\":false,\"startSessionMode\":\"\",\"theme\":\"\",\"apipilot\":false}",
"body": "{\"search\":false,\"lb\":true,\"allowDirect\":false,\"s2sUrl\":\"\",\"primaryPrompt\":\"\",\"reasoningType\":\"PROXY\",\"injectProfile\":false,\"debugPrompt\":false,\"startSessionMode\":\"\",\"theme\":\"\"}",
"headers": {
"content-type": "application/json"
},
@@ -736,7 +736,7 @@
},
"upstream": []
},
"reasoning-OPENAI-legacy-unbound-token": {
"reasoning-openai-profile-disabled": {
"status": 500,
"body": "Internal Server Error",
"headers": {
@@ -775,279 +775,6 @@
}
}
]
},
"apipilot-disabled-GET": {
"status": 501,
"body": "{\"success\":false,\"data\":null,\"error\":{\"code\":\"APIPILOT_NOT_CONFIGURED\",\"message\":\"ApiPilot no está disponible en este despliegue (S2S_APIPILOT_TOOLS_URL no establecido).\",\"status_code\":501,\"raw\":null}}",
"headers": {
"content-type": "application/json"
},
"upstream": []
},
"apipilot-disabled-POST": {
"status": 501,
"body": "{\"success\":false,\"data\":null,\"error\":{\"code\":\"APIPILOT_NOT_CONFIGURED\",\"message\":\"ApiPilot no está disponible en este despliegue (S2S_APIPILOT_TOOLS_URL no establecido).\",\"status_code\":501,\"raw\":null}}",
"headers": {
"content-type": "application/json"
},
"upstream": []
},
"tools-query-validation": {
"status": 422,
"body": "{\"detail\":[{\"type\":\"bool_parsing\",\"loc\":[\"query\",\"refresh\"],\"msg\":\"Input should be a valid boolean, unable to interpret input\",\"input\":\"invalid\"}]}",
"headers": {
"content-type": "application/json"
},
"upstream": []
},
"tools-list": {
"status": 200,
"body": "{\"success\":true,\"data\":{\"count\":1,\"include_unauthorized\":false,\"tools\":[{\"name\":\"fixture_tool\",\"description\":\"A fixture tool.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\"}},\"required\":[\"count\"]},\"requires_auth\":false}]},\"error\":null}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=false",
"body": "",
"headers": {
"authorization": "Bearer fixture-token",
"x-demo-session": "fixture-session"
}
}
]
},
"tools-result": {
"status": 200,
"body": "{\"success\":true,\"data\":{\"count\":1,\"include_unauthorized\":false,\"tools\":[{\"name\":\"fixture_tool\",\"description\":\"A fixture tool.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\"}},\"required\":[\"count\"]},\"requires_auth\":false}]},\"error\":null}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=false",
"body": "",
"headers": {
"authorization": "Bearer fixture-token",
"x-demo-session": "fixture-session"
}
}
]
},
"tools-envelope": {
"status": 200,
"body": "{\"success\":true,\"data\":{\"count\":1,\"include_unauthorized\":false,\"tools\":[{\"name\":\"fixture_tool\",\"description\":\"A fixture tool.\",\"parameters\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\"}},\"required\":[\"count\"]},\"requires_auth\":false}]},\"error\":null}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=false",
"body": "",
"headers": {
"authorization": "Bearer fixture-token",
"x-demo-session": "fixture-session"
}
}
]
},
"tools-opaque": {
"status": 200,
"body": "{\"success\":true,\"data\":{\"count\":0,\"include_unauthorized\":false,\"tools\":[]},\"error\":null}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=false",
"body": "",
"headers": {
"authorization": "Bearer fixture-token",
"x-demo-session": "fixture-session"
}
}
]
},
"tools-upstream-error": {
"status": 502,
"body": "{\"success\":false,\"data\":null,\"error\":{\"code\":\"APIPILOT_BAD_UPSTREAM\",\"message\":\"Backend ApiPilot tools devolvió HTTP 403\",\"status_code\":403}}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
}
]
},
"execute-discovery-error-envelope": {
"status": 502,
"body": "{\"detail\":{\"code\":\"APIPILOT_BAD_UPSTREAM\",\"message\":\"Backend ApiPilot tools devolvió HTTP 503\",\"status_code\":503}}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
}
]
},
"execute-unknown-tool": {
"status": 404,
"body": "{\"success\":false,\"data\":null,\"error\":{\"code\":\"TOOL_NOT_FOUND\",\"message\":\"Herramienta «unknown» no encontrada en el catálogo ApiPilot. Actualice la lista de herramientas y vuelva a intentarlo.\",\"status_code\":404,\"raw\":null}}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
},
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
}
]
},
"execute-missing-argument": {
"status": 400,
"body": "{\"success\":false,\"data\":null,\"error\":{\"code\":\"INVALID_ARGUMENTS\",\"message\":\"Falta el parámetro requerido: count\",\"status_code\":400,\"raw\":{\"removed\":[]}}}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
}
]
},
"execute-api-key-precheck": {
"status": 401,
"body": "{\"success\":false,\"data\":null,\"error\":{\"code\":\"AUTH_REQUIRED\",\"message\":\"La herramienta «fixture_tool» requiere autenticación. Inicie sesión o proporcione un token para continuar.\",\"status_code\":401,\"raw\":null}}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {
"authorization": "Bearer fixture-key",
"x-demo-session": "fixture-key",
"x-api-key": "fixture-key"
}
}
]
},
"execute-envelope": {
"status": 200,
"body": "{\"success\":true,\"data\":{\"future\":[1,null]},\"error\":null,\"future_envelope\":true}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
},
{
"method": "POST",
"url": "http://tools.test/apipilot/execute",
"body": "{\"name\":\"fixture_tool\",\"arguments\":{\"count\":\"wrong-type-is-accepted\"}}",
"headers": {
"content-type": "application/json"
}
}
]
},
"execute-raw-list": {
"status": 200,
"body": "{\"success\":true,\"data\":[{\"future\":true}],\"error\":null}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
},
{
"method": "POST",
"url": "http://tools.test/apipilot/execute",
"body": "{\"name\":\"fixture_tool\",\"arguments\":{\"count\":\"wrong-type-is-accepted\"}}",
"headers": {
"content-type": "application/json"
}
}
]
},
"execute-minimal-envelope": {
"status": 200,
"body": "{\"success\":true}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
},
{
"method": "POST",
"url": "http://tools.test/apipilot/execute",
"body": "{\"name\":\"fixture_tool\",\"arguments\":{\"count\":\"wrong-type-is-accepted\"}}",
"headers": {
"content-type": "application/json"
}
}
]
},
"execute-error": {
"status": 409,
"body": "{\"success\":false,\"data\":null,\"error\":{\"status_code\":409,\"code\":\"FIXTURE\",\"message\":\"Fixture\",\"future\":true}}",
"headers": {
"content-type": "application/json"
},
"upstream": [
{
"method": "GET",
"url": "http://tools.test/apipilot/tools?include_unauthorized=true",
"body": "",
"headers": {}
},
{
"method": "POST",
"url": "http://tools.test/apipilot/execute",
"body": "{\"name\":\"fixture_tool\",\"arguments\":{\"count\":\"wrong-type-is-accepted\"}}",
"headers": {
"content-type": "application/json"
}
}
]
}
},
"openapi_requests": {
@@ -1055,44 +782,6 @@
"GET /api/config": {
"operationId": "config_api_config_get"
},
"GET /api/apipilot/tools": {
"operationId": "apipilot_list_tools_api_apipilot_tools_get",
"parameters": [
{
"name": "include_unauthorized",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"default": true,
"title": "Include Unauthorized"
}
},
{
"name": "refresh",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"default": false,
"title": "Refresh"
}
}
]
},
"POST /api/apipilot/execute": {
"operationId": "apipilot_execute_api_apipilot_execute_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApipilotExecuteRequest"
}
}
},
"required": true
}
},
"POST /api/reasoning": {
"operationId": "reasoning_api_reasoning_post",
"requestBody": {
@@ -1264,26 +953,6 @@
],
"title": "ReasoningRequest"
},
"ApipilotExecuteRequest": {
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"arguments": {
"additionalProperties": true,
"type": "object",
"title": "Arguments",
"default": {}
}
},
"type": "object",
"required": [
"name"
],
"title": "ApipilotExecuteRequest",
"description": "Body for the ApiPilot execute proxy endpoint. Mirrors §2.2 request shape."
},
"HTTPValidationError": {
"properties": {
"detail": {