feat(standalone): agentik pull-model subcommand + AGENTIK_AUTO_DOWNLOAD_MODEL=1 trigger for LiteRT-LM
Добавляет ModelDownloader (HTTP с Range/докачкой, опциональной SHA-256 проверкой)
и два сценария запуска скачивания встроенной модели gemma-4-E2B-it.litertlm:
java -jar agentik.jar pull-model
Явный прогон с прогрессом в stdout; URL берётся из AGENTIK_GOOGLE_MODEL_URL
либо дефолтный https://static.binom.pw/models/gemma-4-E2B-it.litertlm.
AGENTIK_AUTO_DOWNLOAD_MODEL=1 java -jar agentik.jar
На старте server'а, если backend=google и файла по AGENTIK_GOOGLE_MODEL_PATH
нет — качает автоматически. Без флага — exit 2 с понятным сообщением и
подсказкой вызвать pull-model.
Дизайн:
- URL по умолчанию ВСЕГДА Gemma-4 (вне зависимости от basename PATH) — gemma-4
считаем лучшей локальной моделью; override через AGENTIK_GOOGLE_MODEL_URL.
- SHA-256 проверка через опциональный AGENTIK_GOOGLE_MODEL_SHA256_URL.
- Resume: HEAD → если есть .part и Accept-Ranges=bytes → GET с Range: bytes=N-,
иначе restart с нуля.
- Прогресс каждые ~8 MB, финальный rename через Files.move(ATOMIC_MOVE).
Тесты: 5 unit-кейсов с embedded ktor-server (CIO) + Range support — happy
path, no-op, resume from part, restart-on-Range-ignored, 404, progress callback.
Документация: новый раздел §18 в MANUAL-TESTS.md (subcommand, auto-trigger,
resume, override URL, SHA-256 verify).
178/178 tests green.
This commit is contained in:
@@ -772,6 +772,101 @@ ps aux | grep agentik-0.1.0 | grep -v grep
|
||||
|
||||
---
|
||||
|
||||
## 18. Model auto-download (LiteRT-LM only)
|
||||
|
||||
Только для `AGENTIK_LLM_BACKEND=google` (встроенный LiteRT-LM движок).
|
||||
Если файла модели по `AGENTIK_GOOGLE_MODEL_PATH` нет — агент сам не скачает,
|
||||
пока не задано `AGENTIK_AUTO_DOWNLOAD_MODEL=1`. Либо качаем руками
|
||||
через `pull-model` subcommand.
|
||||
|
||||
URL по умолчанию всегда Gemma-4-E2B-it.litertlm (2.5 GB с `static.binom.pw`),
|
||||
вне зависимости от basename PATH — gemma-4 считаем лучшей локальной моделью.
|
||||
|
||||
### 18.1. Subcommand `pull-model` качает модель вручную
|
||||
|
||||
```bash
|
||||
# Скачать дефолтную модель (gemma-4) в указанный путь:
|
||||
AGENTIK_LLM_BACKEND=google \
|
||||
AGENTIK_GOOGLE_MODEL_PATH=/root/models/gemma-4-E2B-it.litertlm \
|
||||
java -jar agentik.jar pull-model
|
||||
# → downloading from https://static.binom.pw/models/gemma-4-E2B-it.litertlm
|
||||
# → 50% (1.2 GB / 2.5 GB)
|
||||
# → done in 47s
|
||||
```
|
||||
|
||||
После `pull-model` файл лежит на месте, файл `<dest>.part` удалён.
|
||||
|
||||
### 18.2. `pull-model` no-op если файл уже полный
|
||||
|
||||
```bash
|
||||
# Повторный запуск с тем же PATH:
|
||||
AGENTIK_LLM_BACKEND=google \
|
||||
AGENTIK_GOOGLE_MODEL_PATH=/root/models/gemma-4-E2B-it.litertlm \
|
||||
java -jar agentik.jar pull-model
|
||||
# → already present (2.50 GB), nothing to do
|
||||
```
|
||||
|
||||
### 18.3. `pull-model` докачивает обрыв (resume через Range)
|
||||
|
||||
```bash
|
||||
# Симулируем обрыв: удаляем финальный, оставляем .part с первыми 500 MB
|
||||
rm /root/models/gemma-4-E2B-it.litertlm
|
||||
mv /root/models/gemma-4-E2B-it.litertlm.part /root/models/gemma-4-E2B-it.litertlm.part.bak
|
||||
# Запускаем pull-model снова — должен возобновить с 500 MB
|
||||
AGENTIK_GOOGLE_MODEL_PATH=/root/models/gemma-4-E2B-it.litertlm \
|
||||
java -jar agentik.jar pull-model
|
||||
# → resuming from 524288000 bytes
|
||||
# → downloaded 2.10 GB in 38s
|
||||
```
|
||||
|
||||
### 18.4. Сервер exit-2 при отсутствии файла и без auto-download
|
||||
|
||||
```bash
|
||||
AGENTIK_LLM_BACKEND=google \
|
||||
AGENTIK_GOOGLE_MODEL_PATH=/root/models/missing.litertlm \
|
||||
java -jar agentik.jar
|
||||
# → LiteRT-LM model file not found at: /root/models/missing.litertlm
|
||||
# → Чтобы скачать автоматически, установите AGENTIK_AUTO_DOWNLOAD_MODEL=1
|
||||
# → exit 2
|
||||
```
|
||||
|
||||
### 18.5. Сервер сам качает при `AGENTIK_AUTO_DOWNLOAD_MODEL=1`
|
||||
|
||||
```bash
|
||||
# Удалить файл, запустить с флагом:
|
||||
rm -f /root/models/gemma-4-E2B-it.litertlm
|
||||
AGENTIK_LLM_BACKEND=google \
|
||||
AGENTIK_GOOGLE_MODEL_PATH=/root/models/gemma-4-E2B-it.litertlm \
|
||||
AGENTIK_AUTO_DOWNLOAD_MODEL=1 \
|
||||
java -jar agentik.jar
|
||||
# → 12:34:56 WARN auto-download: https://static.binom.pw/models/...
|
||||
# → 12:34:56 INFO auto-download: 17% (445 MB/2.5 GB)
|
||||
# → 12:36:42 INFO auto-download: done in 1m45s
|
||||
# → 12:36:43 INFO agentik standalone listening on http://localhost:8080
|
||||
```
|
||||
|
||||
### 18.6. Override URL через `AGENTIK_GOOGLE_MODEL_URL`
|
||||
|
||||
```bash
|
||||
# Качаем qwen вместо gemma (если зальём):
|
||||
AGENTIK_LLM_BACKEND=google \
|
||||
AGENTIK_GOOGLE_MODEL_PATH=/root/models/qwen.litertlm \
|
||||
AGENTIK_GOOGLE_MODEL_URL=https://static.binom.pw/models/Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096.litertlm \
|
||||
java -jar agentik.jar pull-model
|
||||
```
|
||||
|
||||
### 18.7. SHA-256 проверка
|
||||
|
||||
Если на сервере лежит `<basename>.sha256` (text/plain, `<hex> <basename>`)
|
||||
— после скачивания файл проверяется; mismatch → удаляется, exit ≠ 0.
|
||||
|
||||
```bash
|
||||
AGENTIK_GOOGLE_MODEL_URL=https://static.binom.pw/models/gemma-4-E2B-it.litertlm \
|
||||
AGENTIK_GOOGLE_MODEL_SHA256_URL=https://static.binom.pw/models/gemma-4-E2B-it.litertlm.sha256 \
|
||||
java -jar agentik.jar pull-model
|
||||
# → 13:01:23 INFO model download: SHA-256 verified (4ab1...e0d)
|
||||
```
|
||||
|
||||
## Быстрый smoke-test (5 минут)
|
||||
|
||||
Если времени мало — этот минимум покрывает 80%:
|
||||
|
||||
Reference in New Issue
Block a user