Skip to content
Open
73 changes: 64 additions & 9 deletions src/components/docs/RateLimits.astro
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
---
import { env } from 'cloudflare:workers';
import {
effectiveLimitNote,
formatTokens,
getRateLimitsConfig,
imageModelNote,
modelRateLabel,
windowedModelBody,
windowedModelHeadline,
rateLimitsLabels,
} from '../../lib/rateLimits';
import { resolveRateLimitsConfig } from '../../lib/limitsPolicy';

const { perKey, tokensPerMinuteByModel, requestsPerMinuteByModel, windowedModels } =
getRateLimitsConfig(env);
// Awaited, not called: with LIMITS_POLICY_URL unset this resolves to the
// built-in table without making a request. See src/lib/limitsPolicy.ts.
const { perKey, tokensPerMinuteByModel, exemptModels, windowedModels, imageModels } =
await resolveRateLimitsConfig(env);

// This card is embedded from both the English and the Spanish guides, and MDX
// content cannot pass props down from the layout, so the locale is read off the
Expand Down Expand Up @@ -60,6 +65,10 @@ const T = rateLimitsLabels(lang);
<dt class="text-neutral-500 uppercase tracking-wider">{T.context}</dt>
<dd class="text-neutral-200 text-right">{formatTokens(m.contextTokens, lang)} tokens</dd>
</div>
<div class="flex items-baseline justify-between gap-4 font-mono text-xs">
<dt class="text-neutral-500 uppercase tracking-wider">{T.tokensPerMin}</dt>
<dd class="text-neutral-200 text-right">{modelRateLabel(m, lang)}</dd>
</div>
<div class="flex items-baseline justify-between gap-4 font-mono text-xs">
<dt class="text-neutral-500 uppercase tracking-wider">{T.concurrentRequests}</dt>
<dd class="text-neutral-200 text-right">{m.maxParallel}</dd>
Expand All @@ -82,25 +91,71 @@ const T = rateLimitsLabels(lang);
tokensPerMinuteByModel.map((m) => (
<div class="flex items-baseline justify-between gap-4 font-mono text-xs">
<dt class="text-neutral-500 uppercase tracking-wider">{m.model}</dt>
<dd class="text-neutral-200 text-right">{m.label}</dd>
<dd class="text-neutral-200 text-right">{modelRateLabel(m, lang)}</dd>
</div>
))
}
</dl>
</div>

<div class="rounded-xl border border-neutral-800/60 bg-[#0a0a0a] p-6 mb-14">
{
/* Published as a list rather than left out. An endpoint missing from the
table above cannot be told apart from one we forgot to measure, which is
how `rerank` came to sit here with an invented 1000 rpm for months. */
}
<div class="rounded-xl border border-neutral-800/60 bg-[#0a0a0a] p-6 mb-6">
<p class="font-mono text-[10px] text-violet-400 uppercase tracking-widest mb-4">
{T.requestsPerModel}
{T.exempt}
</p>
<dl class="grid gap-3 sm:grid-cols-2">
{
requestsPerMinuteByModel.map((m) => (
exemptModels.map((model) => (
<div class="flex items-baseline justify-between gap-4 font-mono text-xs">
<dt class="text-neutral-500 uppercase tracking-wider">{m.model}</dt>
<dd class="text-neutral-200 text-right">{m.label}</dd>
<dt class="text-neutral-500 uppercase tracking-wider">{model}</dt>
<dd class="text-neutral-200 text-right">{T.noOwnLimit}</dd>
</div>
))
}
</dl>
</div>

<p class="font-mono text-[11px] leading-relaxed text-neutral-400 mb-6">
{effectiveLimitNote(lang)}
</p>

{
/* Image generation is served by cloud-api against Workers AI, not through
LiteLLM, so none of the limits above reach it. Its own block rather than a
row, because the first thing to say about it is that the key's limits do
not apply - which no row can say. */
}
{
imageModels.map((m) => (
<div class="rounded-xl border border-neutral-800/60 bg-[#0a0a0a] p-6 mb-14">
<p class="font-mono text-[10px] text-violet-400 uppercase tracking-widest mb-4">
{m.model} · {T.images}
</p>
<dl class="grid gap-3 sm:grid-cols-2">
<div class="flex items-baseline justify-between gap-4 font-mono text-xs">
<dt class="text-neutral-500 uppercase tracking-wider">{T.perSecond}</dt>
<dd class="text-neutral-200 text-right">{m.requestsPerSecond}</dd>
</div>
<div class="flex items-baseline justify-between gap-4 font-mono text-xs">
<dt class="text-neutral-500 uppercase tracking-wider">{T.burst}</dt>
<dd class="text-neutral-200 text-right">{m.burst}</dd>
</div>
<div class="flex items-baseline justify-between gap-4 font-mono text-xs">
<dt class="text-neutral-500 uppercase tracking-wider">{T.monthlyRequests}</dt>
<dd class="text-neutral-200 text-right">{m.monthlyRequests}</dd>
</div>
<div class="flex items-baseline justify-between gap-4 font-mono text-xs">
<dt class="text-neutral-500 uppercase tracking-wider">{T.maxVariants}</dt>
<dd class="text-neutral-200 text-right">{m.maxVariants}</dd>
</div>
</dl>
<p class="mt-4 font-mono text-[11px] leading-relaxed text-neutral-400">
{imageModelNote(m, lang)}
</p>
</div>
))
}
2 changes: 1 addition & 1 deletion src/content/docs-es/agent-setup.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ Cada página de esta sección tiene la misma forma: qué necesitas, la configura
name: 'Servidor MCP',
href: '/es/docs/mcp',
kind: 'Herramientas',
note: 'La búsqueda web de NaN dentro de cualquier agente compatible con MCP.',
note: 'Deprecado. La búsqueda web de NaN dentro de cualquier agente compatible con MCP, y se retira con ella.',
},
]}
/>
Expand Down
2 changes: 1 addition & 1 deletion src/content/docs-es/agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ group: Guías
NaN Cloud te permite desplegar agentes de IA en tu propia **microVM**: una máquina virtual ligera con QEMU y KVM, con su propio kernel, su propio sistema de ficheros y acceso root completo. Aislada del host y del resto de miembros. El primer tipo de agente disponible es **Hermes**.

> **¿Usas un agente que alojas tú?**
> Si ejecutas tu propio agente compatible con MCP en otro sitio, puedes enchufarle nuestras herramientas (como la búsqueda web) directamente, con la misma API key, a través de nuestro [servidor MCP](/es/docs/api#tag/mcp) remoto.
> Si ejecutas tu propio agente compatible con MCP en otro sitio, puedes enchufarle nuestras herramientas (como la búsqueda web) directamente, con la misma API key, a través de nuestro [servidor MCP](/es/docs/api#tag/mcp) remoto. Ojo: el servidor MCP y la búsqueda web están **deprecados** y se van a retirar.

## Arquitectura

Expand Down
2 changes: 1 addition & 1 deletion src/content/docs-es/claude-code.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -201,4 +201,4 @@ En cualquiera de los dos, evita `glm5.3` para tareas que impliquen leer capturas

## Las herramientas de NaN, aparte

Independientemente del camino que elijas, puedes darle a Claude Code la búsqueda web del clúster con una sola orden. Está en [Servidor MCP](/es/docs/mcp).
Independientemente del camino que elijas, puedes darle a Claude Code la búsqueda web del clúster con una sola orden. Está en [Servidor MCP](/es/docs/mcp), que está **deprecado**: hoy sigue funcionando, pero se retira junto con la búsqueda web, así que no construyas encima.
6 changes: 4 additions & 2 deletions src/content/docs-es/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ for r in response["results"]:
print(f"{r['index']}: {r['relevance_score']:.3f}")
```

También funciona con `requests` a pelo o con cualquier cliente HTTP: el endpoint es compatible con OpenAI tanto en la autenticación como en el formato del cuerpo.
También funciona con `requests` a pelo o con cualquier cliente HTTP: manda el cuerpo JSON con tu key en el Bearer. `/rerank` es un endpoint nuestro, no está en la especificación de OpenAI: la autenticación es la misma, el cuerpo es nuestro.

## model: kokoro

Expand Down Expand Up @@ -472,10 +472,12 @@ console.log(image.data[0].url);

`/images/edits` acepta hasta cuatro imágenes de referencia (PNG, JPEG o WebP, de menos de 25 MB cada una) y no admite `mask`: mandar una devuelve `400`.

Las imágenes necesitan membresía de inferencia, `403` si no la tienes, y van por su propio presupuesto: 20 peticiones por minuto y 100 al mes, que no toca tu cuota de tokens.
Las imágenes necesitan membresía de inferencia, `403` si no la tienes, y van por su propio presupuesto, que ni toca tu cuota de tokens ni es el de tu key: la generación de imágenes no pasa por la API de inferencia compartida. Una petición por segundo con una ráfaga de 3, y 100 peticiones por mes natural. Una petición que pida varias imágenes sigue costando una.

## tool: web search

**Deprecado.** La búsqueda web se retira, tanto por este endpoint como por el [servidor MCP](/es/docs/mcp). Hoy sigue funcionando y anunciaremos una fecha antes de que deje de hacerlo, pero no construyas nada nuevo encima.

búsqueda web autenticada para agentes: `POST /v1/search`

### curl
Expand Down
2 changes: 1 addition & 1 deletion src/content/docs-es/gentle-ai.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -131,5 +131,5 @@ Conviene pasar `sync` después de cada `upgrade`: lo primero actualiza el progra
## Siguientes pasos

- [Configurar tu agente](/es/docs/agent-setup): conecta primero tu herramienta al clúster.
- [Servidor MCP](/es/docs/mcp): añade además la búsqueda web de NaN a tu agente.
- [Servidor MCP](/es/docs/mcp): añade además la búsqueda web de NaN a tu agente. **Deprecado**, se retira junto con la búsqueda web.
- [Elige tu modelo](/es/docs/choose-a-model): qué modelo pedir para cada tarea.
2 changes: 1 addition & 1 deletion src/content/docs-es/getting-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ El detalle completo, endpoint a endpoint, está en la [referencia de la API](/es

Dos límites van por API key y se aplican a todo lo que llames: peticiones por minuto y peticiones a la vez.

Encima de esos, algunos modelos llevan el suyo: un techo de tokens por minuto en los modelos de chat grandes, y uno de peticiones por minuto en `rerank`. `glm5.3` no se rige por minuto en absoluto, sino por una ventana móvil de tokens más una asignación por periodo de facturación. La búsqueda web va por un presupuesto separado del de los modelos.
Encima de esos, cada modelo de chat lleva su propio techo de tokens por minuto, y no son el mismo número: cada uno es el contexto de ese modelo por las veces que puedes rellenarlo en un minuto. Los endpoints que no son de chat, `rerank`, `qwen3-embedding`, `kokoro` y `whisper`, no llevan techo propio, lo que no los hace gratis: los 60 por minuto de tu key los siguen contando. `glm5.3` tiene techo como los demás, pero lo que de verdad lo limita es una ventana móvil de tokens más una asignación por periodo de facturación. La búsqueda web va por un presupuesto separado del de los modelos.

Las cifras vigentes están al final de [Modelos](/es/docs/models), que es donde se publican para que no haya dos versiones de la misma cifra dando vueltas.

Expand Down
2 changes: 1 addition & 1 deletion src/content/docs-es/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Los límites van por API key — un tope de peticiones por minuto y un máximo d
- [Elige tu modelo](/es/docs/choose-a-model): qué modelo pedir para cada tarea y cómo se escribe su id.
- [Configurar tu agente](/es/docs/agent-setup): Claude Code, Codex, Cursor, Cline, OpenCode, Zed y compañía.
- [CLI de NaN](/es/docs/nan-cli): la herramienta oficial de terminal, que además configura varias de ellas por ti.
- [Servidor MCP](/es/docs/mcp): la búsqueda web de NaN dentro de tu agente.
- [Servidor MCP](/es/docs/mcp): la búsqueda web de NaN dentro de tu agente. **Deprecado**, se retira junto con la búsqueda web.
- [Referencia de la API](/es/docs/api): todos los endpoints, campo a campo.
- [Modelos](/es/docs/models): las fichas técnicas y los límites.
- [Ejemplos](/es/docs/examples): fragmentos en Python, Node.js y curl.
Expand Down
11 changes: 9 additions & 2 deletions src/content/docs-es/mcp.mdx
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
---
title: Servidor MCP
description: Enchufa la búsqueda web de NaN en cualquier agente compatible con MCP.
description: "Deprecado: la búsqueda web de NaN dentro de cualquier agente compatible con MCP. Se retira junto con la búsqueda web."
order: 16
group: Configurar tu agente
---

import Details from '../../components/docs/Details.astro';
import Callout from '../../components/docs/Callout.astro';

# Servidor MCP.

<Callout title="Deprecado: este servidor se retira" variant="warning">
La búsqueda web se va, tanto por API como por este servidor, y la búsqueda web es la única herramienta que este servidor tiene. Así que el servidor MCP se va con ella.

Todo sigue funcionando hoy, y anunciaremos una fecha de retirada antes de que nada deje de hacerlo. Para lo que sirve este aviso es para la decisión que tienes delante: **no construyas nada nuevo encima**, y si ya lo has hecho, cuenta con moverte. El resto de esta sección, los modelos, no se ve afectado.
</Callout>

Además de los modelos, NaN expone sus propias herramientas a través de un servidor **MCP** ([Model Context Protocol](https://modelcontextprotocol.io)). Sirve para lo contrario que el resto de esta sección: aquí no le das modelos a tu agente, le das **capacidades**.

Hoy la herramienta disponible es la **búsqueda web**. El registro irá creciendo, así que pregúntale al servidor qué tiene en vez de fiarte de esta frase.
La única herramienta es la **búsqueda web**, y está deprecada. Lo que viene debajo describe lo que sigue funcionando hoy.

| Campo | Valor |
|---|---|
Expand Down
1 change: 1 addition & 0 deletions src/content/docs-es/models.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ OpenAI y la misma `base URL`.
{ label: 'Modalidades', value: 'texto→imagen · imagen→imagen' },
{ label: 'Resolución', value: '256 a 1536 px (múltiplos de 16)' },
{ label: 'Imágenes / petición', value: '1 a 4 (n)' },
{ label: 'Ritmo', value: '1 pet/s · ráfaga 3' },
{ label: 'Cuota mensual', value: '100 peticiones / miembro' },
]}
items={[
Expand Down
10 changes: 4 additions & 6 deletions src/content/docs-es/nan-cli.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,12 @@ En Windows, desde PowerShell:
irm https://nan.builders/install.ps1 | iex
```

Hace el mismo trabajo: resuelve la última release, descarga el `.zip` de tu arquitectura, **verifica su checksum** y deja `nan.exe` en `%LOCALAPPDATA%\Programs
an`, añadiendo esa carpeta a tu `PATH` de usuario si no estaba. Las terminales que ya tuvieras abiertas no lo verán hasta que las reinicies.
Hace el mismo trabajo: resuelve la última release, descarga el `.zip` de tu arquitectura, **verifica su checksum** y deja `nan.exe` en `%LOCALAPPDATA%\Programs\nan`, añadiendo esa carpeta a tu `PATH` de usuario si no estaba. Las terminales que ya tuvieras abiertas no lo verán hasta que las reinicies.

Instala para tu usuario y no para toda la máquina, a propósito: el equivalente en Windows del `sudo` es un diálogo de elevación saliendo de un script por tubería, que es peor. Para ponerlo en otro sitio:

```powershell
& ([scriptblock]::Create((irm https://nan.builders/install.ps1))) -InstallDir "C: ools"
& ([scriptblock]::Create((irm https://nan.builders/install.ps1))) -InstallDir "C:\tools"
```

Hay binarios para macOS, Linux y Windows, en Intel y en ARM.
Expand Down Expand Up @@ -130,7 +129,7 @@ Dentro de OpenCode, `/models` te enseña los modelos de NaN ya disponibles.

<Details summary="Compilar desde el código">

Es la vía para Windows, y la que quieres si vas a tocar el CLI. Hace falta [Go](https://go.dev) 1.26 o superior:
Es la que quieres si vas a tocar el CLI. Hace falta [Go](https://go.dev) 1.26 o superior:

```bash
git clone https://github.com/helmcode/nan-cli
Expand Down Expand Up @@ -183,7 +182,6 @@ El resultado es el mismo. Lo único que te pierdes son las pestañas de consumo

<Details summary="Problemas conocidos">

- **En Windows hay que compilar.** Las versiones publicadas traen binarios de macOS y Linux; para Windows, de momento, la vía es `go build`.
- **El instalador pide la lista de versiones a GitHub.** Si estás detrás de un proxy que bloquea `api.github.com`, no encontrará nada que descargar. En ese caso, baja el `.tar.gz` de tu sistema a mano desde la [página de releases](https://github.com/helmcode/nan-cli/releases).
- **El instalador pide la lista de versiones a GitHub.** Si estás detrás de un proxy que bloquea `api.github.com`, no encontrará nada que descargar. En ese caso, baja a mano el archivo de tu sistema desde la [página de releases](https://github.com/helmcode/nan-cli/releases).

</Details>
2 changes: 1 addition & 1 deletion src/content/docs/agent-setup.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ Yours is not here? If it accepts an OpenAI base URL and an API key, it works. Co
name: 'MCP server',
href: '/docs/mcp',
kind: 'Tools',
note: 'NaN\'s web search inside any MCP-compatible agent.',
note: 'Deprecated. NaN\'s web search inside any MCP-compatible agent, being retired along with it.',
},
]}
/>
Expand Down
2 changes: 1 addition & 1 deletion src/content/docs/agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ group: Guides
NaN Cloud lets you deploy AI agents in your own **microVM**: a lightweight virtual machine with QEMU + KVM, its own kernel, its own filesystem, and full root access. Isolated from the host and from other members. The first available agent type is **Hermes**.

> **Using an agent you host yourself?**
> If you run your own MCP-compatible agent elsewhere, you can plug our tools (such as web search) straight into it with the same API key via our remote [MCP server](/docs/api#tag/mcp).
> If you run your own MCP-compatible agent elsewhere, you can plug our tools (such as web search) straight into it with the same API key via our remote [MCP server](/docs/api#tag/mcp). Note that the MCP server and web search are both **deprecated** and are being retired.

## Architecture

Expand Down
2 changes: 1 addition & 1 deletion src/content/docs/claude-code.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -201,4 +201,4 @@ On either path, avoid `glm5.3` for tasks that involve reading screenshots: it do

## NaN's tools, separately

Whichever path you choose, you can give Claude Code the cluster's web search with a single command. It is in [MCP server](/docs/mcp).
Whichever path you choose, you can give Claude Code the cluster's web search with a single command. It is in [MCP server](/docs/mcp) - which is **deprecated**: it still works today, but it is being retired along with web search, so do not build on it.
6 changes: 4 additions & 2 deletions src/content/docs/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ for r in response["results"]:
print(f"{r['index']}: {r['relevance_score']:.3f}")
```

Also works with raw `requests` or any HTTP client — the endpoint is OpenAI-compatible in authentication and payload format.
Also works with raw `requests` or any HTTP client — send the JSON body with your Bearer key. `/rerank` is an endpoint of ours, not part of the OpenAI specification: the authentication is the same one, the body is ours.

## model: kokoro

Expand Down Expand Up @@ -472,10 +472,12 @@ console.log(image.data[0].url);

`/images/edits` takes up to four reference images (PNG, JPEG or WebP, under 25 MB each) and does not support `mask`: sending one returns `400`.

Images need inference membership, `403` otherwise, and they run on their own budget: 20 requests per minute and 100 per month, which does not touch your token quota.
Images need inference membership, `403` otherwise, and they run on their own budget, which does not touch your token quota and is not your key's either: image generation does not go through the shared inference API at all. One request per second with a burst of 3, and 100 requests per calendar month. A request asking for several images still costs one.

## tool: web search

**Deprecated.** Web search is being retired, through this endpoint and through the [MCP server](/docs/mcp) alike. It still works today and a removal date will be announced before it stops, but do not build anything new on it.

authenticated web search for agents — `POST /v1/search`

### curl
Expand Down
2 changes: 1 addition & 1 deletion src/content/docs/gentle-ai.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -131,5 +131,5 @@ It is worth running `sync` after every `upgrade`: the first updates the program,
## Next steps

- [Set up your agent](/docs/agent-setup): connect your tool to the cluster first.
- [MCP server](/docs/mcp): add NaN's web search to your agent as well.
- [MCP server](/docs/mcp): add NaN's web search to your agent as well. **Deprecated**, being retired along with web search.
- [Choose your model](/docs/choose-a-model): which model to ask for each task.
Loading
Loading