Урок 4. Инструменты

Чтобы LLM мог позвать инструмент, нужен контракт: имя, описание и параметры. Модель читает список инструментов в промпте и отвечает JSON-вызовом, а Harness из урока 3 исполняет его.

Что прочитать

В коде

Спека инструментов для системного промпта:

TOOLS_SPEC = """
- calc(expr: строка) — считает арифметическое выражение, напр. "123*45"
- time() — текущие время и дата
"""

Сами инструменты:

import datetime

def calc(expr):
    # без __builtins__ внутри eval нельзя импортировать — первое ограждение
    return eval(expr, {"__builtins__": {}}, {})

def time():
    return datetime.datetime.now().strftime("%H:%M %d.%m.%Y")
const TOOLS = {
  calc: (args) => Function('"use strict"; return (' + args.expr + ')'),
  time: () => new Date().toLocaleString("ru-RU"),
};

JSON-вызов, который мы ждём от модели (ровно его парсит parse_tool из урока 2):

{"tool": "calc", "args": {"expr": "123*45"}}

Попробуй calc("abs(-3)") — упадёт с ошибкой, потому что abs недоступна. Это не баг, а ограждение: инструмент умеет ровно то, что ему разрешили.

Практика

Добавь третий инструмент для своего агента — например, dice(граней) или flip(). Запиши его спеку (что делает, какие параметры) и реализацию на Python и JS. Проверь руками вызов и JSON-ответ.

Связано: Урок 3. Harness и ограждения, Урок 5. Сборка CLI-агента