abstractcore 2.6.3__tar.gz → 2.6.6__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 (137) hide show
  1. {abstractcore-2.6.3 → abstractcore-2.6.6}/PKG-INFO +50 -20
  2. {abstractcore-2.6.3 → abstractcore-2.6.6}/README.md +28 -15
  3. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/utils/image_scaler.py +6 -6
  4. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/__init__.py +4 -0
  5. abstractcore-2.6.6/abstractcore/providers/openai_compatible_provider.py +829 -0
  6. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/registry.py +37 -1
  7. abstractcore-2.6.6/abstractcore/providers/vllm_provider.py +823 -0
  8. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/server/app.py +22 -2
  9. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/version.py +1 -1
  10. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/vlm_token_calculator.py +7 -1
  11. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore.egg-info/PKG-INFO +50 -20
  12. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore.egg-info/SOURCES.txt +2 -0
  13. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore.egg-info/requires.txt +25 -0
  14. {abstractcore-2.6.3 → abstractcore-2.6.6}/pyproject.toml +36 -2
  15. {abstractcore-2.6.3 → abstractcore-2.6.6}/LICENSE +0 -0
  16. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/__init__.py +0 -0
  17. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/apps/__init__.py +0 -0
  18. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/apps/__main__.py +0 -0
  19. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/apps/app_config_utils.py +0 -0
  20. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/apps/deepsearch.py +0 -0
  21. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/apps/extractor.py +0 -0
  22. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/apps/intent.py +0 -0
  23. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/apps/judge.py +0 -0
  24. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/apps/summarizer.py +0 -0
  25. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/architectures/__init__.py +0 -0
  26. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/architectures/detection.py +0 -0
  27. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/architectures/enums.py +0 -0
  28. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/assets/architecture_formats.json +0 -0
  29. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/assets/model_capabilities.json +0 -0
  30. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/assets/session_schema.json +0 -0
  31. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/__init__.py +0 -0
  32. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/analytics.py +0 -0
  33. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/cache.py +0 -0
  34. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/config.py +0 -0
  35. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/exceptions.py +0 -0
  36. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/glyph_processor.py +0 -0
  37. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/optimizer.py +0 -0
  38. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/orchestrator.py +0 -0
  39. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/pil_text_renderer.py +0 -0
  40. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/quality.py +0 -0
  41. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/text_formatter.py +0 -0
  42. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/compression/vision_compressor.py +0 -0
  43. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/config/__init__.py +0 -0
  44. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/config/main.py +0 -0
  45. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/config/manager.py +0 -0
  46. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/config/vision_config.py +0 -0
  47. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/core/__init__.py +0 -0
  48. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/core/enums.py +0 -0
  49. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/core/factory.py +0 -0
  50. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/core/interface.py +0 -0
  51. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/core/retry.py +0 -0
  52. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/core/session.py +0 -0
  53. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/core/types.py +0 -0
  54. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/download.py +0 -0
  55. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/embeddings/__init__.py +0 -0
  56. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/embeddings/manager.py +0 -0
  57. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/embeddings/models.py +0 -0
  58. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/events/__init__.py +0 -0
  59. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/exceptions/__init__.py +0 -0
  60. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/__init__.py +0 -0
  61. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/auto_handler.py +0 -0
  62. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/base.py +0 -0
  63. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/capabilities.py +0 -0
  64. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/handlers/__init__.py +0 -0
  65. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/handlers/anthropic_handler.py +0 -0
  66. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/handlers/local_handler.py +0 -0
  67. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/handlers/openai_handler.py +0 -0
  68. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/processors/__init__.py +0 -0
  69. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/processors/direct_pdf_processor.py +0 -0
  70. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/processors/glyph_pdf_processor.py +0 -0
  71. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/processors/image_processor.py +0 -0
  72. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/processors/office_processor.py +0 -0
  73. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/processors/pdf_processor.py +0 -0
  74. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/processors/text_processor.py +0 -0
  75. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/types.py +0 -0
  76. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/utils/__init__.py +0 -0
  77. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/media/vision_fallback.py +0 -0
  78. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/processing/__init__.py +0 -0
  79. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/processing/basic_deepsearch.py +0 -0
  80. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/processing/basic_extractor.py +0 -0
  81. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/processing/basic_intent.py +0 -0
  82. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/processing/basic_judge.py +0 -0
  83. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/processing/basic_summarizer.py +0 -0
  84. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/anthropic_provider.py +0 -0
  85. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/base.py +0 -0
  86. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/huggingface_provider.py +0 -0
  87. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/lmstudio_provider.py +0 -0
  88. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/mlx_provider.py +0 -0
  89. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/model_capabilities.py +0 -0
  90. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/ollama_provider.py +0 -0
  91. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/openai_provider.py +0 -0
  92. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/providers/streaming.py +0 -0
  93. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/server/__init__.py +0 -0
  94. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/structured/__init__.py +0 -0
  95. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/structured/handler.py +0 -0
  96. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/structured/retry.py +0 -0
  97. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/tools/__init__.py +0 -0
  98. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/tools/common_tools.py +0 -0
  99. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/tools/core.py +0 -0
  100. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/tools/handler.py +0 -0
  101. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/tools/parser.py +0 -0
  102. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/tools/registry.py +0 -0
  103. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/tools/syntax_rewriter.py +0 -0
  104. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/tools/tag_rewriter.py +0 -0
  105. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/__init__.py +0 -0
  106. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/cli.py +0 -0
  107. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/message_preprocessor.py +0 -0
  108. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/self_fixes.py +0 -0
  109. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/structured_logging.py +0 -0
  110. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/token_utils.py +0 -0
  111. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore/utils/trace_export.py +0 -0
  112. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore.egg-info/dependency_links.txt +0 -0
  113. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore.egg-info/entry_points.txt +0 -0
  114. {abstractcore-2.6.3 → abstractcore-2.6.6}/abstractcore.egg-info/top_level.txt +0 -0
  115. {abstractcore-2.6.3 → abstractcore-2.6.6}/setup.cfg +0 -0
  116. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_agentic_cli_compatibility.py +0 -0
  117. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_basic_session.py +0 -0
  118. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_complete_integration.py +0 -0
  119. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_comprehensive_events.py +0 -0
  120. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_core_components.py +0 -0
  121. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_enhanced_prompt.py +0 -0
  122. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_environment_variable_tool_call_tags.py +0 -0
  123. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_factory.py +0 -0
  124. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_final_accuracy.py +0 -0
  125. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_final_comprehensive.py +0 -0
  126. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_final_graceful_errors.py +0 -0
  127. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_graceful_fallback.py +0 -0
  128. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_import_debug.py +0 -0
  129. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_integrated_functionality.py +0 -0
  130. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_retry_observability.py +0 -0
  131. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_retry_strategy.py +0 -0
  132. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_seed_determinism.py +0 -0
  133. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_seed_temperature_basic.py +0 -0
  134. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_sensory_prompting.py +0 -0
  135. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_text_only_model_experience.py +0 -0
  136. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_unload_memory.py +0 -0
  137. {abstractcore-2.6.3 → abstractcore-2.6.6}/tests/test_user_scenario_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstractcore
3
- Version: 2.6.3
3
+ Version: 2.6.6
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>
@@ -47,6 +47,8 @@ Provides-Extra: mlx
47
47
  Requires-Dist: mlx<1.0.0,>=0.15.0; extra == "mlx"
48
48
  Requires-Dist: mlx-lm<1.0.0,>=0.15.0; extra == "mlx"
49
49
  Requires-Dist: outlines>=0.1.0; extra == "mlx"
50
+ Provides-Extra: vllm
51
+ Requires-Dist: vllm<1.0.0,>=0.6.0; extra == "vllm"
50
52
  Provides-Extra: embeddings
51
53
  Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "embeddings"
52
54
  Requires-Dist: numpy<2.0.0,>=1.20.0; extra == "embeddings"
@@ -62,21 +64,36 @@ Requires-Dist: pymupdf4llm<1.0.0,>=0.0.20; extra == "media"
62
64
  Requires-Dist: unstructured[office]<1.0.0,>=0.10.0; extra == "media"
63
65
  Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "media"
64
66
  Provides-Extra: compression
67
+ Requires-Dist: abstractcore[media]; extra == "compression"
65
68
  Requires-Dist: pdf2image<2.0.0,>=1.16.0; extra == "compression"
66
69
  Provides-Extra: api-providers
67
70
  Requires-Dist: abstractcore[anthropic,openai]; extra == "api-providers"
68
71
  Provides-Extra: local-providers
69
72
  Requires-Dist: abstractcore[lmstudio,mlx,ollama]; extra == "local-providers"
70
- Provides-Extra: local-providers-non-mlx
71
- Requires-Dist: abstractcore[lmstudio,ollama]; extra == "local-providers-non-mlx"
73
+ Provides-Extra: local-providers-apple
74
+ Requires-Dist: abstractcore[lmstudio,mlx,ollama]; extra == "local-providers-apple"
75
+ Provides-Extra: local-providers-gpu
76
+ Requires-Dist: abstractcore[lmstudio,ollama,vllm]; extra == "local-providers-gpu"
77
+ Provides-Extra: gpu-providers
78
+ Requires-Dist: abstractcore[huggingface,vllm]; extra == "gpu-providers"
72
79
  Provides-Extra: heavy-providers
73
80
  Requires-Dist: abstractcore[huggingface]; extra == "heavy-providers"
74
81
  Provides-Extra: all-providers
75
- Requires-Dist: abstractcore[anthropic,embeddings,huggingface,lmstudio,mlx,ollama,openai]; extra == "all-providers"
82
+ Requires-Dist: abstractcore[anthropic,embeddings,huggingface,lmstudio,mlx,ollama,openai,vllm]; extra == "all-providers"
83
+ Provides-Extra: all-providers-apple
84
+ Requires-Dist: abstractcore[anthropic,embeddings,huggingface,lmstudio,mlx,ollama,openai]; extra == "all-providers-apple"
85
+ Provides-Extra: all-providers-gpu
86
+ Requires-Dist: abstractcore[anthropic,embeddings,huggingface,lmstudio,ollama,openai,vllm]; extra == "all-providers-gpu"
76
87
  Provides-Extra: all-providers-non-mlx
77
88
  Requires-Dist: abstractcore[anthropic,embeddings,huggingface,lmstudio,ollama,openai]; extra == "all-providers-non-mlx"
89
+ Provides-Extra: local-providers-non-mlx
90
+ Requires-Dist: abstractcore[lmstudio,ollama]; extra == "local-providers-non-mlx"
78
91
  Provides-Extra: all
79
- Requires-Dist: abstractcore[anthropic,compression,dev,docs,embeddings,huggingface,lmstudio,media,mlx,ollama,openai,processing,server,test,tools]; extra == "all"
92
+ Requires-Dist: abstractcore[anthropic,compression,dev,docs,embeddings,huggingface,lmstudio,media,mlx,ollama,openai,processing,server,test,tools,vllm]; extra == "all"
93
+ Provides-Extra: all-apple
94
+ Requires-Dist: abstractcore[anthropic,compression,dev,docs,embeddings,huggingface,lmstudio,media,mlx,ollama,openai,processing,server,test,tools]; extra == "all-apple"
95
+ Provides-Extra: all-gpu
96
+ Requires-Dist: abstractcore[anthropic,compression,dev,docs,embeddings,huggingface,lmstudio,media,ollama,openai,processing,server,test,tools,vllm]; extra == "all-gpu"
80
97
  Provides-Extra: all-non-mlx
81
98
  Requires-Dist: abstractcore[anthropic,compression,dev,docs,embeddings,huggingface,lmstudio,media,ollama,openai,processing,server,test,tools]; extra == "all-non-mlx"
82
99
  Provides-Extra: lightweight
@@ -480,8 +497,9 @@ if response.metadata and response.metadata.get('compression_used'):
480
497
  ## Key Features
481
498
 
482
499
  - **Offline-First Design**: Built primarily for open source LLMs with full offline capability. Download once, run forever without internet access
483
- - **Provider Agnostic**: Seamlessly switch between OpenAI, Anthropic, Ollama, LMStudio, MLX, HuggingFace
484
- - **Async/Await Support** ⭐ NEW in v2.6.0: Native async support for concurrent requests with `asyncio.gather()` - works with all 6 providers
500
+ - **Provider Agnostic**: Seamlessly switch between OpenAI, Anthropic, Ollama, LMStudio, MLX, HuggingFace, vLLM, and any OpenAI-compatible endpoint
501
+ - **Async/Await Support** ⭐ NEW in v2.6.0: Native async support for concurrent requests with `asyncio.gather()` - works with all providers
502
+ - **Dynamic Endpoint Configuration** ⭐ NEW in v2.6.5: Pass `base_url` in POST requests to connect to custom OpenAI-compatible endpoints without environment variables
485
503
  - **Interaction Tracing**: Complete LLM observability with programmatic access to prompts, responses, tokens, timing, and trace correlation for debugging, trust, and compliance
486
504
  - **Glyph Visual-Text Compression**: Revolutionary compression system that renders text as optimized images for 3-4x token compression and faster inference
487
505
  - **Centralized Configuration**: Global defaults and app-specific preferences at `~/.abstractcore/config/abstractcore.json`
@@ -498,14 +516,16 @@ if response.metadata and response.metadata.get('compression_used'):
498
516
 
499
517
  ## Supported Providers
500
518
 
501
- | Provider | Status | SEED Support | Setup |
502
- |----------|--------|-------------|-------|
503
- | **OpenAI** | Full | Native | [Get API key](docs/prerequisites.md#openai-setup) |
504
- | **Anthropic** | Full | Warning* | [Get API key](docs/prerequisites.md#anthropic-setup) |
505
- | **Ollama** | Full | Native | [Install guide](docs/prerequisites.md#ollama-setup) |
506
- | **LMStudio** | Full | Native | [Install guide](docs/prerequisites.md#lmstudio-setup) |
507
- | **MLX** | Full | Native | [Setup guide](docs/prerequisites.md#mlx-setup) |
508
- | **HuggingFace** | Full | Native | [Setup guide](docs/prerequisites.md#huggingface-setup) |
519
+ | Provider | Status | SEED Support | Hardware | Setup |
520
+ |----------|--------|-------------|----------|-------|
521
+ | **OpenAI** | Full | Native | Any | [Get API key](docs/prerequisites.md#openai-setup) |
522
+ | **Anthropic** | Full | Warning* | Any | [Get API key](docs/prerequisites.md#anthropic-setup) |
523
+ | **Ollama** | Full | Native | Any | [Install guide](docs/prerequisites.md#ollama-setup) |
524
+ | **LMStudio** | Full | Native | Any | [Install guide](docs/prerequisites.md#lmstudio-setup) |
525
+ | **MLX** | Full | Native | **Apple Silicon only** | [Setup guide](docs/prerequisites.md#mlx-setup) |
526
+ | **HuggingFace** | Full | Native | Any | [Setup guide](docs/prerequisites.md#huggingface-setup) |
527
+ | **vLLM** | Full | Native | **NVIDIA CUDA only** | [Setup guide](docs/prerequisites.md#vllm-setup) |
528
+ | **OpenAI-Compatible** ⭐ NEW | Full | Native | Any | Works with llama.cpp, text-generation-webui, LocalAI, etc. |
509
529
 
510
530
  *Anthropic doesn't support seed parameters but issues a warning when provided. Use `temperature=0.0` for more consistent outputs.
511
531
 
@@ -1024,7 +1044,8 @@ pip install abstractcore[anthropic]
1024
1044
  pip install abstractcore[ollama]
1025
1045
  pip install abstractcore[lmstudio]
1026
1046
  pip install abstractcore[huggingface]
1027
- pip install abstractcore[mlx] # macOS/Apple Silicon only
1047
+ pip install abstractcore[mlx] # macOS/Apple Silicon only
1048
+ pip install abstractcore[vllm] # NVIDIA CUDA only (Linux)
1028
1049
 
1029
1050
  # With server support
1030
1051
  pip install abstractcore[server]
@@ -1032,20 +1053,29 @@ pip install abstractcore[server]
1032
1053
  # With embeddings
1033
1054
  pip install abstractcore[embeddings]
1034
1055
 
1035
- # Everything (recommended)
1056
+ # With compression (Glyph visual-text compression)
1057
+ pip install abstractcore[compression]
1058
+
1059
+ # Everything (recommended for Apple Silicon)
1036
1060
  pip install abstractcore[all]
1037
1061
 
1038
- # Cross-platform (all except MLX - for Linux/Windows)
1062
+ # Cross-platform (all except MLX/vLLM - for Linux/Windows/Intel Mac)
1039
1063
  pip install abstractcore[all-non-mlx]
1040
1064
 
1041
1065
  # Provider groups
1042
- pip install abstractcore[all-providers] # All providers (includes MLX)
1043
- pip install abstractcore[all-providers-non-mlx] # All providers except MLX
1066
+ pip install abstractcore[all-providers] # All providers (includes MLX, excludes vLLM)
1067
+ pip install abstractcore[all-providers-non-mlx] # All providers except MLX (excludes vLLM)
1044
1068
  pip install abstractcore[local-providers] # Ollama, LMStudio, MLX
1045
1069
  pip install abstractcore[local-providers-non-mlx] # Ollama, LMStudio only
1046
1070
  pip install abstractcore[api-providers] # OpenAI, Anthropic
1071
+ pip install abstractcore[gpu-providers] # vLLM (NVIDIA CUDA only)
1047
1072
  ```
1048
1073
 
1074
+ **Hardware-Specific Notes:**
1075
+ - **MLX**: Requires Apple Silicon (M1/M2/M3/M4). Will not work on Intel Macs or other platforms.
1076
+ - **vLLM**: Requires NVIDIA GPUs with CUDA support. Will not work on Apple Silicon, AMD GPUs, or Intel integrated graphics.
1077
+ - **All other providers** (OpenAI, Anthropic, Ollama, LMStudio, HuggingFace): Work on any hardware.
1078
+
1049
1079
  **Media processing extras:**
1050
1080
  ```bash
1051
1081
  # For PDF processing
@@ -368,8 +368,9 @@ if response.metadata and response.metadata.get('compression_used'):
368
368
  ## Key Features
369
369
 
370
370
  - **Offline-First Design**: Built primarily for open source LLMs with full offline capability. Download once, run forever without internet access
371
- - **Provider Agnostic**: Seamlessly switch between OpenAI, Anthropic, Ollama, LMStudio, MLX, HuggingFace
372
- - **Async/Await Support** ⭐ NEW in v2.6.0: Native async support for concurrent requests with `asyncio.gather()` - works with all 6 providers
371
+ - **Provider Agnostic**: Seamlessly switch between OpenAI, Anthropic, Ollama, LMStudio, MLX, HuggingFace, vLLM, and any OpenAI-compatible endpoint
372
+ - **Async/Await Support** ⭐ NEW in v2.6.0: Native async support for concurrent requests with `asyncio.gather()` - works with all providers
373
+ - **Dynamic Endpoint Configuration** ⭐ NEW in v2.6.5: Pass `base_url` in POST requests to connect to custom OpenAI-compatible endpoints without environment variables
373
374
  - **Interaction Tracing**: Complete LLM observability with programmatic access to prompts, responses, tokens, timing, and trace correlation for debugging, trust, and compliance
374
375
  - **Glyph Visual-Text Compression**: Revolutionary compression system that renders text as optimized images for 3-4x token compression and faster inference
375
376
  - **Centralized Configuration**: Global defaults and app-specific preferences at `~/.abstractcore/config/abstractcore.json`
@@ -386,14 +387,16 @@ if response.metadata and response.metadata.get('compression_used'):
386
387
 
387
388
  ## Supported Providers
388
389
 
389
- | Provider | Status | SEED Support | Setup |
390
- |----------|--------|-------------|-------|
391
- | **OpenAI** | Full | Native | [Get API key](docs/prerequisites.md#openai-setup) |
392
- | **Anthropic** | Full | Warning* | [Get API key](docs/prerequisites.md#anthropic-setup) |
393
- | **Ollama** | Full | Native | [Install guide](docs/prerequisites.md#ollama-setup) |
394
- | **LMStudio** | Full | Native | [Install guide](docs/prerequisites.md#lmstudio-setup) |
395
- | **MLX** | Full | Native | [Setup guide](docs/prerequisites.md#mlx-setup) |
396
- | **HuggingFace** | Full | Native | [Setup guide](docs/prerequisites.md#huggingface-setup) |
390
+ | Provider | Status | SEED Support | Hardware | Setup |
391
+ |----------|--------|-------------|----------|-------|
392
+ | **OpenAI** | Full | Native | Any | [Get API key](docs/prerequisites.md#openai-setup) |
393
+ | **Anthropic** | Full | Warning* | Any | [Get API key](docs/prerequisites.md#anthropic-setup) |
394
+ | **Ollama** | Full | Native | Any | [Install guide](docs/prerequisites.md#ollama-setup) |
395
+ | **LMStudio** | Full | Native | Any | [Install guide](docs/prerequisites.md#lmstudio-setup) |
396
+ | **MLX** | Full | Native | **Apple Silicon only** | [Setup guide](docs/prerequisites.md#mlx-setup) |
397
+ | **HuggingFace** | Full | Native | Any | [Setup guide](docs/prerequisites.md#huggingface-setup) |
398
+ | **vLLM** | Full | Native | **NVIDIA CUDA only** | [Setup guide](docs/prerequisites.md#vllm-setup) |
399
+ | **OpenAI-Compatible** ⭐ NEW | Full | Native | Any | Works with llama.cpp, text-generation-webui, LocalAI, etc. |
397
400
 
398
401
  *Anthropic doesn't support seed parameters but issues a warning when provided. Use `temperature=0.0` for more consistent outputs.
399
402
 
@@ -912,7 +915,8 @@ pip install abstractcore[anthropic]
912
915
  pip install abstractcore[ollama]
913
916
  pip install abstractcore[lmstudio]
914
917
  pip install abstractcore[huggingface]
915
- pip install abstractcore[mlx] # macOS/Apple Silicon only
918
+ pip install abstractcore[mlx] # macOS/Apple Silicon only
919
+ pip install abstractcore[vllm] # NVIDIA CUDA only (Linux)
916
920
 
917
921
  # With server support
918
922
  pip install abstractcore[server]
@@ -920,20 +924,29 @@ pip install abstractcore[server]
920
924
  # With embeddings
921
925
  pip install abstractcore[embeddings]
922
926
 
923
- # Everything (recommended)
927
+ # With compression (Glyph visual-text compression)
928
+ pip install abstractcore[compression]
929
+
930
+ # Everything (recommended for Apple Silicon)
924
931
  pip install abstractcore[all]
925
932
 
926
- # Cross-platform (all except MLX - for Linux/Windows)
933
+ # Cross-platform (all except MLX/vLLM - for Linux/Windows/Intel Mac)
927
934
  pip install abstractcore[all-non-mlx]
928
935
 
929
936
  # Provider groups
930
- pip install abstractcore[all-providers] # All providers (includes MLX)
931
- pip install abstractcore[all-providers-non-mlx] # All providers except MLX
937
+ pip install abstractcore[all-providers] # All providers (includes MLX, excludes vLLM)
938
+ pip install abstractcore[all-providers-non-mlx] # All providers except MLX (excludes vLLM)
932
939
  pip install abstractcore[local-providers] # Ollama, LMStudio, MLX
933
940
  pip install abstractcore[local-providers-non-mlx] # Ollama, LMStudio only
934
941
  pip install abstractcore[api-providers] # OpenAI, Anthropic
942
+ pip install abstractcore[gpu-providers] # vLLM (NVIDIA CUDA only)
935
943
  ```
936
944
 
945
+ **Hardware-Specific Notes:**
946
+ - **MLX**: Requires Apple Silicon (M1/M2/M3/M4). Will not work on Intel Macs or other platforms.
947
+ - **vLLM**: Requires NVIDIA GPUs with CUDA support. Will not work on Apple Silicon, AMD GPUs, or Intel integrated graphics.
948
+ - **All other providers** (OpenAI, Anthropic, Ollama, LMStudio, HuggingFace): Work on any hardware.
949
+
937
950
  **Media processing extras:**
938
951
  ```bash
939
952
  # For PDF processing
@@ -3,6 +3,8 @@ Image scaling utility for AbstractCore media handling.
3
3
 
4
4
  Provides intelligent image scaling based on model-specific requirements
5
5
  and capabilities for vision models.
6
+
7
+ Requires: PIL (Pillow) - install with `pip install Pillow`
6
8
  """
7
9
 
8
10
  from typing import Tuple, Optional, Union, Dict, Any
@@ -11,9 +13,10 @@ from pathlib import Path
11
13
 
12
14
  try:
13
15
  from PIL import Image, ImageOps
14
- PIL_AVAILABLE = True
15
- except ImportError:
16
- PIL_AVAILABLE = False
16
+ except ImportError as e:
17
+ raise ImportError(
18
+ "PIL (Pillow) is required for image scaling. Install with: pip install Pillow"
19
+ ) from e
17
20
 
18
21
  from ..base import MediaProcessingError
19
22
  from ...utils.structured_logging import get_logger
@@ -38,9 +41,6 @@ class ModelOptimizedScaler:
38
41
  def __init__(self):
39
42
  self.logger = get_logger(__name__)
40
43
 
41
- if not PIL_AVAILABLE:
42
- raise MediaProcessingError("PIL (Pillow) is required for image scaling")
43
-
44
44
  def get_optimal_resolution(self, model_name: str, original_size: Tuple[int, int],
45
45
  model_capabilities: Optional[Dict[str, Any]] = None) -> Tuple[int, int]:
46
46
  """
@@ -7,6 +7,8 @@ from .ollama_provider import OllamaProvider
7
7
  from .lmstudio_provider import LMStudioProvider
8
8
  from .huggingface_provider import HuggingFaceProvider
9
9
  from .mlx_provider import MLXProvider
10
+ from .vllm_provider import VLLMProvider
11
+ from .openai_compatible_provider import OpenAICompatibleProvider
10
12
 
11
13
  # Provider registry for centralized provider discovery and management
12
14
  from .registry import (
@@ -41,6 +43,8 @@ __all__ = [
41
43
  'LMStudioProvider',
42
44
  'HuggingFaceProvider',
43
45
  'MLXProvider',
46
+ 'VLLMProvider',
47
+ 'OpenAICompatibleProvider',
44
48
 
45
49
  # Provider registry
46
50
  'ProviderRegistry',