1. Як це називається в агента
Тьома зʼїздив по каву й сів поруч. У голові вже склалася схема: подія, обробник, стрілочка, список подій. Залишилося дізнатися, як ця штука називається в агента.
— Називається hook, — каже Льоша. — Українською — «автодія на подію». Це та сама стрілочка, тільки всередині сесії з агентом: сталася певна подія — ви надіслали запит, агент завершив відповідь, агент редагує файл — і привʼязаний обробник спрацьовує сам. Без нагадувань, без «аби не забути». Подія сталася — дія спрацювала, крапка.
— Слухай, так це ж не «попросити агента щось зробити», — Тьома вагається. — Це… налаштувати так, щоб він сам робив.
— От, дійшло, — Льоша задоволений. — Те саме крісло налаштувань, про яке я казав. Один раз повісив hook — і далі воно живе без тебе. Найчастіший перший приклад — після кожного виправлення код сам причісується, ви й пальцем не поворухнули. За годину ловиш себе на тому, що взагалі перестав про це думати. Ось і все.
— Можна детальніше, — Тьома вже приміряє руки. — Де це все налаштовується?
— У файлі проєкту, .claude/settings.json, — киває Льоша. — Туди записують подію і команду, яку треба виконати. А перевірити, що хук підхопився, можна командою /hooks просто в сесії. Запамʼятай саму суть: hook — це дія, привʼязана до події сесії; вона спрацьовує сама — щоразу, а не «коли згадав». Ви вперше налаштовуєте поведінку агента, а не смикаєте його за руку на кожну дію.
2. Журнал, який пишеться сам
— Годі слів, — каже Льоша. — І руками в конфіг лізти не будеш — не панська це справа. Просто попроси ШІ-агента словами, рівно як і свою спеки формулював. Скажи йому: повісь хук.
Тьома так і робить — пише агенту звичайною фразою, як звик:
Повісь hook: на кожен мій запит дописуй його текст із часом у файл requests.log.
Агент не перепитує — береться до роботи сам. Кладе поруч маленький скрипт-обробник .claude/hooks/log-prompt.sh і додає подію в .claude/settings.json — там лежать налаштування проєкту. Льоша розгортає на екрані те, що агент щойно поклав, щоб Тьома побачив усе наживо:
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{ "type": "command", "command": ".claude/hooks/log-prompt.sh" }
]
}
]
}
}
— Зараз я все поясню, не лякайся дужок, — Льоша розбирає рядок за рядком, не даючи Тьомі розгубитися. — UserPromptSubmit — це подія: «користувач надіслав запит агенту», рівно той момент, що ви записали в спеки. Тут навіть фільтр не потрібен — подія одна, вибірково ні на що реагувати не треба. А command — це що виконати: запустити наш маленький скрипт, який і допише рядок у журнал. Пізнаєш? Це твій HOOK_SPEC, тільки мовою агента. Подія, дія, куди писати — усі три графи тут.
— А чому окремий скрипт, а не рядок прямо тут?
— Бо текст вашого запиту агент передає хуку не абияк, а пакетом — у форматі JSON, із яким ми возилися на радарі. Скрипт цей пакет розпакує і витягне сам запит. Подивись, що агент туди поклав: він крихітний.
Льоша відкриває файл .claude/hooks/log-prompt.sh, який агент щойно завів сам:
#!/bin/bash
INPUT=$(cat) # сюди приходить пакет із даними
PROMPT=$(echo "$INPUT" | jq -r '.prompt') # дістаємо з нього текст запиту
echo "[$(date '+%H:%M')] $PROMPT" >> requests.log # дописуємо до журналу
— Три рядки: спіймати пакет, витягти з нього текст запиту, дописати в requests.log із часом. Та сама стрілочка подія → дія, тільки живим кодом. Скрипту потрібен jq — це стандартний інструмент для розбору JSON, і сам файл має бути виконуваним, але це агент зробить за тебе.
— То ж мої три рядки, — Тьома вдивляється. Ота абстрактна стрілочка з минулої лекції — подія → дія — лежить тепер перед ним у вигляді двох файлів: ось подія (UserPromptSubmit), ось дія (command → скрипт), ось файл (requests.log). Не схема на пальцях, а реальне налаштування, яке зараз запрацює.
— Добре, що ми попросили агента створити цей хук. Не хотів би я сам таке писати, — Тьому аж пересмикує. — Добре, що тепер такі речі пише ШІ. Брр.
Льоша перевіряє, що хук на місці, і пропонує працювати як завжди:
/hooks # показує налаштовані хуки — наш UserPromptSubmit має бути тут
Поправ функцію рахунку в Тетрісі.
— /hooks — це команда всередині сесії, показує всі увімкнені хуки. Наш має бути в списку — якщо його там немає, значить, конфіг не підхопився, шукай друкарську помилку. А якщо є — далі просто працюєш, нічого особливого не робиш.
Тьома надсилає запит. І сама собою в requests.log зʼявляється рядок: час і текст того, про що він щойно попросив. Він його не дописував. Надсилає наступний — і зʼявляється ще один рядок.
— Я ж пальцем не поворухнув, — він дивиться на файл, який поповнюється без жодного його руху. Після цього щось зрушило: він більше не веде записи вручну щоразу, він налаштував поведінку один раз. За годину тут буде готовий журнал усіх його запитів, який він не вів жодної секунди.
3. Бонус: нехай скаже «Готово» вголос
— Раз уже можна привʼязувати дії до подій, — Льоша хмикає, — повісимо щось веселе. Хочеш, щоб агент говорив вголос, коли завершить? Це теж hook, тільки на іншу подію — Stop, тобто «агент завершив відповідь». І налаштовуєш його так само — словами, не руками.
Тьома вже без підказки кидає агенту фразу:
Повісь ще hook: коли завершиш відповідь, промовляй «Готово» вголос.
Агент додає в settings.json ще один хук — цього разу на подію Stop:
{
"hooks": {
"Stop": [
{ "hooks": [ { "type": "command", "command": "say 'Готово'" } ] }
]
}
}
— say — це команда вашої операційної системи, яка промовляє текст уголос, — пояснює Льоша. — На macOS вона є з коробки, на інших системах — свої аналоги. Щойно агент завершить задачу, комп скаже «Готово».
— Опа, заговорив! — Тьома аж підстрибує: машина озвалася голосом. — Дворецький, бляха! У мене тепер комп-дворецький: я лежу — він доповідає «усе готово, пане». Як я без цього жив?!
— Ось тут запамʼятай: це важливо, — Льоша одразу ставить межу. — Це не «агент заговорив». Ніхто не ожив. Це ваш хук смикнув системну команду озвучення — ту саму say, ну або іншу під вашу ОС. Ви самі повісили хук «завершив роботу → промов слово». Магія не в ШІ, а в тому, що ви привʼязали дію до події. Дивіться на це саме так: та сама автодія, що й у випадку з журналом, тільки ця — вголос. Але прикольно — так.
— Так, зрозумів, зрозумів, — Тьома киває, а сам то й справа усміхається: компʼютер, що говорить, йому все одно страшенно подобається.
4. Жорстка межа: слід, а не памʼять
І тут Тьома видає:
— То виходить, я зробив журнал — отже, тепер агент усе памʼятає! У нього ніби зʼявилася памʼять, так?
— Ні, — Льоша обриває жорстко, без усмішки. — Ось це найважливіше попередження за весь день, не пропусти. requests.log — це зовнішній слід, файл-журнал зовні. Це не памʼять агента і не «база знань, із якої він щось дізнається». Журнал потрібен вам — щоб бачити, що і коли робилося. Агент від наявності цього файлу розумнішим не став і нічого нового не запамʼятав.
— А в чому тоді різниця? — Тьома хмуриться, не відразу бачить. — Файл же є, у ньому все записано.
— У тому, кому він служить, — Льоша розводить дві речі. — Дивись: hook — це зовнішній журнал плюс автоматична реакція на подію. Те, що ми зараз зробили. А ось памʼять агента — щоб він сам памʼятав контекст між сесіями, упізнавав ваш проєкт завтра — це зовсім інша річ, окрема тема, до неї ще доберемося. Не плутай їх. Сьогодні ми не «полагодили памʼять Claude». Ми завели зовнішній журнал, який пишеться сам. Але це теж круто, погоджуєшся.
— А, точно, — Тьома прокручує в голові й ловить. Вранці він же сам поставив діагноз: проблема не в памʼяті агента, а в тому, що немає журналу зовні. Журнал він і зробив. Памʼять тут узагалі ні до чого.
— Зрозумів, — каже. — Журнал для мене, не для нього. Я собі блокнот завів, а не агенту мізки пересадив.
— Ось тепер правильно, — киває Льоша.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ