Felo APIs
LLM API
Llama a los endpoints de modelos de Felo mediante los protocolos OpenAI-compatible y Anthropic-compatible.
/api/v1/modelsAutenticación
Bearer API key or X-API-Key
Tipo de contenido
application/json
Notas sobre límites
Model service limits may apply. Retry with backoff on 429 or 503.
La LLM API expone endpoints de llamada directa a modelos a través de Felo API Platform. Úsala cuando quieras llamar a modelos de lenguaje de propósito general, reutilizar clientes compatibles con OpenAI o con Anthropic, o conectar frameworks de agentes a Felo API Platform.
La LLM API incluye actualmente tres superficies de llamada a modelos compatibles con chat:
POST /api/v1/responses: compatible con OpenAI ResponsesPOST /api/v1/chat/completions: compatible con OpenAI Chat CompletionsPOST /api/v1/messages: compatible con Anthropic Messages
Decisions API
POST https://openapi.felo.ai/api/v1/decisionsEnvía estado y preguntas tipadas y acotadas a jev-1.13 (también se acepta typesafe/jev-1.13). Usa /api/v1/decisions, no los endpoints Chat Completions, Messages ni Responses. No se admite streaming.
Campos de la solicitud
model:jev-1.13state: Contexto que se va a evaluar; una cadena o un valor JSON.questions: Preguntas con nombre que usantype,instructionsycriteria.
import os
import requests
response = requests.post(
"https://openapi.felo.ai/api/v1/decisions",
headers={"Authorization": f"Bearer {os.environ['FELO_API_KEY']}"},
json={
"model": "jev-1.13",
"state": "Help! My payouts have been failing for 3 days.",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Does this message convey urgency?",
"criteria": {"true": "Time-sensitive", "false": "No urgency"},
},
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": "Pricing, upgrades, new accounts",
},
},
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"],
},
},
},
timeout=60,
)
response.raise_for_status()
answers = response.json()["answers"]
print(answers["is_urgent"]["noul"])
print(answers["department"]["choice"], answers["department"]["probabilities"])
print(answers["frustration"]["score"])Tipos de respuesta
noul: una probabilidad de 0 a 1. choice: la opción seleccionada y su distribución de probabilidad. score: una puntuación numérica para criterios ordenados, con su distribución.
Los errores usan error.code (estado HTTP numérico) y error.message. Gestiona las respuestas que no sean 2xx antes de leer answers.
Uso y precios
La respuesta incluye usage.input_tokens, usage.output_tokens y puede incluir usage.cost. Tarifas de referencia consultadas el 2026-10-12: entrada 0,042 USD por millón de tokens; salida 0 USD. Una tarifa de salida de cero no hace que el uso de entrada sea gratuito. Las tarifas pueden cambiar; usa el precio publicado del modelo y los descuentos de cuenta aplicables para tus estimaciones.
Autenticación
Las solicitudes a la LLM API requieren una clave de Felo API Platform. Usa Authorization: Bearer ... o X-API-Key.
Authorization: Bearer YOUR_API_KEYX-API-Key: YOUR_API_KEYConsulta la guía de autenticación para obtener detalles sobre la creación y gestión de claves de API.
URL base
Usa el host público de Felo API Platform:
https://openapi.felo.aiPara los clientes SDK, configura la URL base específica del protocolo que se muestra en Uso básico.
Encabezados comunes
| Encabezado | Obligatorio | Descripción |
|---|---|---|
Authorization | Sí, salvo que se use X-API-Key | Clave de API con el formato Bearer YOUR_API_KEY |
X-API-Key | Sí, salvo que se use Authorization | Clave de API alternativa al encabezado Bearer |
Content-Type | Sí | Debe ser application/json |
X-Request-Id | No | ID de solicitud opcional para solución de problemas |
Descubrimiento de modelos
El catálogo general incluye todas las categorías de modelos. Usa las listas dedicadas para descubrir modelos de video o de decisión:
| Endpoint | Categorías de modelos |
|---|---|
GET /api/v1/models | Todas las categorías (sin cambios) |
GET /api/v1/videos/models | Generación de video (video_generation) |
GET /api/v1/decisions/models | Decisions, incluido Jev (decisions) |
Los tres endpoints aceptan el parámetro de consulta opcional provider (por ejemplo, openrouter) y devuelven {"object":"list","data":[...]}. Cada elemento contiene id, object, created, owned_by y model_kind. Las listas dedicadas usan la categoría efectiva después de aplicar las anulaciones de asignación de proveedores habilitadas.
Solo se devuelven los modelos habilitados, listados, no eliminados y con precios actuales que coincidan con las condiciones del proveedor; un precio de cero es válido. Los modelos recién sincronizados permanecen ocultos hasta que un administrador los incluye en la lista. Todas las listas comparten el orden configurado, con el nombre y el ID del modelo como criterios de desempate. Si no hay coincidencias, se devuelve HTTP 200 con un array data vacío. El descubrimiento lee el catálogo local y no invoca ni cobra ninguna llamada a un modelo.
Solo GET /api/v1/models acepta exclude_video_and_decisions (booleano, predeterminado false). Defínelo como true para excluir los tipos efectivos video_generation y decisions; los modelos de imagen siguen siendo elegibles. Se puede combinar con provider. Omitirlo o definirlo como false conserva el catálogo completo. Los valores booleanos no válidos devuelven HTTP 422.
curl "https://openapi.felo.ai/api/v1/models?exclude_video_and_decisions=true&provider=openrouter" \
-H "Authorization: Bearer ${FELO_API_KEY}"
curl "https://openapi.felo.ai/api/v1/videos/models?provider=openrouter" \
-H "Authorization: Bearer ${FELO_API_KEY}"
curl "https://openapi.felo.ai/api/v1/decisions/models?provider=openrouter" \
-H "Authorization: Bearer ${FELO_API_KEY}"Elige un endpoint de llamada según model_kind: chat para Responses, Chat Completions o Messages según lo admita el modelo; video_generation para POST /api/v1/videos/generations; decisions para POST /api/v1/decisions; image_generation para POST /api/v1/images/generations. Los detalles siguen estando en GET /api/v1/models/{model_id}. Que un modelo aparezca en la lista no significa necesariamente que sea compatible con todos los endpoints de llamada.
Los modelos de imagen no tienen un endpoint de lista dedicado. Filtra GET /api/v1/models por model_kind: "image_generation". Consulta Generación de imágenes para conocer los campos de solicitud de imágenes.
Modelos y precios
Las solicitudes usan el canal predeterminado del modelo salvo que fijes uno con X-Felo-Channel. Pasa una lista ordenada de códigos de canal públicos del catálogo de modelos separados por comas; omite el encabezado para usar el predeterminado. Usa default solo por sí solo. Solo se envía el grupo de proveedores del primer canal; no hay conmutación por error automática. Consulta Canales y enrutamiento de proveedores.
Los precios se expresan en USD. Las tarifas por token se muestran por 1 millón de tokens para facilitar la lectura; la facturación usa la precisión por token de la instantánea de precios actual. Las tarifas de caché se aplican solo cuando la respuesta del protocolo incluye uso de caché. Un guion significa que no hay una tarifa publicada independiente ni un límite publicado. El uso de búsqueda web, cuando el servicio de modelos lo notifica, se cobra a $0.01 por búsqueda.
| ID de modelo | Contexto | Salida máxima | Entrada / 1 M de tokens | Salida / 1 M de tokens | Lectura de caché / 1 M de tokens | Escritura de caché / 1 M de tokens |
|---|---|---|---|---|---|---|
claude-haiku-4-5 | 200K | 64K | $1.00 | $5.00 | $0.10 | $1.25 |
claude-sonnet-4-6 | 1M | 128K | $3.00 | $15.00 | $0.30 | $3.75 |
claude-opus-4-8 | 1M | 128K | $5.00 | $25.00 | $0.50 | $6.25 |
claude-sonnet-5 | 1M | 128K | $2.00 | $10.00 | $0.20 | $2.50 |
claude-haiku-5-5 | 1M | 128K | $0.10 | $0.50 | $0.01 | $0.0125 |
gpt-5.5 | 1.05M | 128K | $5.00 | $30.00 | $0.50 | - |
gpt-5.5-pro | 1.05M | 128K | $30.00 | $180.00 | - | - |
gpt-5.6-luna | 1.05M | 128K | $1.00 | $6.00 | $0.10 | $1.25 |
gpt-5.6-terra | 1.05M | 128K | $2.50 | $15.00 | $0.25 | $3.125 |
gpt-5.6-sol | 1.05M | 128K | $5.00 | $30.00 | $0.50 | $6.25 |
grok-4.5 | 500K | - | $2.00 | $6.00 | $0.50 | - |
deepseek-v4-flash | 1M | 384K | $0.09 | $0.18 | $0.018 | - |
Claude Haiku 5.5 usa precios por niveles: los prompts de hasta 100K tokens se facturan con las tarifas estándar anteriores, y las solicitudes cuyo prompt supera los 100K tokens se facturan a $0.50 de entrada, $2.50 de salida, $0.05 de lectura de caché y $0.0625 de escritura de caché por 1 M de tokens para toda la solicitud.
GPT-5.6 está disponible en tres niveles: Luna para cargas de trabajo rápidas y rentables; Terra para tareas equilibradas de programación, razonamiento y agentes; y Sol para razonamiento complejo y programación de nivel insignia. Cada nivel también expone un ID de modelo -pro (gpt-5.6-luna-pro, gpt-5.6-terra-pro y gpt-5.6-sol-pro) que usa el mismo modelo subyacente con modo de razonamiento pro. Los precios, la longitud de contexto y la salida máxima no cambian para los ID -pro.
DeepSeek V4 Flash admite modos de razonamiento y sin razonamiento, salida JSON, llamadas a herramientas, API Responses y compatibilidad con la API de Anthropic. Está disponible a través de las superficies Responses, Chat Completions y Messages de Felo. Los precios de escritura de caché aún no se han publicado.
Uso básico
Estos ejemplos usan los SDK oficiales de OpenAI y Anthropic. Define FELO_API_KEY con tu clave de Felo API Platform antes de ejecutar los ejemplos.
export FELO_API_KEY="YOUR_API_KEY"Instalar los SDK
SDK de OpenAI
Usa el SDK de OpenAI para la API Responses y la API Chat Completions.
##### JavaScript
npm install openai##### Python
pip install openaiSDK de Anthropic
Usa el SDK de Anthropic para la API Messages.
##### JavaScript
npm install @anthropic-ai/sdk##### Python
pip install anthropicConfigurar los clientes
Los endpoints compatibles con OpenAI usan la URL base del SDK de OpenAI con /api/v1, porque el SDK añade rutas de recursos como /responses y /chat/completions.
JavaScript
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api/v1",
});Python
import os
from openai import OpenAI
openai = OpenAI(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api/v1",
)Los endpoints compatibles con Anthropic usan la URL base del SDK de Anthropic sin /v1, porque el SDK añade /v1/messages.
JavaScript
import Anthropic from "@anthropic-ai/sdk";
const anthropic = new Anthropic({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api",
});Python
import os
from anthropic import Anthropic
anthropic = Anthropic(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api",
)Usar la API Responses
Usa la API Responses para nuevas integraciones compatibles con OpenAI y para objetos de respuesta de estilo agente.
JavaScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api/v1",
});
const response = await client.responses.create({
model: "gpt-5.6-sol",
input: "Write a one-sentence bedtime story about a unicorn.",
});
console.log(response.output_text);Python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api/v1",
)
response = client.responses.create(
model="gpt-5.6-sol",
input="Write a one-sentence bedtime story about a unicorn.",
)
print(response.output_text)Usar Chat Completions
Usa Chat Completions cuando tu aplicación ya envíe messages al estilo de OpenAI.
JavaScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api/v1",
});
const completion = await client.chat.completions.create({
model: "gpt-5.6-sol",
messages: [
{
role: "user",
content: "Give me one sentence about why API compatibility matters.",
},
],
});
console.log(completion.choices[0].message.content);Python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api/v1",
)
completion = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[
{
"role": "user",
"content": "Give me one sentence about why API compatibility matters.",
}
],
)
print(completion.choices[0].message.content)Usar Messages
Usa Messages cuando tu cliente o framework de agentes espere formas de solicitud y respuesta compatibles con Anthropic.
JavaScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api",
});
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 128,
messages: [
{
role: "user",
content: "Summarize the value of direct model APIs in one sentence.",
},
],
});
const text = message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);Python
import os
from anthropic import Anthropic
client = Anthropic(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api",
)
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=128,
messages=[
{
"role": "user",
"content": "Summarize the value of direct model APIs in one sentence.",
}
],
)
text = "".join(block.text for block in message.content if block.type == "text")
print(text)Documentación oficial
- Inicio rápido de la API de OpenAI
- OpenAI Create response
- OpenAI Create chat completion
- Claude Messages API
- SDK de TypeScript de Anthropic
- SDK de Python de Anthropic
Para la configuración de clientes de agentes, consulta Configuración de Claude Code y Codex.
Referencia de protocolos
Responses
Usa este endpoint para clientes e integraciones compatibles con la API OpenAI Responses.
Endpoint
POST https://openapi.felo.ai/api/v1/responsesCuerpo de la solicitud
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
model | string | Sí | ID de modelo público de Felo |
input | string o array | Sí | Entrada del usuario, entrada multiturno o entrada multimodal |
instructions | string | No | Instrucciones del sistema o del desarrollador |
stream | boolean | No | Indica si se usa streaming con Server-Sent Events |
temperature | number | No | Temperatura de muestreo |
max_output_tokens | integer | No | Tokens de salida máximos |
Solicitud con SDK
const response = await client.responses.create({
model: "gpt-5.6-sol",
input: "Reply with exactly: responses ok",
});
console.log(response.output_text);Ruta del texto de respuesta
output_textChat Completions
Usa este endpoint para clientes y SDK compatibles con OpenAI Chat Completions.
Endpoint
POST https://openapi.felo.ai/api/v1/chat/completionsCuerpo de la solicitud
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
model | string | Sí | ID de modelo público de Felo |
messages | array | Sí | Mensajes de la conversación |
messages[].role | string | Sí | system, user o assistant |
messages[].content | string | Sí | Contenido del mensaje |
stream | boolean | No | Indica si se usa streaming con Server-Sent Events |
temperature | number | No | Temperatura de muestreo |
max_tokens | integer | No | Tokens de salida máximos |
Solicitud con SDK
const completion = await client.chat.completions.create({
model: "gpt-5.6-sol",
messages: [
{
role: "user",
content: "Reply with exactly: chat completions ok",
},
],
});
console.log(completion.choices[0].message.content);Ruta del texto de respuesta
choices[0].message.contentMessages
Usa este endpoint para clientes y SDK compatibles con Anthropic Messages.
Endpoint
POST https://openapi.felo.ai/api/v1/messagesCuerpo de la solicitud
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
model | string | Sí | ID de modelo público de Felo |
max_tokens | integer | Sí | Tokens de salida máximos |
messages | array | Sí | Mensajes de la conversación |
messages[].role | string | Sí | user o assistant |
messages[].content | string o array | Sí | Texto sin formato o bloques de contenido de Anthropic |
system | string | No | Prompt del sistema |
stream | boolean | No | Indica si se usa streaming con Server-Sent Events |
temperature | number | No | Temperatura de muestreo |
Solicitud con SDK
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 64,
messages: [
{
role: "user",
content: "Reply with exactly: messages ok",
},
],
});
const text = message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);Solicitud con bloques de contenido
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 64,
messages: [
{
role: "user",
content: [
{
type: "text",
text: "Reply with exactly: messages ok",
},
],
},
],
});Ruta del texto de respuesta
content[].textStreaming
Define stream como true para recibir Server-Sent Events. El formato de carga útil de los eventos sigue el protocolo seleccionado:
- Los flujos de Responses devuelven eventos de respuesta compatibles con Responses.
- Los flujos de Chat Completions devuelven fragmentos de finalización de chat compatibles con OpenAI.
- Los flujos de Messages devuelven eventos de mensaje compatibles con Anthropic.
const stream = await client.responses.create({
model: "gpt-5.6-sol",
input: "Write one sentence.",
stream: true,
});Los clientes deben analizar el flujo según el protocolo que estén usando en lugar de esperar un esquema de eventos compartido entre los tres endpoints.
Errores
La LLM API devuelve la forma de error del protocolo seleccionado siempre que es posible. Las causas habituales incluyen:
| Estado HTTP | Causa | Acción sugerida |
|---|---|---|
400 | Cuerpo JSON no válido o falta algún campo obligatorio del protocolo | Comprueba model, messages, input, max_tokens y los campos de bloques de contenido |
401 | Clave de API ausente o no válida | Verifica Authorization: Bearer ... o X-API-Key |
402 | Créditos insuficientes en la cuenta | Comprueba el saldo de tu cuenta de Felo |
429 | Se superó un límite de solicitudes | Reduce el ritmo de las solicitudes y vuelve a intentarlo más tarde |
502 | Falló la solicitud al servicio de modelos | Reintenta e incluye X-Request-Id al contactar con soporte |
503 | El servicio de modelos no está disponible temporalmente | Reintenta con retroceso exponencial o elige otro modelo publicado |