Урок 07

Tools: инструменты агента

Tools расширяют возможности агента: он может вызывать PHP-код, запрашивать БД, обращаться к API.

Создание

php artisan make:tool LookupOrder

Базовая структура

namespace App\Ai\Tools;

use Illuminate\Contracts\JsonSchema\JsonSchema;
use Laravel\Ai\Contracts\Tool;
use Stringable;

class LookupOrder implements Tool
{
    public function description(): Stringable|string
    {
        return 'Находит заказ по ID и возвращает его статус.';
    }

    public function schema(JsonSchema $schema): array
    {
        return [
            'order_id' => $schema->integer()->required(),
        ];
    }

    public function handle(array $arguments): string
    {
        $order = Order::find($arguments['order_id']);

        if (!$order) {
            return 'Заказ не найден';
        }

        return "Заказ #{$order->id}: статус {$order->status}";
    }
}

Подключение к агенту

use Laravel\Ai\Contracts\HasTools;

class SupportAgent implements Agent, HasTools
{
    use Promptable;

    public function instructions(): string
    {
        return 'Ты — агент поддержки. Используй инструменты для поиска заказов.';
    }

    public function tools(): array
    {
        return [
            new LookupOrder,
            new IssueRefund,
        ];
    }
}

Модель сама решает, когда вызвать инструмент.

Схема инструмента

public function schema(JsonSchema $schema): array
{
    return [
        'order_id' => $schema->integer()->required(),
        'include_items' => $schema->boolean(),
    ];
}

Обработка

public function handle(array $arguments): string
{
    // валидация, бизнес-логика
    return $result;
}

handle() получает аргументы, которые выбрала модель.

Валидация аргументов

public function handle(array $arguments): string
{
    $orderId = $arguments['order_id'] ?? null;

    if (!is_int($orderId)) {
        return 'Ошибка: order_id должен быть числом';
    }

    // ...
}

Безопасность

Tools выполняют PHP-код. Всегда:

  • Валидируй аргументы
  • Используй allowlist для колонок и таблиц
  • Redact敏感ные данные
  • Ограничивай количество строк
private const ALLOWED_COLUMNS = [
    'users' => ['id', 'name', 'email'],
    'orders' => ['id', 'total', 'status'],
];

MaxSteps

Ограничение на количество вызовов tools:

#[MaxSteps(5)]
class SupportAgent implements Agent

Без лимита агент может зациклиться.

Итоги

  • make:tool создаёт инструмент
  • description() и schema()
  • handle() выполняет логику
  • Модель решает, когда вызывать
  • Валидация обязательна
  • MaxSteps защищает от циклов