abstractcore 2.35.0__tar.gz → 2.35.1__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 (377) hide show
  1. {abstractcore-2.35.0 → abstractcore-2.35.1}/PKG-INFO +13 -12
  2. {abstractcore-2.35.0 → abstractcore-2.35.1}/README.md +1 -1
  3. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/route_engines.py +1 -1
  4. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/download.py +3 -5
  5. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/embeddings/manager.py +29 -0
  6. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/huggingface_provider.py +17 -0
  7. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/install_settings.py +13 -0
  8. abstractcore-2.35.1/abstractcore/utils/llama_cuda_swap.py +277 -0
  9. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/version.py +1 -1
  10. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/windows_dll.py +9 -1
  11. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/PKG-INFO +13 -12
  12. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/SOURCES.txt +1 -0
  13. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/requires.txt +11 -10
  14. {abstractcore-2.35.0 → abstractcore-2.35.1}/pyproject.toml +12 -10
  15. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_install_hints_no_bare_packages.py +7 -0
  16. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_install_settings.py +2 -2
  17. {abstractcore-2.35.0 → abstractcore-2.35.1}/LICENSE +0 -0
  18. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/__init__.py +0 -0
  19. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/__init__.py +0 -0
  20. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/__main__.py +0 -0
  21. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/app_config_utils.py +0 -0
  22. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/deepsearch.py +0 -0
  23. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/extractor.py +0 -0
  24. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/intent.py +0 -0
  25. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/judge.py +0 -0
  26. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/summarizer.py +0 -0
  27. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/__init__.py +0 -0
  28. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/detection.py +0 -0
  29. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/enums.py +0 -0
  30. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/response_postprocessing.py +0 -0
  31. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/thinking_controls.py +0 -0
  32. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/OCRA.ttf +0 -0
  33. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/OCRB.ttf +0 -0
  34. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/OCRBL.ttf +0 -0
  35. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/README.md +0 -0
  36. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/abstractframework_identity.json +0 -0
  37. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/adapter_metadata.schema.json +0 -0
  38. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/architecture_formats.json +0 -0
  39. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/bloc-schema.jsonld +0 -0
  40. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/llamacpp_known_architectures.json +0 -0
  41. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/model_capabilities.json +0 -0
  42. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/model_capabilities.schema.json +0 -0
  43. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/model_downloads_catalog.json +0 -0
  44. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/model_downloads_catalog.schema.json +0 -0
  45. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/semantic_models.md +0 -0
  46. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/session_schema.json +0 -0
  47. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/__init__.py +0 -0
  48. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/errors.py +0 -0
  49. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/host.py +0 -0
  50. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/music_selectors.py +0 -0
  51. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/registry.py +0 -0
  52. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/scene3d_selectors.py +0 -0
  53. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/types.py +0 -0
  54. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/vision_catalog.py +0 -0
  55. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/__init__.py +0 -0
  56. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/__init__.py +0 -0
  57. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/bodystructure.py +0 -0
  58. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/client.py +0 -0
  59. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/context.py +0 -0
  60. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/discovery.py +0 -0
  61. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/errors.py +0 -0
  62. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/imap_codec.py +0 -0
  63. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/legacy.py +0 -0
  64. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/limits.py +0 -0
  65. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/models.py +0 -0
  66. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/oauth.py +0 -0
  67. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/policy.py +0 -0
  68. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/search.py +0 -0
  69. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/store.py +0 -0
  70. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/vault.py +0 -0
  71. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/__init__.py +0 -0
  72. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/analytics.py +0 -0
  73. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/cache.py +0 -0
  74. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/config.py +0 -0
  75. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/exceptions.py +0 -0
  76. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/glyph_processor.py +0 -0
  77. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/optimizer.py +0 -0
  78. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/orchestrator.py +0 -0
  79. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/pil_text_renderer.py +0 -0
  80. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/quality.py +0 -0
  81. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/text_formatter.py +0 -0
  82. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/vision_compressor.py +0 -0
  83. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/__init__.py +0 -0
  84. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/capability_defaults.py +0 -0
  85. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/email_cli.py +0 -0
  86. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/engines.py +0 -0
  87. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/host_jobs.py +0 -0
  88. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/main.py +0 -0
  89. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/manager.py +0 -0
  90. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/model_catalog.py +0 -0
  91. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/model_contexts.py +0 -0
  92. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/model_materializer.py +0 -0
  93. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/model_verify.py +0 -0
  94. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/models_engines_cli.py +0 -0
  95. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/provider_profiles.py +0 -0
  96. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/recommendations.py +0 -0
  97. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/vision_config.py +0 -0
  98. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/console/__init__.py +0 -0
  99. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/console/theme_sync.py +0 -0
  100. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/console/themes.py +0 -0
  101. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/console/web.py +0 -0
  102. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/__init__.py +0 -0
  103. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/bloc_kv.py +0 -0
  104. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/bloc_metadata.py +0 -0
  105. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/cached_session.py +0 -0
  106. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/degeneration.py +0 -0
  107. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/endpoint_damping.py +0 -0
  108. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/enums.py +0 -0
  109. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/factory.py +0 -0
  110. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/file_blocs.py +0 -0
  111. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/file_boxes.py +0 -0
  112. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/generate_contract.py +0 -0
  113. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/interface.py +0 -0
  114. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/multimodal_generation.py +0 -0
  115. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/output_specs.py +0 -0
  116. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/retry.py +0 -0
  117. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/session.py +0 -0
  118. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/types.py +0 -0
  119. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/__init__.py +0 -0
  120. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/__init__.py +0 -0
  121. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/base.py +0 -0
  122. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/gguf.py +0 -0
  123. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/hf.py +0 -0
  124. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/logits.py +0 -0
  125. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/mlx.py +0 -0
  126. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/convert.py +0 -0
  127. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/encoding.py +0 -0
  128. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/__init__.py +0 -0
  129. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/base.py +0 -0
  130. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/labels.py +0 -0
  131. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/laya.py +0 -0
  132. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/remote.py +0 -0
  133. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/gguf_compat.py +0 -0
  134. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/head.py +0 -0
  135. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/kinds.py +0 -0
  136. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/loader.py +0 -0
  137. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/pool.py +0 -0
  138. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/render.py +0 -0
  139. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/runtime.py +0 -0
  140. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/tokenizers.py +0 -0
  141. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/types.py +0 -0
  142. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/embeddings/__init__.py +0 -0
  143. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/embeddings/models.py +0 -0
  144. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/endpoint/__init__.py +0 -0
  145. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/endpoint/app.py +0 -0
  146. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/events/__init__.py +0 -0
  147. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/exceptions/__init__.py +0 -0
  148. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/__init__.py +0 -0
  149. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/client.py +0 -0
  150. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/factory.py +0 -0
  151. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/naming.py +0 -0
  152. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/stdio_client.py +0 -0
  153. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/tool_source.py +0 -0
  154. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/__init__.py +0 -0
  155. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/auto_handler.py +0 -0
  156. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/base.py +0 -0
  157. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/capabilities.py +0 -0
  158. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/delivery.py +0 -0
  159. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/enrichment.py +0 -0
  160. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/handlers/__init__.py +0 -0
  161. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/handlers/anthropic_handler.py +0 -0
  162. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/handlers/local_handler.py +0 -0
  163. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/handlers/openai_handler.py +0 -0
  164. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/openai_parts.py +0 -0
  165. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/pdf_routing.py +0 -0
  166. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/__init__.py +0 -0
  167. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/audio_processor.py +0 -0
  168. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/direct_pdf_processor.py +0 -0
  169. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/glyph_pdf_processor.py +0 -0
  170. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/image_processor.py +0 -0
  171. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/office_processor.py +0 -0
  172. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/pdf_processor.py +0 -0
  173. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/text_processor.py +0 -0
  174. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/video_processor.py +0 -0
  175. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/types.py +0 -0
  176. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/utils/__init__.py +0 -0
  177. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/utils/image_scaler.py +0 -0
  178. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/utils/video_frames.py +0 -0
  179. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/vision_fallback.py +0 -0
  180. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/__init__.py +0 -0
  181. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_deepsearch.py +0 -0
  182. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_extractor.py +0 -0
  183. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_intent.py +0 -0
  184. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_judge.py +0 -0
  185. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_summarizer.py +0 -0
  186. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/__init__.py +0 -0
  187. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/_http.py +0 -0
  188. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/anthropic_provider.py +0 -0
  189. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/base.py +0 -0
  190. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/capability_host.py +0 -0
  191. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/endpoint_context.py +0 -0
  192. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/generation_cancel.py +0 -0
  193. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/generation_progress.py +0 -0
  194. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/gguf_shared.py +0 -0
  195. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/gguf_slots.py +0 -0
  196. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/hf_residency.py +0 -0
  197. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/lmstudio_provider.py +0 -0
  198. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_hy_v3.py +0 -0
  199. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_model_rules.py +0 -0
  200. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_native_cache.py +0 -0
  201. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_native_session.py +0 -0
  202. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_prefill_observer.py +0 -0
  203. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_provider.py +0 -0
  204. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_qwen4.py +0 -0
  205. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_residency.py +0 -0
  206. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_runtime.py +0 -0
  207. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_vision_addon.py +0 -0
  208. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/model_capabilities.py +0 -0
  209. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/model_config_fingerprint.py +0 -0
  210. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/ollama_provider.py +0 -0
  211. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/openai_compatible_provider.py +0 -0
  212. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/openai_provider.py +0 -0
  213. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/openrouter_provider.py +0 -0
  214. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/portkey_provider.py +0 -0
  215. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/process_residency.py +0 -0
  216. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/registry.py +0 -0
  217. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/speculation.py +0 -0
  218. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/streaming.py +0 -0
  219. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/tokenizer_fingerprint.py +0 -0
  220. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/typesafe_provider.py +0 -0
  221. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/vllm_provider.py +0 -0
  222. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/weights_fingerprint.py +0 -0
  223. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/py.typed +0 -0
  224. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/__init__.py +0 -0
  225. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/__main__.py +0 -0
  226. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/app.py +0 -0
  227. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/audio_endpoints.py +0 -0
  228. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/auth_policy.py +0 -0
  229. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/camera_endpoints.py +0 -0
  230. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/capability_generation.py +0 -0
  231. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/console_routes.py +0 -0
  232. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/credentials.py +0 -0
  233. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/email_routes.py +0 -0
  234. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/first_run.py +0 -0
  235. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/host_routes.py +0 -0
  236. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/managed.py +0 -0
  237. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/scene3d_endpoints.py +0 -0
  238. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/session_routes.py +0 -0
  239. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/vision_endpoints.py +0 -0
  240. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/__init__.py +0 -0
  241. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/handler.py +0 -0
  242. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/json_schema.py +0 -0
  243. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/retry.py +0 -0
  244. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/schema_compat.py +0 -0
  245. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/testing/__init__.py +0 -0
  246. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/testing/mailserver.py +0 -0
  247. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/__init__.py +0 -0
  248. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/abstractignore.py +0 -0
  249. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/arg_canonicalizer.py +0 -0
  250. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/arg_coercion.py +0 -0
  251. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/browser_tools.py +0 -0
  252. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/code_analysis.py +0 -0
  253. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/common_tools.py +0 -0
  254. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/comms_tools.py +0 -0
  255. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/core.py +0 -0
  256. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/email_digests.py +0 -0
  257. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/fetch_url_ssrf.py +0 -0
  258. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/handler.py +0 -0
  259. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/inventory.py +0 -0
  260. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/parser.py +0 -0
  261. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/process_tree.py +0 -0
  262. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/registry.py +0 -0
  263. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/risk_facts.py +0 -0
  264. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/sandbox.py +0 -0
  265. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/shell_session.py +0 -0
  266. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/shell_tools.py +0 -0
  267. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/syntax_rewriter.py +0 -0
  268. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/tag_rewriter.py +0 -0
  269. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/telegram_tdlib.py +0 -0
  270. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/telegram_tools.py +0 -0
  271. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/wire_naming.py +0 -0
  272. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/__init__.py +0 -0
  273. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/async_stream.py +0 -0
  274. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/cli.py +0 -0
  275. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/context_calibration.py +0 -0
  276. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/context_estimate.py +0 -0
  277. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/data_registry.py +0 -0
  278. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/display.py +0 -0
  279. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/file_filters.py +0 -0
  280. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/host_profile.py +0 -0
  281. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/hostinfo.py +0 -0
  282. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/identity.py +0 -0
  283. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/jsonish.py +0 -0
  284. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/kv_geometry.py +0 -0
  285. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/memory.py +0 -0
  286. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/message_preprocessor.py +0 -0
  287. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/model_cache.py +0 -0
  288. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/model_fit.py +0 -0
  289. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/residency.py +0 -0
  290. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/self_fixes.py +0 -0
  291. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/stdio.py +0 -0
  292. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/structured_logging.py +0 -0
  293. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/token_utils.py +0 -0
  294. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/trace_export.py +0 -0
  295. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/truncation.py +0 -0
  296. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/vlm_token_calculator.py +0 -0
  297. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/workspace_paths.py +0 -0
  298. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/dependency_links.txt +0 -0
  299. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/entry_points.txt +0 -0
  300. {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/top_level.txt +0 -0
  301. {abstractcore-2.35.0 → abstractcore-2.35.1}/setup.cfg +0 -0
  302. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_abstractendpoint_singleton_provider.py +0 -0
  303. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_agentic_cli_compatibility.py +0 -0
  304. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_basic_session.py +0 -0
  305. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv.py +0 -0
  306. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_cache_dtype.py +0 -0
  307. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_endpoint.py +0 -0
  308. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_engine_fingerprint.py +0 -0
  309. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_model_config_fingerprint.py +0 -0
  310. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_tokenizer_fingerprint.py +0 -0
  311. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_weights_fingerprint.py +0 -0
  312. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_metadata_json_extract.py +0 -0
  313. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_cached_session_kv_mode.py +0 -0
  314. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_cached_session_kv_thinking_prefix.py +0 -0
  315. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_capabilities_registry.py +0 -0
  316. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_capabilities_registry_preferred_backends_from_config.py +0 -0
  317. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_changelog_fragments.py +0 -0
  318. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_complete_integration.py +0 -0
  319. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_comprehensive_events.py +0 -0
  320. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_console_about.py +0 -0
  321. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_console_email_tab.py +0 -0
  322. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_console_web.py +0 -0
  323. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_core_components.py +0 -0
  324. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_display_rule.py +0 -0
  325. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_email_digests.py +0 -0
  326. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_embedding_model_shared_unit.py +0 -0
  327. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_embedding_model_token_warnings.py +0 -0
  328. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_enhanced_prompt.py +0 -0
  329. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_environment_variable_tool_call_tags.py +0 -0
  330. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_factory.py +0 -0
  331. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_file_bloc_store_unit.py +0 -0
  332. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_file_boxes_cached_session.py +0 -0
  333. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_final_accuracy.py +0 -0
  334. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_final_comprehensive.py +0 -0
  335. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_final_graceful_errors.py +0 -0
  336. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_generate_contract.py +0 -0
  337. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_generate_response_reasoning_property_unit.py +0 -0
  338. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_generate_with_outputs.py +0 -0
  339. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_graceful_fallback.py +0 -0
  340. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_import_debug.py +0 -0
  341. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_import_safety.py +0 -0
  342. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_incremental_thinking_tag_stripper.py +0 -0
  343. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_install_scripts.py +0 -0
  344. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_integrated_functionality.py +0 -0
  345. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_llms_sources.py +0 -0
  346. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_mcp_handshake.py +0 -0
  347. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_mcp_integration.py +0 -0
  348. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_mcp_stdio_client.py +0 -0
  349. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_model_not_downloaded_error_unit.py +0 -0
  350. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_multimodal_generate_output.py +0 -0
  351. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_openai_prompt_cache_key_passthrough.py +0 -0
  352. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_output_specs.py +0 -0
  353. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_packaging_assets.py +0 -0
  354. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_packaging_extras.py +0 -0
  355. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_packaging_packages_listed.py +0 -0
  356. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_api.py +0 -0
  357. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_bloc_composition.py +0 -0
  358. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_bloc_e2e_gate.py +0 -0
  359. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_control_plane.py +0 -0
  360. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_prepare_modules_thinking_http.py +0 -0
  361. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_retry_observability.py +0 -0
  362. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_retry_strategy.py +0 -0
  363. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_seed_determinism.py +0 -0
  364. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_seed_temperature_basic.py +0 -0
  365. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_sensory_prompting.py +0 -0
  366. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_server_prompt_cache_control_plane_proxy.py +0 -0
  367. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_server_prompt_cache_key_passthrough.py +0 -0
  368. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_session_reasoning_persistence_unit.py +0 -0
  369. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_sound_effect_seconds_route.py +0 -0
  370. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_sse_starlette_pin_unit.py +0 -0
  371. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_structured_output_truncation_retry.py +0 -0
  372. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_text_only_model_experience.py +0 -0
  373. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_timing_helper.py +0 -0
  374. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_unload_memory.py +0 -0
  375. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_user_scenario_validation.py +0 -0
  376. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_voice_host_credentials.py +0 -0
  377. {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_windows_host_fixes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractcore
3
- Version: 2.35.0
3
+ Version: 2.35.1
4
4
  Summary: Unified interface to all LLM providers with essential infrastructure for tool calling, streaming, and model management
5
5
  Author-email: Laurent-Philippe Albou <contact@abstractcore.ai>
6
6
  Maintainer-email: Laurent-Philippe Albou <contact@abstractcore.ai>
@@ -36,10 +36,11 @@ Requires-Dist: anthropic<1.0.0,>=0.25.0
36
36
  Requires-Dist: tiktoken<1.0.0,>=0.5.0
37
37
  Requires-Dist: requests<3.0.0,>=2.25.0
38
38
  Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0
39
- Requires-Dist: lxml<6.0.0,>=4.9.0
39
+ Requires-Dist: lxml<7.0.0,>=4.9.0
40
40
  Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10"
41
41
  Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10"
42
42
  Requires-Dist: psutil<8,>=5.9
43
+ Requires-Dist: huggingface_hub<2.0.0,>=0.20.0
43
44
  Requires-Dist: Pillow<13.0.0,>=10.0.0
44
45
  Requires-Dist: pypdf<7.0.0,>=6.0.0
45
46
  Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0
@@ -49,8 +50,8 @@ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0
49
50
  Requires-Dist: python-multipart<1.0.0,>=0.0.6
50
51
  Requires-Dist: sse-starlette<4,>=1.8
51
52
  Requires-Dist: cryptography>=41.0.0
52
- Requires-Dist: abstractvoice>=0.20.0
53
- Requires-Dist: abstractvision>=0.3.34
53
+ Requires-Dist: abstractvoice>=0.21.1
54
+ Requires-Dist: abstractvision>=0.3.36
54
55
  Requires-Dist: abstractmusic>=0.1.17; python_version >= "3.10"
55
56
  Requires-Dist: abstract3d>=0.3.2; python_version >= "3.10"
56
57
  Provides-Extra: apple
@@ -69,9 +70,9 @@ Requires-Dist: accelerate>=1.0.0; extra == "apple"
69
70
  Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "apple"
70
71
  Requires-Dist: numpy<3.0.0,>=2.1.0; extra == "apple"
71
72
  Requires-Dist: Pillow<13.0.0,>=12.1.1; extra == "apple"
72
- Requires-Dist: abstractvoice[all-apple]>=0.20.0; extra == "apple"
73
+ Requires-Dist: abstractvoice[all-apple]>=0.21.1; extra == "apple"
73
74
  Requires-Dist: omnivoice>=0.1.5; extra == "apple"
74
- Requires-Dist: abstractvision[all-apple]>=0.3.34; extra == "apple"
75
+ Requires-Dist: abstractvision[all-apple]>=0.3.36; extra == "apple"
75
76
  Requires-Dist: abstractmusic[all-apple]>=0.1.17; extra == "apple"
76
77
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "apple"
77
78
  Provides-Extra: gpu
@@ -87,9 +88,9 @@ Requires-Dist: gguf<1.0.0,>=0.10.0; extra == "gpu"
87
88
  Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "gpu"
88
89
  Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "gpu"
89
90
  Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "gpu"
90
- Requires-Dist: abstractvoice[all-gpu]>=0.20.0; extra == "gpu"
91
+ Requires-Dist: abstractvoice[all-gpu]>=0.21.1; extra == "gpu"
91
92
  Requires-Dist: omnivoice>=0.1.5; extra == "gpu"
92
- Requires-Dist: abstractvision[all-gpu]>=0.3.34; extra == "gpu"
93
+ Requires-Dist: abstractvision[all-gpu]>=0.3.36; extra == "gpu"
93
94
  Requires-Dist: abstractmusic[all-gpu]>=0.1.17; extra == "gpu"
94
95
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "gpu"
95
96
  Provides-Extra: remote
@@ -135,11 +136,11 @@ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "embeddings"
135
136
  Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "embeddings"
136
137
  Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "embeddings"
137
138
  Provides-Extra: vision-diffusers
138
- Requires-Dist: abstractvision[huggingface]>=0.3.34; extra == "vision-diffusers"
139
+ Requires-Dist: abstractvision[huggingface]>=0.3.36; extra == "vision-diffusers"
139
140
  Provides-Extra: vision-sdcpp
140
- Requires-Dist: abstractvision[sdcpp]>=0.3.34; extra == "vision-sdcpp"
141
+ Requires-Dist: abstractvision[sdcpp]>=0.3.36; extra == "vision-sdcpp"
141
142
  Provides-Extra: vision-local
142
- Requires-Dist: abstractvision[local]>=0.3.34; extra == "vision-local"
143
+ Requires-Dist: abstractvision[local]>=0.3.36; extra == "vision-local"
143
144
  Provides-Extra: browser
144
145
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "browser"
145
146
  Provides-Extra: pdf-pymupdf-commercial
@@ -196,7 +197,7 @@ Dynamic: license-file
196
197
  Unified LLM Interface
197
198
  > Write once, run everywhere
198
199
 
199
- What's new in 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2350---2026-11-07).
200
+ What's new in 2.35.1: a plain `pip install "abstractcore[gpu]"` on a Linux NVIDIA machine now runs GGUF models on the GPU (AbstractCore installs llama.cpp's CUDA build itself, once, the first time it is needed). In 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2351---2026-11-10).
200
201
 
201
202
  What's new in 2.34.0: a local model that no call has used for 60 minutes is unloaded from memory and loads
202
203
  again on its next call; a model kept loaded (Keep loaded) never is, and no running call is interrupted
@@ -9,7 +9,7 @@
9
9
  Unified LLM Interface
10
10
  > Write once, run everywhere
11
11
 
12
- What's new in 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2350---2026-11-07).
12
+ What's new in 2.35.1: a plain `pip install "abstractcore[gpu]"` on a Linux NVIDIA machine now runs GGUF models on the GPU (AbstractCore installs llama.cpp's CUDA build itself, once, the first time it is needed). In 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2351---2026-11-10).
13
13
 
14
14
  What's new in 2.34.0: a local model that no call has used for 60 minutes is unloaded from memory and loads
15
15
  again on its next call; a model kept loaded (Keep loaded) never is, and no running call is interrupted
@@ -63,7 +63,7 @@ __all__ = [
63
63
  # AbstractCore's AbstractVoice floor (it has `abstractvoice.engine_runtime`, the
64
64
  # public runtime probe, since 0.15.0). Mirrors the abstractvoice pins in
65
65
  # pyproject.toml; the release stager raises both together.
66
- ABSTRACTVOICE_ENGINE_RUNTIME_FLOOR = "0.20.0"
66
+ ABSTRACTVOICE_ENGINE_RUNTIME_FLOOR = "0.21.1"
67
67
 
68
68
  # Voice providers that run remotely: AbstractVoice needs nothing beyond its
69
69
  # core install for them, and whether they are configured is not a runtime
@@ -12,7 +12,7 @@ from enum import Enum
12
12
  from typing import Any, AsyncIterator, Dict, List, Optional
13
13
 
14
14
  import httpx
15
- from .utils.install_settings import local_engines_hint
15
+ from .utils.install_settings import light_repair_hint, local_engines_hint
16
16
 
17
17
 
18
18
  class DownloadStatus(Enum):
@@ -226,10 +226,8 @@ async def _download_huggingface(
226
226
  except ImportError:
227
227
  yield DownloadProgress(
228
228
  status=DownloadStatus.ERROR,
229
- message=(
230
- "huggingface_hub is not installed. "
231
- f"{local_engines_hint('Downloading Hugging Face models')}"
232
- ),
229
+ # huggingface_hub is part of the light set (2.35.1): missing means a broken install.
230
+ message=f"huggingface_hub is not installed: {light_repair_hint()}",
233
231
  )
234
232
  return
235
233
 
@@ -250,6 +250,35 @@ def _refuse_resident_gguf_embedding(path: Any) -> None:
250
250
  )
251
251
 
252
252
 
253
+ def release_shared_gguf_embeddings_at_exit() -> int:
254
+ """Close every resident GGUF embedding encoder (llama.cpp) before the interpreter tears modules
255
+ down. Without this, a process that embedded with a GGUF model on Apple silicon aborted at exit
256
+ with ``ggml-metal-device.m: GGML_ASSERT([rsets->data count] == 0)`` (exit code 134) after every
257
+ call had succeeded: the llama.cpp context was freed during module teardown, after the Metal
258
+ device, instead of before it (found on the Mac during the 0.14.0 profile proof, 2.35.1).
259
+ SentenceTransformer models need nothing here. Returns the number of encoders closed."""
260
+ closed = 0
261
+ with _SHARED_EMBEDDING_LOCK:
262
+ entries = list(_SHARED_EMBEDDING_MODELS.values())
263
+ for entry in entries:
264
+ model = entry.model
265
+ close = getattr(model, "close", None)
266
+ if model is None or not callable(close) or not hasattr(model, "_llm"):
267
+ continue
268
+ try:
269
+ close()
270
+ closed += 1
271
+ except Exception:
272
+ pass
273
+ entry.model = None
274
+ return closed
275
+
276
+
277
+ # Registered once at import: atexit handlers run before module teardown, in reverse order of
278
+ # registration, so the encoders go first (see release_shared_gguf_embeddings_at_exit).
279
+ atexit.register(release_shared_gguf_embeddings_at_exit)
280
+
281
+
253
282
  def _atexit_save_caches(ref: "weakref.ReferenceType") -> None:
254
283
  manager = ref()
255
284
  if manager is None:
@@ -1771,6 +1771,8 @@ class HuggingFaceProvider(BaseProvider):
1771
1771
  "context_reservation": dict(getattr(self, "_context_reservation", None) or {}),
1772
1772
  "requested_context": getattr(self, "_gguf_requested_context", None),
1773
1773
  "n_gpu_layers": self.n_gpu_layers,
1774
+ # Why GGUF runs where it runs on Linux + NVIDIA (utils/llama_cuda_swap): outcome and reason.
1775
+ "llama_cuda_swap": getattr(self, "gguf_cuda_swap", None),
1774
1776
  "max_output_tokens": self.max_output_tokens,
1775
1777
  "output_ceiling_source": getattr(self, "_output_ceiling_source", None),
1776
1778
  "prompt_cache_store": getattr(self, "_prompt_cache_store", None),
@@ -7054,6 +7056,21 @@ class HuggingFaceProvider(BaseProvider):
7054
7056
  # don't need to import PyTorch.
7055
7057
  supports_gpu_offload = False
7056
7058
  try:
7059
+ # Linux + NVIDIA: an install from PyPI alone carries the processor build of llama.cpp; the
7060
+ # CUDA build is swapped in once per environment before the first import (llama_cuda_swap).
7061
+ from ..utils.llama_cuda_swap import ensure_llama_cpp_cuda_build
7062
+
7063
+ self.gguf_cuda_swap = ensure_llama_cpp_cuda_build()
7064
+ if self.gguf_cuda_swap.get("outcome") == "skipped" and self.gguf_cuda_swap.get("build"):
7065
+ # A driver or card reason (a failed swap announces itself in llama_cuda_swap).
7066
+ from ..utils.llama_cuda_swap import notice
7067
+
7068
+ notice(
7069
+ "GGUF on the processor: llama-cpp-python is the CPU build and the CUDA build was not "
7070
+ f"installed ({self.gguf_cuda_swap.get('reason')}). The one-line installer does it; see "
7071
+ "docs/installation.md."
7072
+ )
7073
+ prepare_llama_cpp_import()
7057
7074
  import llama_cpp # type: ignore
7058
7075
 
7059
7076
  if sys.platform == "win32":
@@ -116,6 +116,11 @@ def light_repair_hint() -> str:
116
116
  return f"the AbstractCore install is incomplete; repair it with: {LIGHT_INSTALL}"
117
117
 
118
118
 
119
+ LLAMA_CPP_LINUX_NOTE = (
120
+ "llama.cpp has no prebuilt wheel on PyPI; the AbstractCore installer adds the right build for this "
121
+ "machine (curl -LsSf https://abstractframework.ai/core/install.sh | sh), and "
122
+ + GPU_INSTALL + " alone builds it from source (needs a C compiler)"
123
+ )
119
124
  LLAMA_CPP_WINDOWS_NOTE = (
120
125
  "on Windows the AbstractFramework installer adds llama.cpp's prebuilt GPU build; with plain pip, "
121
126
  "llama.cpp is not part of abstractcore[gpu] on Windows"
@@ -137,4 +142,12 @@ def llama_cpp_hint(what: str = "GGUF models (llama.cpp)") -> str:
137
142
 
138
143
  if sys.platform == "win32" and local_engines_setting() == "gpu":
139
144
  return f"{what}: {LLAMA_CPP_WINDOWS_NOTE}"
145
+ if sys.platform.startswith("linux") and local_engines_setting() == "gpu":
146
+ # PyPI has llama-cpp-python as a source build only: `abstractcore[gpu]` compiles it (a C
147
+ # compiler and, for CUDA, the toolkit), while the installer adds the prebuilt wheel for this
148
+ # machine (CPU, or CUDA swapped in by AbstractCore itself; utils/llama_cuda_swap). Found on a
149
+ # processor-only Linux host during the 0.14.0 profile proof (2.35.1).
150
+ return (
151
+ f"{what}: {LLAMA_CPP_LINUX_NOTE}"
152
+ )
140
153
  return local_engines_hint(what)
@@ -0,0 +1,277 @@
1
+ """Give a plain ``pip install "abstractcore[gpu]"`` the CUDA build of llama.cpp on an NVIDIA Linux host.
2
+
3
+ The requirement (operator, 2026-11-10): the ``gpu`` install must work fully on a GPU machine, GGUF models
4
+ included. PyPI carries ``llama-cpp-python`` as a source build only, so pip resolves abetlen's prebuilt
5
+ *processor* wheel (``llama_supports_gpu_offload()`` is False) and every GGUF model runs on the CPU
6
+ although PyTorch sees the card. The prebuilt CUDA builds live on abetlen's own index
7
+ (https://abetlen.github.io/llama-cpp-python/whl/<build>/), which a pip extra cannot name, and they are
8
+ 400 to 600 MB each, above PyPI's file limit, so they cannot be re-hosted there either.
9
+
10
+ The one-line installers already swap the CUDA build in after the install (``scripts/install.sh``,
11
+ the framework installer). This module does the same swap from inside the package, once per
12
+ environment, the first time AbstractCore is about to import ``llama_cpp`` on a host where it would
13
+ otherwise run GGUF on the processor:
14
+
15
+ 1. Linux x86_64 only (the CUDA pages carry ``manylinux_2_35_x86_64`` wheels alone), opt-out with
16
+ ``ABSTRACTCORE_LLAMA_CUDA_SWAP=0``.
17
+ 2. The installed ``llama_cpp`` is a CUDA build already (``lib/libggml-cuda.so``, the way the installers
18
+ leave it): nothing to do, no pip call. This is the common case on a host set up by the one-liners.
19
+ 3. PyTorch's CUDA major is read from ``torch/version.py`` on disk (torch is never imported here) and the
20
+ NVIDIA driver from ``nvidia-smi``: CUDA 13 wants driver 580 or newer (build ``cu130``), CUDA 12 wants
21
+ 525 or newer (``cu125``). Without a CUDA torch, a driver, or with one too old, the processor build
22
+ stays and the reason is recorded.
23
+ 4. The swap is the installers' command: ``pip install --no-index --no-deps --force-reinstall
24
+ --find-links <index>/<build>/llama-cpp-python/ llama-cpp-python==<installed version>`` (``uv pip``
25
+ with ``--reinstall-package`` when the environment has no pip, as uv venvs do). Same version, same
26
+ files the installer would have written. One loud log line before and after.
27
+ 5. The outcome is written next to the package (``site-packages/llama_cpp/.abstractcore-cuda-swap.json``)
28
+ so a failed swap (offline host, read-only site-packages) is not retried at every model load; a
29
+ reinstall of llama-cpp-python removes the marker with the folder and the check runs again.
30
+
31
+ `ensure_llama_cpp_cuda_build()` returns a dict (``outcome``, ``reason``, ``build``, ``version``) that the
32
+ HuggingFace provider records in its runtime info, so a user whose GGUF model still runs on the processor
33
+ reads why in the first answer. When ``llama_cpp`` was already imported in this process (the processor
34
+ library is loaded), the swap still happens on disk and the outcome says the next process gets the GPU.
35
+ """
36
+
37
+ from __future__ import annotations
38
+
39
+ import importlib.metadata
40
+ import importlib.util
41
+ import json
42
+ import logging
43
+ import os
44
+ import platform
45
+ import re
46
+ import shutil
47
+ import subprocess
48
+ import sys
49
+ import time
50
+ from pathlib import Path
51
+ from typing import Any, Dict, List, Optional
52
+
53
+ logger = logging.getLogger(__name__)
54
+
55
+ INDEX = "https://abetlen.github.io/llama-cpp-python/whl"
56
+ # CUDA major of the installed torch -> (llama.cpp build folder, minimum NVIDIA driver major).
57
+ BUILDS: Dict[int, tuple] = {13: ("cu130", 580), 12: ("cu125", 525)}
58
+ ENV_OPT_OUT = "ABSTRACTCORE_LLAMA_CUDA_SWAP"
59
+ MARKER_NAME = ".abstractcore-cuda-swap.json"
60
+ SWAP_TIMEOUT_S = 900
61
+
62
+ _result: Optional[Dict[str, Any]] = None
63
+
64
+
65
+ def _package_dir(name: str) -> Optional[Path]:
66
+ try:
67
+ spec = importlib.util.find_spec(name)
68
+ except Exception:
69
+ return None
70
+ if spec is None:
71
+ return None
72
+ locations = list(spec.submodule_search_locations or [])
73
+ if not locations and spec.origin:
74
+ locations = [str(Path(spec.origin).parent)]
75
+ return Path(locations[0]) if locations else None
76
+
77
+
78
+ def llama_cpp_is_cuda_build() -> bool:
79
+ """True when the installed llama-cpp-python ships its CUDA backend. Never imports llama_cpp."""
80
+ pkg = _package_dir("llama_cpp")
81
+ if pkg is None:
82
+ return False
83
+ lib = pkg / "lib"
84
+ return lib.is_dir() and any(lib.glob("libggml-cuda.so*"))
85
+
86
+
87
+ def torch_cuda_major() -> Optional[int]:
88
+ """The CUDA major of the installed torch wheel, read from ``torch/version.py`` (``cuda = '13.0'``);
89
+ None without torch or for a processor/ROCm build. torch is never imported."""
90
+ pkg = _package_dir("torch")
91
+ if pkg is None:
92
+ return None
93
+ try:
94
+ text = (pkg / "version.py").read_text(encoding="utf-8", errors="replace")
95
+ except OSError:
96
+ return None
97
+ # torch <= 2.12: `cuda = '13.0'`; torch 2.13: `cuda: Optional[str] = '13.0'` (annotated).
98
+ match = re.search(r"^cuda\s*(?::[^=\n]*)?=\s*['\"](\d+)\.(\d+)['\"]", text, re.MULTILINE)
99
+ return int(match.group(1)) if match else None
100
+
101
+
102
+ def nvidia_driver_major() -> Optional[int]:
103
+ """The NVIDIA driver's major version from ``nvidia-smi``; None when no driver answers."""
104
+ exe = shutil.which("nvidia-smi")
105
+ if not exe:
106
+ return None
107
+ try:
108
+ out = subprocess.run([exe, "--query-gpu=driver_version", "--format=csv,noheader"],
109
+ capture_output=True, text=True, timeout=10)
110
+ except (OSError, subprocess.SubprocessError):
111
+ return None
112
+ if out.returncode != 0:
113
+ return None
114
+ first = (out.stdout or "").strip().splitlines()
115
+ if not first:
116
+ return None
117
+ head = first[0].strip().split(".")[0]
118
+ return int(head) if head.isdigit() else None
119
+
120
+
121
+ def installed_version() -> Optional[str]:
122
+ try:
123
+ return importlib.metadata.version("llama-cpp-python")
124
+ except importlib.metadata.PackageNotFoundError:
125
+ return None
126
+
127
+
128
+ def marker_path() -> Optional[Path]:
129
+ pkg = _package_dir("llama_cpp")
130
+ return (pkg / MARKER_NAME) if pkg is not None else None
131
+
132
+
133
+ def _read_marker() -> Optional[Dict[str, Any]]:
134
+ path = marker_path()
135
+ if path is None or not path.is_file():
136
+ return None
137
+ try:
138
+ data = json.loads(path.read_text(encoding="utf-8"))
139
+ except (OSError, ValueError):
140
+ return None
141
+ return data if isinstance(data, dict) else None
142
+
143
+
144
+ def _write_marker(data: Dict[str, Any]) -> None:
145
+ path = marker_path()
146
+ if path is None:
147
+ return
148
+ try:
149
+ path.write_text(json.dumps(data, indent=1, sort_keys=True), encoding="utf-8")
150
+ except OSError as exc:
151
+ logger.debug("could not write %s: %s", path, exc)
152
+
153
+
154
+ def swap_command(build: str, version: str) -> Optional[List[str]]:
155
+ """The installers' swap for this interpreter: pip when the environment has it, else ``uv pip``
156
+ (uv venvs carry no pip). None when neither is available."""
157
+ links = f"{INDEX}/{build}/llama-cpp-python/"
158
+ requirement = f"llama-cpp-python=={version}"
159
+ if importlib.util.find_spec("pip") is not None:
160
+ return [sys.executable, "-m", "pip", "install", "--no-index", "--no-deps", "--force-reinstall",
161
+ "--find-links", links, requirement]
162
+ uv = shutil.which("uv")
163
+ if uv:
164
+ return [uv, "pip", "install", "--python", sys.executable, "--no-index", "--no-deps",
165
+ "--reinstall-package", "llama-cpp-python", "--find-links", links, requirement]
166
+ return None
167
+
168
+
169
+ def run_swap(command: List[str]) -> subprocess.CompletedProcess:
170
+ """Run the swap command (separate so tests replace it)."""
171
+ return subprocess.run(command, capture_output=True, text=True, timeout=SWAP_TIMEOUT_S)
172
+
173
+
174
+ def notice(message: str) -> None:
175
+ """One line on stderr AND in the log: AbstractCore's console log level is ERROR by default, so a
176
+ `logger.warning` alone never reaches a user; a download of several hundred MB inside
177
+ `create_llm` must be announced where the user is looking."""
178
+ try:
179
+ sys.stderr.write(f"AbstractCore: {message}\n")
180
+ sys.stderr.flush()
181
+ except Exception:
182
+ pass
183
+ logger.warning("AbstractCore: %s", message)
184
+
185
+
186
+ def _outcome(outcome: str, reason: str = "", **extra: Any) -> Dict[str, Any]:
187
+ data: Dict[str, Any] = {"outcome": outcome, "reason": reason}
188
+ data.update(extra)
189
+ return data
190
+
191
+
192
+ def ensure_llama_cpp_cuda_build() -> Dict[str, Any]:
193
+ """Make sure llama.cpp is its CUDA build on an NVIDIA Linux host before AbstractCore imports it.
194
+
195
+ Returns the outcome (cached for the process):
196
+ ``cuda-build-present`` (nothing done), ``swapped`` (the CUDA build is now installed),
197
+ ``swapped-restart-needed`` (installed, but this process already loaded the processor build),
198
+ ``failed`` (the swap ran and did not deliver; ``reason`` says why; not retried until
199
+ llama-cpp-python is reinstalled), ``skipped`` (not applicable here; ``reason`` says why)."""
200
+ global _result
201
+ if _result is not None:
202
+ return dict(_result)
203
+ _result = _decide_and_swap()
204
+ return dict(_result)
205
+
206
+
207
+ def _decide_and_swap() -> Dict[str, Any]:
208
+ if not sys.platform.startswith("linux"):
209
+ return _outcome("skipped", "not Linux")
210
+ if platform.machine().lower() not in {"x86_64", "amd64"}:
211
+ return _outcome("skipped", f"no prebuilt CUDA llama.cpp for {platform.machine()} (x86_64 only)")
212
+ if os.environ.get(ENV_OPT_OUT, "").strip() == "0":
213
+ return _outcome("skipped", f"{ENV_OPT_OUT}=0")
214
+ version = installed_version()
215
+ if version is None or _package_dir("llama_cpp") is None:
216
+ return _outcome("skipped", "llama-cpp-python is not installed")
217
+ if llama_cpp_is_cuda_build():
218
+ return _outcome("cuda-build-present", "", version=version)
219
+ marker = _read_marker()
220
+ if marker and marker.get("version") == version and marker.get("outcome") in {"failed", "swapped"}:
221
+ # "swapped" with a processor build on disk means someone reinstalled the CPU wheel over it
222
+ # without removing the marker (pip keeps unknown files in the folder): run again.
223
+ if marker.get("outcome") == "failed":
224
+ return dict(marker)
225
+ major = torch_cuda_major()
226
+ if major is None:
227
+ return _outcome("skipped", "PyTorch has no CUDA build here", version=version)
228
+ if major not in BUILDS:
229
+ return _outcome("skipped", f"no prebuilt llama.cpp build for CUDA {major}", version=version)
230
+ build, floor = BUILDS[major]
231
+ driver = nvidia_driver_major()
232
+ if driver is None:
233
+ return _outcome("skipped", "no NVIDIA driver answers (nvidia-smi)", version=version, build=build)
234
+ if driver < floor:
235
+ return _outcome("skipped", f"PyTorch uses CUDA {major}, which needs NVIDIA driver {floor} or newer "
236
+ f"(this one is {driver})", version=version, build=build)
237
+ command = swap_command(build, version)
238
+ if command is None:
239
+ data = _outcome("failed", "neither pip nor uv is available to install the CUDA build",
240
+ version=version, build=build)
241
+ _write_marker(data)
242
+ return data
243
+ already_loaded = "llama_cpp" in sys.modules
244
+ notice(
245
+ f"llama-cpp-python {version} here is the processor build and this machine has an NVIDIA card "
246
+ f"(CUDA {major} torch, driver {driver}): installing its CUDA build ({build}) from {INDEX} so GGUF "
247
+ f"models run on the GPU; one-time, a few hundred MB. Set {ENV_OPT_OUT}=0 to keep the processor build."
248
+ )
249
+ started = time.time()
250
+ try:
251
+ proc = run_swap(command)
252
+ except (OSError, subprocess.SubprocessError) as exc:
253
+ data = _outcome("failed", f"the swap command did not run: {exc}", version=version, build=build,
254
+ command=" ".join(command))
255
+ _write_marker(data)
256
+ notice(f"llama.cpp CUDA build not installed: {data['reason']}. GGUF models stay on the processor; the "
257
+ "one-line installer does this step too (docs/installation.md).")
258
+ return data
259
+ tail = ((proc.stdout or "") + (proc.stderr or "")).strip().splitlines()[-6:]
260
+ if proc.returncode != 0 or not llama_cpp_is_cuda_build():
261
+ why = (f"exit {proc.returncode}" if proc.returncode != 0 else
262
+ "the command succeeded but the installed files are not a CUDA build")
263
+ data = _outcome("failed", f"{why}: {' | '.join(tail)[:600]}", version=version, build=build,
264
+ command=" ".join(command), seconds=round(time.time() - started, 1))
265
+ _write_marker(data)
266
+ notice(f"llama.cpp CUDA build not installed ({data['reason']}); GGUF models stay on the processor. "
267
+ "The one-line installer does this step too: see docs/installation.md.")
268
+ return data
269
+ data = _outcome("swapped-restart-needed" if already_loaded else "swapped", "", version=version, build=build,
270
+ command=" ".join(command), seconds=round(time.time() - started, 1))
271
+ _write_marker(data)
272
+ if already_loaded:
273
+ notice(f"llama.cpp CUDA build {build} installed in {data['seconds']:.0f} s; this process had already loaded "
274
+ "the processor build, the next one runs GGUF models on the GPU.")
275
+ else:
276
+ notice(f"llama.cpp CUDA build {build} installed in {data['seconds']:.0f} s; GGUF models run on the GPU.")
277
+ return data
@@ -10,4 +10,4 @@ including when the package is installed from PyPI where pyproject.toml is not av
10
10
  """
11
11
 
12
12
  # Package version - update this when releasing new versions
13
- __version__ = "2.35.0"
13
+ __version__ = "2.35.1"
@@ -146,7 +146,15 @@ def prepare_llama_cpp_import() -> List[str]:
146
146
  if folder not in entries:
147
147
  os.environ["PATH"] = folder + (os.pathsep + os.environ["PATH"] if os.environ.get("PATH") else "")
148
148
  added.append(folder)
149
- elif sys.platform.startswith("linux") and llama_cpp_is_cuda_build():
149
+ elif sys.platform.startswith("linux"):
150
+ # A plain `pip install abstractcore[gpu]` leaves the processor build of llama.cpp on an NVIDIA
151
+ # host (PyPI has no CUDA build); swap the CUDA build in first, once per environment.
152
+ from .llama_cuda_swap import ensure_llama_cpp_cuda_build
153
+
154
+ ensure_llama_cpp_cuda_build()
155
+ if not llama_cpp_is_cuda_build():
156
+ _prepared = added
157
+ return list(added)
150
158
  for library in linux_nvidia_cuda_libraries():
151
159
  try:
152
160
  _handles.append(ctypes.CDLL(str(library), mode=getattr(ctypes, "RTLD_GLOBAL", 0)))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractcore
3
- Version: 2.35.0
3
+ Version: 2.35.1
4
4
  Summary: Unified interface to all LLM providers with essential infrastructure for tool calling, streaming, and model management
5
5
  Author-email: Laurent-Philippe Albou <contact@abstractcore.ai>
6
6
  Maintainer-email: Laurent-Philippe Albou <contact@abstractcore.ai>
@@ -36,10 +36,11 @@ Requires-Dist: anthropic<1.0.0,>=0.25.0
36
36
  Requires-Dist: tiktoken<1.0.0,>=0.5.0
37
37
  Requires-Dist: requests<3.0.0,>=2.25.0
38
38
  Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0
39
- Requires-Dist: lxml<6.0.0,>=4.9.0
39
+ Requires-Dist: lxml<7.0.0,>=4.9.0
40
40
  Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10"
41
41
  Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10"
42
42
  Requires-Dist: psutil<8,>=5.9
43
+ Requires-Dist: huggingface_hub<2.0.0,>=0.20.0
43
44
  Requires-Dist: Pillow<13.0.0,>=10.0.0
44
45
  Requires-Dist: pypdf<7.0.0,>=6.0.0
45
46
  Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0
@@ -49,8 +50,8 @@ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0
49
50
  Requires-Dist: python-multipart<1.0.0,>=0.0.6
50
51
  Requires-Dist: sse-starlette<4,>=1.8
51
52
  Requires-Dist: cryptography>=41.0.0
52
- Requires-Dist: abstractvoice>=0.20.0
53
- Requires-Dist: abstractvision>=0.3.34
53
+ Requires-Dist: abstractvoice>=0.21.1
54
+ Requires-Dist: abstractvision>=0.3.36
54
55
  Requires-Dist: abstractmusic>=0.1.17; python_version >= "3.10"
55
56
  Requires-Dist: abstract3d>=0.3.2; python_version >= "3.10"
56
57
  Provides-Extra: apple
@@ -69,9 +70,9 @@ Requires-Dist: accelerate>=1.0.0; extra == "apple"
69
70
  Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "apple"
70
71
  Requires-Dist: numpy<3.0.0,>=2.1.0; extra == "apple"
71
72
  Requires-Dist: Pillow<13.0.0,>=12.1.1; extra == "apple"
72
- Requires-Dist: abstractvoice[all-apple]>=0.20.0; extra == "apple"
73
+ Requires-Dist: abstractvoice[all-apple]>=0.21.1; extra == "apple"
73
74
  Requires-Dist: omnivoice>=0.1.5; extra == "apple"
74
- Requires-Dist: abstractvision[all-apple]>=0.3.34; extra == "apple"
75
+ Requires-Dist: abstractvision[all-apple]>=0.3.36; extra == "apple"
75
76
  Requires-Dist: abstractmusic[all-apple]>=0.1.17; extra == "apple"
76
77
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "apple"
77
78
  Provides-Extra: gpu
@@ -87,9 +88,9 @@ Requires-Dist: gguf<1.0.0,>=0.10.0; extra == "gpu"
87
88
  Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "gpu"
88
89
  Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "gpu"
89
90
  Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "gpu"
90
- Requires-Dist: abstractvoice[all-gpu]>=0.20.0; extra == "gpu"
91
+ Requires-Dist: abstractvoice[all-gpu]>=0.21.1; extra == "gpu"
91
92
  Requires-Dist: omnivoice>=0.1.5; extra == "gpu"
92
- Requires-Dist: abstractvision[all-gpu]>=0.3.34; extra == "gpu"
93
+ Requires-Dist: abstractvision[all-gpu]>=0.3.36; extra == "gpu"
93
94
  Requires-Dist: abstractmusic[all-gpu]>=0.1.17; extra == "gpu"
94
95
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "gpu"
95
96
  Provides-Extra: remote
@@ -135,11 +136,11 @@ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "embeddings"
135
136
  Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "embeddings"
136
137
  Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "embeddings"
137
138
  Provides-Extra: vision-diffusers
138
- Requires-Dist: abstractvision[huggingface]>=0.3.34; extra == "vision-diffusers"
139
+ Requires-Dist: abstractvision[huggingface]>=0.3.36; extra == "vision-diffusers"
139
140
  Provides-Extra: vision-sdcpp
140
- Requires-Dist: abstractvision[sdcpp]>=0.3.34; extra == "vision-sdcpp"
141
+ Requires-Dist: abstractvision[sdcpp]>=0.3.36; extra == "vision-sdcpp"
141
142
  Provides-Extra: vision-local
142
- Requires-Dist: abstractvision[local]>=0.3.34; extra == "vision-local"
143
+ Requires-Dist: abstractvision[local]>=0.3.36; extra == "vision-local"
143
144
  Provides-Extra: browser
144
145
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "browser"
145
146
  Provides-Extra: pdf-pymupdf-commercial
@@ -196,7 +197,7 @@ Dynamic: license-file
196
197
  Unified LLM Interface
197
198
  > Write once, run everywhere
198
199
 
199
- What's new in 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2350---2026-11-07).
200
+ What's new in 2.35.1: a plain `pip install "abstractcore[gpu]"` on a Linux NVIDIA machine now runs GGUF models on the GPU (AbstractCore installs llama.cpp's CUDA build itself, once, the first time it is needed). In 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2351---2026-11-10).
200
201
 
201
202
  What's new in 2.34.0: a local model that no call has used for 60 minutes is unloaded from memory and loads
202
203
  again on its next call; a model kept loaded (Keep loaded) never is, and no running call is interrupted
@@ -279,6 +279,7 @@ abstractcore/utils/identity.py
279
279
  abstractcore/utils/install_settings.py
280
280
  abstractcore/utils/jsonish.py
281
281
  abstractcore/utils/kv_geometry.py
282
+ abstractcore/utils/llama_cuda_swap.py
282
283
  abstractcore/utils/memory.py
283
284
  abstractcore/utils/message_preprocessor.py
284
285
  abstractcore/utils/model_cache.py