# Local LLM Platform

Локальная платформа для работы с моделями под разные задачи: текст, перевод, аудио, видео и 1С.

Архитектура проекта: `core + plugins`.

- `core` содержит общую платформу: реестр моделей, инференс, обучение, eval-тесты, деплой на GPU, хранилище и мониторинг.
- `plugins` содержит прикладные направления: текст, перевод, аудио, видео, фото, 1С.
- Каждый плагин проектируется как будущий отдельный сервис, но на старте живет в одном репозитории.

## Deployment Target

GPU-нагрузки разворачиваются на `docker-gpu.cin.su`.

Секреты, токены, пароли, ключи доступа и приватные датасеты не хранятся в репозитории.

Если `docker-gpu.cin.su` является Windows-хостом с контейнерами на диске `Z:`, используйте runbook `docs/runbooks/windows-docker-gpu-host.md`.

## Structure

```text
LLM/
  core/
    registry/
    inference/
    training/
    evals/
    deploy/
    storage/
    monitoring/

  registry/
    model-cards/
    templates/

  datasets/
    raw/
    prepared/

  plugins/
    text/
    translation/
    audio/
    video/
    image/
    1c/

  docs/
```

## Development Stages

1. Описать реестр моделей и формат model card.
2. Поднять базовый inference API для текстовых моделей.
3. Добавить плагины задач и их минимальные пайплайны.
4. Для 1С сначала сделать RAG и инструменты работы с метаданными.
5. После накопления качественных примеров добавить LoRA/adapter fine-tuning для 1С.
6. Тяжелые плагины постепенно выносить в отдельные контейнеры или сервисы.

## First Inference

Шаблон первого GPU inference-сервиса находится в `core/deploy/docker-gpu/vllm`.

Runbook: `docs/runbooks/first-vllm-inference.md`.
Deployment runbook: `docs/runbooks/deploy-vllm.md`.
GPU preflight: `docs/runbooks/gpu-host-preflight.md`.

Полный GPU-контур после настройки SSH-доступа:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_gpu_stack.ps1 -Pull
```

Посмотреть план без запуска:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_gpu_stack.ps1 -PlanOnly -Pull
```

Первая базовая текстовая модель: `Qwen/Qwen3-4B-Instruct-2507`.

Первая GGUF-модель для 1С/code экспериментов: `bartowski/mistralai_Devstral-Small-2-24B-Instruct-2512-GGUF`, quant `Q4_K_M`.

Исследование следующих кандидатов под 1С: `docs/research/1c-model-candidates.md`.

Набор моделей по одному кандидату на каждый плагин: `plugins/model-bundle.yaml`.

Загрузка набора:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/download_plugin_model_bundle.ps1
```

Проверка model cards:

```powershell
python scripts/validate_model_cards.py
```

Все базовые локальные проверки:

```powershell
python scripts/check_all.py
```

Проверка локального хранилища моделей:

```powershell
python scripts/check_model_storage.py --print
```

Сводный статус платформы:

```powershell
python scripts/collect_platform_status.py --print
```

Список моделей:

```powershell
python scripts/list_model_cards.py
```

Загрузка модели в локальное хранилище:

```powershell
python scripts/download_hf_model.py qwen3-4b-instruct-2507 --dry-run
```

Runbook: `docs/runbooks/download-model.md`.

Чат для ручной проверки моделей:

```powershell
python scripts/model_chat_server.py
```

Runbook: `docs/runbooks/model-chat-testbench.md`.

## 1C RAG

Стартовый контур 1С находится в `plugins/1c`.

Подготовка RAG-корпуса:

```powershell
python scripts/build_1c_knowledge_base.py
```

Отдельные шаги, если нужно управлять ими вручную:

```powershell
python scripts/prepare_1c_rag_corpus.py
```

Построение локального lexical index:

```powershell
python scripts/build_1c_rag_index.py
```

Построение локального SQLite vector index:

```powershell
python scripts/build_1c_rag_vector_index.py
python scripts/search_1c_rag_hybrid.py "реквизиты справочника номенклатура" --profile metadata --limit 5
```

Сборка 1С RAG prompt:

```powershell
python scripts/ask_1c_rag.py "Какие реквизиты есть у справочника Номенклатура?" --print-prompt
```

Runbook: `docs/runbooks/1c-rag.md`.

Проверка 1С-плагина:

```powershell
python scripts/check_1c_plugin.py --print
```

Контур безопасного взаимодействия с живыми базами 1С: `docs/runbooks/1c-live-interaction.md`.

Проверка offline/static контура верификации 1С-адаптера:

```powershell
python scripts/check_1c_adapter_verification_stack.py --base-id upo_test
```

Для нестандартных endpoint'ов добавьте `--rest-adapter-url ... --mcp-url ...`;
по умолчанию проверяются текущие стендовые URL. Несколько баз можно передать
после одного `--base-id`. Чтобы принимать только свежие persisted-отчеты,
добавьте `--max-report-age-seconds <seconds>`.
Persisted validation also checks
`reports/1c-sql/<base-id>/saved-state-copy-plan.json`: the plan must be for
the requested base, be `plan_ready`, contain active `Config`/`ConfigCAS` source
rows, and show no `ConfigSave`/`ConfigCASSave` target collisions.
PowerShell deploy/verify defaults saved-state preparation to `ConfigCASSave`;
pass `-SavedStateTable ConfigSave` when checking the base save layer instead.

Сохранить машинно-читаемый итог этой проверки:

```powershell
python scripts/check_1c_adapter_verification_stack.py --base-id upo_test --json --report reports/1c-sql/upo_test/adapter-verification-stack-check.json
```

Metadata snapshots:

```powershell
python scripts/validate_1c_metadata_snapshot.py plugins/1c/metadata/examples/metadata.example.json
python scripts/convert_1c_metadata_to_rag.py --input plugins/1c/metadata/examples/metadata.example.json --output plugins/1c/rag/sources/metadata.example.generated.md
```

Runbook: `docs/runbooks/1c-metadata-snapshot.md`.

## 1C Training Data

Проверка и подготовка синтетического training example:

```powershell
python scripts/validate_1c_training_data.py plugins/1c/training/examples/instruction.examples.jsonl
python scripts/prepare_1c_training_data.py --input plugins/1c/training/examples/instruction.examples.jsonl --output plugins/1c/training/prepared/train.chat.jsonl
```

Runbook: `docs/runbooks/1c-training-data.md`.

LoRA training:

```powershell
python scripts/preflight_1c_training.py
```

Runbook: `docs/runbooks/1c-lora-training.md`.

## Evals

Проверка eval-наборов:

```powershell
python scripts/validate_evals.py
python scripts/run_1c_smoke_eval.py --print
```

Runbook: `docs/runbooks/evals.md`.
