01 Qué es un arnés
Un modelo de lenguaje, por sí solo, recibe texto y devuelve texto. No abre archivos, no consulta tu CRM y no recuerda lo que hizo ayer. El arnés (harness) es todo lo que lo convierte en un agente: un bucle que lo llama repetidamente, unas herramientas con las que actuar y un contexto que le dice qué está haciendo. Claude Code es un arnés muy completo; el tuyo puede ser mucho más pequeño y hecho a la medida de un proceso concreto de tu empresa.
Construir el tuyo tiene dos ventajas: el proceso queda escrito y se repite igual cada vez, y si lo diseñas bien no dependes de un único proveedor ni de un único precio.
El bucle
Llama al modelo, ejecuta la herramienta que pide, le devuelve el resultado y repite hasta que no pide nada más.
Las herramientas
Funciones con un nombre, una descripción y un esquema de parámetros. Pocas, claras y con permisos mínimos.
Las instrucciones
El prompt de sistema: rol, objetivo, formato de entrega y cuándo se da la tarea por terminada.
Contexto y memoria
Qué se conserva entre vueltas y entre sesiones: resúmenes, archivos de notas, historial recortado.
La capa de modelo
Una interfaz común para poder cambiar de proveedor sin reescribir el resto.
Límites y verificación
Máximo de vueltas, presupuesto, confirmaciones humanas y un criterio de terminado comprobable.
02 Elige el camino según tu caso
| Camino | Para quién | Ventaja | Límite |
|---|---|---|---|
| Proyecto en la app de Claude | Equipos sin perfil técnico | Instrucciones, archivos y conectores reutilizables sin código | No corre solo ni sale de Claude |
| Claude Agent SDK | Desarrolladores que quieren el motor de Claude Code | Bucle, herramientas y gestión de contexto ya resueltos | Solo modelos Claude (API, Bedrock, Vertex, Foundry) |
| Bucle propio con LiteLLM | Quien necesita cambiar de proveedor o usar modelos locales | Control total y un modelo por configuración | Tú mantienes herramientas, seguridad y memoria |
Quiero automatizar este proceso de mi empresa: [descríbelo paso a paso, quién interviene y qué herramientas se usan hoy]. Antes de escribir código, diseña el arnés: qué herramientas necesita el agente (nombre, qué hace, parámetros y si lee o escribe), qué debe decir su prompt de sistema, qué información debe recordar entre ejecuciones, en qué puntos debe pedir confirmación humana y cuál es la condición de terminado. Recomiéndame uno de estos caminos: Proyecto de Claude, Claude Agent SDK o bucle propio con LiteLLM, y justifica la elección.
03 Camino rápido: el Claude Agent SDK
El Agent SDK de Python te da el mismo motor que usa Claude Code, con sus herramientas (leer, escribir, editar, ejecutar comandos…) y su gestión de contexto. El paquete incluye la CLI de Claude Code, así que no necesitas instalarla aparte. Ten en cuenta que allowed_tools es una lista de herramientas que se aprueban automáticamente, no una lista que limite el resto; para bloquear herramientas usa disallowed_tools.
pip install claude-agent-sdk
import anyio
from claude_agent_sdk import query, ClaudeAgentOptions
opciones = ClaudeAgentOptions(
system_prompt="Eres un asistente que ordena y resume documentos.",
allowed_tools=["Read", "Glob"],
disallowed_tools=["Bash"],
max_turns=10,
)
async def main():
async for mensaje in query(
prompt="Resume en una tabla los archivos .md de esta carpeta.",
options=opciones,
):
print(mensaje)
anyio.run(main)
04 Camino flexible: un bucle propio con LiteLLM
La mayoría de proveedores y de servidores de modelos locales aceptan el formato de chat de OpenAI. LiteLLM traduce ese formato a más de cien modelos, de modo que tu código no depende de ninguno: el modelo pasa a ser una variable de entorno. El ejemplo usa solo herramientas de lectura a propósito; añade las de escritura cuando tengas límites y confirmaciones.
pip install litellm
export ANTHROPIC_API_KEY=tu-clave
export MODELO=anthropic/claude-sonnet-5-5
import json, os
from litellm import completion
MODELO = os.getenv("MODELO", "anthropic/claude-sonnet-5-5")
MAX_VUELTAS = 15
def leer_archivo(ruta):
with open(ruta, encoding="utf-8") as f:
return f.read()[:20000]
def listar_carpeta(ruta="."):
return "\n".join(sorted(os.listdir(ruta)))
HERRAMIENTAS = {"leer_archivo": leer_archivo, "listar_carpeta": listar_carpeta}
ESQUEMAS = [
{"type": "function", "function": {
"name": "leer_archivo", "description": "Lee un archivo de texto",
"parameters": {"type": "object", "properties": {"ruta": {"type": "string"}}, "required": ["ruta"]}}},
{"type": "function", "function": {
"name": "listar_carpeta", "description": "Lista los archivos de una carpeta",
"parameters": {"type": "object", "properties": {"ruta": {"type": "string"}}}}},
]
mensajes = [
{"role": "system", "content": "Analizas documentos de la carpeta actual. Al terminar, responde con el resultado final."},
{"role": "user", "content": "Resume en una tabla los archivos .md de esta carpeta."},
]
for _ in range(MAX_VUELTAS):
msg = completion(model=MODELO, messages=mensajes, tools=ESQUEMAS).choices[0].message
mensajes.append(msg)
if not msg.tool_calls:
print(msg.content)
break
for llamada in msg.tool_calls:
try:
args = json.loads(llamada.function.arguments or "{}")
resultado = HERRAMIENTAS[llamada.function.name](**args)
except Exception as error:
resultado = f"Error: {error}"
mensajes.append({"role": "tool", "tool_call_id": llamada.id, "content": str(resultado)})
else:
print("Límite de vueltas alcanzado sin terminar.")
Tengo un arnés mínimo en arnes.py que usa LiteLLM. Amplíalo así: mueve las herramientas a un módulo herramientas.py con su esquema junto a cada función; añade una herramienta escribir_archivo que solo pueda escribir dentro de la carpeta ./salida y que pida confirmación por consola antes de guardar; guarda un registro de cada vuelta (herramienta, argumentos, duración) en registro.jsonl; y añade un tope de coste usando la información de uso que devuelve LiteLLM. No cambies la forma de elegir el modelo por variable de entorno.
05 Modelos locales con Ollama
Ollama ejecuta modelos abiertos en tu propio ordenador y expone una API local en el puerto 11434. Con LiteLLM basta con cambiar la variable MODELO a algo como ollama_chat/nombre-del-modelo. Es útil para datos que no deben salir de la empresa o como alternativa si un proveedor sube precios, pero sé realista: en un portátil corren modelos pequeños y medianos, y para tareas complejas con herramientas el rendimiento queda lejos de los modelos grandes.
curl -fsSL https://ollama.com/install.sh | sh
ollama run gemma4
Preguntas frecuentes
No. Claude Code es un arnés generalista y muy pulido. Un arnés propio tiene sentido para un proceso concreto que quieres repetir, integrar en tus sistemas o ejecutar con distintos modelos.
No los elimina: cada ejecución consume. Lo que ganas es control sobre qué modelo usas en cada paso, límites de coste y no tener que reconstruir el contexto a mano.
No. Está pensado para modelos Claude a través de la API de Anthropic o de proveedores como Bedrock, Vertex o Foundry. Para mezclar proveedores, usa un bucle propio con LiteLLM.
Depende de tu hardware. Prueba primero un modelo pequeño con soporte de herramientas y mide si completa tu tarea; si falla, usa uno mayor o deja ese paso a un modelo en la nube.
Sobre el autor
Equipo editorial de appyweb
Marketing, SEO y desarrollo con IA
Especialistas de appyweb en SEO, publicidad, desarrollo web y automatización con IA.