JUANCHI
InicioCVBlogLabContacto
Saltar al contenido
JUANCHI
InicioCVBlogLabContacto
El mes que Anthropic no respondió: billing, confianza y el costo oculto de depender de APIs de IA
Volver al blog
TypeScriptanthropiciaAPIsvendor lock-inproducciónarquitecturabilling

El mes que Anthropic no respondió: billing, confianza y el costo oculto de depender de APIs de IA

Un thread de HN con 365 puntos me dio permiso de decir lo que venía evitando: construir sobre APIs de IA tiene un riesgo de soporte y continuidad que nadie discute honestamente. Yo lo viví en carne propia un viernes a las 11pm.

9 de abril de 202610 min de lectura3 visualizacionesVer en Dev.to

Contenido

Contenido

Hay una creencia instalada en la comunidad dev sobre las APIs de IA que está, con todo respeto, bastante incompleta: que son infraestructura confiable. Que podés construir sobre ellas como construís sobre AWS S3 o Stripe. Que si algo sale mal, hay alguien del otro lado que te responde.

No necesariamente.

Un thread de Hacker News con 365 puntos —uno de esos que aparece un martes a la mañana y te arruina la semana— documentó en detalle lo que le pasó a alguien con Anthropic: un mes de tickets sin respuesta, billing que seguía corriendo, y un silencio institucional que no se condice con lo que cuesta usar esas APIs. Leí ese thread tres veces. No porque me sorprendiera. Sino porque yo ya había vivido algo parecido.

Anthropic billing support AI vendor lock-in: el problema que nadie nombra

Viernes. 11pm. Tenía un cliente con un sistema en producción que usaba una API de IA para procesar formularios —nada crítico en teoría, pero crítico en la práctica porque era el flujo principal del negocio. El sistema dejó de funcionar. Sin error explícito en los logs. Sin notificación por mail. Sin banner en el status page.

Silencio.

// Lo que veía en los logs era esto:
// { status: 200, body: { error: null, result: null } }
// Respuesta 200 con body vacío. Elegante manera de morir.

async function procesarFormulario(datos: FormData) {
  const respuesta = await clienteIA.completar({
    modelo: 'el-modelo-de-turno',
    prompt: construirPrompt(datos),
  });

  // El problema: no había validación de respuesta vacía
  // Asumí que si no había error, había resultado
  // Asumí mal
  return respuesta.resultado; // undefined en silencio
}

Passé dos horas debuggeando antes de darme cuenta de que el problema no era mi código. Era la API. Habían hecho un cambio en el formato de respuesta —sin versioning explícito, sin aviso— y mi código simplemente recibía nulls con status 200.

Abrí un ticket de soporte. Esperé.

La respuesta llegó 72 horas después. Un viernes a las 11pm no es un horario donde las empresas de IA tienen guardia. Esto no es una crítica a las personas —es una crítica al modelo de soporte que se vende implícitamente cuando cobrás por llamada de API a precios que no son baratos.

El problema técnico real: construir sobre arena con fundamentos de granito

El issue no es que las APIs fallen. Todo falla. El issue es la asimetría de información y la asimetría de poder.

Cuando construís sobre Stripe, tenés:

  • Versionado explícito de API (/v1/, /v2/)
  • Deprecation notices con meses de anticipación
  • Webhooks con firma verificable
  • SLAs documentados
  • Soporte con tiempos de respuesta garantizados según tier

Cuando construís sobre APIs de IA hoy, tenás en el mejor caso:

  • Versionado de modelo (que no es lo mismo que versionado de API)
  • Status pages que a veces reflejan la realidad
  • Rate limits que cambian sin mucho aviso
  • Billing que corre aunque el servicio esté degradado
  • Soporte cuya calidad depende literalmente de cuánto gastás por mes
// Lo que deberías hacer siempre — y que yo no hice esa noche:

interface RespuestaIA {
  resultado: string | null;
  metadata: Record<string, unknown>;
}

function validarRespuestaIA(respuesta: unknown): RespuestaIA {
  // Nunca confíes en el shape de respuesta de una API externa
  // Especialmente de IA donde el schema evoluciona rápido
  if (!respuesta || typeof respuesta !== 'object') {
    throw new Error('Respuesta inválida: no es objeto');
  }
  
  const r = respuesta as Record<string, unknown>;
  
  if (!r.resultado && r.resultado !== '') {
    // Loguear con contexto suficiente para debuggear a las 11pm
    console.error('[IA] Respuesta vacía inesperada', {
      timestamp: new Date().toISOString(),
      shape: Object.keys(r),
    });
    throw new Error('Respuesta de IA sin resultado');
  }
  
  return r as RespuestaIA;
}

// Circuit breaker básico — no es opcional, es infraestructura
class CircuitBreakerIA {
  private fallos = 0;
  private readonly umbralFallos = 3;
  private estado: 'cerrado' | 'abierto' | 'semiabierto' = 'cerrado';
  private ultimoFallo?: Date;

  async ejecutar<T>(fn: () => Promise<T>): Promise<T> {
    if (this.estado === 'abierto') {
      const tiempoEspera = 30_000; // 30 segundos
      const tiempoTranscurrido = Date.now() - (this.ultimoFallo?.getTime() ?? 0);
      
      if (tiempoTranscurrido < tiempoEspera) {
        // Fallback — no dejés al usuario colgado
        throw new Error('Servicio de IA temporalmente no disponible');
      }
      
      this.estado = 'semiabierto';
    }

    try {
      const resultado = await fn();
      this.resetear();
      return resultado;
    } catch (error) {
      this.registrarFallo();
      throw error;
    }
  }

  private registrarFallo() {
    this.fallos++;
    this.ultimoFallo = new Date();
    if (this.fallos >= this.umbralFallos) {
      this.estado = 'abierto';
      console.error('[CircuitBreaker] Estado: ABIERTO — demasiados fallos consecutivos');
    }
  }

  private resetear() {
    this.fallos = 0;
    this.estado = 'cerrado';
  }
}

Esto no es sofisticado. Es lo mínimo. Es lo que deberías tener antes de mandar a producción cualquier integración con una API de terceros. Con APIs de IA es más importante todavía porque el modo de fallo silencioso —respuesta vacía con 200— es más común que en APIs más maduras.

Hablo de esto también en el post sobre vibe-coding vs stress-coding: hay una diferencia enorme entre usar IA como herramienta y depender de IA como infraestructura. El primero es potenciarte. El segundo es un contrato que nadie firmó explícitamente.

Los errores que cometés cuando confiás demasiado rápido

1. No modelar el fallback desde el día uno.

Cuando agregás una integración de IA, el happy path es fácil. El 99% del tiempo funciona. El problema es el 1% que ocurre un viernes a las 11pm. ¿Qué hace tu app si la API no responde? ¿Si responde vacío? ¿Si responde con latencia de 30 segundos? Si no tenés respuesta para esas tres preguntas antes de hacer el deploy, no estás listo.

2. Confundir el status page con la realidad.

Los status pages de los vendors de IA son... optimistas. He visto degradación real con status page en verde. Implementá tu propio health check:

// Health check real — no confíes solo en el status page del vendor
async function verificarSaludAPI(): Promise<boolean> {
  try {
    const inicio = Date.now();
    
    // Llamada de prueba con prompt mínimo y timeout estricto
    const respuesta = await Promise.race([
      clienteIA.completar({
        modelo: 'tu-modelo',
        prompt: 'Respondé solo "ok"',
        maxTokens: 5,
      }),
      new Promise((_, reject) =>
        setTimeout(() => reject(new Error('Timeout')), 5_000)
      ),
    ]);

    const latencia = Date.now() - inicio;
    
    // Loguear latencia — los cambios de latencia son señal temprana de problemas
    console.info('[HealthCheck] Latencia API IA:', latencia, 'ms');
    
    return Boolean(respuesta);
  } catch {
    return false;
  }
}

3. No trackear el costo en tiempo real.

El billing de las APIs de IA es por token, y los tokens se acumulan. Si tu app tiene un bug que hace llamadas redundantes, lo descubrís en la factura del mes. Para cuando abrís el ticket, ya gastaste. Implementá alertas de costo antes de que el problema sea billing de varios días sin soporte.

4. Apostar todo a un solo proveedor.

Esto conecta con el trabajo que hago pensando en orquestación. Cuando leí sobre Scion, el testbed de Google para agentes, lo primero que pensé no fue en las capacidades técnicas sino en la pregunta de portabilidad: ¿si cambio de proveedor, cuánto de mi lógica de negocio tengo que reescribir?

La respuesta honesta en la mayoría de los casos: demasiado.

// Abstraer el proveedor desde el principio — lo que debería haber hecho
interface ClienteIA {
  completar(opciones: OpcionesCompletado): Promise<RespuestaIA>;
  calcularCosto(tokens: number): number;
}

// Implementación intercambiable
class ClienteAnthropic implements ClienteIA {
  async completar(opciones: OpcionesCompletado): Promise<RespuestaIA> {
    // implementación específica
  }
  calcularCosto(tokens: number): number { /* ... */ }
}

class ClienteOpenAI implements ClienteIA {
  async completar(opciones: OpcionesCompletado): Promise<RespuestaIA> {
    // implementación específica
  }
  calcularCosto(tokens: number): number { /* ... */ }
}

// Tu lógica de negocio no sabe quién está atrás
class ServicioFormularios {
  constructor(private readonly ia: ClienteIA) {}
  
  async procesar(datos: FormData) {
    // Esto funciona con cualquier proveedor
    return this.ia.completar({ prompt: construirPrompt(datos) });
  }
}

Es el mismo principio que aplico cuando construyo extensiones de VS Code: la abstracción no es complejidad gratuita, es lo que te permite cambiar las partes que cambian sin romper las que no cambian.

FAQ: Lo que la gente pregunta cuando se quema con APIs de IA

¿Anthropic tiene SLA documentado para sus APIs?

No públicamente, al menos no en los términos en que lo ofrecen otros proveedores de infraestructura como AWS o GCP. Hay compromisos de uptime implícitos pero los términos de soporte dependen del tier de gasto. Si no sabés cuánto tenés que gastar para tener soporte prioritario, probablemente no lo tenés.

¿Es diferente con OpenAI o Google AI?

En general, el problema de soporte es transversal a los vendors de IA. Los más grandes tienen mejor infraestructura de status y más capacidad de soporte, pero la asimetría de poder sigue existiendo: ellos deciden cuándo cambian el modelo, cuándo deprecan una versión, cuándo ajustan los precios. Vos aceptás cuando firmás los ToS.

¿Cómo sabés si tu integración de IA está fallando silenciosamente en producción?

Si no tenés métricas explícitas de: (1) tasa de respuestas vacías, (2) latencia p95, y (3) tasa de errores diferenciada por tipo, no lo sabés. El modo de fallo silencioso —200 con body vacío— no dispara las alertas de error tradicionales. Necesitás validación de schema en la respuesta y métricas de negocio (¿cuántos formularios se procesaron esta hora vs la hora anterior?) para detectarlo.

¿Vale la pena seguir construyendo sobre estas APIs dado el riesgo?

Sí, pero con los ojos abiertos. La pregunta no es si usar APIs de IA sino cómo. La abstracción del proveedor, el circuit breaker, el fallback explícito y el health check propio no son opcionales si estás en producción. Son el costo de entrada real que nadie te dice cuando leés la documentación. Igual que con las métricas de accesibilidad: el número que te muestra el tool y la realidad del usuario son cosas distintas.

¿Cómo estructuro el fallback para no degradar la experiencia de usuario?

Depende del caso de uso, pero el principio es: el usuario nunca debería ver el error interno. Si la IA no responde, ¿podés procesar con una lógica más simple? ¿Podés encolar y procesar después? ¿Podés mostrar un mensaje honesto de "estamos procesando, te avisamos"? Cualquiera de esas opciones es mejor que un 500 genérico o, peor, un resultado silenciosamente vacío.

¿El vendor lock-in de IA es diferente al de otras APIs?

Sí, y en el peor sentido. El lock-in de AWS es técnico pero predecible —migrás los datos y reescribís la infraestructura. El lock-in de IA incluye además el comportamiento del modelo: el mismo prompt puede dar resultados distintos entre proveedores, y tu lógica de negocio a veces está construida alrededor de las idiosincrasias de un modelo específico. Es un lock-in de comportamiento, no solo de API.

Lo que haría diferente (y lo que vos deberías hacer antes del próximo viernes)

Aprobé Análisis II en el cuarto intento. Laburé full time mientras cursaba en la UBA. Llegué a rendir con el traje puesto directo del trabajo. Lo que aprendí de eso no fue solo matemática: aprendí que la cantidad de intentos que necesitás para aprobar algo no dice nada sobre si sos capaz. Dice cuántas veces estás dispuesto a volver.

Con las APIs de IA estamos en el primer intento colectivo. El ecosistema es joven, los contratos de soporte son inmaduros, y los modos de fallo están todavía siendo descubiertos en producción —literalmente en producción de otras personas, un viernes a las 11pm.

Eso no es razón para no construir. Es razón para construir con más cuidado.

Lo que haría diferente:

  1. Abstracción del proveedor desde el commit uno — no cuando ya tenés 40 llamadas directas al SDK de Anthropic
  2. Circuit breaker y health check propio — el status page del vendor es su versión de la historia, no la tuya
  3. Validación estricta de schema en cada respuesta — especialmente si el proveedor no te da garantías de versionado
  4. Alertas de costo en tiempo real — antes de que el billing corra por días sin soporte
  5. Fallback explícito documentado — si la IA no responde, ¿qué hace el sistema? Si la respuesta es "no sé", no estás listo para producción

Por cierto: la misma atención que ponés en el comportamiento de una API externa la deberías poner en las herramientas que usás día a día. Cuando construí mi extensión de VS Code para certificados SSL, lo hice exactamente porque no quería depender de que alguien más maintuviera una herramienta crítica en mi workflow. El principio es el mismo.

El thread de HN con 365 puntos no es un caso aislado. Es un síntoma. El costo oculto de las APIs de IA no es solo el token price — es el costo de confianza que todavía no terminamos de calcular.

Si estás construyendo algo que importa sobre una de estas APIs, mandame un mensaje. Me interesa saber cómo lo estás resolviendo.

Compartir:

Comentarios (0)

Deja un comentario

No hay comentarios aún. ¡Sé el primero en opinar!

Artículos Relacionados

Nunca más tipees openssl x509 -text -noout: creé una extensión de VS Code para ver certificados SSL/TLS
TypeScriptseguridad

Nunca más tipees openssl x509 -text -noout: creé una extensión de VS Code para ver certificados SSL/TLS

Harté de buscar el comando exacto de openssl cada vez que necesitaba inspeccionar un .pem o un .pfx. Creé X509 Certificate Utility para VS Code y cambió mi flujo de trabajo para siempre.

9 min38
Harté de esperar que alguien maintuviera la extensión de HAProxy para VS Code — así que la hice yo
TypeScripthaproxy

Harté de esperar que alguien maintuviera la extensión de HAProxy para VS Code — así que la hice yo

La única extensión de HAProxy para VS Code no la tocaban desde 2019. Todos los días la usaba en el trabajo y en mi homelab, y todos los días me tragaba errores de sintaxis sin ningún feedback. Un día dije basta y construí gmm-haproxy-vscode: LSP propio, autocompletado por sección, validación multi-versión y go-to-definition.

10 min53
Vibe-coding vs stress-coding: cómo trabajo yo realmente con IA en proyectos que importan
OpiniónTypeScriptnextjs

Vibe-coding vs stress-coding: cómo trabajo yo realmente con IA en proyectos que importan

El vibe-coding es fantástico hasta que el proyecto tiene usuarios reales. Acá la diferencia concreta entre cómo uso IA para experimentar y cómo la uso cuando hay producción de por medio.

9 min75

Categorías

Experimentos6Historia3Opinión4Reflexiones2Tecnología5Tutoriales4

Etiquetas

#nextjs#TypeScript#React#Full Stack#seguridad#devops#devtools#linux#ia#node.js#desarrollo web#LLM#server-components#javascript#productividad#frontend#WebGPU#postgresql#lighthouse#AI#anthropic#Tutorial#historia programador argentino#vscode#claude code#Gemma#TLS#2025#ebpf#certificados#railway#google-deepmind#developer tools#ai-coding#yarn#autobiografía tech#npm#desarrollo#IA local#monorepo#app-router#web-performance#optimizacion#análisis de código#ci-cd#GPU#producción#lsp#herramientas de desarrollo#networking#sql#scion#linux kernel#homelab#bajo-nivel#Portfolio#Performance#Programación#edge inferencia#axe#dynamic-linking#nativo digital#web-development#reflexión técnica#strace#elf#agentes-ia#freestyle#backend#Patrones de diseño#WebAssembly#sbom#AI infraestructura#infraestructura#machine learning#Edge#Browser#WebLLM#post-quantum cryptography#inferencia en browser#Inferencia Local#workflow#deep learning#pnpm#postmortem#bun#desarrollo-software#sandboxes#node-forge#stack tecnologico 2025#arquitectura#accesibilidad#full precision training#firewall#LLMs#criptografía#historia de commits#git#aria#tooling#supply-chain#ssl#coding-agents#drizzle orm#multi-agente#sistemas#JWT#vendor lock-in#pki#dependencias#análisis de datos#APIs#ai tools#produccion#tailwind#railway deploy#x509#inteligencia-artificial#opensnitch#repomix#orquestacion#github#codebase visualization#wcag#billing#seguridad web#entrenamiento de modelos#code review#quantum computing#package manager#pgit#docker-compose#MegaTrain#vibe-coding#haproxy#docker#Reflexiones#Stack#Experimentos#Herramientas#Next.js#WebDev#Best Practices#Historia#Opinión#Carrera#Web Vitals

Más Leídos

  • 01

    pnpm vs npm vs yarn vs bun: la comparativa definitiva que nadie te va a dar en 2025

    167 views
  • 02

    Next.js App Router: la guía que me hubiera gustado tener cuando migré de Pages Router

    155 views
  • 03

    TypeScript: los patrones que realmente uso todos los días

    154 views
  • 04

    De DOS a Cloud: mi viaje de 33 años con la tecnología — desde una Amiga en 1994 hasta deployar en Railway con Next.js

    152 views
  • 05

    Docker para desarrolladores Node.js: de cero a producción sin morir en el intento

    151 views

Newsletter

Recibe los últimos artículos directamente en tu inbox.

Categorías

Experimentos6Historia3Opinión4Reflexiones2Tecnología5Tutoriales4

Etiquetas

#nextjs#TypeScript#React#Full Stack#seguridad#devops#devtools#linux#ia#node.js#desarrollo web#LLM#server-components#javascript#productividad#frontend#WebGPU#postgresql#lighthouse#AI#anthropic#Tutorial#historia programador argentino#vscode#claude code#Gemma#TLS#2025#ebpf#certificados#railway#google-deepmind#developer tools#ai-coding#yarn#autobiografía tech#npm#desarrollo#IA local#monorepo#app-router#web-performance#optimizacion#análisis de código#ci-cd#GPU#producción#lsp#herramientas de desarrollo#networking#sql#scion#linux kernel#homelab#bajo-nivel#Portfolio#Performance#Programación#edge inferencia#axe#dynamic-linking#nativo digital#web-development#reflexión técnica#strace#elf#agentes-ia#freestyle#backend#Patrones de diseño#WebAssembly#sbom#AI infraestructura#infraestructura#machine learning#Edge#Browser#WebLLM#post-quantum cryptography#inferencia en browser#Inferencia Local#workflow#deep learning#pnpm#postmortem#bun#desarrollo-software#sandboxes#node-forge#stack tecnologico 2025#arquitectura#accesibilidad#full precision training#firewall#LLMs#criptografía#historia de commits#git#aria#tooling#supply-chain#ssl#coding-agents#drizzle orm#multi-agente#sistemas#JWT#vendor lock-in#pki#dependencias#análisis de datos#APIs#ai tools#produccion#tailwind#railway deploy#x509#inteligencia-artificial#opensnitch#repomix#orquestacion#github#codebase visualization#wcag#billing#seguridad web#entrenamiento de modelos#code review#quantum computing#package manager#pgit#docker-compose#MegaTrain#vibe-coding#haproxy#docker#Reflexiones#Stack#Experimentos#Herramientas#Next.js#WebDev#Best Practices#Historia#Opinión#Carrera#Web Vitals

Más Leídos

  • 01

    pnpm vs npm vs yarn vs bun: la comparativa definitiva que nadie te va a dar en 2025

    167 views
  • 02

    Next.js App Router: la guía que me hubiera gustado tener cuando migré de Pages Router

    155 views
  • 03

    TypeScript: los patrones que realmente uso todos los días

    154 views
  • 04

    De DOS a Cloud: mi viaje de 33 años con la tecnología — desde una Amiga en 1994 hasta deployar en Railway con Next.js

    152 views
  • 05

    Docker para desarrolladores Node.js: de cero a producción sin morir en el intento

    151 views

Newsletter

Recibe los últimos artículos directamente en tu inbox.