Envía una petición con tus etiquetas
Instala requests, guarda la clave en una variable de entorno y envía una sola tarea acotada: el texto, la instrucción que separa tus resultados, las etiquetas que tu proceso ya usa y un umbral. El endpoint acepta texto de 3 a 6.000 caracteres, instrucciones de 3 a 1.500, de 2 a 12 etiquetas únicas de hasta 60 caracteres y un umbral entre 0,5 y 1 que por defecto es 0,85.
Envía siempre una Idempotency-Key de 8 a 100 caracteres. Si la conexión se corta después de que el servidor guardara una decisión, repetir la petición con la misma clave devuelve esa decisión con replayed: true en lugar de cobrar otro crédito.
import os, requests
clave = os.environ["JEV_API_KEY"]
url = "https://jevapi.pro/api/v1/decisions"
equipos = ["Facturación", "Soporte", "Acceso"]
cuerpo = {
"text": texto_de_la_fila,
"instructions": "Elige el equipo dueño.",
"labels": equipos,
"threshold": 0.85,
}
respuesta = requests.post(
url,
headers={
"Authorization": "Bearer " + clave,
"Idempotency-Key": "fila-1042-v3",
},
json=cuerpo,
timeout=30,
).json()
if respuesta["needsReview"]:
revisar(respuesta["id"])
else:
enrutar(respuesta["choice"])Lee la respuesta como evidencia, no como veredicto
Una decisión nueva responde 201 con id, choice, confidence, probabilities, needsReview, model y latencyMs; una petición de cuenta también devuelve los créditos restantes. confidence es null cuando el modelo la omite, y entonces needsReview es true, igual que cuando la confianza queda por debajo de tu umbral.
probabilities solo se valida por dominio y límites. Nada garantiza que sus valores sumen uno ni que el mayor corresponda a la etiqueta devuelta: lee choice en lugar de ordenar un diccionario para adivinar la respuesta, y trata una etiqueta fuera de tu lista como un rechazo, no como un valor por defecto.
Recorre un archivo sin pagar dos veces
Con un CSV, envía las filas de una en una y respeta el límite de velocidad publicado. Deriva la clave de idempotencia de la propia fila —el identificador del mensaje y la versión de la regla—, nunca de su posición: una exportación con una fila nueva al principio desplazaría todas las claves y pagaría de nuevo trabajo ya hecho.
Un 502 o un 503 devuelve el crédito y no deja decisión, así que esa fila se puede reintentar; un 429 indica que envías más rápido de lo permitido y un 402 que la cuenta se quedó sin créditos. Guarda el estado junto a la respuesta para reintentar una fila fallida sin volver a leer el archivo.
Si prefieres no escribir el bucle todavía, el espacio de trabajo por lotes aplica la misma regla en el navegador sobre una lista pegada o un archivo y exporta todas las filas, incluidas las que fallaron.
Clasificación por lotes y exportación · Abrir el espacio por lotes
Cuándo conviene un modelo propio
Un modelo de scikit-learn o un transformer que ejecutas tú es más barato cuando las etiquetas son estables, el volumen es alto y puedes operar el modelo: sin coste por fila, sin salto de red y con control total de la latencia.
Un endpoint encaja cuando las etiquetas siguen al proceso y no a los datos, cuando prefieres no servir inferencia y cuando quieres que una respuesta dudosa quede marcada en lugar de adivinada. Se combinan bien: clasifica todo y envía solo las filas de baja confianza a un modelo propio o a una persona.
En cualquier caso, mide con un conjunto de filas etiquetado por tu equipo y reservado, no con los ejemplos con los que escribiste la regla: una regla que acierta en sus propios ejemplos suele haberlos memorizado.