О проекте
Команда: Legion v2
Кейс HackAlem.ai: Спецтрек — Казахтелеком
Стадия: Рабочий MVP
Задача кейса: Агент, сравнивающий документы оргструктуры до и после реорганизации
Суть
Агент сравнения документов оргструктуры до и после реорганизации. Показывает граф преобразований подразделений, сопоставление функций и выводы о потерях, дублировании и конфликтах со ссылками на исходные пункты, а также формирует заключение в Markdown.
Как устроено
Пара DOCX отправляется в FastAPI (POST /api/analyze). Детерминированный парсер извлекает подразделения и функции, модуль сравнения сопоставляет их: сначала резервирует точные назначения, различает виды полномочий и снижает число ложных передач. Модуль evidence привязывает каждый вывод к документу, пункту и цитате. Интерпретационные выводы получают статус NEEDS_REVIEW. Опциональный режим semantic через LLM-адаптер (Astra/OpenAI) распознаёт переименования и пишет аналитическую записку. UI на React/TS показывает граф, таблицы, панель оснований и журнал agent_trace.
Ключевые решения
- DOCX parsing
- deterministic unit/function matching
- evidence grounding with citations
- semantic LLM adapter
- known-answer smoke tests
- Playwright E2E
Особенности
У каждого вывода есть ссылка на документ, пункт и фрагмент, а неподтверждённый вывод никогда не показывается как подтверждённый. Детерминированный режим работает без ключа, и есть smoke-тест с известным ответом на сгенерированных синтетических DOCX. В интерфейсе честно разделены метки LIVE ANALYSIS и DEMO DATA. Работа шла по чекпоинтам с документированной проверкой.
Стек
Python · FastAPI · React · TypeScript · Vite · pytest · Playwright
Модели
OpenAI · Astra
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-3dda91b6-legion-v2.
README
README.mdOrgLens AI
Explainable Organizational Change Agent · HackAlem AI 2026 · спецтрек «Казахтелеком».
Текущие проверки интеграции и исправления сопоставления: checkpoint 5. Предыдущие проверки: checkpoint 4, checkpoint 3 и checkpoint 2.
Совместный запуск без API-ключа и документов организатора
Node.js 22.13+ и Python 3.12+. Команды Windows PowerShell выполняются из корня репозитория. Для первой установки зависимостей нужен интернет; после установки deterministic-анализ работает локально. .env, OpenAI-ключ и документы организатора для этого пути не нужны. Освободите порты 8000 и 5173. Backend и frontend запускаются в двух терминалах:
# Терминал 1
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-lock.txt
$env:ANALYSIS_MODE = 'deterministic'
.\.venv\Scripts\python.exe -m uvicorn backend.app:app --host 127.0.0.1 --port 8000
# Терминал 2
npm ci
$env:VITE_USE_MOCK = 'false'
$env:VITE_API_BASE_URL = ''
npm run dev
Откройте http://127.0.0.1:5173. По умолчанию пользовательские DOCX идут в настоящий backend через Vite proxy; OpenAI-ключ для детерминированного режима не нужен. Метка LIVE ANALYSIS означает запрос к backend, а DEMO DATA — локальный синтетический набор. Режим анализа deterministic / semantic показывается по ответу сервера; LIVE ANALYSIS сам по себе не означает использование LLM. «Загрузить демодокументы» доступно в обоих режимах. Для проверки сборки остановите dev-сервер и запустите npm run build, затем npm run preview -- --port 5173 при работающем backend.
Backend /api/health доступен на порту 8000 напрямую и через frontend /api/health. Секреты остаются только в окружении backend. .env.example содержит настройки обеих частей; backend загружает .env только с явным --env-file .env, Vite читает .env и .env.local (в браузер экспортируются только VITE_*).
Проверка на синтетических DOCX с известными изменениями
Оставьте оба сервера запущенными. В третьем терминале из корня репозитория:
(Invoke-WebRequest -UseBasicParsing http://127.0.0.1:8000/api/health).Content
(Invoke-WebRequest -UseBasicParsing http://127.0.0.1:5173/api/health).Content
.\.venv\Scripts\python.exe -m scripts.smoke_known_answer
Оба health-запроса должны вернуть {"ok":true}, а smoke — завершиться с кодом 0 и строками PASS. Скрипт не запускает backend: по умолчанию обращается к уже работающему http://127.0.0.1:8000, создаёт синтетические DOCX и отправляет их настоящим HTTP-запросом с mode=deterministic. Ключ и документы организатора не используются; OpenAI не вызывается.
В ignored-каталоге artifacts/known-answer/ появятся known-before.docx, known-after.docx, expected.json и deterministic-response.json. Для проверки UI выберите эти два DOCX на странице 5173 и нажмите «Анализировать изменения». Должны отображаться LIVE ANALYSIS и «Детерминированный анализ», затем граф, функции, выводы, источники и Markdown-экспорт. Это настоящий backend на синтетических входных документах, не semantic-запуск Astra и не встроенный DEMO DATA.
Smoke проверяет заранее заданные изменения и точность ссылок на источники конкретного синтетического примера. Это проверка воспроизводимости, не измерение точности продукта. Переименование и заключение модели проверяются только отдельным платным --mode semantic; для обычного запуска этот параметр не нужен. Адрес и каталог можно изменить через --base-url и --output-dir.
GET /api/demo требует локальные контрольные DOCX и без них возвращает 404. Кнопка frontend «Загрузить демодокументы» использует собственный синтетический набор и работает без этих файлов и без backend.
Problem
После реорганизации нужно сопоставить подразделения и функции двух редакций документов: кто сохранился, кому передали ответственность, где появились потери, дублирование и потенциальные конфликты. Вывод без ссылки на исходный пункт трудно проверить.
Solution
Русскоязычная панель сравнения «до → после»: граф преобразований, таблица функций и карточки выводов. Для каждого существенного вывода можно открыть документ, пункт, фрагмент, объяснение и рекомендацию. Итоговое заключение собирает результаты в одном месте.
What is implemented
- Выбор пары DOCX до 10 МБ каждый для API и однокнопочный синтетический демосценарий.
- Раздельные
LIVE ANALYSIS/DEMO DATA, ожидание ответа API и повторный запуск через «Сбросить демо». - Сводные показатели, граф подразделений, сопоставление функций и список выводов.
- Панель оснований с явным статусом «Требует проверки» (
NEEDS_REVIEW). - Аналитическое заключение со скачиванием в Markdown; состояния загрузки, недоступности API, некорректного ответа и пустого списка выводов.
- Сохранённый синтетический demo и подключённый через адаптер настоящий FastAPI backend.
- Предупреждения сервера и «Действия сервиса» после ответа; аналитическая записка с её статусом и основаниями в заключении и Markdown, если она пришла от CORE.
Architecture
React + TypeScript + Vite. UI получает общий объект анализа через сервисный адаптер; деморежим возвращает локальный JSON. API-адаптер отправляет POST /api/analyze с multipart/form-data: before_file и after_file.
Контракт результата: analysis_id, before_document, after_document, units, transformations, function_matches, findings, summary. Перед показом валидатор проверяет поля, ссылки на ID, основания и согласованность счётчиков. Правила адаптации ответа CORE к UI: API_CONTRACT.md; исходные типы — src/types.ts.
Frontend и автоматические проверки
Для запуска только frontend из корня проекта (API-анализ требует backend из инструкции выше; локальный DEMO DATA работает без него):
npm ci
npm run dev
Откройте локальный адрес из вывода Vite. Для полного набора проверок нужны установленный Google Chrome и Python-зависимости из requirements-lock.txt. Перед E2E остановите запущенный вручную backend на 8000 клавишами Ctrl+C: тесты поднимают собственный сервер. Освободите также порты 5175–5177. В отдельном PowerShell:
$env:VITE_USE_MOCK = 'false'
$env:VITE_API_BASE_URL = ''
$env:LIVE_SEMANTIC_SMOKE = '0'
npm test
npm run build
npm run test:e2e
npm test проверяет адаптер и оба формата данных. E2E использует установленный Google Chrome: порты 5175 (локальное synthetic demo), 5176 (ответы и ошибки API с перехватом запросов) и 5177 (production build + настоящий CORE без перехвата). Live-тест использует локальные DOCX из data/, а при их отсутствии создаёт синтетические DOCX внутри репозитория и отправляет их в настоящий backend. Это проверка интеграции, не качества на документах организаторов. Тесты запускают собственный backend из .venv на 8000 в режиме deterministic; перед запуском освободите этот порт.
Перед E2E выполните npm run build с VITE_USE_MOCK=false либо без этой переменной и с пустым VITE_API_BASE_URL. Тестовые frontend-порты должны быть свободны. Playwright хранит временные профили внутри artifacts/tmp, результаты — в test-results и playwright-report.
По умолчанию включён реальный API. Для автономного mock-режима можно создать .env.local:
VITE_USE_MOCK=true
Реальный API используется при VITE_USE_MOCK=false или отсутствии этой переменной. Vite dev/preview перенаправляет /api на http://127.0.0.1:8000; при отдельном адресе сервера задайте VITE_API_BASE_URL, например http://localhost:8000. Сервер должен разрешать запросы с адреса frontend через CORS либо быть доступен за общим origin. После изменения переменных перезапустите Vite; для готовой сборки выполните npm run build заново. Секреты в VITE_* не хранятся: эти значения попадают в клиентскую сборку.
Demo
«Загрузить демодокументы» → «Анализировать изменения» → этапы обработки → «Обзор изменений», «Сравнение функций», «Риски и выводы» → открыть основание → раздел «Заключение» → «Сформировать заключение» → «Скачать заключение». Для повторения нажмите «Сбросить демо». Подготовленное demo доступно и в API-режиме; его выбор не отправляет запрос на сервер.
Для live-показа выберите два DOCX вместо демодокументов. До ответа показано ожидание без вымышленных процентов и стадий; после ответа «Действия сервиса» показывает распознанные завершённые действия из agent_trace. Это журнал действий, не поток прогресса и не chain-of-thought. При сбое можно явно перейти к DEMO DATA, не меняя сборку.
Сценарий на 2–3 минуты · Резервный показ · Ответы жюри · Текст для сдачи.
Data
Все данные, названия документов и цитаты в демосценарии синтетические. Это не документы Казахтелекома. Сюжет: 3 подразделения становятся 4; «Цифровое развитие» разделено на «ИТ» и «Цифровые продукты», «Внутренний контроль» переименован в «Риски и комплаенс», «Эксплуатация сети» сохранена. Набор содержит 5 передач функций, 1 возможную потерю, 2 дублирования и 1 потенциальный конфликт.
В mock-режиме выбранные пользователем файлы не разбираются и не отправляются на сервер; кнопка анализа для них отключена. Результат доступен после выбора «Загрузить демодокументы». Индикатор этапов имитирует работу агента только в этом сценарии. При анализе своих файлов в API-режиме показано ожидание ответа без вымышленных этапов.
Limitations
- Реальные DOCX обрабатываются backend CORE. PDF/TXT/OCR не поддерживаются; UI согласован с ограничением 10 MiB.
- Confidence в mock задан вручную и не является откалиброванной вероятностью.
VERIFIEDв демо означает наличие подготовленных оснований в синтетическом наборе, а не независимую проверку реальных документов.- В live-анализе интерпретационные выводы и аналитическая записка CORE остаются
NEEDS_REVIEW. Неполные основания отображаются с предупреждением; неподтверждённый вывод не превращается в подтверждённый. - Отсутствие функции в новой редакции и потенциальный конфликт требуют экспертной проверки:
NEEDS_REVIEW. Нельзя считать отсутствие найденной цитаты доказательством отсутствия функции. - Backend в режиме
semanticформирует заключение модели с источниками (summary.analytical_note). Frontend показывает и экспортирует его вместе со статусом и основаниями; непосредственно LLM он не вызывает. Это не юридическое заключение. - Аутентификация, серверное хранение и производственная обработка конфиденциальных документов не реализованы.
Backend CORE — запуск, анализ и evidence lock
Backend MVP для HackAlem AI 2026, спецтрек Казахтелеком. Сравнивает два DOCX и возвращает структурированный JSON с подразделениями, функциями, отношениями и точными источниками.
Быстрый запуск backend (Windows PowerShell, Python 3.12+)
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-lock.txt
$env:ANALYSIS_MODE = 'deterministic'
.\.venv\Scripts\python.exe -m uvicorn backend.app:app --host 127.0.0.1 --port 8000
Swagger: http://127.0.0.1:8000/docs. Машиночитаемый контракт: http://127.0.0.1:8000/openapi.json.
requirements-lock.txt фиксирует проверенное окружение, включая тестовые зависимости. Диапазоны прямых зависимостей находятся в requirements.txt и requirements-dev.txt.
DOCX → JSON через CLI
После успешного scripts.smoke_known_answer можно повторно обработать созданную им пару через CLI. Для самого CLI работающий HTTP-сервер не нужен:
.\.venv\Scripts\python.exe -m backend.cli artifacts\known-answer\known-before.docx artifacts\known-answer\known-after.docx --mode deterministic --output artifacts\known-answer\cli-comparison.json
CLI принимает любые два DOCX, а не только контрольные редакции. artifacts/, входные DOCX и .env исключены из Git. Сохраняемый JSON содержит исходные фрагменты; он остаётся локальным. В репозитории нет копий документов или готового ответа на контрольный dataset.
Документы организатора в data/ — необязательные локальные входные данные для отдельных проверок: одна редакция *_8_*.docx и одна *_9_*.docx. Не копируйте их в Git. Их отсутствие не мешает запуску приложения и проверке smoke_known_answer.
Режимы анализа
По умолчанию deterministic: работает без ключа и сети, извлекает явные перечни подразделений и функции из контекста обязанностей, ищет точные и близкие текстовые соответствия. FUNCTION, RIGHT, PROHIBITION различаются; запреты наследуются вложенными пунктами. При неоднозначном назначении функции ownership_status=NEEDS_REVIEW.
semantic использует официальный OpenAI SDK, Responses API и строгий JSON schema. Модель предлагает переименования, разделения, объединения, переносы, изменения функций, риски и аналитическое заключение. Python принимает только существующие ID объектов и источников с правильной стороны сравнения; цитаты и номера пунктов модель не генерирует. Инструкции внутри документов считаются данными. Источник: установленный SDK openai.resources.responses.responses.Responses.parse.
Для семантического режима задайте OPENAI_API_KEY и OPENAI_MODEL=gpt-6-astra в локальном .env либо окружении процесса сервера. Не передавайте ключ через API, CLI-аргумент или Git. .env.example — образец без секретов. Установленное окружение имеет приоритет над .env.
# Сначала заполните OPENAI_API_KEY и OPENAI_MODEL в локальном .env.
$env:ANALYSIS_MODE = 'semantic'
.\.venv\Scripts\python.exe -m uvicorn backend.app:app --env-file .env --host 127.0.0.1 --port 8000
Сначала проверьте доступ проекта минимальным запросом. Затем запустите полный анализ через HTTP (обе команды платные, выполняются отдельно от тестов):
.\.venv\Scripts\python.exe -m scripts.smoke_openai --env-file .env
.\.venv\Scripts\python.exe -m scripts.smoke_api --env-file .env --mode semantic --output artifacts\api-semantic.json
Семантический запрос передаёт извлечённый текст документов в OpenAI с store=False. Для Astra используется reasoning.effort=low; модель возвращает строгую структуру с ID, а Python подставляет оригинальные цитаты. Доступ к модели зависит от API-проекта. Без ключа/модели возвращается HTTP 503; при ошибке нет скрытого переключения на другой режим или модель. CLI поддерживает --mode semantic --env-file .env.
Таймаут обращения к OpenAI — 120 секунд, автоматические повторы отключены. Frontend и HTTP smoke ждут до 150 секунд. Детерминированный путь остаётся доступен через ?mode=deterministic; /api/demo всегда использует его.
Отдельная платная проверка полного браузерного сценария с Astra и локальными DOCX организатора (после npm run build, порт backend 8000 должен быть свободен):
$env:LIVE_SEMANTIC_SMOKE = '1'
npx playwright test --project=live
Remove-Item Env:LIVE_SEMANTIC_SMOKE
Обычный npm run test:e2e использует детерминированный backend и не вызывает OpenAI. Семантическая проверка подтверждает загрузку DOCX, ответ модели, отображение результата/источников и экспорт заключения с NEEDS_REVIEW.
Evidence lock и границы MVP
Каждый источник содержит document, section, точный text и clause_id. Для проверки должны совпасть все четыре поля. Буквенные подпункты получают адрес вида 3.4.а из реального номера родителя и буквы в документе. У текста без номера section=null; такая ссылка не подтверждает вывод. Текст из ячеек таблиц читается в порядке XML документа. Текст изображений не распознаётся.
VERIFIED в MVP используется для наблюдаемого сохранения названия подразделения и точного сохранения функции с явным владельцем в обеих редакциях. Пустая, неверная или нерелевантная ссылка не даёт этот статус. Все интерпретационные findings и семантическое заключение остаются NEEDS_REVIEW, даже если их цитаты существуют: цитата сама по себе не доказывает перенос, потерю, конфликт или дублирование. Отсутствие соответствия в этих документах не доказывает прекращение функции в организации.
Счётчики изменений в summary отражают кандидатов, включая непроверенные. БВА учитывается как родительский блок, поэтому контрольные перечни дают 3 и 5 единиц, включая сам БВА. Извлечённые функции включают записи прав и запретов, помеченные kind. Неявные подразделения, свободная форма полномочий и сложная нумерация могут требовать ручной проверки; ограничения отражены в warnings. Не поддержанные форматы нумерации не реконструируются догадками.
Один запрос обрабатывается синхронно в рабочем потоке. Очереди, БД и внешнего поиска нет. agent_trace — список выполненных стадий в готовом ответе, не поток прогресса и не chain-of-thought. API не сохраняет загруженные документы и результаты постоянно.
Ограничения: 10 MiB на DOCX, 40 MiB суммарного распакованного содержимого на DOCX; семантический payload до 600 000 символов, без молчаливого усечения. Поддерживаются DOCX, не PDF/XLSX/OCR. Сервер MVP предназначен для локального запуска.
API и проверка
Подробный контракт и примеры ошибок: docs/API.md.
.\.venv\Scripts\python.exe -m pytest -q
.\.venv\Scripts\python.exe -m pip check
.\.venv\Scripts\python.exe -m compileall -q backend tests
git diff --check
Дополнительная проверка с локальными документами организатора: требует обе редакции в data/; на чистом клоне без этих файлов её пропустите. Скрипт сам запускает временный сервер и завершает его:
.\.venv\Scripts\python.exe -m scripts.smoke_api --output artifacts\api-comparison.json
Синтетические DOCX создаются тестами в памяти. Тесты реальных редакций запускаются при наличии файлов в data/, иначе пропускаются. OpenAI SDK тестируется через локальный HTTP mock; это не подтверждает доступность модели или качество живого семантического анализа.
Авторы коммитов
История коммитов
- 2026-09-23 16:32docs: accept product7 rehearsal and record submission readinessDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:32merge: include verified deterministic and offline demo rehearsalDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:30docs: record deterministic and offline demo rehearsalDarkhan-05
- 2026-09-23 16:28docs: add verified project timeline and delivery reportDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:23docs: record checkpoint5 tests and actual Astra browser verificationDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:19merge: checkpoint5 reserves repeated responsibility assignmentsDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:19merge: include product6 ownership and permission regression coverageDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:17core5: reserve exact assignments before matching repeated dutiesDESKTOP-4H9TC39\MrProper
Все коммиты (40)
- 2026-09-23 16:14test: verify CORE4 ownership and permission regressionsDarkhan-05
- 2026-09-23 16:09docs: record checkpoint4 verification and product5 regression resultDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:08Merge remote-tracking branch 'origin/codex/core-4' into codex/product-6Darkhan-05
- 2026-09-23 16:07merge: include product5 deterministic robustness checksDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:04merge: finish core4 permission classification controlsDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:04core4: retain permission type in mixed responsibility listsDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:04test: add deterministic document robustness coverageDarkhan-05
- 2026-09-23 16:00merge: core4 quality control fixesDESKTOP-4H9TC39\MrProper
- 2026-09-23 16:00merge: checkpoint 4 includes verified startup and submission docsDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:59core4: reduce false transfers and execution conflict signalsDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:51docs: verify keyless startup and prepare submissionDarkhan-05
- 2026-09-23 15:46docs: record checkpoint 3 verification and prepared live demoDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:39merge: core3 ownership and semantic validation fixesDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:39merge: checkpoint 3 combines core fixes and product readinessDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:38core3: validate semantic text and correct explicit function ownershipDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:37product: explain semantic errors and prepare Astra demoDarkhan-05
- 2026-09-23 15:20merge: checkpoint 2 integrates live Astra and product UIDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:09merge: core2 live Astra backendDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:06docs: record verified live Astra results and PC2 handoffDESKTOP-4H9TC39\MrProper
- 2026-09-23 15:00product2: harden live/demo fallbackDarkhan-05
- 2026-09-23 15:00product2: connect UI to live backendDarkhan-05
- 2026-09-23 14:56core2: harden Astra adapter and add explicit live smoke checksDESKTOP-4H9TC39\MrProper
- 2026-09-23 14:22checkpoint 1: integrate core and productDESKTOP-4H9TC39\MrProper
- 2026-09-23 14:14merge: integrate core and product checkpoint 1DESKTOP-4H9TC39\MrProper
- 2026-09-23 14:01merge: checkpoint 1 coreDESKTOP-4H9TC39\MrProper
- 2026-09-23 13:54product: add complete organizational analysis demo flowDarkhan-05
- 2026-09-23 13:52core: add grounded comparison and semantic adapterDESKTOP-4H9TC39\MrProper
- 2026-09-23 13:52core: expose analysis API and document golden pathDESKTOP-4H9TC39\MrProper
- 2026-09-23 13:46product: add findings and evidence drawerDarkhan-05
- 2026-09-23 13:44product: add transformation graph and analysis contractDarkhan-05
- 2026-09-23 13:43core: add deterministic DOCX parserDESKTOP-4H9TC39\MrProper
- 2026-09-23 13:27product: scaffold React UIDarkhan-05
Структура репозитория (69 файлов)
.env.example .gitignore API_CONTRACT.md DEMO.md DEMO_BACKUP.md JUDGES_QA.md README.md SUBMISSION.md backend/__init__.py backend/app.py backend/cli.py backend/comparison.py backend/evidence.py backend/extraction.py backend/parser.py backend/pipeline.py backend/schemas.py backend/semantic.py docs/API.md docs/CHECKPOINT2.md docs/CHECKPOINT3.md docs/CHECKPOINT4.md docs/CHECKPOINT5.md docs/CORE2_HANDOFF.md docs/CORE3_HANDOFF.md docs/CORE4_HANDOFF.md docs/CORE5_HANDOFF.md docs/DEMO_REHEARSAL_REVIEW.md docs/PRODUCT5_REVIEW.md docs/PROGRESS_REPORT_2026-09-23.md index.html package-lock.json package.json playwright.config.ts public/favicon.svg requirements-dev.txt requirements-lock.txt requirements.txt scripts/smoke_api.py scripts/smoke_known_answer.py scripts/smoke_openai.py src/App.tsx src/components/AnalysisMetadata.tsx src/components/Conclusion.tsx src/components/EvidenceDrawer.tsx src/components/TransformationGraph.css src/components/TransformationGraph.tsx src/data/demo.json src/main.tsx src/services/analysis.test.ts src/services/analysis.ts src/styles.css src/types.ts src/vite-env.d.ts tests/api.spec.ts tests/conftest.py tests/demo.spec.ts tests/live.spec.ts tests/robustness.spec.ts tests/test_analysis.py tests/test_api.py tests/test_docx_parser.py tests/test_evidence.py tests/test_known_answer.py tests/test_ownership.py tests/test_quality_controls.py tests/test_semantic.py tsconfig.json vite.config.ts
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.