El ciclo no ha cambiado, es solo que hay más herramientas
"El bucle no ha cambiado en absoluto, simplemente agregué cosas a la matriz HERRAMIENTAS". - s02_tool_use.pyPalabras originales.
¿A cuántos lugares necesitas moverte para agregar una herramienta?
El agente de S01 solo conoce bash. ¿Cómo lo cambiarías para habilitar también read_file / write_file / edit_file?
La primera reacción de mucha gente es: cambiar de ciclo. equivocado. No toques ni una sola línea del bucle. Solo se necesitan tres cosas:
- Escribe una función de controlador de Python (
run_read(ruta, límite)). - Regístrelo en la tabla de mapeo
TOOL_HANDLERS("read_file": lambda **kw: run_read(...)). - Agregue una declaración de esquema JSON a la matriz
TOOLS(indicándole al modelo cómo se llama la herramienta y qué parámetros acepta).
Cuando el bucle vea un bloque tool_use, presione block.name para buscar la función en el mapa de distribución, ejecutarla y volver a introducir la salida en tool_result. Sigue exactamente el mismo camino que bash.
# Mapa de envío: nombre → controlador lambda TOOL_HANDLERS = { "bash": lambda **kw: run_bash(kw["command"]), "read_file": lambda **kw: run_read(kw["path"], kw.get("limit")), "write_file": lambda **kw: run_write(kw["path"], kw["content"]), "edit_file": lambda **kw: run_edit(kw["path"], kw["old_text"], kw["new_text"]), }
Vea cómo se enruta el envío
El siguiente widget le permite hacer clic en una solicitud tool_use que puede enviar un modelo para ver cómo se enruta a una función de Python específica. Nota: block.name determina qué línea tomar.
safe_path: una línea de defensa que no se puede omitir
Otorgue al agente derechos de acceso a archivos. El fallo de seguridad más probable es el escape de ruta: el modelo debería haber estado funcionando en /home/user/project/, pero terminó enviando un read_file("../../etc/passwd").
Hay una pequeña función en s02 que se ocupa de esto:
def safe_path(p: str) -> Camino: ruta = (WORKDIR / p).resolve() # Normalizar, resolver... y enlaces suaves si no ruta.is_relative_to(WORKDIR): raise ValueError(f"La ruta escapa del espacio de trabajo: {p}") retorno ruta
La clave está en los dos pasos de .resolve() + .is_relative_to(): analizar la ruta absoluta y luego verificar si todavía está en la zona de pruebas. Sin el primero, foo/../../etc puede pasar; sin este último, ni siquiera se realiza ninguna verificación.
Identificar la seguridad del camino
Las siguientes 5 rutas son todos parámetros read_file que puede enviar el modelo. ¿Cuáles serán permitidos por safe_path y cuáles serán rechazados? Supongamos
No agregue herramientas peligrosas al agente.
Es fácil agregar herramientas, pero recuerde: Cada herramienta que agregue es un nuevo límite de capacidad del modelo. En s02, bash ya tiene una lista negra (rm -rf /, sudo, shutdown) y write_file tiene restricciones de safe_path. Hágase tres preguntas antes de agregar herramientas a producción:
- ¿Puede esta herramienta permitir que el modelo haga cosas irreversibles? (rm, enviar correo electrónico, git push)
- ¿Qué puedegotear? (env vars, .ssh, cookies)
- ¿La salida de error se tratará como retroalimentación de comando? (inyección rápida a través de la salida de la herramienta)
La lección s07 agregará una "capa de permiso" para extraer estas decisiones del código y hacerlas declarativas.