Python Textual. Single-window app с chord-навигацией, command palette и общим status bar.
Требования: pip install -e python/xrun_tui (Python ≥ 3.11, Textual ≥ 0.70).
Запуск: xrun без аргументов (TTY) или xrun-tui.
Запускается автоматически при первом старте TUI (когда
[ui] wizard_completed = false в config.toml) или явно через xrun init.
Один экран, четыре шага: Local → Vendors → Logging → Done.
┌── xrun — Setup ────────────────────────────────────────────────────────┐
│ ✓ Local → ● Vendors → ○ Logging → ○ Done │
│ │
│ Step 2 — Vendors │
│ Toggle vendors. Press [o] on a card to open its API-key page. │
│ │
│ ● vast.ai GPU spot marketplace key set │
│ [paste vast.ai API key……………………………………………………] │
│ ○ Kaggle Free notebooks (mlflow live) no key │
│ ○ SSH machine Your own server / NAS / VPS no key │
│ ○ RunPod [v0.7+] no key │
│ ○ Lambda Labs [v0.7+] no key │
│ │
│ [Back Ctrl+B] [Skip wizard Esc] [Next Ctrl+N] │
└────────────────────────────────────────────────────────────────────────┘
| Шаг | Что делает |
|---|---|
| Local | Запускает xrun init --probe-local --json; показывает OS/GPU. Спиннер пока probe не вернулся. |
| Vendors | Checkbox per vendor — Tab/Space навигация. Vast/Kaggle открывают password-Input при выборе. o открывает API-key страницу focused-карточки (работает ДО выбора). |
| Logging | Radio: off / polling (default) / polling+mirror; для mirror — Checkbox-список sinks (mlflow ✓; wandb/comet [v0.8] disabled). При выбранном Kaggle подсветка-подсказка про mirror. |
| Done | Recap + live xrun doctor --json (✓/⚠/✗ по чекам) + Finish пишет конфиг через xrun init --non-interactive --mark-completed --sink ... (ключи — через xrun config set). |
Esc/Skip wizard показывает confirm-modal (Y/N) — случайный Esc больше не
сбрасывает прогресс. После подтверждения ставит wizard_completed = true
без записи выбранных вендоров/sinks; вернуться можно через xrun init.
┌── xrun › runs ───────────── vast ✓ $12.34 │ g:goto ?:help ::cmd ─┐
│ │
│ Active (2) Vendor Run: $0.42/hr · cap-left $4.21 │
│ ▶ arborust_v7_C vast 2h 14m epoch 18/30 loss 0.41 │
│ classifier_eb0 kaggle 0h 47m uploading │
│ │
│ Recent │
│ ✓ arborust_v6γ vast 14h 02m F1 0.885 │
│ ✓ ablation_drop vast 3h 51m F1 0.879 │
│ ✗ tuba_winter vast 0h 12m FAILED: oom │
│ │
│ enter:open L:launch S:stop P:pull R:rerun /:filter │
└────────────────────────────────────────────────────────────────────────┘
Dashboard cards сверху: текущий burn $/hr, cap-left $X.XX, today $spent.
Stale runs — running-записи без событий ≥30 минут получают ⚠ stale в
колонке Status и в счётчике дашборда. S зовёт xrun fix-status <id> (или
все running-runs если ни один stale не выбран) и обновляет статус в БД из
ответа вендора. Лечит ситуацию когда поллер умер посередине (Windows: после
cargo install --force исполняемый файл подменён, дочерний процесс
поллера упал молча).
Вкладки: Stages | Logs | Metrics | Artifacts | Manifest
- Stages: таймлайн с throbber на текущей стадии. Цвета: grey pending, yellow running, green ok, red failed.
- Logs: читает локальный снапшот
stdout.log(поллер обновляет каждые ~5s). Для live-стриминга:xrun logs <id> --followв терминале. - Metrics: левая палитра ключей с спарклайнами (
MetricsPalette), справаMetricsView— таблица final-значений + grid с одним subplot на ключ.o— открыть MLflow run в браузере;g(в --png export) включает per-key grid; см.xrun metrics --per-key --png. - Artifacts: дерево артефактов.
P— pull выбранных.Enterна PNG/JPG открывает встроенныйImageView(ASCII-preview через chafa-style). - Manifest: read-only YAML.
e— открыть в$EDITOR. - Report:
ReportViewрендеритreport.md/report.htmlартефакт run-а (если есть) — markdown в Textual-нативном виде.
Picker по exp/. Превью манифеста справа. Enter → confirm с оценкой стоимости.
Список vast/kaggle инстансов из адаптера. Показывает orphan-инстансы (без привязанного run) — D для destroy.
Менеджер вендоров и кредов:
┌─ Vendors ───────────────────────────────────────────────────────────────┐
│ Vendor Status Account Balance Last checked │
│ vast ✓ connected user@example.com $12.34 32s ago │
│ kaggle ✗ not configured — — │
│ mlflow ⚠ unauthorized — 15s ago │
└─────────────────────────────────────────────────────────────────────────┘
e/Enter:edit i:import t:test r:revoke Esc:back
e— masked-input форма для ввода ключей. Tab/Shift+Tab между полями. Enter — сохранить и запустить probe.i— импортировать существующий ключ:~/.config/vastai/vast_api_keyдля vast,~/.kaggle/kaggle.jsonдля kaggle.t— принудительный probe.r— revoke (стирает ключ после confirm).
Фоновый probe запускается каждые 60s и по триггеру (после save / t). Баланс vast появляется в status bar после первого успешного probe.
First-run splash: если credentials пустые — ASCII-сплеш при старте. Любая клавиша открывает экран Vendors.
Тема, poll interval (active/idle), default vendor, MLflow URL, exclude-countries. Секция Database: размер файла, очистка завершённых runs.
Сводка: активные runs, spend today, burn rate, баланс.
Проверки окружения: xrun doctor в TUI-форме. CLI-эквивалент: xrun doctor.
Сравнение метрик двух runs side-by-side. Открывается из Runs: выбрать первый (c), выбрать второй (c).
Браузер артефактов по всем runs (не только текущего). P — pull.
| Key | Action |
|---|---|
q / Esc |
Назад / выход |
? |
Help overlay |
: |
Command palette |
| Chord | Экран |
|---|---|
g d |
Dashboard |
g r |
Runs |
g i |
Instances |
g v |
Vendors |
g s |
Settings |
g l |
Launch |
g h |
Doctor |
| Key | Action |
|---|---|
V |
Vendors |
Enter |
Открыть run detail |
L |
Launch picker |
s |
Stop выбранного run |
S |
Sync — xrun fix-status для stale-runs |
P |
Pull чекпоинт |
R |
Rerun |
/ |
Фильтр |
| Key | Action |
|---|---|
tab / shift-tab |
Переключение вкладок |
s |
Stop run |
S |
Sync — xrun fix-status <id> для stale runs |
r |
Rerun |
p |
Pull последний чекпоинт |
a |
Открыть Artifacts |
o |
Открыть MLflow run в браузере |
e |
Открыть manifest в $EDITOR |
1–4 |
Stages / Logs / Manifest / Metrics |
:goto <screen> — навигация по имени.
:launch <manifest> — запустить манифест.
:stop <id> — остановить run.
Три сегмента:
xrun › <breadcrumb>— текущий экран<vendor> <status-icon> $<balance>— состояние дефолтного вендора- Screen hotkeys
Предупреждения: ⚠ <Nh runway (красный) если balance/burn < N часов.
Доступные: tokyo-night (default), catppuccin-mocha, gruvbox-dark.
Переключение: Settings → Theme → Ctrl+S. Полный эффект после перезапуска.
xrun (Rust CLI)
└─ при запуске без аргументов: spawn xrun-tui (Python Textual binary)
xrun-tui (Python)
├─ читает SQLite напрямую (aiosqlite, тот же runs.db)
├─ вызывает xrun CLI через asyncio subprocess (stop, pull, launch, config)
└─ не пишет в SQLite напрямую — только через CLI
Python TUI и Rust CLI используют одну БД (WAL mode — concurrent read-write безопасен).