{"slug": "config-nan-configuracion-nan-builders-para-llms", "title": "Config-NaN - configuracion NaN Builders para LLMs", "summary": "NaN Builders has published a comprehensive configuration guide for its LLM API, detailing setup instructions for clients, IDEs, agents, and SDKs. The guide covers available models including deepseek-v4-flash, mimo-v2.5, gemma4, and qwen3.6, with specifications for context length, quantization, and capabilities such as reasoning, vision, and audio input. The API is OpenAI-compatible and served via LiteLLM, with a base URL of https://api.nan.builders/v1.", "body_md": "| # NaN Builders LLMs.txt | |\n| Documento autocontenido para configurar clientes, IDEs, agentes y SDKs contra la API de NaN Builders sin tener que abrir la documentacion durante la configuracion. | |\n| Fuentes consultadas el 2026-07-11: | |\n| - https://nan.builders/docs/getting-started | |\n| - https://nan.builders/docs/api | |\n| - https://nan.builders/docs/models | |\n| - https://nan.builders/docs/examples | |\n| ## Identidad del servicio | |\n| NaN expone modelos de texto, vision, audio, embeddings, reranking e imagen mediante una API compatible con OpenAI, servida via LiteLLM para la parte LLM. Cualquier herramienta que acepte un `base URL` y una `API key` de tipo OpenAI-compatible deberia poder funcionar: Cursor, Cline, Continue, Aider, OpenCode/OpenCode-like, Open WebUI, Zed, SDK oficial de OpenAI, AI SDK, clientes HTTP, etc. | |\n| Valores base: | |\n| ``` txt | |\n| Base URL: https://api.nan.builders/v1 | |\n| Auth: Authorization: Bearer sk-tu-key-aqui | |\n| Default chat model: qwen3.6 | |\n| ``` | |\n| Para el servicio enterprise de Helmcode, usa el host `api.helmcode.com`; los endpoints `/v1/...` son equivalentes. | |\n| La API key se genera desde la plataforma de NaN, en ajustes de usuario, seccion \"API Keys\". La key es personal e intransferible. El soporte indicado en la documentacion es solo para temas tecnicos. | |\n| ## Reglas de configuracion rapida | |\n| Usa `qwen3.6` como modelo general por defecto: chat, streaming, vision, tool calling y reasoning activado por defecto. | |\n| Usa `deepseek-v4-flash` si necesitas contexto muy largo, reasoning configurable con `reasoning_effort` y buen rendimiento general en texto. | |\n| Usa `mimo-v2.5` si necesitas entrada omnimodal real: texto, imagen y audio. Su reasoning esta siempre activo, asi que reserva suficiente presupuesto de salida. | |\n| Usa `gemma4` para chat multimodal con vision cuando quieras reasoning opt-in. | |\n| Usa `qwen3-embedding` para embeddings de 4096 dimensiones. | |\n| Usa `rerank` despues de recuperar documentos por embeddings, especialmente en RAG multilingue o busqueda de codigo. | |\n| Usa `kokoro` para text-to-speech. | |\n| Usa `whisper` para speech-to-text. | |\n| Usa `flux-2-klein` para imagenes text-to-image e image-to-image; requiere tier inference. | |\n| ## Modelos disponibles | |\n| ### deepseek-v4-flash | |\n| Modelo MoE de texto/chat. Especificacion documentada: | |\n| - Parametros: 284B totales, 21B activos. | |\n| - Cuantizacion: FP8. | |\n| - Contexto: 1M tokens. | |\n| - Cuota mensual: 500M tokens por miembro. | |\n| - Capacidades: chat, streaming SSE, tool calling, reasoning. | |\n| - Control de reasoning: `reasoning_effort` con valores `low`, `medium`, `high`; default `medium`. | |\n| - Enviar `reasoning_effort` como campo top-level del body, no dentro de `extra_body`. | |\n| ### mimo-v2.5 | |\n| Modelo MoE omnimodal. Especificacion documentada: | |\n| - Parametros: 310B totales, 15B activos. | |\n| - Cuantizacion: FP8. | |\n| - Contexto: 1M tokens. | |\n| - Input: texto, imagen, audio. | |\n| - Output: texto. | |\n| - Cuota mensual: 500M tokens por miembro. | |\n| - Licencia: MIT. | |\n| - Capacidades: chat, streaming SSE, tool calling/function calling, reasoning, vision, audio input. | |\n| - Reasoning: siempre activo; actualmente no se puede controlar por API con `reasoning_effort` ni con `enable_thinking`. | |\n| - Recomendacion documentada: `max_tokens >= 300` como minimo para dejar margen al reasoning. | |\n| ### gemma4 | |\n| Modelo MoE de texto/chat multimodal con vision. | |\n| - Parametros: 26B totales, 4B activos. | |\n| - Cuantizacion: FP8. | |\n| - Contexto: 256K tokens. | |\n| - Sampling por defecto: `temperature=0.6`, `top_p=0.95`. | |\n| - Capacidades: chat, streaming SSE, vision/image input, reasoning mode, tool calling documentado en formato XML. | |\n| - Reasoning: desactivado por defecto; se activa con `chat_template_kwargs.enable_thinking: true`. | |\n| ### qwen3.6 | |\n| Modelo principal de NaN para uso general. | |\n| - Tipo: MoE, 35B total. | |\n| - Activo por token: 3B. | |\n| - Cuantizacion: FP8. | |\n| - Contexto: 256K tokens. | |\n| - Speculative decoding: MTP, aproximadamente 2x throughput. | |\n| - Sampling por defecto: `temperature=0.6`, `top_p=0.95`. | |\n| - Capacidades: chat, streaming SSE, vision/image input, tool calling, reasoning. | |\n| - Reasoning: activo por defecto; se desactiva con `chat_template_kwargs.enable_thinking: false`. | |\n| - La API documenta function calling OpenAI como validado especialmente con `qwen3.6`; si necesitas tool calling estable, usa este modelo primero y prueba el resto antes de depender de tools en produccion. | |\n| ### qwen3-embedding | |\n| Modelo de embeddings vectoriales. | |\n| - Parametros: 8B. | |\n| - Dimension: 4096. | |\n| - Precision: Float32 en CPU. | |\n| - RPM documentado del modelo: 60. | |\n| - Batch size: 32. | |\n| - Soporta mas de 100 idiomas, español incluido, y codigo. | |\n| - Casos de uso: busqueda semantica, similitud cross-lingual, clasificacion, RAG. | |\n| - Score documentado: MMTEB 70.58; similitud ES-EN documentada 0.915. | |\n| ### rerank | |\n| Modelo `Qwen3-Reranker-8B` para reranking semantico. | |\n| - Parametros: 8B. | |\n| - Precision: BF16. | |\n| - Endpoints: `/v1/rerank` y `/v2/rerank`. | |\n| - Idiomas: 100+. | |\n| - Casos de uso: RAG embedding -> rerank -> LLM, busqueda cross-lingual, recuperacion de codigo, scoring query-documento. | |\n| - Respuesta: documentos ordenados por `relevance_score` descendente, manteniendo `index` original. | |\n| ### kokoro | |\n| Modelo text-to-speech. | |\n| - Version: v1.0. | |\n| - Parametros: 82M. | |\n| - Latencia: sub-segundo en CPU segun docs. | |\n| - Voces: 67 voice packs. | |\n| - RPM documentado: 15. | |\n| - Voces destacadas: `af_heart` English female, `ef_dora` Spanish female, `em_alex` Spanish male. | |\n| ### whisper | |\n| Modelo speech-to-text. | |\n| - Variante: large-v3. | |\n| - Runtime documentado: CPU con CTranslate2 e INT8. | |\n| - Tamaño aproximado: 3 GB INT8. | |\n| - Velocidad: aproximadamente 1x realtime. | |\n| - WER ES documentado: ~3.2%. | |\n| - RPM documentado: 10. | |\n| - Idiomas: 99+. | |\n| - Capacidades: transcripcion, deteccion automatica de idioma, API OpenAI-compatible. | |\n| - Limite por request: 25 MB. | |\n| - Riesgo de timeout: audios de mas de 2 minutos pueden devolver 524. Divide en segmentos de 2 minutos o menos. | |\n| - Formatos recomendados: OGG/Opus y MP3; evitan archivos enormes frente a WAV sin comprimir. | |\n| ### flux-2-klein | |\n| Modelo de imagen. | |\n| - Tipo: diffusion/FLUX. | |\n| - Endpoints: `/v1/images/generations` y `/v1/images/edits`. | |\n| - Modalidades: text-to-image e image-to-image. | |\n| - Resolucion: de 256 a 1536 px por lado, multiples de 16, aspect ratio entre 1:3 y 3:1. | |\n| - Imagenes por request: `n` entre 1 y 4. | |\n| - Output: URL temporal R2 de unos 60 minutos o `b64_json`. | |\n| - Extensiones NaN: `seed` para reproducibilidad y `guidance` como guidance scale. | |\n| - Cuota mensual: 100 requests por miembro. | |\n| - Requiere tier inference. | |\n| ## Endpoints | |\n| ### Autenticacion | |\n| Todas las peticiones deben incluir: | |\n| ``` http | |\n| Authorization: Bearer sk-tu-key-aqui | |\n| ``` | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/models \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" | |\n| ``` | |\n| ### GET /v1/models | |\n| Devuelve los modelos disponibles para la API key. | |\n| Modelos publicados en la documentacion: | |\n| ``` txt | |\n| deepseek-v4-flash | |\n| mimo-v2.5 | |\n| qwen3.6 | |\n| gemma4 | |\n| qwen3-embedding | |\n| rerank | |\n| kokoro | |\n| whisper | |\n| flux-2-klein | |\n| ``` | |\n| Request: sin body, solo autenticacion. | |\n| Respuesta compatible con OpenAI: | |\n| ``` json | |\n| { | |\n| \"object\": \"list\", | |\n| \"data\": [ | |\n| { | |\n| \"id\": \"qwen3.6\", | |\n| \"object\": \"model\", | |\n| \"created\": 1677610602, | |\n| \"owned_by\": \"openai\" | |\n| } | |\n| ] | |\n| } | |\n| ``` | |\n| ### POST /v1/chat/completions | |\n| Endpoint principal para chat. Compatible con OpenAI Chat Completions. | |\n| Modelos compatibles documentados: | |\n| ``` txt | |\n| deepseek-v4-flash | |\n| mimo-v2.5 | |\n| qwen3.6 | |\n| gemma4 | |\n| ``` | |\n| Parametros principales: | |\n| - `model` requerido: uno de los modelos anteriores. | |\n| - `messages` requerido: array de mensajes `{role, content}`. | |\n| - `content` puede ser string o array multimodal, por ejemplo partes `text`, `image_url` y, en `mimo-v2.5`, `input_audio`. | |\n| - `max_tokens` opcional: limite de tokens generados. En modelos con reasoning, conviene dejar margen suficiente para evitar truncados. | |\n| - `stream` opcional, default `false`; si es `true`, devuelve SSE. | |\n| - `tools` opcional: function calling estilo OpenAI `{type:\"function\", function:{name, description, parameters}}`. | |\n| - `tool_choice` opcional: control estandar OpenAI para seleccion de tool. | |\n| - `temperature` opcional, default `0.6`. | |\n| - `top_p` opcional, default `0.95`. | |\n| - `response_format` opcional para structured outputs. | |\n| - `chat_template_kwargs` opcional para `enable_thinking` en qwen/gemma. | |\n| - `reasoning_effort` opcional para deepseek. | |\n| Ejemplo minimo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/chat/completions \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -H \"Content-Type: application/json\" \\ | |\n| -d '{ | |\n| \"model\": \"qwen3.6\", | |\n| \"messages\": [{\"role\": \"user\", \"content\": \"Hola\"}], | |\n| \"max_tokens\": 200 | |\n| }' | |\n| ``` | |\n| Respuesta sin streaming: | |\n| ``` json | |\n| { | |\n| \"id\": \"chatcmpl-...\", | |\n| \"created\": 1778258163, | |\n| \"model\": \"qwen3.6\", | |\n| \"object\": \"chat.completion\", | |\n| \"choices\": [ | |\n| { | |\n| \"finish_reason\": \"stop\", | |\n| \"index\": 0, | |\n| \"message\": { | |\n| \"role\": \"assistant\", | |\n| \"content\": \"...\", | |\n| \"reasoning_content\": \"...\" | |\n| } | |\n| } | |\n| ], | |\n| \"usage\": { | |\n| \"completion_tokens\": 20, | |\n| \"prompt_tokens\": 17, | |\n| \"total_tokens\": 37 | |\n| } | |\n| } | |\n| ``` | |\n| Los clientes deben tolerar que `reasoning_content` exista o no exista segun modelo/configuracion. | |\n| Streaming: | |\n| - Enviar `stream: true`. | |\n| - La respuesta llega como Server-Sent Events. | |\n| - Cada chunk usa `data: {...}\\n\\n`. | |\n| - El delta de texto esta en `choices[0].delta.content`. | |\n| - El final llega como `data: [DONE]`. | |\n| Tool calling: | |\n| - `qwen3.6` tiene soporte documentado para function calling estandar OpenAI. | |\n| - Cuando el modelo llama una tool, mira `choices[0].message.tool_calls`. | |\n| - La estructura es `{id, type:\"function\", function:{name, arguments}}`. | |\n| - `finish_reason` sera `tool_calls`. | |\n| Vision: | |\n| - `mimo-v2.5`, `qwen3.6` y `gemma4` aceptan imagenes como input. | |\n| - Usa `content` como array de partes. | |\n| Ejemplo de vision: | |\n| ``` json | |\n| { | |\n| \"model\": \"qwen3.6\", | |\n| \"messages\": [ | |\n| { | |\n| \"role\": \"user\", | |\n| \"content\": [ | |\n| {\"type\": \"text\", \"text\": \"Que hay en esta imagen?\"}, | |\n| {\"type\": \"image_url\", \"image_url\": {\"url\": \"https://example.com/foto.jpg\"}} | |\n| ] | |\n| } | |\n| ] | |\n| } | |\n| ``` | |\n| Structured outputs: | |\n| - `response_format: {\"type\": \"json_object\"}` fuerza JSON valido sin schema. | |\n| - `response_format: {\"type\": \"json_schema\", \"json_schema\": {...}}` fuerza un JSON Schema. | |\n| - Con `strict: true`, el modelo no debe emitir campos fuera del schema. | |\n| - Funciona en `qwen3.6` y `gemma4`. | |\n| Ejemplo de JSON Schema: | |\n| ``` json | |\n| { | |\n| \"model\": \"qwen3.6\", | |\n| \"messages\": [{\"role\": \"user\", \"content\": \"Alice, 30 anos.\"}], | |\n| \"response_format\": { | |\n| \"type\": \"json_schema\", | |\n| \"json_schema\": { | |\n| \"name\": \"user\", | |\n| \"strict\": true, | |\n| \"schema\": { | |\n| \"type\": \"object\", | |\n| \"properties\": { | |\n| \"name\": {\"type\": \"string\"}, | |\n| \"age\": {\"type\": \"integer\"} | |\n| }, | |\n| \"required\": [\"name\", \"age\"], | |\n| \"additionalProperties\": false | |\n| } | |\n| } | |\n| } | |\n| } | |\n| ``` | |\n| Reasoning por modelo: | |\n| - `qwen3.6`: usa `chat_template_kwargs.enable_thinking`; activo por defecto. | |\n| - `gemma4`: usa `chat_template_kwargs.enable_thinking`; desactivado por defecto. | |\n| - `deepseek-v4-flash`: usa `reasoning_effort` top-level con `low`, `medium`, `high`; default `medium`. | |\n| - `mimo-v2.5`: siempre activo y no configurable por API actualmente. | |\n| Activar thinking en `gemma4` o desactivarlo en `qwen3.6`: | |\n| ``` json | |\n| { | |\n| \"model\": \"gemma4\", | |\n| \"messages\": [{\"role\": \"user\", \"content\": \"Que es 2+2?\"}], | |\n| \"chat_template_kwargs\": {\"enable_thinking\": true} | |\n| } | |\n| ``` | |\n| En SDKs OpenAI, los campos no estandar suelen ir en `extra_body`: | |\n| ``` python | |\n| from openai import OpenAI | |\n| client = OpenAI( | |\n| api_key=\"sk-tu-key-aqui\", | |\n| base_url=\"https://api.nan.builders/v1\", | |\n| ) | |\n| response = client.chat.completions.create( | |\n| model=\"gemma4\", | |\n| messages=[{\"role\": \"user\", \"content\": \"Que es 2+2?\"}], | |\n| extra_body={\"chat_template_kwargs\": {\"enable_thinking\": True}}, | |\n| ) | |\n| ``` | |\n| Ejemplo para DeepSeek reasoning: | |\n| ``` json | |\n| { | |\n| \"model\": \"deepseek-v4-flash\", | |\n| \"messages\": [{\"role\": \"user\", \"content\": \"Resuelve paso a paso: 3x + 7 = 22\"}], | |\n| \"reasoning_effort\": \"high\" | |\n| } | |\n| ``` | |\n| ### POST /v1/completions | |\n| Endpoint legacy de text completion. Para conversaciones usa `/v1/chat/completions`. | |\n| Modelo compatible documentado: `qwen3.6`. | |\n| Parametros: | |\n| - `model` requerido: `qwen3.6`. | |\n| - `prompt` requerido. | |\n| - `max_tokens` opcional. | |\n| - `temperature` opcional, default `0.6`. | |\n| - `top_p` opcional, default `0.95`. | |\n| - `stream` opcional, default `false`. | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/completions \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -H \"Content-Type: application/json\" \\ | |\n| -d '{ | |\n| \"model\": \"qwen3.6\", | |\n| \"prompt\": \"The capital of France is\", | |\n| \"max_tokens\": 10 | |\n| }' | |\n| ``` | |\n| Respuesta: | |\n| ``` json | |\n| { | |\n| \"id\": \"cmpl-...\", | |\n| \"object\": \"text_completion\", | |\n| \"created\": 1778258166, | |\n| \"model\": \"qwen3.6\", | |\n| \"choices\": [ | |\n| { | |\n| \"text\": \"...\", | |\n| \"index\": 0, | |\n| \"finish_reason\": \"stop\", | |\n| \"logprobs\": null | |\n| } | |\n| ], | |\n| \"usage\": { | |\n| \"completion_tokens\": 10, | |\n| \"prompt_tokens\": 5, | |\n| \"total_tokens\": 15 | |\n| } | |\n| } | |\n| ``` | |\n| ### POST /v1/embeddings | |\n| Genera embeddings vectoriales. | |\n| Modelo compatible: `qwen3-embedding`. | |\n| Parametros: | |\n| - `model` requerido: `qwen3-embedding`. | |\n| - `input` requerido: string o array de strings. | |\n| - `encoding_format` opcional: `\"float\"` por defecto o `\"base64\"`. | |\n| Respuesta: | |\n| - `object: \"list\"`. | |\n| - `model: \"qwen3-embedding\"`. | |\n| - `data[]` con `object: \"embedding\"`, `index` y `embedding`. | |\n| - Vectores de 4096 dimensiones. | |\n| - `usage` con tokens. | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/embeddings \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -H \"Content-Type: application/json\" \\ | |\n| -d '{ | |\n| \"model\": \"qwen3-embedding\", | |\n| \"input\": [\"Hola mundo\", \"Hello world\"], | |\n| \"encoding_format\": \"float\" | |\n| }' | |\n| ``` | |\n| ### POST /v1/rerank | |\n| Reordena documentos por relevancia respecto a una query. | |\n| Modelo compatible: `rerank`. | |\n| Alias: `/v2/rerank`. | |\n| Parametros: | |\n| - `model` requerido: `rerank`. | |\n| - `query` requerido. | |\n| - `documents` requerido: array de strings. | |\n| - `top_n` opcional: limita cuantos resultados devolver. | |\n| Respuesta: | |\n| - `id`. | |\n| - `results[]` con `index`, `relevance_score` entre 0 y 1 y `document.text`. | |\n| - `index` es la posicion original del documento de entrada. | |\n| - `meta.billed_units.total_tokens` y `meta.tokens.input_tokens`. | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/rerank \\ | |\n| -H \"Authorization: Bearer $NAN_API_KEY\" \\ | |\n| -H \"Content-Type: application/json\" \\ | |\n| -d '{ | |\n| \"model\": \"rerank\", | |\n| \"query\": \"What is the capital of France?\", | |\n| \"documents\": [ | |\n| \"Paris is the capital of France and home to the Eiffel Tower.\", | |\n| \"Berlin is the capital of Germany.\", | |\n| \"Madrid is the capital of Spain.\" | |\n| ] | |\n| }' | |\n| ``` | |\n| En el SDK OpenAI puedes usar `client.post(path=\"/rerank\", cast_to=object, body={...})`, porque `rerank` no forma parte del cliente OpenAI estandar. | |\n| ### POST /v1/audio/speech | |\n| Text-to-speech. | |\n| Modelo compatible: `kokoro`. | |\n| Parametros: | |\n| - `model` requerido: `kokoro`. | |\n| - `input` requerido: texto a sintetizar. | |\n| - `voice` requerido: por ejemplo `af_heart`, `ef_dora`, `em_alex`. | |\n| - `response_format` opcional: `mp3` default, `wav`, `flac`, `aac`, `pcm`, `opus`. | |\n| - `speed` opcional, default `1.0`. | |\n| Respuesta: archivo binario de audio, sin envoltorio JSON. | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/audio/speech \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -H \"Content-Type: application/json\" \\ | |\n| -d '{ | |\n| \"model\": \"kokoro\", | |\n| \"input\": \"Bienvenido a NaN.\", | |\n| \"voice\": \"ef_dora\", | |\n| \"response_format\": \"mp3\" | |\n| }' \\ | |\n| -o speech.mp3 | |\n| ``` | |\n| ### POST /v1/audio/transcriptions | |\n| Speech-to-text. La peticion es `multipart/form-data`. | |\n| Modelo compatible: `whisper`. | |\n| Parametros: | |\n| - `file` requerido: archivo de audio. | |\n| - `model` requerido: `whisper`. | |\n| - `language` opcional: codigo ISO-639-1 como `es` o `en`; si falta, se detecta automaticamente. | |\n| - `response_format` opcional: `json` default o `verbose_json`. Otros valores pueden funcionar pero vuelven envueltos en JSON; recomienda usar solo estos dos. | |\n| - `timestamp_granularities[]` opcional: solo con `verbose_json`; `word` para palabras o `segment` default. | |\n| - `temperature` opcional. | |\n| Respuesta `verbose_json`: | |\n| - `text`. | |\n| - `language`. | |\n| - `task`. | |\n| - `duration`. | |\n| - `segments[]` con timestamps, tokens y metricas. | |\n| - `words`, si se pidio granularidad por palabra, con `{word, start, end, probability}`. | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/audio/transcriptions \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -F \"model=whisper\" \\ | |\n| -F \"file=@grabacion.mp3\" \\ | |\n| -F \"language=es\" \\ | |\n| -F \"response_format=verbose_json\" | |\n| ``` | |\n| Limitaciones: | |\n| - Maximo 25 MB por archivo. | |\n| - Audios mayores de 2 minutos pueden devolver timeout 524. | |\n| - Divide audios largos en trozos de 2 minutos o menos. | |\n| - Usa MP3 u OGG/Opus para mejor compresion. | |\n| La pagina de ejemplos tambien muestra `/v1/audio/translations` con `whisper` para traducir audio a ingles, usando multipart con `model=whisper` y `file=@grabacion.mp3`. | |\n| ### POST /v1/responses | |\n| Endpoint estilo OpenAI Responses. | |\n| Modelos compatibles: `qwen3.6` y `gemma4`. | |\n| Parametros: | |\n| - `model` requerido: `qwen3.6` o `gemma4`. | |\n| - `input` requerido: texto o array de mensajes en formato Responses. | |\n| - `max_output_tokens` opcional; default documentado en `qwen3.6`: `65536`. | |\n| - `temperature` opcional, default `0.6`. | |\n| - `top_p` opcional, default `0.95`. | |\n| - `instructions` opcional: instrucciones de sistema. | |\n| Respuesta: | |\n| - `output[]` puede incluir bloques `reasoning` en `qwen3.6`. | |\n| - Tambien incluye bloques `message` con `content[]` de tipo `output_text`. | |\n| - `usage` reporta `input_tokens`, `output_tokens` y `total_tokens`. | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/responses \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -H \"Content-Type: application/json\" \\ | |\n| -d '{ | |\n| \"model\": \"qwen3.6\", | |\n| \"input\": \"Hola, como estas?\" | |\n| }' | |\n| ``` | |\n| Nota de streaming: actualmente este endpoint entrega un unico evento `response.completed` al final, no chunks incrementales. Para streaming token a token usa `/v1/chat/completions` con `stream: true`. | |\n| ### POST /v1/images/generations | |\n| Text-to-image compatible con Images API de OpenAI. | |\n| Modelo compatible: `flux-2-klein`. | |\n| Body: JSON. | |\n| Parametros: | |\n| - `prompt` requerido. | |\n| - `model` opcional, default `flux-2-klein`; modelo desconocido devuelve 404 `model_not_found`. | |\n| - `n` opcional, entre 1 y 4, default 1; mayor que 4 devuelve 400. | |\n| - `size` opcional: `\"ANCHOxALTO\"`, ambos lados divisibles por 16, entre 256 y 1536, aspect ratio entre 1:3 y 3:1. `\"auto\"` u omitido significa `1024x1024`. | |\n| - `response_format` opcional: `\"url\"` default o `\"b64_json\"`. Las URL temporales de R2 duran unos 60 minutos. | |\n| Parametros aceptados pero ignorados por compatibilidad con SDKs OpenAI: | |\n| - `quality` | |\n| - `style` | |\n| - `background` | |\n| - `moderation` | |\n| - `output_format` | |\n| - `output_compression` | |\n| - `user` | |\n| No soporta `stream: true`; devuelve 400. | |\n| Extensiones NaN: | |\n| - `seed`: seed base para reproducibilidad. Si `n > 1`, cada variante usa offset sobre esa seed. | |\n| - `guidance`: guidance scale de FLUX. | |\n| - En SDK OpenAI, pasarlas en `extra_body`. | |\n| Respuesta: | |\n| ``` json | |\n| { | |\n| \"created\": 1778258200, | |\n| \"data\": [ | |\n| {\"url\": \"https://...r2.../image.png\"} | |\n| ] | |\n| } | |\n| ``` | |\n| Con `response_format: \"b64_json\"`, cada elemento usa `{\"b64_json\": \"...\"}`. | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/images/generations \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -H \"Content-Type: application/json\" \\ | |\n| -d '{ | |\n| \"model\": \"flux-2-klein\", | |\n| \"prompt\": \"Un faro al atardecer sobre acantilados, estilo cinematico\", | |\n| \"size\": \"1024x1024\" | |\n| }' | |\n| ``` | |\n| Python con `seed` y `guidance`: | |\n| ``` python | |\n| from openai import OpenAI | |\n| client = OpenAI( | |\n| api_key=\"sk-tu-key-aqui\", | |\n| base_url=\"https://api.nan.builders/v1\", | |\n| ) | |\n| response = client.images.generate( | |\n| model=\"flux-2-klein\", | |\n| prompt=\"Un faro al atardecer sobre acantilados, estilo cinematico\", | |\n| size=\"1024x1024\", | |\n| n=1, | |\n| extra_body={\"seed\": 42, \"guidance\": 3.5}, | |\n| ) | |\n| print(response.data[0].url) | |\n| ``` | |\n| Limites de imagen: | |\n| - No comparten los limites de chat/LiteLLM. | |\n| - Rate limit de imagen: 1 request por segundo sostenido, burst hasta 3. | |\n| - Al exceder rate limit: 429 `rate_limit_exceeded`. | |\n| - Cuota mensual de imagen: 100 requests por usuario/mes. | |\n| - 1 request cuenta igual aunque `n` sea mayor que 1. | |\n| - Cuota de imagen independiente de la cuota de tokens de chat. | |\n| - Requiere tier inference; tier community devuelve 403 `tier_restricted`. | |\n| ### POST /v1/images/edits | |\n| Image-to-image compatible con Images API de OpenAI. | |\n| Modelo compatible: `flux-2-klein`. | |\n| Peticion: `multipart/form-data`. | |\n| Parametros: | |\n| - `image` o `image[]` requerido: hasta 4 imagenes de referencia; las extras se descartan. | |\n| - Formatos de referencia: PNG, JPEG o WebP. | |\n| - Cada imagen debe pesar menos de 25 MB. | |\n| - `prompt` requerido. | |\n| - `model`, `n`, `size`, `response_format`: igual que en `/v1/images/generations`. | |\n| - `seed` y `guidance`: aceptados como campos del form. | |\n| No soporta `mask`; devuelve 400 porque Flux Klein no hace inpainting. | |\n| Respuesta: igual que generaciones, `{\"created\": ..., \"data\": [{\"url\": \"...\"}]}` o `b64_json`. | |\n| Ejemplo: | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/images/edits \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -F \"model=flux-2-klein\" \\ | |\n| -F \"image[]=@ref.png\" \\ | |\n| -F \"prompt=Convierte la escena en invierno con nieve\" \\ | |\n| -F \"size=1024x1024\" | |\n| ``` | |\n| ## Errores | |\n| Formato de error compatible con OpenAI: | |\n| ``` json | |\n| { | |\n| \"error\": { | |\n| \"message\": \"...\", | |\n| \"type\": null, | |\n| \"param\": null, | |\n| \"code\": \"...\" | |\n| } | |\n| } | |\n| ``` | |\n| Codigos comunes: | |\n| - 400: parametro invalido. En imagenes puede indicar `prompt`, `n`, `size`, `stream`, `mask` o `image`; filtro de seguridad usa `content_policy_violation`. | |\n| - 401: `Authorization` ausente o invalido; `invalid_api_key`. | |\n| - 403: tier sin acceso; `tier_restricted`, especialmente imagenes sin tier inference. | |\n| - 404: modelo no existe; `model_not_found`. | |\n| - 429: rate limit o concurrencia excedida; `rpm_limit`, `max_parallel_requests`, `rate_limit_exceeded`, `quota_exceeded` o `insufficient_quota`. | |\n| - 500: error interno o upstream del modelo. | |\n| - 524: timeout, tipico en audios grandes con `/v1/audio/transcriptions`. | |\n| ## Rate limits y cuotas | |\n| Limites generales por API key: | |\n| - Requests por minuto: 60 rpm. | |\n| - Paralelo maximo: 5 concurrentes. | |\n| Tokens por minuto por modelo: | |\n| - `deepseek-v4-flash`: 1.5M tpm. | |\n| - `mimo-v2.5`: 1.5M tpm. | |\n| - `qwen3.6`: 1.5M tpm. | |\n| - `gemma4`: 1.5M tpm. | |\n| Requests por minuto por modelo: | |\n| - `rerank`: 1000 rpm. | |\n| Cuotas: | |\n| - `deepseek-v4-flash`: 500M tokens/mes por miembro. | |\n| - `mimo-v2.5`: 500M tokens/mes por miembro. | |\n| - Imagenes `flux-2-klein`: 100 requests/mes por usuario. | |\n| ## SDKs y snippets de uso | |\n| ### cURL chat | |\n| ``` bash | |\n| curl https://api.nan.builders/v1/chat/completions \\ | |\n| -H \"Content-Type: application/json\" \\ | |\n| -H \"Authorization: Bearer sk-tu-key-aqui\" \\ | |\n| -d '{ | |\n| \"model\": \"qwen3.6\", | |\n| \"messages\": [{\"role\": \"user\", \"content\": \"Hola, como estas?\"}], | |\n| \"max_tokens\": 500 | |\n| }' | |\n| ``` | |\n| ### Python OpenAI SDK | |\n| Instalar: | |\n| ``` bash | |\n| pip install openai | |\n| ``` | |\n| Chat streaming: | |\n| ``` python | |\n| from openai import OpenAI | |\n| client = OpenAI( | |\n| api_key=\"sk-tu-key-aqui\", | |\n| base_url=\"https://api.nan.builders/v1\", | |\n| ) | |\n| stream = client.chat.completions.create( | |\n| model=\"qwen3.6\", | |\n| messages=[{\"role\": \"user\", \"content\": \"Escribe un hola mundo en Rust\"}], | |\n| max_tokens=500, | |\n| stream=True, | |\n| ) | |\n| for chunk in stream: | |\n| content = chunk.choices[0].delta.content | |\n| if content: | |\n| print(content, end=\"\", flush=True) | |\n| ``` | |\n| Embeddings: | |\n| ``` python | |\n| response = client.embeddings.create( | |\n| model=\"qwen3-embedding\", | |\n| input=[\"Kubernetes pod scheduling\", \"Programacion de pods Kubernetes\"], | |\n| encoding_format=\"float\", | |\n| ) | |\n| vectors = [item.embedding for item in response.data] | |\n| assert len(vectors[0]) == 4096 | |\n| ``` | |\n| Rerank: | |\n| ``` python | |\n| response = client.post( | |\n| path=\"/rerank\", | |\n| cast_to=object, | |\n| body={ | |\n| \"model\": \"rerank\", | |\n| \"query\": \"What is the capital of France?\", | |\n| \"documents\": [ | |\n| \"Paris is the capital of France.\", | |\n| \"Berlin is the capital of Germany.\", | |\n| \"Madrid is the capital of Spain.\", | |\n| ], | |\n| }, | |\n| ) | |\n| ``` | |\n| Text-to-speech: | |\n| ``` python | |\n| response = client.audio.speech.create( | |\n| model=\"kokoro\", | |\n| voice=\"ef_dora\", | |\n| input=\"Hola, bienvenido a NaN builders.\", | |\n| speed=1.0, | |\n| response_format=\"mp3\", | |\n| ) | |\n| response.stream_to_file(\"output.mp3\") | |\n| ``` | |\n| Speech-to-text: | |\n| ``` python | |\n| with open(\"grabacion.mp3\", \"rb\") as f: | |\n| result = client.audio.transcriptions.create( | |\n| model=\"whisper\", | |\n| file=f, | |\n| language=\"es\", | |\n| response_format=\"verbose_json\", | |\n| ) | |\n| print(result.text) | |\n| ``` | |\n| ### Node.js OpenAI SDK | |\n| Instalar: | |\n| ``` bash | |\n| npm install openai | |\n| ``` | |\n| Chat streaming: | |\n| ``` js | |\n| import OpenAI from \"openai\"; | |\n| const client = new OpenAI({ | |\n| apiKey: \"sk-tu-key-aqui\", | |\n| baseURL: \"https://api.nan.builders/v1\", | |\n| }); | |\n| const stream = await client.chat.completions.create({ | |\n| model: \"qwen3.6\", | |\n| messages: [{ role: \"user\", content: \"Escribe un hola mundo en Zig\" }], | |\n| max_tokens: 500, | |\n| stream: true, | |\n| }); | |\n| for await (const chunk of stream) { | |\n| const content = chunk.choices[0]?.delta?.content; | |\n| if (content) process.stdout.write(content); | |\n| } | |\n| ``` | |\n| Embeddings: | |\n| ``` js | |\n| const response = await client.embeddings.create({ | |\n| model: \"qwen3-embedding\", | |\n| input: [\"Hello world\", \"Hola mundo\"], | |\n| encoding_format: \"float\", | |\n| }); | |\n| const vectors = response.data.map((item) => item.embedding); | |\n| console.log(vectors[0].length); // 4096 | |\n| ``` | |\n| Text-to-speech: | |\n| ``` js | |\n| import fs from \"fs\"; | |\n| const response = await client.audio.speech.create({ | |\n| model: \"kokoro\", | |\n| voice: \"ef_dora\", | |\n| input: \"Hola, bienvenido a NaN builders.\", | |\n| speed: 1.0, | |\n| response_format: \"mp3\", | |\n| }); | |\n| const buffer = Buffer.from(await response.arrayBuffer()); | |\n| fs.writeFileSync(\"output.mp3\", buffer); | |\n| ``` | |\n| ## Configuracion de herramientas | |\n| ### Variables de entorno genericas | |\n| Muchos clientes OpenAI-compatible leen estas variables: | |\n| ``` bash | |\n| export OPENAI_BASE_URL=\"https://api.nan.builders/v1\" | |\n| export OPENAI_API_KEY=\"sk-tu-key-aqui\" | |\n| ``` | |\n| Si el cliente usa `BASE_URL`, `OPENAI_API_BASE`, `OPENAI_API_URL` o `api_url`, pon siempre `https://api.nan.builders/v1`. | |\n| ### OpenAI-compatible provider generico | |\n| ``` js | |\n| provider: { | |\n| openai: { | |\n| npm: \"@ai-sdk/openai\", | |\n| name: \"NaN\", | |\n| apiKey: \"sk-tu-key-aqui\", | |\n| baseURL: \"https://api.nan.builders/v1\", | |\n| model: \"qwen3.6\" | |\n| } | |\n| } | |\n| ``` | |\n| ### OpenCode / opencode.json | |\n| Usa `@ai-sdk/openai-compatible`, base URL de NaN y define modelos. En algunas herramientas conviene usar `contextWindow: 500000` para modelos de 1M si la herramienta no tolera ventanas tan grandes; la capacidad documentada de `deepseek-v4-flash` y `mimo-v2.5` es 1M. | |\n| ``` json | |\n| { | |\n| \"$schema\": \"https://opencode.ai/config.json\", | |\n| \"provider\": { | |\n| \"nan\": { | |\n| \"npm\": \"@ai-sdk/openai-compatible\", | |\n| \"name\": \"NaN\", | |\n| \"options\": { | |\n| \"baseURL\": \"https://api.nan.builders/v1\", | |\n| \"apiKey\": \"sk-tu-key-aqui\" | |\n| }, | |\n| \"models\": { | |\n| \"qwen3.6\": { | |\n| \"name\": \"Qwen 3.6\", | |\n| \"contextWindow\": 262144, | |\n| \"modalities\": {\"input\": [\"text\", \"image\"], \"output\": [\"text\"]} | |\n| }, | |\n| \"gemma4\": { | |\n| \"name\": \"Gemma 4\", | |\n| \"contextWindow\": 262144, | |\n| \"modalities\": {\"input\": [\"text\", \"image\"], \"output\": [\"text\"]} | |\n| }, | |\n| \"deepseek-v4-flash\": { | |\n| \"name\": \"DeepSeek V4 Flash\", | |\n| \"contextWindow\": 500000, | |\n| \"modalities\": {\"input\": [\"text\"], \"output\": [\"text\"]} | |\n| }, | |\n| \"mimo-v2.5\": { | |\n| \"name\": \"Xiaomi MiMo V2.5\", | |\n| \"contextWindow\": 500000, | |\n| \"modalities\": {\"input\": [\"text\", \"image\", \"audio\"], \"output\": [\"text\"]} | |\n| } | |\n| } | |\n| } | |\n| }, | |\n| \"compaction\": { | |\n| \"auto\": true, | |\n| \"prune\": true, | |\n| \"reserved\": 50000 | |\n| } | |\n| } | |\n| ``` | |\n| ### ~/.pi/agent/models.json | |\n| ``` json | |\n| { | |\n| \"providers\": { | |\n| \"nan\": { | |\n| \"baseUrl\": \"https://api.nan.builders/v1\", | |\n| \"api\": \"openai-completions\", | |\n| \"apiKey\": \"<api-key>\", | |\n| \"compat\": { | |\n| \"supportsDeveloperRole\": true | |\n| }, | |\n| \"models\": [ | |\n| { | |\n| \"id\": \"qwen3.6\", | |\n| \"name\": \"Qwen 3.6\", | |\n| \"reasoning\": true, | |\n| \"input\": [\"text\", \"image\"], | |\n| \"contextWindow\": 262144, | |\n| \"maxTokens\": 16384 | |\n| }, | |\n| { | |\n| \"id\": \"gemma4\", | |\n| \"name\": \"Gemma 4\", | |\n| \"reasoning\": true, | |\n| \"input\": [\"text\", \"image\"], | |\n| \"contextWindow\": 262144, | |\n| \"maxTokens\": 16384 | |\n| } | |\n| ] | |\n| } | |\n| } | |\n| } | |\n| ``` | |\n| ### ~/.openclaw/openclaw.json | |\n| ``` json | |\n| { | |\n| \"models\": { | |\n| \"providers\": { | |\n| \"nan\": { | |\n| \"baseUrl\": \"https://api.nan.builders/v1\", | |\n| \"apiKey\": \"sk-...\", | |\n| \"api\": \"openai-completions\", | |\n| \"models\": [ | |\n| { | |\n| \"id\": \"qwen3.6\", | |\n| \"name\": \"Qwen 3.6\", | |\n| \"reasoning\": true, | |\n| \"input\": [\"text\", \"image\"], | |\n| \"contextWindow\": 262144, | |\n| \"maxTokens\": 65536 | |\n| } | |\n| ] | |\n| } | |\n| } | |\n| }, | |\n| \"agents\": { | |\n| \"defaults\": { | |\n| \"model\": {\"primary\": \"nan/qwen3.6\"}, | |\n| \"models\": { | |\n| \"nan/qwen3.6\": { | |\n| \"params\": { | |\n| \"maxTokens\": 16000 | |\n| } | |\n| } | |\n| } | |\n| } | |\n| } | |\n| } | |\n| ``` | |\n| Explicacion practica: | |\n| - `models.providers.nan.models[].maxTokens` indica la capacidad maxima configurada. | |\n| - `agents.defaults.models[\"nan/...\"].params.maxTokens` indica lo enviado por request. | |\n| - Para `qwen3.6`, 16K suele ser buen balance. | |\n| ### Zed settings.json | |\n| Ruta habitual: `~/.config/zed/settings.json`. | |\n| ``` json | |\n| { | |\n| \"language_models\": { | |\n| \"openai\": { | |\n| \"api_url\": \"https://api.nan.builders/v1\", | |\n| \"available_models\": [ | |\n| { | |\n| \"name\": \"qwen3.6\", | |\n| \"display_name\": \"NaN Qwen 3.6\", | |\n| \"max_tokens\": 262144 | |\n| } | |\n| ] | |\n| } | |\n| }, | |\n| \"edit_predictions\": { | |\n| \"open_ai_compatible_api\": { | |\n| \"api_url\": \"https://api.nan.builders/v1\", | |\n| \"model\": \"qwen3.6\" | |\n| } | |\n| } | |\n| } | |\n| ``` | |\n| ### Cursor | |\n| Configura proveedor OpenAI-compatible: | |\n| ``` txt | |\n| Base URL: https://api.nan.builders/v1 | |\n| API Key: sk-tu-key-aqui | |\n| Model: qwen3.6 | |\n| ``` | |\n| ### Cline, Continue, Aider y clientes similares | |\n| Usa las variables de entorno o la UI de proveedor OpenAI-compatible: | |\n| ``` bash | |\n| export OPENAI_BASE_URL=\"https://api.nan.builders/v1\" | |\n| export OPENAI_API_KEY=\"sk-tu-key-aqui\" | |\n| ``` | |\n| Modelo recomendado por defecto: `qwen3.6`. | |\n| Para vision: usa `qwen3.6`, `gemma4` o `mimo-v2.5`. | |\n| Para audio input multimodal: usa `mimo-v2.5`. | |\n| ## Recomendaciones operativas | |\n| 1. Empieza con `qwen3.6` para validar que la key y el base URL funcionan. | |\n| 2. Comprueba `/v1/models` antes de diagnosticar problemas de modelo. | |\n| 3. En clientes que soporten razonamiento separado, conserva `reasoning_content` si existe, pero no falles si no existe. | |\n| 4. En clientes con streaming, usa `/v1/chat/completions`, no `/v1/responses`, si necesitas tokens incrementales. | |\n| 5. En RAG: usa `qwen3-embedding` para recuperar candidatos, `rerank` para reordenarlos y despues `qwen3.6` o `deepseek-v4-flash` para responder. | |\n| 6. En Whisper, trocea audios largos antes de mandarlos para evitar 524. | |\n| 7. En imagenes, recuerda que la cuota es por request, no por imagen generada dentro del request. |", "url": "https://wpnews.pro/news/config-nan-configuracion-nan-builders-para-llms", "canonical_source": "https://gist.github.com/686f6c61/8c05e9e6a1fa6062f5a23f56edac46af", "published_at": "2026-07-11 08:02:45+00:00", "updated_at": "2026-07-13 14:41:35.373872+00:00", "lang": "en", "topics": ["large-language-models", "developer-tools", "ai-infrastructure"], "entities": ["NaN Builders", "LiteLLM", "Helmcode", "deepseek-v4-flash", "mimo-v2.5", "gemma4", "qwen3.6"], "alternates": {"html": "https://wpnews.pro/news/config-nan-configuracion-nan-builders-para-llms", "markdown": "https://wpnews.pro/news/config-nan-configuracion-nan-builders-para-llms.md", "text": "https://wpnews.pro/news/config-nan-configuracion-nan-builders-para-llms.txt", "jsonld": "https://wpnews.pro/news/config-nan-configuracion-nan-builders-para-llms.jsonld"}}