abstractcore 2.26.3__tar.gz → 2.30.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.30.0}/PKG-INFO +53 -20
  2. {abstractcore-2.26.3 → abstractcore-2.30.0}/README.md +39 -6
  3. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/architectures/detection.py +18 -0
  4. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/architectures/thinking_controls.py +50 -0
  5. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/architecture_formats.json +45 -0
  6. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/model_capabilities.json +138 -0
  7. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/model_downloads_catalog.json +65 -0
  8. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/capabilities/registry.py +105 -0
  9. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/__init__.py +6 -0
  10. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/client.py +506 -21
  11. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/context.py +19 -1
  12. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/errors.py +7 -0
  13. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/models.py +47 -1
  14. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/search.py +43 -2
  15. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/store.py +45 -0
  16. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/email_cli.py +2 -0
  17. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/route_engines.py +4 -4
  18. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/base.py +209 -17
  19. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/huggingface_provider.py +309 -22
  20. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/lmstudio_provider.py +114 -82
  21. abstractcore-2.30.0/abstractcore/providers/mlx_hy_v3.py +440 -0
  22. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_provider.py +91 -4
  23. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/openai_compatible_provider.py +45 -0
  24. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/openai_provider.py +3 -0
  25. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/openrouter_provider.py +77 -0
  26. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/streaming.py +71 -7
  27. abstractcore-2.30.0/abstractcore/providers/vllm_provider.py +288 -0
  28. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/audio_endpoints.py +257 -4
  29. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/testing/mailserver.py +149 -4
  30. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/parser.py +93 -20
  31. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/version.py +1 -1
  32. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore.egg-info/PKG-INFO +53 -20
  33. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore.egg-info/SOURCES.txt +1 -0
  34. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore.egg-info/requires.txt +13 -13
  35. {abstractcore-2.26.3 → abstractcore-2.30.0}/pyproject.toml +13 -13
  36. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_generate_contract.py +24 -0
  37. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_install_settings.py +2 -2
  38. abstractcore-2.26.3/abstractcore/providers/vllm_provider.py +0 -196
  39. {abstractcore-2.26.3 → abstractcore-2.30.0}/LICENSE +0 -0
  40. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/__init__.py +0 -0
  41. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/apps/__init__.py +0 -0
  42. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/apps/__main__.py +0 -0
  43. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/apps/app_config_utils.py +0 -0
  44. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/apps/deepsearch.py +0 -0
  45. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/apps/extractor.py +0 -0
  46. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/apps/intent.py +0 -0
  47. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/apps/judge.py +0 -0
  48. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/apps/summarizer.py +0 -0
  49. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/architectures/__init__.py +0 -0
  50. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/architectures/enums.py +0 -0
  51. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/architectures/response_postprocessing.py +0 -0
  52. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/OCRA.ttf +0 -0
  53. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/OCRB.ttf +0 -0
  54. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/OCRBL.ttf +0 -0
  55. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/README.md +0 -0
  56. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/abstractframework_identity.json +0 -0
  57. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/bloc-schema.jsonld +0 -0
  58. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/model_capabilities.schema.json +0 -0
  59. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/model_downloads_catalog.schema.json +0 -0
  60. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/semantic_models.md +0 -0
  61. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/assets/session_schema.json +0 -0
  62. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/capabilities/__init__.py +0 -0
  63. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/capabilities/errors.py +0 -0
  64. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/capabilities/host.py +0 -0
  65. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/capabilities/music_selectors.py +0 -0
  66. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/capabilities/scene3d_selectors.py +0 -0
  67. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/capabilities/types.py +0 -0
  68. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/capabilities/vision_catalog.py +0 -0
  69. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/__init__.py +0 -0
  70. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/bodystructure.py +0 -0
  71. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/discovery.py +0 -0
  72. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/imap_codec.py +0 -0
  73. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/legacy.py +0 -0
  74. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/limits.py +0 -0
  75. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/oauth.py +0 -0
  76. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/policy.py +0 -0
  77. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/comms/email/vault.py +0 -0
  78. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/__init__.py +0 -0
  79. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/analytics.py +0 -0
  80. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/cache.py +0 -0
  81. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/config.py +0 -0
  82. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/exceptions.py +0 -0
  83. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/glyph_processor.py +0 -0
  84. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/optimizer.py +0 -0
  85. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/orchestrator.py +0 -0
  86. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/pil_text_renderer.py +0 -0
  87. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/quality.py +0 -0
  88. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/text_formatter.py +0 -0
  89. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/compression/vision_compressor.py +0 -0
  90. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/__init__.py +0 -0
  91. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/capability_defaults.py +0 -0
  92. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/engines.py +0 -0
  93. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/host_jobs.py +0 -0
  94. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/main.py +0 -0
  95. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/manager.py +0 -0
  96. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/model_catalog.py +0 -0
  97. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/model_materializer.py +0 -0
  98. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/model_verify.py +0 -0
  99. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/models_engines_cli.py +0 -0
  100. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/provider_profiles.py +0 -0
  101. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/recommendations.py +0 -0
  102. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/config/vision_config.py +0 -0
  103. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/console/__init__.py +0 -0
  104. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/console/theme_sync.py +0 -0
  105. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/console/themes.py +0 -0
  106. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/console/web.py +0 -0
  107. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/__init__.py +0 -0
  108. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/bloc_kv.py +0 -0
  109. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/bloc_metadata.py +0 -0
  110. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/cached_session.py +0 -0
  111. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/degeneration.py +0 -0
  112. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/endpoint_damping.py +0 -0
  113. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/enums.py +0 -0
  114. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/factory.py +0 -0
  115. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/file_blocs.py +0 -0
  116. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/file_boxes.py +0 -0
  117. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/generate_contract.py +0 -0
  118. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/interface.py +0 -0
  119. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/multimodal_generation.py +0 -0
  120. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/output_specs.py +0 -0
  121. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/retry.py +0 -0
  122. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/session.py +0 -0
  123. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/core/types.py +0 -0
  124. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/download.py +0 -0
  125. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/embeddings/__init__.py +0 -0
  126. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/embeddings/manager.py +0 -0
  127. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/embeddings/models.py +0 -0
  128. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/endpoint/__init__.py +0 -0
  129. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/endpoint/app.py +0 -0
  130. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/events/__init__.py +0 -0
  131. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/exceptions/__init__.py +0 -0
  132. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/mcp/__init__.py +0 -0
  133. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/mcp/client.py +0 -0
  134. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/mcp/factory.py +0 -0
  135. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/mcp/naming.py +0 -0
  136. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/mcp/stdio_client.py +0 -0
  137. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/mcp/tool_source.py +0 -0
  138. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/__init__.py +0 -0
  139. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/auto_handler.py +0 -0
  140. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/base.py +0 -0
  141. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/capabilities.py +0 -0
  142. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/delivery.py +0 -0
  143. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/enrichment.py +0 -0
  144. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/handlers/__init__.py +0 -0
  145. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/handlers/anthropic_handler.py +0 -0
  146. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/handlers/local_handler.py +0 -0
  147. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/handlers/openai_handler.py +0 -0
  148. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/openai_parts.py +0 -0
  149. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/pdf_routing.py +0 -0
  150. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/__init__.py +0 -0
  151. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/audio_processor.py +0 -0
  152. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/direct_pdf_processor.py +0 -0
  153. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/glyph_pdf_processor.py +0 -0
  154. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/image_processor.py +0 -0
  155. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/office_processor.py +0 -0
  156. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/pdf_processor.py +0 -0
  157. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/text_processor.py +0 -0
  158. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/processors/video_processor.py +0 -0
  159. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/types.py +0 -0
  160. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/utils/__init__.py +0 -0
  161. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/utils/image_scaler.py +0 -0
  162. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/utils/video_frames.py +0 -0
  163. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/media/vision_fallback.py +0 -0
  164. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/processing/__init__.py +0 -0
  165. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/processing/basic_deepsearch.py +0 -0
  166. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/processing/basic_extractor.py +0 -0
  167. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/processing/basic_intent.py +0 -0
  168. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/processing/basic_judge.py +0 -0
  169. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/processing/basic_summarizer.py +0 -0
  170. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/__init__.py +0 -0
  171. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/_http.py +0 -0
  172. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/anthropic_provider.py +0 -0
  173. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/capability_host.py +0 -0
  174. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/endpoint_context.py +0 -0
  175. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/generation_cancel.py +0 -0
  176. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/generation_progress.py +0 -0
  177. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/hf_residency.py +0 -0
  178. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_model_rules.py +0 -0
  179. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_native_cache.py +0 -0
  180. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_native_session.py +0 -0
  181. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_prefill_observer.py +0 -0
  182. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_qwen4.py +0 -0
  183. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_residency.py +0 -0
  184. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_runtime.py +0 -0
  185. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/mlx_vision_addon.py +0 -0
  186. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/model_capabilities.py +0 -0
  187. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/model_config_fingerprint.py +0 -0
  188. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/ollama_provider.py +0 -0
  189. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/portkey_provider.py +0 -0
  190. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/process_residency.py +0 -0
  191. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/registry.py +0 -0
  192. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/speculation.py +0 -0
  193. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/tokenizer_fingerprint.py +0 -0
  194. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/providers/weights_fingerprint.py +0 -0
  195. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/py.typed +0 -0
  196. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/__init__.py +0 -0
  197. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/__main__.py +0 -0
  198. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/app.py +0 -0
  199. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/auth_policy.py +0 -0
  200. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/camera_endpoints.py +0 -0
  201. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/capability_generation.py +0 -0
  202. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/console_routes.py +0 -0
  203. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/credentials.py +0 -0
  204. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/email_routes.py +0 -0
  205. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/first_run.py +0 -0
  206. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/host_routes.py +0 -0
  207. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/scene3d_endpoints.py +0 -0
  208. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/session_routes.py +0 -0
  209. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/server/vision_endpoints.py +0 -0
  210. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/structured/__init__.py +0 -0
  211. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/structured/handler.py +0 -0
  212. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/structured/json_schema.py +0 -0
  213. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/structured/retry.py +0 -0
  214. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/structured/schema_compat.py +0 -0
  215. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/testing/__init__.py +0 -0
  216. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/__init__.py +0 -0
  217. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/abstractignore.py +0 -0
  218. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/arg_canonicalizer.py +0 -0
  219. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/arg_coercion.py +0 -0
  220. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/browser_tools.py +0 -0
  221. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/code_analysis.py +0 -0
  222. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/common_tools.py +0 -0
  223. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/comms_tools.py +0 -0
  224. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/core.py +0 -0
  225. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/email_digests.py +0 -0
  226. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/fetch_url_ssrf.py +0 -0
  227. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/handler.py +0 -0
  228. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/inventory.py +0 -0
  229. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/process_tree.py +0 -0
  230. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/registry.py +0 -0
  231. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/risk_facts.py +0 -0
  232. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/sandbox.py +0 -0
  233. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/shell_session.py +0 -0
  234. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/shell_tools.py +0 -0
  235. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/syntax_rewriter.py +0 -0
  236. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/tag_rewriter.py +0 -0
  237. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/telegram_tdlib.py +0 -0
  238. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/telegram_tools.py +0 -0
  239. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/tools/wire_naming.py +0 -0
  240. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/__init__.py +0 -0
  241. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/async_stream.py +0 -0
  242. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/cli.py +0 -0
  243. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/context_calibration.py +0 -0
  244. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/context_estimate.py +0 -0
  245. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/data_registry.py +0 -0
  246. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/display.py +0 -0
  247. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/file_filters.py +0 -0
  248. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/host_profile.py +0 -0
  249. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/hostinfo.py +0 -0
  250. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/identity.py +0 -0
  251. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/install_settings.py +0 -0
  252. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/jsonish.py +0 -0
  253. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/memory.py +0 -0
  254. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/message_preprocessor.py +0 -0
  255. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/model_cache.py +0 -0
  256. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/model_fit.py +0 -0
  257. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/residency.py +0 -0
  258. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/self_fixes.py +0 -0
  259. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/stdio.py +0 -0
  260. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/structured_logging.py +0 -0
  261. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/token_utils.py +0 -0
  262. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/trace_export.py +0 -0
  263. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/truncation.py +0 -0
  264. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/vlm_token_calculator.py +0 -0
  265. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/windows_dll.py +0 -0
  266. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore/utils/workspace_paths.py +0 -0
  267. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore.egg-info/dependency_links.txt +0 -0
  268. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore.egg-info/entry_points.txt +0 -0
  269. {abstractcore-2.26.3 → abstractcore-2.30.0}/abstractcore.egg-info/top_level.txt +0 -0
  270. {abstractcore-2.26.3 → abstractcore-2.30.0}/setup.cfg +0 -0
  271. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_abstractendpoint_singleton_provider.py +0 -0
  272. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_agentic_cli_compatibility.py +0 -0
  273. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_basic_session.py +0 -0
  274. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_bloc_kv.py +0 -0
  275. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_bloc_kv_cache_dtype.py +0 -0
  276. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_bloc_kv_endpoint.py +0 -0
  277. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_bloc_kv_engine_fingerprint.py +0 -0
  278. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_bloc_kv_model_config_fingerprint.py +0 -0
  279. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_bloc_kv_tokenizer_fingerprint.py +0 -0
  280. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_bloc_kv_weights_fingerprint.py +0 -0
  281. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_bloc_metadata_json_extract.py +0 -0
  282. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_cached_session_kv_mode.py +0 -0
  283. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_cached_session_kv_thinking_prefix.py +0 -0
  284. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_capabilities_registry.py +0 -0
  285. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_capabilities_registry_preferred_backends_from_config.py +0 -0
  286. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_complete_integration.py +0 -0
  287. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_comprehensive_events.py +0 -0
  288. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_console_about.py +0 -0
  289. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_console_email_tab.py +0 -0
  290. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_console_web.py +0 -0
  291. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_core_components.py +0 -0
  292. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_display_rule.py +0 -0
  293. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_email_digests.py +0 -0
  294. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_embedding_model_token_warnings.py +0 -0
  295. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_enhanced_prompt.py +0 -0
  296. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_environment_variable_tool_call_tags.py +0 -0
  297. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_factory.py +0 -0
  298. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_file_bloc_store_unit.py +0 -0
  299. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_file_boxes_cached_session.py +0 -0
  300. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_final_accuracy.py +0 -0
  301. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_final_comprehensive.py +0 -0
  302. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_final_graceful_errors.py +0 -0
  303. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_generate_response_reasoning_property_unit.py +0 -0
  304. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_generate_with_outputs.py +0 -0
  305. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_graceful_fallback.py +0 -0
  306. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_import_debug.py +0 -0
  307. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_import_safety.py +0 -0
  308. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_incremental_thinking_tag_stripper.py +0 -0
  309. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_install_hints_no_bare_packages.py +0 -0
  310. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_integrated_functionality.py +0 -0
  311. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_llms_sources.py +0 -0
  312. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_mcp_handshake.py +0 -0
  313. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_mcp_integration.py +0 -0
  314. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_mcp_stdio_client.py +0 -0
  315. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_multimodal_generate_output.py +0 -0
  316. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_openai_prompt_cache_key_passthrough.py +0 -0
  317. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_output_specs.py +0 -0
  318. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_packaging_assets.py +0 -0
  319. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_packaging_extras.py +0 -0
  320. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_prompt_cache_api.py +0 -0
  321. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_prompt_cache_bloc_composition.py +0 -0
  322. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_prompt_cache_bloc_e2e_gate.py +0 -0
  323. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_prompt_cache_control_plane.py +0 -0
  324. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_prompt_cache_prepare_modules_thinking_http.py +0 -0
  325. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_retry_observability.py +0 -0
  326. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_retry_strategy.py +0 -0
  327. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_seed_determinism.py +0 -0
  328. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_seed_temperature_basic.py +0 -0
  329. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_sensory_prompting.py +0 -0
  330. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_server_prompt_cache_control_plane_proxy.py +0 -0
  331. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_server_prompt_cache_key_passthrough.py +0 -0
  332. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_session_reasoning_persistence_unit.py +0 -0
  333. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_sound_effect_seconds_route.py +0 -0
  334. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_structured_output_truncation_retry.py +0 -0
  335. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_text_only_model_experience.py +0 -0
  336. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_unload_memory.py +0 -0
  337. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_user_scenario_validation.py +0 -0
  338. {abstractcore-2.26.3 → abstractcore-2.30.0}/tests/test_voice_host_credentials.py +0 -0
  339. {abstractcore-2.26.3 → abstractcore-2.30.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.30.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
@@ -248,6 +248,20 @@ For AI assistants and doc-indexing tools, this repository also publishes
248
248
  [`llms.txt`](llms.txt) and [`llms-full.txt`](llms-full.txt). MCP clients such as
249
249
  Context7 can query the public documentation directly as well.
250
250
 
251
+ ## For AI agents
252
+
253
+ Register and use the [`abstractcore` agent skill](https://github.com/lpalbou/AbstractCore/tree/main/skills/abstractcore)
254
+ to write integrations and operate the Python API, CLI and HTTP server. Start by reading
255
+ [`skills/abstractcore/SKILL.md`](https://raw.githubusercontent.com/lpalbou/AbstractCore/main/skills/abstractcore/SKILL.md);
256
+ keep its `references/` folder alongside it when copying the skill into your agent's skill directory.
257
+ In a source checkout, tell another agent: **Read `skills/abstractcore/SKILL.md` and use its
258
+ references for this task.**
259
+
260
+ The skill covers provider and artifact selection, token/time/cost limits, host-controlled
261
+ tools, sessions, typed output, media and diagnostics. The canonical
262
+ [integration and operations guide](docs/agent-usage.md) contains the same supported workflows;
263
+ source contributors should also read [Contributing](CONTRIBUTING.md).
264
+
251
265
  ## Why AbstractCore
252
266
 
253
267
  Many libraries can call an LLM. AbstractCore is for the messy middle of real
@@ -455,7 +469,7 @@ You can also persist settings (including API keys) via the config CLI:
455
469
  - Embeddings and semantic search → [Embeddings](docs/embeddings.md)
456
470
  - 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
471
  - 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)
472
+ - 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
473
  - OpenAI-compatible server: one `/v1` gateway for chat + optional `/v1/images/*` and `/v1/audio/*` endpoints → [Server](docs/server.md)
460
474
 
461
475
  ## Tool calling (passthrough by default)
@@ -512,7 +526,7 @@ Notes:
512
526
  - **Images**: use a vision-capable model, or configure **vision fallback** for text-only models (`abstractcore --config`; `abstractcore --set-vision-provider PROVIDER MODEL`).
513
527
  - **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
528
  - **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.
529
+ `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
530
 
517
531
  Configure defaults (optional):
518
532
 
@@ -645,11 +659,30 @@ stt_models = llm.voice.list_stt_models()
645
659
  music_models = llm.capabilities.list_models("music", task="text_to_music")
646
660
  ```
647
661
 
662
+ Voices are navigable by engine and by language, and you can create your own:
663
+
664
+ ```python
665
+ french = llm.voice.list_voices(language="fr") # native French voices first
666
+ piper = llm.voice.list_voices(provider="piper") # one engine's voices
667
+ languages = llm.voice.list_languages(kind="tts") # languages per engine, no model loaded
668
+ # Each record: voice_id (pass as voice=), name, kind (profile|clone), provider, model, languages, language
669
+
670
+ mira = llm.voice.design_voice("A calm, warm female voice in her thirties.", name="Mira")
671
+ wav = llm.voice.tts("Good morning.", voice=mira["voice_id"], one_shot=True)
672
+ llm.voice.rename_cloned_voice(mira["voice_id"], "Mira (narrator)")
673
+ llm.voice.delete_cloned_voice(mira["voice_id"])
674
+ ```
675
+
676
+ `one_shot=True` synthesizes the whole text as one generation, so the take keeps one
677
+ voice from start to end (Qwen3-TTS voices, up to 1000 characters).
678
+
648
679
  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`.
680
+ `/v1/vision/providers/`, `/v1/vision/models`, `/v1/audio/voices` (with `language`),
681
+ `/v1/audio/languages`, `/v1/audio/speech/models`, `/v1/audio/transcriptions/models`,
682
+ `/v1/voice/clone/providers` and `/v1/voice/clones`, plus `/v1/audio/music/providers`
683
+ and `/v1/audio/music/models`. Voices are created and managed with
684
+ `POST /v1/voice/clone`, `POST /v1/voice/design` and
685
+ `GET|PATCH|DELETE /v1/voice/clones/{voice_id}`; see [Server](docs/server.md).
653
686
  Generated media HTTP routes include `/v1/images/generations`,
654
687
  `/v1/images/edits`, `/v1/videos/generations`, `/v1/videos/edits`, and
655
688
  async polling routes under `/v1/vision/jobs/images/*` and
@@ -64,6 +64,20 @@ For AI assistants and doc-indexing tools, this repository also publishes
64
64
  [`llms.txt`](llms.txt) and [`llms-full.txt`](llms-full.txt). MCP clients such as
65
65
  Context7 can query the public documentation directly as well.
66
66
 
67
+ ## For AI agents
68
+
69
+ Register and use the [`abstractcore` agent skill](https://github.com/lpalbou/AbstractCore/tree/main/skills/abstractcore)
70
+ to write integrations and operate the Python API, CLI and HTTP server. Start by reading
71
+ [`skills/abstractcore/SKILL.md`](https://raw.githubusercontent.com/lpalbou/AbstractCore/main/skills/abstractcore/SKILL.md);
72
+ keep its `references/` folder alongside it when copying the skill into your agent's skill directory.
73
+ In a source checkout, tell another agent: **Read `skills/abstractcore/SKILL.md` and use its
74
+ references for this task.**
75
+
76
+ The skill covers provider and artifact selection, token/time/cost limits, host-controlled
77
+ tools, sessions, typed output, media and diagnostics. The canonical
78
+ [integration and operations guide](docs/agent-usage.md) contains the same supported workflows;
79
+ source contributors should also read [Contributing](CONTRIBUTING.md).
80
+
67
81
  ## Why AbstractCore
68
82
 
69
83
  Many libraries can call an LLM. AbstractCore is for the messy middle of real
@@ -271,7 +285,7 @@ You can also persist settings (including API keys) via the config CLI:
271
285
  - Embeddings and semantic search → [Embeddings](docs/embeddings.md)
272
286
  - 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
287
  - 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)
288
+ - 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
289
  - OpenAI-compatible server: one `/v1` gateway for chat + optional `/v1/images/*` and `/v1/audio/*` endpoints → [Server](docs/server.md)
276
290
 
277
291
  ## Tool calling (passthrough by default)
@@ -328,7 +342,7 @@ Notes:
328
342
  - **Images**: use a vision-capable model, or configure **vision fallback** for text-only models (`abstractcore --config`; `abstractcore --set-vision-provider PROVIDER MODEL`).
329
343
  - **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
344
  - **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.
345
+ `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
346
 
333
347
  Configure defaults (optional):
334
348
 
@@ -461,11 +475,30 @@ stt_models = llm.voice.list_stt_models()
461
475
  music_models = llm.capabilities.list_models("music", task="text_to_music")
462
476
  ```
463
477
 
478
+ Voices are navigable by engine and by language, and you can create your own:
479
+
480
+ ```python
481
+ french = llm.voice.list_voices(language="fr") # native French voices first
482
+ piper = llm.voice.list_voices(provider="piper") # one engine's voices
483
+ languages = llm.voice.list_languages(kind="tts") # languages per engine, no model loaded
484
+ # Each record: voice_id (pass as voice=), name, kind (profile|clone), provider, model, languages, language
485
+
486
+ mira = llm.voice.design_voice("A calm, warm female voice in her thirties.", name="Mira")
487
+ wav = llm.voice.tts("Good morning.", voice=mira["voice_id"], one_shot=True)
488
+ llm.voice.rename_cloned_voice(mira["voice_id"], "Mira (narrator)")
489
+ llm.voice.delete_cloned_voice(mira["voice_id"])
490
+ ```
491
+
492
+ `one_shot=True` synthesizes the whole text as one generation, so the take keeps one
493
+ voice from start to end (Qwen3-TTS voices, up to 1000 characters).
494
+
464
495
  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`.
496
+ `/v1/vision/providers/`, `/v1/vision/models`, `/v1/audio/voices` (with `language`),
497
+ `/v1/audio/languages`, `/v1/audio/speech/models`, `/v1/audio/transcriptions/models`,
498
+ `/v1/voice/clone/providers` and `/v1/voice/clones`, plus `/v1/audio/music/providers`
499
+ and `/v1/audio/music/models`. Voices are created and managed with
500
+ `POST /v1/voice/clone`, `POST /v1/voice/design` and
501
+ `GET|PATCH|DELETE /v1/voice/clones/{voice_id}`; see [Server](docs/server.md).
469
502
  Generated media HTTP routes include `/v1/images/generations`,
470
503
  `/v1/images/edits`, `/v1/videos/generations`, `/v1/videos/edits`, and
471
504
  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",