abstractcore 2.26.3__tar.gz → 2.31.0__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 (339) hide show
  1. {abstractcore-2.26.3 → abstractcore-2.31.0}/PKG-INFO +57 -20
  2. {abstractcore-2.26.3 → abstractcore-2.31.0}/README.md +43 -6
  3. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/architectures/detection.py +18 -0
  4. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/architectures/thinking_controls.py +50 -0
  5. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/architecture_formats.json +45 -0
  6. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/model_capabilities.json +138 -0
  7. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/model_downloads_catalog.json +65 -0
  8. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/capabilities/registry.py +105 -0
  9. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/__init__.py +6 -0
  10. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/client.py +506 -21
  11. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/context.py +19 -1
  12. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/errors.py +7 -0
  13. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/models.py +47 -1
  14. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/search.py +43 -2
  15. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/store.py +45 -0
  16. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/email_cli.py +2 -0
  17. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/route_engines.py +4 -4
  18. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/base.py +310 -38
  19. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/huggingface_provider.py +309 -22
  20. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/lmstudio_provider.py +114 -82
  21. abstractcore-2.31.0/abstractcore/providers/mlx_hy_v3.py +440 -0
  22. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_native_session.py +38 -0
  23. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_provider.py +206 -5
  24. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/openai_compatible_provider.py +46 -1
  25. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/openai_provider.py +3 -0
  26. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/openrouter_provider.py +77 -0
  27. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/streaming.py +100 -7
  28. abstractcore-2.31.0/abstractcore/providers/vllm_provider.py +288 -0
  29. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/app.py +2 -0
  30. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/audio_endpoints.py +281 -4
  31. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/testing/mailserver.py +149 -4
  32. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/parser.py +93 -20
  33. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/wire_naming.py +95 -0
  34. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/version.py +1 -1
  35. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore.egg-info/PKG-INFO +57 -20
  36. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore.egg-info/SOURCES.txt +1 -0
  37. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore.egg-info/requires.txt +13 -13
  38. {abstractcore-2.26.3 → abstractcore-2.31.0}/pyproject.toml +13 -13
  39. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_generate_contract.py +24 -0
  40. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_install_settings.py +2 -2
  41. abstractcore-2.26.3/abstractcore/providers/vllm_provider.py +0 -196
  42. {abstractcore-2.26.3 → abstractcore-2.31.0}/LICENSE +0 -0
  43. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/__init__.py +0 -0
  44. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/apps/__init__.py +0 -0
  45. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/apps/__main__.py +0 -0
  46. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/apps/app_config_utils.py +0 -0
  47. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/apps/deepsearch.py +0 -0
  48. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/apps/extractor.py +0 -0
  49. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/apps/intent.py +0 -0
  50. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/apps/judge.py +0 -0
  51. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/apps/summarizer.py +0 -0
  52. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/architectures/__init__.py +0 -0
  53. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/architectures/enums.py +0 -0
  54. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/architectures/response_postprocessing.py +0 -0
  55. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/OCRA.ttf +0 -0
  56. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/OCRB.ttf +0 -0
  57. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/OCRBL.ttf +0 -0
  58. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/README.md +0 -0
  59. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/abstractframework_identity.json +0 -0
  60. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/bloc-schema.jsonld +0 -0
  61. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/model_capabilities.schema.json +0 -0
  62. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/model_downloads_catalog.schema.json +0 -0
  63. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/semantic_models.md +0 -0
  64. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/assets/session_schema.json +0 -0
  65. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/capabilities/__init__.py +0 -0
  66. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/capabilities/errors.py +0 -0
  67. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/capabilities/host.py +0 -0
  68. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/capabilities/music_selectors.py +0 -0
  69. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/capabilities/scene3d_selectors.py +0 -0
  70. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/capabilities/types.py +0 -0
  71. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/capabilities/vision_catalog.py +0 -0
  72. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/__init__.py +0 -0
  73. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/bodystructure.py +0 -0
  74. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/discovery.py +0 -0
  75. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/imap_codec.py +0 -0
  76. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/legacy.py +0 -0
  77. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/limits.py +0 -0
  78. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/oauth.py +0 -0
  79. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/policy.py +0 -0
  80. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/comms/email/vault.py +0 -0
  81. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/__init__.py +0 -0
  82. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/analytics.py +0 -0
  83. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/cache.py +0 -0
  84. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/config.py +0 -0
  85. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/exceptions.py +0 -0
  86. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/glyph_processor.py +0 -0
  87. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/optimizer.py +0 -0
  88. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/orchestrator.py +0 -0
  89. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/pil_text_renderer.py +0 -0
  90. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/quality.py +0 -0
  91. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/text_formatter.py +0 -0
  92. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/compression/vision_compressor.py +0 -0
  93. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/__init__.py +0 -0
  94. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/capability_defaults.py +0 -0
  95. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/engines.py +0 -0
  96. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/host_jobs.py +0 -0
  97. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/main.py +0 -0
  98. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/manager.py +0 -0
  99. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/model_catalog.py +0 -0
  100. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/model_materializer.py +0 -0
  101. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/model_verify.py +0 -0
  102. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/models_engines_cli.py +0 -0
  103. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/provider_profiles.py +0 -0
  104. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/recommendations.py +0 -0
  105. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/config/vision_config.py +0 -0
  106. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/console/__init__.py +0 -0
  107. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/console/theme_sync.py +0 -0
  108. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/console/themes.py +0 -0
  109. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/console/web.py +0 -0
  110. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/__init__.py +0 -0
  111. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/bloc_kv.py +0 -0
  112. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/bloc_metadata.py +0 -0
  113. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/cached_session.py +0 -0
  114. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/degeneration.py +0 -0
  115. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/endpoint_damping.py +0 -0
  116. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/enums.py +0 -0
  117. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/factory.py +0 -0
  118. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/file_blocs.py +0 -0
  119. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/file_boxes.py +0 -0
  120. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/generate_contract.py +0 -0
  121. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/interface.py +0 -0
  122. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/multimodal_generation.py +0 -0
  123. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/output_specs.py +0 -0
  124. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/retry.py +0 -0
  125. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/session.py +0 -0
  126. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/core/types.py +0 -0
  127. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/download.py +0 -0
  128. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/embeddings/__init__.py +0 -0
  129. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/embeddings/manager.py +0 -0
  130. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/embeddings/models.py +0 -0
  131. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/endpoint/__init__.py +0 -0
  132. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/endpoint/app.py +0 -0
  133. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/events/__init__.py +0 -0
  134. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/exceptions/__init__.py +0 -0
  135. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/mcp/__init__.py +0 -0
  136. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/mcp/client.py +0 -0
  137. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/mcp/factory.py +0 -0
  138. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/mcp/naming.py +0 -0
  139. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/mcp/stdio_client.py +0 -0
  140. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/mcp/tool_source.py +0 -0
  141. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/__init__.py +0 -0
  142. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/auto_handler.py +0 -0
  143. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/base.py +0 -0
  144. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/capabilities.py +0 -0
  145. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/delivery.py +0 -0
  146. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/enrichment.py +0 -0
  147. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/handlers/__init__.py +0 -0
  148. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/handlers/anthropic_handler.py +0 -0
  149. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/handlers/local_handler.py +0 -0
  150. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/handlers/openai_handler.py +0 -0
  151. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/openai_parts.py +0 -0
  152. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/pdf_routing.py +0 -0
  153. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/__init__.py +0 -0
  154. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/audio_processor.py +0 -0
  155. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/direct_pdf_processor.py +0 -0
  156. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/glyph_pdf_processor.py +0 -0
  157. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/image_processor.py +0 -0
  158. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/office_processor.py +0 -0
  159. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/pdf_processor.py +0 -0
  160. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/text_processor.py +0 -0
  161. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/processors/video_processor.py +0 -0
  162. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/types.py +0 -0
  163. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/utils/__init__.py +0 -0
  164. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/utils/image_scaler.py +0 -0
  165. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/utils/video_frames.py +0 -0
  166. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/media/vision_fallback.py +0 -0
  167. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/processing/__init__.py +0 -0
  168. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/processing/basic_deepsearch.py +0 -0
  169. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/processing/basic_extractor.py +0 -0
  170. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/processing/basic_intent.py +0 -0
  171. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/processing/basic_judge.py +0 -0
  172. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/processing/basic_summarizer.py +0 -0
  173. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/__init__.py +0 -0
  174. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/_http.py +0 -0
  175. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/anthropic_provider.py +0 -0
  176. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/capability_host.py +0 -0
  177. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/endpoint_context.py +0 -0
  178. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/generation_cancel.py +0 -0
  179. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/generation_progress.py +0 -0
  180. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/hf_residency.py +0 -0
  181. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_model_rules.py +0 -0
  182. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_native_cache.py +0 -0
  183. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_prefill_observer.py +0 -0
  184. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_qwen4.py +0 -0
  185. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_residency.py +0 -0
  186. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_runtime.py +0 -0
  187. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/mlx_vision_addon.py +0 -0
  188. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/model_capabilities.py +0 -0
  189. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/model_config_fingerprint.py +0 -0
  190. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/ollama_provider.py +0 -0
  191. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/portkey_provider.py +0 -0
  192. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/process_residency.py +0 -0
  193. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/registry.py +0 -0
  194. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/speculation.py +0 -0
  195. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/tokenizer_fingerprint.py +0 -0
  196. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/providers/weights_fingerprint.py +0 -0
  197. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/py.typed +0 -0
  198. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/__init__.py +0 -0
  199. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/__main__.py +0 -0
  200. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/auth_policy.py +0 -0
  201. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/camera_endpoints.py +0 -0
  202. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/capability_generation.py +0 -0
  203. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/console_routes.py +0 -0
  204. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/credentials.py +0 -0
  205. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/email_routes.py +0 -0
  206. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/first_run.py +0 -0
  207. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/host_routes.py +0 -0
  208. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/scene3d_endpoints.py +0 -0
  209. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/session_routes.py +0 -0
  210. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/server/vision_endpoints.py +0 -0
  211. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/structured/__init__.py +0 -0
  212. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/structured/handler.py +0 -0
  213. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/structured/json_schema.py +0 -0
  214. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/structured/retry.py +0 -0
  215. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/structured/schema_compat.py +0 -0
  216. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/testing/__init__.py +0 -0
  217. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/__init__.py +0 -0
  218. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/abstractignore.py +0 -0
  219. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/arg_canonicalizer.py +0 -0
  220. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/arg_coercion.py +0 -0
  221. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/browser_tools.py +0 -0
  222. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/code_analysis.py +0 -0
  223. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/common_tools.py +0 -0
  224. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/comms_tools.py +0 -0
  225. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/core.py +0 -0
  226. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/email_digests.py +0 -0
  227. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/fetch_url_ssrf.py +0 -0
  228. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/handler.py +0 -0
  229. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/inventory.py +0 -0
  230. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/process_tree.py +0 -0
  231. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/registry.py +0 -0
  232. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/risk_facts.py +0 -0
  233. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/sandbox.py +0 -0
  234. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/shell_session.py +0 -0
  235. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/shell_tools.py +0 -0
  236. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/syntax_rewriter.py +0 -0
  237. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/tag_rewriter.py +0 -0
  238. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/telegram_tdlib.py +0 -0
  239. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/tools/telegram_tools.py +0 -0
  240. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/__init__.py +0 -0
  241. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/async_stream.py +0 -0
  242. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/cli.py +0 -0
  243. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/context_calibration.py +0 -0
  244. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/context_estimate.py +0 -0
  245. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/data_registry.py +0 -0
  246. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/display.py +0 -0
  247. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/file_filters.py +0 -0
  248. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/host_profile.py +0 -0
  249. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/hostinfo.py +0 -0
  250. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/identity.py +0 -0
  251. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/install_settings.py +0 -0
  252. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/jsonish.py +0 -0
  253. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/memory.py +0 -0
  254. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/message_preprocessor.py +0 -0
  255. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/model_cache.py +0 -0
  256. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/model_fit.py +0 -0
  257. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/residency.py +0 -0
  258. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/self_fixes.py +0 -0
  259. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/stdio.py +0 -0
  260. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/structured_logging.py +0 -0
  261. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/token_utils.py +0 -0
  262. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/trace_export.py +0 -0
  263. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/truncation.py +0 -0
  264. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/vlm_token_calculator.py +0 -0
  265. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/windows_dll.py +0 -0
  266. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore/utils/workspace_paths.py +0 -0
  267. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore.egg-info/dependency_links.txt +0 -0
  268. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore.egg-info/entry_points.txt +0 -0
  269. {abstractcore-2.26.3 → abstractcore-2.31.0}/abstractcore.egg-info/top_level.txt +0 -0
  270. {abstractcore-2.26.3 → abstractcore-2.31.0}/setup.cfg +0 -0
  271. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_abstractendpoint_singleton_provider.py +0 -0
  272. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_agentic_cli_compatibility.py +0 -0
  273. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_basic_session.py +0 -0
  274. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_bloc_kv.py +0 -0
  275. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_bloc_kv_cache_dtype.py +0 -0
  276. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_bloc_kv_endpoint.py +0 -0
  277. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_bloc_kv_engine_fingerprint.py +0 -0
  278. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_bloc_kv_model_config_fingerprint.py +0 -0
  279. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_bloc_kv_tokenizer_fingerprint.py +0 -0
  280. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_bloc_kv_weights_fingerprint.py +0 -0
  281. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_bloc_metadata_json_extract.py +0 -0
  282. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_cached_session_kv_mode.py +0 -0
  283. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_cached_session_kv_thinking_prefix.py +0 -0
  284. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_capabilities_registry.py +0 -0
  285. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_capabilities_registry_preferred_backends_from_config.py +0 -0
  286. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_complete_integration.py +0 -0
  287. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_comprehensive_events.py +0 -0
  288. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_console_about.py +0 -0
  289. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_console_email_tab.py +0 -0
  290. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_console_web.py +0 -0
  291. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_core_components.py +0 -0
  292. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_display_rule.py +0 -0
  293. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_email_digests.py +0 -0
  294. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_embedding_model_token_warnings.py +0 -0
  295. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_enhanced_prompt.py +0 -0
  296. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_environment_variable_tool_call_tags.py +0 -0
  297. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_factory.py +0 -0
  298. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_file_bloc_store_unit.py +0 -0
  299. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_file_boxes_cached_session.py +0 -0
  300. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_final_accuracy.py +0 -0
  301. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_final_comprehensive.py +0 -0
  302. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_final_graceful_errors.py +0 -0
  303. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_generate_response_reasoning_property_unit.py +0 -0
  304. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_generate_with_outputs.py +0 -0
  305. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_graceful_fallback.py +0 -0
  306. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_import_debug.py +0 -0
  307. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_import_safety.py +0 -0
  308. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_incremental_thinking_tag_stripper.py +0 -0
  309. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_install_hints_no_bare_packages.py +0 -0
  310. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_integrated_functionality.py +0 -0
  311. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_llms_sources.py +0 -0
  312. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_mcp_handshake.py +0 -0
  313. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_mcp_integration.py +0 -0
  314. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_mcp_stdio_client.py +0 -0
  315. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_multimodal_generate_output.py +0 -0
  316. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_openai_prompt_cache_key_passthrough.py +0 -0
  317. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_output_specs.py +0 -0
  318. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_packaging_assets.py +0 -0
  319. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_packaging_extras.py +0 -0
  320. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_prompt_cache_api.py +0 -0
  321. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_prompt_cache_bloc_composition.py +0 -0
  322. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_prompt_cache_bloc_e2e_gate.py +0 -0
  323. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_prompt_cache_control_plane.py +0 -0
  324. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_prompt_cache_prepare_modules_thinking_http.py +0 -0
  325. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_retry_observability.py +0 -0
  326. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_retry_strategy.py +0 -0
  327. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_seed_determinism.py +0 -0
  328. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_seed_temperature_basic.py +0 -0
  329. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_sensory_prompting.py +0 -0
  330. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_server_prompt_cache_control_plane_proxy.py +0 -0
  331. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_server_prompt_cache_key_passthrough.py +0 -0
  332. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_session_reasoning_persistence_unit.py +0 -0
  333. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_sound_effect_seconds_route.py +0 -0
  334. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_structured_output_truncation_retry.py +0 -0
  335. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_text_only_model_experience.py +0 -0
  336. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_unload_memory.py +0 -0
  337. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_user_scenario_validation.py +0 -0
  338. {abstractcore-2.26.3 → abstractcore-2.31.0}/tests/test_voice_host_credentials.py +0 -0
  339. {abstractcore-2.26.3 → abstractcore-2.31.0}/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.26.3
3
+ Version: 2.31.0
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>
@@ -49,10 +49,10 @@ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0
49
49
  Requires-Dist: python-multipart<1.0.0,>=0.0.6
50
50
  Requires-Dist: sse-starlette<2.0.0,>=1.6.0
51
51
  Requires-Dist: cryptography>=41.0.0
52
- Requires-Dist: abstractvoice>=0.15.0
53
- Requires-Dist: abstractvision>=0.3.33
54
- Requires-Dist: abstractmusic>=0.1.16; python_version >= "3.10"
55
- Requires-Dist: abstract3d>=0.1.0; python_version >= "3.10"
52
+ Requires-Dist: abstractvoice>=0.18.2
53
+ Requires-Dist: abstractvision>=0.3.34
54
+ Requires-Dist: abstractmusic>=0.1.17; python_version >= "3.10"
55
+ Requires-Dist: abstract3d>=0.3.2; python_version >= "3.10"
56
56
  Provides-Extra: apple
57
57
  Requires-Dist: mlx<1.0.0,>=0.32.2; extra == "apple"
58
58
  Requires-Dist: mlx-lm<1.0.0,>=0.31.3; extra == "apple"
@@ -68,10 +68,10 @@ Requires-Dist: accelerate>=1.0.0; extra == "apple"
68
68
  Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "apple"
69
69
  Requires-Dist: numpy<3.0.0,>=2.1.0; extra == "apple"
70
70
  Requires-Dist: Pillow<13.0.0,>=12.1.1; extra == "apple"
71
- Requires-Dist: abstractvoice[all-apple]>=0.15.0; extra == "apple"
71
+ Requires-Dist: abstractvoice[all-apple]>=0.18.2; extra == "apple"
72
72
  Requires-Dist: omnivoice>=0.1.5; extra == "apple"
73
- Requires-Dist: abstractvision[all-apple]>=0.3.33; extra == "apple"
74
- Requires-Dist: abstractmusic[all-apple]>=0.1.16; extra == "apple"
73
+ Requires-Dist: abstractvision[all-apple]>=0.3.34; extra == "apple"
74
+ Requires-Dist: abstractmusic[all-apple]>=0.1.17; extra == "apple"
75
75
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "apple"
76
76
  Provides-Extra: gpu
77
77
  Requires-Dist: vllm<1.0.0,>=0.6.0; sys_platform == "linux" and extra == "gpu"
@@ -85,10 +85,10 @@ Requires-Dist: llama-cpp-python<1.0.0,>=0.3.23; sys_platform != "win32" and extr
85
85
  Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "gpu"
86
86
  Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "gpu"
87
87
  Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "gpu"
88
- Requires-Dist: abstractvoice[all-gpu]>=0.15.0; extra == "gpu"
88
+ Requires-Dist: abstractvoice[all-gpu]>=0.18.2; extra == "gpu"
89
89
  Requires-Dist: omnivoice>=0.1.5; extra == "gpu"
90
- Requires-Dist: abstractvision[all-gpu]>=0.3.33; extra == "gpu"
91
- Requires-Dist: abstractmusic[all-gpu]>=0.1.16; extra == "gpu"
90
+ Requires-Dist: abstractvision[all-gpu]>=0.3.34; extra == "gpu"
91
+ Requires-Dist: abstractmusic[all-gpu]>=0.1.17; extra == "gpu"
92
92
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "gpu"
93
93
  Provides-Extra: remote
94
94
  Provides-Extra: openai
@@ -133,11 +133,11 @@ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "embeddings"
133
133
  Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "embeddings"
134
134
  Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "embeddings"
135
135
  Provides-Extra: vision-diffusers
136
- Requires-Dist: abstractvision[huggingface]>=0.3.31; extra == "vision-diffusers"
136
+ Requires-Dist: abstractvision[huggingface]>=0.3.34; extra == "vision-diffusers"
137
137
  Provides-Extra: vision-sdcpp
138
- Requires-Dist: abstractvision[sdcpp]>=0.3.31; extra == "vision-sdcpp"
138
+ Requires-Dist: abstractvision[sdcpp]>=0.3.34; extra == "vision-sdcpp"
139
139
  Provides-Extra: vision-local
140
- Requires-Dist: abstractvision[local]>=0.3.31; extra == "vision-local"
140
+ Requires-Dist: abstractvision[local]>=0.3.34; extra == "vision-local"
141
141
  Provides-Extra: browser
142
142
  Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "browser"
143
143
  Provides-Extra: pdf-pymupdf-commercial
@@ -193,6 +193,10 @@ Dynamic: license-file
193
193
  Unified LLM Interface
194
194
  > Write once, run everywhere
195
195
 
196
+ What's new in 2.31.0: streamed tool calls carry the declared MCP tool name, the MLX prefix cache
197
+ survives per-call system riders in tool loops, and `POST /v1/voice/clone` takes `language`. See the
198
+ [changelog](CHANGELOG.md#2310---2026-10-27).
199
+
196
200
  AbstractCore is an offline-capable, open-source-first LLM infrastructure layer
197
201
  for Python applications. It gives you one `create_llm(...)` API across local
198
202
  runtimes, self-hosted servers, cloud APIs, and OpenAI-compatible gateways.
@@ -248,6 +252,20 @@ For AI assistants and doc-indexing tools, this repository also publishes
248
252
  [`llms.txt`](llms.txt) and [`llms-full.txt`](llms-full.txt). MCP clients such as
249
253
  Context7 can query the public documentation directly as well.
250
254
 
255
+ ## For AI agents
256
+
257
+ Register and use the [`abstractcore` agent skill](https://github.com/lpalbou/AbstractCore/tree/main/skills/abstractcore)
258
+ to write integrations and operate the Python API, CLI and HTTP server. Start by reading
259
+ [`skills/abstractcore/SKILL.md`](https://raw.githubusercontent.com/lpalbou/AbstractCore/main/skills/abstractcore/SKILL.md);
260
+ keep its `references/` folder alongside it when copying the skill into your agent's skill directory.
261
+ In a source checkout, tell another agent: **Read `skills/abstractcore/SKILL.md` and use its
262
+ references for this task.**
263
+
264
+ The skill covers provider and artifact selection, token/time/cost limits, host-controlled
265
+ tools, sessions, typed output, media and diagnostics. The canonical
266
+ [integration and operations guide](docs/agent-usage.md) contains the same supported workflows;
267
+ source contributors should also read [Contributing](CONTRIBUTING.md).
268
+
251
269
  ## Why AbstractCore
252
270
 
253
271
  Many libraries can call an LLM. AbstractCore is for the messy middle of real
@@ -455,7 +473,7 @@ You can also persist settings (including API keys) via the config CLI:
455
473
  - Embeddings and semantic search → [Embeddings](docs/embeddings.md)
456
474
  - Observability: global event bus + interaction traces → [Architecture](docs/architecture.md), [API Reference (Events)](docs/api-reference.md#eventtype), [Interaction Tracing](docs/interaction-tracing.md)
457
475
  - MCP (Model Context Protocol): discover tools from MCP servers (HTTP/stdio) → [MCP](docs/mcp.md)
458
- - Email: one IMAP/SMTP account (password or OAuth2; servers found from the address), encrypted credentials, recipient policy, send limits, read-only mailbox and email tools → [Email](docs/email.md)
476
+ - Email: one IMAP/SMTP account (password or OAuth2; servers found from the address), encrypted credentials, recipient policy, send limits, Read only or Read and write access, and email tools → [Email](docs/email.md)
459
477
  - OpenAI-compatible server: one `/v1` gateway for chat + optional `/v1/images/*` and `/v1/audio/*` endpoints → [Server](docs/server.md)
460
478
 
461
479
  ## Tool calling (passthrough by default)
@@ -512,7 +530,7 @@ Notes:
512
530
  - **Images**: use a vision-capable model, or configure **vision fallback** for text-only models (`abstractcore --config`; `abstractcore --set-vision-provider PROVIDER MODEL`).
513
531
  - **Video**: `video_policy="auto"` (default) uses native video when supported, otherwise samples frames (requires `ffmpeg`/`ffprobe`) and routes them through image/vision handling (so you still need a vision-capable model or vision fallback configured).
514
532
  - **Audio**: use an audio-capable model, or set `audio_policy="auto"`/`"speech_to_text"` for speech-to-text through AbstractVoice (part of the light install).
515
- `abstractvoice` 0.11.0+ can install its base plugin path on Python 3.9 without OmniVoice, torch, or torchaudio. Local voice engines and clone backends are part of explicit local aggregate profiles.
533
+ `abstractvoice` installs its base plugin path on Python 3.9 without OmniVoice, torch, or torchaudio. Local voice engines and clone backends are part of explicit local aggregate profiles.
516
534
 
517
535
  Configure defaults (optional):
518
536
 
@@ -645,11 +663,30 @@ stt_models = llm.voice.list_stt_models()
645
663
  music_models = llm.capabilities.list_models("music", task="text_to_music")
646
664
  ```
647
665
 
666
+ Voices are navigable by engine and by language, and you can create your own:
667
+
668
+ ```python
669
+ french = llm.voice.list_voices(language="fr") # native French voices first
670
+ piper = llm.voice.list_voices(provider="piper") # one engine's voices
671
+ languages = llm.voice.list_languages(kind="tts") # languages per engine, no model loaded
672
+ # Each record: voice_id (pass as voice=), name, kind (profile|clone), provider, model, languages, language
673
+
674
+ mira = llm.voice.design_voice("A calm, warm female voice in her thirties.", name="Mira")
675
+ wav = llm.voice.tts("Good morning.", voice=mira["voice_id"], one_shot=True)
676
+ llm.voice.rename_cloned_voice(mira["voice_id"], "Mira (narrator)")
677
+ llm.voice.delete_cloned_voice(mira["voice_id"])
678
+ ```
679
+
680
+ `one_shot=True` synthesizes the whole text as one generation, so the take keeps one
681
+ voice from start to end (Qwen3-TTS voices, up to 1000 characters).
682
+
648
683
  The HTTP server exposes equivalent discovery at
649
- `/v1/vision/providers/`, `/v1/vision/models`, `/v1/audio/voices`,
650
- `/v1/audio/speech/models`, `/v1/audio/transcriptions/models`, and
651
- `/v1/voice/clone/providers`, plus `/v1/audio/music/providers` and
652
- `/v1/audio/music/models`.
684
+ `/v1/vision/providers/`, `/v1/vision/models`, `/v1/audio/voices` (with `language`),
685
+ `/v1/audio/languages`, `/v1/audio/speech/models`, `/v1/audio/transcriptions/models`,
686
+ `/v1/voice/clone/providers` and `/v1/voice/clones`, plus `/v1/audio/music/providers`
687
+ and `/v1/audio/music/models`. Voices are created and managed with
688
+ `POST /v1/voice/clone`, `POST /v1/voice/design` and
689
+ `GET|PATCH|DELETE /v1/voice/clones/{voice_id}`; see [Server](docs/server.md).
653
690
  Generated media HTTP routes include `/v1/images/generations`,
654
691
  `/v1/images/edits`, `/v1/videos/generations`, `/v1/videos/edits`, and
655
692
  async polling routes under `/v1/vision/jobs/images/*` and
@@ -9,6 +9,10 @@
9
9
  Unified LLM Interface
10
10
  > Write once, run everywhere
11
11
 
12
+ What's new in 2.31.0: streamed tool calls carry the declared MCP tool name, the MLX prefix cache
13
+ survives per-call system riders in tool loops, and `POST /v1/voice/clone` takes `language`. See the
14
+ [changelog](CHANGELOG.md#2310---2026-10-27).
15
+
12
16
  AbstractCore is an offline-capable, open-source-first LLM infrastructure layer
13
17
  for Python applications. It gives you one `create_llm(...)` API across local
14
18
  runtimes, self-hosted servers, cloud APIs, and OpenAI-compatible gateways.
@@ -64,6 +68,20 @@ For AI assistants and doc-indexing tools, this repository also publishes
64
68
  [`llms.txt`](llms.txt) and [`llms-full.txt`](llms-full.txt). MCP clients such as
65
69
  Context7 can query the public documentation directly as well.
66
70
 
71
+ ## For AI agents
72
+
73
+ Register and use the [`abstractcore` agent skill](https://github.com/lpalbou/AbstractCore/tree/main/skills/abstractcore)
74
+ to write integrations and operate the Python API, CLI and HTTP server. Start by reading
75
+ [`skills/abstractcore/SKILL.md`](https://raw.githubusercontent.com/lpalbou/AbstractCore/main/skills/abstractcore/SKILL.md);
76
+ keep its `references/` folder alongside it when copying the skill into your agent's skill directory.
77
+ In a source checkout, tell another agent: **Read `skills/abstractcore/SKILL.md` and use its
78
+ references for this task.**
79
+
80
+ The skill covers provider and artifact selection, token/time/cost limits, host-controlled
81
+ tools, sessions, typed output, media and diagnostics. The canonical
82
+ [integration and operations guide](docs/agent-usage.md) contains the same supported workflows;
83
+ source contributors should also read [Contributing](CONTRIBUTING.md).
84
+
67
85
  ## Why AbstractCore
68
86
 
69
87
  Many libraries can call an LLM. AbstractCore is for the messy middle of real
@@ -271,7 +289,7 @@ You can also persist settings (including API keys) via the config CLI:
271
289
  - Embeddings and semantic search → [Embeddings](docs/embeddings.md)
272
290
  - Observability: global event bus + interaction traces → [Architecture](docs/architecture.md), [API Reference (Events)](docs/api-reference.md#eventtype), [Interaction Tracing](docs/interaction-tracing.md)
273
291
  - MCP (Model Context Protocol): discover tools from MCP servers (HTTP/stdio) → [MCP](docs/mcp.md)
274
- - Email: one IMAP/SMTP account (password or OAuth2; servers found from the address), encrypted credentials, recipient policy, send limits, read-only mailbox and email tools → [Email](docs/email.md)
292
+ - Email: one IMAP/SMTP account (password or OAuth2; servers found from the address), encrypted credentials, recipient policy, send limits, Read only or Read and write access, and email tools → [Email](docs/email.md)
275
293
  - OpenAI-compatible server: one `/v1` gateway for chat + optional `/v1/images/*` and `/v1/audio/*` endpoints → [Server](docs/server.md)
276
294
 
277
295
  ## Tool calling (passthrough by default)
@@ -328,7 +346,7 @@ Notes:
328
346
  - **Images**: use a vision-capable model, or configure **vision fallback** for text-only models (`abstractcore --config`; `abstractcore --set-vision-provider PROVIDER MODEL`).
329
347
  - **Video**: `video_policy="auto"` (default) uses native video when supported, otherwise samples frames (requires `ffmpeg`/`ffprobe`) and routes them through image/vision handling (so you still need a vision-capable model or vision fallback configured).
330
348
  - **Audio**: use an audio-capable model, or set `audio_policy="auto"`/`"speech_to_text"` for speech-to-text through AbstractVoice (part of the light install).
331
- `abstractvoice` 0.11.0+ can install its base plugin path on Python 3.9 without OmniVoice, torch, or torchaudio. Local voice engines and clone backends are part of explicit local aggregate profiles.
349
+ `abstractvoice` installs its base plugin path on Python 3.9 without OmniVoice, torch, or torchaudio. Local voice engines and clone backends are part of explicit local aggregate profiles.
332
350
 
333
351
  Configure defaults (optional):
334
352
 
@@ -461,11 +479,30 @@ stt_models = llm.voice.list_stt_models()
461
479
  music_models = llm.capabilities.list_models("music", task="text_to_music")
462
480
  ```
463
481
 
482
+ Voices are navigable by engine and by language, and you can create your own:
483
+
484
+ ```python
485
+ french = llm.voice.list_voices(language="fr") # native French voices first
486
+ piper = llm.voice.list_voices(provider="piper") # one engine's voices
487
+ languages = llm.voice.list_languages(kind="tts") # languages per engine, no model loaded
488
+ # Each record: voice_id (pass as voice=), name, kind (profile|clone), provider, model, languages, language
489
+
490
+ mira = llm.voice.design_voice("A calm, warm female voice in her thirties.", name="Mira")
491
+ wav = llm.voice.tts("Good morning.", voice=mira["voice_id"], one_shot=True)
492
+ llm.voice.rename_cloned_voice(mira["voice_id"], "Mira (narrator)")
493
+ llm.voice.delete_cloned_voice(mira["voice_id"])
494
+ ```
495
+
496
+ `one_shot=True` synthesizes the whole text as one generation, so the take keeps one
497
+ voice from start to end (Qwen3-TTS voices, up to 1000 characters).
498
+
464
499
  The HTTP server exposes equivalent discovery at
465
- `/v1/vision/providers/`, `/v1/vision/models`, `/v1/audio/voices`,
466
- `/v1/audio/speech/models`, `/v1/audio/transcriptions/models`, and
467
- `/v1/voice/clone/providers`, plus `/v1/audio/music/providers` and
468
- `/v1/audio/music/models`.
500
+ `/v1/vision/providers/`, `/v1/vision/models`, `/v1/audio/voices` (with `language`),
501
+ `/v1/audio/languages`, `/v1/audio/speech/models`, `/v1/audio/transcriptions/models`,
502
+ `/v1/voice/clone/providers` and `/v1/voice/clones`, plus `/v1/audio/music/providers`
503
+ and `/v1/audio/music/models`. Voices are created and managed with
504
+ `POST /v1/voice/clone`, `POST /v1/voice/design` and
505
+ `GET|PATCH|DELETE /v1/voice/clones/{voice_id}`; see [Server](docs/server.md).
469
506
  Generated media HTTP routes include `/v1/images/generations`,
470
507
  `/v1/images/edits`, `/v1/videos/generations`, `/v1/videos/edits`, and
471
508
  async polling routes under `/v1/vision/jobs/images/*` and
@@ -280,6 +280,9 @@ def _partial_match_is_prefix_aligned(name_lower: str, key_lower: str) -> bool:
280
280
  return longer[len(shorter)] in _MODEL_NAME_BOUNDARY_CHARS
281
281
 
282
282
 
283
+ _HF_CACHE_SNAPSHOT_RE = re.compile(r"models--([^/]+?)--([^/]+)/snapshots/[^/]+(?:/(?:.*/)?([^/]+))?/?$")
284
+
285
+
283
286
  def resolve_model_alias(model_name: str, models: Dict[str, Any]) -> str:
284
287
  """
285
288
  Resolve a model name to its canonical name by checking aliases.
@@ -310,6 +313,21 @@ def resolve_model_alias(model_name: str, models: Dict[str, Any]) -> str:
310
313
  if model_name in models:
311
314
  _resolved_aliases_cache[model_name] = model_name
312
315
  return model_name
316
+
317
+ # A Hugging Face cache snapshot PATH (`.../models--org--name/snapshots/<rev>[/file]`)
318
+ # names its repo only in the `models--` segment; the tail is a revision hash (or a
319
+ # file). Resolve it as the repo id (then the file name), so a request made through
320
+ # the local path gets the same registry entry as one made through the repo id.
321
+ snapshot = _HF_CACHE_SNAPSHOT_RE.search(str(model_name or "").replace("\\", "/"))
322
+ if snapshot:
323
+ repo_id = f"{snapshot.group(1)}/{snapshot.group(2)}"
324
+ for candidate in (repo_id, snapshot.group(3)):
325
+ if not candidate:
326
+ continue
327
+ resolved = resolve_model_alias(candidate, models)
328
+ if resolved in models:
329
+ _resolved_aliases_cache[model_name] = resolved
330
+ return resolved
313
331
  direct_lower_match = canonical_lower_map.get(str(model_name or "").strip().lower())
314
332
  if direct_lower_match is not None:
315
333
  _resolved_aliases_cache[model_name] = direct_lower_match
@@ -17,6 +17,7 @@ text. The typed object form makes the surface kind explicit:
17
17
  "low_effort_template_kwarg": "low_effort",
18
18
  "request_param": "reasoning_effort",
19
19
  "effort_template_kwarg": "reasoning_effort",
20
+ "effort_disable_value": "no_think",
20
21
  "effort_system_lines": {"xhigh": "…", "medium": "", "low": "…"}
21
22
  }
22
23
  ```
@@ -41,6 +42,13 @@ Semantics:
41
42
  - ``effort_template_kwarg``: string chat-template variable selecting a reasoning-effort
42
43
  level (Qwen3.8 ``reasoning_effort``), sent via ``chat_template_kwargs`` by providers whose
43
44
  backend renders the template.
45
+ - ``effort_disable_value``: the value of ``effort_template_kwarg`` that turns reasoning OFF,
46
+ for templates whose ONE effort variable is also the on/off switch and that have no
47
+ boolean ``template_kwarg`` (HY V3 / Hy-Memory: ``reasoning_effort`` in
48
+ ``high | low | no_think``). Providers that render the template send this value for
49
+ ``thinking="off"`` and, for a bare ``thinking="on"``, the model's preferred declared
50
+ ``reasoning_levels`` entry (``medium``, then ``high``, then ``low``) — never a boolean
51
+ ``enable_thinking`` the template would silently ignore. Not a level name.
44
52
  - ``effort_system_lines``: level -> exact instruction sentence the model's own chat template
45
53
  prepends to the system block for that effort level. Lets locally-serializing providers
46
54
  (MLX) reproduce the template's effort control byte-for-byte. An EMPTY string value means
@@ -62,6 +70,7 @@ _SURFACE_KEYS = (
62
70
  "low_effort_template_kwarg",
63
71
  "request_param",
64
72
  "effort_template_kwarg",
73
+ "effort_disable_value",
65
74
  )
66
75
 
67
76
  _MAPPING_SURFACE_KEYS = ("effort_system_lines",)
@@ -78,11 +87,21 @@ class ThinkingControlSurfaces:
78
87
  low_effort_template_kwarg: Optional[str] = None
79
88
  request_param: Optional[str] = None
80
89
  effort_template_kwarg: Optional[str] = None
90
+ effort_disable_value: Optional[str] = None
81
91
  effort_system_lines: Optional[Mapping[str, str]] = None
82
92
 
83
93
  def any_declared(self) -> bool:
84
94
  return any(getattr(self, f.name) is not None for f in fields(self))
85
95
 
96
+ def effort_is_switch(self) -> bool:
97
+ """True when the effort template variable is ALSO the on/off switch.
98
+
99
+ Declared by ``effort_disable_value`` together with ``effort_template_kwarg`` and
100
+ no boolean ``template_kwarg``: thinking off/on are both expressed as values of
101
+ the one effort variable (HY V3 ``reasoning_effort=no_think`` / ``low`` / ``high``).
102
+ """
103
+ return bool(self.effort_template_kwarg and self.effort_disable_value and not self.template_kwarg)
104
+
86
105
 
87
106
  def _coerce_surface_value(value: Any) -> Optional[str]:
88
107
  if not isinstance(value, str):
@@ -168,7 +187,38 @@ def resolve_thinking_control_surfaces(
168
187
  return ThinkingControlSurfaces(**merged)
169
188
 
170
189
 
190
+ _EFFORT_ON_PREFERENCE = ("medium", "high", "low")
191
+
192
+
193
+ def effort_switch_value(
194
+ surfaces: ThinkingControlSurfaces,
195
+ *,
196
+ enabled: Optional[bool],
197
+ level: Optional[str],
198
+ declared_levels: Optional[list] = None,
199
+ ) -> Optional[str]:
200
+ """Value for an effort-switch template variable (see ``effort_is_switch``).
201
+
202
+ - ``enabled is False`` -> ``effort_disable_value``;
203
+ - an explicit ``level`` -> that level when declared (or when no levels are declared);
204
+ - a bare on -> the first of medium/high/low present in ``declared_levels``.
205
+ Returns None when the surface is not an effort switch or no honest value exists
206
+ (callers must then decline the claim, never guess).
207
+ """
208
+ if not surfaces.effort_is_switch():
209
+ return None
210
+ declared = [str(x).strip().lower() for x in (declared_levels or []) if isinstance(x, str) and x.strip()]
211
+ if enabled is False:
212
+ return surfaces.effort_disable_value
213
+ if isinstance(level, str) and level:
214
+ return level if (not declared or level in declared) else None
215
+ if enabled is True:
216
+ return next((x for x in _EFFORT_ON_PREFERENCE if x in declared), None)
217
+ return None
218
+
219
+
171
220
  __all__ = [
172
221
  "ThinkingControlSurfaces",
222
+ "effort_switch_value",
173
223
  "resolve_thinking_control_surfaces",
174
224
  ]
@@ -1248,6 +1248,51 @@
1248
1248
  "tencent/hy3"
1249
1249
  ]
1250
1250
  },
1251
+ "hy_v3": {
1252
+ "description": "Tencent HY V3 compact MoE (HYV3ForCausalLM; model_type 'hy_v3', GGUF general.architecture 'hy_v3'): Tencent Hy-Memory-30B-A3B long-term-memory writer (~30B total / ~3B active, 128 routed + 1 shared experts; October 2026). BOS then bare system text, <|hy_User|>/<|hy_Assistant|> role tokens, plain <think> tags, ONE reasoning_effort template variable (high|low|no_think; unset or unknown = no_think, so thinking is OFF by default) and <tool_calls><tool_call>name<tool_sep><arg_key>/<arg_value> tool blocks. Distinct from the 295B Hy3 (hunyuan3), which uses ':opensource'-suffixed tokens",
1253
+ "message_format": "special_tokens",
1254
+ "system_prefix": "<|hy_begin▁of▁sentence|>",
1255
+ "system_suffix": "",
1256
+ "user_prefix": "<|hy_User|>",
1257
+ "user_suffix": "",
1258
+ "assistant_prefix": "<|hy_Assistant|>",
1259
+ "assistant_suffix": "<eos:6124c78e>",
1260
+ "output_wrappers": {
1261
+ "end": "<eos:6124c78e>"
1262
+ },
1263
+ "tool_format": "glm_xml",
1264
+ "tool_prefix": "<tool_calls>",
1265
+ "tool_calling_format": "<tool_calls>\n<tool_call>function_name<tool_sep>\n<arg_key>key</arg_key>\n<arg_value>value</arg_value>\n</tool_call>\n</tool_calls>",
1266
+ "default_tool_support": "native",
1267
+ "thinking_tags": [
1268
+ "<think>",
1269
+ "</think>"
1270
+ ],
1271
+ "thinking_output_field": "reasoning_content",
1272
+ "thinking_control": {
1273
+ "effort_template_kwarg": "reasoning_effort",
1274
+ "effort_disable_value": "no_think",
1275
+ "request_param": "reasoning_effort"
1276
+ },
1277
+ "reasoning_support": true,
1278
+ "reasoning_levels": [
1279
+ "low",
1280
+ "high"
1281
+ ],
1282
+ "inference_parameters": {
1283
+ "temperature": 0.7,
1284
+ "top_p": 1.0,
1285
+ "repeat_penalty": 1.0
1286
+ },
1287
+ "patterns": [
1288
+ "tencent/hy-memory",
1289
+ "/hy-memory",
1290
+ "hy-memory-30b",
1291
+ "hy-memory-step",
1292
+ "hy3a3b",
1293
+ "hy3a3b-memrl1009-step250"
1294
+ ]
1295
+ },
1251
1296
  "longcat": {
1252
1297
  "description": "Meituan LongCat 2.0 large-scale MoE with LongCat Sparse Attention (July 2026; dedicated <longcat_*> role/thinking/tool special tokens — serve via OpenAI-compatible stacks)",
1253
1298
  "message_format": "openai_chat",
@@ -1086,6 +1086,44 @@
1086
1086
  ]
1087
1087
  }
1088
1088
  },
1089
+ "claude-haiku-5-5": {
1090
+ "max_output_tokens": 128000,
1091
+ "tool_support": "native",
1092
+ "structured_output": "native",
1093
+ "parallel_tools": true,
1094
+ "max_tools": -1,
1095
+ "vision_support": true,
1096
+ "audio_support": false,
1097
+ "thinking_support": true,
1098
+ "thinking_budget": true,
1099
+ "thinking_control_mode": "adaptive",
1100
+ "max_effort_supported": true,
1101
+ "reasoning_levels": [
1102
+ "low",
1103
+ "medium",
1104
+ "high",
1105
+ "xhigh"
1106
+ ],
1107
+ "notes": "Anthropic Haiku tier, 5th generation (released 2026-10-07), for high-volume, latency-sensitive work (classification, routing, extraction, subagents). Official docs: text and image input, text output, 1M context, 128K max output (300K on the Message Batches API with the output-300k-2026-03-24 beta header), adaptive thinking on by default, effort parameter with all five levels low|medium|high|xhigh|max (default medium; max is not in the unified thinking vocabulary, see max_effort_supported). thinking:{type:disabled} is accepted at effort high or below and returns 400 at xhigh/max. Omit temperature, top_p and top_k. Newer tokenizer (about 30% more tokens than Haiku 4.5 for the same text); 512-token prompt-cache minimum. Observed via OpenAI-compatible proxy 2026-10-25: /v1/chat/completions rejects reasoning_effort 'none' and accepts low|medium|high|xhigh|max.",
1108
+ "source": "Anthropic docs: platform.claude.com/docs/en/models/haiku-5-5/overview, /docs/en/about-claude/models/overview and /docs/en/build-with-claude/effort (accessed 2026-10-25); reasoning_effort acceptance observed via OpenAI-compatible proxy 2026-10-25",
1109
+ "canonical_name": "claude-haiku-5-5",
1110
+ "aliases": [
1111
+ "anthropic/claude-haiku-5-5"
1112
+ ],
1113
+ "max_tokens": 1000000,
1114
+ "video_support": false,
1115
+ "video_input_mode": "frames",
1116
+ "capability_routes": {
1117
+ "input": [
1118
+ "text",
1119
+ "image",
1120
+ "video"
1121
+ ],
1122
+ "output": [
1123
+ "text"
1124
+ ]
1125
+ }
1126
+ },
1089
1127
  "cogito:3b": {
1090
1128
  "max_output_tokens": 4096,
1091
1129
  "tool_support": "native",
@@ -5643,6 +5681,41 @@
5643
5681
  ]
5644
5682
  }
5645
5683
  },
5684
+ "gpt-6-luna": {
5685
+ "max_output_tokens": 128000,
5686
+ "tool_support": "native",
5687
+ "structured_output": "native",
5688
+ "parallel_tools": true,
5689
+ "max_tools": -1,
5690
+ "vision_support": true,
5691
+ "audio_support": false,
5692
+ "thinking_support": true,
5693
+ "token_param_name": "max_completion_tokens",
5694
+ "reasoning_levels": [
5695
+ "none",
5696
+ "low",
5697
+ "medium",
5698
+ "high",
5699
+ "xhigh"
5700
+ ],
5701
+ "max_effort_supported": true,
5702
+ "notes": "GPT-6 family efficient model for focused, high-volume tasks (successor of gpt-5.6-luna). Official model page: 1,050,000-token context window, 922,000 max input, 128,000 max output; reasoning token support; reasoning.effort none|low|medium|high|xhigh|max, default medium (max is not in the unified thinking vocabulary, see max_effort_supported); knowledge cutoff 2026-05-18; text+image input, text output; streaming, structured outputs, function calling, prompt caching; Chat Completions, Responses and Batch endpoints. The page notes Chat Completions supports function calling only with reasoning_effort none and recommends the Responses API for tools. max_tokens records the published 1,050,000 window: the 400,000-token Codex-backend session ceiling wire-verified for gpt-5.6-sol is NOT verified for GPT-6. Observed via OpenAI-compatible proxy 2026-10-25: accepts reasoning_effort none|low|medium|high and rejects 'minimal'.",
5703
+ "source": "OpenAI model page developers.openai.com/api/docs/models/gpt-6-luna (accessed 2026-10-25); reasoning_effort acceptance observed via OpenAI-compatible proxy 2026-10-25",
5704
+ "canonical_name": "gpt-6-luna",
5705
+ "aliases": [],
5706
+ "max_tokens": 1050000,
5707
+ "video_support": false,
5708
+ "video_input_mode": "frames",
5709
+ "capability_routes": {
5710
+ "input": [
5711
+ "text",
5712
+ "image"
5713
+ ],
5714
+ "output": [
5715
+ "text"
5716
+ ]
5717
+ }
5718
+ },
5646
5719
  "text-embedding-ada-002": {
5647
5720
  "max_output_tokens": 0,
5648
5721
  "tool_support": "none",
@@ -9549,6 +9622,71 @@
9549
9622
  ]
9550
9623
  }
9551
9624
  },
9625
+ "hy-memory-30b-a3b": {
9626
+ "max_output_tokens": 16384,
9627
+ "tool_support": "native",
9628
+ "structured_output": "prompted",
9629
+ "parallel_tools": true,
9630
+ "vision_support": false,
9631
+ "audio_support": false,
9632
+ "video_support": false,
9633
+ "thinking_support": true,
9634
+ "thinking_tags": [
9635
+ "<think>",
9636
+ "</think>"
9637
+ ],
9638
+ "thinking_output_field": "reasoning_content",
9639
+ "thinking_control": {
9640
+ "effort_template_kwarg": "reasoning_effort",
9641
+ "effort_disable_value": "no_think",
9642
+ "request_param": "reasoning_effort"
9643
+ },
9644
+ "reasoning_levels": [
9645
+ "low",
9646
+ "high"
9647
+ ],
9648
+ "architecture": "hy_v3",
9649
+ "total_parameters": "30B",
9650
+ "active_parameters": "3B",
9651
+ "experts": 128,
9652
+ "shared_experts": 1,
9653
+ "experts_activated": 8,
9654
+ "license": "Apache-2.0",
9655
+ "release_date": "2026-10-15",
9656
+ "notes": "Specialty seems to be a long-term memory writer: Tencent Hunyuan trained it to execute the WRITE path inside external memory frameworks (drop-in writer LLM for Mem0, MemOS and Hy-Memory; transfers to EverMemOS) — deciding what to retain, how precisely to represent it and how new evidence updates the memory bank. HYV3ForCausalLM (model_type 'hy_v3'): 48 layers, hidden 2048, GQA 32 heads / 4 KV heads (head_dim 128, QK-norm), layer 0 dense (intermediate 6912), layers 1-47 MoE with 128 routed experts (8 activated) + 1 shared expert, sigmoid router with selection-only expert bias, route_norm and router_scaling_factor 2.826; no MTP layers; 120,832-token vocab; default RoPE (theta 11,158,840); config max_position_embeddings 262,144. CHECKPOINT QUIRK: routed and shared expert tensors are 768 wide (config 'expert_hidden_dim': 768) while config 'moe_intermediate_size' says 1536, which is what transformers' hy_v3 (5.8) reads — loaders must size experts from expert_hidden_dim. Chat template: BOS then bare system text, <|hy_User|>/<|hy_Assistant|>, eos <eos:6124c78e>; ONE 'reasoning_effort' template variable (high | low | no_think; unset or unknown renders no_think, so thinking is OFF by default; no_think pre-closes an empty <think></think> after the assistant token, low/high open <think>). Tool calls: <tool_calls><tool_call>name<tool_sep><arg_key>k</arg_key><arg_value>v</arg_value></tool_call></tool_calls> (non-string values JSON-encoded); tool results in <tool_responses><tool_response>. Card quickstart: vLLM (tested v0.31.0), chat_template_kwargs {\"reasoning_effort\": \"no_think\"}, temperature 0.0 and max_tokens 512 for memory extraction; the GGUF card's llama-server defaults are --temp 0.7 --top-k 0 --top-p 1.0 --repeat-penalty 1.0 --jinja with reasoning_effort no_think (inference_parameters mirror temp/top_p; top_k 0 = disabled is left to the backend). No output cap is published: max_output_tokens 16,384 leaves room for a reasoning_effort=high trace plus the memory payload while bounding runaway local generations — raise per deployment. Artifacts: tencent BF16 safetensors (51 shards, 60.1 GB), tencent FP8 (F8_E4M3, vLLM/SGLang only — no Apple-silicon path), tencent GGUF (Q4_K_M-imat 18.2 GB, Q6_K-imat 24.7 GB, Q8_0 32 GB; llama.cpp arch hy_v3), and mlx-community 4-bit / 8-bit MLX conversions that bundle the model class (hy_v3.py via config 'model_file') because mlx-lm ships no hy_v3 module. Paper arXiv 2610.22196; code github.com/Tencent-Hunyuan/Hy-Memory.",
9657
+ "source": "Hugging Face model cards, config.json, tokenizer.json, chat_template.jinja and safetensors index (tencent/Hy-Memory-30B-A3B @64a460a9, tencent/Hy-Memory-30B-A3B-FP8, tencent/Hy-Memory-30B-A3B-GGUF; HF API createdAt 2026-10-15), accessed 2026-10-21",
9658
+ "canonical_name": "hy-memory-30b-a3b",
9659
+ "aliases": [
9660
+ "tencent/Hy-Memory-30B-A3B",
9661
+ "tencent/Hy-Memory-30B-A3B-FP8",
9662
+ "tencent/Hy-Memory-30B-A3B-GGUF",
9663
+ "mlx-community/Hy-Memory-30B-A3B-4bit",
9664
+ "mlx-community/Hy-Memory-30B-A3B-8bit",
9665
+ "hy3a3b-memrl1009-step250-Q4_K_M-imat.gguf",
9666
+ "hy3a3b-memrl1009-step250-Q6_K-imat.gguf",
9667
+ "Hy-Memory-Step250-Q8_0.gguf",
9668
+ "hy3a3b-memrl1009-step250",
9669
+ "hy-memory-step250",
9670
+ "hy-memory-30b-a3b-fp8",
9671
+ "hy-memory-30b-a3b-gguf"
9672
+ ],
9673
+ "max_tokens": 262144,
9674
+ "inference_parameters": {
9675
+ "temperature": 0.7,
9676
+ "top_p": 1.0,
9677
+ "repeat_penalty": 1.0
9678
+ },
9679
+ "max_tools": -1,
9680
+ "video_input_mode": "none",
9681
+ "capability_routes": {
9682
+ "input": [
9683
+ "text"
9684
+ ],
9685
+ "output": [
9686
+ "text"
9687
+ ]
9688
+ }
9689
+ },
9552
9690
  "minimax-m3": {
9553
9691
  "max_output_tokens": 8192,
9554
9692
  "tool_support": "native",
@@ -3162,6 +3162,71 @@
3162
3162
  }
3163
3163
  ]
3164
3164
  },
3165
+ {
3166
+ "id": "hy-memory-30b-a3b",
3167
+ "family": "hy-memory",
3168
+ "display_name": "Hy-Memory 30B-A3B",
3169
+ "vendor": "Tencent",
3170
+ "params_total": 30064725888,
3171
+ "params_active": 3000000000,
3172
+ "license": "apache-2.0",
3173
+ "capabilities_key": "hy-memory-30b-a3b",
3174
+ "tags": [
3175
+ "chat",
3176
+ "thinking",
3177
+ "tools",
3178
+ "moe"
3179
+ ],
3180
+ "starter": false,
3181
+ "kv_geometry": {
3182
+ "n_layers": 48,
3183
+ "n_kv_heads": 4,
3184
+ "head_dim": 128,
3185
+ "source": "config.json of tencent/Hy-Memory-30B-A3B@64a460a94d54: 48 full-attention layers, GQA 32 query / 4 KV heads"
3186
+ },
3187
+ "artifacts": [
3188
+ {
3189
+ "provider": "mlx",
3190
+ "artifact": "mlx-community/Hy-Memory-30B-A3B-4bit",
3191
+ "quant": "4bit",
3192
+ "download_bytes": 16929648349,
3193
+ "size_source": "catalog",
3194
+ "verified": true,
3195
+ "upstream": {
3196
+ "method": "hf_api",
3197
+ "checked": "2026-10-21",
3198
+ "revision": "65eb23e40d0d61fab54c887f432718491cd51858"
3199
+ }
3200
+ },
3201
+ {
3202
+ "provider": "mlx",
3203
+ "artifact": "mlx-community/Hy-Memory-30B-A3B-8bit",
3204
+ "quant": "8bit",
3205
+ "download_bytes": 31955742589,
3206
+ "size_source": "catalog",
3207
+ "verified": true,
3208
+ "upstream": {
3209
+ "method": "hf_api",
3210
+ "checked": "2026-10-21",
3211
+ "revision": "fe36f0ba3190ae05283429fe69e29b13eedec98f"
3212
+ }
3213
+ },
3214
+ {
3215
+ "provider": "huggingface",
3216
+ "artifact": "tencent/Hy-Memory-30B-A3B-GGUF:Q4_K_M",
3217
+ "quant": "q4_k_m",
3218
+ "download_bytes": 18236702464,
3219
+ "size_source": "catalog",
3220
+ "verified": true,
3221
+ "upstream": {
3222
+ "method": "hf_api",
3223
+ "checked": "2026-10-21",
3224
+ "revision": "7778309f5109ec6e86820c687e638b9589b541a9"
3225
+ }
3226
+ }
3227
+ ],
3228
+ "notes": "Long-term memory writer (the write path of Mem0, MemOS and Hy-Memory). Thinking is off by default (reasoning_effort no_think). The MLX repos bundle the hy_v3 model class (config model_file) because mlx-lm ships none; AbstractCore uses its own copy."
3229
+ },
3165
3230
  {
3166
3231
  "id": "nomic-embed-text-v1.5",
3167
3232
  "family": "nomic-embed",