.PHONY: install dev test docker clean smoke smoke-lesson smoke-tts # Kèm luôn VieNeu-TTS: nặng ~2 GB, cộng model tải về lần đầu chạy. install: python -m venv .venv .venv/bin/pip install -r backend/requirements-dev.txt # .env được app tự nạp trong config.py, không cần source hay --env-file. dev: cd backend && ../.venv/bin/uvicorn app.main:app --reload --port 8000 test: cd backend && ../.venv/bin/python -m pytest tests -q docker: docker compose up --build # Dựng giọng vào volume audio-cache. Chạy một lần sau khi sửa pack. docker-prebuild: docker compose run --rm web python ../scripts/prebuild_audio.py # Image tự chứa giọng, cho nơi không gắn được volume. docker-selfcontained: docker compose build --build-arg PREBUILD_AUDIO=1 clean: find . -name __pycache__ -type d -exec rm -rf {} + rm -rf .pytest_cache smoke: .venv/bin/python scripts/smoke_llm.py smoke-lesson: .venv/bin/python scripts/smoke_llm.py --lesson "Định lý Pytago là gì ạ?" smoke-tts: SPEECH_PROVIDER=vieneu .venv/bin/python scripts/smoke_tts.py prebuild: .venv/bin/python scripts/prebuild_audio.py packs: cd backend && ../.venv/bin/python -c "from app.services import packs; [print(p.id, len(p.scenarios), 'scenario') for p in packs.PACKS.values()]"