Decisions
Haz preguntas estructuradas sobre un texto (qué equipo, cuánto enfado, si algo es cierto) y recibe respuestas con un formato fijo en lugar de párrafos. Para derivar tickets, puntuar opiniones y revisar correos o formularios.
Decisions sirve para esas preguntas que te haces una y otra vez sobre el mismo tipo de texto: qué equipo debe ocuparse de este ticket, hasta qué punto está molesto este cliente, si este correo pide un reembolso. Pega el texto, escribe las preguntas y cada respuesta llega con la forma que hayas definido: una de tus opciones, un nivel de tu escala o un valor entre falso y verdadero. Obtienes respuestas sobre las que puedes actuar, no párrafos que leer.
Las respuestas de elección y de puntuación muestran el grado de seguridad del modelo y cómo se ha repartido la probabilidad entre tus opciones, así que ves de un vistazo si la respuesta estaba clara o muy reñida. Decisions funciona con Jev 1.13, de TypeSafe AI, un modelo de decisión: en lugar de redactar texto, responde a tus preguntas con las formas que tú defines.
Tipos de pregunta
Decisions está en Apps, en la tarjeta que dice Classify, score and check text with structured questions. Una misma decisión puede hacer varias preguntas sobre el mismo texto, y cada pregunta es de uno de estos tres tipos:
| Tipo | Qué escribes | Qué recibes |
|---|---|---|
| Choice | Una pregunta y sus opciones. Cada opción tiene un nombre y una descripción When it applies (cuándo se aplica). | La opción que ha elegido el modelo, un grado de confianza y la probabilidad de cada opción. |
| Score | Una pregunta y sus niveles, del más bajo al más alto, cada uno descrito en una frase. Los niveles se numeran 0, 1, 2, etc. | El nivel, una puntuación en esa escala, como 1.9 / 2, un grado de confianza y la probabilidad de cada nivel. |
| True / false | Una afirmación y, si quieres, criterios que indiquen cuándo se cumple y cuándo no. | Un valor de 0 (falso) a 1 (verdadero), como 0.97. |
Crea una decisión
- Empieza una decisión nueva
Ve a Apps y elige Decisions. La página muestra tus decisiones anteriores; selecciona New decision.
- Pega el texto
En TEXT, pega lo que quieres revisar: un ticket de soporte, una reseña, un correo, el envío de un formulario.
- Añade tus preguntas
En QUESTIONS, añade una pregunta con Choice, Score o True / false.
- Choice. Escribe la pregunta, por ejemplo ¿Qué equipo debe ocuparse de esto? Ponle un nombre a cada opción y describe When it applies. Add option añade otra.
- Score. Escribe la pregunta, por ejemplo ¿Qué nivel de frustración tiene el cliente? Describe cada nivel, del más bajo al más alto. Add level añade uno y las flechas arriba y abajo cambian su orden.
- True / false. Escribe la afirmación, por ejemplo El cliente amenaza con darse de baja. Si quieres, rellena los Criteria, que se responden de 0 (falso) a 1 (verdadero): TRUE para cuando se cumple (Menciona un intento o un ticket anterior) y FALSE para cuando no.
- Comprueba el modelo
El panel MODEL muestra el modelo que va a responder. Jev 1.13, de TypeSafe AI, es el predeterminado.
- Ejecútala
Selecciona Run decision. Las respuestas aparecen en el panel ANSWERS. Para probar con otra redacción, edita el texto o las preguntas y selecciona Run again.
Ejemplo: clasificar un ticket de soporte
Este es el caso que aparece en la grabación de arriba. El equipo de soporte de Northwind recibe un mensaje como este de una clienta, Marta:
Hola, pedí una manta de merino (pedido NW-4471) y todavía no ha llegado.
Ya es el segundo pedido con ustedes que se pierde. Me estoy planteando en serio
darme de baja de la suscripción. - Marta
Tres preguntas sobre el mensaje:
| Pregunta | Tipo | Opciones o niveles | Respuesta |
|---|---|---|---|
| ¿Qué equipo debe ocuparse de esto? | Choice | billing: pagos, reembolsos y facturas. shipping: entregas, seguimiento y paquetes perdidos. product: preguntas sobre nuestros productos. | shipping, con un 100 % de confianza |
| ¿Qué nivel de frustración tiene el cliente? | Score | 0 Tranquilo, 1 Frustrado pero educado, 2 Muy molesto, a punto de irse | Muy molesto, a punto de irse: 1.9 / 2, con un 79 % de confianza (0 %, 14 % y 86 % para los tres niveles) |
| El cliente amenaza con darse de baja | True / false | Sin criterios | 0.97 |
Cada respuesta se traduce en una acción: el ticket va a la cola de envíos, y la puntuación de frustración y el indicador de baja lo marcan para darle una respuesta rápida y cuidadosa antes de que Marta se vaya.
Interpreta las respuestas
- Choice. La opción que ha elegido el modelo, con un grado de confianza como 100% confidence, y la probabilidad de cada opción en forma de barra con su porcentaje. Las barras muestran lo reñida que ha estado la respuesta: si dos opciones quedan casi empatadas, conviene que lo mire una persona; si hay una ganadora clara, normalmente no hace falta.
- Score. El nivel en el que ha quedado el texto, una puntuación en tu escala como 1.9 / 2, un grado de confianza como 79% confidence y la probabilidad de cada nivel. La puntuación puede quedar entre dos niveles, así que sirve tanto para ordenar como para etiquetar.
- True / false. Un valor entre 0 y 1 en una barra que va de False a True. Cuanto más cerca de 1, más claramente se cumple la afirmación; cuanto más cerca de 0, más claramente no se cumple.
Decisiones guardadas
Cada decisión se guarda con su texto, sus preguntas y sus respuestas. La página Decisions muestra las decisiones que has creado en una tabla con las columnas Text, Model, Status y Created, y New decision empieza otra.
Una decisión guardada es un registro exacto de lo que se preguntó y de lo que se respondió, algo muy útil cuando alguien pregunta más tarde por qué un ticket acabó donde acabó.
Guardrails y acceso
Decisions sigue las mismas reglas del espacio de trabajo que el chat:
- Guardrails. Los guardrails (barreras de protección) de tu espacio de trabajo revisan el texto y cada pregunta y descripción antes de que el modelo los vea. Según cómo estén configurados, los datos sensibles se enmascaran o la ejecución se bloquea.
- Acceso a modelos y residencia de datos. Los ajustes de acceso a modelos y de residencia de datos de tu espacio de trabajo se aplican a Jev igual que a cualquier otro modelo. Si te lo impiden, no puedes ejecutar decisiones con él.
Desde la API
Decisions tiene sus propios endpoints REST, así que puedes hacer las mismas preguntas sobre cada ticket, reseña o correo nuevo desde tu propio código. Todas las rutas son relativas a https://api.stickyprompts.com/api/v1, y cada petición envía tu clave de API como bearer token en la cabecera Authorization. ¿Es la primera vez que usas la API? Empieza por el Inicio rápido.
La clave necesita estos permisos (en el editor de claves de la aplicación aparecen como Decision Get, Decision Manage y Decision Delete):
decision_get: listar los modelos de decisión y listar y leer tus decisionesdecision_manage: ejecutar una decisióndecision_delete: eliminar una decisión
Decisions no está disponible como herramienta MCP; usa los endpoints REST.
Listar los modelos de decisión
/api/v1/decision_model Devuelve los modelos de decisión como un array JSON (abreviado):
[
{
"ID": 1,
"name": "Jev 1.13",
"selectable": true
}
]
Pasa el ID del modelo como decision_model_id. Cada modelo tiene también version, powered_by, description y default. Igual que con los modelos de chat, selectable: false significa que las reglas de acceso a modelos o de residencia de datos de tu espacio de trabajo te bloquean ese modelo, y restriction_reason indica el motivo. Los ejemplos de abajo usan 1, el ID que tenía Jev 1.13 cuando se escribió esta página; consúltalo en lugar de escribirlo fijo en el código.
Ejecutar una decisión
/api/v1/decision Ejecuta la decisión de forma síncrona (la llamada vuelve cuando las respuestas están listas) y la guarda junto con tus demás decisiones.
-
decision_model_idinteger obligatorio IDdel modelo obtenido conGET /decision_model.-
statestring obligatorio - El texto que se va a revisar.
-
questionsobject obligatorio - Al menos una pregunta, cada una bajo una clave que tú eliges, como
teamourgent. Las respuestas vuelven bajo esas mismas claves.
Cada pregunta tiene un type, sus instructions (la pregunta o la afirmación) y sus criteria:
type | En la aplicación | criteria |
|---|---|---|
choice | Choice | Obligatorio. Un objeto que asocia el nombre de cada opción con cuándo se aplica. |
score | Score | Obligatorio. Un array con las descripciones de los niveles, empezando por el más bajo. El primero es el nivel 0. |
noul | True / false | Opcional. Un objeto con una clave true (cuándo se cumple), una clave false (cuándo no) o ambas. No se admiten otras claves. |
Esta petición hace una pregunta de elección y una de verdadero / falso:
curl -X POST https://api.stickyprompts.com/api/v1/decision \
-H "Authorization: Bearer $STICKY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"decision_model_id": 1,
"state": "My parcel never arrived and the tracking link is broken. Second time this month!",
"questions": {
"team": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments and refunds",
"shipping": "Delivery and tracking"
}
},
"urgent": {
"type": "noul",
"instructions": "The customer needs a fast reply"
}
}
}'import os
import requests
BASE = "https://api.stickyprompts.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['STICKY_API_KEY']}"}
r = requests.post(
f"{BASE}/decision",
headers=HEADERS,
json={
"decision_model_id": 1,
"state": "My parcel never arrived and the tracking link is broken. Second time this month!",
"questions": {
"team": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments and refunds",
"shipping": "Delivery and tracking",
},
},
"urgent": {
"type": "noul",
"instructions": "The customer needs a fast reply",
},
},
},
)
r.raise_for_status()
decision = r.json()
if decision["status"] != "done":
raise RuntimeError(decision["error"])
answers = decision["answers"]
print(answers["team"]["choice"], answers["urgent"]["noul"])const BASE = "https://api.stickyprompts.com/api/v1";
const headers = { Authorization: `Bearer ${process.env.STICKY_API_KEY}` };
const res = await fetch(`${BASE}/decision`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
decision_model_id: 1,
state: "My parcel never arrived and the tracking link is broken. Second time this month!",
questions: {
team: {
type: "choice",
instructions: "Which team should handle this?",
criteria: {
billing: "Payments and refunds",
shipping: "Delivery and tracking",
},
},
urgent: {
type: "noul",
instructions: "The customer needs a fast reply",
},
},
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const decision = await res.json();
if (decision.status !== "done") throw new Error(decision.error);
console.log(decision.answers.team.choice, decision.answers.urgent.noul);La respuesta es un 201 con la decisión guardada. Abreviada, con un ID y un slug de ejemplo:
{
"ID": 27,
"slug": "q4m8x2kd",
"decision_model_id": 1,
"state": "My parcel never arrived and the tracking link is broken. Second time this month!",
"status": "done",
"error": "",
"answers": {
"team": {
"type": "choice",
"choice": "shipping",
"confidence": 1,
"probabilities": { "billing": 0, "shipping": 1 }
},
"urgent": {
"type": "noul",
"noul": 0.87
}
}
}
La respuesta también devuelve questions tal como se enviaron al modelo (después del posible enmascaramiento de los guardrails), el decision_model incrustado y resolved_model, la versión exacta del modelo que respondió.
Preguntas de puntuación
Una pregunta de puntuación envía sus niveles como un array, empezando por el más bajo:
{
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated but civil", "Angry, ready to leave"]
}
}
Su respuesta incluye el score, un confidence, un legend que asocia cada número de nivel con tu descripción y las probabilities de cada nivel, con el número de nivel como clave. Tiene esta forma (valores de ejemplo):
{
"frustration": {
"type": "score",
"score": 1,
"confidence": 1,
"legend": { "0": "Calm", "1": "Frustrated but civil", "2": "Angry, ready to leave" },
"probabilities": { "0": 0, "1": 1, "2": 0 }
}
}
Cuando una decisión falla
400: faltastate, una pregunta no es válida (no tieneinstructions, es unchoiceo unscoresincriteria, tiene criteriosnoulcon claves distintas detrueyfalse, o untypedesconocido) odecision_model_idno corresponde a ningún modelo.400con uncode: un guardrail ha bloqueado el texto o una pregunta.403: las reglas de acceso a modelos de tu espacio de trabajo restringen el modelo.429: se ha alcanzado la cuota o el límite del plan del espacio de trabajo. Consulta Errores, paginación y cuotas.
Listar, leer y eliminar decisiones
/api/v1/decision Lista tus decisiones, empezando por la más reciente. Admite page y size, además de status (processing, done o error) para filtrar. El total viene en la cabecera X-Total-Count; consulta paginación.
/api/v1/decision/:id Una decisión por su ID o su slug, con su texto, sus preguntas y sus respuestas. Una decisión que no existe o que no es tuya devuelve 404 {"error":"Decision not found"}.
/api/v1/decision/:id Elimina una decisión por su ID numérico. Devuelve 204, también cuando no ha encontrado nada.
Ideas
- Deriva tickets. Una pregunta Choice con tus equipos como opciones envía cada ticket a la cola correcta.
- Puntúa el sentimiento de las reseñas. Una pregunta Score que vaya de Descontento a Encantado convierte un montón de reseñas en un número que puedes ordenar y representar en un gráfico.
- Comprueba si se cumple una condición en correos y formularios. Una afirmación True / false como El correo pide un reembolso o El formulario incluye un número de pedido marca los que requieren alguna acción.
- Pregunta las tres cosas a la vez. Una misma decisión puede derivar, puntuar y comprobar el mismo texto, como en el ejemplo de arriba.