AAYMA
RU
Войти

Граф денег

Рабочее место AML-аналитика: по трём Parquet-файлам строит направленный граф переводов (81 seed → 2 248 клиентов), выделяет группы Louvain…

Доведённый продукт
Команда «HIBEKA» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: HIBEKA
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Доведённый продукт

Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)

Суть

Рабочее место AML-аналитика: по трём Parquet-файлам строит направленный граф переводов (81 seed → 2 248 клиентов), выделяет группы Louvain, назначает 6 ролей и ранжирует клиентов для проверки; есть интерактивный граф и опциональный ИИ-аналитик с function calling.

Как устроено

Pipeline валидирует Parquet (схемы, суммы, согласованность связей с операциями) и строит направленный граф в NetworkX. Считаются PageRank, betweenness, обороты, степени и достижимость от seed, кластеризация Louvain. Правила назначают роли (consolidator, distributor, transit, terminal, coordinator, peripheral), приоритет — взвешенная сумма процентилей (0.30 betweenness + 0.20 PageRank + 0.20 оборот + 0.15 upstream-seed + 0.15 степень) с раскладкой вкладов. FastAPI с фоновым процессом публикует снимки run_id и CSV, React + Cytoscape.js показывают очередь, карточку и локальный граф; чат на OpenAI Responses API (gpt-5.4-mini) вызывает только инструменты чтения данных.

Ключевые решения

  • NetworkX
  • PageRank
  • betweenness centrality
  • Louvain
  • rule-based роли
  • percentile scoring
  • function calling
  • анализ чувствительности к весам

Особенности

Прозрачный приоритет с сохранением исходных значений, нормализаций и вкладов, сравнение с сортировкой по обороту и проверка чувствительности к весам; воспроизводимые снимки запусков с контрольными суммами; LLM не ставит роли и приоритеты, а только отвечает через разрешённые инструменты чтения (включая поиск путей между клиентами).

Стек

Python · FastAPI · Uvicorn · Pydantic · NetworkX · NumPy · SciPy · PyArrow · React · TypeScript · Vite · Cytoscape.js

Модели

gpt-5.4-mini (OpenAI Responses API)


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-119e9d43-hibeka.

README

README.md

Граф денег — HIBEKA

Объяснимый анализ внутрибанковских переводов для AML-аналитика. Проект команды HIBEKA для HackAlem AI превращает граф переводов в очередь клиентов для дополнительной проверки: показывает наблюдаемую роль каждого клиента, его связи, основания приоритета и ограничения исходных данных.

Результат — гипотезы для аналитика, не доказательство нарушения и не вероятность мошенничества.

1. Какую проблему решаем

В исходной выборке 81 клиент (seed), от которых собраны исходящие переводы на четыре колена. Получившийся граф содержит 2 248 клиентов. Аналитику нужно понять, кого изучать первым, как связаны участники и на чём основан вывод.

«Граф денег» объединяет проверку исходных файлов, расчёт сетевых признаков, правила ролей, ранжирование и интерактивное изучение клиента. Решение предназначено для специалиста финансового мониторинга, а не для автоматического принятия санкционных решений.

2. Что реализовано

  • Загрузка и проверка трёх Parquet-файлов: схемы, идентификаторы, суммы, даты, наличие клиентов и согласованность агрегированных связей с операциями.
  • Направленный граф: входящие и исходящие суммы, число операций и контрагентов, PageRank, посредничество, достижимость от исходных клиентов.
  • Кластеризация Louvain: группы клиентов, внутренний оборот, ведущие участники и объяснимая гипотеза о наблюдаемой структуре группы.
  • Шесть ролей: сборщик (consolidator), распределитель (distributor), кандидат на транзит (transit), возможный конечный получатель (terminal), связующий узел (coordinator), периферийный/неопределённый (peripheral).
  • Рейтинг проверки: пять факторов с сохранением исходных значений, нормализации, весов и вкладов в итоговый балл.
  • Рабочее место аналитика: очередь с серверной пагинацией по 30 клиентов, точный поиск полного gid, фильтры роли, группы, seed и границы выборки.
  • Карточка клиента: объяснения, показатели, предупреждения, таблицы отправителей и получателей, копирование точного gid.
  • Интерактивный локальный граф: направление переводов, цвета ролей/групп, выбор клиента, сведения о связи, масштабирование и развёрнутый просмотр.
  • Фоновая обработка загрузок: состояния выполнения, сообщения об ошибках, выбор готового анализа и скачивание трёх CSV.
  • Воспроизводимость: снимок входов и конфигурации, контрольные суммы, версии библиотек, время этапов и сохранение предыдущего успешного результата.
  • Диагностика рейтинга: сравнение с сортировкой по обороту и проверка чувствительности к весам.
  • ИИ-аналитик (опционально): чат по выбранному анализу и клиенту, запросы к серверным данным, поиск связей между клиентами, просмотр операций по датам, источники ответа и переход к упомянутым клиентам. Нужен OpenAI API.

Основной интерфейс работает с реальным FastAPI. Оставшиеся в исходниках mock-модули первого этапа не подключены к рабочему приложению; ошибка API не заменяется демонстрационными данными.

3. Как работает решение

  1. Пользователь запускает анализ локальных файлов или загружает три Parquet через интерфейс.
  2. Сервер проверяет данные и строит направленный граф, сохраняя изолированных клиентов и встречные переводы.
  3. Рассчитываются кластеры, признаки, роли и приоритеты по config.json.
  4. Результат публикуется как отдельный завершённый запуск с собственным run_id.
  5. Аналитик открывает очередь, ищет клиента, изучает карточку и переходит к контрагентам через таблицу или граф.
  6. Для дальнейшей работы скачивает роли всех клиентов, группы и рейтинг.

При настроенном ИИ-аналитике можно задать вопрос обычным языком. Сервер передаёт модели контекст выбранного анализа и выполняет только разрешённые инструменты чтения. Модель формирует текстовый ответ; роли и приоритеты по-прежнему рассчитывает локальный pipeline, а не LLM.

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

Как формируется приоритет

При настройках по умолчанию:

priority = 0.30 × P(посредничество)
         + 0.20 × P(PageRank)
         + 0.20 × P(входящая + исходящая сумма)
         + 0.15 × min(число достижимых upstream-seed / 3, 1)
         + 0.15 × P(число входящих + исходящих связей)

P — процентиль среди положительных значений у неизолированных клиентов. У изолированных клиентов приоритет равен нулю. Роль и сила её признаков не входят в формулу приоритета. Фильтры интерфейса не пересчитывают баллы.

Веса и пороги — экспертные правила, а не обученная модель. Подробные формулы, порядок выбора ролей и ограничения: методика анализа. Фактические примеры: проверка рейтинга.

4. Технологии

КомпонентИспользуемые технологии
СерверPython, FastAPI, Uvicorn, Pydantic 2
АналитикаNetworkX: PageRank, betweenness, Louvain; NumPy, SciPy
ДанныеPyArrow, Parquet; JSON-снимки и CSV-выгрузки
ИнтерфейсReact 19, TypeScript, Vite 7, CSS
ВизуализацияCytoscape.js
Загрузка файловMultipart HTTP, python-multipart; отдельный Python-процесс расчёта
ПроверкиPython unittest, Node.js test runner, TypeScript, ESLint, Prettier

Версии прямых зависимостей закреплены в requirements.txt и frontend/package.json; для фронтенда сохранён package-lock.json.

В панели чата Markdown-ответы отображаются через react-markdown.

AI-модель: в опциональном чате используется OpenAI Responses API через Python SDK openai; модель по умолчанию в коде — gpt-5.4-mini, меняется через OPENAI_MODEL. Настройки читаются через python-dotenv и переменные окружения. Собственная модель на датасете не обучается.

Ассистент использует function calling: приложение исполняет разрешённые запросы к данным и передаёт результаты модели. Описание механизма: официальная документация OpenAI.

Основной анализ, граф, очередь и CSV после установки зависимостей работают локально, без API-ключа, GPU и внешних банковских сервисов. Только чат требует интернет, ключ и доступную квоту OpenAI API; он передаёт данные внешнему сервису. Его доступность не является условием расчёта рейтинга.

5. Архитектура проекта

flowchart TD
    Files["Три файла Parquet"] --> CLI["run.py"]
    Files --> UI["React: загрузка, очередь, карточка, граф"]
    UI -->|"/api"| API["FastAPI"]
    API -->|"Загрузка и статус"| Worker["Фоновый Python-процесс"]
    CLI --> Pipeline["Единый аналитический pipeline"]
    Worker --> Pipeline
    Pipeline --> Validate["Валидация → граф → кластеры → признаки → роли и рейтинг"]
    Validate --> Snapshot["out/runs/run_id: JSON, CSV, отчёт, исходные файлы"]
    Snapshot -->|"Чтение готового результата"| API
    API -->|"Данные выбранного запуска"| UI
    API -->|"Вопрос и контекст, опционально"| Assistant["ИИ-аналитик: инструменты чтения"]
    Snapshot --> Assistant
    Assistant <-->|"Responses API"| OpenAI["OpenAI: gpt-5.4-mini по умолчанию"]
backend/app/
  main.py           FastAPI и диагностические методы
  runs.py           Загрузка, готовые запуски, карточки, граф и CSV
  jobs.py           Управление фоновым процессом и его состоянием
  worker.py         Точка входа фонового расчёта
  validation.py     Проверки Parquet и согласованности данных
  local_graph.py    Локальное окружение выбранного клиента
  assistant.py      OpenAI-чат, конфигурация, ограничения и ошибки
  assistant_tools.py  Инструменты чтения и поиска путей для ИИ
  analytics/        Граф, кластеры, признаки, роли, рейтинг, pipeline
backend/tests/      Проверки аналитики, данных и HTTP-загрузок
frontend/src/
  App.tsx           Рабочее место аналитика
  api/client.ts     Типизированный HTTP-адаптер
  state/review.ts   Выбор клиента, поиск, фильтры и пагинация
  hooks/            Загрузка ресурсов и защита от устаревших ответов
  components/       Карточка, граф, загрузка и другие элементы интерфейса
frontend/tests/     Проверки состояния, адаптеров и утилит
data/               Предоставленные три Parquet-файла
docs/               Методика и разбор рейтинга
starter/            Исходная заготовка организаторов
config.json         Версии, пороги и веса аналитики
run.py              Полный анализ одной командой
out/                Создаваемые результаты; не включены в Git

CLI и загрузка через API используют один pipeline. Готовые результаты читаются из снимка, без повторного расчёта центральностей при открытии карточки. База данных и отдельный брокер задач не используются.

6. Установка и запуск

Требования

  • Python 3.12 или новее; локально проверено на Python 3.12.14.
  • Node.js 22.13+ из ветки 22 или 24+, npm.
  • Для приведённых команд — macOS/Linux и терминал.
  • Свободные порты 8000 для API и 5173 для интерфейса.

Python 3.9 не подходит. Команда python3 на компьютере может запускать именно его. После создания окружения ниже используется явный путь .venv/bin/python, поэтому активация в каждом новом терминале не требуется.

Шаг 1. Получить проект

git clone https://github.com/BAITC-Hacks/hack-119e9d43-hibeka.git
cd hack-119e9d43-hibeka

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

Шаг 2. Установить зависимости

python3.12 --version
node --version
npm --version
python3.12 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
npm --prefix frontend ci

Если команда python3.12 отсутствует, сначала установите Python 3.12+ или укажите команду уже установленной подходящей версии. Если корректная .venv уже создана, повторно создавать её не нужно. После получения обновлений повторите установку зависимостей: новые модули openai, python-dotenv и react-markdown должны присутствовать локально, даже если вы не включаете чат.

Шаг 3. Выполнить полный анализ

.venv/bin/python run.py --data ./data --out ./out --config ./config.json

Команда печатает идентификатор запуска, количество клиентов, кластеров и время расчёта. Создаются три обязательных файла:

ФайлСодержимое
out/nodes_roles.csvВсе клиенты: gid, role, role_score, cluster_id, priority_score, evidence
out/clusters.csvГруппы: cluster_id, n_nodes, n_seed, sum_kzt_internal, top_gids, hypothesis
out/top_nodes.csvРейтинг: rank, gid, role, priority_score, why

По умолчанию выгружаются первые 50 клиентов. Для топ-20 добавьте --top-n 20; минимально допустимое значение — 20. Если клиентов меньше, выгружаются все с предупреждением.

Для предоставленных данных ожидаются 2 248 клиентов и 91 кластер при текущей конфигурации. CSV используют UTF-8 и запятую; при открытии в табличном редакторе импортируйте gid как текст, иначе возможна потеря точности длинного идентификатора.

Шаг 4. Запустить API — первый терминал

.venv/bin/python -m uvicorn backend.app.main:app --host 127.0.0.1 --port 8000

Сервер остаётся работающим. Проверка из другого терминала:

curl http://127.0.0.1:8000/api/health

Ожидаемый ответ: {"status":"ok"}. Интерактивная документация API: Swagger UI.

Шаг 5. Запустить интерфейс — второй терминал

Из корня того же проекта:

npm --prefix frontend run dev

Откройте интерфейс. Vite проксирует /api на 127.0.0.1:8000. Приложение автоматически открывает последний завершённый анализ. Если шаг 3 пропущен, можно загрузить три файла через интерфейс.

Для остановки нажмите Ctrl+C в терминале соответствующего сервера. Подробности интерфейса: frontend/README.md.

ИИ-аналитик — необязательная настройка

Основной сценарий работает без ключа. Чтобы включить чат, создайте .env в корне проекта по шаблону .env.example. Если файл уже есть, добавьте недостающие настройки, не перезаписывая другие значения:

OPENAI_API_KEY=ваш_серверный_ключ
OPENAI_MODEL=gpt-5.4-mini

Ключ хранится только на сервере: не добавляйте его в Git, сообщения чата или переменные VITE_*. Переменные окружения имеют приоритет над .env. Сервер читает настройки при запросе; после добавления ключа нажмите «Обновить статус» в панели. Наличие ключа в статусе не подтверждает его валидность, доступ к модели или наличие квоты.

Без ключа чат показывает инструкцию подключения. Ошибки авторизации, квоты, соединения и времени ожидания отображаются отдельно. Реальный ответ требует доступной модели и средств/квоты соответствующего API-проекта.

Передача данных: при вопросе в OpenAI отправляются текст вопроса, часть истории, контекст анализа и результаты запрошенных инструментов, в том числе идентификаторы, суммы, связи и даты. Используйте чат только если такая передача разрешена для ваших данных. Параметр store=False в запросе не делает обработку локальной.

Сборка интерфейса

npm --prefix frontend run build
npm --prefix frontend run preview

Сборка проверяет TypeScript и создаёт frontend/dist. Локальный просмотр доступен на порту 4173; API должен продолжать работать.

Если что-то не запускается

СимптомЧто проверить
python: command not foundИспользуйте .venv/bin/python либо активируйте окружение: source .venv/bin/activate
Ошибка int | float или model_validatorВерсию .venv/bin/python --version и установку зависимостей именно в эту среду; системный Python 3.9 не подходит
Нет готовых анализовВыполните шаг 3 или загрузите все три файла через интерфейс
API недоступен или возвращает HTMLЗапущен ли FastAPI на порту 8000; после изменения Vite-конфигурации перезапустите фронтенд
После обновления не найден CytoscapeПовторите npm --prefix frontend ci
HTTP 409 при новом анализеДождитесь завершения текущего расчёта; одновременно доступен один слот

7. Как проверить решение

Сценарий для жюри

После установки и запуска:

  1. Убедитесь, что сводка показывает 2 248 клиентов, 3 119 связей и 4 840 переводов за июль 2026.
  2. Перейдите на следующую страницу очереди, примените фильтр роли или группы, затем сбросьте его.
  3. Введите полный gid 100000004403675100 и нажмите Enter. При текущих данных и настройках это 19-е место, роль coordinator, входящие 182 980 ₸ и исходящие 264 699 ₸. Посмотрите основания приоритета и связи: этот клиент не входит в топ-20 простой сортировки по обороту.
  4. Выберите контрагента в таблице или узел графа. Убедитесь, что карточка и окружение относятся к новому выбранному клиенту.
  5. Найдите 100000000018102100. У клиента нет исходящих, но он находится на границе четвёртого колена: система предупреждает о неполноте наблюдения, а не уверенно объявляет его конечным получателем.
  6. Скопируйте gid, скачайте три CSV через меню «Скачать CSV».
  7. Загрузите файлы из data/ как новый анализ, дождитесь завершения и убедитесь, что появился отдельный запуск.
  8. Если OpenAI настроен и передача данных разрешена, откройте ИИ-аналитика и спросите: «Объясни роль выбранного клиента». Сверьте ответ и источники с карточкой. Без ключа проверьте сообщение о необходимости подключения.

Эти идентификаторы — примеры из предоставленного датасета, не специальные ветки алгоритма. Для любого другого клиента можно проверить фактические значения и правила в карточке и результатах анализа.

Автоматические проверки

Из корня проекта:

.venv/bin/python -m unittest discover -s backend/tests -v
npm --prefix frontend run typecheck
npm --prefix frontend run lint
npm --prefix frontend run format:check
npm --prefix frontend test
npm --prefix frontend run build

Серверные тесты проверяют валидацию, графовые показатели, роли, экспорт, воспроизводимость, реальные HTTP-загрузки, статусы и сбои фоновых процессов. HTTP-тестам нужен доступ к свободному локальному порту. Проверки используют временные папки и не изменяют предоставленные исходные данные.

Фронтенд-тесты проверяют состояние выбора, пагинацию, фильтры, запоздавшие ответы, HTTP-адаптер, точность идентификаторов, форматирование и копирование. Часть тестов относится к сохранённому mock-слою первого этапа. Отдельного компонентного или end-to-end-фреймворка в проекте нет. Эти тесты не подтверждают качество или доступность ответов внешней LLM; живой запрос к OpenAI проверяется отдельно и расходует API-квоту.

Где смотреть основания и воспроизводимость

В out/runs/<run_id>/ сохраняются:

  • inputs/ и config.json — исходные файлы и применённые параметры;
  • analysis.json — признаки, кандидатные роли, объяснения и связи;
  • run_report.json — статус, сводка, предупреждения, SHA-256 входов, конфигурации и CSV, версии библиотек, длительности этапов;
  • role_diagnostics.json — диагностика ролей;
  • ranking_review.md, ranking_sensitivity.json — сравнение с оборотом, десять изменений весов на ±20% и пять исключений отдельных факторов;
  • три обязательных CSV.

out/latest указывает на последний успешный снимок. При одинаковых входах, конфигурации, коде и среде CSV воспроизводимы; время и идентификатор запуска меняются. Ошибка нового расчёта не подменяет предыдущий успешный результат. CLI возвращает код 1 и сохраняет диагностику в out/failed/.

8. Данные и интеграции

Входной набор

В репозитории находятся предоставленные для кейса файлы:

ФайлОдна строкаОбязательные столбцы
data/nodes.parquetКлиентgid, depth, is_seed
data/edges.parquetАгрегированная направленная параsrc, dst, sum_kzt, n_tx, depth
data/transactions.parquetОтдельная операцияsrc, dst, date, sum_kzt

Параметры выборки: 81 seed, 1–31 июля 2026 года, четыре колена по исходящим переводам, порог 5 000 KZT. Итог: 2 248 клиентов, 3 119 направленных пар, 4 840 операций. Общее число клиентов не зашито в алгоритм.

Суммы при проверке агрегируются в целых тиынах; допустимое расхождение суммы пары — 0,01 KZT. Одинаковые строки операций сохраняются: без transaction_id нельзя утверждать, что это ошибочные дубликаты. gid хранится как целое число в Python и как строка в JSON/браузере.

API приложения

МетодНазначение
GET /api/healthДоступность сервера
GET /api/runsСписок запусков
POST /api/runsЗагрузка трёх файлов и запуск анализа
GET /api/runs/{run_id}Статус, сводка и отчёт
GET /api/runs/{run_id}/nodesОчередь с фильтрами и пагинацией
GET /api/runs/{run_id}/nodes/{gid}Карточка и контрагенты
GET /api/runs/{run_id}/graph?gid={gid}Локальный направленный граф
GET /api/runs/{run_id}/clustersГруппы готового анализа
GET /api/runs/{run_id}/exports/{filename}Один из трёх обязательных CSV

Параметры очереди: offset, limit (1–500), role, cluster_id, is_seed, truncated_by_depth, min_priority (0–1). Поиск интерфейса — точный запрос карточки по полному gid, а не поиск по имени или подстроке. Граф поддерживает hops=1, limit=1..150; ограничение отображения не сокращает таблицы контрагентов.

Загрузка через API, альтернативная форме интерфейса:

curl -X POST http://127.0.0.1:8000/api/runs \
  -F 'nodes=@data/nodes.parquet' \
  -F 'edges=@data/edges.parquet' \
  -F 'transactions=@data/transactions.parquet'

Сервер возвращает HTTP 202 с run_id. Статусы: queued → running → completed либо failed. Состояние запрашивается через GET /api/runs/{run_id}; при ошибке расчёта причина находится в error.message. Лимит сохраняемого файла — 128 MiB. Занятый слот даёт 409, превышение лимита — 413, некорректный запрос — 422. Ошибки содержимого Parquet обнаруживаются во время фонового расчёта.

Дополнительно есть диагностические /api/data/summary, /api/graph/summary, /api/clients/metrics и /api/clusters. Они пересчитывают данные папки data/ при запросе, а не читают выбранный снимок загруженного анализа.

Инструменты ИИ-аналитика

  • GET /api/assistant/status — наличие настройки и выбранная модель.
  • POST /api/runs/{run_id}/assistant — вопрос message, необязательный selected_gid и история history. Ответ содержит answer, sources, client_ids, модель и число обращений к инструментам.

Доступны семь инструментов только для чтения: get_overview, list_clients, get_client, get_counterparties, get_clusters, find_connection, get_transactions. Поиск пути ограничен шестью шагами и может учитывать направление; операции фильтруются по датам. Источники формируются сервером, а переходы к клиентам разрешаются для идентификаторов из полученных данных. Это не автоматическая проверка истинности каждой фразы ответа модели.

Сервер ограничивает вопрос 4 000 символами, историю 12 сообщениями, исследование 10 вызовами инструментов и шестью раундами; общее ожидание — 120 секунд. Одновременно допускается до двух запросов на процесс сервера. Инструменты не изменяют файлы, роли, оценки или настройки анализа.

По умолчанию API читает результаты из out/. Для другой папки задайте GRAPH_OUTPUT_DIR перед запуском сервера и используйте ту же папку в CLI-параметре --out. Внешних источников персональных данных нет.

9. Ограничения текущей версии

  • Неполное наблюдение. Входящие seed могут отсутствовать; за четвёртым коленом продолжение потока не видно. Разность входа и выхода не является остатком на счёте.
  • Нет подтверждённых меток нарушений. Accuracy, precision и recall не оценивались. Проверка устойчивости не доказывает качество выявления.
  • Роли — гипотезы. coordinator не означает доказанного организатора, peripheral — отсутствие риска. Назначение transit не подтверждает быстрый перевод тех же средств.
  • LLM может ошибаться. Ссылки на источники и доступ только к чтению не гарантируют правильность текста. Нет отдельной оценки качества ассистента или автоматической верификации каждого утверждения. Без сети, подходящего ключа и API-квоты чат недоступен; остальной анализ остаётся локальным.
  • Временной анализ ограничен. Учитываются даты первого входа и длительность наблюдения; поиска транзита за 1–2 дня, временной шкалы, автоматического анализа циклов и прослеживания конкретных денег нет.
  • Масштаб ограничен текущей реализацией. Граф и JSON находятся в памяти, посредничество рассчитывается точно. Работа на миллионе узлов не проверена; необходимые изменения описаны в методике.
  • Локальный граф, не вся сеть. API показывает окружение в один шаг, максимум 150 узлов; интерфейс первоначально ограничивает число контрагентов.
  • Нет постоянного пользовательского состояния. Клиент, фильтры и страница не сохраняются в URL; обновление страницы не восстанавливает выбранную карточку. Нет заметок, статусов расследования и совместной работы аналитиков.
  • Один расчёт на папку результатов. После жёсткого прерывания процесса возможна оставшаяся .analysis.lock; автоматическое восстановление не реализовано. Перед ручной очисткой нужно убедиться, что расчёт завершён, и сохранить диагностику. Логи API-задач: out/jobs/<run_id>/worker.log.
  • Не промышленный банковский сервис. Нет аутентификации, разграничения доступа и аудита действий пользователей; публичное размещение требует дополнительной защиты. Публикация снимков использует символические ссылки; инструкция рассчитана на macOS/Linux.

10. Развёрнутая версия

Подтверждённая ссылка на публично развёрнутую версию в репозитории не указана. Адреса 127.0.0.1 выше — только локальный запуск.

Для размещения собранного интерфейса нужен сервер, раздающий frontend/dist и проксирующий /api в FastAPI. Статический хостинг без работающего API недостаточен. Автоматическая конфигурация развёртывания в текущем репозитории не предоставлена.

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
21
Авторы
2
Файлы
101
Ветки
2

Авторы коммитов

dauka 14Torekhan 7

История коммитов

  • 2026-09-23 17:52feature/ReadmeTorekhan
  • 2026-09-23 17:45Merge pull request #1 from BAITC-Hacks/feature/app-setupdauka
  • 2026-09-23 17:44Merge main into feature/app-setuptamaqazaq
  • 2026-09-23 17:42feature/test-v2Torekhan
  • 2026-09-23 17:42Add AI analyst chattamaqazaq
  • 2026-09-23 17:32bugfix/frontend-v2Torekhan
  • 2026-09-23 17:14Merge branch 'feature/app-setup'Torekhan
  • 2026-09-23 17:12Improve graph analysis interfacetamaqazaq
Все коммиты (21)
  • 2026-09-23 16:33feature/frontend-v2Torekhan
  • 2026-09-23 16:28Merge main into feature/app-setuptamaqazaq
  • 2026-09-23 16:14Add local graph APItamaqazaq
  • 2026-09-23 16:07Add file uploads and background analysistamaqazaq
  • 2026-09-23 15:48Add analysis pipeline and CSV exportstamaqazaq
  • 2026-09-23 15:23Add PageRank and betweenness metricstamaqazaq
  • 2026-09-23 15:13Add graph and client metricstamaqazaq
  • 2026-09-23 14:57feature/frontend-v1Torekhan
  • 2026-09-23 14:50Add dataset validationtamaqazaq
  • 2026-09-23 14:37Add dataset summary endpointtamaqazaq
  • 2026-09-23 14:30Add FastAPI health checktamaqazaq
  • 2026-09-23 14:19Add starter filestamaqazaq
  • 2026-09-23 13:19feature/dataTorekhan
Структура репозитория (101 файлов)
.env.example
.gitignore
README.md
backend/__init__.py
backend/app/__init__.py
backend/app/analytics/__init__.py
backend/app/analytics/clusters.py
backend/app/analytics/config.py
backend/app/analytics/features.py
backend/app/analytics/graph.py
backend/app/analytics/metrics.py
backend/app/analytics/pipeline.py
backend/app/analytics/review.py
backend/app/analytics/scoring.py
backend/app/assistant.py
backend/app/assistant_tools.py
backend/app/data.py
backend/app/jobs.py
backend/app/local_graph.py
backend/app/main.py
backend/app/runs.py
backend/app/validation.py
backend/app/worker.py
backend/tests/test_analysis.py
backend/tests/test_centrality.py
backend/tests/test_data_validation.py
backend/tests/test_dataset_acceptance.py
backend/tests/test_graph.py
backend/tests/test_local_graph.py
backend/tests/test_uploads.py
config.json
data/edges.parquet
data/nodes.parquet
data/transactions.parquet
docs/methodology.md
docs/ranking_review.md
frontend/.env.example
frontend/.gitignore
frontend/.prettierignore
frontend/.prettierrc.json
frontend/README.md
frontend/eslint.config.js
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/src/App.tsx
frontend/src/api/assistant.ts
frontend/src/api/client.ts
frontend/src/api/errors.ts
frontend/src/api/fixtures.ts
frontend/src/api/index.ts
frontend/src/api/mock.ts
frontend/src/api/overview.ts
frontend/src/api/queries.ts
frontend/src/api/validation.ts
frontend/src/components/AppHeader.tsx
frontend/src/components/AssistantPanel.tsx
frontend/src/components/ClientCard.tsx
frontend/src/components/ClientPanel.tsx
frontend/src/components/ClusterTable.tsx
frontend/src/components/CopyGidButton.tsx
frontend/src/components/CounterpartyTable.tsx
frontend/src/components/Icon.tsx
frontend/src/components/LoadingOverview.tsx
frontend/src/components/LocalGraph.tsx
frontend/src/components/PreviewControls.tsx
frontend/src/components/ReviewQueue.tsx
frontend/src/components/RunSummary.tsx
frontend/src/components/SearchFilters.tsx
frontend/src/components/StatusPanel.tsx
frontend/src/components/UploadDialog.tsx
frontend/src/components/WorkspaceShell.tsx
frontend/src/hooks/useOverview.ts
frontend/src/hooks/useResource.ts
frontend/src/main.tsx
frontend/src/state/requestGate.ts
frontend/src/state/review.ts
frontend/src/state/workspace.ts
frontend/src/styles/assistant.css
frontend/src/styles/global.css
frontend/src/styles/review.css
frontend/src/styles/tokens.css
frontend/src/styles/workspace.css
frontend/src/types/api.ts
frontend/src/utils/clipboard.ts
frontend/src/utils/format.ts
frontend/src/utils/gid.ts
frontend/src/utils/graphLayout.ts
frontend/src/utils/graphView.ts
frontend/src/utils/roles.ts
frontend/src/vite-env.d.ts
frontend/tests/overview.test.ts
frontend/tests/review.test.ts
frontend/tests/workspace.test.ts
frontend/tsconfig.json
frontend/vite.config.ts
requirements.txt
run.py
starter/README.md
starter/requirements.txt
starter/starter.py
Ветки (2)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.