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.
Files changed (202) hide show
  1. {dflash_console-0.3.241 → dflash_console-0.3.249}/PKG-INFO +7 -3
  2. {dflash_console-0.3.241 → dflash_console-0.3.249}/README.md +6 -2
  3. {dflash_console-0.3.241 → dflash_console-0.3.249}/api/app.py +74 -16
  4. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/api_catalog.py +456 -454
  5. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/auto_register.py +2 -1
  6. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/catalog_load.py +300 -259
  7. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/embedding_server.py +407 -407
  8. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_devices.py +387 -373
  9. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_catalog_cache.py +20 -1
  10. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_local_match.py +14 -1
  11. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/huggingface.py +124 -13
  12. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/local_models.py +7 -4
  13. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/memory_guardrails.py +600 -598
  14. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/net_listeners.py +130 -0
  15. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtime.py +1740 -1728
  16. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/faster_whisper.py +8 -1
  17. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/freetoken.py +3 -0
  18. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/stt.py +5 -0
  19. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/transformers_hf.py +398 -395
  20. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/vibevoice.py +4 -1
  21. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/vllm.py +437 -427
  22. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/server_boot.py +2182 -2048
  23. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/version.py +1 -1
  24. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/vision_setup.py +11 -0
  25. {dflash_console-0.3.241 → dflash_console-0.3.249}/pyproject.toml +1 -1
  26. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/dflash-console.css +46 -0
  27. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/dflash-shell.css +9999 -9753
  28. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/index.html +15 -10
  29. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/download-queue.js +40 -1
  30. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/downloads-live.js +2 -1
  31. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/model-search-live.js +5 -2
  32. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/models-live.js +4371 -4161
  33. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/select-theme.js +430 -412
  34. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/server-live.js +5771 -5659
  35. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/server-reload-watch.js +181 -139
  36. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/status-feed.js +319 -309
  37. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/table-column-resize.js +4 -3
  38. {dflash_console-0.3.241 → dflash_console-0.3.249}/.gitignore +0 -0
  39. {dflash_console-0.3.241 → dflash_console-0.3.249}/LICENSE +0 -0
  40. {dflash_console-0.3.241 → dflash_console-0.3.249}/NOTICE.md +0 -0
  41. {dflash_console-0.3.241 → dflash_console-0.3.249}/api/__init__.py +0 -0
  42. {dflash_console-0.3.241 → dflash_console-0.3.249}/api/gateway.py +0 -0
  43. {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_console_logo.png +0 -0
  44. {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_console_logo_only.png +0 -0
  45. {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_console_logo_only2.png +0 -0
  46. {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_console_logo_only_clear.png +0 -0
  47. {dflash_console-0.3.241 → dflash_console-0.3.249}/assets/dflash_txt_logo.png +0 -0
  48. {dflash_console-0.3.241 → dflash_console-0.3.249}/config.example.json +0 -0
  49. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/__init__.py +0 -0
  50. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/api_access_log.py +0 -0
  51. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/api_introspection.py +0 -0
  52. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/api_providers.py +0 -0
  53. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/chat_proxy.py +0 -0
  54. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/chat_queue.py +0 -0
  55. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/chat_ready.py +0 -0
  56. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/chat_vision.py +0 -0
  57. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/client_identity.py +0 -0
  58. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/components_hub.py +0 -0
  59. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/config.py +0 -0
  60. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/dflash_generation.py +0 -0
  61. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/diagnostics_bundle.py +0 -0
  62. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/display_names.py +0 -0
  63. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/engine_state.py +0 -0
  64. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/freetoken_runtime_install.py +0 -0
  65. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/fs_browse.py +0 -0
  66. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/fs_reveal.py +0 -0
  67. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gateway_access_log.py +0 -0
  68. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gateway_routing.py +0 -0
  69. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gguf_meta.py +0 -0
  70. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_policy.py +0 -0
  71. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_process_memory_windows.py +0 -0
  72. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_processes.py +0 -0
  73. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/gpu_relief.py +0 -0
  74. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hardware_apply.py +0 -0
  75. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hardware_info.py +0 -0
  76. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_catalog_draft.py +0 -0
  77. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_catalog_index.py +0 -0
  78. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_catalog_recommend.py +0 -0
  79. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_engines.py +0 -0
  80. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_install.py +0 -0
  81. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/hf_model_fit.py +0 -0
  82. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/inference_stats.py +0 -0
  83. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/library_import.py +0 -0
  84. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/load_progress.py +0 -0
  85. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/log_utils.py +0 -0
  86. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_discovery.py +0 -0
  87. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_paths.py +0 -0
  88. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_presets.py +0 -0
  89. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_runtime_policy.py +0 -0
  90. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/model_stack.py +0 -0
  91. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/node_connect.py +0 -0
  92. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/ocr_setup.py +0 -0
  93. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/remote_nodes.py +0 -0
  94. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtime_install_job.py +0 -0
  95. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtime_recommendations.py +0 -0
  96. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/__init__.py +0 -0
  97. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/base.py +0 -0
  98. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/contention.py +0 -0
  99. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/noop.py +0 -0
  100. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/ollama.py +0 -0
  101. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/piper.py +0 -0
  102. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/runtimes/registry.py +0 -0
  103. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/setup.py +0 -0
  104. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/stack_match.py +0 -0
  105. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/status_report.py +0 -0
  106. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/support_journal.py +0 -0
  107. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/system_stats.py +0 -0
  108. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/transformers_runtime_install.py +0 -0
  109. {dflash_console-0.3.241 → dflash_console-0.3.249}/core/vllm_runtime_install.py +0 -0
  110. {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/__init__.py +0 -0
  111. {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/__main__.py +0 -0
  112. {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/cli.py +0 -0
  113. {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/commands.py +0 -0
  114. {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/http.py +0 -0
  115. {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/render.py +0 -0
  116. {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/resolve.py +0 -0
  117. {dflash_console-0.3.241 → dflash_console-0.3.249}/dflash_cli/server_takeover.py +0 -0
  118. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/AGENT-PROMPT-CLIENT-IDENTITY.md +0 -0
  119. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/AGENT-PROMPT-DFLASH-TRANSLATION-PERF-AI-TOOLS.md +0 -0
  120. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/AGENT-PROMPT-TRANSLATEGEMMA-AI-TOOLS.md +0 -0
  121. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ARCHITECTURE.md +0 -0
  122. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/BUG-REPORTS.md +0 -0
  123. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/CLI.md +0 -0
  124. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/CLIENT-IDENTITY.md +0 -0
  125. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/CURSOR.md +0 -0
  126. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/GOING-PUBLIC.md +0 -0
  127. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/LICENSING.md +0 -0
  128. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/LINUX-CLI.md +0 -0
  129. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/MULTI-MODAL-AGENT-PROMPT.md +0 -0
  130. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/MULTI-MODAL-RUNTIME-PLAN.md +0 -0
  131. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/PRODUCTION.md +0 -0
  132. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/RELEASING.md +0 -0
  133. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/STT-ENGINE-DECISION.md +0 -0
  134. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/USER-GUIDE.md +0 -0
  135. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/announcements/public-preview-v0.3.103.md +0 -0
  136. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/announcements/public-preview-v0.3.122.md +0 -0
  137. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/announcements/public-preview.md +0 -0
  138. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/automatic-updates.md +0 -0
  139. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/plans/shared-speak-stt-service.md +0 -0
  140. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.103.md +0 -0
  141. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.106.md +0 -0
  142. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.117.md +0 -0
  143. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.118.md +0 -0
  144. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.119.md +0 -0
  145. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.120.md +0 -0
  146. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.121.md +0 -0
  147. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.122.md +0 -0
  148. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.123.md +0 -0
  149. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.128.md +0 -0
  150. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.129.md +0 -0
  151. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.132.md +0 -0
  152. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.133.md +0 -0
  153. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/release-notes-0.3.208.md +0 -0
  154. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/README.md +0 -0
  155. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/devices-view.md +0 -0
  156. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/model-search.md +0 -0
  157. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/models-view.md +0 -0
  158. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/nodes-v1-plan.md +0 -0
  159. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-appearance.md +0 -0
  160. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-chat.md +0 -0
  161. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-developer.md +0 -0
  162. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-general.md +0 -0
  163. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-hardware.md +0 -0
  164. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-integrations.md +0 -0
  165. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-lm-link.md +0 -0
  166. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-model-defaults.md +0 -0
  167. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-runtime.md +0 -0
  168. {dflash_console-0.3.241 → dflash_console-0.3.249}/docs/ui/settings-runtimes.md +0 -0
  169. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/app-functional.html +0 -0
  170. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/dflash-console.css.bak-density +0 -0
  171. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/dflash-shell.css.bak-density +0 -0
  172. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/css/studio.css +0 -0
  173. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/about-live.js +0 -0
  174. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/app-settings-live.js +0 -0
  175. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/app.js +0 -0
  176. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/bug-report-live.js +0 -0
  177. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/chat-live.js +0 -0
  178. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/component-install-live.js +0 -0
  179. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/console-api.js +0 -0
  180. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/dashboard.js +0 -0
  181. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/desktop-shell.js +0 -0
  182. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/dflash-console-ui.js +0 -0
  183. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/docs-live.js +0 -0
  184. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/library-browse-live.js +0 -0
  185. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/library-scan-live.js +0 -0
  186. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/library-type-options.js +0 -0
  187. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/log-format.js +0 -0
  188. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/model-card.js +0 -0
  189. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/model-catalog-groups.js +0 -0
  190. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/nodes-live.js +0 -0
  191. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/runtime-recommendations.js +0 -0
  192. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/runtime-steppers.js +0 -0
  193. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/settings-live.js +0 -0
  194. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/settings-live.js.api-providers-bak +0 -0
  195. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/settings-live.js.pre-api-merge-bak +0 -0
  196. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/setup-wizard-live.js +0 -0
  197. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/speak-live.js +0 -0
  198. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/stack-wizard.js +0 -0
  199. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/sysbar-live.js +0 -0
  200. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/js/ui-layout-prefs.js +0 -0
  201. {dflash_console-0.3.241 → dflash_console-0.3.249}/static/vendor/marked.min.js +0 -0
  202. {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.241
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.241
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.241)
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.241
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.241)
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
- merged = normalize_server({**entry, **body.model_dump(exclude_none=True), 'id': server_id})
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
- check = assess_load(server, cfg=cfg)
3373
- if check.get('level') == 'block':
3374
- raise HTTPException(status_code=400, detail=_vram_load_block_detail(check))
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