free/intelligence

Documen­tació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 basehttps://freeintelligence.online/v1
AutenticaciónAuthorization: Bearer fi-...
EndpointsGET /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)

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.

La clave es personal. No la subas a un repositorio ni la pegues en el código de una web pública: cualquiera que la vea gasta tu crédito. Si se te escapa, díselo a Marcos y la cambia en un minuto.

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.

IdentificadorDeContextoSalida máx.ImágenesRazona

Atajos para elegir

  • Lo mejor en general, y además ve imágenes: kimi-k2.5.
  • Programar: qwen3-coder-480b, devstral-2 o minimax-m2.5 para agentes.
  • Mates y lógica: deepseek-v3.1 o glm-5.
  • Escribir bien en español: mistral-large-3.
  • Volumen, bots y scripts baratos: gpt-oss-20b o gpt-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".

Si pones un 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" } }
EstadoCódigoQué pasa y qué hacer
400bad_requestPetición mal formada o campo que el modelo no admite. Lee el mensaje.
401invalid_api_keyClave mal copiada, desactivada o borrada.
404model_not_foundEse identificador no existe. Revísalo en GET /v1/models.
429insufficient_quotaTu clave tenía un crédito y se ha acabado.
429busyFree Intelligence está saturado en ese momento. Reintenta en unos segundos o usa otro modelo.
502unavailableFree 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 openai con apiBase apuntando a la URL base.
  • LangChain, LlamaIndex, Vercel AI SDK: usa su cliente de OpenAI con la URL base cambiada.