dflash-console 0.3.231__tar.gz → 0.3.232__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 (199) hide show
  1. {dflash_console-0.3.231 → dflash_console-0.3.232}/PKG-INFO +3 -3
  2. {dflash_console-0.3.231 → dflash_console-0.3.232}/README.md +2 -2
  3. {dflash_console-0.3.231 → dflash_console-0.3.232}/api/app.py +6 -4
  4. {dflash_console-0.3.231 → dflash_console-0.3.232}/api/gateway.py +39 -5
  5. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/chat_proxy.py +758 -708
  6. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hf_local_match.py +50 -1
  7. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/huggingface.py +5292 -4963
  8. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/library_import.py +22 -1
  9. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/version.py +1 -1
  10. {dflash_console-0.3.231 → dflash_console-0.3.232}/pyproject.toml +1 -1
  11. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/css/dflash-console.css +6 -3
  12. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/css/dflash-shell.css +222 -43
  13. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/index.html +2 -2
  14. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/download-queue.js +945 -927
  15. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/models-live.js +51 -28
  16. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/server-live.js +135 -9
  17. {dflash_console-0.3.231 → dflash_console-0.3.232}/.gitignore +0 -0
  18. {dflash_console-0.3.231 → dflash_console-0.3.232}/LICENSE +0 -0
  19. {dflash_console-0.3.231 → dflash_console-0.3.232}/NOTICE.md +0 -0
  20. {dflash_console-0.3.231 → dflash_console-0.3.232}/api/__init__.py +0 -0
  21. {dflash_console-0.3.231 → dflash_console-0.3.232}/assets/dflash_console_logo.png +0 -0
  22. {dflash_console-0.3.231 → dflash_console-0.3.232}/assets/dflash_console_logo_only.png +0 -0
  23. {dflash_console-0.3.231 → dflash_console-0.3.232}/assets/dflash_console_logo_only2.png +0 -0
  24. {dflash_console-0.3.231 → dflash_console-0.3.232}/assets/dflash_console_logo_only_clear.png +0 -0
  25. {dflash_console-0.3.231 → dflash_console-0.3.232}/assets/dflash_txt_logo.png +0 -0
  26. {dflash_console-0.3.231 → dflash_console-0.3.232}/config.example.json +0 -0
  27. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/__init__.py +0 -0
  28. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/api_access_log.py +0 -0
  29. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/api_catalog.py +0 -0
  30. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/api_introspection.py +0 -0
  31. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/api_providers.py +0 -0
  32. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/auto_register.py +0 -0
  33. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/catalog_load.py +0 -0
  34. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/chat_ready.py +0 -0
  35. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/chat_vision.py +0 -0
  36. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/client_identity.py +0 -0
  37. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/components_hub.py +0 -0
  38. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/config.py +0 -0
  39. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/dflash_generation.py +0 -0
  40. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/diagnostics_bundle.py +0 -0
  41. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/display_names.py +0 -0
  42. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/embedding_server.py +0 -0
  43. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/engine_state.py +0 -0
  44. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/freetoken_runtime_install.py +0 -0
  45. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/fs_browse.py +0 -0
  46. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/fs_reveal.py +0 -0
  47. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/gateway_routing.py +0 -0
  48. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/gguf_meta.py +0 -0
  49. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/gpu_devices.py +0 -0
  50. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/gpu_policy.py +0 -0
  51. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/gpu_process_memory_windows.py +0 -0
  52. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/gpu_processes.py +0 -0
  53. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/gpu_relief.py +0 -0
  54. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hardware_apply.py +0 -0
  55. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hardware_info.py +0 -0
  56. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hf_catalog_cache.py +0 -0
  57. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hf_catalog_index.py +0 -0
  58. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hf_catalog_recommend.py +0 -0
  59. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hf_engines.py +0 -0
  60. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hf_install.py +0 -0
  61. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/hf_model_fit.py +0 -0
  62. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/inference_stats.py +0 -0
  63. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/load_progress.py +0 -0
  64. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/local_models.py +0 -0
  65. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/log_utils.py +0 -0
  66. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/memory_guardrails.py +0 -0
  67. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/model_discovery.py +0 -0
  68. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/model_paths.py +0 -0
  69. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/model_presets.py +0 -0
  70. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/model_runtime_policy.py +0 -0
  71. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/model_stack.py +0 -0
  72. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/net_listeners.py +0 -0
  73. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/node_connect.py +0 -0
  74. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/ocr_setup.py +0 -0
  75. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/remote_nodes.py +0 -0
  76. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtime.py +0 -0
  77. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtime_install_job.py +0 -0
  78. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtime_recommendations.py +0 -0
  79. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/__init__.py +0 -0
  80. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/base.py +0 -0
  81. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/contention.py +0 -0
  82. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/faster_whisper.py +0 -0
  83. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/freetoken.py +0 -0
  84. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/noop.py +0 -0
  85. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/ollama.py +0 -0
  86. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/piper.py +0 -0
  87. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/registry.py +0 -0
  88. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/stt.py +0 -0
  89. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/transformers_hf.py +0 -0
  90. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/vibevoice.py +0 -0
  91. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/runtimes/vllm.py +0 -0
  92. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/server_boot.py +0 -0
  93. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/setup.py +0 -0
  94. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/stack_match.py +0 -0
  95. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/status_report.py +0 -0
  96. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/support_journal.py +0 -0
  97. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/system_stats.py +0 -0
  98. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/transformers_runtime_install.py +0 -0
  99. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/vision_setup.py +0 -0
  100. {dflash_console-0.3.231 → dflash_console-0.3.232}/core/vllm_runtime_install.py +0 -0
  101. {dflash_console-0.3.231 → dflash_console-0.3.232}/dflash_cli/__init__.py +0 -0
  102. {dflash_console-0.3.231 → dflash_console-0.3.232}/dflash_cli/__main__.py +0 -0
  103. {dflash_console-0.3.231 → dflash_console-0.3.232}/dflash_cli/cli.py +0 -0
  104. {dflash_console-0.3.231 → dflash_console-0.3.232}/dflash_cli/commands.py +0 -0
  105. {dflash_console-0.3.231 → dflash_console-0.3.232}/dflash_cli/http.py +0 -0
  106. {dflash_console-0.3.231 → dflash_console-0.3.232}/dflash_cli/render.py +0 -0
  107. {dflash_console-0.3.231 → dflash_console-0.3.232}/dflash_cli/resolve.py +0 -0
  108. {dflash_console-0.3.231 → dflash_console-0.3.232}/dflash_cli/server_takeover.py +0 -0
  109. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/AGENT-PROMPT-CLIENT-IDENTITY.md +0 -0
  110. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/AGENT-PROMPT-DFLASH-TRANSLATION-PERF-AI-TOOLS.md +0 -0
  111. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/AGENT-PROMPT-TRANSLATEGEMMA-AI-TOOLS.md +0 -0
  112. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ARCHITECTURE.md +0 -0
  113. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/BUG-REPORTS.md +0 -0
  114. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/CLI.md +0 -0
  115. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/CLIENT-IDENTITY.md +0 -0
  116. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/CURSOR.md +0 -0
  117. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/GOING-PUBLIC.md +0 -0
  118. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/LICENSING.md +0 -0
  119. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/LINUX-CLI.md +0 -0
  120. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/MULTI-MODAL-AGENT-PROMPT.md +0 -0
  121. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/MULTI-MODAL-RUNTIME-PLAN.md +0 -0
  122. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/PRODUCTION.md +0 -0
  123. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/RELEASING.md +0 -0
  124. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/STT-ENGINE-DECISION.md +0 -0
  125. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/USER-GUIDE.md +0 -0
  126. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/announcements/public-preview-v0.3.103.md +0 -0
  127. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/announcements/public-preview-v0.3.122.md +0 -0
  128. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/announcements/public-preview.md +0 -0
  129. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/automatic-updates.md +0 -0
  130. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/plans/shared-speak-stt-service.md +0 -0
  131. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.103.md +0 -0
  132. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.106.md +0 -0
  133. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.117.md +0 -0
  134. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.118.md +0 -0
  135. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.119.md +0 -0
  136. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.120.md +0 -0
  137. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.121.md +0 -0
  138. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.122.md +0 -0
  139. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.123.md +0 -0
  140. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.128.md +0 -0
  141. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.129.md +0 -0
  142. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.132.md +0 -0
  143. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.133.md +0 -0
  144. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/release-notes-0.3.208.md +0 -0
  145. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/README.md +0 -0
  146. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/devices-view.md +0 -0
  147. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/model-search.md +0 -0
  148. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/models-view.md +0 -0
  149. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/nodes-v1-plan.md +0 -0
  150. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-appearance.md +0 -0
  151. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-chat.md +0 -0
  152. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-developer.md +0 -0
  153. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-general.md +0 -0
  154. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-hardware.md +0 -0
  155. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-integrations.md +0 -0
  156. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-lm-link.md +0 -0
  157. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-model-defaults.md +0 -0
  158. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-runtime.md +0 -0
  159. {dflash_console-0.3.231 → dflash_console-0.3.232}/docs/ui/settings-runtimes.md +0 -0
  160. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/app-functional.html +0 -0
  161. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/css/dflash-console.css.bak-density +0 -0
  162. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/css/dflash-shell.css.bak-density +0 -0
  163. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/css/studio.css +0 -0
  164. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/about-live.js +0 -0
  165. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/app-settings-live.js +0 -0
  166. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/app.js +0 -0
  167. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/bug-report-live.js +0 -0
  168. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/chat-live.js +0 -0
  169. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/component-install-live.js +0 -0
  170. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/console-api.js +0 -0
  171. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/dashboard.js +0 -0
  172. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/desktop-shell.js +0 -0
  173. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/dflash-console-ui.js +0 -0
  174. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/docs-live.js +0 -0
  175. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/downloads-live.js +0 -0
  176. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/library-browse-live.js +0 -0
  177. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/library-scan-live.js +0 -0
  178. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/library-type-options.js +0 -0
  179. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/log-format.js +0 -0
  180. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/model-card.js +0 -0
  181. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/model-catalog-groups.js +0 -0
  182. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/model-search-live.js +0 -0
  183. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/nodes-live.js +0 -0
  184. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/runtime-recommendations.js +0 -0
  185. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/runtime-steppers.js +0 -0
  186. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/select-theme.js +0 -0
  187. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/server-reload-watch.js +0 -0
  188. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/settings-live.js +0 -0
  189. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/settings-live.js.api-providers-bak +0 -0
  190. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/settings-live.js.pre-api-merge-bak +0 -0
  191. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/setup-wizard-live.js +0 -0
  192. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/speak-live.js +0 -0
  193. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/stack-wizard.js +0 -0
  194. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/status-feed.js +0 -0
  195. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/sysbar-live.js +0 -0
  196. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/table-column-resize.js +0 -0
  197. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/js/ui-layout-prefs.js +0 -0
  198. {dflash_console-0.3.231 → dflash_console-0.3.232}/static/vendor/marked.min.js +0 -0
  199. {dflash_console-0.3.231 → dflash_console-0.3.232}/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.231
3
+ Version: 0.3.232
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.231
677
+ **Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.232
678
678
 
679
679
  ## Download (Windows)
680
680
 
@@ -753,7 +753,7 @@ 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.231)
756
+ ### Recent improvements (v0.3.232)
757
757
 
758
758
  - **Engine standby** — Running toggle gates load/chat until you arm the pipeline
759
759
  - **External GPU cards** — OneVoice, LM Studio, and other apps on the GPU; compact mobile layout; loading state expires when models are ready
@@ -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.231
11
+ **Developer:** ILAN AVIV · **UI:** [http://127.0.0.1:8900/](http://127.0.0.1:8900/) · **Version:** v0.3.232
12
12
 
13
13
  ## Download (Windows)
14
14
 
@@ -87,7 +87,7 @@ 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.231)
90
+ ### Recent improvements (v0.3.232)
91
91
 
92
92
  - **Engine standby** — Running toggle gates load/chat until you arm the pipeline
93
93
  - **External GPU cards** — OneVoice, LM Studio, and other apps on the GPU; compact mobile layout; loading state expires when models are ready
@@ -3429,14 +3429,15 @@ async def proxy_chat_completions(server_id: str, request: Request):
3429
3429
  extract_stream_completion_stats,
3430
3430
  is_reasoning_only_chunk,
3431
3431
  open_upstream_chat_stream,
3432
+ resolve_disable_reasoning_for_chat,
3432
3433
  sse_had_content_delta,
3433
3434
  sse_stream_complete,
3434
3435
  sse_stream_error_chunk,
3435
3436
  SSE_KEEPALIVE_COMMENT,
3436
3437
  upstream_chat_completion,
3437
- validate_reasoning_chat_request,
3438
3438
  wants_stream,
3439
3439
  )
3440
+ from core.client_identity import LABEL_UNKNOWN_API
3440
3441
  from core.inference_stats import mark_inference_end, mark_inference_start, note_completion_stats
3441
3442
  from core.local_models import model_has_reasoning
3442
3443
  from core.runtime import api_base_url, build_server_status
@@ -3541,12 +3542,13 @@ async def proxy_chat_completions(server_id: str, request: Request):
3541
3542
  raise HTTPException(status_code=400, detail='engine api_url not configured')
3542
3543
  # Non-reasoning models never negotiate reasoning: strip reasoning_effort and
3543
3544
  # thinking toggles so the API returns the regular chat behaviour.
3544
- disable_reasoning = request.headers.get('X-Disable-Reasoning') == '1'
3545
3545
  reasoning_model = model_has_reasoning(server)
3546
- reasoning_error = validate_reasoning_chat_request(
3546
+ attributed = bool(client_label) and client_label != LABEL_UNKNOWN_API
3547
+ disable_reasoning, reasoning_error = resolve_disable_reasoning_for_chat(
3547
3548
  raw,
3548
3549
  reasoning=reasoning_model,
3549
- disable_reasoning=disable_reasoning,
3550
+ disable_header=request.headers.get('X-Disable-Reasoning') == '1',
3551
+ attributed_client=attributed,
3550
3552
  )
3551
3553
  if reasoning_error:
3552
3554
  raise HTTPException(
@@ -442,6 +442,17 @@ async def _forward_chat(
442
442
  raw = await exc.response.aread()
443
443
  except Exception:
444
444
  raw = b''
445
+ try: # DFLASH_LOG_400_BODIES (stream path)
446
+ from pathlib import Path as _P
447
+ _log = _P(__file__).resolve().parents[1] / 'logs' / 'gateway-400-bodies.log'
448
+ _log.parent.mkdir(parents=True, exist_ok=True)
449
+ with _log.open('a', encoding='utf-8') as _fh:
450
+ _fh.write(
451
+ f"stream status={status} url={url} "
452
+ f"req={body[:2000]!r} resp={raw[:4000]!r}\n"
453
+ )
454
+ except Exception:
455
+ pass
445
456
  error_payload = _upstream_error_payload(raw, status)
446
457
  encoded = json.dumps(error_payload).encode('utf-8')
447
458
  if stream_requested:
@@ -466,6 +477,14 @@ async def _forward_chat(
466
477
  media_type = upstream.headers.get('content-type', 'application/json')
467
478
  status = upstream.status_code
468
479
  if status >= 400:
480
+ try: # DFLASH_LOG_400_BODIES
481
+ from pathlib import Path as _P
482
+ _log = _P(__file__).resolve().parents[1] / 'logs' / 'gateway-400-bodies.log'
483
+ _log.parent.mkdir(parents=True, exist_ok=True)
484
+ with _log.open('a', encoding='utf-8') as _fh:
485
+ _fh.write(f"status={status} url={url} body={content[:4000]!r}\n")
486
+ except Exception:
487
+ pass
469
488
  return Response(content=content, status_code=status, media_type=media_type)
470
489
  return Response(content=content, status_code=status, media_type=media_type)
471
490
 
@@ -576,17 +595,32 @@ async def chat_completions(request: Request) -> Response:
576
595
  body = json.dumps(payload).encode('utf-8')
577
596
  except Exception:
578
597
  body = None
598
+ disable_reasoning = request.headers.get('X-Disable-Reasoning') == '1'
579
599
  if body is not None:
580
- from core.chat_proxy import apply_reasoning_policy, validate_reasoning_chat_request
600
+ from core.chat_proxy import apply_reasoning_policy, resolve_disable_reasoning_for_chat
601
+ from core.client_identity import resolve_client_label, LABEL_UNKNOWN_API
581
602
 
582
- disable_reasoning = request.headers.get('X-Disable-Reasoning') == '1'
583
603
  reasoning_model = model_has_reasoning(server)
584
- reasoning_error = validate_reasoning_chat_request(
604
+ client_label = resolve_client_label(request)
605
+ attributed = bool(client_label) and client_label != LABEL_UNKNOWN_API
606
+ disable_reasoning, reasoning_error = resolve_disable_reasoning_for_chat(
585
607
  body,
586
608
  reasoning=reasoning_model,
587
- disable_reasoning=disable_reasoning,
609
+ disable_header=disable_reasoning,
610
+ attributed_client=attributed,
588
611
  )
589
612
  if reasoning_error:
613
+ try: # DFLASH_LOG_400_BODIES (gateway reject)
614
+ from pathlib import Path as _P
615
+ _log = _P(__file__).resolve().parents[1] / 'logs' / 'gateway-400-bodies.log'
616
+ _log.parent.mkdir(parents=True, exist_ok=True)
617
+ with _log.open('a', encoding='utf-8') as _fh:
618
+ _fh.write(
619
+ f"gateway_reject reason=reasoning_budget_too_low "
620
+ f"client={client_label!r} body={body[:2000]!r}\n"
621
+ )
622
+ except Exception:
623
+ pass
590
624
  raise HTTPException(
591
625
  status_code=400,
592
626
  detail={
@@ -604,7 +638,7 @@ async def chat_completions(request: Request) -> Response:
604
638
  disable_reasoning=disable_reasoning,
605
639
  )
606
640
  url = f"{_console_base(cfg)}/api/servers/{sid}/v1/chat/completions"
607
- filter_reasoning = request.headers.get('X-Disable-Reasoning') == '1'
641
+ filter_reasoning = disable_reasoning
608
642
  response = await _forward_chat(request, url, body, filter_reasoning=filter_reasoning)
609
643
  if isinstance(response, Response):
610
644
  response.headers['X-DFlash-Server-Id'] = sid