abstractcore 2.5.2__tar.gz → 2.5.3__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 (188) hide show
  1. {abstractcore-2.5.2 → abstractcore-2.5.3}/PKG-INFO +107 -6
  2. {abstractcore-2.5.2 → abstractcore-2.5.3}/README.md +97 -0
  3. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/__init__.py +12 -0
  4. abstractcore-2.5.3/abstractcore/architectures/detection.py +542 -0
  5. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/assets/architecture_formats.json +14 -1
  6. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/assets/model_capabilities.json +533 -10
  7. abstractcore-2.5.3/abstractcore/compression/__init__.py +29 -0
  8. abstractcore-2.5.3/abstractcore/compression/analytics.py +420 -0
  9. abstractcore-2.5.3/abstractcore/compression/cache.py +250 -0
  10. abstractcore-2.5.3/abstractcore/compression/config.py +279 -0
  11. abstractcore-2.5.3/abstractcore/compression/exceptions.py +30 -0
  12. abstractcore-2.5.3/abstractcore/compression/glyph_processor.py +381 -0
  13. abstractcore-2.5.3/abstractcore/compression/optimizer.py +388 -0
  14. abstractcore-2.5.3/abstractcore/compression/orchestrator.py +380 -0
  15. abstractcore-2.5.3/abstractcore/compression/pil_text_renderer.py +818 -0
  16. abstractcore-2.5.3/abstractcore/compression/quality.py +226 -0
  17. abstractcore-2.5.3/abstractcore/compression/text_formatter.py +666 -0
  18. abstractcore-2.5.3/abstractcore/compression/vision_compressor.py +371 -0
  19. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/config/main.py +64 -0
  20. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/config/manager.py +100 -5
  21. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/core/session.py +61 -6
  22. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/events/__init__.py +1 -1
  23. abstractcore-2.5.3/abstractcore/media/auto_handler.py +657 -0
  24. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/handlers/local_handler.py +14 -2
  25. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/handlers/openai_handler.py +62 -3
  26. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/processors/__init__.py +11 -1
  27. abstractcore-2.5.3/abstractcore/media/processors/direct_pdf_processor.py +210 -0
  28. abstractcore-2.5.3/abstractcore/media/processors/glyph_pdf_processor.py +227 -0
  29. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/processors/image_processor.py +7 -1
  30. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/processors/text_processor.py +18 -3
  31. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/types.py +164 -7
  32. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/__init__.py +18 -0
  33. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/anthropic_provider.py +28 -2
  34. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/base.py +278 -6
  35. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/huggingface_provider.py +563 -23
  36. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/lmstudio_provider.py +38 -2
  37. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/mlx_provider.py +27 -2
  38. abstractcore-2.5.3/abstractcore/providers/model_capabilities.py +352 -0
  39. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/ollama_provider.py +38 -4
  40. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/openai_provider.py +28 -2
  41. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/registry.py +85 -13
  42. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/server/app.py +91 -81
  43. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/utils/__init__.py +4 -1
  44. abstractcore-2.5.3/abstractcore/utils/trace_export.py +287 -0
  45. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/utils/version.py +1 -1
  46. abstractcore-2.5.3/abstractcore/utils/vlm_token_calculator.py +655 -0
  47. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore.egg-info/PKG-INFO +107 -6
  48. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore.egg-info/SOURCES.txt +18 -53
  49. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore.egg-info/requires.txt +10 -5
  50. {abstractcore-2.5.2 → abstractcore-2.5.3}/pyproject.toml +12 -5
  51. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_retry_strategy.py +24 -9
  52. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_unload_memory.py +4 -4
  53. abstractcore-2.5.2/abstractcore/architectures/detection.py +0 -296
  54. abstractcore-2.5.2/abstractcore/media/auto_handler.py +0 -363
  55. abstractcore-2.5.2/tests/test_all_specified_providers.py +0 -182
  56. abstractcore-2.5.2/tests/test_basic_summarizer.py +0 -332
  57. abstractcore-2.5.2/tests/test_cli_media.py +0 -45
  58. abstractcore-2.5.2/tests/test_consistency.py +0 -116
  59. abstractcore-2.5.2/tests/test_critical_streaming_tool_fix.py +0 -744
  60. abstractcore-2.5.2/tests/test_debug_server.py +0 -69
  61. abstractcore-2.5.2/tests/test_direct_vs_server.py +0 -157
  62. abstractcore-2.5.2/tests/test_embeddings.py +0 -391
  63. abstractcore-2.5.2/tests/test_embeddings_integration.py +0 -317
  64. abstractcore-2.5.2/tests/test_embeddings_llm_integration.py +0 -331
  65. abstractcore-2.5.2/tests/test_embeddings_matrix_operations.py +0 -387
  66. abstractcore-2.5.2/tests/test_embeddings_no_mock.py +0 -358
  67. abstractcore-2.5.2/tests/test_embeddings_real.py +0 -428
  68. abstractcore-2.5.2/tests/test_embeddings_semantic_validation.py +0 -438
  69. abstractcore-2.5.2/tests/test_embeddings_simple.py +0 -124
  70. abstractcore-2.5.2/tests/test_fixed_media.py +0 -168
  71. abstractcore-2.5.2/tests/test_fixed_prompt.py +0 -65
  72. abstractcore-2.5.2/tests/test_lmstudio_context.py +0 -143
  73. abstractcore-2.5.2/tests/test_media_import.py +0 -65
  74. abstractcore-2.5.2/tests/test_media_server.py +0 -276
  75. abstractcore-2.5.2/tests/test_ollama_tool_role_fix.py +0 -269
  76. abstractcore-2.5.2/tests/test_openai_conversion_manual.py +0 -119
  77. abstractcore-2.5.2/tests/test_openai_format_bug.py +0 -257
  78. abstractcore-2.5.2/tests/test_openai_format_conversion.py +0 -485
  79. abstractcore-2.5.2/tests/test_openai_media_integration.py +0 -444
  80. abstractcore-2.5.2/tests/test_progressive_complexity.py +0 -163
  81. abstractcore-2.5.2/tests/test_provider_basic_session.py +0 -154
  82. abstractcore-2.5.2/tests/test_provider_connectivity.py +0 -102
  83. abstractcore-2.5.2/tests/test_provider_simple_generation.py +0 -167
  84. abstractcore-2.5.2/tests/test_provider_streaming.py +0 -364
  85. abstractcore-2.5.2/tests/test_provider_token_translation.py +0 -289
  86. abstractcore-2.5.2/tests/test_provider_tool_detection.py +0 -265
  87. abstractcore-2.5.2/tests/test_providers.py +0 -362
  88. abstractcore-2.5.2/tests/test_providers_comprehensive.py +0 -353
  89. abstractcore-2.5.2/tests/test_providers_simple.py +0 -168
  90. abstractcore-2.5.2/tests/test_real_models_comprehensive.py +0 -521
  91. abstractcore-2.5.2/tests/test_server_debug.py +0 -131
  92. abstractcore-2.5.2/tests/test_server_embeddings_real.py +0 -233
  93. abstractcore-2.5.2/tests/test_server_integration.py +0 -245
  94. abstractcore-2.5.2/tests/test_stream_tool_calling.py +0 -496
  95. abstractcore-2.5.2/tests/test_streaming_enhancements.py +0 -614
  96. abstractcore-2.5.2/tests/test_streaming_tag_rewriting.py +0 -527
  97. abstractcore-2.5.2/tests/test_structured_integration.py +0 -218
  98. abstractcore-2.5.2/tests/test_structured_output.py +0 -332
  99. abstractcore-2.5.2/tests/test_syntax_rewriter.py +0 -471
  100. abstractcore-2.5.2/tests/test_tool_calling.py +0 -231
  101. abstractcore-2.5.2/tests/test_tool_execution_separation.py +0 -857
  102. abstractcore-2.5.2/tests/test_unified_streaming.py +0 -852
  103. abstractcore-2.5.2/tests/test_vision_accuracy.py +0 -145
  104. abstractcore-2.5.2/tests/test_vision_comprehensive.py +0 -648
  105. abstractcore-2.5.2/tests/test_vision_fallback_improvement.py +0 -129
  106. abstractcore-2.5.2/tests/test_wrong_model_fallback.py +0 -262
  107. {abstractcore-2.5.2 → abstractcore-2.5.3}/LICENSE +0 -0
  108. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/apps/__init__.py +0 -0
  109. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/apps/__main__.py +0 -0
  110. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/apps/app_config_utils.py +0 -0
  111. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/apps/deepsearch.py +0 -0
  112. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/apps/extractor.py +0 -0
  113. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/apps/intent.py +0 -0
  114. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/apps/judge.py +0 -0
  115. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/apps/summarizer.py +0 -0
  116. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/architectures/__init__.py +0 -0
  117. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/architectures/enums.py +0 -0
  118. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/assets/session_schema.json +0 -0
  119. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/config/__init__.py +0 -0
  120. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/config/vision_config.py +0 -0
  121. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/core/__init__.py +0 -0
  122. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/core/enums.py +0 -0
  123. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/core/factory.py +0 -0
  124. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/core/interface.py +0 -0
  125. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/core/retry.py +0 -0
  126. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/core/types.py +0 -0
  127. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/embeddings/__init__.py +0 -0
  128. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/embeddings/manager.py +0 -0
  129. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/embeddings/models.py +0 -0
  130. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/exceptions/__init__.py +0 -0
  131. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/__init__.py +0 -0
  132. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/base.py +0 -0
  133. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/capabilities.py +0 -0
  134. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/handlers/__init__.py +0 -0
  135. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/handlers/anthropic_handler.py +0 -0
  136. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/processors/office_processor.py +0 -0
  137. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/processors/pdf_processor.py +0 -0
  138. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/utils/__init__.py +0 -0
  139. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/utils/image_scaler.py +0 -0
  140. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/media/vision_fallback.py +0 -0
  141. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/processing/__init__.py +0 -0
  142. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/processing/basic_deepsearch.py +0 -0
  143. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/processing/basic_extractor.py +0 -0
  144. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/processing/basic_intent.py +0 -0
  145. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/processing/basic_judge.py +0 -0
  146. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/processing/basic_summarizer.py +0 -0
  147. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/providers/streaming.py +0 -0
  148. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/server/__init__.py +0 -0
  149. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/structured/__init__.py +0 -0
  150. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/structured/handler.py +0 -0
  151. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/structured/retry.py +0 -0
  152. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/tools/__init__.py +0 -0
  153. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/tools/common_tools.py +0 -0
  154. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/tools/core.py +0 -0
  155. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/tools/handler.py +0 -0
  156. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/tools/parser.py +0 -0
  157. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/tools/registry.py +0 -0
  158. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/tools/syntax_rewriter.py +0 -0
  159. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/tools/tag_rewriter.py +0 -0
  160. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/utils/cli.py +0 -0
  161. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/utils/message_preprocessor.py +0 -0
  162. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/utils/self_fixes.py +0 -0
  163. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/utils/structured_logging.py +0 -0
  164. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore/utils/token_utils.py +0 -0
  165. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore.egg-info/dependency_links.txt +0 -0
  166. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore.egg-info/entry_points.txt +0 -0
  167. {abstractcore-2.5.2 → abstractcore-2.5.3}/abstractcore.egg-info/top_level.txt +0 -0
  168. {abstractcore-2.5.2 → abstractcore-2.5.3}/setup.cfg +0 -0
  169. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_agentic_cli_compatibility.py +0 -0
  170. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_basic_session.py +0 -0
  171. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_complete_integration.py +0 -0
  172. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_comprehensive_events.py +0 -0
  173. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_core_components.py +0 -0
  174. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_enhanced_prompt.py +0 -0
  175. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_environment_variable_tool_call_tags.py +0 -0
  176. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_factory.py +0 -0
  177. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_final_accuracy.py +0 -0
  178. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_final_comprehensive.py +0 -0
  179. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_final_graceful_errors.py +0 -0
  180. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_graceful_fallback.py +0 -0
  181. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_import_debug.py +0 -0
  182. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_integrated_functionality.py +0 -0
  183. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_retry_observability.py +0 -0
  184. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_seed_determinism.py +0 -0
  185. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_seed_temperature_basic.py +0 -0
  186. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_sensory_prompting.py +0 -0
  187. {abstractcore-2.5.2 → abstractcore-2.5.3}/tests/test_text_only_model_experience.py +0 -0
  188. {abstractcore-2.5.2 → abstractcore-2.5.3}/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.5.2
3
+ Version: 2.5.3
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>
@@ -37,8 +37,10 @@ Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "anthropic"
37
37
  Provides-Extra: ollama
38
38
  Provides-Extra: lmstudio
39
39
  Provides-Extra: huggingface
40
- Requires-Dist: transformers<5.0.0,>=4.30.0; extra == "huggingface"
41
- Requires-Dist: torch<3.0.0,>=1.12.0; extra == "huggingface"
40
+ Requires-Dist: transformers<5.0.0,>=4.57.1; extra == "huggingface"
41
+ Requires-Dist: torch<3.0.0,>=2.6.0; extra == "huggingface"
42
+ Requires-Dist: torchvision>=0.17.0; extra == "huggingface"
43
+ Requires-Dist: torchaudio>=2.1.0; extra == "huggingface"
42
44
  Requires-Dist: llama-cpp-python<1.0.0,>=0.2.0; extra == "huggingface"
43
45
  Requires-Dist: outlines>=0.1.0; extra == "huggingface"
44
46
  Provides-Extra: mlx
@@ -46,7 +48,7 @@ Requires-Dist: mlx<1.0.0,>=0.15.0; extra == "mlx"
46
48
  Requires-Dist: mlx-lm<1.0.0,>=0.15.0; extra == "mlx"
47
49
  Requires-Dist: outlines>=0.1.0; extra == "mlx"
48
50
  Provides-Extra: embeddings
49
- Requires-Dist: sentence-transformers<4.0.0,>=2.7.0; extra == "embeddings"
51
+ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "embeddings"
50
52
  Requires-Dist: numpy<2.0.0,>=1.20.0; extra == "embeddings"
51
53
  Provides-Extra: processing
52
54
  Provides-Extra: tools
@@ -59,6 +61,8 @@ Requires-Dist: Pillow<12.0.0,>=10.0.0; extra == "media"
59
61
  Requires-Dist: pymupdf4llm<1.0.0,>=0.0.20; extra == "media"
60
62
  Requires-Dist: unstructured[office]<1.0.0,>=0.10.0; extra == "media"
61
63
  Requires-Dist: pandas<3.0.0,>=1.0.0; extra == "media"
64
+ Provides-Extra: compression
65
+ Requires-Dist: pdf2image<2.0.0,>=1.16.0; extra == "compression"
62
66
  Provides-Extra: api-providers
63
67
  Requires-Dist: abstractcore[anthropic,openai]; extra == "api-providers"
64
68
  Provides-Extra: local-providers
@@ -68,9 +72,9 @@ Requires-Dist: abstractcore[huggingface]; extra == "heavy-providers"
68
72
  Provides-Extra: all-providers
69
73
  Requires-Dist: abstractcore[anthropic,embeddings,huggingface,lmstudio,mlx,ollama,openai]; extra == "all-providers"
70
74
  Provides-Extra: all
71
- Requires-Dist: abstractcore[anthropic,dev,docs,embeddings,huggingface,lmstudio,media,mlx,ollama,openai,processing,server,test,tools]; extra == "all"
75
+ Requires-Dist: abstractcore[anthropic,compression,dev,docs,embeddings,huggingface,lmstudio,media,mlx,ollama,openai,processing,server,test,tools]; extra == "all"
72
76
  Provides-Extra: lightweight
73
- Requires-Dist: abstractcore[anthropic,embeddings,lmstudio,media,ollama,openai,processing,server,tools]; extra == "lightweight"
77
+ Requires-Dist: abstractcore[anthropic,compression,embeddings,lmstudio,media,ollama,openai,processing,server,tools]; extra == "lightweight"
74
78
  Provides-Extra: dev
75
79
  Requires-Dist: pytest>=7.0.0; extra == "dev"
76
80
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
@@ -258,6 +262,55 @@ loaded_session = BasicSession.load('conversation.json', provider=llm)
258
262
 
259
263
  [Learn more about Session](docs/session.md)
260
264
 
265
+ ### Interaction Tracing (Observability)
266
+
267
+ Enable complete observability of LLM interactions for debugging, compliance, and transparency:
268
+
269
+ ```python
270
+ from abstractcore import create_llm
271
+ from abstractcore.core.session import BasicSession
272
+ from abstractcore.utils import export_traces
273
+
274
+ # Enable tracing on provider
275
+ llm = create_llm('openai', model='gpt-4o-mini', enable_tracing=True, max_traces=100)
276
+
277
+ # Or on session for automatic correlation
278
+ session = BasicSession(provider=llm, enable_tracing=True)
279
+
280
+ # Generate with custom metadata
281
+ response = session.generate(
282
+ "Write Python code",
283
+ step_type='code_generation',
284
+ attempt_number=1
285
+ )
286
+
287
+ # Access complete trace
288
+ trace_id = response.metadata['trace_id']
289
+ trace = llm.get_traces(trace_id=trace_id)
290
+
291
+ # Full interaction context
292
+ print(f"Prompt: {trace['prompt']}")
293
+ print(f"Response: {trace['response']['content']}")
294
+ print(f"Tokens: {trace['response']['usage']['total_tokens']}")
295
+ print(f"Time: {trace['response']['generation_time_ms']}ms")
296
+ print(f"Custom metadata: {trace['metadata']}")
297
+
298
+ # Get all session traces
299
+ traces = session.get_interaction_history()
300
+
301
+ # Export to JSONL, JSON, or Markdown
302
+ export_traces(traces, format='markdown', file_path='workflow_trace.md')
303
+ ```
304
+
305
+ **What's captured:**
306
+ - All prompts, system prompts, and conversation history
307
+ - Complete responses with token usage and timing
308
+ - Generation parameters (temperature, tokens, seed, etc.)
309
+ - Custom metadata for workflow tracking
310
+ - Tool calls and results
311
+
312
+ [Learn more about Interaction Tracing](docs/interaction-tracing.md)
313
+
261
314
  ### Media Handling
262
315
 
263
316
  AbstractCore provides unified media handling across all providers with automatic resolution optimization. Upload images, PDFs, and documents using the same simple API regardless of your provider.
@@ -307,9 +360,56 @@ response = llm.generate(
307
360
 
308
361
  [Learn more about Media Handling](docs/media-handling-system.md)
309
362
 
363
+ ### Glyph Visual-Text Compression (🧪 EXPERIMENTAL)
364
+
365
+ > ⚠️ **Vision Model Requirement**: This feature ONLY works with vision-capable models (e.g., gpt-4o, claude-3-5-sonnet, llama3.2-vision)
366
+
367
+ Achieve **3-4x token compression** and **faster inference** with Glyph's revolutionary visual-text compression:
368
+
369
+ ```python
370
+ from abstractcore import create_llm
371
+
372
+ # IMPORTANT: Requires a vision-capable model
373
+ llm = create_llm("ollama", model="llama3.2-vision:11b") # ✓ Vision model
374
+
375
+ # Large documents are automatically compressed for efficiency
376
+ response = llm.generate(
377
+ "Analyze the key findings in this research paper",
378
+ media=["large_research_paper.pdf"] # Automatically compressed if beneficial
379
+ )
380
+
381
+ # Force compression (raises error if model lacks vision)
382
+ response = llm.generate(
383
+ "Summarize this document",
384
+ media=["document.pdf"],
385
+ glyph_compression="always" # "auto" | "always" | "never"
386
+ )
387
+
388
+ # Non-vision models will raise UnsupportedFeatureError
389
+ # llm_no_vision = create_llm("openai", model="gpt-4") # ✗ No vision
390
+ # response = llm_no_vision.generate("...", glyph_compression="always") # Error!
391
+
392
+ # Check compression stats
393
+ if response.metadata and response.metadata.get('compression_used'):
394
+ stats = response.metadata.get('compression_stats', {})
395
+ print(f"Compression ratio: {stats.get('compression_ratio')}x")
396
+ print(f"Processing speedup: 14% faster, 79% less memory")
397
+ ```
398
+
399
+ **Validated Performance:**
400
+ - **14% faster processing** with real-world documents
401
+ - **79% lower memory usage** during processing
402
+ - **100% quality preservation** - no loss of analytical accuracy
403
+ - **Transparent operation** - works with existing code
404
+
405
+ [Learn more about Glyph Compression](docs/glyphs.md)
406
+
310
407
  ## Key Features
311
408
 
409
+ - **Offline-First Design**: Built primarily for open source LLMs with full offline capability. Download once, run forever without internet access
312
410
  - **Provider Agnostic**: Seamlessly switch between OpenAI, Anthropic, Ollama, LMStudio, MLX, HuggingFace
411
+ - **Interaction Tracing**: Complete LLM observability with programmatic access to prompts, responses, tokens, and timing for debugging and compliance
412
+ - **Glyph Visual-Text Compression**: Revolutionary compression system that renders text as optimized images for 3-4x token compression and faster inference
313
413
  - **Centralized Configuration**: Global defaults and app-specific preferences at `~/.abstractcore/config/abstractcore.json`
314
414
  - **Intelligent Media Handling**: Upload images, PDFs, and documents with automatic maximum resolution optimization
315
415
  - **Vision Model Support**: Smart image processing at each model's maximum capability
@@ -752,6 +852,7 @@ curl -X POST http://localhost:8000/v1/chat/completions \
752
852
 
753
853
  ## Why AbstractCore?
754
854
 
855
+ - **Offline-First Philosophy**: Designed for open source LLMs with complete offline operation. No internet required after initial model download
755
856
  - **Unified Interface**: One API for all LLM providers
756
857
  - **Multimodal Support**: Upload images, PDFs, and documents across all providers
757
858
  - **Vision Models**: Seamless integration with GPT-4o, Claude Vision, qwen3-vl, and more
@@ -156,6 +156,55 @@ loaded_session = BasicSession.load('conversation.json', provider=llm)
156
156
 
157
157
  [Learn more about Session](docs/session.md)
158
158
 
159
+ ### Interaction Tracing (Observability)
160
+
161
+ Enable complete observability of LLM interactions for debugging, compliance, and transparency:
162
+
163
+ ```python
164
+ from abstractcore import create_llm
165
+ from abstractcore.core.session import BasicSession
166
+ from abstractcore.utils import export_traces
167
+
168
+ # Enable tracing on provider
169
+ llm = create_llm('openai', model='gpt-4o-mini', enable_tracing=True, max_traces=100)
170
+
171
+ # Or on session for automatic correlation
172
+ session = BasicSession(provider=llm, enable_tracing=True)
173
+
174
+ # Generate with custom metadata
175
+ response = session.generate(
176
+ "Write Python code",
177
+ step_type='code_generation',
178
+ attempt_number=1
179
+ )
180
+
181
+ # Access complete trace
182
+ trace_id = response.metadata['trace_id']
183
+ trace = llm.get_traces(trace_id=trace_id)
184
+
185
+ # Full interaction context
186
+ print(f"Prompt: {trace['prompt']}")
187
+ print(f"Response: {trace['response']['content']}")
188
+ print(f"Tokens: {trace['response']['usage']['total_tokens']}")
189
+ print(f"Time: {trace['response']['generation_time_ms']}ms")
190
+ print(f"Custom metadata: {trace['metadata']}")
191
+
192
+ # Get all session traces
193
+ traces = session.get_interaction_history()
194
+
195
+ # Export to JSONL, JSON, or Markdown
196
+ export_traces(traces, format='markdown', file_path='workflow_trace.md')
197
+ ```
198
+
199
+ **What's captured:**
200
+ - All prompts, system prompts, and conversation history
201
+ - Complete responses with token usage and timing
202
+ - Generation parameters (temperature, tokens, seed, etc.)
203
+ - Custom metadata for workflow tracking
204
+ - Tool calls and results
205
+
206
+ [Learn more about Interaction Tracing](docs/interaction-tracing.md)
207
+
159
208
  ### Media Handling
160
209
 
161
210
  AbstractCore provides unified media handling across all providers with automatic resolution optimization. Upload images, PDFs, and documents using the same simple API regardless of your provider.
@@ -205,9 +254,56 @@ response = llm.generate(
205
254
 
206
255
  [Learn more about Media Handling](docs/media-handling-system.md)
207
256
 
257
+ ### Glyph Visual-Text Compression (🧪 EXPERIMENTAL)
258
+
259
+ > ⚠️ **Vision Model Requirement**: This feature ONLY works with vision-capable models (e.g., gpt-4o, claude-3-5-sonnet, llama3.2-vision)
260
+
261
+ Achieve **3-4x token compression** and **faster inference** with Glyph's revolutionary visual-text compression:
262
+
263
+ ```python
264
+ from abstractcore import create_llm
265
+
266
+ # IMPORTANT: Requires a vision-capable model
267
+ llm = create_llm("ollama", model="llama3.2-vision:11b") # ✓ Vision model
268
+
269
+ # Large documents are automatically compressed for efficiency
270
+ response = llm.generate(
271
+ "Analyze the key findings in this research paper",
272
+ media=["large_research_paper.pdf"] # Automatically compressed if beneficial
273
+ )
274
+
275
+ # Force compression (raises error if model lacks vision)
276
+ response = llm.generate(
277
+ "Summarize this document",
278
+ media=["document.pdf"],
279
+ glyph_compression="always" # "auto" | "always" | "never"
280
+ )
281
+
282
+ # Non-vision models will raise UnsupportedFeatureError
283
+ # llm_no_vision = create_llm("openai", model="gpt-4") # ✗ No vision
284
+ # response = llm_no_vision.generate("...", glyph_compression="always") # Error!
285
+
286
+ # Check compression stats
287
+ if response.metadata and response.metadata.get('compression_used'):
288
+ stats = response.metadata.get('compression_stats', {})
289
+ print(f"Compression ratio: {stats.get('compression_ratio')}x")
290
+ print(f"Processing speedup: 14% faster, 79% less memory")
291
+ ```
292
+
293
+ **Validated Performance:**
294
+ - **14% faster processing** with real-world documents
295
+ - **79% lower memory usage** during processing
296
+ - **100% quality preservation** - no loss of analytical accuracy
297
+ - **Transparent operation** - works with existing code
298
+
299
+ [Learn more about Glyph Compression](docs/glyphs.md)
300
+
208
301
  ## Key Features
209
302
 
303
+ - **Offline-First Design**: Built primarily for open source LLMs with full offline capability. Download once, run forever without internet access
210
304
  - **Provider Agnostic**: Seamlessly switch between OpenAI, Anthropic, Ollama, LMStudio, MLX, HuggingFace
305
+ - **Interaction Tracing**: Complete LLM observability with programmatic access to prompts, responses, tokens, and timing for debugging and compliance
306
+ - **Glyph Visual-Text Compression**: Revolutionary compression system that renders text as optimized images for 3-4x token compression and faster inference
211
307
  - **Centralized Configuration**: Global defaults and app-specific preferences at `~/.abstractcore/config/abstractcore.json`
212
308
  - **Intelligent Media Handling**: Upload images, PDFs, and documents with automatic maximum resolution optimization
213
309
  - **Vision Model Support**: Smart image processing at each model's maximum capability
@@ -650,6 +746,7 @@ curl -X POST http://localhost:8000/v1/chat/completions \
650
746
 
651
747
  ## Why AbstractCore?
652
748
 
749
+ - **Offline-First Philosophy**: Designed for open source LLMs with complete offline operation. No internet required after initial model download
653
750
  - **Unified Interface**: One API for all LLM providers
654
751
  - **Multimodal Support**: Upload images, PDFs, and documents across all providers
655
752
  - **Vision Models**: Seamless integration with GPT-4o, Claude Vision, qwen3-vl, and more
@@ -2,6 +2,8 @@
2
2
  """
3
3
  AbstractCore - Unified interface to all LLM providers with essential infrastructure.
4
4
 
5
+ CRITICAL: Offline-first design - enforces offline mode for open source LLMs by default.
6
+
5
7
  Key Features:
6
8
  • Multi-provider support (OpenAI, Anthropic, Ollama, HuggingFace, MLX, LMStudio)
7
9
  • Unified token parameter vocabulary across all providers
@@ -47,6 +49,13 @@ _has_processing = True
47
49
  # Tools module (core functionality)
48
50
  from .tools import tool
49
51
 
52
+ # Compression module (optional import)
53
+ try:
54
+ from .compression import GlyphConfig, CompressionOrchestrator
55
+ _has_compression = True
56
+ except ImportError:
57
+ _has_compression = False
58
+
50
59
  __all__ = [
51
60
  'create_llm',
52
61
  'BasicSession',
@@ -64,5 +73,8 @@ __all__ = [
64
73
  if _has_embeddings:
65
74
  __all__.append('EmbeddingManager')
66
75
 
76
+ if _has_compression:
77
+ __all__.extend(['GlyphConfig', 'CompressionOrchestrator'])
78
+
67
79
  # Processing is core functionality
68
80
  __all__.extend(['BasicSummarizer', 'SummaryStyle', 'SummaryLength', 'BasicExtractor'])