Extender Claude Code con skills, hooks y plugins; diseñar y orquestar agentes; y correr modelos locales con RAG y fine-tuning.
En la Parte 1 vimos cómo usar Claude y Claude Code bien. Ahora pasamos a construir sobre ellos: personalizarlos, ponerlos a trabajar en paralelo y llevar parte del trabajo a modelos que corren en tu máquina.
Empaquetar flujos de trabajo como skills, garantizar reglas con hooks y compartir todo como plugin.
Elegir entre workflow y agente, y entre subagentes, agent teams, worktrees o el Agent SDK.
Entender cuantización y memoria para elegir un modelo abierto que entre en tu hardware.
Armar un RAG, mejorar su precisión y decidir cuándo conviene contexto largo o fine-tuning.
En tres meses salió una generación nueva de modelos Claude, con precios iguales o más bajos. La tabla de la diapositiva 5 de la Parte 1 queda así:
| En julio | Precio in / out | Hoy | Precio in / out |
|---|---|---|---|
| Claude Fable 5 | $10 / $50 | Claude Fable 5.1 | $10 / $50 |
| Claude Opus 4.8 | $5 / $25 | Claude Opus 5.5 | $4 / $20 |
| Claude Sonnet 5 | $3 / $15* | Claude Sonnet 5.5 | $2 / $10 |
| Claude Haiku 4.5 | $1 / $5 | Claude Haiku 5.5 | $0.10 / $0.50** |
USD por millón de tokens. *Con precio de lanzamiento de $2 / $10. **Prompts de hasta 100K tokens; por encima, $0.50 / $2.50. La lectura en caché ahora cuesta entre 2,5% y 10% del input base (antes, 10%).
En la Parte 1 dijimos que no se podía. Hoy Ollama expone una API compatible con la de Anthropic, así que Claude Code puede usar un modelo local. No es soporte oficial de Anthropic y el resultado depende mucho del modelo: lo vemos en el Bloque 3.
Cómo pasar de escribir el mismo prompt todas las semanas a tener flujos empaquetados, reglas que se cumplen siempre y un kit que el equipo instala con un comando.
Todos agregan algo a Claude Code, pero difieren en cuándo se cargan y en si dependen de que el modelo decida usarlos.
| Mecanismo | Qué es | Cuándo entra en juego | Ideal para |
|---|---|---|---|
| CLAUDE.md | Instrucciones persistentes del proyecto | Siempre, al iniciar cada sesión | Comandos y convenciones que aplican en todas las tareas |
| Skill | Instrucciones, referencias y scripts en una carpeta con SKILL.md | La descripción, siempre; el resto, solo al usarla | Flujos repetibles y material de referencia largo |
| Hook | Comando que corre en un evento del ciclo de vida | Lo ejecuta Claude Code, no el modelo: es determinista | Reglas que tienen que cumplirse siempre, sin excepción |
| Subagente | Agente con su propio contexto, prompt y herramientas | Cuando se le delega una tarea | Investigar o revisar sin ensuciar la conversación principal |
| MCP | Servidor que expone herramientas y datos externos | Las herramientas se buscan y cargan bajo demanda | Conectar sistemas: bases de datos, Jira, Slack, Figma |
| Plugin | Paquete versionado con cualquiera de los anteriores | Mientras esté habilitado | Compartir un setup completo con el equipo o la clase |
Una skill es una carpeta con un SKILL.md: frontmatter YAML arriba e instrucciones en Markdown abajo. Claude la usa cuando la tarea coincide con su descripción, o la invocás vos con /nombre.
| Alcance | Ruta |
|---|---|
| Personal | ~/.claude/skills/<nombre>/ |
| Proyecto | .claude/skills/<nombre>/ |
| Plugin | <plugin>/skills/<nombre>/ |
La de proyecto se commitea y la recibe todo el equipo. Las de plugin quedan con espacio de nombres: /mi-plugin:skill.
SKILL.md por debajo de 500 líneas y mandá el detalle a archivos de soporte.Una skill no ocupa contexto hasta que se usa. Eso permite tener decenas instaladas sin pagar sus instrucciones completas en cada turno, algo que un CLAUDE.md largo no puede hacer.
Están en el contexto de cada turno para que Claude sepa que la skill existe. La descripción (con when_to_use) se trunca a 1.536 caracteres.
Se carga cuando Claude o vos la invocan y queda en el contexto el resto de la sesión. Tras una compactación conserva sus primeros 5.000 tokens.
Referencias y ejemplos se leen solo cuando la tarea los necesita. Los scripts se ejecutan sin cargar su código en el contexto.
| Frontmatter | Vos | Claude | Usalo para |
|---|---|---|---|
| (por defecto) | Sí | Sí | La mayoría de las skills |
| disable-model-invocation: true | Sí | No | Acciones con efectos, como /deploy: que solo corran cuando vos lo pedís |
| user-invocable: false | No | Sí | Conocimiento de fondo que no tiene sentido como comando |
Con unos pocos campos más, una skill puede correr aislada en un subagente y arrancar con datos frescos del repo.
context: fork + agentLa skill corre en un subagente (acá, el Explore de solo lectura). No ve tu conversación, así que las instrucciones tienen que ser autocontenidas.
!`comando`Corre el comando antes de que Claude lea la skill y reemplaza el marcador por la salida. Si el comando falla, la skill no se ejecuta.
$ARGUMENTS, $0, ${CLAUDE_SKILL_DIR}Lo que escribís después de /revisar-pr, un argumento por posición, o la carpeta de la propia skill para llamar a sus scripts.
allowed-tools, model, effortPreaprueban herramientas o cambian modelo y effort solo mientras la skill está activa.
Portabilidad: en claude.ai y la API de Skills solo se aceptan name, description, license, compatibility, metadata y allowed-tools. Los demás campos son exclusivos de Claude Code.
Un hook es un comando que Claude Code ejecuta cuando ocurre un evento. No depende de que el modelo “se acuerde”: si el evento ocurre, el hook corre.
PermissionRequest · Notification · SubagentStart · SubagentStop · PreCompact · PostCompact · TaskCreated · TaskCompleted · TeammateIdle · FileChanged · CwdChanged · WorktreeCreate · ConfigChange · InstructionsLoaded
matcher filtra cuándo dispara: por ejemplo "Edit|Write" en PreToolUse/PostToolUse, o "compact" en SessionStart para reinyectar contexto después de compactar.El hook recibe un JSON por stdin con los datos del evento y responde con su exit code (o con JSON por stdout para un control más fino).
exit 0Sin objeción. Si además imprime JSON por stdout, ese JSON decide (permitir, preguntar, agregar contexto).
exit 2Bloquea la acción. Lo que escribiste en stderr le llega a Claude como feedback para que cambie de enfoque.
No bloquea. Si hay varios hooks, gana la decisión más restrictiva: deny, después ask, después allow.
jq; el script debe ser ejecutable (chmod +x).La mayoría son comandos de shell, pero un hook también puede llamar a una URL, a una herramienta MCP o a un modelo que evalúe la situación.
Corre un comando de shell. Determinista y rápido: el caso típico.
Envía los datos del evento por POST a una URL: auditoría, dashboards, Slack.
Llama a una herramienta de un servidor MCP ya configurado.
Un modelo evalúa en un turno algo que requiere criterio, no una regla fija.
Verificación de varios turnos con herramientas. Experimental.
rm -rf o pushes a main (PreToolUse sobre Bash)compact)Un plugin es una carpeta con un manifiesto que agrupa skills, subagentes, hooks y servidores MCP. Se instala como una unidad desde un marketplace: un repo con un catálogo de plugins.
.claude-plugin/marketplace.json que lista los plugins y de dónde bajarlos. Es un catálogo, no una tienda.Un plugin habilitado forma parte de todas tus sesiones, no solo de las que lo usan. Conviene saber qué te cuesta y qué puede hacer.
El nombre y la descripción de cada skill y agente que Claude puede invocar entran en el contexto en cada turno, aunque no los uses. Muchos plugins = menos espacio y más tokens.
Sus servidores MCP corren junto a cada sesión y sus hooks disparan en sus eventos.
Lo que el plugin ejecuta, lo ejecuta como vos. Revisá el código antes de instalar, sobre todo si viene de un marketplace de terceros.
| Alcance | Para quién queda habilitado | Cuándo usarlo |
|---|---|---|
| User | Para vos, en todos los proyectos de esta computadora | Herramientas personales que usás en todos lados |
| Project | Para todo el que trabaje en el repo, vía .claude/settings.json commiteado | El kit del equipo o de la clase |
| Local | Solo para vos, solo en este repo | Probar algo sin afectar al resto |
Cuándo conviene un agente y cuándo un flujo fijo, cómo trabaja el loop por dentro, y las opciones para poner varios Claude a trabajar a la vez.
En un workflow el código define el camino y el modelo ejecuta cada paso. En un agente el modelo decide sus propios pasos y herramientas. Los workflows son más predecibles; los agentes, más flexibles y más caros.
Pasos secuenciales con chequeos entre medio. Cuándo: la tarea se divide limpio en subtareas fijas.
Clasifica la entrada y la manda al prompt, herramienta o modelo adecuado. Cuándo: hay categorías distintas y se clasifican bien.
Secciones independientes a la vez, o la misma tarea varias veces y se vota. Cuándo: querés velocidad o más confianza.
Un modelo divide la tarea, delega y une los resultados. Cuándo: no sabés de antemano cuántas subtareas hay.
Uno genera, otro critica, en loop. Cuándo: hay criterios claros y la crítica mejora el resultado.
Elige pasos y herramientas hasta terminar. Cuándo: problemas abiertos, con sandbox, tests y límites.
Claude Code, el Agent SDK y cualquier agente comparten la misma estructura: el modelo decide, una herramienta actúa y el resultado vuelve al contexto, hasta que no hace falta otro paso.
Stop lo deja terminar (o lo hace seguir)Se diferencian en cuánto contexto comparten, cómo se comunican y cuánto cuestan. La regla: usá la opción más liviana que resuelva la tarea.
| Opción | Contexto | Comunicación | Costo | Ideal para |
|---|---|---|---|---|
| Subagentes | Propio; devuelve un resumen al que lo llamó | Reporta solo a la sesión principal | Bajo | Tareas acotadas donde importa el resultado, no el proceso |
| Agent teams | Cada teammate es una sesión completa e independiente | Mensajes directos entre ellos y lista de tareas compartida | Alto: escala con cada teammate | Investigar, revisar o construir features que cruzan capas |
| Worktrees | Sesiones separadas, cada una con su copia del repo | La coordinás vos | Una sesión por worktree | Trabajo en paralelo sin pisar archivos (feature + bugfix) |
| Headless / SDK | Proceso lanzado desde código o CI | Por código: JSON, streams | Según uso | CI, pipelines y productos propios |
.claude/worktrees/ a tu .gitignore.Una sesión hace de líder: crea tareas, lanza teammates y une resultados. Los teammates trabajan cada uno en su contexto y se hablan entre sí. Es una función experimental y viene apagada.
TaskCompleted y TeammateIdle como controles de calidad (exit 2)El mismo loop, herramientas, hooks, subagentes, MCP y skills de Claude Code, programables desde Python o TypeScript para meterlos en tu propia aplicación.
| Querés… | Usá |
|---|---|
| Trabajar en la terminal | Claude Code CLI |
| Correr el agente en tu app | Agent SDK |
| Llamar a la API y armar el loop | Client SDK |
| Que Anthropic hostee el agente | Managed Agents |
Se autentica con API key. Anthropic no permite que productos de terceros ofrezcan login de claude.ai ni sus límites de uso.
Más agentes no es mejor por defecto: cada uno suma tokens, coordinación y posibilidades de error.
Cuánta memoria hace falta, qué modelo entra en tu máquina, cómo darle a un modelo conocimiento que no tiene, y cuándo vale la pena entrenarlo.
Un modelo abierto en tu máquina cambia el costo por token por costo de hardware, y la calidad de frontera por control total.
CLI y servidor local con API en el puerto 11434. El más simple para empezar.
App de escritorio con interfaz gráfica y servidor compatible con APIs populares.
El motor de bajo nivel detrás de muchos: formato GGUF y máxima configuración.
Framework de Apple optimizado para Apple Silicon (memoria unificada).
Cuantizar es guardar cada parámetro con menos bits. Una regla útil: memoria ≈ parámetros × bytes por parámetro, más un 20–30% extra para el contexto (KV cache).
Bajar de 16 a ~4,8 bits por parámetro reduce la memoria a menos de un tercio, con una pérdida de calidad pequeña.
Solo pesos, sin contexto. Q4_K_M es el punto de partida habitual en Ollama.
Estimado a ~0,6 GB por billón de parámetros; los de Qwen3.6, medidos en la librería de Ollama.
El factor que manda es la memoria disponible para la GPU (VRAM) o la memoria unificada en una Mac. Esta es una guía de partida a octubre de 2026; el panorama cambia cada pocos meses.
| Hardware | Modelos que entran (Q4) | Para qué alcanza |
|---|---|---|
| GPU de 8 GB · laptop de 16 GB | 7–12B, por ejemplo Gemma 4 12B | Chat, resúmenes, clasificación, embeddings y autocompletado |
| GPU de 24 GB · Mac de 32 GB | Qwen3.6 27B (~19 GB) o 35B-A3B MoE (~24 GB) | Coding local razonable; el mejor punto calidad/hardware hoy |
| Mac de 64–128 GB · 2 GPUs | 70B densos o MoE medianos | Calidad cercana a modelos cloud de gama media |
| Servidor multi-GPU (8× H100) | Kimi K2.6, GLM-5.x, DeepSeek | Open-weight de frontera, para self-hosting empresarial |
Para usar un modelo como agente de código, Ollama recomienda 64K tokens de contexto o más. Más contexto = más memoria.
Para tareas agénticas el modelo tiene que soportar tool calling. Revisá las capacidades en la ficha del modelo.
Un modelo más chico que responde rápido suele servir más que uno grande que satura la memoria.
Ollama descarga el modelo, lo sirve en localhost:11434 y expone una API propia y otra compatible con la de Anthropic.
/statusRetrieval-Augmented Generation: en vez de esperar que el modelo “sepa” tu documentación, buscás los fragmentos relevantes y se los pasás en el prompt. El modelo responde con esa evidencia y puede citarla.
Ollama para embeddings y generación, NumPy como “base vectorial”. Alcanza para entender el mecanismo antes de sumar una base de datos real.
Ollama devuelve vectores normalizados (largo 1), así que D @ q ya es la similitud coseno de la pregunta contra cada documento.
Limitar al modelo a la evidencia recuperada reduce que invente. Pedile además que diga cuándo el contexto no alcanza.
/api/embed, /api/chat). Requiere ollama pull embeddinggemma y pip install requests numpy.La mayoría de las respuestas malas de un RAG vienen de recuperar el fragmento equivocado, no del modelo. Anthropic midió cuánto baja la tasa de fallos en la recuperación (top-20) al combinar técnicas:
Menos es mejor. Promedio sobre varios dominios de prueba.
−35%, −49% y −67% de fallos respecto de la base.
Los embeddings captan significado; BM25 encuentra términos exactos como códigos de error, IDs o nombres de funciones. Combinados se cubren entre sí.
Antes de indexar, un LLM le agrega a cada chunk una o dos frases que lo ubican en su documento (“este fragmento es de la sección de mora tardía…”).
Un modelo reordena los mejores candidatos (por ejemplo 150) y te quedás con los más relevantes (por ejemplo 20).
Las tres le dan al modelo algo que no trae de fábrica, pero resuelven problemas distintos. Muchas veces la respuesta correcta es la más simple.
| Contexto largo + caching | RAG | Fine-tuning (LoRA) | |
|---|---|---|---|
| Cuándo | La base entra en el prompt (menos de ~200K tokens) | Base grande o que cambia seguido | Cambiar estilo, formato o comportamiento |
| Conocimiento nuevo | Sí, todo en el prompt | Sí, lo relevante en cada consulta | Malo para hechos; bueno para formas |
| Actualizar datos | Editar el prompt | Reindexar los documentos que cambiaron | Volver a entrenar |
| Esfuerzo inicial | Casi nulo | Medio: pipeline e índice | Alto: dataset curado y GPU |
| Riesgo típico | Costo por turno si no usás caché | Recuperar el fragmento equivocado | Sobreajuste y olvido de capacidades |
LoRA congela los pesos del modelo y entrena solo unas matrices chicas (adaptadores) que se suman a ciertas capas. QLoRA hace lo mismo sobre el modelo cargado en 4 bits, y así entra en una sola GPU.
GB de VRAM, mínimos según Unsloth. Un 8B con QLoRA entra en una GPU de consumo.
Fijar un formato de salida, un tono, un dominio con jerga propia o una tarea muy repetida con un modelo chico y barato.
Enseñarle datos que cambian: para eso, RAG.
exit 2 bloquea la acción y le explica a Claude por quécode.claude.com/docs
code.claude.com/docs/en/agent-sdk
anthropic.com/engineering
docs.ollama.com · huggingface.co
.env.