Ejecutar una evaluación mediante la API
Inicia una evaluación para uno de tus miembros desde tu propio backend y conduce la conversación en tu propia interfaz.
Usa esta API para conducir la conversación en tu propia interfaz (una app móvil nativa, una herramienta de escritorio, un proceso de backend o cualquier superficie en la que tú muestres la conversación y seas dueño de cada turno). Claire, el agente de IA, sigue haciendo las preguntas y puntuando las evidencias; tú transportas los mensajes.
¿Prefieres que Wiselook muestre la conversación en tu propio sitio web? Entonces integra el widget: Wiselook se encarga del streaming y de la sesión, y tu backend solo emite sesiones de visitante.
Obtener el consentimiento te corresponde a ti. Eres el responsable del tratamiento de los datos de tus miembros. Iniciar una evaluación no avisa a nadie, así que asegúrate de que la persona ha dado su conformidad antes de empezar.
Requisitos previos
- Un cliente API con el permiso
evaluations:write, másevaluations:readpara consultar el resultado. - Un bearer token emitido desde ese cliente, como se describe en
Autenticación. Los ejemplos siguientes suponen que está
en
$TOKEN. - Un miembro al que evaluar. Este flujo evalúa a personas que ya están en tu lista de Miembros, y nunca las crea. Para añadir a alguien primero, consulta Invitar miembros en bloque.
- Una de las metodologías adoptadas por tu organización (tenant).
1. Encuentra al miembro
Cada evaluación nombra a la persona a la que corresponde. Usa el id del miembro, tal como lo
devuelve la API de Miembros:
curl "https://$WISELOOK_HOST/v1/tenant-users?email=maria@example.com" \
-H "Authorization: Bearer $TOKEN"
Leer miembros requiere el permiso tenant_users:read. Consulta
Gestionar miembros mediante la API.
2. Inicia la evaluación
curl -X POST "https://$WISELOOK_HOST/v1/members/$TENANT_USER_ID/evaluations" \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"methodology_id": "<ADOPTED_METHODOLOGY_UUID>"}'
{
"id": "7c1e9a04-…",
"tenant_user_id": "3f8b2d61-…",
"methodology_id": "009f91ce-…",
"status": "in_progress",
"locale": "en-US",
"channel": "text",
"created_at": "2026-09-18T09:14:22Z"
}
Guarda el id. Es el evaluation_id que usan todas las llamadas posteriores. La fila devuelve
el miembro como tenant_user_id: el mismo id que pasaste en la ruta, con el nombre del campo que
ocupa en la evaluación.
| Campo | Obligatorio | Notas |
|---|---|---|
methodology_id | sí | Debe ser una que tu organización haya adoptado |
locale | no | Por defecto, el idioma preferido del miembro y, si no, el predeterminado de la metodología |
channel | no | text (por defecto) o voice. Queda fijado en cuanto empieza la evaluación |
El idioma y el canal no se pueden cambiar después.
Rechazos habituales:
| Estado | Significado |
|---|---|
400 | La persona no es un miembro evaluable de tu organización. Los miembros eliminados y los ids desconocidos responden igual |
403 | Al token le falta evaluations:write |
409 | Se ha agotado tu saldo de evaluaciones |
422 | Tu organización no ha adoptado la metodología, o un campo no es válido |
3. Conduce la conversación
Envía cada turno de la persona al endpoint de chat. La respuesta llega en streaming como server-sent events:
curl -N -X POST \
"https://$WISELOOK_HOST/v1/members/$TENANT_USER_ID/evaluations/$EVALUATION_ID/chat/messages" \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"content": "Hello"}'
Qué se recibe
La respuesta es text/event-stream. Cada evento es una línea SSE event: y una línea data:
con JSON. El JSON repite el nombre del evento en un campo type, así que puedes ramificar según
cualquiera de los dos:
event: message_start
data: {"type": "message_start", "message_id": "m_resp_7c1e9a04_1", "role": "assistant"}
event: message_delta
data: {"type": "message_delta", "message_id": "m_resp_7c1e9a04_1", "content_delta": "Got "}
event: message_delta
data: {"type": "message_delta", "message_id": "m_resp_7c1e9a04_1", "content_delta": "it. "}
event: message_delta
data: {"type": "message_delta", "message_id": "m_resp_7c1e9a04_1", "content_delta": "Tell me about a deadline you missed. "}
event: message_complete
data: {"type": "message_complete", "message_id": "m_resp_7c1e9a04_1", "content": "Got it. Tell me about a deadline you missed. "}
event: progress_update
data: {"type": "progress_update", "current_eco_id": "3f2a7b18-…", "progress_percent": 25}
event: stream_end
data: {"type": "stream_end", "reason": "complete"}
Son eventos semánticos, nunca tokens en bruto del modelo.
| Evento | Campos | Qué hacer con él |
|---|---|---|
message_start | message_id, role | Empieza una respuesta |
message_delta | message_id, content_delta | Añade el fragmento a lo que estás mostrando |
message_complete | message_id, content | La respuesta completa, ya ensamblada. Úsala para verificar lo que has mostrado |
progress_update | progress_percent, current_eco_id | Actualiza cualquier indicador de progreso |
assessment_complete | evaluation_id, status | La conversación ha terminado. Deja de enviar turnos |
stream_end | reason | El stream de este turno se ha cerrado |
Cada turno termina con stream_end. En el último turno, y solo entonces, assessment_complete
llega justo antes.
Gestionar el bucle
Una petición por turno. Lee el stream hasta el final, muestra la respuesta, recoge la respuesta
de la persona y envía el siguiente turno. Sigue hasta que veas assessment_complete.
import json, requests
BASE = f"https://{WISELOOK_HOST}/v1/members/{tenant_user_id}/evaluations/{evaluation_id}"
HEADERS = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
def send_turn(text: str) -> tuple[str, bool]:
"""Send one turn. Returns the assistant's reply and whether we are done."""
reply, done = "", False
with requests.post(
f"{BASE}/chat/messages", headers=HEADERS, json={"content": text}, stream=True
) as r:
r.raise_for_status()
for line in r.iter_lines(decode_unicode=True):
if not line or not line.startswith("data: "):
continue # the `event:` line repeats what `type` already tells us
event = json.loads(line[len("data: "):])
if event["type"] == "message_delta":
reply += event["content_delta"]
print(event["content_delta"], end="", flush=True)
elif event["type"] == "assessment_complete":
done = True
elif event["type"] == "error":
raise RuntimeError(event["message"])
return reply, done
done = False
answer = "Hello"
while not done:
_, done = send_turn(answer)
if not done:
answer = input("\n> ")
Tres cosas con las que este ejemplo tiene cuidado, porque es fácil equivocarse:
- Lee hasta el final del stream antes de enviar el siguiente turno. Un turno termina cuando su stream se cierra, no cuando deja de llegar texto.
- Un error llega dentro de un stream sano. El estado HTTP ya es
200cuando empiezan a fluir los eventos, así que un fallo a mitad de turno llega como un eventoerrorseguido destream_endconreasonigual aerror. Gestiona el evento; no te fíes solo del código de estado. La carga deerrorllevacode,messageyretryable, para que puedas distinguir un fallo transitorio de uno que merece la pena mostrar. - Acumula tú los deltas.
message_completelleva el texto completo, así que puedes usarlo para comprobar lo que has ensamblado, o simplemente mostrarlo si no quieres hacer streaming.
El endpoint de conversación está anidado bajo la evaluación a propósito. La evaluación a la que pertenece forma parte de la dirección, así que nunca se puede enviar un turno a la conversación de otra persona por error.
4. Lee el resultado
Tras assessment_complete, la puntuación se calcula en segundo plano. La evaluación pasa a
completed cuando el informe está listo. Consúltala periódicamente:
curl "https://$WISELOOK_HOST/v1/members/$TENANT_USER_ID/evaluations/$EVALUATION_ID" \
-H "Authorization: Bearer $TOKEN"
Leer requiere el permiso evaluations:read, distinto del evaluations:write que inicia una
evaluación. Un cliente que solo consulta resultados no debería poder iniciarlos también. Concede
ambos a un mismo cliente si hace las dos cosas.
Las puntuaciones y los campos del informe siguen en null hasta que el estado es completed.
Qué puedes y qué no puedes hacer
- No puedes evaluar a un miembro eliminado. Los miembros invitados, que todavía no han iniciado sesión, sí se pueden evaluar.
- Una evaluación pertenece a la organización que la creó. Un token de otra organización no puede leerla ni enviarle turnos.
- Aquí miembros, en el widget visitantes. Un miembro está en tu lista de Miembros con un rol, un estado y etiquetas. Un visitante del widget se identifica por la cadena que tu backend pasa al emitir la sesión, y es un registro aparte incluso cuando esa cadena nombra a alguien que también es miembro. Elige la vía que corresponde a quién estás evaluando.
Consulta también
- Invitar miembros en bloque para añadir a las personas que quieres evaluar.
- Gestionar miembros mediante la API para encontrar sus ids.
- Clientes API para crear el cliente y elegir sus permisos.
- Integrar el widget para que sea Wiselook quien aloje la conversación en tu sitio.