johngaltvc/pony-v9
Pony v8 — сервер генерации
Раздаёт модель из train/ по HTTP: GET /health, POST /generate (поток токенов, SSE). Веса берутся с Hugging Face Hub из репозитория MODEL_REPO.
Для v9 рядом с весами кладётся база знаний wiki.sqlite (репозиторий KB_REPO, по умолчанию тот же, что MODEL_REPO); тогда включаются POST /search (топ-k статей по вопросу) и POST /ask (поиск → промпт с источником → поток токенов ответа), а /health показывает "ask": true и kb_docs.
Локально:
pip install -r serve/requirements.txt
MODEL_DIR=v7 uvicorn serve.app:app --port 7860 # любая папка с model.bin, tokenizer.json, meta.json
curl -N -X POST localhost:7860/generate -H 'content-type: application/json' -d '{"prompt":"Москва —","max_new_tokens":40}'В Space: ноутбуки train/pony_v8_colab.ipynb и train/pony_v9_colab.ipynb создают Space сами и записывают адрес в v8/config.json / v9/config.json.
Если запросы виснут
Симптом: GET /health отвечает мгновенно, а POST /generate не отдаёт ни байта, и счётчик requests в /health растёт на каждый запрос. Так было до сентября 2026: генератор SSE держал блокировку модели между токенами, а когда клиент обрывал поток (страница v8 делает это при каждом новом «Написать»), генератор оставался подвешенным с захваченной блокировкой, и все следующие запросы вставали в вечную очередь.
Сейчас модель работает в отдельном потоке с отменой по отключению клиента, блокировка берётся с таймаутом (LOCK_TIMEOUT, 25 с → событие {"error": "занят"}), а сторож освобождает её, если генерация висит дольше STUCK_SECONDS (300 с). В /health есть поля busy и busy_seconds.
Space не обновляется сам при пуше в репозиторий проекта: нужно положить свежие serve/app.py и train/model.py в репозиторий Space (ячейка ноутбука или Files → Upload на huggingface.co) — Space пересоберётся. Уже зависший Space оживляет Settings → Factory reboot.
