АГЕНТ 04 / 07

Структурирование

Воркер структурирования превращает извлечённые фрагменты в канонические записи — нормализованные, дедуплицированные и связанные в граф сущностей, чтобы каждый воркер опирался на единый контекст.

structuringfathom worker

structuring · autonomous

01Что делает

Канонические записи из разрозненных фрагментов

save_contacts01

Сохранять, никогда не дублировать

Записывает структурированные записи в SQLite или PostgreSQL с дедупликацией по существующим данным: одинаковый нормализованный ключ означает слияние, а не новую строку. Опциональные интеграции могут получать каноническую запись.

deterministic autosave02

Модель не может забыть

Управление только через промпт может потерять передачу контекста, если модель пропустит вызов сохранения. Среда выполнения сама сохраняет метаданные от успешных инструментов извлечения и поиска, поэтому структурированные результаты сохраняются для следующего хода.

ContactDb schema03

Пять таблиц — одно досье

contacts, social_profiles, companies, tags и notes — с происхождением источников, метками времени и столбцом crm_id для идемпотентной синхронизации с CRM. Режим WAL, внешние ключи, индексированные запросы.

normalization04

Одно написание на контакт

normalize_email обрезает и приводит к нижнему регистру («[email protected]» → [email protected]); normalize_phone оставляет только ASCII-цифры, сохраняя их в индексируемом столбце phone_norm. Это ключи дедупликации.

merge semantics05

Записи растут, но не разделяются

Старая запись имеет приоритет: пустые поля заполняются из новых данных, соцпрофили переносятся с дедупликацией NOT EXISTS, теги добавляются через UNIQUE(contact_id, tag), заметки накапливаются — дублирующая строка удаляется.

entity graph06

Сущности и связи

Сущности дедуплицируются по (name, type); типизированные связи соединяют людей, проекты, системы и организации. Многошаговый BFS до глубины 4 обеспечивает контекстно-зависимую дальнейшую работу.

02Как это работает

От вывода инструмента до канонического контакта

1

Триггер

Инструмент extraction или discovery возвращает структурированные метаданные с уровнем достоверности и происхождением для текущей миссии.

2

Автосохранение

Runtime сохраняет структурированные элементы сразу после успеха — compaction не удалит передачу, а модель не забудет результат.

3

Нормализация

Email приведены к нижнему регистру, телефоны — к цифрам, происхождение зафиксировано: extract_contacts:mailto link:https://acme.io.

4

Найти или вставить

Одна атомарная транзакция: поиск по нормализованному email, затем по phone_norm. Совпадение → слияние; нет совпадения → вставка. Параллельные воркеры не создадут дубли.

5

Граф

Люди, проекты, системы и организации обновляются как узлы; связи становятся типизированными рёбрами с достоверностью для контекстно-зависимой дальнейшей работы.

6

Синхронизация

Контакты отправляются в amoCRM, Bitrix24 или HubSpot по четыре за раз с повторами; возвращённый crm_id сохраняется, чтобы ресинхронизация обновляла, а не дублировала.

03Под капотом

Схема, ключи и правила слияния

Схемаcontacts(id, email, phone, phone_norm, name, title, company, source, crm_id, created_at, updated_at) · social_profiles · companies · tags · notes
ХранилищеSQLite с WAL + busy_timeout 5000 из коробки · PostgreSQL через тот же интерфейс via [contacts] pg_url
Ключи дедупликациисначала нормализованный email, затем phone_norm только с цифрами · побеждает наименьший id → сохраняется самая старая запись
Слияниепробелы заполнены новыми данными · соцсети перенесены через NOT EXISTS · теги INSERT OR IGNORE · заметки добавлены · временная строка удалена, одна транзакция
Атомарностьfind-or-insert выполняется в одной заблокированной транзакции — параллельные воркеры не могут одновременно вставить одну и ту же нормализованную запись (безопасно от TOCTOU)
Автосохранениесрабатывает при успехе extract_contacts / find_leads независимо от модели · «[авто-сохранено N контакт(ов): X новых, Y слитых]»
ПровенансТеги sources указывают породивший tool и URL источника · уверенность сохраняется как метаданные записи для ревью
Мягкий вводtags/notes принимают JSON-массив или обычную строку; «; » и переводы строк разбивают блоки — дрифт структуры LLM никогда не теряет данные
Дедупликация графаentity_nodes UNIQUE(name COLLATE NOCASE, entity_type) · edges UNIQUE(from, to, relation), уверенность по умолчанию 0.8
МногошаговыйГлубина BFS ограничена 1–4, только простые пути, обратный обход помечен ⁻¹
Отправка в CRMПараллелизм buffer_unordered(4) · одна попытка через 1 с · set_crm_id для идемпотентных повторных отправок

04Инструменты

Что запускает агент

save_contactsextract_contactsfind_leadsmemory

Работает на флот воркеров

Структурированный контакт — это адресат

Структурированные записи дают каждому воркеру единый надёжный субъект, ссылки на источники, теги и заметки. Задача по кодингу, исследованию или операциям может переиспользовать каноническую сущность без повторного парсинга каждого источника или создания дубликатов.

save_contacts([{
  email:  "[email protected]",   # → [email protected]
  name:   "Ann Petrova",
  title:  "CTO",
  company:"Acme",
  socials:[{ platform: "linkedin", url: "…" }],
  tags:   ["saas", "decision-maker"]
}])
→ added: 0 · merged_with_existing: 1

# one canonical record =
# one consistent downstream handoff

Каждой последующей задаче нужен канонический контекст