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
+19 -10
View File
@@ -45,7 +45,7 @@ and the retained `server:app` shim; use `--app-dir vocero-api` from the root.
## Schema boundaries
`models/requests.py` retains the existing search, reasoning, and ApiPilot
`models/requests.py` retains the existing search and reasoning
request models, including their defaults, coercion, and ignored extra fields.
The queue beacon still accepts malformed JSON and non-object bodies as before;
its Pydantic view is applied only after the original object check, and
@@ -54,9 +54,10 @@ its Pydantic view is applied only after the original object check, and
`models/responses.py` validates structure constructed by this server. Fields
owned by external services remain `Any` where the old parser imposed no type
constraint. Object models allow extra fields. Caller profiles can be arbitrary
JSON; load-balancer fields remain optional; execution results and error details
remain open. Existing provider parsing, authentication precedence, argument
filtering, environment parsing, and WebSocket frames are unchanged.
JSON; load-balancer fields remain optional. Existing provider parsing,
authentication precedence, environment parsing, and WebSocket frames are
preserved outside explicitly retired integrations. Authenticated conversation
and MCP contracts live in `models/mcp.py` and `models/content.py`.
HTTP handlers call `validated_json_response`: Pydantic validates the payload,
then `JSONResponse` serializes the original object. Returning a dumped model
@@ -69,19 +70,23 @@ existing error shapes; there is no new common error envelope.
## Compatibility evidence
`tests/fixtures/legacy-contracts.json` was captured from the original monolithic
server at commit `3d42df5`, before refactoring. Tests compare 82 HTTP scenarios,
server at commit `3d42df5`, before refactoring. Tests compare 66 HTTP scenarios,
including exact response text, statuses, selected headers, and outgoing mock
HTTP requests. They also compare request OpenAPI definitions and representative
realtime frames. Additional tests cover response validation and permissive
upstream values; the original local HTTP/WebSocket tests remain in the suite.
Four captures belonging exclusively to the retired workflow reasoning service
were removed with that integration; all retained captures are unchanged.
were removed with that integration. ApiPilot retirement removed another 16 HTTP
captures, its two OpenAPI operations, and its request model. The four bootstrap
captures now omit the retired `apipilot` flag. One reasoning failure case was
renamed because removing ApiPilot eliminated its token access; it still exposes
the existing uninitialized profile failure. All other retained capture values
are unchanged.
The captures deliberately preserve unknown fields, omitted fields, unusual JSON
values, queue beacon edge cases, permissive tool arguments, and known failures.
Examples include reasoning's existing uninitialized local variables in certain
configuration combinations, API-key-only tool precheck behavior, the catalog
cache's existing key, and relay termination after a suppressed invalid
values, queue beacon edge cases, and known failures. Examples include reasoning's
existing uninitialized profile in certain non-MCP configuration combinations
and relay termination after a suppressed invalid
`session.update` error. Fix those in separately reviewed behavior changes;
do not regenerate golden captures to make a refactor pass.
@@ -90,3 +95,7 @@ provider responses, live speech models, or production configuration. No deployed
services or real credentials are needed. The Docker check verifies the actual
runtime image, API configuration, documentation, OpenAPI, and the backend's
existing root 404; it removes its temporary container and image afterward.
ApiPilot removal deliberately excludes `speech_to_speech/`. The MCP orchestration
test still exercises its existing pure marker sanitizer without importing model
dependencies, verifying that `VOCERO_MCP_CALL` reaches the Vocero relay unchanged.