# LawBot

Telegram-бот с RAG-поиском по законам РФ.

## Что внутри

- `bot/` — Telegram-бот на `aiogram`
- `api/` — FastAPI-сервис для retrieval и генерации ответа
- `parser/` — CLI-парсер и загрузка законов
- `shared/` — общий слой БД и модели
- `compose.yml` — запуск всего стека через Docker Compose

## Стек

- Telegram Bot API
- FastAPI
- PostgreSQL
- Redis
- ChromaDB
- OpenRouter
- локальная embedding-модель на CPU

## Подготовка

Создай рабочие env-файлы из примеров:

```bash
cp bot/.env.example bot/.env
cp api/.env.example api/.env
cp postgres.env.example postgres.env
```

Заполни:

- `bot/.env` — `TOKEN`, `BASE_ADMIN`, при необходимости `TELEGRAM_BOT_PROXY`
- `api/.env` — `OPENAI_API_KEY`
- `postgres.env` — логин/пароль БД

## Запуск

```bash
docker compose up -d --build
```

Проверка API:

```bash
curl http://127.0.0.1:8080/health
```

## Загрузка законов

Полный прогон:

```bash
docker compose exec tgbot python -m parser run
```

Запуск только для одной категории:

```bash
docker compose exec tgbot python -m parser run --categories labor --limit 1
```

Отдельные шаги:

```bash
docker compose exec tgbot python -m parser discover
docker compose exec tgbot python -m parser fetch
docker compose exec tgbot python -m parser normalize
docker compose exec tgbot python -m parser ingest
```

## Индексация Chroma

После нового `parser ingest` перестрой индекс:

```bash
curl -X POST http://127.0.0.1:8080/api/v1/index/rebuild \
  -H 'Content-Type: application/json' \
  -d '{"reset_collection": true}'
```

Индексация только нужного домена:

```bash
curl -X POST http://127.0.0.1:8080/api/v1/index/rebuild \
  -H 'Content-Type: application/json' \
  -d '{"law_types":["criminal"],"reset_collection":false}'
```

## Полезные команды

Проверить логи:

```bash
docker compose logs -f tgbot
docker compose logs -f api
```

Проверить поиск:

```bash
curl -X POST http://127.0.0.1:8080/api/v1/rag/search \
  -H 'Content-Type: application/json' \
  -d '{
    "question":"Работодатель задержал зарплату. Что делать?",
    "category":"Работа",
    "region":"Москва",
    "top_k":3
  }'
```

Проверить полный ответ:

```bash
curl -X POST http://127.0.0.1:8080/api/v1/rag/answer \
  -H 'Content-Type: application/json' \
  -d '{
    "question":"Работодатель задержал зарплату. Что делать?",
    "category":"Работа",
    "region":"Москва",
    "top_k":3
  }'
```

## Данные

- PostgreSQL: `./volumes/postgres`
- ChromaDB: `./volumes/chroma`
- Hugging Face cache: `./volumes/huggingface`
- Parser artifacts: `./volumes/parser`
