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

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

