dflash-console 0.3.241__tar.gz → 0.3.249__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dflash_console-0.3.241 → dflash_console-0.3.249}/PKG-INFO +7 -3
- {dflash_console-0.3.241 → dflash_console-0.3.249}/README.md +6 -2
- {dflash_console-0.3.241 → dflash_console-0.3.249}/api/app.py +74 -16
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/api_catalog.py +456 -454
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/auto_register.py +2 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/catalog_load.py +300 -259
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/embedding_server.py +407 -407
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_devices.py +387 -373
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_catalog_cache.py +20 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_local_match.py +14 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/huggingface.py +124 -13
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/local_models.py +7 -4
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/memory_guardrails.py +600 -598
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/net_listeners.py +130 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtime.py +1740 -1728
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/faster_whisper.py +8 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/freetoken.py +3 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/stt.py +5 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/transformers_hf.py +398 -395
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/vibevoice.py +4 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/vllm.py +437 -427
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/server_boot.py +2182 -2048
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/version.py +1 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/vision_setup.py +11 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/pyproject.toml +1 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/dflash-console.css +46 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/dflash-shell.css +9999 -9753
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/index.html +15 -10
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/download-queue.js +40 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/downloads-live.js +2 -1
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/model-search-live.js +5 -2
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/models-live.js +4371 -4161
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/select-theme.js +430 -412
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/server-live.js +5771 -5659
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/server-reload-watch.js +181 -139
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/status-feed.js +319 -309
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/table-column-resize.js +4 -3
- {dflash_console-0.3.241 → dflash_console-0.3.249}/.gitignore +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/LICENSE +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/NOTICE.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/api/__init__.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/api/gateway.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_console_logo.png +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_console_logo_only.png +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_console_logo_only2.png +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_console_logo_only_clear.png +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_txt_logo.png +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/config.example.json +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/__init__.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/api_access_log.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/api_introspection.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/api_providers.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/chat_proxy.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/chat_queue.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/chat_ready.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/chat_vision.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/client_identity.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/components_hub.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/config.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/dflash_generation.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/diagnostics_bundle.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/display_names.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/engine_state.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/freetoken_runtime_install.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/fs_browse.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/fs_reveal.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gateway_access_log.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gateway_routing.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gguf_meta.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_policy.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_process_memory_windows.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_processes.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_relief.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hardware_apply.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hardware_info.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_catalog_draft.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_catalog_index.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_catalog_recommend.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_engines.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_install.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_model_fit.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/inference_stats.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/library_import.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/load_progress.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/log_utils.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_discovery.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_paths.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_presets.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_runtime_policy.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_stack.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/node_connect.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/ocr_setup.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/remote_nodes.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtime_install_job.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtime_recommendations.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/__init__.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/base.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/contention.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/noop.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/ollama.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/piper.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/registry.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/setup.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/stack_match.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/status_report.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/support_journal.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/system_stats.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/transformers_runtime_install.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/core/vllm_runtime_install.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/__init__.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/__main__.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/cli.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/commands.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/http.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/render.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/resolve.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/server_takeover.py +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/AGENT-PROMPT-CLIENT-IDENTITY.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/AGENT-PROMPT-DFLASH-TRANSLATION-PERF-AI-TOOLS.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/AGENT-PROMPT-TRANSLATEGEMMA-AI-TOOLS.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ARCHITECTURE.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/BUG-REPORTS.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/CLI.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/CLIENT-IDENTITY.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/CURSOR.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/GOING-PUBLIC.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/LICENSING.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/LINUX-CLI.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/MULTI-MODAL-AGENT-PROMPT.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/MULTI-MODAL-RUNTIME-PLAN.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/PRODUCTION.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/RELEASING.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/STT-ENGINE-DECISION.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/USER-GUIDE.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/announcements/public-preview-v0.3.103.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/announcements/public-preview-v0.3.122.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/announcements/public-preview.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/automatic-updates.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/plans/shared-speak-stt-service.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.103.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.106.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.117.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.118.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.119.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.120.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.121.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.122.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.123.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.128.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.129.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.132.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.133.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.208.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/README.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/devices-view.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/model-search.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/models-view.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/nodes-v1-plan.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-appearance.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-chat.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-developer.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-general.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-hardware.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-integrations.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-lm-link.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-model-defaults.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-runtime.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-runtimes.md +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/app-functional.html +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/dflash-console.css.bak-density +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/dflash-shell.css.bak-density +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/studio.css +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/about-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/app-settings-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/app.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/bug-report-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/chat-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/component-install-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/console-api.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/dashboard.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/desktop-shell.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/dflash-console-ui.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/docs-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/library-browse-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/library-scan-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/library-type-options.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/log-format.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/model-card.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/model-catalog-groups.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/nodes-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/runtime-recommendations.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/runtime-steppers.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/settings-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/settings-live.js.api-providers-bak +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/settings-live.js.pre-api-merge-bak +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/setup-wizard-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/speak-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/stack-wizard.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/sysbar-live.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/ui-layout-prefs.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/vendor/marked.min.js +0 -0
- {dflash_console-0.3.241 → dflash_console-0.3.249}/static/vendor/purify.min.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: dflash-console
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.249
|
|
4
4
|
Summary: Local control panel and terminal CLI for DFlash stacks and local model runtimes
|
|
5
5
|
Project-URL: Homepage, https://github.com/ilan4ever/Dflash-Console
|
|
6
6
|
Project-URL: Repository, https://github.com/ilan4ever/Dflash-Console
|
|
@@ -674,7 +674,7 @@ from one UI, then talk to them through a single OpenAI-compatible port.
|
|
|
674
674
|
> supported platform**; Linux and macOS are not supported or tested (see
|
|
675
675
|
> [Platform support](#platform-support) below).
|
|
676
676
|
|
|
677
|
-
**Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.
|
|
677
|
+
**Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.249
|
|
678
678
|
|
|
679
679
|
## Download (Windows)
|
|
680
680
|
|
|
@@ -753,8 +753,12 @@ Typical first session:
|
|
|
753
753
|
3. For a DFlash GGUF, right-click and **Find and attach draft** if you want speculative decoding.
|
|
754
754
|
4. Chat in the **Playground**, or point any OpenAI client at `http://127.0.0.1:8001/v1` with optional `X-DFlash-Client: YourApp` so **Engines** shows who is using each model.
|
|
755
755
|
|
|
756
|
-
### Recent improvements (v0.3.
|
|
756
|
+
### Recent improvements (v0.3.249)
|
|
757
757
|
|
|
758
|
+
- **Model library** — loading clears when the model is on the GPU; Engine and GPU column headers stay visible
|
|
759
|
+
- **Model catalog** — a pasted repo name with a trailing period still opens the real model, and shared shard names are no longer marked installed
|
|
760
|
+
- **Image downloads** — a pipeline folder no longer nests a second copy of the whole model inside the text encoder
|
|
761
|
+
- **Desktop app** — a second launch opens the window that is already running
|
|
758
762
|
- **Engine standby** — Running toggle gates load/chat until you arm the pipeline
|
|
759
763
|
- **External GPU cards** — OneVoice, LM Studio, and other apps on the GPU; compact mobile layout; loading state expires when models are ready
|
|
760
764
|
- **Other GPU processes** — per-process VRAM chips for non-model apps
|
|
@@ -8,7 +8,7 @@ from one UI, then talk to them through a single OpenAI-compatible port.
|
|
|
8
8
|
> supported platform**; Linux and macOS are not supported or tested (see
|
|
9
9
|
> [Platform support](#platform-support) below).
|
|
10
10
|
|
|
11
|
-
**Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.
|
|
11
|
+
**Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.249
|
|
12
12
|
|
|
13
13
|
## Download (Windows)
|
|
14
14
|
|
|
@@ -87,8 +87,12 @@ Typical first session:
|
|
|
87
87
|
3. For a DFlash GGUF, right-click and **Find and attach draft** if you want speculative decoding.
|
|
88
88
|
4. Chat in the **Playground**, or point any OpenAI client at `http://127.0.0.1:8001/v1` with optional `X-DFlash-Client: YourApp` so **Engines** shows who is using each model.
|
|
89
89
|
|
|
90
|
-
### Recent improvements (v0.3.
|
|
90
|
+
### Recent improvements (v0.3.249)
|
|
91
91
|
|
|
92
|
+
- **Model library** — loading clears when the model is on the GPU; Engine and GPU column headers stay visible
|
|
93
|
+
- **Model catalog** — a pasted repo name with a trailing period still opens the real model, and shared shard names are no longer marked installed
|
|
94
|
+
- **Image downloads** — a pipeline folder no longer nests a second copy of the whole model inside the text encoder
|
|
95
|
+
- **Desktop app** — a second launch opens the window that is already running
|
|
92
96
|
- **Engine standby** — Running toggle gates load/chat until you arm the pipeline
|
|
93
97
|
- **External GPU cards** — OneVoice, LM Studio, and other apps on the GPU; compact mobile layout; loading state expires when models are ready
|
|
94
98
|
- **Other GPU processes** — per-process VRAM chips for non-model apps
|
|
@@ -23,7 +23,7 @@ from pydantic import BaseModel, Field
|
|
|
23
23
|
from core.config import PACKAGE_ROOT, ROOT, get_dflash_root, get_server, is_embedding_server, list_runtimes, list_servers, load_config, normalize_download_settings, normalize_hardware_settings, normalize_inference_settings, normalize_load_settings, normalize_model_libraries, normalize_remote_nodes, normalize_runtime, normalize_server, normalize_ui_layout, save_config, suggest_server_port, update_server_runtime
|
|
24
24
|
from core.version import APP_VERSION
|
|
25
25
|
from core.model_paths import allowed_model_roots, disk_scan_roots, get_models_root, validate_model_path
|
|
26
|
-
from core.gpu_devices import get_gpu_devices_payload
|
|
26
|
+
from core.gpu_devices import get_gpu_devices_payload, validate_gpu_device
|
|
27
27
|
from core.local_models import (
|
|
28
28
|
friendly_model_dir_label,
|
|
29
29
|
invalidate_model_catalog_cache,
|
|
@@ -302,6 +302,17 @@ def _request_client_label(request: Request | None) -> str:
|
|
|
302
302
|
return resolve_client_label(request)
|
|
303
303
|
|
|
304
304
|
|
|
305
|
+
def _request_gpu_device(raw: str | None) -> str | None:
|
|
306
|
+
"""Validate an optional per-load GPU override."""
|
|
307
|
+
raw = getattr(raw, 'default', raw)
|
|
308
|
+
if raw is None:
|
|
309
|
+
return None
|
|
310
|
+
try:
|
|
311
|
+
return validate_gpu_device(raw)
|
|
312
|
+
except ValueError as exc:
|
|
313
|
+
raise HTTPException(status_code=422, detail=str(exc)) from exc
|
|
314
|
+
|
|
315
|
+
|
|
305
316
|
def _raise_if_pipeline_standby(cfg: dict[str, Any]) -> None:
|
|
306
317
|
from core.engine_state import console_pipeline_active, engine_standby_http_error
|
|
307
318
|
|
|
@@ -729,6 +740,7 @@ class ModelLoadRequest(BaseModel):
|
|
|
729
740
|
model_id: str | None = None
|
|
730
741
|
runtime_id: str | None = None
|
|
731
742
|
context_size: int | None = Field(default=None, ge=2048, le=1048576)
|
|
743
|
+
gpu_device: str | None = None
|
|
732
744
|
load_settings: dict[str, Any] | None = None
|
|
733
745
|
inference_settings: dict[str, Any] | None = None
|
|
734
746
|
|
|
@@ -754,6 +766,7 @@ class ServerLoadRequest(BaseModel):
|
|
|
754
766
|
inference_settings: dict[str, Any] | None = None
|
|
755
767
|
model_path: str | None = None
|
|
756
768
|
model_id: str | None = None
|
|
769
|
+
gpu_device: str | None = None
|
|
757
770
|
|
|
758
771
|
|
|
759
772
|
class GpuProcessUnload(BaseModel):
|
|
@@ -805,6 +818,7 @@ class RuntimeLoadRequest(BaseModel):
|
|
|
805
818
|
voice: str = Field(default='', max_length=120)
|
|
806
819
|
path: str = Field(default='', max_length=1024)
|
|
807
820
|
preset: str = Field(default='', max_length=40)
|
|
821
|
+
gpu_device: str | None = None
|
|
808
822
|
load_settings: dict[str, Any] | None = None
|
|
809
823
|
|
|
810
824
|
|
|
@@ -1976,17 +1990,20 @@ def model_load(body: ModelLoadRequest, request: Request) -> dict[str, Any]:
|
|
|
1976
1990
|
|
|
1977
1991
|
cfg = load_config()
|
|
1978
1992
|
_ensure_api_pipeline_armed(cfg, server_id=body.server_id)
|
|
1993
|
+
gpu_device = _request_gpu_device(body.gpu_device)
|
|
1979
1994
|
result = execute_catalog_load(
|
|
1980
1995
|
path=body.path,
|
|
1981
1996
|
model_id=body.model_id,
|
|
1982
1997
|
server_id=body.server_id,
|
|
1983
1998
|
context_size=body.context_size,
|
|
1999
|
+
gpu_device=gpu_device,
|
|
1984
2000
|
load_settings=body.load_settings,
|
|
1985
2001
|
inference_settings=body.inference_settings,
|
|
1986
2002
|
requested_runtime_id=body.runtime_id,
|
|
1987
2003
|
loaded_by=_request_client_label(request),
|
|
1988
2004
|
cfg=cfg,
|
|
1989
2005
|
)
|
|
2006
|
+
result.setdefault('gpu_device', gpu_device or 'auto')
|
|
1990
2007
|
_invalidate_status_cache()
|
|
1991
2008
|
return result
|
|
1992
2009
|
|
|
@@ -2435,6 +2452,9 @@ def runtime_load(runtime_id: str, body: RuntimeLoadRequest) -> dict[str, Any]:
|
|
|
2435
2452
|
if not callable(load_fn):
|
|
2436
2453
|
raise HTTPException(status_code=400, detail='adapter does not support load')
|
|
2437
2454
|
payload: dict[str, Any] = {'id': body.voice, 'path': body.path}
|
|
2455
|
+
gpu_device = _request_gpu_device(body.gpu_device)
|
|
2456
|
+
if gpu_device is not None:
|
|
2457
|
+
payload['gpu_device'] = gpu_device
|
|
2438
2458
|
if body.preset:
|
|
2439
2459
|
payload['preset'] = body.preset
|
|
2440
2460
|
if body.load_settings:
|
|
@@ -2442,6 +2462,7 @@ def runtime_load(runtime_id: str, body: RuntimeLoadRequest) -> dict[str, Any]:
|
|
|
2442
2462
|
result = load_fn(payload)
|
|
2443
2463
|
if not result.get('success'):
|
|
2444
2464
|
raise HTTPException(status_code=400, detail=result.get('error') or 'load failed')
|
|
2465
|
+
result.setdefault('gpu_device', gpu_device or 'auto')
|
|
2445
2466
|
return {'success': True, 'runtime_id': runtime_id, **result}
|
|
2446
2467
|
|
|
2447
2468
|
|
|
@@ -2601,7 +2622,10 @@ def patch_server(server_id: str, body: ServerPatch) -> dict[str, Any]:
|
|
|
2601
2622
|
for idx, entry in enumerate(servers):
|
|
2602
2623
|
if not isinstance(entry, dict) or str(entry.get('id') or '') != server_id:
|
|
2603
2624
|
continue
|
|
2604
|
-
|
|
2625
|
+
patch = body.model_dump(exclude_none=True)
|
|
2626
|
+
if 'gpu_device' in patch:
|
|
2627
|
+
patch['gpu_device'] = _request_gpu_device(patch['gpu_device'])
|
|
2628
|
+
merged = normalize_server({**entry, **patch, 'id': server_id})
|
|
2605
2629
|
servers[idx] = merged
|
|
2606
2630
|
found = True
|
|
2607
2631
|
break
|
|
@@ -3088,6 +3112,37 @@ def _ensure_server_ready_for_chat(
|
|
|
3088
3112
|
'ready_for_chat': bool(loaded),
|
|
3089
3113
|
}
|
|
3090
3114
|
|
|
3115
|
+
# Already-loaded engines answer /v1/models in a fraction of a second.
|
|
3116
|
+
# The full status build checks GPU, logs, and the Windows process list,
|
|
3117
|
+
# which was adding many seconds in front of every chat.
|
|
3118
|
+
host = str(server.get('host') or '127.0.0.1').strip() or '127.0.0.1'
|
|
3119
|
+
port = int(server.get('port') or 0)
|
|
3120
|
+
api_url = str(server.get('api_url') or '').strip()
|
|
3121
|
+
if port > 0 and tcp_port_open(host, port):
|
|
3122
|
+
if not api_url:
|
|
3123
|
+
api_url = f'http://{host}:{port}/v1'
|
|
3124
|
+
from core.runtime import probe_runtime_state
|
|
3125
|
+
|
|
3126
|
+
loaded_now, _loading_now, _router_now, _progress_now = probe_runtime_state(api_url)
|
|
3127
|
+
if loaded_now:
|
|
3128
|
+
needs_grow = False
|
|
3129
|
+
if required_context and cfg.get('context_auto_grow') is not False:
|
|
3130
|
+
loaded_ctx = _loaded_per_slot_context(server) or _configured_per_slot(server)
|
|
3131
|
+
if loaded_ctx and int(required_context) > int(loaded_ctx):
|
|
3132
|
+
needs_grow = True
|
|
3133
|
+
if not needs_grow:
|
|
3134
|
+
note_engine_active_client(server_id, client_label=client_label)
|
|
3135
|
+
return {
|
|
3136
|
+
**server,
|
|
3137
|
+
'running': True,
|
|
3138
|
+
'status': 'loaded',
|
|
3139
|
+
'booting': False,
|
|
3140
|
+
'load_progress': None,
|
|
3141
|
+
'loaded_models': loaded_now,
|
|
3142
|
+
'active_model_id': loaded_now[0],
|
|
3143
|
+
'ready_for_chat': True,
|
|
3144
|
+
}
|
|
3145
|
+
|
|
3091
3146
|
live = build_server_status(server, cfg=cfg)
|
|
3092
3147
|
|
|
3093
3148
|
# Another chat is already mid-flight on this engine: never JIT-load (that
|
|
@@ -3250,6 +3305,7 @@ def server_load_plan(
|
|
|
3250
3305
|
server_id: str,
|
|
3251
3306
|
model_path: str = Query(default=''),
|
|
3252
3307
|
model_id: str = Query(default=''),
|
|
3308
|
+
gpu_device: str | None = Query(default=None),
|
|
3253
3309
|
) -> dict[str, Any]:
|
|
3254
3310
|
from core.memory_guardrails import assess_load
|
|
3255
3311
|
from core.server_boot import (
|
|
@@ -3262,6 +3318,9 @@ def server_load_plan(
|
|
|
3262
3318
|
cfg = load_config()
|
|
3263
3319
|
server = _require_server(cfg, server_id)
|
|
3264
3320
|
candidate = dict(server)
|
|
3321
|
+
requested_gpu = _request_gpu_device(gpu_device)
|
|
3322
|
+
if requested_gpu is not None:
|
|
3323
|
+
candidate['gpu_device'] = requested_gpu
|
|
3265
3324
|
if model_path.strip():
|
|
3266
3325
|
candidate['adhoc_model_path'] = model_path.strip()
|
|
3267
3326
|
if model_id.strip():
|
|
@@ -3338,6 +3397,8 @@ def server_load(server_id: str, request: Request, body: ServerLoadRequest | None
|
|
|
3338
3397
|
patch = body.model_dump(exclude_none=True)
|
|
3339
3398
|
model_path = patch.pop('model_path', None)
|
|
3340
3399
|
model_id = patch.pop('model_id', None)
|
|
3400
|
+
if 'gpu_device' in patch:
|
|
3401
|
+
patch['gpu_device'] = _request_gpu_device(patch['gpu_device'])
|
|
3341
3402
|
if patch:
|
|
3342
3403
|
server = _persist_server_merge(cfg, server_id, patch)
|
|
3343
3404
|
if model_path:
|
|
@@ -3354,31 +3415,27 @@ def server_load(server_id: str, request: Request, body: ServerLoadRequest | None
|
|
|
3354
3415
|
note_engine_loaded(server_id, loaded_by=_request_client_label(request))
|
|
3355
3416
|
_invalidate_status_cache()
|
|
3356
3417
|
return already
|
|
3357
|
-
elsewhere = find_target_loaded_elsewhere(
|
|
3358
|
-
server,
|
|
3359
|
-
cfg=cfg,
|
|
3360
|
-
model_path=model_path,
|
|
3361
|
-
exclude_server_id=server_id,
|
|
3362
|
-
)
|
|
3363
|
-
if elsewhere:
|
|
3364
|
-
raise HTTPException(status_code=409, detail=duplicate_load_detail(elsewhere))
|
|
3365
|
-
check = assess_load(server, cfg=cfg)
|
|
3366
|
-
if check.get('level') == 'block':
|
|
3367
|
-
raise HTTPException(status_code=400, detail=_vram_load_block_detail(check))
|
|
3368
3418
|
if _auto_stop_other_servers(cfg, server_id):
|
|
3369
3419
|
_invalidate_status_cache()
|
|
3370
3420
|
cfg = load_config()
|
|
3371
3421
|
server = _require_server(cfg, server_id)
|
|
3372
|
-
|
|
3373
|
-
|
|
3374
|
-
|
|
3422
|
+
if model_path:
|
|
3423
|
+
server = {**server, 'adhoc_model_path': model_path}
|
|
3424
|
+
# Single VRAM assess here; elsewhere/duplicate checks run inside
|
|
3425
|
+
# load_server_checkpoint under the load lock (avoid a second full scan).
|
|
3426
|
+
check = assess_load(server, cfg=cfg)
|
|
3427
|
+
if check.get('level') == 'block':
|
|
3428
|
+
raise HTTPException(status_code=400, detail=_vram_load_block_detail(check))
|
|
3375
3429
|
result = load_server_checkpoint(
|
|
3376
3430
|
server,
|
|
3377
3431
|
cfg=cfg,
|
|
3378
3432
|
model_path=model_path,
|
|
3379
3433
|
model_id=model_id,
|
|
3434
|
+
skip_memory_check=True,
|
|
3380
3435
|
)
|
|
3381
3436
|
if not result.get('success'):
|
|
3437
|
+
if result.get('already_loaded_elsewhere'):
|
|
3438
|
+
raise HTTPException(status_code=409, detail=duplicate_load_detail(result))
|
|
3382
3439
|
raise HTTPException(
|
|
3383
3440
|
status_code=409 if result.get('repair') else 400,
|
|
3384
3441
|
detail=result,
|
|
@@ -3387,6 +3444,7 @@ def server_load(server_id: str, request: Request, body: ServerLoadRequest | None
|
|
|
3387
3444
|
_invalidate_status_cache()
|
|
3388
3445
|
if check.get('level') == 'warn' and check.get('message'):
|
|
3389
3446
|
result['memory_warning'] = check['message']
|
|
3447
|
+
result.setdefault('gpu_device', str(server.get('gpu_device') or 'auto'))
|
|
3390
3448
|
return result
|
|
3391
3449
|
|
|
3392
3450
|
|