abstractcore 2.9.1__tar.gz → 2.11.2__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 (187) hide show
  1. abstractcore-2.11.2/PKG-INFO +562 -0
  2. abstractcore-2.11.2/README.md +284 -0
  3. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/__init__.py +7 -27
  4. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/apps/extractor.py +33 -100
  5. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/apps/intent.py +19 -0
  6. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/apps/judge.py +20 -1
  7. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/apps/summarizer.py +20 -1
  8. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/architectures/detection.py +34 -1
  9. abstractcore-2.11.2/abstractcore/architectures/response_postprocessing.py +313 -0
  10. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/assets/architecture_formats.json +38 -8
  11. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/assets/model_capabilities.json +781 -160
  12. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/__init__.py +1 -2
  13. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/glyph_processor.py +6 -4
  14. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/config/main.py +31 -19
  15. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/config/manager.py +389 -11
  16. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/config/vision_config.py +5 -5
  17. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/core/interface.py +151 -3
  18. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/core/session.py +16 -10
  19. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/download.py +1 -1
  20. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/embeddings/manager.py +20 -6
  21. abstractcore-2.11.2/abstractcore/endpoint/__init__.py +2 -0
  22. abstractcore-2.11.2/abstractcore/endpoint/app.py +458 -0
  23. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/mcp/client.py +3 -1
  24. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/__init__.py +52 -17
  25. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/auto_handler.py +42 -22
  26. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/base.py +44 -1
  27. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/capabilities.py +12 -33
  28. abstractcore-2.11.2/abstractcore/media/enrichment.py +105 -0
  29. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/handlers/anthropic_handler.py +19 -28
  30. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/handlers/local_handler.py +124 -70
  31. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/handlers/openai_handler.py +19 -31
  32. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/processors/__init__.py +4 -2
  33. abstractcore-2.11.2/abstractcore/media/processors/audio_processor.py +57 -0
  34. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/processors/office_processor.py +8 -3
  35. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/processors/pdf_processor.py +46 -3
  36. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/processors/text_processor.py +22 -24
  37. abstractcore-2.11.2/abstractcore/media/processors/video_processor.py +58 -0
  38. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/types.py +97 -4
  39. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/utils/image_scaler.py +20 -2
  40. abstractcore-2.11.2/abstractcore/media/utils/video_frames.py +219 -0
  41. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/vision_fallback.py +136 -22
  42. abstractcore-2.11.2/abstractcore/processing/__init__.py +49 -0
  43. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/processing/basic_deepsearch.py +15 -10
  44. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/processing/basic_intent.py +3 -2
  45. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/processing/basic_judge.py +3 -2
  46. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/processing/basic_summarizer.py +1 -1
  47. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/__init__.py +3 -1
  48. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/anthropic_provider.py +95 -8
  49. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/base.py +1516 -81
  50. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/huggingface_provider.py +546 -69
  51. abstractcore-2.11.2/abstractcore/providers/lmstudio_provider.py +39 -0
  52. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/mlx_provider.py +382 -35
  53. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/model_capabilities.py +5 -1
  54. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/ollama_provider.py +99 -15
  55. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/openai_compatible_provider.py +406 -180
  56. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/openai_provider.py +188 -44
  57. abstractcore-2.11.2/abstractcore/providers/openrouter_provider.py +76 -0
  58. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/registry.py +61 -5
  59. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/providers/streaming.py +138 -33
  60. abstractcore-2.11.2/abstractcore/providers/vllm_provider.py +155 -0
  61. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/server/app.py +461 -13
  62. abstractcore-2.11.2/abstractcore/server/audio_endpoints.py +139 -0
  63. abstractcore-2.11.2/abstractcore/server/vision_endpoints.py +1319 -0
  64. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/structured/handler.py +316 -41
  65. abstractcore-2.11.2/abstractcore/tools/common_tools.py +7463 -0
  66. abstractcore-2.11.2/abstractcore/tools/comms_tools.py +1641 -0
  67. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/core.py +37 -7
  68. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/handler.py +4 -9
  69. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/parser.py +49 -2
  70. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/tag_rewriter.py +2 -1
  71. abstractcore-2.11.2/abstractcore/tools/telegram_tdlib.py +407 -0
  72. abstractcore-2.11.2/abstractcore/tools/telegram_tools.py +261 -0
  73. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/cli.py +1085 -72
  74. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/token_utils.py +2 -0
  75. abstractcore-2.11.2/abstractcore/utils/truncation.py +29 -0
  76. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/version.py +3 -4
  77. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/vlm_token_calculator.py +12 -2
  78. abstractcore-2.11.2/abstractcore.egg-info/PKG-INFO +562 -0
  79. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore.egg-info/SOURCES.txt +27 -0
  80. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore.egg-info/entry_points.txt +1 -0
  81. abstractcore-2.11.2/abstractcore.egg-info/requires.txt +303 -0
  82. {abstractcore-2.9.1 → abstractcore-2.11.2}/pyproject.toml +233 -68
  83. abstractcore-2.11.2/tests/test_abstractendpoint_singleton_provider.py +69 -0
  84. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_agentic_cli_compatibility.py +44 -6
  85. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_basic_session.py +13 -3
  86. abstractcore-2.11.2/tests/test_capabilities_registry.py +145 -0
  87. abstractcore-2.11.2/tests/test_capabilities_registry_preferred_backends_from_config.py +98 -0
  88. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_comprehensive_events.py +24 -8
  89. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_core_components.py +22 -5
  90. abstractcore-2.11.2/tests/test_email_digests.py +40 -0
  91. abstractcore-2.11.2/tests/test_embedding_model_token_warnings.py +31 -0
  92. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_environment_variable_tool_call_tags.py +13 -19
  93. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_factory.py +2 -2
  94. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_final_comprehensive.py +2 -2
  95. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_final_graceful_errors.py +15 -6
  96. abstractcore-2.11.2/tests/test_generate_with_outputs.py +98 -0
  97. abstractcore-2.11.2/tests/test_graceful_fallback.py +134 -0
  98. abstractcore-2.11.2/tests/test_import_safety.py +47 -0
  99. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_integrated_functionality.py +25 -12
  100. abstractcore-2.11.2/tests/test_openai_prompt_cache_key_passthrough.py +77 -0
  101. abstractcore-2.11.2/tests/test_prompt_cache_api.py +73 -0
  102. abstractcore-2.11.2/tests/test_prompt_cache_control_plane.py +182 -0
  103. abstractcore-2.11.2/tests/test_retry_observability.py +90 -0
  104. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_retry_strategy.py +31 -1
  105. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_seed_determinism.py +25 -12
  106. abstractcore-2.11.2/tests/test_seed_temperature_basic.py +188 -0
  107. abstractcore-2.11.2/tests/test_server_prompt_cache_control_plane_proxy.py +22 -0
  108. abstractcore-2.11.2/tests/test_server_prompt_cache_key_passthrough.py +54 -0
  109. abstractcore-2.11.2/tests/test_structured_output_truncation_retry.py +49 -0
  110. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_unload_memory.py +26 -18
  111. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_user_scenario_validation.py +13 -4
  112. abstractcore-2.9.1/PKG-INFO +0 -1190
  113. abstractcore-2.9.1/README.md +0 -1052
  114. abstractcore-2.9.1/abstractcore/processing/__init__.py +0 -20
  115. abstractcore-2.9.1/abstractcore/providers/lmstudio_provider.py +0 -927
  116. abstractcore-2.9.1/abstractcore/providers/vllm_provider.py +0 -880
  117. abstractcore-2.9.1/abstractcore/tools/common_tools.py +0 -3974
  118. abstractcore-2.9.1/abstractcore.egg-info/PKG-INFO +0 -1190
  119. abstractcore-2.9.1/abstractcore.egg-info/requires.txt +0 -150
  120. abstractcore-2.9.1/tests/test_graceful_fallback.py +0 -89
  121. abstractcore-2.9.1/tests/test_retry_observability.py +0 -208
  122. abstractcore-2.9.1/tests/test_seed_temperature_basic.py +0 -217
  123. {abstractcore-2.9.1 → abstractcore-2.11.2}/LICENSE +0 -0
  124. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/apps/__init__.py +0 -0
  125. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/apps/__main__.py +0 -0
  126. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/apps/app_config_utils.py +0 -0
  127. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/apps/deepsearch.py +0 -0
  128. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/architectures/__init__.py +0 -0
  129. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/architectures/enums.py +0 -0
  130. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/assets/session_schema.json +0 -0
  131. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/analytics.py +0 -0
  132. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/cache.py +0 -0
  133. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/config.py +0 -0
  134. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/exceptions.py +0 -0
  135. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/optimizer.py +0 -0
  136. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/orchestrator.py +0 -0
  137. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/pil_text_renderer.py +0 -0
  138. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/quality.py +0 -0
  139. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/text_formatter.py +0 -0
  140. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/compression/vision_compressor.py +0 -0
  141. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/config/__init__.py +0 -0
  142. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/core/__init__.py +0 -0
  143. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/core/enums.py +0 -0
  144. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/core/factory.py +0 -0
  145. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/core/retry.py +0 -0
  146. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/core/types.py +0 -0
  147. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/embeddings/__init__.py +0 -0
  148. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/embeddings/models.py +0 -0
  149. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/events/__init__.py +0 -0
  150. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/exceptions/__init__.py +0 -0
  151. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/mcp/__init__.py +0 -0
  152. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/mcp/factory.py +0 -0
  153. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/mcp/naming.py +0 -0
  154. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/mcp/stdio_client.py +0 -0
  155. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/mcp/tool_source.py +0 -0
  156. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/handlers/__init__.py +0 -0
  157. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/processors/direct_pdf_processor.py +0 -0
  158. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/processors/glyph_pdf_processor.py +0 -0
  159. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/processors/image_processor.py +0 -0
  160. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/media/utils/__init__.py +0 -0
  161. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/processing/basic_extractor.py +0 -0
  162. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/server/__init__.py +0 -0
  163. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/structured/__init__.py +0 -0
  164. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/structured/retry.py +0 -0
  165. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/__init__.py +0 -0
  166. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/abstractignore.py +0 -0
  167. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/arg_canonicalizer.py +0 -0
  168. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/registry.py +0 -0
  169. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/tools/syntax_rewriter.py +0 -0
  170. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/__init__.py +0 -0
  171. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/jsonish.py +0 -0
  172. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/message_preprocessor.py +0 -0
  173. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/self_fixes.py +0 -0
  174. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/structured_logging.py +0 -0
  175. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore/utils/trace_export.py +0 -0
  176. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore.egg-info/dependency_links.txt +0 -0
  177. {abstractcore-2.9.1 → abstractcore-2.11.2}/abstractcore.egg-info/top_level.txt +0 -0
  178. {abstractcore-2.9.1 → abstractcore-2.11.2}/setup.cfg +0 -0
  179. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_complete_integration.py +0 -0
  180. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_enhanced_prompt.py +0 -0
  181. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_final_accuracy.py +0 -0
  182. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_import_debug.py +0 -0
  183. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_mcp_integration.py +0 -0
  184. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_mcp_stdio_client.py +0 -0
  185. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_packaging_extras.py +0 -0
  186. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_sensory_prompting.py +0 -0
  187. {abstractcore-2.9.1 → abstractcore-2.11.2}/tests/test_text_only_model_experience.py +0 -0
@@ -0,0 +1,562 @@
1
+ Metadata-Version: 2.4
2
+ Name: abstractcore
3
+ Version: 2.11.2
4
+ Summary: Unified interface to all LLM providers with essential infrastructure for tool calling, streaming, and model management
5
+ Author-email: Laurent-Philippe Albou <contact@abstractcore.ai>
6
+ Maintainer-email: Laurent-Philippe Albou <contact@abstractcore.ai>
7
+ License: MIT
8
+ Project-URL: Homepage, https://lpalbou.github.io/AbstractCore
9
+ Project-URL: Documentation, https://github.com/lpalbou/AbstractCore#readme
10
+ Project-URL: Repository, https://github.com/lpalbou/AbstractCore
11
+ Project-URL: Bug Tracker, https://github.com/lpalbou/AbstractCore/issues
12
+ Project-URL: Changelog, https://github.com/lpalbou/AbstractCore/blob/main/CHANGELOG.md
13
+ Keywords: llm,openai,anthropic,ollama,lmstudio,huggingface,mlx,ai,machine-learning,natural-language-processing,tool-calling,streaming
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
25
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
26
+ Requires-Python: >=3.9
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ Requires-Dist: pydantic<3.0.0,>=2.0.0
30
+ Requires-Dist: httpx<1.0.0,>=0.24.0
31
+ Provides-Extra: openai
32
+ Requires-Dist: openai<2.0.0,>=1.0.0; extra == "openai"
33
+ Provides-Extra: anthropic
34
+ Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "anthropic"
35
+ Provides-Extra: ollama
36
+ Provides-Extra: lmstudio
37
+ Provides-Extra: huggingface
38
+ Requires-Dist: transformers<6.0.0,>=4.57.1; extra == "huggingface"
39
+ Requires-Dist: torch<3.0.0,>=2.6.0; extra == "huggingface"
40
+ Requires-Dist: torchvision>=0.17.0; extra == "huggingface"
41
+ Requires-Dist: torchaudio>=2.1.0; extra == "huggingface"
42
+ Requires-Dist: llama-cpp-python<1.0.0,>=0.2.0; extra == "huggingface"
43
+ Requires-Dist: outlines>=0.1.0; extra == "huggingface"
44
+ Provides-Extra: mlx
45
+ Requires-Dist: mlx<1.0.0,>=0.30.0; extra == "mlx"
46
+ Requires-Dist: mlx-lm<1.0.0,>=0.30.0; extra == "mlx"
47
+ Requires-Dist: outlines>=0.1.0; extra == "mlx"
48
+ Provides-Extra: mlx-bench
49
+ Requires-Dist: matplotlib<4.0.0,>=3.8.0; extra == "mlx-bench"
50
+ Provides-Extra: vllm
51
+ Requires-Dist: vllm<1.0.0,>=0.6.0; extra == "vllm"
52
+ Provides-Extra: embeddings
53
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "embeddings"
54
+ Requires-Dist: numpy<2.0.0,>=1.20.0; extra == "embeddings"
55
+ Provides-Extra: tokens
56
+ Requires-Dist: tiktoken<1.0.0,>=0.5.0; extra == "tokens"
57
+ Provides-Extra: tools
58
+ Requires-Dist: requests<3.0.0,>=2.25.0; extra == "tools"
59
+ Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "tools"
60
+ Requires-Dist: lxml<6.0.0,>=4.9.0; extra == "tools"
61
+ Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10" and extra == "tools"
62
+ Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10" and extra == "tools"
63
+ Requires-Dist: psutil<6.0.0,>=5.9.0; extra == "tools"
64
+ Provides-Extra: tool
65
+ Requires-Dist: requests<3.0.0,>=2.25.0; extra == "tool"
66
+ Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "tool"
67
+ Requires-Dist: lxml<6.0.0,>=4.9.0; extra == "tool"
68
+ Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10" and extra == "tool"
69
+ Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10" and extra == "tool"
70
+ Requires-Dist: psutil<6.0.0,>=5.9.0; extra == "tool"
71
+ Provides-Extra: media
72
+ Requires-Dist: Pillow<12.0.0,>=10.0.0; extra == "media"
73
+ Requires-Dist: pymupdf4llm<1.0.0,>=0.0.20; extra == "media"
74
+ Requires-Dist: pymupdf-layout<2.0.0,>=1.26.6; extra == "media"
75
+ Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0; extra == "media"
76
+ Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "media"
77
+ Provides-Extra: compression
78
+ Requires-Dist: Pillow<12.0.0,>=10.0.0; extra == "compression"
79
+ Provides-Extra: all
80
+ Requires-Dist: openai<2.0.0,>=1.0.0; extra == "all"
81
+ Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "all"
82
+ Requires-Dist: transformers<6.0.0,>=4.57.1; extra == "all"
83
+ Requires-Dist: torch<3.0.0,>=2.6.0; extra == "all"
84
+ Requires-Dist: torchvision>=0.17.0; extra == "all"
85
+ Requires-Dist: torchaudio>=2.1.0; extra == "all"
86
+ Requires-Dist: llama-cpp-python<1.0.0,>=0.2.0; extra == "all"
87
+ Requires-Dist: outlines>=0.1.0; extra == "all"
88
+ Requires-Dist: mlx<1.0.0,>=0.30.0; extra == "all"
89
+ Requires-Dist: mlx-lm<1.0.0,>=0.30.0; extra == "all"
90
+ Requires-Dist: vllm<1.0.0,>=0.6.0; extra == "all"
91
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "all"
92
+ Requires-Dist: numpy<2.0.0,>=1.20.0; extra == "all"
93
+ Requires-Dist: tiktoken<1.0.0,>=0.5.0; extra == "all"
94
+ Requires-Dist: requests<3.0.0,>=2.25.0; extra == "all"
95
+ Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "all"
96
+ Requires-Dist: lxml<6.0.0,>=4.9.0; extra == "all"
97
+ Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10" and extra == "all"
98
+ Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10" and extra == "all"
99
+ Requires-Dist: psutil<6.0.0,>=5.9.0; extra == "all"
100
+ Requires-Dist: Pillow<12.0.0,>=10.0.0; extra == "all"
101
+ Requires-Dist: pymupdf4llm<1.0.0,>=0.0.20; extra == "all"
102
+ Requires-Dist: pymupdf-layout<2.0.0,>=1.26.6; extra == "all"
103
+ Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0; extra == "all"
104
+ Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "all"
105
+ Requires-Dist: fastapi<1.0.0,>=0.100.0; extra == "all"
106
+ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0; extra == "all"
107
+ Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "all"
108
+ Requires-Dist: sse-starlette<2.0.0,>=1.6.0; extra == "all"
109
+ Requires-Dist: abstractvision>=0.2.0; extra == "all"
110
+ Provides-Extra: all-apple
111
+ Requires-Dist: openai<2.0.0,>=1.0.0; extra == "all-apple"
112
+ Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "all-apple"
113
+ Requires-Dist: transformers<6.0.0,>=4.57.1; extra == "all-apple"
114
+ Requires-Dist: torch<3.0.0,>=2.6.0; extra == "all-apple"
115
+ Requires-Dist: torchvision>=0.17.0; extra == "all-apple"
116
+ Requires-Dist: torchaudio>=2.1.0; extra == "all-apple"
117
+ Requires-Dist: llama-cpp-python<1.0.0,>=0.2.0; extra == "all-apple"
118
+ Requires-Dist: outlines>=0.1.0; extra == "all-apple"
119
+ Requires-Dist: mlx<1.0.0,>=0.30.0; extra == "all-apple"
120
+ Requires-Dist: mlx-lm<1.0.0,>=0.30.0; extra == "all-apple"
121
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "all-apple"
122
+ Requires-Dist: numpy<2.0.0,>=1.20.0; extra == "all-apple"
123
+ Requires-Dist: tiktoken<1.0.0,>=0.5.0; extra == "all-apple"
124
+ Requires-Dist: requests<3.0.0,>=2.25.0; extra == "all-apple"
125
+ Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "all-apple"
126
+ Requires-Dist: lxml<6.0.0,>=4.9.0; extra == "all-apple"
127
+ Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10" and extra == "all-apple"
128
+ Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10" and extra == "all-apple"
129
+ Requires-Dist: psutil<6.0.0,>=5.9.0; extra == "all-apple"
130
+ Requires-Dist: Pillow<12.0.0,>=10.0.0; extra == "all-apple"
131
+ Requires-Dist: pymupdf4llm<1.0.0,>=0.0.20; extra == "all-apple"
132
+ Requires-Dist: pymupdf-layout<2.0.0,>=1.26.6; extra == "all-apple"
133
+ Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0; extra == "all-apple"
134
+ Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "all-apple"
135
+ Requires-Dist: fastapi<1.0.0,>=0.100.0; extra == "all-apple"
136
+ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0; extra == "all-apple"
137
+ Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "all-apple"
138
+ Requires-Dist: sse-starlette<2.0.0,>=1.6.0; extra == "all-apple"
139
+ Requires-Dist: abstractvision>=0.2.0; extra == "all-apple"
140
+ Provides-Extra: all-gpu
141
+ Requires-Dist: openai<2.0.0,>=1.0.0; extra == "all-gpu"
142
+ Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "all-gpu"
143
+ Requires-Dist: transformers<6.0.0,>=4.57.1; extra == "all-gpu"
144
+ Requires-Dist: torch<3.0.0,>=2.6.0; extra == "all-gpu"
145
+ Requires-Dist: torchvision>=0.17.0; extra == "all-gpu"
146
+ Requires-Dist: torchaudio>=2.1.0; extra == "all-gpu"
147
+ Requires-Dist: llama-cpp-python<1.0.0,>=0.2.0; extra == "all-gpu"
148
+ Requires-Dist: outlines>=0.1.0; extra == "all-gpu"
149
+ Requires-Dist: vllm<1.0.0,>=0.6.0; extra == "all-gpu"
150
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "all-gpu"
151
+ Requires-Dist: numpy<2.0.0,>=1.20.0; extra == "all-gpu"
152
+ Requires-Dist: tiktoken<1.0.0,>=0.5.0; extra == "all-gpu"
153
+ Requires-Dist: requests<3.0.0,>=2.25.0; extra == "all-gpu"
154
+ Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "all-gpu"
155
+ Requires-Dist: lxml<6.0.0,>=4.9.0; extra == "all-gpu"
156
+ Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10" and extra == "all-gpu"
157
+ Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10" and extra == "all-gpu"
158
+ Requires-Dist: psutil<6.0.0,>=5.9.0; extra == "all-gpu"
159
+ Requires-Dist: Pillow<12.0.0,>=10.0.0; extra == "all-gpu"
160
+ Requires-Dist: pymupdf4llm<1.0.0,>=0.0.20; extra == "all-gpu"
161
+ Requires-Dist: pymupdf-layout<2.0.0,>=1.26.6; extra == "all-gpu"
162
+ Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0; extra == "all-gpu"
163
+ Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "all-gpu"
164
+ Requires-Dist: fastapi<1.0.0,>=0.100.0; extra == "all-gpu"
165
+ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0; extra == "all-gpu"
166
+ Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "all-gpu"
167
+ Requires-Dist: sse-starlette<2.0.0,>=1.6.0; extra == "all-gpu"
168
+ Requires-Dist: abstractvision>=0.2.0; extra == "all-gpu"
169
+ Provides-Extra: all-non-mlx
170
+ Requires-Dist: openai<2.0.0,>=1.0.0; extra == "all-non-mlx"
171
+ Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "all-non-mlx"
172
+ Requires-Dist: transformers<6.0.0,>=4.57.1; extra == "all-non-mlx"
173
+ Requires-Dist: torch<3.0.0,>=2.6.0; extra == "all-non-mlx"
174
+ Requires-Dist: torchvision>=0.17.0; extra == "all-non-mlx"
175
+ Requires-Dist: torchaudio>=2.1.0; extra == "all-non-mlx"
176
+ Requires-Dist: llama-cpp-python<1.0.0,>=0.2.0; extra == "all-non-mlx"
177
+ Requires-Dist: outlines>=0.1.0; extra == "all-non-mlx"
178
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "all-non-mlx"
179
+ Requires-Dist: numpy<2.0.0,>=1.20.0; extra == "all-non-mlx"
180
+ Requires-Dist: tiktoken<1.0.0,>=0.5.0; extra == "all-non-mlx"
181
+ Requires-Dist: requests<3.0.0,>=2.25.0; extra == "all-non-mlx"
182
+ Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "all-non-mlx"
183
+ Requires-Dist: lxml<6.0.0,>=4.9.0; extra == "all-non-mlx"
184
+ Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10" and extra == "all-non-mlx"
185
+ Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10" and extra == "all-non-mlx"
186
+ Requires-Dist: psutil<6.0.0,>=5.9.0; extra == "all-non-mlx"
187
+ Requires-Dist: Pillow<12.0.0,>=10.0.0; extra == "all-non-mlx"
188
+ Requires-Dist: pymupdf4llm<1.0.0,>=0.0.20; extra == "all-non-mlx"
189
+ Requires-Dist: pymupdf-layout<2.0.0,>=1.26.6; extra == "all-non-mlx"
190
+ Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0; extra == "all-non-mlx"
191
+ Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "all-non-mlx"
192
+ Requires-Dist: fastapi<1.0.0,>=0.100.0; extra == "all-non-mlx"
193
+ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0; extra == "all-non-mlx"
194
+ Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "all-non-mlx"
195
+ Requires-Dist: sse-starlette<2.0.0,>=1.6.0; extra == "all-non-mlx"
196
+ Requires-Dist: abstractvision>=0.2.0; extra == "all-non-mlx"
197
+ Provides-Extra: dev
198
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
199
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
200
+ Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
201
+ Requires-Dist: black>=23.0.0; extra == "dev"
202
+ Requires-Dist: isort>=5.12.0; extra == "dev"
203
+ Requires-Dist: mypy>=1.5.0; extra == "dev"
204
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
205
+ Requires-Dist: pre-commit>=3.0.0; extra == "dev"
206
+ Provides-Extra: server
207
+ Requires-Dist: fastapi<1.0.0,>=0.100.0; extra == "server"
208
+ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0; extra == "server"
209
+ Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "server"
210
+ Requires-Dist: sse-starlette<2.0.0,>=1.6.0; extra == "server"
211
+ Requires-Dist: abstractvision>=0.2.0; extra == "server"
212
+ Provides-Extra: vision
213
+ Requires-Dist: abstractvision>=0.2.0; extra == "vision"
214
+ Provides-Extra: vision-diffusers
215
+ Requires-Dist: abstractvision[huggingface]>=0.2.0; extra == "vision-diffusers"
216
+ Provides-Extra: vision-sdcpp
217
+ Requires-Dist: abstractvision[sdcpp]>=0.2.0; extra == "vision-sdcpp"
218
+ Provides-Extra: vision-local
219
+ Requires-Dist: abstractvision[local]>=0.2.0; extra == "vision-local"
220
+ Provides-Extra: test
221
+ Requires-Dist: pytest>=7.0.0; extra == "test"
222
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
223
+ Requires-Dist: pytest-mock>=3.10.0; extra == "test"
224
+ Requires-Dist: pytest-cov>=4.0.0; extra == "test"
225
+ Requires-Dist: responses>=0.23.0; extra == "test"
226
+ Requires-Dist: httpx>=0.24.0; extra == "test"
227
+ Provides-Extra: docs
228
+ Requires-Dist: mkdocs>=1.5.0; extra == "docs"
229
+ Requires-Dist: mkdocs-material>=9.0.0; extra == "docs"
230
+ Requires-Dist: mkdocstrings[python]>=0.22.0; extra == "docs"
231
+ Requires-Dist: mkdocs-autorefs>=0.4.0; extra == "docs"
232
+ Provides-Extra: full-dev
233
+ Requires-Dist: openai<2.0.0,>=1.0.0; extra == "full-dev"
234
+ Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "full-dev"
235
+ Requires-Dist: transformers<6.0.0,>=4.57.1; extra == "full-dev"
236
+ Requires-Dist: torch<3.0.0,>=2.6.0; extra == "full-dev"
237
+ Requires-Dist: torchvision>=0.17.0; extra == "full-dev"
238
+ Requires-Dist: torchaudio>=2.1.0; extra == "full-dev"
239
+ Requires-Dist: llama-cpp-python<1.0.0,>=0.2.0; extra == "full-dev"
240
+ Requires-Dist: outlines>=0.1.0; extra == "full-dev"
241
+ Requires-Dist: mlx<1.0.0,>=0.30.0; extra == "full-dev"
242
+ Requires-Dist: mlx-lm<1.0.0,>=0.30.0; extra == "full-dev"
243
+ Requires-Dist: vllm<1.0.0,>=0.6.0; extra == "full-dev"
244
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "full-dev"
245
+ Requires-Dist: numpy<2.0.0,>=1.20.0; extra == "full-dev"
246
+ Requires-Dist: tiktoken<1.0.0,>=0.5.0; extra == "full-dev"
247
+ Requires-Dist: requests<3.0.0,>=2.25.0; extra == "full-dev"
248
+ Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0; extra == "full-dev"
249
+ Requires-Dist: lxml<6.0.0,>=4.9.0; extra == "full-dev"
250
+ Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10" and extra == "full-dev"
251
+ Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10" and extra == "full-dev"
252
+ Requires-Dist: psutil<6.0.0,>=5.9.0; extra == "full-dev"
253
+ Requires-Dist: Pillow<12.0.0,>=10.0.0; extra == "full-dev"
254
+ Requires-Dist: pymupdf4llm<1.0.0,>=0.0.20; extra == "full-dev"
255
+ Requires-Dist: pymupdf-layout<2.0.0,>=1.26.6; extra == "full-dev"
256
+ Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0; extra == "full-dev"
257
+ Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "full-dev"
258
+ Requires-Dist: fastapi<1.0.0,>=0.100.0; extra == "full-dev"
259
+ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0; extra == "full-dev"
260
+ Requires-Dist: python-multipart<1.0.0,>=0.0.6; extra == "full-dev"
261
+ Requires-Dist: sse-starlette<2.0.0,>=1.6.0; extra == "full-dev"
262
+ Requires-Dist: abstractvision>=0.2.0; extra == "full-dev"
263
+ Requires-Dist: pytest>=7.0.0; extra == "full-dev"
264
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "full-dev"
265
+ Requires-Dist: pytest-mock>=3.10.0; extra == "full-dev"
266
+ Requires-Dist: pytest-cov>=4.0.0; extra == "full-dev"
267
+ Requires-Dist: responses>=0.23.0; extra == "full-dev"
268
+ Requires-Dist: black>=23.0.0; extra == "full-dev"
269
+ Requires-Dist: isort>=5.12.0; extra == "full-dev"
270
+ Requires-Dist: mypy>=1.5.0; extra == "full-dev"
271
+ Requires-Dist: ruff>=0.1.0; extra == "full-dev"
272
+ Requires-Dist: pre-commit>=3.0.0; extra == "full-dev"
273
+ Requires-Dist: mkdocs>=1.5.0; extra == "full-dev"
274
+ Requires-Dist: mkdocs-material>=9.0.0; extra == "full-dev"
275
+ Requires-Dist: mkdocstrings[python]>=0.22.0; extra == "full-dev"
276
+ Requires-Dist: mkdocs-autorefs>=0.4.0; extra == "full-dev"
277
+ Dynamic: license-file
278
+
279
+ # AbstractCore
280
+
281
+ [![PyPI version](https://img.shields.io/pypi/v/abstractcore.svg)](https://pypi.org/project/abstractcore/)
282
+ [![Python Version](https://img.shields.io/pypi/pyversions/abstractcore)](https://pypi.org/project/abstractcore/)
283
+ [![license](https://img.shields.io/github/license/lpalbou/AbstractCore)](https://github.com/lpalbou/AbstractCore/blob/main/LICENSE)
284
+ [![GitHub stars](https://img.shields.io/github/stars/lpalbou/AbstractCore?style=social)](https://github.com/lpalbou/AbstractCore/stargazers)
285
+
286
+ Unified LLM Interface
287
+ > Write once, run everywhere
288
+
289
+ AbstractCore is a Python library that provides a unified `create_llm(...)` API across cloud + local LLM providers (OpenAI, Anthropic, Ollama, LMStudio, and more). The default install is intentionally lightweight; add providers and optional subsystems via explicit install extras.
290
+
291
+ First-class support for:
292
+ - sync + async
293
+ - streaming + non-streaming
294
+ - universal tool calling (native + prompted tool syntax)
295
+ - structured output (Pydantic)
296
+ - media input (images/audio/video + documents) with explicit, policy-driven fallbacks (*)
297
+ - optional capability plugins (`core.voice/core.audio/core.vision`) for deterministic TTS/STT and generative vision (via `abstractvoice` / `abstractvision`)
298
+ - glyph visual-text compression for long documents (**)
299
+ - unified openai-compatible endpoint for all providers and models
300
+
301
+ (*) Media input is policy-driven (no silent semantic changes). If a model doesn’t support images, AbstractCore can use a configured vision model to generate short visual observations and inject them into your text-only request (vision fallback). Audio/video attachments are also policy-driven (`audio_policy`, `video_policy`) and may require capability plugins for fallbacks. See [Media Handling](docs/media-handling-system.md) and [Centralized Config](docs/centralized-config.md).
302
+ (**) Optional visual-text compression: render long text/PDFs into images and process them with a vision model to reduce token usage. See [Glyph Visual-Text Compression](docs/glyphs.md) (install `pip install "abstractcore[compression]"`; for PDFs also install `pip install "abstractcore[media]"`).
303
+
304
+ Docs: [Getting Started](docs/getting-started.md) · [FAQ](docs/faq.md) · [Docs Index](docs/README.md) · https://lpalbou.github.io/AbstractCore
305
+
306
+ ## Install
307
+
308
+ ```bash
309
+ # Core (small, lightweight default)
310
+ pip install abstractcore
311
+
312
+ # Providers
313
+ pip install "abstractcore[openai]" # OpenAI SDK
314
+ pip install "abstractcore[anthropic]" # Anthropic SDK
315
+ pip install "abstractcore[huggingface]" # Transformers / torch (heavy)
316
+ pip install "abstractcore[mlx]" # Apple Silicon local inference (heavy)
317
+ pip install "abstractcore[vllm]" # NVIDIA CUDA / ROCm (heavy)
318
+
319
+ # Optional features
320
+ pip install "abstractcore[tools]" # built-in web tools (web_search, skim_websearch, skim_url, fetch_url)
321
+ pip install "abstractcore[media]" # images, PDFs, Office docs
322
+ pip install "abstractcore[compression]" # glyph visual-text compression (Pillow-only)
323
+ pip install "abstractcore[embeddings]" # EmbeddingManager + local embedding models
324
+ pip install "abstractcore[tokens]" # precise token counting (tiktoken)
325
+ pip install "abstractcore[server]" # OpenAI-compatible HTTP gateway
326
+
327
+ # Combine extras (zsh: keep quotes)
328
+ pip install "abstractcore[openai,media,tools]"
329
+
330
+ # Turnkey "everything" installs (pick one)
331
+ pip install "abstractcore[all-apple]" # macOS/Apple Silicon (includes MLX, excludes vLLM)
332
+ pip install "abstractcore[all-non-mlx]" # Linux/Windows/Intel Mac (excludes MLX and vLLM)
333
+ pip install "abstractcore[all-gpu]" # Linux NVIDIA GPU (includes vLLM, excludes MLX)
334
+ ```
335
+
336
+ ## Quickstart
337
+
338
+ OpenAI example (requires `pip install "abstractcore[openai]"`):
339
+
340
+ ```python
341
+ from abstractcore import create_llm
342
+
343
+ llm = create_llm("openai", model="gpt-4o-mini")
344
+ response = llm.generate("What is the capital of France?")
345
+ print(response.content)
346
+ ```
347
+
348
+ ### Conversation state (`BasicSession`)
349
+
350
+ ```python
351
+ from abstractcore import create_llm, BasicSession
352
+
353
+ session = BasicSession(create_llm("anthropic", model="claude-haiku-4-5"))
354
+ print(session.generate("Give me 3 bakery name ideas.").content)
355
+ print(session.generate("Pick the best one and explain why.").content)
356
+ ```
357
+
358
+ ### Streaming
359
+
360
+ ```python
361
+ from abstractcore import create_llm
362
+
363
+ llm = create_llm("ollama", model="qwen3:4b-instruct")
364
+ for chunk in llm.generate("Write a short poem about distributed systems.", stream=True):
365
+ print(chunk.content or "", end="", flush=True)
366
+ ```
367
+
368
+ ### Async
369
+
370
+ ```python
371
+ import asyncio
372
+ from abstractcore import create_llm
373
+
374
+ async def main():
375
+ llm = create_llm("openai", model="gpt-4o-mini")
376
+ resp = await llm.agenerate("Give me 5 bullet points about HTTP caching.")
377
+ print(resp.content)
378
+
379
+ asyncio.run(main())
380
+ ```
381
+
382
+ ## Token budgets (unified)
383
+
384
+ ```python
385
+ from abstractcore import create_llm
386
+
387
+ llm = create_llm(
388
+ "openai",
389
+ model="gpt-4o-mini",
390
+ max_tokens=8000, # total budget (input + output)
391
+ max_output_tokens=1200, # output cap
392
+ )
393
+ ```
394
+
395
+ ## Providers (common)
396
+
397
+ - `openai`: `OPENAI_API_KEY`, optional `OPENAI_BASE_URL`
398
+ - `anthropic`: `ANTHROPIC_API_KEY`, optional `ANTHROPIC_BASE_URL`
399
+ - `openrouter`: `OPENROUTER_API_KEY`, optional `OPENROUTER_BASE_URL` (default: `https://openrouter.ai/api/v1`)
400
+ - `ollama`: local server at `OLLAMA_BASE_URL` (or legacy `OLLAMA_HOST`)
401
+ - `lmstudio`: OpenAI-compatible local server at `LMSTUDIO_BASE_URL` (default: `http://localhost:1234/v1`)
402
+ - `vllm`: OpenAI-compatible server at `VLLM_BASE_URL` (default: `http://localhost:8000/v1`)
403
+ - `openai-compatible`: generic OpenAI-compatible endpoints via `OPENAI_COMPATIBLE_BASE_URL` (default: `http://localhost:1234/v1`)
404
+
405
+ You can also persist settings (including API keys) via the config CLI:
406
+ - `abstractcore --status`
407
+ - `abstractcore --configure`
408
+ - `abstractcore --set-api-key openai sk-...`
409
+
410
+ ## What’s inside (quick tour)
411
+
412
+ - Tools: universal tool calling across providers → [Tool Calling](docs/tool-calling.md)
413
+ - Built-in tools (optional): web + filesystem helpers (`skim_websearch`, `skim_url`, `fetch_url`, `read_file`, …) → [Tool Calling](docs/tool-calling.md)
414
+ - Tool syntax rewriting: `tool_call_tags` (Python) and `agent_format` (server) → [Tool Syntax Rewriting](docs/tool-syntax-rewriting.md)
415
+ - Structured output: Pydantic-first with provider-aware strategies → [Structured Output](docs/structured-output.md)
416
+ - Media input: images/audio/video + documents (policies + fallbacks) → [Media Handling](docs/media-handling-system.md) and [Vision Capabilities](docs/vision-capabilities.md)
417
+ - Capability plugins (optional): deterministic `llm.voice/llm.audio/llm.vision` surfaces → [Capabilities](docs/capabilities.md)
418
+ - Glyph visual-text compression: scale long-context document analysis via VLMs → [Glyph Visual-Text Compression](docs/glyphs.md)
419
+ - Embeddings and semantic search → [Embeddings](docs/embeddings.md)
420
+ - Observability: global event bus + interaction traces → [Architecture](docs/architecture.md), [API Reference (Events)](docs/api-reference.md#eventtype), [Interaction Tracing](docs/interaction-tracing.md)
421
+ - MCP (Model Context Protocol): discover tools from MCP servers (HTTP/stdio) → [MCP](docs/mcp.md)
422
+ - OpenAI-compatible server: one `/v1` gateway for chat + optional `/v1/images/*` and `/v1/audio/*` endpoints → [Server](docs/server.md)
423
+
424
+ ## Tool calling (passthrough by default)
425
+
426
+ By default (`execute_tools=False`), AbstractCore:
427
+ - returns clean assistant text in `response.content`
428
+ - returns structured tool calls in `response.tool_calls` (host/runtime executes them)
429
+
430
+ ```python
431
+ from abstractcore import create_llm, tool
432
+
433
+ @tool
434
+ def get_weather(city: str) -> str:
435
+ return f"{city}: 22°C and sunny"
436
+
437
+ llm = create_llm("openai", model="gpt-4o-mini")
438
+ resp = llm.generate("What's the weather in Paris? Use the tool.", tools=[get_weather])
439
+
440
+ print(resp.content)
441
+ print(resp.tool_calls)
442
+ ```
443
+
444
+ If you need tool-call markup preserved/re-written in `content` for downstream parsers, pass
445
+ `tool_call_tags=...` (e.g. `"qwen3"`, `"llama3"`, `"xml"`). See [Tool Syntax Rewriting](docs/tool-syntax-rewriting.md).
446
+
447
+ ## Structured output
448
+
449
+ ```python
450
+ from pydantic import BaseModel
451
+ from abstractcore import create_llm
452
+
453
+ class Answer(BaseModel):
454
+ title: str
455
+ bullets: list[str]
456
+
457
+ llm = create_llm("openai", model="gpt-4o-mini")
458
+ answer = llm.generate("Summarize HTTP/3 in 3 bullets.", response_model=Answer)
459
+ print(answer.bullets)
460
+ ```
461
+
462
+ ## Media / vision input
463
+
464
+ Requires `pip install "abstractcore[media]"`.
465
+
466
+ ```python
467
+ from abstractcore import create_llm
468
+
469
+ llm = create_llm("anthropic", model="claude-haiku-4-5")
470
+ resp = llm.generate("Describe the image.", media=["./image.png"])
471
+ print(resp.content)
472
+ ```
473
+
474
+ Notes:
475
+ - Audio/video attachments are policy-driven (`audio_policy`, `video_policy`) and fail loudly by default unless you configure or request a fallback.
476
+ - Speech-to-text fallback for audio attachments typically requires installing `abstractvoice` (capability plugin).
477
+
478
+ See [Media Handling](docs/media-handling-system.md) and [Vision Capabilities](docs/vision-capabilities.md).
479
+
480
+ ## HTTP server (OpenAI-compatible gateway)
481
+
482
+ ```bash
483
+ pip install "abstractcore[server]"
484
+ python -m abstractcore.server.app
485
+ ```
486
+
487
+ Use any OpenAI-compatible client, and route to any provider/model via `model="provider/model"`:
488
+
489
+ ```python
490
+ from openai import OpenAI
491
+
492
+ client = OpenAI(base_url="http://localhost:8000/v1", api_key="unused")
493
+ resp = client.chat.completions.create(
494
+ model="ollama/qwen3:4b-instruct",
495
+ messages=[{"role": "user", "content": "Hello from the gateway!"}],
496
+ )
497
+ print(resp.choices[0].message.content)
498
+ ```
499
+
500
+ See [Server](docs/server.md).
501
+
502
+ ## CLI (optional)
503
+
504
+ Interactive chat:
505
+
506
+ ```bash
507
+ abstractcore-chat --provider openai --model gpt-4o-mini
508
+ abstractcore-chat --provider lmstudio --model qwen/qwen3-4b-2507 --base-url http://localhost:1234/v1
509
+ abstractcore-chat --provider openrouter --model openai/gpt-4o-mini
510
+ ```
511
+
512
+ Token limits:
513
+ - startup: `abstractcore-chat --max-tokens 8192 --max-output-tokens 1024 ...`
514
+ - in-REPL: `/max-tokens 8192` and `/max-output-tokens 1024`
515
+
516
+ ## Built-in CLI apps
517
+
518
+ AbstractCore also ships with ready-to-use CLI apps:
519
+ - `summarizer`, `extractor`, `judge`, `intent`, `deepsearch` (see [docs/apps/](docs/apps/))
520
+
521
+ ## Documentation map
522
+
523
+ Start here:
524
+ - [Docs Index](docs/README.md) — navigation for all docs
525
+ - [Prerequisites](docs/prerequisites.md) — provider setup (keys, local servers, hardware notes)
526
+ - [Getting Started](docs/getting-started.md) — first call + core concepts
527
+ - [FAQ](docs/faq.md) — common questions and setup gotchas
528
+ - [Examples](docs/examples.md) — end-to-end patterns and recipes
529
+ - [Troubleshooting](docs/troubleshooting.md) — common failures and fixes
530
+
531
+ Core features:
532
+ - [Tool Calling](docs/tool-calling.md) — universal tools across providers (native + prompted)
533
+ - [Tool Syntax Rewriting](docs/tool-syntax-rewriting.md) — rewrite tool-call syntax for different runtimes/clients
534
+ - [Structured Output](docs/structured-output.md) — schema enforcement + retry strategies
535
+ - [Media Handling](docs/media-handling-system.md) — images/audio/video + documents (policies + fallbacks)
536
+ - [Vision Capabilities](docs/vision-capabilities.md) — image/video input, vision fallback, and how this differs from generative vision
537
+ - [Glyph Visual-Text Compression](docs/glyphs.md) — compress long documents into images for VLMs
538
+ - [Generation Parameters](docs/generation-parameters.md) — unified parameter vocabulary and provider quirks
539
+ - [Session Management](docs/session.md) — conversation history, persistence, and compaction
540
+ - [Embeddings](docs/embeddings.md) — embeddings API and RAG building blocks
541
+ - [Async Guide](docs/async-guide.md) — async patterns, concurrency, best practices
542
+ - [Centralized Config](docs/centralized-config.md) — `~/.abstractcore/config/abstractcore.json` + CLI config commands
543
+ - [Capabilities](docs/capabilities.md) — supported features and current limitations
544
+ - [Interaction Tracing](docs/interaction-tracing.md) — inspect prompts/responses/usage for observability
545
+ - [MCP](docs/mcp.md) — consume MCP tool servers (HTTP/stdio) as tool sources
546
+
547
+ Reference and internals:
548
+ - [Architecture](docs/architecture.md) — system overview + event system
549
+ - [API (Python)](docs/api.md) — how to use the public API
550
+ - [API Reference](docs/api-reference.md) — Python API (including events)
551
+ - [Server](docs/server.md) — OpenAI-compatible gateway with tool/media support
552
+ - [CLI Guide](docs/acore-cli.md) — interactive `abstractcore-chat` walkthrough
553
+
554
+ Project:
555
+ - [Changelog](CHANGELOG.md) — version history and upgrade notes
556
+ - [Contributing](CONTRIBUTING.md) — dev setup and contribution guidelines
557
+ - [Security](SECURITY.md) — responsible vulnerability reporting
558
+ - [Acknowledgements](ACKNOWLEDGEMENTS.md) — upstream projects and communities
559
+
560
+ ## License
561
+
562
+ MIT