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защищает от циклов