Felo API PlatformFelo API Platform

Felo APIs

LLM API

Llama a los endpoints de modelos de Felo mediante los protocolos OpenAI-compatible y Anthropic-compatible.

GET/api/v1/models

Autenticació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 Responses
  • POST /api/v1/chat/completions: compatible con OpenAI Chat Completions
  • POST /api/v1/messages: compatible con Anthropic Messages

Decisions API

POST https://openapi.felo.ai/api/v1/decisions

Enví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.13
  • state: Contexto que se va a evaluar; una cadena o un valor JSON.
  • questions: Preguntas con nombre que usan type, instructions y criteria.
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_KEY
X-API-Key: YOUR_API_KEY

Consulta 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.ai

Para los clientes SDK, configura la URL base específica del protocolo que se muestra en Uso básico.

Encabezados comunes

EncabezadoObligatorioDescripción
AuthorizationSí, salvo que se use X-API-KeyClave de API con el formato Bearer YOUR_API_KEY
X-API-KeySí, salvo que se use AuthorizationClave de API alternativa al encabezado Bearer
Content-TypeSíDebe ser application/json
X-Request-IdNoID 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:

EndpointCategorías de modelos
GET /api/v1/modelsTodas las categorías (sin cambios)
GET /api/v1/videos/modelsGeneración de video (video_generation)
GET /api/v1/decisions/modelsDecisions, 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 modeloContextoSalida máximaEntrada / 1 M de tokensSalida / 1 M de tokensLectura de caché / 1 M de tokensEscritura de caché / 1 M de tokens
claude-haiku-4-5200K64K$1.00$5.00$0.10$1.25
claude-sonnet-4-61M128K$3.00$15.00$0.30$3.75
claude-opus-4-81M128K$5.00$25.00$0.50$6.25
claude-sonnet-51M128K$2.00$10.00$0.20$2.50
claude-haiku-5-51M128K$0.10$0.50$0.01$0.0125
gpt-5.51.05M128K$5.00$30.00$0.50-
gpt-5.5-pro1.05M128K$30.00$180.00--
gpt-5.6-luna1.05M128K$1.00$6.00$0.10$1.25
gpt-5.6-terra1.05M128K$2.50$15.00$0.25$3.125
gpt-5.6-sol1.05M128K$5.00$30.00$0.50$6.25
grok-4.5500K-$2.00$6.00$0.50-
deepseek-v4-flash1M384K$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 openai

SDK de Anthropic

Usa el SDK de Anthropic para la API Messages.

##### JavaScript

npm install @anthropic-ai/sdk

##### Python

pip install anthropic

Configurar 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

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/responses

Cuerpo de la solicitud

ParámetroTipoObligatorioDescripción
modelstringSíID de modelo público de Felo
inputstring o arraySíEntrada del usuario, entrada multiturno o entrada multimodal
instructionsstringNoInstrucciones del sistema o del desarrollador
streambooleanNoIndica si se usa streaming con Server-Sent Events
temperaturenumberNoTemperatura de muestreo
max_output_tokensintegerNoTokens 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_text

Chat Completions

Usa este endpoint para clientes y SDK compatibles con OpenAI Chat Completions.

Endpoint

POST https://openapi.felo.ai/api/v1/chat/completions

Cuerpo de la solicitud

ParámetroTipoObligatorioDescripción
modelstringSíID de modelo público de Felo
messagesarraySíMensajes de la conversación
messages[].rolestringSísystem, user o assistant
messages[].contentstringSíContenido del mensaje
streambooleanNoIndica si se usa streaming con Server-Sent Events
temperaturenumberNoTemperatura de muestreo
max_tokensintegerNoTokens 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.content

Messages

Usa este endpoint para clientes y SDK compatibles con Anthropic Messages.

Endpoint

POST https://openapi.felo.ai/api/v1/messages

Cuerpo de la solicitud

ParámetroTipoObligatorioDescripción
modelstringSíID de modelo público de Felo
max_tokensintegerSíTokens de salida máximos
messagesarraySíMensajes de la conversación
messages[].rolestringSíuser o assistant
messages[].contentstring o arraySíTexto sin formato o bloques de contenido de Anthropic
systemstringNoPrompt del sistema
streambooleanNoIndica si se usa streaming con Server-Sent Events
temperaturenumberNoTemperatura 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[].text

Streaming

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 HTTPCausaAcción sugerida
400Cuerpo JSON no válido o falta algún campo obligatorio del protocoloComprueba model, messages, input, max_tokens y los campos de bloques de contenido
401Clave de API ausente o no válidaVerifica Authorization: Bearer ... o X-API-Key
402Créditos insuficientes en la cuentaComprueba el saldo de tu cuenta de Felo
429Se superó un límite de solicitudesReduce el ritmo de las solicitudes y vuelve a intentarlo más tarde
502Falló la solicitud al servicio de modelosReintenta e incluye X-Request-Id al contactar con soporte
503El servicio de modelos no está disponible temporalmenteReintenta con retroceso exponencial o elige otro modelo publicado