О проекте
Команда: San.ai
Кейс HackAlem.ai: Спецтрек — Казахтелеком
Стадия: Рабочий MVP
Задача кейса: Агент, сравнивающий документы оргструктуры до и после реорганизации
Суть
ИИ-агент анализа реорганизации: загружает комплекты DOCX/PDF/XLSX «до» и «после», извлекает подразделения, должности и функции, строит каноническую модель организации и сравнивает версии. Выводы (сохранено/передано/возможно потеряно/дублирование/конфликт) даются с цитатами из источников, к ним прилагаются рекомендации.
Как устроено
Собственные парсеры: DOCX через ZIP/XML, PDF через unpdf/PDF.js, XLSX через fflate и fast-xml-parser. Они дают фрагменты с координатами (абзац, страница, ячейка). OpenAI Responses API со Structured Outputs извлекает сущности, обязанности, права и запреты. Цитата принимается, только если найдена в разобранном тексте. Из извлечения строится Canonical Organization BEFORE/AFTER, comparison engine сопоставляет сущности и функции и формирует findings с evidence и советами. Обработка идёт в фоне с общим пулом конкурентности, данные хранятся в PGlite/PostgreSQL, структура рисуется через Sigma.js/Graphology.
Ключевые решения
- OpenAI Structured Outputs / JSON Schema
- проверка цитат по исходнику
- canonical organization model
- сопоставление функций
- Sigma.js
- Graphology
Особенности
Контракт данных разделяет Document Intelligence и Organization Audit. Для извлечения и для сравнения используются разные модели. Если данных не хватает, вывод помечается как требующий проверки, а не приравнивается к нулю. Непроверяемые ссылки AI отбрасываются.
Стек
Next.js 16 · React 19 · TypeScript · PGlite · PostgreSQL · Sigma.js · Playwright · GitHub Actions · Docker Compose
Модели
gpt-4.1-mini · gpt-6-sol
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-8c2d1c68-san-ai.
README
README.mdSAN.AI
ИИ-агент для анализа организационных изменений и функционала
SAN.AI помогает сотруднику, который анализирует реорганизацию, сравнить документы ДО и ПОСЛЕ, восстановить организационную структуру и функции, найти потенциальные потери, переносы, дублирование и конфликты ответственности, а затем получить объяснимые выводы и рекомендации со ссылками на исходные документы.
Проект создан для кейса HackAlem AI по анализу организационной структуры и функционала. В текущем продукте отдельно зафиксирован контекст кейса АО «Казахтелеком».
1. Какую проблему решает проект
При реорганизации компании изменения распределены по положениям, оргструктурам, должностным инструкциям, приказам и приложениям. Ручное сравнение таких документов занимает время и создаёт риск пропустить:
- функцию, которая исчезла после реорганизации;
- функцию, которая перешла другому подразделению;
- дублирование ответственности;
- потенциальный конфликт функций;
- изменение структуры, которое неочевидно из формулировок документов.
SAN.AI превращает два комплекта документов в сопоставимые модели организации и показывает не только что изменилось, но и на каких фрагментах документов основан вывод.
2. Что реализовано
Документы ДО / ПОСЛЕ
- загрузка нескольких документов в каждый комплект;
- поддержка DOCX, PDF и XLSX;
- локальное хранение файлов на сервере;
- сохранение координат источника: абзац DOCX, страница PDF, лист и ячейки XLSX;
- обработка ошибок чтения без потери исходного файла.
AI-извлечение
- извлечение организационных сущностей и функций через OpenAI Responses API;
- классификация организационных сущностей как подразделение / должность / неизвестный тип;
- извлечение обязанностей, прав и запретов;
- сохранение условий, области функции и типа ответственности;
- проверка цитат: ссылка AI принимается только если подтверждается исходным разобранным документом;
- сохранение и повторное использование успешного результата;
- фоновая обработка, прогресс и отмена задачи.
Canonical Organization
Из результатов извлечения строится единая модель организации:
- подразделения;
- должности;
- функции;
- владельцы функций;
- иерархические связи, когда они подтверждены;
- источники каждого факта;
- отдельные состояния BEFORE/current и AFTER/proposed.
Версия ПОСЛЕ не становится автоматически утверждённой организацией.
Сравнение ДО / ПОСЛЕ
Comparison engine сопоставляет организационные сущности и функции и формирует findings:
- Сохранено;
- Передано;
- Возможно потеряно;
- Дублирование;
- Потенциальный конфликт.
Для каждого обоснованного вывода сохраняются ссылки на исходные фрагменты документов. Если данных недостаточно или модель вернула непроверяемые ссылки, система не подменяет неизвестность нулём: результат помечается как требующий проверки, а выводы о потерях ограничиваются.
Рекомендации
На основе findings система формирует advisory-рекомендации, например:
- уточнить владельца функции;
- устранить пересечение ответственности;
- проверить потенциально потерянную функцию;
- разделить потенциально несовместимые обязанности.
Рекомендации не изменяют организацию автоматически и требуют проверки ответственным сотрудником.
Интерфейс
Основная навигация: Документы → Структуры → Результаты. На итоговом экране — вкладки Изменения / Рекомендации. Возврат сохраняет результаты; изменение комплекта требует обновления структур. Tutorial открывается только вручную.
В текущем приложении доступны:
- загрузка документов ДО / ПОСЛЕ;
- отображение распознанной структуры;
- режимы Схема / Список;
- просмотр source evidence;
- запуск сравнения;
- findings и рекомендации;
- повторный запуск неполного анализа.
3. Основной пользовательский сценарий
- Пользователь загружает документы ДО изменений.
- Загружает документы ПОСЛЕ изменений.
- Система извлекает подразделения, должности, функции и источники.
- Пользователь проверяет распознанную структуру.
- SAN.AI сопоставляет две версии.
- Пользователь получает ключевые изменения и потенциальные риски.
- Любой существенный вывод можно раскрыть до исходной цитаты.
- Система показывает рекомендации для последующей проверки человеком.
Ключевой принцип продукта:
Документы → Структуры → Сравнение → Evidence → Рекомендации
4. Как работает решение
Документы ДО / ПОСЛЕ
│
▼
DOCX / PDF / XLSX parsers
│
▼
Source Fragments
текст + координаты источника
│
▼
OpenAI Structured Extraction
│
▼
Canonical Organization
units / positions / functions / sources
│
▼
Organization Comparison
matching + risk analysis
│
▼
Findings
preserved / transferred / lost / duplicated / conflict
│
├──────────────► Evidence
│ точные цитаты ДО / ПОСЛЕ
▼
Recommendations
│
▼
Web UI
AI используется для смыслового извлечения и сопоставления. Проверка ссылок, ограничения полноты, хранение, состояние current/proposed и публикация результата контролируются серверной логикой.
5. Технологии
Frontend и backend
- Next.js 16
- React 19
- TypeScript 6
- Next.js App Router и Route Handlers
- Lucide React
AI
- OpenAI Responses API
- Structured Outputs / JSON Schema
- модель по умолчанию: gpt-4.1-mini
- API-ключ используется только на сервере
Обработка документов
- DOCX: собственный parser на основе ZIP/XML
- PDF:
unpdf/ PDF.js - XLSX:
fflate+fast-xml-parser
Данные и хранение
- PGlite для локального PostgreSQL-совместимого режима;
- опционально обычный PostgreSQL через
pg; - документы и результаты анализа сохраняются в файловом storage;
- synthetic organizational dataset и графовые компоненты остаются в проекте как отдельный исследовательский стенд.
Визуализация структуры
- Sigma.js
- Graphology
6. Архитектура проекта
Основные части репозитория:
| Путь | Назначение |
|---|---|
src/app/ | страницы приложения и HTTP API |
src/components/ | пользовательский интерфейс |
src/lib/server/ | parsers, storage, AI transport, extraction, comparison |
src/lib/canonical-organization.ts | преобразование extraction в canonical organization |
src/lib/extraction.ts | типы результатов извлечения |
docs/DATA_CONTRACT.md | общий контракт данных |
docs/EXTRACTION.md | логика AI-извлечения |
docs/COMPARISON.md | логика сравнения ДО / ПОСЛЕ |
docs/API.md | HTTP API |
docs/PRODUCT_SPEC.md | актуальная продуктовая спецификация |
tests/ | автоматические тесты |
Разделение ответственности
Document Intelligence
file -> parser -> source fragments -> AI extraction -> verified sources -> canonical organization
Organization Audit
canonical BEFORE + canonical AFTER -> matching -> findings -> evidence -> recommendations
Такой контракт позволяет развивать два блока независимо, не теряя traceability до исходных документов.
7. Установка и запуск
Требования
- Node.js 22+
- рекомендованная версия из
.nvmrc: 22.23.2 - npm
- OpenAI API key для живого AI-анализа
1. Клонировать репозиторий
git clone https://github.com/BAITC-Hacks/hack-8c2d1c68-san-ai.git
cd hack-8c2d1c68-san-ai
Репозиторий HackAlem может быть приватным, поэтому GitHub-аккаунт должен иметь к нему доступ.
2. Установить зависимости
npm ci
3. Создать локальное окружение
cp .env.example .env.local
Добавить в .env.local:
OPENAI_API_KEY=your_key_here
OPENAI_EXTRACTION_MODEL=gpt-4.1-mini
OPENAI_COMPARISON_MODEL=gpt-6-sol
Не публикуйте API-ключ в GitHub.
Для локального режима остальные значения можно оставить по умолчанию:
DATABASE_URL=
PGLITE_DATA_DIR=.data/pglite
DOCUMENT_STORAGE_DIR=.data/documents
4. Запустить приложение
npm run dev
Открыть:
http://127.0.0.1:3000
Опционально: synthetic organizational dataset
Для отдельного графового стенда можно заполнить локальную БД:
npm run db:seed
В локальном режиме PGlite рассчитан на один процесс. Перед db:seed или db:migrate остановите работающий dev/server process.
8. Как проверить решение
Основной сценарий для жюри
Подготовьте два организационных документа или два комплекта документов:
- версия ДО;
- версия ПОСЛЕ.
Подойдут DOCX, текстовый PDF или XLSX.
- Запустите приложение.
- Добавьте документы в комплекты ДО и ПОСЛЕ.
- Нажмите «Построить структуры».
- Проверьте распознанную структуру и source evidence.
- Нажмите «Сравнить ДО и ПОСЛЕ».
- Откройте раздел ключевых изменений.
- Проверьте один из findings:
- сохранённая функция;
- переданная функция;
- возможная потеря;
- дублирование;
- потенциальный конфликт.
- Откройте evidence и убедитесь, что вывод связан с конкретными цитатами из документов.
- Откройте вкладку «Рекомендации».
- Вернитесь к структурам, затем к документам. Добавьте или уберите файл и нажмите «Обновить структуры».
Для контрольного комплекта хакатона ожидаемый способ проверки тот же: известные случаи реорганизации, потери или дублирования должны появиться в findings и иметь проверяемые источники.
Автоматические проверки
npm test
npm run typecheck
npm run lint
npm run build
Проверка frontend P0
На Node.js 22.23.2 прошли 77 тестов, TypeScript, ESLint, production build и 4 браузерных сценария. Браузерные тесты используют синтетические API-ответы без внешних AI-вызовов. Отдельно через настоящий API проверены реальная загрузка DOCX и сохранённые редакции 8/9; их анализ остаётся частичным.
npm run build
npm start -- --port 3014
# В другом терминале:
npx playwright install chromium
npm run test:ux
Для другого сервера: UX_TEST_URL=http://127.0.0.1:3000 npm run test:ux.
Полная матрица DoD, ограничения и передача разработчикам:
UX_REDESIGN_HANDOFF.md.
Smoke-check OpenAI
Проверка соединения и Structured Outputs на синтетических данных:
npm run ai:check
Проверка AI extraction на синтетическом документе:
npm run ai:check-extraction
Проверка comparison engine на синтетическом наборе:
npm run ai:check-comparison
Эти команды делают реальные API-вызовы и требуют OPENAI_API_KEY.
9. Данные и интеграции
Входные данные
Система работает с предоставленными пользователем организационными документами:
- положения;
- организационные структуры;
- должностные инструкции;
- распорядительные документы;
- приложения;
- другие внутренние нормативные документы.
Поддерживаемые форматы текущей версии:
- DOCX;
- текстовый PDF;
- XLSX.
OpenAI
Текст выбранных документов передаётся на серверный OpenAI API для structured extraction и смыслового сравнения.
В запросах используется store: false. API key не передаётся в браузер и не должен храниться в Git.
Хранение
По умолчанию документы и результаты анализа сохраняются локально в:
.data/documents
Путь можно изменить через DOCUMENT_STORAGE_DIR.
PostgreSQL
По умолчанию используется PGlite. Для обычного PostgreSQL можно задать:
DATABASE_URL=postgresql://...
10. Известные ограничения
Текущая версия является hackathon MVP.
- Выводы AI носят рекомендательный характер и требуют проверки ответственным сотрудником.
- Полнота исходного комплекта документов не может быть доказана автоматически.
- Если часть данных не подтверждена источниками, система ограничивает соответствующие выводы.
- OCR для сканированных PDF не реализован: PDF должен содержать текстовый слой.
- Старые форматы
.docи.xlsне поддерживаются. - Формулы XLSX не вычисляются, используется сохранённое значение.
- Автоматическая нормализация всех сокращений и вариантов названий ограничена.
- Сложные сценарии слияния и разделения нескольких подразделений требуют дополнительной проверки.
- Авторизация и multi-tenant разграничение доступа не реализованы.
- Файловое storage рассчитано на текущий серверный MVP, а не на production multi-instance deployment.
- Workforce Alignment, 1C/SAP/HRIS и автоматическая работа с сотрудниками относятся к дальнейшему развитию продукта и в текущий MVP не входят.
- Recommendations не изменяют current organization автоматически.
- Нулевое число findings не является доказательством отсутствия организационных рисков.
11. Развёрнутая версия
Тестовый стенд NVIDIA Brev:
https://3000-ynr8e39a4.gobrev.dev/
Доступ может требовать входа в разрешённый NVIDIA/Brev аккаунт.
Важно: GitHub Actions организации в текущий момент не запускаются из-за зафиксированной в репозитории billing-блокировки, поэтому автоматическая доставка последнего main на Brev не гарантируется. Для проверки актуального состояния проекта используйте локальный запуск из текущего репозитория.
12. Безопасность
- не коммитьте
.env.local; - не публикуйте
OPENAI_API_KEY; - не передавайте реальные корпоративные документы в публичные репозитории;
- перед использованием конфиденциальных данных проверьте внутренние правила компании и допустимость передачи данных внешнему AI-сервису.
13. Полезная документация проекта
- Требования кейса
- Product Spec
- Data Contract
- Document Extraction
- Comparison Engine
- HTTP API
- UX Redesign Spec
- Frontend redesign: DoD и передача работы
Команда
SAN.AI
HackAlem AI, 2026
Раздельные модели AI
Извлечение: OPENAI_EXTRACTION_MODEL, затем прежний OPENAI_MODEL, затем
gpt-4.1-mini. Сравнение: OPENAI_COMPARISON_MODEL, по умолчанию gpt-6-sol.
Для GPT-6 Sol/Astra/Luna сравнение отправляет reasoning.effort: low; для
gpt-4.1-mini reasoning не передаётся. Возврат сравнения к прежней модели:
OPENAI_COMPARISON_MODEL=gpt-4.1-mini. После изменения окружения перезапустите сервер.
Таймаут одного запроса остаётся 90 секунд, всего сравнения — 10 минут.
Кэш сравнения учитывает модель и версию алгоритма. Кэш извлечения сохраняется:
смена модели не запускает повторную обработку документов автоматически.
На Brev окружение хранится в /home/ubuntu/workspace/san-ai/.env.local;
релизы используют ссылку на этот файл. Сначала доставьте обновлённый код.
Перезапуск существующего сервиса: sudo systemctl restart san-ai.
Авторы коммитов
История коммитов
- 2026-09-23 17:50ux: define minimal result screen hotfixNurkhan-kk
- 2026-09-23 17:47feat: models updateAlinur Zhengis
- 2026-09-23 17:35docs: record frontend P0 redesign verification and handoffAlinur Zhengis
- 2026-09-23 17:32Merge branch 'main' of https://github.com/BAITC-Hacks/hack-8c2d1c68-san-aiAlinur Zhengis
- 2026-09-23 17:31feat: UX/UI enhancementsAlinur Zhengis
- 2026-09-23 17:19docs: rewrite README for HackAlem judgingNurkhan-kk
- 2026-09-23 17:11ux: add redesign specification for three-step analysis flowNurkhan-kk
- 2026-09-23 16:57featAlinur Zhengis
Все коммиты (35)
- 2026-09-23 16:54Merge branch 'main' of https://github.com/BAITC-Hacks/hack-8c2d1c68-san-aiAlinur Zhengis
- 2026-09-23 16:52featAlinur Zhengis
- 2026-09-23 16:51perf: accelerate extraction with shared concurrency and background progressShyngys
- 2026-09-23 16:44fix uiShyngys
- 2026-09-23 16:43feat: comparisonAlinur Zhengis
- 2026-09-23 16:22Merge branch 'main' of https://github.com/BAITC-Hacks/hack-8c2d1c68-san-aiAlinur Zhengis
- 2026-09-23 16:22feat: updateAlinur Zhengis
- 2026-09-23 16:21feat: parse PDF and XLSX and visualize document structureShyngys
- 2026-09-23 16:02feat: update uiAlinur Zhengis
- 2026-09-23 15:56feat: add document storage, AI extraction and canonical exportShyngys
- 2026-09-23 15:49docs: record GitHub Actions billing blockerAlinur Zhengis
- 2026-09-23 15:48ci: verify changes and deploy main to BrevAlinur Zhengis
- 2026-09-23 15:47product: point agents to product spec and data contractNurkhan-kk
- 2026-09-23 15:47product: snapshot v0.1 product specificationNurkhan-kk
- 2026-09-23 15:47product: add v0.1 data contractNurkhan-kk
- 2026-09-23 15:47product: add v0.1 product changelogNurkhan-kk
- 2026-09-23 15:46product: add v0.1 product specificationNurkhan-kk
- 2026-09-23 15:42feat: deploy on nvidiaAlinur Zhengis
- 2026-09-23 15:06Merge branch 'main' of https://github.com/BAITC-Hacks/hack-8c2d1c68-san-aiAlinur Zhengis
- 2026-09-23 15:06feat: update uiAlinur Zhengis
- 2026-09-23 15:05feat: parse DOCX documents with source referencesShyngys
- 2026-09-23 14:49feat: validate document source referencesShyngys
- 2026-09-23 14:43feat: project structureAlinur Zhengis
- 2026-09-23 14:26product: define MVP, architectureNurkhan-kk
- 2026-09-23 14:02feat: add TRAlinur Zhengis
- 2026-09-23 13:40chore: ignore macOS metadataAlinur Zhengis
- 2026-09-23 13:33init: hackatonAlinur Zhengis
Структура репозитория (113 файлов)
.env.example .github/workflows/ci-cd.yml .gitignore .nvmrc AGENTS.md README.md SAN_AI_PROJECT_PLAN.md compose.yaml db/migrations/001_organization.sql db/migrations/002_demo_directors.sql docs/API.md docs/AUDIT_SOURCE.md docs/COMPARISON.md docs/DATA_CONTRACT.md docs/DOCUMENT_INTELLIGENCE.md docs/DOCUMENT_SOURCES.md docs/DOCX_PARSING.md docs/EXTRACTION.md docs/OPEN_QUESTIONS.md docs/PRODUCT.md docs/PRODUCT_CHANGELOG.md docs/PRODUCT_SPEC.md docs/RESULT_UI_HOTFIX.md docs/TZ.md docs/UX_REDESIGN_HANDOFF.md docs/UX_REDESIGN_SPEC.md docs/WORKFLOW.md docs/spec-history/PRODUCT_SPEC_v0.1.md eslint.config.mjs next.config.ts package-lock.json package.json playwright.config.ts scripts/check-ai.ts scripts/check-comparison.ts scripts/check-document-formats.ts scripts/check-extraction.ts scripts/deploy/brev-release.sh scripts/migrate.ts scripts/parse-docx.ts scripts/seed.ts src/app/api/branch/route.ts src/app/api/comparisons/route.ts src/app/api/documents/[id]/extract/route.ts src/app/api/documents/[id]/route.ts src/app/api/documents/route.ts src/app/api/graph/route.ts src/app/api/health/route.ts src/app/api/organization/route.ts src/app/api/search/route.ts src/app/documents/page.tsx src/app/globals.css src/app/layout.tsx src/app/page.tsx src/app/structure/page.tsx src/components/app-shell.tsx src/components/comparison-panel.module.css src/components/comparison-panel.tsx src/components/document-extraction-result.tsx src/components/document-onboarding.tsx src/components/document-structure.tsx src/components/document-workspace.module.css src/components/document-workspace.tsx src/components/graph-canvas.tsx src/components/organization-explorer.tsx src/lib/analysis-flow.ts src/lib/branch-layout.ts src/lib/canonical-organization.ts src/lib/comparison.ts src/lib/contracts.ts src/lib/document-structure.ts src/lib/documents.ts src/lib/extraction-client.ts src/lib/extraction-progress.ts src/lib/extraction.ts src/lib/server/ai-models.ts src/lib/server/branch.ts src/lib/server/comparison-store.ts src/lib/server/comparison.ts src/lib/server/db.ts src/lib/server/document-parser.ts src/lib/server/document-sources.ts src/lib/server/document-store.ts src/lib/server/docx-parser.ts src/lib/server/extraction-jobs.ts src/lib/server/extraction-pool.ts src/lib/server/extraction.ts src/lib/server/http.ts src/lib/server/migrate.ts src/lib/server/mock-data.ts src/lib/server/openai-json.ts src/lib/server/organization.ts src/lib/server/seed.ts tests/ai-models.test.ts tests/analysis-flow.test.ts tests/canonical-organization.test.ts tests/comparison-store.test.ts tests/comparison.test.ts tests/document-parser.test.ts tests/document-sources.test.ts tests/document-store.test.ts tests/document-structure.test.ts tests/docx-parser.test.ts tests/e2e/analysis-flow.spec.ts tests/extraction-client.test.ts tests/extraction-jobs.test.ts tests/extraction-pool.test.ts tests/extraction.test.ts tests/helpers/comparison-fixtures.ts tests/helpers/document-fixtures.ts tests/openai-json.test.ts tests/organization.test.ts tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.