Інструмент - функція застосунку, яку модель може попросити викликати: знайти замовлення, перевірити залишок, створити заявку. Модель не виконує код сама - вона повертає «виклич інструмент X з аргументами Y», SDK виконує handle і передає результат назад моделі.
php artisan make:tool FindOrder
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Laravel\Ai\Contracts\Tool;
use Laravel\Ai\Tools\Request;
class FindOrder implements Tool
{
public function __construct(private User $user) {}
public function description(): string
{
return 'Знаходить замовлення поточного користувача за номером і повертає статус доставки.';
}
public function schema(JsonSchema $schema): array
{
return ['number' => $schema->integer()->required()];
}
public function handle(Request $request): string
{
$order = $this->user->orders()->where('number', $request['number'])->first();
return $order ? "Статус: {$order->status->label()}" : 'Замовлення не знайдено.';
}
}
// в агенті
public function tools(): iterable
{
return [new FindOrder($this->user)];
}
Головне правило безпеки: модель - недовірений учасник. Її аргументи можуть бути сформовані під впливом тексту від зловмисника (prompt injection у листі, відгуку, документі). Тому:
- авторизація всередині інструмента: шукати замовлення через
$this->user->orders(), а неOrder::find($number)- інакше модель «знайде» чуже замовлення; - мінімальний набір інструментів: агенту підтримки не потрібен інструмент видалення;
- валідація аргументів - схема описує форму, але межі й права перевіряє код;
- обмеження кроків:
#[MaxSteps(5)]- щоб модель не зациклилася у викликах і не спалила бюджет.
Схвалення людиною для незворотних дій: інструмент реалізує Approvable з трейтом InteractsWithApprovals - тоді виконання призупиняється, доки людина не підтвердить дію (повернення коштів, видалення, відправка листа). Для цього агент має зберігати розмову (RemembersConversations), щоб продовжити її після схвалення.
Опис - це інструкція для моделі: від description() і описів полів залежить, чи правильно модель обере інструмент. Пишіть, коли його використовувати і що він повертає.
Що повертати: короткий текст чи JSON лише з потрібними полями. Повертати модель цілком ($order->toJson()) - це зайві токени й ризик віддати моделі внутрішні дані (хеші, нотатки менеджерів), які потім потраплять у відповідь користувачу.