Руководство по пользовательским агентам
Установка, инструментирование, методы событий, рабочий пример и типичные проблемы.
Используете фреймворк?
LangChain, CrewAI, LlamaIndex и Pydantic AI инструментируют себя одним вызовом.
Установка
failproofai-sdk и импортируется в Python как failproofai_sdk. Дополнительные пакеты для фреймворков, такие как failproofai-sdk[langgraph], устанавливают сам фреймворк; адаптеры всегда поставляются в базовом пакете.
Подключение демона Failproof
- Dashboard
- CLI
-
Перейдите в Admin → Keys и создайте ключ с правом
events:add. - Подключите демон Failproof к облаку на машине агента.
- Запустите одну инструментированную сессию, затем найдите её точный ID в Observe → Events.
-
Перейдите в Observe → Sessions, выберите ту же среду и откройте восстановленный след.

Конфигурация
Устанавливается переменной окружения:
События ставятся в очередь в памяти и записываются в фоне каждые
flush_interval секунд, с финальной записью при выходе интерпретатора. Процесс, убитый силой, теряет всё, что ещё не было записано.
Идентичность
Каждое событие принадлежит сессии и агенту. Области заполняют обе, поэтому вы редко их передаёте:session_id или agent_id по-прежнему работает и имеет приоритет. Без ни одной из них вызов выбросит TypeError вместо того, чтобы излучить событие, которое облако молча отбросит.
Идентичность ездит на переменных контекста. Она автоматически следует за
asyncio задачами, но не новыми потоками — оборачивайте рабочий процесс в failproofai_sdk.propagate() или его события окажутся неприкреплёнными.Каталог событий
Пятнадцать методов. Большинство идут парами — вы вызываете открывающий, затем закрывающий, и SDK измеряет разницу.
Три стоят отдельно:
error, human_pause, human_interrupt.
Каждое поле для каждого метода
Каждое поле для каждого метода
Каждый метод также принимает
session_id и agent_id, которые области заполняют для вас. Все оставленное как None удаляется вместо отправки как JSON null, и каждый метод возвращает None.Спаривание и длительность
Одно правило: дайте закрывающему событию тот же идентификатор, что и его открывающий. Это то, что их спаривает и позволяет SDK измерить разницу.
Не передавайте
duration_ms сами. SDK измеряет это, и передача его выбросит ValueError.
Единственное исключение — model_response, где только вы знаете реальную задержку провайдера. Передайте целое число миллисекунд — число с плавающей точкой выбросит, потому что столбец — это 32-битное целое число и в противном случае окажется пустым.
Граничные случаи
Граничные случаи
- Идентификаторы нужно делать уникальными только для своего вида, в каждой сессии. Вызов инструмента и хук могут поделиться одним; две сессии, запущенные одновременно, могут переиспользовать одни и те же идентификаторы без столкновений.
- Они не привязаны к агенту. Пара, открытая под одним агентом и закрытая под другим, по-прежнему совпадает — что является нормальным случаем в многоагентном коде.
request_idопционален, но рекомендуется. Без него события модели спариваются в порядке их поступления, поэтому два одновременных вызова в одном агенте могут неправильно спариться.- Пара, разбитая между процессами, по-прежнему совпадает в облаке, но SDK не может измерить это — ничто в обоих процессах не видело обе половины.
- Максимум 10 000 открывающих событий ожидают закрывающего одновременно. Сверх этого самое старое выбрасывается, поэтому утечка не может расти бесконечно.
Ваши собственные поля
Любой дополнительный ключевой аргумент, который вы передаёте, хранится с событием:Decimal, set, bytes, объект модели — хранится как строка.
Эти пять имён зарезервированы и отклоняются сразу: timestamp, session_id, agent_id, type, environment.
Доставка и проверка
- Dashboard
- CLI
В Observe → Events сначала проверьте наличие
agent_start и agent_end в конце. Затем откройте Observe → Sessions и подтвердите, что события модели, инструмента, человека, хука и ошибки появляются в намеченном порядке. Используйте ID сессии как основной ключ для устранения неполадок.$FAILPROOFAI_HOME/custom-agents/events, иначе ~/.failproofai/custom-agents/events. Файлы JSONL доказывают излучение SDK; растущий spooling указывает на конфигурацию демона или доставку, в то время как пустой spooling указывает на инструментирование или время жизни процесса.
Проверяйте spooling только когда демон остановлен. Пока он работает, он собирает и удаляет каждый пакет в течение миллисекунд, поэтому перечисление каталога расходится со сборщиком и показывает намного меньше событий, чем было излучено.

