Documentación
Free Intelligence habla el mismo idioma que la API de OpenAI. Cualquier SDK, librería o app que acepte una URL base personalizada funciona sin tocar nada más.
| URL base | https://freeintelligence.online/v1 |
|---|---|
| Autenticación | Authorization: Bearer fi-... |
| Endpoints | GET /v1/models · POST /v1/chat/completions |
Empezar
Con tu clave en la variable de entorno FI_API_KEY, este es el mínimo para tener una respuesta:
# pip install openai import os from openai import OpenAI client = OpenAI( base_url="https://freeintelligence.online/v1", api_key=os.environ["FI_API_KEY"], ) r = client.chat.completions.create( model="deepseek-v3.1", messages=[ {"role": "system", "content": "Responde en español, breve."}, {"role": "user", "content": "¿Qué es una función hash?"}, ], ) print(r.choices[0].message.content)
// npm install openai import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://freeintelligence.online/v1", apiKey: process.env.FI_API_KEY, }); const r = await client.chat.completions.create({ model: "deepseek-v3.1", messages: [{ role: "user", content: "¿Qué es una función hash?" }], }); console.log(r.choices[0].message.content);
curl https://freeintelligence.online/v1/chat/completions \ -H "Authorization: Bearer $FI_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-v3.1", "messages": [{"role": "user", "content": "¿Qué es una función hash?"}] }'
Autenticación
Cada persona tiene su propia clave, que empieza por fi-. Va en la cabecera Authorization como token Bearer. También se acepta la cabecera x-api-key.
Modelos
Usa el identificador de la primera columna en el campo model. La lista también está en GET /v1/models. Para elegir, el ranking los ordena por potencia, visión y eficiencia.
| Identificador | De | Contexto | Salida máx. | Imágenes | Razona |
|---|
Atajos para elegir
- Lo mejor en general, y además ve imágenes:
kimi-k2.5. - Programar:
qwen3-coder-480b,devstral-2ominimax-m2.5para agentes. - Mates y lógica:
deepseek-v3.1oglm-5. - Escribir bien en español:
mistral-large-3. - Volumen, bots y scripts baratos:
gpt-oss-20bogpt-oss-120b.
Chat
POST /v1/chat/completions acepta los campos de siempre: messages, temperature, top_p, max_tokens o max_completion_tokens, stop, response_format, tools, tool_choice, frequency_penalty, presence_penalty, seed y n. No todos los modelos admiten todos los campos; si uno no lo admite, la respuesta lo dice.
La respuesta tiene la forma estándar, con usage incluido para que sepas cuánto ha costado:
{
"id": "chatcmpl-...",
"object": "chat.completion",
"model": "deepseek-v3.1",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "..." },
"finish_reason": "stop"
}],
"usage": { "prompt_tokens": 21, "completion_tokens": 118, "total_tokens": 139 }
}
Para obtener JSON válido, pide "response_format": {"type": "json_object"} y dilo también en el mensaje de sistema.
Streaming
Con "stream": true el texto llega por eventos del servidor (SSE) según se genera, y termina con data: [DONE]. Si quieres el recuento de tokens al final, añade "stream_options": {"include_usage": true}.
stream = client.chat.completions.create(
model="gpt-oss-120b",
messages=[{"role": "user", "content": "Escribe un haiku sobre servidores"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
Imágenes
Tres modelos ven imágenes: kimi-k2.5, qwen3-vl-235b y gemma-3-27b. La imagen va dentro del mensaje como URL pública o como data: en base64. Los demás modelos devuelven un error 400 si les mandas una.
import base64 img = base64.b64encode(open("factura.png", "rb").read()).decode() r = client.chat.completions.create( model="qwen3-vl-235b", messages=[{ "role": "user", "content": [ {"type": "text", "text": "Pásame esta factura a una tabla"}, {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img}"}}, ], }], )
Herramientas
Las llamadas a funciones van con tools como en OpenAI. El modelo devuelve tool_calls; tú ejecutas la función y le mandas el resultado con un mensaje de rol tool. Los que mejor lo hacen son kimi-k2.5, kimi-k2-thinking, minimax-m2.5, glm-5 y qwen3-coder-480b.
tools = [{
"type": "function",
"function": {
"name": "tiempo",
"description": "Tiempo actual en una ciudad",
"parameters": {
"type": "object",
"properties": {"ciudad": {"type": "string"}},
"required": ["ciudad"],
},
},
}]
r = client.chat.completions.create(model="kimi-k2.5", messages=msgs, tools=tools)
call = r.choices[0].message.tool_calls[0]
# ejecuta call.function.name con json.loads(call.function.arguments)
# y responde con {"role": "tool", "tool_call_id": call.id, "content": "..."}
Razonamiento
Los modelos que razonan (kimi-k2.5, glm-5, kimi-k2-thinking, minimax-m2.5, nemotron-3-super y los gpt-oss) piensan antes de responder. Ese pensamiento llega aparte, en el campo reasoning del mensaje, y cuenta como tokens de salida. En los gpt-oss puedes regularlo con "reasoning_effort": "low" | "medium" | "high".
max_tokens muy bajo, un modelo que razona puede gastarlo entero pensando y devolver la respuesta vacía con finish_reason: "length". Deja margen: 1.000 tokens o más.Límites y crédito
No hay límite de peticiones por minuto ni de peticiones en paralelo: puedes usarla con agentes como Claude Code u OpenCode sin que te corte.
Lo normal es que tu clave no tenga tope de gasto. Si Marcos le ha puesto un crédito en euros, cada respuesta se descuenta al precio del modelo que ves en el ranking, y cuando se acaba recibes un 429 con el código insufficient_quota. Para ampliarlo, habla con Marcos.
Errores
Los errores tienen el mismo formato que en OpenAI, así que los SDK los convierten en excepciones normales:
{ "error": { "message": "...", "type": "invalid_request_error", "code": "model_not_found" } }
| Estado | Código | Qué pasa y qué hacer |
|---|---|---|
| 400 | bad_request | Petición mal formada o campo que el modelo no admite. Lee el mensaje. |
| 401 | invalid_api_key | Clave mal copiada, desactivada o borrada. |
| 404 | model_not_found | Ese identificador no existe. Revísalo en GET /v1/models. |
| 429 | insufficient_quota | Tu clave tenía un crédito y se ha acabado. |
| 429 | busy | Free Intelligence está saturado en ese momento. Reintenta en unos segundos o usa otro modelo. |
| 502 | unavailable | Free Intelligence no respondió. Reintenta; si se repite, prueba otro modelo. |
Usarlo en apps
En cualquier app que pida un proveedor «compatible con OpenAI», rellena tres cosas: URL base https://freeintelligence.online/v1, tu clave fi-... y el identificador del modelo.
Variables de entorno
Muchas herramientas leen estas dos variables y no hace falta tocar nada más:
export OPENAI_BASE_URL="https://freeintelligence.online/v1" export OPENAI_API_KEY="fi-tu-clave"
Dónde se configura
- Open WebUI: Ajustes, Conexiones, OpenAI API. Pega la URL y la clave; los modelos aparecen solos.
- Cursor: Settings, Models, OpenAI API Key, «Override OpenAI Base URL». Añade el modelo a mano, por ejemplo
qwen3-coder-480b. - Continue (VS Code): proveedor
openaiconapiBaseapuntando a la URL base. - LangChain, LlamaIndex, Vercel AI SDK: usa su cliente de OpenAI con la URL base cambiada.