Ejercicios — Guía Práctica de Claude
Graduados por nivel: básico (lo mínimo para aprobar el capítulo), intermedio (lo que usa alguien que trabaja con la herramienta) y retador (lo que distingue al que entiende del que repite). Los de costos usan la tabla de precios del cap. 1: Fable 5 ($10/$50), Opus 4.8 ($5/$25), Sonnet 4.6 ($3/$15), Haiku 4.5 ($1/$5) por millón de tokens entrada/salida.
Cap. 1 — Conocé a Claude
1.1 — La familia (básico)
Ordená los cuatro modelos de la familia Claude de más barato a más caro, con su ID de API exacto.
✅ Solución
- Claude Haiku 4.5 —
claude-haiku-4-5($1/$5) - Claude Sonnet 4.6 —
claude-sonnet-4-6($3/$15) - Claude Opus 4.8 —
claude-opus-4-8($5/$25) - Claude Fable 5 —
claude-fable-5($10/$50)
Los IDs van exactos, sin sufijos de fecha.
1.2 — Tokens y palabras (básico)
Con la regla 1 palabra ≈ 1.3 tokens en español: (a) ¿cuántos tokens tiene un ensayo de 2,000 palabras? (b) ¿cuántas palabras caben aproximadamente en la ventana de 200K de Haiku 4.5?
✅ Solución
- (a) 2,000 × 1.3 = ~2,600 tokens.
- (b) 200,000 / 1.3 ≈ ~154,000 palabras — una novela entera y sobra.
1.3 — IA constitucional (básico)
¿Qué significa, a nivel conceptual, que Claude se entrene con "IA constitucional"? Mencioná las dos ideas clave.
✅ Solución
(1) El comportamiento del modelo se guía por principios explícitos y escritos (una "constitución": ser útil, honesto, evitar daño) en lugar de depender solo de millones de calificaciones humanas implícitas. (2) Durante el entrenamiento, el modelo critica y revisa sus propias respuestas contra esos principios, lo que escala mejor que la supervisión humana directa. Efecto visible: un asistente que admite incertidumbre y explica sus negativas.
1.4 — Corte de conocimiento (básico)
Le preguntás a Claude (sin búsqueda web) quién ganó el torneo de fútbol del mes pasado. Da una respuesta segura y detallada. ¿Por qué NO deberías creerle, aunque suene convincente?
✅ Solución
El modelo tiene un corte de conocimiento: no sabe nada posterior a su fecha de entrenamiento. Ante un evento reciente, o bien dice que no sabe, o bien alucina una respuesta plausible — y el tono seguro no se correlaciona con la exactitud. Para eventos recientes: búsqueda web activada o una fuente directa.
1.5 — Elegir modelo (intermedio)
Asigná modelo a cada tarea y justificá: (a) extraer fecha y monto de 20,000 facturas escaneadas; (b) chat de acompañamiento para practicar inglés conversacional; (c) revisar el razonamiento estadístico de tu tesis; (d) un agente que audite un sistema completo durante toda una noche.
✅ Solución
- (a) Haiku 4.5 — extracción simple y masiva; el volumen hace crítico el precio.
- (b) Sonnet 4.6 (o Haiku) — conversación general; el balance velocidad/precio importa más que la potencia máxima.
- (c) Opus 4.8 — análisis serio de alto valor, el default para trabajo importante.
- (d) Fable 5 — trabajo agéntico de larga duración, su especialidad declarada.
1.6 — La superficie correcta (intermedio)
Elegí superficie (app, Claude Code, API) para: (a) practicar para tu examen oral de Redes; (b) un cron job que etiquete los issues nuevos de tu repo cada hora; (c) migrar 30 archivos de Python 2 a Python 3; (d) que tu mamá redacte mejor los anuncios de su negocio.
✅ Solución
- (a) App (claude.ai) — conversación de estudio, con un Proyecto de la materia.
- (b) API — programático, repetitivo, sin humano en el medio.
- (c) Claude Code — multi-archivo sobre un repo, con tests como verificación.
- (d) App — interfaz amigable, cero instalación, cero código.
1.7 — Costo de un request (intermedio)
Un request a Sonnet 4.6 usa 12,000 tokens de entrada y 2,500 de salida. Calculá el costo.
✅ Solución
Entrada: 0.012M × $3 = $0.036. Salida: 0.0025M × $15 = $0.0375. Total: $0.0735 — nota que la salida costó más que la entrada con 5 veces menos tokens.
1.8 — ¿Cabe en la ventana? (intermedio)
Querés analizar de una sola vez: 3 libros de texto (~150,000 palabras cada uno) + tus apuntes (~20,000 palabras). (a) ¿Cuántos tokens son? (b) ¿Cabe en Opus 4.8? (c) ¿En Haiku 4.5?
✅ Solución
- (a) (3 × 150,000 + 20,000) × 1.3 = 470,000 × 1.3 = ~611,000 tokens.
- (b) Sí: 611K < 1M (ventana de Opus 4.8), queda ~39% libre para la conversación.
- (c) No: 611K > 200K (ventana de Haiku). Habría que partir el material o usar otro modelo.
1.9 — Verificar o no verificar (intermedio)
¿Cuáles de estas respuestas de Claude exigen verificación externa antes de usarlas? (a) la explicación del concepto de recursión; (b) "el artículo 144 de la Constitución dice..."; (c) un poema para el cumpleaños de tu abuela; (d) "la librería pandas tiene una función read_excel()"; (e) las estadísticas de deserción universitaria "según un estudio de 2023".
✅ Solución
- (a) No crítica — concepto estable; un error sería raro y lo detectarías al estudiar.
- (b) SÍ, siempre — textos legales citados: candidato clásico a alucinación. Buscá el texto oficial.
- (c) No — no hay hechos verificables en juego.
- (d) Verificación barata — probablemente cierto, pero probarlo toma 10 segundos en tu terminal; las funciones inventadas existen.
- (e) SÍ, siempre — estadística + cita de estudio = verificá que el estudio exista y diga eso.
1.10 — El precio de equivocarse de modelo (retador)
Tu app de resúmenes procesa 500 documentos diarios (entrada 2,000 tokens, salida 300 tokens cada uno). El becario la configuró con Fable 5; tu evaluación muestra que Haiku 4.5 rinde igual para esta tarea. ¿Cuánta plata se ahorra AL AÑO con el cambio?
✅ Solución
Por día: entrada 500 × 2,000 = 1M tokens; salida 500 × 300 = 0.15M.
- Fable 5: 1 × $10 + 0.15 × $50 = $10 + $7.50 = $17.50/día.
- Haiku 4.5: 1 × $1 + 0.15 × $5 = $1 + $0.75 = $1.75/día.
Ahorro: $15.75/día × 365 = $5,748.75 al año — por cambiar una línea de código. La elección de modelo es la decisión de costos más importante de cualquier app.
1.11 — Stateless en una frase (retador)
Tu compañero dice: "la ventana de 1M de tokens significa que Claude se acuerda de todas mis conversaciones del mes". Corregilo con precisión: ¿qué confunde y cuál es la realidad?
✅ Solución
Confunde ventana de contexto (cuánto cabe en UNA conversación a la vez) con memoria persistente (que no existe). La realidad: cada conversación arranca de cero; dentro de una conversación, el modelo "ve" lo que está en el contexto (hasta 1M tokens), y al cerrarla, nada persiste. Las excepciones son funciones explícitas de la app — como los Proyectos, que persisten instrucciones y archivos (no conversaciones) — o el historial que TU código reenvía cuando usás la API.
1.12 — Tu inventario (retador)
Hacé el ejercicio completo de la sección 1.7: listá tus 5-8 tareas semanales más pesadas y asignales superficie + modelo. Para al menos una, justificá por qué NO elegiste la opción más obvia.
✅ Solución
Respuesta personal. Criterios de autoevaluación: (1) cada tarea tiene superficie asignada por el criterio "quién consume el resultado" (vos → app; repo → Claude Code; programa → API); (2) los modelos arrancan por el más barato plausible; (3) la justificación del "no obvio" muestra trade-offs reales — p. ej. "para resumir lecturas la opción obvia era la API, pero elegí Proyectos en claude.ai porque quiero repreguntar interactivamente, no procesar en lote".
Cap. 2 — claude.ai a fondo
2.1 — Los cuatro componentes (básico)
Nombrá los cuatro componentes de un prompt efectivo y da un ejemplo de cada uno en una sola frase de pedido.
✅ Solución
Contexto, tarea, formato, restricciones. Ejemplo: "Estoy en primer año y nunca programé [contexto]; explicame qué es un bucle for con un ejemplo en Python [tarea]; en menos de 200 palabras y con el código comentado [formato]; sin mencionar while todavía, no lo hemos visto [restricciones]."
2.2 — Proyecto vs conversación (básico)
¿Qué persiste entre conversaciones dentro de un Proyecto y qué NO persiste?
✅ Solución
Persisten: las instrucciones del Proyecto y los archivos cargados — todas las conversaciones nuevas arrancan con ese contexto. No persiste: el historial de cada conversación — cada chat dentro del Proyecto es independiente de los demás.
2.3 — ¿Qué es un artefacto? (básico)
Tu compañera pregunta qué es eso de los "artefactos". Explicáselo en dos frases y dale dos ejemplos útiles para estudiantes.
✅ Solución
Un artefacto es contenido sustancial (documento, código, diagrama, mini-app) que Claude genera en un panel separado del chat, donde podés verlo, iterarlo y exportarlo sin que se mezcle con la conversación. Ejemplos: un quiz interactivo de práctica para el parcial; un diagrama de los temas del ciclo conectados por dependencias.
2.4 — ¿Búsqueda web sí o no? (básico)
¿Activarías búsqueda web para: (a) "explicame el teorema de Pitágoras"; (b) "¿qué requisitos pide la beca FANTEL este año?"; (c) "¿qué dice el PDF que te subí sobre normalización?"; (d) "¿cuál es la última versión de Python y qué trae?"
✅ Solución
- (a) No — conocimiento estable y atemporal.
- (b) Sí — convocatorias cambian cada año; además querés la fuente oficial.
- (c) No — la fuente es tu PDF; la web solo metería ruido.
- (d) Sí — versiones de software cambian constantemente; posterior al corte de conocimiento.
2.5 — Las instrucciones socráticas (intermedio)
¿Por qué la plantilla de Proyecto de la sección 2.3 incluye "no me des la respuesta de una: guiame con preguntas primero"? ¿Qué evidencia o razonamiento pedagógico la respalda?
✅ Solución
Porque el objetivo del estudiante es aprender, no obtener respuestas. Si Claude resuelve todo de una, el estudiante consume soluciones sin construir la habilidad — y el examen lo rinde solo. El modo socrático fuerza práctica de recuperación y generación: intentar antes de recibir, que es de lo más respaldado en la investigación del aprendizaje. La respuesta completa sigue disponible — pero a pedido explícito, como decisión consciente.
2.6 — Anclar al documento (intermedio)
Subiste el PDF del curso y preguntaste algo, pero sospechás que Claude respondió de conocimiento general, no del PDF. (a) ¿Cómo lo detectás? (b) ¿Cómo formulás la pregunta para forzar el anclaje?
✅ Solución
- (a) Señales: la respuesta no usa la terminología/notación del PDF, no cita secciones, o incluye temas que el documento no toca. Prueba directa: "¿en qué sección del documento está eso?"
- (b) Fórmula de anclaje: "Según el documento que subí (citá la sección), ¿...? Si la respuesta no está en el documento, decime explícitamente 'no está en el material' antes de agregar conocimiento general."
2.7 — Flujo de informe, paso crítico (intermedio)
Del Flujo 2 (escribir un informe), ¿cuál es el único paso que NO se delega en Claude y por qué precisamente ese?
✅ Solución
El borrador lo escribís vos (paso 4). Razones: (1) escribir es donde ocurre el aprendizaje — organizar ideas propias construye comprensión que leer no construye; (2) integridad académica — un texto generado y entregado como propio es plagio en la mayoría de las políticas universitarias; (3) calidad — Claude revisa mejor un texto tuyo (estructura, claridad) de lo que vos podés verificar un texto suyo (¿inventó algo?). Claude entra antes (estructura, fuentes) y después (revisión por capas), no en el medio.
2.8 — CSV sin programar (intermedio)
Tenés un CSV con 500 respuestas de una encuesta sobre hábitos de estudio. Escribí la secuencia de 4 prompts que usarías en claude.ai para llegar de "archivo crudo" a "3 hallazgos con sus límites", sin escribir código.
✅ Solución
Una secuencia razonable:
- "Describí este dataset: variables, tipos, faltantes, valores raros o imposibles."
- "¿Qué problemas de calidad ves y cómo afectaría cada uno a las conclusiones?"
- "Calculá descriptivos de las variables clave y cruzá horas de estudio con rendimiento autorreportado. Generá un artefacto con los 3 gráficos más informativos."
- "Formulá los 3 hallazgos principales — y para cada uno, qué NO podemos concluir dada la muestra y el diseño."
El patrón: explorar → limpiar → analizar/visualizar → interpretar con freno.
2.9 — Privacidad exprés (intermedio)
Tu grupo quiere subir a claude.ai la base de datos de miembros de la asociación (nombres, carnets, teléfonos) para "que Claude haga estadísticas". Proponé la alternativa correcta en dos pasos.
✅ Solución
(1) Anonimizar antes de subir: eliminar nombres, carnets y teléfonos; si hace falta distinguir personas, reemplazar por IDs genéricos (M001, M002). Las estadísticas salen igual de columnas como carrera, año, asistencia. (2) Verificar que ninguna combinación de columnas re-identifique (si solo hay una estudiante de Arquitectura de 5.º año, "carrera+año" la identifica). Regla de fondo: datos personales de terceros no se suben sin anonimizar — por respeto, por normas universitarias y por ley.
2.10 — Diseñá el quiz (retador)
Escribí el prompt completo (componentes de 2.1 incluidos) para que Claude genere, como artefacto, una mini-app de práctica para TU próximo parcial. Debe especificar: fuente del contenido, tipos de pregunta, comportamiento al fallar y criterio de dificultad.
✅ Solución
Ejemplo de referencia:
"Trabajá sobre los PDFs de este Proyecto (unidades 3 y 4) [fuente]. Creá una mini-app de quiz con 20 preguntas: 12 de selección múltiple, 5 de verdadero/falso con justificación y 3 de respuesta corta [tipos]. Al fallar, mostrá la respuesta correcta + por qué + en qué sección del material estudiarlo [comportamiento al fallar]. Dificultad creciente: las últimas 5 deben combinar dos temas a la vez, como hace mi profesor [criterio]. Al final, mostrame mi puntaje por tema para saber qué repasar."
Lo evaluable: que cada requisito esté especificado y verificable, no "haceme un quiz bonito".
2.11 — El Proyecto que no funciona (retador)
Armaste el Proyecto de tu materia pero las respuestas siguen siendo genéricas: no citan tus PDFs, no respetan el modo socrático. Listá 4 causas posibles ordenadas de más a menos probable, con su diagnóstico.
✅ Solución
- Instrucciones vagas o sin la cláusula explícita ("basate en los PDFs", "guiame con preguntas ANTES de dar soluciones"). Diagnóstico: releé tus instrucciones — ¿son órdenes verificables o deseos generales?
- Conversación fuera del Proyecto. Clásico: abriste un chat suelto creyendo que estabas dentro. Diagnóstico: verificá en qué contexto está la conversación.
- Archivos mal cargados o ilegibles (escaneos de pésima calidad, PDFs protegidos). Diagnóstico: preguntá "listá los documentos que tenés disponibles y el título de sus secciones".
- Preguntas que no activan el material (preguntás cosas que tus PDFs no cubren — Claude completa con conocimiento general, correctamente). Diagnóstico: probá con una pregunta que SÍ esté literalmente en el material.
2.12 — Tu semana con flujos (retador)
Tomá tu semana real de clases y diseñá tu versión de los tres flujos de la sección 2.6 adaptada a TUS materias: qué proyecto, qué archivos, qué prompts. Ejecutá al menos uno completo y anotá qué funcionó y qué ajustarías.
✅ Solución
Respuesta personal. Criterios de autoevaluación: (1) cada flujo nombra Proyecto y archivos concretos, no genéricos; (2) los prompts incluyen formato y restricciones; (3) la ejecución real produjo un artefacto o resultado usable (plan de estudio, guía, análisis); (4) la reflexión identifica al menos un ajuste específico ("las 10 preguntas diagnósticas eran muy fáciles: pedir nivel parcial, no nivel tarea").
Cap. 3 — Claude Code
3.1 — Definición de agente (básico)
Completá: un agente es un modelo de lenguaje en un ______ con ______. Explicá cada blanco.
✅ Solución
"...en un bucle con herramientas". El modelo decide una acción (leer archivo, ejecutar comando), la herramienta la ejecuta, el resultado vuelve al modelo, y el ciclo se repite hasta completar la tarea. Eso lo diferencia del chat: el chat solo produce texto; el agente actúa y observa las consecuencias de sus acciones.
3.2 — Las superficies de Claude Code (básico)
¿En qué cuatro lugares puede correr Claude Code, y cuál usarías para tu día a día como estudiante?
✅ Solución
Terminal (CLI), web, app de escritorio y extensión de IDE (VS Code, JetBrains). Para el día a día estudiantil, terminal o extensión de IDE son las naturales: la terminal es la experiencia más completa; el IDE suma ver los diffs integrados donde ya trabajás.
3.3 — Las cuatro secciones (básico)
Nombrá las cuatro secciones de un buen CLAUDE.md y qué pregunta responde cada una.
✅ Solución
- Comandos — ¿cómo se corre, prueba y construye esto?
- Estructura — ¿dónde está cada cosa?
- Convenciones — ¿cómo escribimos código acá?
- Advertencias — ¿qué no se toca y por qué?
3.4 — Riesgo cero (básico)
¿Cuál de los cuatro flujos típicos es de riesgo cero y por qué conviene empezar por él?
✅ Solución
Entender un repo ajeno — es solo lectura: el agente no edita ni ejecuta nada con efectos. Conviene empezar ahí porque aprendés la dinámica de la herramienta (permisos, estilo de trabajo, calidad de respuestas) sin posibilidad de romper nada, y de paso producís algo valioso (el mapa del proyecto).
3.5 — La fórmula en acción (intermedio)
Convertí este pedido débil en uno fuerte: "hacé más rápido el script de reportes". Inventá contexto plausible; debe tener objetivo, criterio de éxito verificable y restricciones.
✅ Solución
"El script
generar_reporte.pytarda ~4 minutos con el CSV de 50,000 filas dedata/ventas.csv[contexto]. Objetivo: bajarlo a menos de 30 segundos [objetivo]. Criterio: el testtests/test_reporte.pysigue pasando (mismo output exacto) y el tiempo medido contime python generar_reporte.pybaja de 30s [criterio verificable]. Restricciones: sin dependencias nuevas; sospecho del bucle que lee fila por fila — probá pandas vectorizado que ya está en requirements [restricciones + pista]."
3.6 — Test primero (intermedio)
En el flujo de bugs, ¿por qué se exige que el test se escriba ANTES del arreglo y que primero FALLE? ¿Qué garantiza cada cosa?
✅ Solución
Que se escriba antes y falle garantiza que el test reproduce el bug real — si pasara de entrada, no está probando el bug (o el bug no es el que creés). Que después pase demuestra que el arreglo funciona para ese caso. Que quede en la suite garantiza que el bug no regresa sin que nadie lo note (test de regresión). Sin esta disciplina, "lo arreglé" es una opinión; con ella, es un hecho verificable.
3.7 — La cláusula de oro (intermedio)
En el flujo de refactorización aparece la restricción "la suite debe pasar sin modificar NINGÚN test existente". ¿Qué problema exacto previene? Da un ejemplo de cómo el agente podría "cumplir" sin ella.
✅ Solución
Previene que el agente cambie el comportamiento y ajuste los tests para que coincidan — que es lo contrario de refactorizar. Ejemplo: al extraer la lógica de descuentos, el agente introduce un redondeo distinto; el test assert total == 10.50 falla; sin la cláusula, el camino corto es cambiar el test a 10.49 y declarar éxito. Con la cláusula, el agente debe preservar el comportamiento original — que es la definición misma de refactor.
3.8 — Permisos y ramas (intermedio)
¿Qué dos mecanismos de seguridad tenés al trabajar con Claude Code, uno de la herramienta y uno de git? ¿Qué cubre cada uno?
✅ Solución
(1) El sistema de permisos de Claude Code: pide aprobación antes de acciones con efecto (editar, ejecutar comandos) — control fino, acción por acción, ANTES de que pase. (2) La rama de git: trabajar siempre en una rama dedicada hace que cualquier desastre se descarte borrando la rama — red de seguridad gruesa, DESPUÉS de que pasó. Se complementan: el permiso evita el daño puntual; la rama hace reversible el daño acumulado.
3.9 — CLAUDE.md como memoria de errores (intermedio)
El agente usó tres veces esta semana la sintaxis vieja de una librería que tu proyecto ya actualizó. ¿Cuál es la solución correcta y por qué corregirlo en el chat no alcanza?
✅ Solución
Agregar la regla al CLAUDE.md: "Usamos [librería] v3 — no sugerir sintaxis de v2 (en particular, X cambió a Y)". Corregirlo en el chat solo arregla esa sesión: el agente no retiene memoria entre sesiones, así que mañana repetirá el error. CLAUDE.md se lee automáticamente al inicio de cada sesión — es la memoria persistente del proyecto. Regla general: error repetido = regla nueva en CLAUDE.md.
3.10 — El diff sospechoso (retador)
Pediste "arreglá el typo en el mensaje de bienvenida". El diff toca 3 archivos: el del mensaje (1 línea), config.py (cambia un timeout de 30 a 300) y requirements.txt (agrega una librería). El agente explica: "aproveché para arreglar otros problemas que vi". ¿Qué hacés y qué le decís?
✅ Solución
Aceptás solo la línea del typo; rechazás el resto. No porque los otros cambios sean necesariamente malos, sino porque (1) no fueron pedidos ni revisables en este contexto — un timeout ×10 puede tener consecuencias serias que nadie evaluó; (2) mezclan propósitos en un mismo commit, lo que arruina el historial y complica revertir. Le decís: "revertí config.py y requirements.txt. Si creés que el timeout y la librería valen la pena, explicame el porqué de cada uno y los hacemos como tareas separadas." Y de paso, al CLAUDE.md: "no hacer cambios fuera del alcance del pedido; proponerlos por separado".
3.11 — Dividir lo gigante (retador)
Tu pedido soñado: "construí el sistema completo de gestión de notas para mi cátedra: alumnos, evaluaciones, ponderaciones, reportes y exportación a Excel". Dividilo en 4-5 etapas entregables, cada una revisable en ~15 minutos, en el orden correcto. ¿Qué hace que tu orden sea el correcto?
✅ Solución
División razonable:
- Modelos y base: entidades Alumno, Evaluación, Nota + esquema + tests de modelos.
- CRUD de alumnos y evaluaciones: endpoints/comandos básicos + tests.
- Lógica de ponderaciones: cálculo de nota final con reglas de la cátedra + tests exhaustivos (acá viven los bugs caros).
- Reportes: consultas de notas por alumno/grupo + tests.
- Exportación a Excel: sobre los reportes ya probados.
El orden correcto es el de dependencias + riesgo: cada etapa usa las anteriores ya revisadas, y la lógica más delicada (ponderaciones) llega cuando la base es sólida y ella sola concentra tu atención de revisión. Anti-patrón: empezar por la exportación a Excel "porque es lo visible".
3.12 — Tu repo con agente (retador)
Ejecutá el avance del proyecto-hilo completo (sección 3.7) en un repo tuyo real. Entregables: el CLAUDE.md, el pedido que usaste (con la fórmula completa) y tu veredicto del diff con el checklist de 3.6.
✅ Solución
Respuesta personal. Autoevaluación: (1) el CLAUDE.md tiene las 4 secciones y al menos una regla anti-error-personal; (2) el pedido tiene criterio de éxito verificable por el agente (tests, comando, output esperado); (3) el veredicto del diff documenta al menos una decisión no trivial (algo que preguntaste, rechazaste o pediste cambiar — si aceptaste todo a la primera, revisá si de verdad leíste el diff).
Cap. 4 — Tu primera app con la API
4.1 — El primer request (básico)
Escribí de memoria el programa mínimo: cliente, un request a Opus 4.8 preguntando algo, imprimir la respuesta. Después compará con el del libro: ¿qué te faltó?
✅ Solución
import anthropic
client = anthropic.Anthropic()
respuesta = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "Explicame qué es una variable."}],
)
print(respuesta.content[0].text)
Olvidos típicos: max_tokens (es obligatorio), el [0] en content (es una lista de bloques), y el formato exacto del mensaje (role + content).
4.2 — ¿Dónde vive la key? (básico)
¿Por qué anthropic.Anthropic() funciona sin pasarle la key? ¿Qué pasaría con anthropic.Anthropic(api_key="sk-ant-...") escrito en el código?
✅ Solución
El cliente busca automáticamente la variable de entorno ANTHROPIC_API_KEY — por eso el código no necesita (ni debe) conocer la key. La segunda forma funciona, pero pone el secreto dentro del archivo: cuando ese archivo llegue a GitHub (llegará), bots la encontrarán en minutos y gastarán tu saldo. Key en el código = key quemada.
4.3 — Roles y orden (básico)
¿Cuáles de estas listas messages son válidas? (a) [user]; (b) [assistant, user]; (c) [user, assistant, user]; (d) [user, user].
✅ Solución
- (a) Válida — un solo mensaje de user, el caso más simple.
- (b) Inválida — el primero siempre debe ser
user. - (c) Válida — alternancia perfecta; es la forma de un tercer turno.
- (d) Inválida — dos
userconsecutivos rompen la alternancia → error 400.
4.4 — system vs user (básico)
¿Qué diferencia hay entre poner "respondé siempre en español formal" en el parámetro system y ponerlo como primer mensaje de user?
✅ Solución
El system define comportamiento persistente con mayor peso: instrucciones de rol que el modelo trata como reglas del juego, separadas de la conversación. Como mensaje de user también suele funcionar, pero compite con el resto de la conversación y puede diluirse a medida que el historial crece. Regla: instrucciones de comportamiento → system; contenido de la conversación → messages.
4.5 — Leer usage (intermedio)
Tu request devolvió usage.input_tokens=4200, usage.output_tokens=850. (a) ¿Qué incluyen exactamente esos 4,200? (b) Calculá el costo con Opus 4.8.
✅ Solución
- (a) Todo lo que mandaste: el system prompt + el historial completo + la pregunta nueva. No solo "tu pregunta" — por eso los historiales largos encarecen los turnos.
- (b) 0.0042M × $5 + 0.00085M × $25 = $0.021 + $0.02125 = $0.04225.
4.6 — El chat amnésico (intermedio)
Tu chat responde bien la primera pregunta pero "olvida todo" en la segunda. Sin ver el código, ¿cuál es tu hipótesis #1, qué línea buscás y cómo la corregís?
✅ Solución
Hipótesis #1 (con mucha ventaja): no se reenvía el historial — el request manda solo el último mensaje. Línea a buscar: el messages= del create(); si dice algo como messages=[{"role": "user", "content": pregunta}] dentro del bucle, ahí está. Corrección: mantener una lista historial, hacer append del mensaje de user antes del request Y del de assistant después, y pasar messages=historial. La API es stateless: la memoria es tu lista.
4.7 — ¿Streaming o create? (intermedio)
Decidí para cada caso, con razón: (a) clasificar 1,000 tuits (salida: una palabra); (b) tu tutor interactivo de consola; (c) generar un ensayo de 3,000 palabras; (d) un script nocturno que resume PDFs.
✅ Solución
- (a)
create()— salidas de una palabra, sin nadie mirando; streaming no aporta. - (b) Streaming — interfaz interactiva: ver el texto fluir cambia la experiencia.
- (c) Streaming, obligatorio — salida larga: sin streaming, riesgo real de timeout antes de terminar la generación.
- (d)
create()alcanza si los resúmenes son cortos; si fueran largos, streaming aunque nadie mire (por el timeout). Bonus: este caso es candidato ideal a Batches API (cap. 5).
4.8 — Tabla de errores (intermedio)
Sin mirar el libro: ¿qué significan 401, 429 y 529, qué excepción tipada corresponde a los dos primeros, y cuál de los tres NO se arregla reintentando?
✅ Solución
- 401 — key inválida/ausente →
anthropic.AuthenticationError. No se arregla reintentando: hay que corregir la configuración. - 429 — rate limit (demasiados requests/tokens por minuto) →
anthropic.RateLimitError. Se arregla esperando (headerretry-after); el SDK ya reintenta solo. - 529 — API sobrecargada. Reintento con espera creciente.
4.9 — El pop salvador (intermedio)
En el tutor del libro, tras un request fallido se ejecuta historial.pop(). Explicá la cadena exacta de eventos que ocurre si NO se hace, hasta el error final.
✅ Solución
- Se hace
historial.append({"role": "user", ...})con la pregunta. - El request falla (p. ej.
RateLimitError) → no hay respuesta → no se agrega mensaje de assistant. - El historial queda terminando en
user. - El usuario pregunta de nuevo → otro
appenddeuser→ el historial tiene dosuserconsecutivos. - El siguiente request viola la alternancia de roles →
BadRequestError(400) — y ahora TODOS los turnos siguientes fallan, porque el historial quedó corrupto. Elpop()deshace el paso 1 cuando el request muere, manteniendo el historial siempre válido.
4.10 — Presupuestá tu tutor (retador)
Estimá el costo de UNA sesión de estudio con tu tutor del cap. 4: 15 preguntas, system de 100 tokens, preguntas de ~50 tokens, respuestas de ~400 tokens, historial completo reenviado en cada turno, Opus 4.8. (Aproximá: en el turno k, el historial acumula los k−1 intercambios anteriores.)
✅ Solución
Cada intercambio agrega ~450 tokens al historial (50 + 400). Entrada del turno k ≈ 100 (system) + 450(k−1) + 50. Sumando k=1..15: entrada total ≈ 15×150 + 450×(0+1+...+14) = 2,250 + 450×105 = 2,250 + 47,250 = 49,500 tokens de entrada. Salida: 15 × 400 = 6,000 tokens.
Costo: 0.0495M × $5 + 0.006M × $25 = $0.2475 + $0.15 = ~$0.40 la sesión. Observá que la entrada acumulada (47K de los 49.5K) domina — el historial reenviado es el costo real de un chat. Adelanto del cap. 5: con caching, gran parte de esa entrada repetida costaría ~10× menos.
4.11 — Diseño: el resumidor robusto (retador)
Diseñá (pseudocódigo o Python) un script que resuma cada archivo .txt de una carpeta con Haiku 4.5, cumpliendo: continúa si un archivo falla, detecta respuestas cortadas, y muestra al final cuántos se procesaron, fallaron y cuánto costó. Marcá dónde va cada concepto del capítulo.
✅ Solución
import anthropic, pathlib
client = anthropic.Anthropic()
ok, fallos, costo = 0, 0, 0.0
for archivo in pathlib.Path("apuntes").glob("*.txt"):
try:
r = client.messages.create( # request básico
model="claude-haiku-4-5", # modelo barato para tarea simple
max_tokens=500,
system="Resumí en 5 viñetas, en español.", # system prompt
messages=[{"role": "user",
"content": archivo.read_text()}], # sin historial: tareas independientes
)
if r.stop_reason == "max_tokens": # detectar corte
print(f"⚠️ {archivo.name}: resumen cortado")
archivo.with_suffix(".resumen.txt").write_text(r.content[0].text)
costo += (r.usage.input_tokens * 1 + r.usage.output_tokens * 5) / 1e6 # usage → costo
ok += 1
except anthropic.APIError as e: # excepción tipada; el bucle sigue
print(f"❌ {archivo.name}: {e.message}")
fallos += 1
print(f"Procesados: {ok} | Fallos: {fallos} | Costo: ${costo:.4f}")
Puntos clave: sin historial (los archivos no se relacionan — más barato y más simple), try/except POR archivo (un fallo no mata el lote), chequeo de stop_reason, y contabilidad con usage.
4.12 — Extendé el tutor a guardado (retador)
Agregale al tutor del capítulo un comando guardar que escriba la conversación a un archivo Markdown legible, y la carga opcional al iniciar ("¿continuar la última sesión? s/n"). ¿Qué decisión de diseño tenés que tomar sobre el historial cargado y los costos?
✅ Solución
Esqueleto del guardado:
if pregunta.lower() == "guardar":
with open("sesion.md", "w") as f:
for m in historial:
quien = "**Vos**" if m["role"] == "user" else "**Tutor**"
f.write(f"{quien}: {m['content']}\n\n")
print("[Guardado en sesion.md]\n")
continue
Para la carga: leer el archivo, reconstruir la lista de diccionarios y arrancar con ese historial. La decisión de diseño: una sesión vieja cargada completa puede ser enorme — y desde el primer turno pagás TODO ese historial como entrada en cada request. Opciones: cargar solo los últimos N intercambios, o (mejor) pedirle al propio modelo un resumen de la sesión vieja y cargar solo el resumen como contexto inicial. Es el trade-off memoria/costo en su forma más pura.
Cap. 5 — Costos, límites y buenas prácticas
5.1 — La fórmula (básico)
Escribí la fórmula del costo de un request y calculá: 8,000 tokens de entrada, 1,000 de salida, con Haiku 4.5.
✅ Solución
Con Haiku: 0.008 × $1 + 0.001 × $5 = $0.008 + $0.005 = $0.013.
5.2 — ¿Por qué la salida manda? (básico)
En todos los modelos, la salida cuesta 5× la entrada. ¿Qué optimización gratuita se desprende de esto y cómo la aplicás en un prompt?
✅ Solución
Pedir respuestas concisas. La instrucción "respondé en máximo 5 viñetas" o "máximo 150 palabras" reduce la parte cara de la factura sin tocar código ni arquitectura. En el system prompt de apps: "sé conciso; ampliá solo si te lo piden".
5.3 — count_tokens vs tiktoken (básico)
Tu compañero presupuestó un proyecto contando tokens con tiktoken. ¿Cuál es el problema y cuál es la herramienta correcta?
✅ Solución
tiktoken es el tokenizador de OpenAI: parte el texto distinto que los modelos Claude, así que los conteos (y el presupuesto) quedan sistemáticamente mal. Lo correcto: client.messages.count_tokens(model=..., messages=...) — gratis, exacto y del modelo que vas a usar. Para servilleta: 1 palabra ≈ 1.3 tokens en español.
5.4 — Caché: leer y escribir (básico)
Completá: escribir al caché cuesta ~____ veces el precio de entrada; leer cuesta ~____ veces. ¿A partir de cuántos usos del mismo prefijo ya ganaste?
✅ Solución
Escribir: ~1.25×. Leer: ~0.1×. Con 2 usos ya ganás: 1.25 + 0.1 = 1.35× contra 2× de mandarlo dos veces sin caché. De ahí en adelante, cada uso extra cuesta una décima en vez de uno entero.
5.5 — Batch sí, batch no (básico)
¿Cuáles de estas tareas son candidatas a la Batches API? (a) el autocompletado de tu editor; (b) clasificar el archivo histórico de 50,000 correos; (c) tu tutor de consola; (d) generar los resúmenes semanales del lunes a las 6 a.m. que se leen a las 9.
✅ Solución
- (a) No — latencia de milisegundos requerida.
- (b) Sí — lote masivo, nadie espera; 50% de descuento directo.
- (c) No — conversación interactiva.
- (d) Sí — hay 3 horas de margen; sobra para el batch. La pregunta clave siempre: ¿alguien está esperando en pantalla?
5.6 — El system prompt con reloj (intermedio)
Una app tiene este system prompt: f"Hoy es {datetime.now()}. Sos un asistente legal..." seguido de 80,000 tokens de reglamentos cacheados con cache_control. La factura muestra que el caché jamás acierta. ¿Por qué, y cómo se arregla?
✅ Solución
El caché matchea por prefijo exacto: la fecha/hora al INICIO cambia en cada request (¡incluye segundos!), así que el prefijo nunca coincide y cada request paga la escritura (1.25×) de los 80,000 tokens sin que nadie lea jamás. Arreglo: lo volátil va al final o en los mensajes — system = reglamentos estables (cacheados) primero; la fecha, si hace falta, en el mensaje del usuario o al final del system, después del bloque cacheado.
5.7 — Calculá el ahorro de caché (intermedio)
Asistente del reglamento académico: contexto fijo de 60,000 tokens, Sonnet 4.6, ráfagas de 25 consultas. Calculá el costo de la porción fija: (a) sin caché; (b) con caché. (c) ¿Qué porcentaje ahorraste?
✅ Solución
- (a) Sin caché: 25 × 60,000 × $3/M = $4.50.
- (b) Con caché: escritura 60,000 × $3.75/M = $0.225; lecturas 24 × 60,000 × $0.30/M = $0.432. Total: $0.657.
- (c) 1 − 0.657/4.50 = ~85% de ahorro en la porción cacheada.
5.8 — Mezcla de modelos (intermedio)
Un sistema de soporte recibe 10,000 consultas/mes (300 tokens entrada, 150 salida). El 90% son triviales (las resuelve Haiku) y el 10% difíciles (necesitan Opus). Compará el costo mensual de: (a) todo con Opus; (b) la mezcla 90/10 (asumí que el triaje es gratis).
✅ Solución
Por consulta — Opus: 0.0003 × $5 + 0.00015 × $25 = $0.00525. Haiku: 0.0003 × $1 + 0.00015 × $5 = $0.00105.
- (a) Todo Opus: 10,000 × $0.00525 = $52.50/mes.
- (b) Mezcla: 9,000 × $0.00105 + 1,000 × $0.00525 = $9.45 + $5.25 = $14.70/mes — 72% menos. El patrón "lo barato hace el volumen, lo caro la excepción" es de los más rentables que existen. (En la práctica, el triaje mismo puede hacerlo Haiku por centavos.)
5.9 — Protocolo de filtración (intermedio)
Acabás de darte cuenta de que tu API key está en un commit público de hace 3 días. Listá en orden los 4 pasos del protocolo, y explicá por qué "borrar el archivo y hacer push" NO es uno de ellos.
✅ Solución
- Revocar la key YA en console.anthropic.com (minutos cuentan).
- Generar una nueva y actualizar la variable de entorno.
- Revisar el uso reciente en la consola buscando consumo ajeno.
- Asumir que fue copiada y revisar dónde más la usaste.
Borrar el archivo no sirve porque el historial de git conserva el commit viejo (y GitHub puede cachear/espejar contenido): la key sigue visible para quien sepa mirar — y los bots saben. La única muerte real de una key filtrada es la revocación.
5.10 — Presupuesto de fin de ciclo (retador)
Semana de finales: vas a usar tu asistente cacheado (system + apuntes = 40,000 tokens) en 6 sesiones de estudio, cada una con 30 preguntas (~60 tokens) y respuestas (~350 tokens), historial truncado a ~4,000 tokens promedio, con Opus 4.8. Estimá el costo total de la semana. (Asumí: el caché acierta dentro de cada sesión; cada sesión paga 1 escritura.)
✅ Solución
Por sesión: caché: 1 escritura (40K × $6.25/M = $0.25) + 29 lecturas (29 × 40K × $0.5/M = $0.58) = $0.83. Entrada no cacheada: 30 × (4,000 + 60) ≈ 121,800 tokens × $5/M = $0.609. Salida: 30 × 350 = 10,500 × $25/M = $0.2625. Sesión ≈ $1.70.
Semana: 6 × $1.70 ≈ $10.20. Para contexto: sin caché, la porción de apuntes sola costaría 6 × 30 × 40K × $5/M = $36 — el caching te ahorró ~$31 en la semana. Si $10 sigue siendo mucho, las palancas restantes: ¿Sonnet alcanza? (÷1.67), ¿respuestas más cortas?, ¿historial más corto?
5.11 — Auditoría de script ajeno (retador)
Te pasan este fragmento para "revisar costos antes de correrlo sobre 2,000 documentos". Señalá TODOS los problemas de costo/seguridad que veas:
client = anthropic.Anthropic(api_key="sk-ant-api03-xK9...")
for doc in documentos: # 2000 docs de ~3000 tokens
r = client.messages.create(
model="claude-fable-5",
max_tokens=8000,
messages=[{"role": "user",
"content": INSTRUCCIONES_10K_TOKENS + doc}],
)
resultados.append(r.content[0].text)
✅ Solución
- Key hardcodeada — directo a revocar y mover a
ANTHROPIC_API_KEY. - Fable 5 para procesar documentos en lote — casi seguro Haiku o Sonnet alcanzan; diferencia de hasta 10×.
- INSTRUCCIONES_10K_TOKENS repetidas en cada request sin caché — 2,000 × 10K = 20M tokens de entrada repetida; con
cache_controlen un bloque de system costaría ~10× menos. - Sin Batches API — es un lote sin urgencia aparente: 50% de descuento ignorado.
max_tokens=8000sin justificar — si la salida esperada es un resumen corto, un techo alto invita salidas largas y caras (y no hay chequeo destop_reason).- Sin manejo de errores — un 429 a mitad del lote mata el script y pierde lo procesado.
- Sin freno de presupuesto ni contador — nadie sabrá cuánto costó hasta ver la consola.
Estimación del horror tal cual está: entrada 2,000 × 13K = 26M × $10 = $260, más salida. Bien hecho (Haiku + caché + batch): unos pocos dólares.
5.12 — Proyecto final (retador)
Completá el proyecto final del capítulo 5 (las tres partes). Entregá el presupuesto escrito de la Parte C punto 6 con todas las cuentas visibles.
✅ Solución
Respuesta personal. Autoevaluación del presupuesto: (1) las supuestos de uso son explícitos y realistas (preguntas/sesión, sesiones/semana, tamaños en tokens); (2) hay DOS cálculos completos — sin caché y con caché — con la fórmula visible, no solo resultados; (3) el ahorro se expresa en $ y en %; (4) el CSV de uso real de tu primera semana se compara contra la estimación, y la diferencia se explica (¿subestimaste el tamaño de las respuestas? ¿el historial creció más de lo previsto?). El hábito de presupuestar → medir → explicar la diferencia ES la ingeniería de costos.