Skip to content

Interfaz REST ​

Salvo que se indique lo contrario, todas las interfaces requieren la API Key del inquilino en la cabecera:

Authorization: Bearer <API Key del inquilino>

La dirección por defecto es http://localhost:8787 y el inquilino de demostración es demo (la apiKey se genera aleatoriamente en el primer arranque y se imprime en el registro). Esta página es una referencia para integraciones; los usuarios normales no necesitan preocuparse por ella.

Iniciar el servidor ​

bash
# Se puede iniciar sin clave de modelo (autenticación/sesiones/interfaces se pueden probar; solo la conversación dará error)
pnpm run server

# Con un modelo real (recomendado)
OPENAI_API_KEY=sk-... OPENAI_MODEL=gpt-4o-mini pnpm run server

Variables principales: PORT (8787 por defecto), DATA_DIR (./.zqagent_data por defecto), APPROVAL_TIMEOUT_SECONDS (tiempo de espera de aprobaciones/preguntas, 900 por defecto), TENANT_ID / TENANT_API_KEY / MODEL (inquilino de demostración).

Autenticación ​

bash
export BASE=http://localhost:8787
export TOKEN=zk_xxxx   # la apiKey de la línea «已创建演示租户» del registro de arranque

# Comprobación de estado (pública)
curl -s $BASE/healthz                 # => {"status":"ok"}

# Sin Key → 401
curl -s -o /dev/null -w "%{http_code}\n" $BASE/api/v1/sessions   # => 401

# Key correcta → 200
curl -s -o /dev/null -w "%{http_code}\n" -H "Authorization: Bearer $TOKEN" $BASE/api/v1/sessions

Endpoints principales ​

Conversaciones ​

MétodoRutaDescripción
GET/healthzComprobación de estado (pública)
POST/api/v1/sessionsCrear conversación
GET/api/v1/sessionsListar conversaciones
GET/api/v1/sessions/{id}Obtener conversación
PATCH/api/v1/sessions/{id}Renombrar conversación
DELETE/api/v1/sessions/{id}Eliminar conversación
GET/api/v1/sessions/{id}/stateEstado (incluye aprobaciones/preguntas pendientes)
PATCH/api/v1/sessions/{id}/modelCambiar el modelo de la conversación
PATCH/api/v1/sessions/{id}/modeCambiar el modo de permisos (plan / interactive / auto / discuss)
PATCH/api/v1/sessions/{id}/draftGuardar el borrador del cuadro de entrada (cadena vacía = borrar)
POST/api/v1/sessions/{id}/turnsEnviar tarea
POST/api/v1/sessions/{id}/steerInformación adicional en ejecución
POST/api/v1/sessions/{id}/interruptInterrumpir la tarea actual
POST/api/v1/sessions/{id}/resumeReanudar la conversación
GET/api/v1/sessions/{id}/eventsFlujo de eventos (sondeo o SSE, con ?since= incremental)
GET/api/v1/sessions/{id}/approvalsAprobaciones pendientes
POST/api/v1/sessions/{id}/approvals/{aid}Responder a una aprobación
GET/api/v1/sessions/{id}/questionsPreguntas pendientes
POST/api/v1/sessions/{id}/questions/{qid}Responder a una pregunta

Proyectos y nodos ​

MétodoRutaDescripción
GET / POST/api/v1/projectsListar / crear proyectos (indica el directorio de trabajo al crear)
DELETE/api/v1/projects/{id}Eliminar proyecto
GET/api/v1/modelsModelos disponibles
GET / PUT/api/v1/configVer / actualizar la configuración del nodo
GET / PUT/api/v1/node/llmVer / definir el modelo predeterminado del nodo
GET/api/v1/node/hostInformación del host del nodo
GET/api/v1/toolsLista de herramientas
GET/api/v1/mcpLista de servidores MCP
PUT/api/v1/mcpReemplazar toda la configuración MCP (escribe .agent/mcp.json; 409 si la entrega la plataforma)
POST/api/v1/mcp/testProbar la conexión de un servidor MCP (sin guardar)

Uso y coste ​

MétodoRutaDescripción
GET/api/v1/usage/summaryResumen de uso (por periodo / modelo)
GET/api/v1/usage/recordsRegistros de detalle
GET/api/v1/usage/exportExportar CSV
GET / PUT/api/v1/usage/pricingVer / modificar la tabla de precios
POST/api/v1/usage/rebuildReconstruir el resumen
POST/api/v1/usage/verifyVerificar el libro mayor

Acceso remoto y emparejamiento ​

MétodoRutaDescripción
GET/api/v1/fleet/statusEstado de conexión del nodo
POST/api/v1/fleet/enrollConectar con código (lo llama zqagent link)
POST/api/v1/fleet/unlinkDesconectar
GET/api/v1/fleet/pairingInformación de emparejamiento en la nube (pasarela + espacio de nombres/clave + nodeId)
GET / POST/api/v1/notificationsVer / añadir canales de notificación
DELETE/api/v1/notifications/{id}Eliminar un canal de notificación

Inicio rápido ​

bash
# Crear una conversación
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"model":"gpt-4o-mini"}' $BASE/api/v1/sessions
# => {"data":{"sessionId":"e4df66d6...","status":"idle",...}}

export SID=e4df66d6...   # sustituye por el sessionId devuelto

# Enviar tarea (responde de inmediato; se ejecuta en segundo plano)
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"input":"Hola, preséntate"}' $BASE/api/v1/sessions/$SID/turns
# => {"data":{"accepted":true,"status":"running"}}

# Sondear eventos (incremental con el cursor since)
curl -s "$BASE/api/v1/sessions/$SID/events?since=0"

# Suscripción en tiempo real (SSE)
curl -N -H "Authorization: Bearer $TOKEN" -H "Accept: text/event-stream" \
  $BASE/api/v1/sessions/$SID/events

Si la conversación está ejecutando una tarea, POST /turns se convierte automáticamente en información adicional inyectada en la tarea actual (devuelve {"data":{"accepted":true,"status":"steering"}}), en lugar de dar error.

Aprobaciones y preguntas ​

Cuando el modelo pide una operación con efectos secundarios (escribir archivos, ejecutar comandos, etc.) queda suspendido esperando aprobación; al llamar a herramientas como ask_user queda suspendido esperando respuesta.

bash
# Ver aprobaciones pendientes (el id es el ID de la llamada a la herramienta)
curl -s -H "Authorization: Bearer $TOKEN" $BASE/api/v1/sessions/$SID/approvals

# Responder a la aprobación: once | always_tool | always_command | deny
#   always_command solo es válido para run_shell
export AID=call_xxx
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"decision":"once"}' $BASE/api/v1/sessions/$SID/approvals/$AID

# Responder a una pregunta
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"answer":"continúa"}' $BASE/api/v1/sessions/$SID/questions/qid_xxx

Aislamiento multiinquilino ​

Cada inquilino accede a sus conversaciones con su propia API Key; usar la Key del inquilino A para una conversación del inquilino B devuelve 404.

Códigos de error ​

HTTPcodeSituación
401unauthorizedSin Key / Key no válida
404not_foundConversación inexistente / ruta desconocida / acceso entre inquilinos
409not_runningAl hacer steer explícito, la conversación no está en ejecución
409has_pending_interactionHay aprobaciones/preguntas pendientes y no se puede enviar una tarea nueva
400bad_requestJSON del body no válido / input vacío
400invalid_decisiondecision no válida, o always_command en algo que no es run_shell