Lección 02 · Base

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.

⏱ ~10 min · 📝 3 widgets interactivos · 🧑‍💻 Basado en shareAI-lab · s02_tool_use.py

¿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:

  1. Escribe una función de controlador de Python (run_read(ruta, límite)).
  2. Regístrelo en la tabla de mapeo TOOL_HANDLERS ("read_file": lambda **kw: run_read(...)).
  3. 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 WORKDIR = /home/usuario/proyecto.

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.

Interactivo

Widget 1 · Envío de herramientas · Cómo se dirige el uso de herramientas al controlador

Haga clic en una solicitud de uso de herramienta y vea cómo block.name en el bucle encuentra la función correspondiente, la ejecuta y devuelve la salida al bloque tool_result.

模型发来的 tool_use 块
TOOL_HANDLERS 映射表

        
执行结果 · tool_result 块
(点上面任意一条 tool_use 触发路由)
Interactivo

Widget 2 · Camino Seguro · Detección de escape para 5 caminos

Cada ruta será procesada por safe_path(). Suponga que WORKDIR = /home/user/project, haga clic en "Liberar" o "Rechazar"; depende de si su intuición sobre el escape de ruta es precisa.

答对 0 / 5
Interactivo

Widget 3 · Agregar una herramienta · ¿Qué se debe cambiar para agregar una herramienta global al agente?

Suponga que desea agregar una nueva herramienta glob(pattern) para permitir que el agente busque archivos en lotes. Complete los espacios en blanco: Los tres deben cambiarse, ninguno puede faltar.

第 1 处 · 写一个 handler 函数
def run_glob(pattern: str) -> str:
    import glob
    return "\n".join(glob.glob(pattern))
第 2 处 · 注册到 dispatch map(选正确一行)
第 3 处 · 在 TOOLS 数组里加 schema(选正确一组)