Skip to content

Runtime API overview

alquimia-runtime exposes a single HTTP API for agent inference, registry management, session state, webhooks, and knowledge operations. It is the boundary between your applications and the Alquimia Platform execution engine.

The runtime API handles:

  • Authentication — API tokens, JWT, and Keycloak OIDC.
  • Inference — synchronous and streaming agent execution via SSE.
  • Registry — storing, versioning, and retrieving agent configurations.
  • State — querying and resuming task state.
  • Channels — webhook endpoints for WhatsApp, Slack, Email, and custom adapters.
  • Webhooks — subscribing to and emitting platform events.

Inference is non-blocking. A client posts a request and receives a task identifier, then opens an SSE stream to receive progress events and the final response.

POST /event/infer/{assistant_id}
task_id returned
GET /event/stream/{task_id}
SSE events ──► final response

This design keeps long-running agents from tying up HTTP connections and lets workers scale independently.

All endpoints except /health/* and the channel webhook paths require a Bearer token in the Authorization header when AUTH_PROVIDER=api_token (the default).

MethodPathAuthSummary
GET/health/livenessNoLiveness probe
GET/health/readinessNoReadiness probe (checks DB + Redis)
POST/auth/refreshNoRefresh a Keycloak access token
POST/event/infer/{assistant_id}YesTrigger agent inference
GET/event/infer/{assistant_id}/{channel_id}Channel verifierChannel webhook challenge
POST/event/infer/{assistant_id}/{channel_id}Channel verifierChannel inference
GET/event/stream/{task_id}YesStream inference events (SSE)
POST/event/tool-approvalYesSubmit human tool approval
POST/event/tool-completionYesSubmit client-side tool result
POST/context/persistNoPersist conversation context
GET/context/retrieveYesRetrieve conversation context
POST/context/blob/uploadYesUpload a blob to session context
GET/context/blob/download/{blob_id}YesDownload a session blob
GET/registry/YesGet a registry (agentspace)
POST/registry/YesCreate a registry
PUT/registry/YesUpdate a registry
DELETE/registry/YesDelete a registry
POST/registry/queryYesQuery registries by filter
POST/registry/validateYesValidate and migrate agent specs
POST/registry/agentYesCreate or update an agent
POST/registry/agent/queryYesQuery agents by filter
DELETE/registry/agentYesDelete agents by filter
PUT/registry/agent/hold/{assistant_id}YesPut an agent on hold
PUT/registry/agent/unhold/{assistant_id}YesRemove an agent from hold
POST/registry/secretYesAdd a secret to a registry
GET/registry/secretYesList secrets in a registry
POST/registry/secret/queryYesQuery secrets by filter
POST/registry/secret/inspect/{assistant_id}YesInspect secrets for an agent
DELETE/registry/secretYesDelete secrets by filter
POST/registry/modelYesAdd a model registration to a registry
GET/registry/modelYesList model registrations in a registry
POST/registry/model/queryYesQuery model registrations by filter
DELETE/registry/modelYesDelete model registrations by filter
POST/registry/brainYesRegister a Boltzmann brain
PUT/registry/brain/{brain_id}YesUpdate a brain registration
GET/registry/brainYesList registered brains
GET/registry/brain/{brain_id}YesGet one brain registration
POST/registry/brain/queryYesQuery brains by filter
DELETE/registry/brainYesDeregister brains by filter
POST/registry/parametersYesAdd parameters to a registry
POST/registry/parameters/queryYesQuery parameters by filter
DELETE/registry/parametersYesDelete parameters by filter
GET/registry/explore/reposYesList OCI registry repositories
GET/registry/explore/tagsYesList tags for an OCI repository
PUT/registry/publishYesPublish a registry to OCI
PUT/registry/unpublishYesRemove a registry from OCI
PUT/registry/pullYesPull a registry from OCI and rehydrate local knowledge bases
GET/toolsYesList tool registrations
GET/tools/{registered_tool_id}YesGet a tool registration
POST/toolsYesRegister or update a tool (admin only)
PUT/tools/{registered_tool_id}/operationsYesReplace a tool’s operations (admin only)
DELETE/tools/{registered_tool_id}YesDelete a tool registration (admin only)
GET/knowledge/topicsYesList knowledge topics
GET/knowledge/topics/{topic_id}YesGet a topic by ID
POST/knowledge/topicsYesCreate a topic
DELETE/knowledge/topics/{topic_id}YesDelete a topic
PUT/knowledge/topics/{topic_id}/updateYesUpdate a topic
PUT/knowledge/topics/{topic_id}/tagYesTag a topic
PUT/knowledge/topics/{topic_id}/untagYesUntag a topic
POST/knowledge/topics/search/{topic_id}YesSemantic search within a topic
PUT/knowledge/topics/{topic_id}/add/{file_id}YesAdd a file to a topic
PUT/knowledge/topics/{topic_id}/remove/{file_id}YesRemove a file from a topic
GET/knowledge/filesYesList knowledge files
POST/knowledge/files/uploadYesUpload a knowledge file
GET/knowledge/files/download/{file_id}YesDownload a knowledge file
DELETE/knowledge/files/delete/{file_id}YesDelete a knowledge file
PUT/knowledge/files/{file_id}/tagYesTag a knowledge file
PUT/knowledge/files/{file_id}/untagYesUntag a knowledge file
PUT/task/state/{task_id}/{state_id}YesUpdate controller state (run/stop/restart)
GET/worklog/YesList inference runs (paginated, with filters)
GET/worklog/{task_id}YesFull detail for one inference run
GET/worklog/{task_id}/eventsYesAll worklog events for a task
GET/worklog/{task_id}/verifyYesVerify the tamper-evident hash chain for a task
POST/webhooks/YesRegister a webhook subscription
GET/webhooks/YesList webhook subscriptions for an agentspace
GET/webhooks/{id}YesGet a webhook subscription
PUT/webhooks/{id}YesUpdate a webhook subscription (URL, event types, active, rotate key)
DELETE/webhooks/{id}YesDelete a webhook subscription

The two /event/infer/{assistant_id}/{channel_id} endpoints are public webhook URLs intended to be called by external channel providers (WhatsApp, Slack, email gateways, etc.). Authentication is provider-specific and implemented by the channel itself.

Trigger inference for a named agent. Returns a CommonAttributes object containing the task_id you can use to stream results.

Path parameter: assistant_id — the agent identifier in the registry.

Query parameter: agentspace_id (default: "default") — the registry namespace.

Request body

FieldTypeRequiredDescription
querystring or arrayYesPlain text or OpenAI-style content parts for multimodal input
task_idstringNoAuto-generated if omitted
session_idstringNoAuto-generated if omitted
user_idstringNoAuto-generated if omitted
extra_instructionsobjectNoKey-value pairs injected as prompt clauses
evaluation_strategyobjectNoOverride the agent’s evaluation strategy
knowledge_basearrayNoAdditional knowledge bases to include

Responses

CodeDescription
200CommonAttributes with task_id, session_id, assistant_id, agentspace_id
400Agent not found, on hold, or missing secrets
500Connection error (Redis, Kafka, or downstream service)

Example:

Terminal window
curl -X POST http://localhost:8080/event/infer/support-bot \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "What is your return policy?",
"session_id": "session-abc123",
"user_id": "user-42"
}'

Stream inference progress as Server-Sent Events. Poll this after calling /event/infer/.

Terminal window
curl -N http://localhost:8080/event/stream/task-abc123 \
-H "Authorization: Bearer $API_TOKEN"

The stream emits WorklogRecord events and closes when an AssistantInferenceResponse event is received.

Query the persistent inference history stored in PostgreSQL. Supports filtering by session_id, user_id, assistant_id, agentspace_id, final_status, started_after, and started_before. Paginated via limit (1–200) and offset.

Terminal window
curl "http://localhost:8080/worklog/?assistant_id=support-bot&limit=20" \
-H "Authorization: Bearer $API_TOKEN"

Verify the tamper-evident hash chain for a task. The endpoint walks every worklog event in insertion order and checks that previous_hash links and entry_hash values match the canonical payload. If any row has been modified or reordered, the first break is returned.

Terminal window
curl "http://localhost:8080/worklog/task-abc123/verify" \
-H "Authorization: Bearer $API_TOKEN"

Validates all agent specs in a registry and applies automatic migrations. Use dry_run=true to preview changes without committing them.

Terminal window
curl -X POST "http://localhost:8080/registry/validate?agentspace_id=default&dry_run=true" \
-H "Authorization: Bearer $API_TOKEN"

Register an external HTTP endpoint to receive CloudEvents when inference events fire. The signing_key is returned only on creation.

Request body

FieldTypeRequiredDescription
agentspace_idstringYesAgentspace scope
sink_urlstringYeshttp:// or https:// endpoint
assistant_idstringNoLimit delivery to one agent
event_typesarrayNoEvent types to forward; empty = all
signing_keystringNo64-character hex HMAC-SHA256 key; auto-generated if omitted

Every POST to your sink includes:

  • Content-Type: application/cloudevents+json
  • X-Webhook-Signature: sha256=<hex>
  • X-Webhook-Event
  • X-Alquimia-Agentspace

Verify the signature with HMAC-SHA256 of the raw request body using the signing key.

The /registry/* endpoints mutate the local TinyDB agentspace store. In production, registry write endpoints should only be reachable from the master instance; workers mount the registry read-only.

GET /registry/, POST /registry/, PUT /registry/, DELETE /registry/

Section titled “GET /registry/, POST /registry/, PUT /registry/, DELETE /registry/”

Create, read, update, and delete agentspaces.

Terminal window
# Create an agentspace
curl -X POST http://localhost:8080/registry/ \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "production", "namespace": "production"}'

Create or update an agent in the agentspace. The body is a full AssistantConfig JSON document.

Terminal window
curl -X POST http://localhost:8080/registry/agent?agentspace_id=default \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d @support-bot.json

PUT /registry/publish and PUT /registry/pull

Section titled “PUT /registry/publish and PUT /registry/pull”

Publish pushes the agentspace as a signed OCI artifact. Pull fetches an artifact and rehydrates local knowledge bases.

Terminal window
curl -X PUT "http://localhost:8080/registry/publish?agentspace_id=default&tag=v1.0.0" \
-H "Authorization: Bearer $API_TOKEN"
curl -X PUT "http://localhost:8080/registry/pull?agentspace_id=default&source_repo_id=ghcr.io/acme/alquimia/default:v1.0.0" \
-H "Authorization: Bearer $API_TOKEN"

See Publish and pull an agentspace and Registry & OCI.

POST /registry/secret/inspect/{assistant_id}

Section titled “POST /registry/secret/inspect/{assistant_id}”

Returns the resolved status of every secret referenced by an agent, which is useful when inference fails with missing-secret errors.

Terminal window
curl -X POST "http://localhost:8080/registry/secret/inspect/support-bot?agentspace_id=default" \
-H "Authorization: Bearer $API_TOKEN"

Tool registration endpoints are admin-only in most deployments because a tool’s connection config and operation classification form the trust boundary.

Register or update a ToolRegistration, including per-operation classification.

Terminal window
curl -X POST http://localhost:8080/tools \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"registered_tool_id": "filesystem-tools",
"provider_id": "mcp",
"connection_config": {"url": {"$secretRef": "MCP_PROVIDER_URL"}},
"operations": [
{"name": "list_files", "match": "exact", "severity": "read-only", "tier_grants": ["reader", "editor", "operator"]},
{"name": "delete_*", "match": "glob", "severity": "destructive", "tier_grants": ["operator"], "approval_required": true}
]
}'

See Authorization policies for how tier_grants and severity interact with agent role tiers.

Create a topic.

Terminal window
curl -X POST http://localhost:8080/knowledge/topics \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"topic_id": "product-docs",
"description": "Product documentation",
"connector": {"provider_id": "qdrant"}
}'

Upload a file. The response contains a file_id.

Terminal window
curl -X POST http://localhost:8080/knowledge/files/upload \
-H "Authorization: Bearer $API_TOKEN" \
-F "file=@release-notes.pdf"

PUT /knowledge/topics/{topic_id}/add/{file_id}

Section titled “PUT /knowledge/topics/{topic_id}/add/{file_id}”

Associate an uploaded file with a topic. Optionally chunk and embed it by passing ?hydrate=true.

Terminal window
curl -X PUT "http://localhost:8080/knowledge/topics/product-docs/add/<file_id>?hydrate=true" \
-H "Authorization: Bearer $API_TOKEN"

Run a semantic search within a topic.

Terminal window
curl -X POST "http://localhost:8080/knowledge/topics/search/product-docs" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "return policy", "k": 4}'

See How to ingest files into a topic for the full workflow.

Update the controller state of an inference task. Supported states are typically run, stop, and restart.

Terminal window
curl -X PUT http://localhost:8080/task/state/task-abc123/stop \
-H "Authorization: Bearer $API_TOKEN"

The two /event/infer/{assistant_id}/{channel_id} endpoints are public webhook URLs:

  • GET handles provider challenge handshakes via the channel’s resolve_challenge method.
  • POST accepts inbound messages and calls the channel’s verify_inbound method before running inference.

A channel that does not implement provider-specific auth is rejected unless CHANNEL_AUTH_REQUIRED=false.

Select the auth backend with AUTH_PROVIDER:

ModeHow it works
api_token (default)Pass Authorization: Bearer $API_TOKEN on every request
jwtSet JWT_SECRET and pass a signed JWT as the Bearer token
keycloakValidate tokens against a Keycloak realm; use /auth/refresh to refresh access tokens

See Authentication & authorization for deployment guidance.