Repository navigation
Docs: migrar la referencia de API a Scalar, como en helmcode.com #16
Description
Contexto
La referencia de API de nan.builders está escrita a mano (src/content/docs/api.mdx, 1148 líneas), así que se desincroniza del backend cada vez que cambia un endpoint o un modelo. En helmcode.com ya resolvimos esto con Scalar: referencia interactiva generada desde un spec OpenAPI, con tema propio y "try it" incluido. El spike lo dejó claro desde el principio: nan.builders/docs/api era el "antes" que estábamos mejorando, y el mismo enfoque se podía portar a nan después. Esto es ese después.
Objetivo: llevar la referencia de API de nan.builders a Scalar, con el mismo planteamiento y look que en helmcode.com.
Lo que ya existe en helmcode.com (repo cms, en main)
No es un spike pendiente de mergear, ya está en main y es lo que se puede portar directamente:
| Pieza | Ruta en cms |
Qué hace |
|---|---|---|
| Dependencia | package.json |
@scalar/api-reference ^1.62.4 |
| Componente | src/components/docs/ApiReference.astro |
Monta Scalar en cliente con createApiReference(), shell propio, EN/ES por prop lang |
| Rutas | src/pages/docs/api.astro y src/pages/es/docs/api.astro |
Dos líneas cada una, export const prerender = false |
| Tema | src/styles/scalar-theme.css |
Paleta oscura estilo Supabase + acento de marca, oculta Ask AI y "Generate MCP", mantiene la atribución "Powered by Scalar" |
| Spec | public/openapi.json |
OpenAPI 3.1 curado a mano, 2587 líneas, 11 endpoints + 19 schemas reutilizables, branded a api.helmcode.com/v1 |
| Extras | src/components/docs/ApiAssistant.astro, CopyPageButton.astro, src/pages/api/docs-assistant.ts |
Construidos y probados, hoy PARKED (comentados en el componente) |
Documentación del proceso y de las alternativas evaluadas: SPIKE-scalar-api-reference.md en cms (branch spike/scalar-api-reference). Resumen de la decisión: Scalar es MIT y self-hosted, solo el SaaS es de pago y no lo usamos. Se descartó Redoc (try-it solo de pago) y Zudoku (no se embebe bien); Stoplight Elements queda como alternativa si algún día hace falta.
Estado actual en este repo
- Docs en content collection:
src/content/docs/(intro,getting-started,api.mdx,models.mdx,agents,apps,examples), servidos porsrc/pages/docs/[...slug].astroconsrc/layouts/Docs.astro. - Componentes propios de docs:
Callout,CodeBlock,EndpointGrid,FieldList,LimitationsCard,ModelCard,RateLimits. - Los docs alimentan dos endpoints derivados:
src/pages/api/docs/[slug].md.tsysrc/pages/api/docs/manifest.json.ts, víasrc/lib/mdxToText.ts, con tests (docsApi.test.ts,mdxToText.test.ts,canonicalParity.test.ts,docsSlugRoute.test.ts,docsManifestRoute.test.ts) y fixtures por componente ensrc/lib/__fixtures__/. - Mismo stack que
cms: Astro 6, Cloudflare Workers, Tailwind 4, i18n conastro-i18n(i18n/en.json,i18n/es.json), tokens ensrc/styles/tokens.css.
Decisiones a confirmar antes de implementar
- ¿Scalar sustituye a
api.mdxo convive con él? Propuesta: Scalar se queda con la referencia de endpoints y las guías escritas a mano (getting-started,examples,agents,apps,models) siguen como están. Es lo que hicimos en helmcode. - Los endpoints derivados de los docs. Si
api.mdxsale de la colección,api/docs/[slug].md.tsyapi/docs/manifest.json.tspierden la referencia de API en su salida, que es justamente el contenido más útil para pegarle a un LLM. Hay que decidir si el manifest pasa a incluir el spec (o un Markdown generado desde él) y actualizar los tests, que hoy cubren ese contrato. - Fuente del spec. No hay OpenAPI propio en ningún repo:
nan-cloud-apies Go/chi con rutas a mano y no genera swagger. Lo que hay es el spec crudo de LiteLLM enhttps://console.nan.builders/openapi.json(OpenAPI 3.1, 533 paths,servers: [], CORS abierto), que incluye toda la superficie de administración. Opciones: (a) copiarpublic/openapi.jsondecmsy re-brandearlo a nan, (b) build step que baje el spec de LiteLLM, filtre a la superficie pública y reescribainfo/servers. Propuesta: (a) para salir rápido, con (b) como seguimiento aparte. Ojo con (a): ese spec se hizo por ingeniería inversa de los propios docs de nan, así que hay que validarlo contra el backend. - Diferencias de catálogo entre nan y helmcode. El spec de
cmsse escribió con la superficie de nan pero la validación se hizo contra helmcode, que no tiene todos los modelos. Hay que revisarglm5.2,mimo-v2.5yflux-2-kleincontra el/v1/modelsreal de nan antes de publicar. - i18n. En helmcode el contenido del spec se queda en inglés (convención de referencias de API) y solo se localizan el shell y las etiquetas de UI de Scalar vía su opción
locale. Hay que decidir si en nan hacemos lo mismo y si hace falta una ruta/es/docs/api, porque hoy los docs de nan no tienen versión en español aunque el schema de la colección tenga campolocale. - Indexación. En
cmsla página va connoindex, nofollowporque no graduó a la navegación. En nan la referencia es pública y ya se indexa, así que debería ir sinnoindexy entrar ensrc/pages/sitemap.xml.ts. - Extras. ¿Portamos
CopyPageButton(exporta la referencia como Markdown pegable en un LLM, encaja bien con el manifest que nan ya tiene) y elApiAssistant? Propuesta: portar solo el botón de copiar; el asistente está parked en helmcode y arrastra proxy, secreto y rate limiting. - Tema. Reusar
scalar-theme.cssdecms, pero mapeándolo a los tokens de nan (src/styles/tokens.css). En helmcode ese cableado a tokens quedó pendiente, así que aquí conviene hacerlo bien desde el principio en lugar de heredar los hex sueltos.
Subtareas
- Confirmar las 8 decisiones de arriba
- Añadir
@scalar/api-reference(no@scalar/astro, ver gotchas) -
public/openapi.jsonpara nan: superficie pública,infoyserversapuntando a la API de nan - Validar endpoints, schemas y nombres de modelo contra el backend real de nan
- Portar
ApiReference.astroadaptado al shell y la navegación de docs de nan - Ruta
/docs/apicon Scalar (y/es/docs/apisi aplica la decisión 5) -
scalar-theme.cssmapeado asrc/styles/tokens.css - Resolver qué pasa con
api.mdxy con los endpoints/tests derivados de los docs - Enlazar la referencia desde la navegación de
Docs.astroy desde el sitemap - Verificar el build de producción en Cloudflare Workers, no solo
astro dev - Comprobar "try it" contra la API real con una key de prueba
Gotchas ya conocidos (del spike, para no repetirlos)
- Usar
@scalar/api-reference, no@scalar/astro. El paquete de Astro declara peerastro@^4 || ^5y este repo va con Astro 6, así que no instala. Con el paquete agnóstico se monta llamando acreateApiReference(). - Hay que importar
@scalar/api-reference/style.cssa mano. Bundleado con Vite,createApiReference()no inyecta su CSS y la referencia sale sin estilos (SVGs gigantes, nav como lista de bullets). - Modo oscuro:
forceDarkModeState: 'dark'tipadoas const. - Sidebar: quitar cualquier
height: 100vhdel contenedor, atrapa el scroll de Scalar. - View transitions: si se usa
ClientRouter, re-montar enastro:before-swap/astro:page-load, si no la referencia solo aparece tras refrescar. - El gotcha de
npm install --ignore-scriptsdel spike es específico decms(build nativo debetter-sqlite3), aquí no aplica.
Criterios de aceptación
/docs/apisirve la referencia con Scalar, con el tema de nan y el "try it" funcionando contra la API real.- La referencia sale del spec, no de Markdown escrito a mano, de modo que actualizar un endpoint es actualizar el spec.
- Ningún modelo ni endpoint documentado que no exista de verdad en el backend de nan.
- Los endpoints
api/docs/manifest.jsonyapi/docs/[slug].mdsiguen coherentes, con sus tests en verde. - El build de producción en Workers incluye Scalar y la página carga sin flash negro.
Activity