# Model Chat Testbench

Цель: вручную проверять модели из `registry/index.json` через чат с выбором плагина и модели.

## Web UI

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

Открыть:

```text
http://127.0.0.1:8765
```

Интерфейс читает модели из `registry/index.json`, группирует их по плагинам и отправляет запросы в OpenAI-compatible endpoint через локальный proxy.

Возможности:

- выбор endpoint preset: `vLLM text`, `llama.cpp GGUF`, `local`;
- проверка `/v1/models` и наличия выбранного `served_model_name`;
- выбор плагина и модели из registry;
- готовые тестовые prompt-пакеты по каждому плагину;
- сравнение нескольких моделей на одном prompt;
- сборка 1C RAG prompt с найденными источниками;
- сохранение каждого ответа и ошибки в JSONL;
- ручная оценка ответа: `ok`, `needs_review`, `bad`.

Endpoint по умолчанию:

```text
http://docker-gpu.cin.su:8000
```

## CLI Smoke Chat

```powershell
python scripts/model_chat_cli.py --plugin text
python scripts/model_chat_cli.py --plugin 1c --model-id qwen3-4b-instruct-2507
python scripts/model_chat_cli.py --plugin translation --prompt "Переведи на английский: Проверяем модель."
```

## Reports

Результаты сохраняются в:

```text
reports/model-chat/YYYYMMDD.jsonl
```

Записи `type=chat` содержат prompt, ответ, модель, endpoint, latency и статус. Записи `type=feedback` содержат ручную оценку и ссылку на `parent_id`.

Записи `type=compare` содержат общий prompt и ответы нескольких моделей. Записи `type=rag_prompt` содержат вопрос, количество найденных источников и список source chunks.

## 1C RAG Prompt

Для кнопки `1C RAG` нужен подготовленный индекс:

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

Если индекс отсутствует, UI покажет команду подготовки.

## Notes

- Для vLLM используется `served_model_name` из model card.
- Для GGUF/llama.cpp укажите endpoint соответствующего сервиса, например `--base-url http://docker-gpu.cin.su:8080`.
- Если GPU endpoint недоступен, UI покажет ошибку запроса, но каталог моделей все равно загрузится.
