abstractcore 2.35.0__tar.gz → 2.35.1__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.
- {abstractcore-2.35.0 → abstractcore-2.35.1}/PKG-INFO +13 -12
- {abstractcore-2.35.0 → abstractcore-2.35.1}/README.md +1 -1
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/route_engines.py +1 -1
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/download.py +3 -5
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/embeddings/manager.py +29 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/huggingface_provider.py +17 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/install_settings.py +13 -0
- abstractcore-2.35.1/abstractcore/utils/llama_cuda_swap.py +277 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/version.py +1 -1
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/windows_dll.py +9 -1
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/PKG-INFO +13 -12
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/SOURCES.txt +1 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/requires.txt +11 -10
- {abstractcore-2.35.0 → abstractcore-2.35.1}/pyproject.toml +12 -10
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_install_hints_no_bare_packages.py +7 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_install_settings.py +2 -2
- {abstractcore-2.35.0 → abstractcore-2.35.1}/LICENSE +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/__main__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/app_config_utils.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/deepsearch.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/extractor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/intent.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/judge.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/apps/summarizer.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/detection.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/enums.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/response_postprocessing.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/architectures/thinking_controls.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/OCRA.ttf +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/OCRB.ttf +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/OCRBL.ttf +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/README.md +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/abstractframework_identity.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/adapter_metadata.schema.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/architecture_formats.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/bloc-schema.jsonld +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/llamacpp_known_architectures.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/model_capabilities.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/model_capabilities.schema.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/model_downloads_catalog.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/model_downloads_catalog.schema.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/semantic_models.md +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/assets/session_schema.json +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/errors.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/host.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/music_selectors.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/registry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/scene3d_selectors.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/types.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/capabilities/vision_catalog.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/bodystructure.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/client.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/context.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/discovery.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/errors.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/imap_codec.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/legacy.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/limits.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/models.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/oauth.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/policy.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/search.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/store.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/comms/email/vault.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/analytics.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/cache.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/config.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/exceptions.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/glyph_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/optimizer.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/orchestrator.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/pil_text_renderer.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/quality.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/text_formatter.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/compression/vision_compressor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/capability_defaults.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/email_cli.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/engines.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/host_jobs.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/main.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/manager.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/model_catalog.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/model_contexts.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/model_materializer.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/model_verify.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/models_engines_cli.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/provider_profiles.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/recommendations.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/config/vision_config.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/console/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/console/theme_sync.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/console/themes.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/console/web.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/bloc_kv.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/bloc_metadata.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/cached_session.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/degeneration.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/endpoint_damping.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/enums.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/factory.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/file_blocs.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/file_boxes.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/generate_contract.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/interface.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/multimodal_generation.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/output_specs.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/retry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/session.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/core/types.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/base.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/gguf.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/hf.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/logits.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/backends/mlx.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/convert.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/encoding.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/base.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/labels.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/laya.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/engines/remote.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/gguf_compat.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/head.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/kinds.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/loader.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/pool.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/render.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/runtime.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/tokenizers.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/decision/types.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/embeddings/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/embeddings/models.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/endpoint/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/endpoint/app.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/events/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/exceptions/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/client.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/factory.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/naming.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/stdio_client.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/mcp/tool_source.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/auto_handler.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/base.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/capabilities.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/delivery.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/enrichment.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/handlers/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/handlers/anthropic_handler.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/handlers/local_handler.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/handlers/openai_handler.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/openai_parts.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/pdf_routing.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/audio_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/direct_pdf_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/glyph_pdf_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/image_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/office_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/pdf_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/text_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/processors/video_processor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/types.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/utils/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/utils/image_scaler.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/utils/video_frames.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/media/vision_fallback.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_deepsearch.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_extractor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_intent.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_judge.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/processing/basic_summarizer.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/_http.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/anthropic_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/base.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/capability_host.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/endpoint_context.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/generation_cancel.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/generation_progress.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/gguf_shared.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/gguf_slots.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/hf_residency.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/lmstudio_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_hy_v3.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_model_rules.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_native_cache.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_native_session.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_prefill_observer.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_qwen4.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_residency.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_runtime.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/mlx_vision_addon.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/model_capabilities.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/model_config_fingerprint.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/ollama_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/openai_compatible_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/openai_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/openrouter_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/portkey_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/process_residency.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/registry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/speculation.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/streaming.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/tokenizer_fingerprint.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/typesafe_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/vllm_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/providers/weights_fingerprint.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/py.typed +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/__main__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/app.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/audio_endpoints.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/auth_policy.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/camera_endpoints.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/capability_generation.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/console_routes.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/credentials.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/email_routes.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/first_run.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/host_routes.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/managed.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/scene3d_endpoints.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/session_routes.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/server/vision_endpoints.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/handler.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/json_schema.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/retry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/structured/schema_compat.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/testing/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/testing/mailserver.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/abstractignore.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/arg_canonicalizer.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/arg_coercion.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/browser_tools.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/code_analysis.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/common_tools.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/comms_tools.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/core.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/email_digests.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/fetch_url_ssrf.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/handler.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/inventory.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/parser.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/process_tree.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/registry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/risk_facts.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/sandbox.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/shell_session.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/shell_tools.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/syntax_rewriter.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/tag_rewriter.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/telegram_tdlib.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/telegram_tools.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/tools/wire_naming.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/__init__.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/async_stream.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/cli.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/context_calibration.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/context_estimate.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/data_registry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/display.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/file_filters.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/host_profile.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/hostinfo.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/identity.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/jsonish.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/kv_geometry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/memory.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/message_preprocessor.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/model_cache.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/model_fit.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/residency.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/self_fixes.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/stdio.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/structured_logging.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/token_utils.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/trace_export.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/truncation.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/vlm_token_calculator.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore/utils/workspace_paths.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/dependency_links.txt +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/entry_points.txt +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/abstractcore.egg-info/top_level.txt +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/setup.cfg +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_abstractendpoint_singleton_provider.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_agentic_cli_compatibility.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_basic_session.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_cache_dtype.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_endpoint.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_engine_fingerprint.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_model_config_fingerprint.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_tokenizer_fingerprint.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_kv_weights_fingerprint.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_bloc_metadata_json_extract.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_cached_session_kv_mode.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_cached_session_kv_thinking_prefix.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_capabilities_registry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_capabilities_registry_preferred_backends_from_config.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_changelog_fragments.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_complete_integration.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_comprehensive_events.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_console_about.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_console_email_tab.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_console_web.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_core_components.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_display_rule.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_email_digests.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_embedding_model_shared_unit.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_embedding_model_token_warnings.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_enhanced_prompt.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_environment_variable_tool_call_tags.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_factory.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_file_bloc_store_unit.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_file_boxes_cached_session.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_final_accuracy.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_final_comprehensive.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_final_graceful_errors.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_generate_contract.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_generate_response_reasoning_property_unit.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_generate_with_outputs.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_graceful_fallback.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_import_debug.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_import_safety.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_incremental_thinking_tag_stripper.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_install_scripts.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_integrated_functionality.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_llms_sources.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_mcp_handshake.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_mcp_integration.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_mcp_stdio_client.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_model_not_downloaded_error_unit.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_multimodal_generate_output.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_openai_prompt_cache_key_passthrough.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_output_specs.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_packaging_assets.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_packaging_extras.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_packaging_packages_listed.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_api.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_bloc_composition.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_bloc_e2e_gate.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_control_plane.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_prompt_cache_prepare_modules_thinking_http.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_retry_observability.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_retry_strategy.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_seed_determinism.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_seed_temperature_basic.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_sensory_prompting.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_server_prompt_cache_control_plane_proxy.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_server_prompt_cache_key_passthrough.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_session_reasoning_persistence_unit.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_sound_effect_seconds_route.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_sse_starlette_pin_unit.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_structured_output_truncation_retry.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_text_only_model_experience.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_timing_helper.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_unload_memory.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_user_scenario_validation.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_voice_host_credentials.py +0 -0
- {abstractcore-2.35.0 → abstractcore-2.35.1}/tests/test_windows_host_fixes.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: abstractcore
|
|
3
|
-
Version: 2.35.
|
|
3
|
+
Version: 2.35.1
|
|
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>
|
|
@@ -36,10 +36,11 @@ Requires-Dist: anthropic<1.0.0,>=0.25.0
|
|
|
36
36
|
Requires-Dist: tiktoken<1.0.0,>=0.5.0
|
|
37
37
|
Requires-Dist: requests<3.0.0,>=2.25.0
|
|
38
38
|
Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0
|
|
39
|
-
Requires-Dist: lxml<
|
|
39
|
+
Requires-Dist: lxml<7.0.0,>=4.9.0
|
|
40
40
|
Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10"
|
|
41
41
|
Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10"
|
|
42
42
|
Requires-Dist: psutil<8,>=5.9
|
|
43
|
+
Requires-Dist: huggingface_hub<2.0.0,>=0.20.0
|
|
43
44
|
Requires-Dist: Pillow<13.0.0,>=10.0.0
|
|
44
45
|
Requires-Dist: pypdf<7.0.0,>=6.0.0
|
|
45
46
|
Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0
|
|
@@ -49,8 +50,8 @@ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0
|
|
|
49
50
|
Requires-Dist: python-multipart<1.0.0,>=0.0.6
|
|
50
51
|
Requires-Dist: sse-starlette<4,>=1.8
|
|
51
52
|
Requires-Dist: cryptography>=41.0.0
|
|
52
|
-
Requires-Dist: abstractvoice>=0.
|
|
53
|
-
Requires-Dist: abstractvision>=0.3.
|
|
53
|
+
Requires-Dist: abstractvoice>=0.21.1
|
|
54
|
+
Requires-Dist: abstractvision>=0.3.36
|
|
54
55
|
Requires-Dist: abstractmusic>=0.1.17; python_version >= "3.10"
|
|
55
56
|
Requires-Dist: abstract3d>=0.3.2; python_version >= "3.10"
|
|
56
57
|
Provides-Extra: apple
|
|
@@ -69,9 +70,9 @@ Requires-Dist: accelerate>=1.0.0; extra == "apple"
|
|
|
69
70
|
Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "apple"
|
|
70
71
|
Requires-Dist: numpy<3.0.0,>=2.1.0; extra == "apple"
|
|
71
72
|
Requires-Dist: Pillow<13.0.0,>=12.1.1; extra == "apple"
|
|
72
|
-
Requires-Dist: abstractvoice[all-apple]>=0.
|
|
73
|
+
Requires-Dist: abstractvoice[all-apple]>=0.21.1; extra == "apple"
|
|
73
74
|
Requires-Dist: omnivoice>=0.1.5; extra == "apple"
|
|
74
|
-
Requires-Dist: abstractvision[all-apple]>=0.3.
|
|
75
|
+
Requires-Dist: abstractvision[all-apple]>=0.3.36; extra == "apple"
|
|
75
76
|
Requires-Dist: abstractmusic[all-apple]>=0.1.17; extra == "apple"
|
|
76
77
|
Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "apple"
|
|
77
78
|
Provides-Extra: gpu
|
|
@@ -87,9 +88,9 @@ Requires-Dist: gguf<1.0.0,>=0.10.0; extra == "gpu"
|
|
|
87
88
|
Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "gpu"
|
|
88
89
|
Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "gpu"
|
|
89
90
|
Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "gpu"
|
|
90
|
-
Requires-Dist: abstractvoice[all-gpu]>=0.
|
|
91
|
+
Requires-Dist: abstractvoice[all-gpu]>=0.21.1; extra == "gpu"
|
|
91
92
|
Requires-Dist: omnivoice>=0.1.5; extra == "gpu"
|
|
92
|
-
Requires-Dist: abstractvision[all-gpu]>=0.3.
|
|
93
|
+
Requires-Dist: abstractvision[all-gpu]>=0.3.36; extra == "gpu"
|
|
93
94
|
Requires-Dist: abstractmusic[all-gpu]>=0.1.17; extra == "gpu"
|
|
94
95
|
Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "gpu"
|
|
95
96
|
Provides-Extra: remote
|
|
@@ -135,11 +136,11 @@ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "embeddings"
|
|
|
135
136
|
Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "embeddings"
|
|
136
137
|
Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "embeddings"
|
|
137
138
|
Provides-Extra: vision-diffusers
|
|
138
|
-
Requires-Dist: abstractvision[huggingface]>=0.3.
|
|
139
|
+
Requires-Dist: abstractvision[huggingface]>=0.3.36; extra == "vision-diffusers"
|
|
139
140
|
Provides-Extra: vision-sdcpp
|
|
140
|
-
Requires-Dist: abstractvision[sdcpp]>=0.3.
|
|
141
|
+
Requires-Dist: abstractvision[sdcpp]>=0.3.36; extra == "vision-sdcpp"
|
|
141
142
|
Provides-Extra: vision-local
|
|
142
|
-
Requires-Dist: abstractvision[local]>=0.3.
|
|
143
|
+
Requires-Dist: abstractvision[local]>=0.3.36; extra == "vision-local"
|
|
143
144
|
Provides-Extra: browser
|
|
144
145
|
Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "browser"
|
|
145
146
|
Provides-Extra: pdf-pymupdf-commercial
|
|
@@ -196,7 +197,7 @@ Dynamic: license-file
|
|
|
196
197
|
Unified LLM Interface
|
|
197
198
|
> Write once, run everywhere
|
|
198
199
|
|
|
199
|
-
What's new in 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#
|
|
200
|
+
What's new in 2.35.1: a plain `pip install "abstractcore[gpu]"` on a Linux NVIDIA machine now runs GGUF models on the GPU (AbstractCore installs llama.cpp's CUDA build itself, once, the first time it is needed). In 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2351---2026-11-10).
|
|
200
201
|
|
|
201
202
|
What's new in 2.34.0: a local model that no call has used for 60 minutes is unloaded from memory and loads
|
|
202
203
|
again on its next call; a model kept loaded (Keep loaded) never is, and no running call is interrupted
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
Unified LLM Interface
|
|
10
10
|
> Write once, run everywhere
|
|
11
11
|
|
|
12
|
-
What's new in 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#
|
|
12
|
+
What's new in 2.35.1: a plain `pip install "abstractcore[gpu]"` on a Linux NVIDIA machine now runs GGUF models on the GPU (AbstractCore installs llama.cpp's CUDA build itself, once, the first time it is needed). In 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2351---2026-11-10).
|
|
13
13
|
|
|
14
14
|
What's new in 2.34.0: a local model that no call has used for 60 minutes is unloaded from memory and loads
|
|
15
15
|
again on its next call; a model kept loaded (Keep loaded) never is, and no running call is interrupted
|
|
@@ -63,7 +63,7 @@ __all__ = [
|
|
|
63
63
|
# AbstractCore's AbstractVoice floor (it has `abstractvoice.engine_runtime`, the
|
|
64
64
|
# public runtime probe, since 0.15.0). Mirrors the abstractvoice pins in
|
|
65
65
|
# pyproject.toml; the release stager raises both together.
|
|
66
|
-
ABSTRACTVOICE_ENGINE_RUNTIME_FLOOR = "0.
|
|
66
|
+
ABSTRACTVOICE_ENGINE_RUNTIME_FLOOR = "0.21.1"
|
|
67
67
|
|
|
68
68
|
# Voice providers that run remotely: AbstractVoice needs nothing beyond its
|
|
69
69
|
# core install for them, and whether they are configured is not a runtime
|
|
@@ -12,7 +12,7 @@ from enum import Enum
|
|
|
12
12
|
from typing import Any, AsyncIterator, Dict, List, Optional
|
|
13
13
|
|
|
14
14
|
import httpx
|
|
15
|
-
from .utils.install_settings import local_engines_hint
|
|
15
|
+
from .utils.install_settings import light_repair_hint, local_engines_hint
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class DownloadStatus(Enum):
|
|
@@ -226,10 +226,8 @@ async def _download_huggingface(
|
|
|
226
226
|
except ImportError:
|
|
227
227
|
yield DownloadProgress(
|
|
228
228
|
status=DownloadStatus.ERROR,
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
f"{local_engines_hint('Downloading Hugging Face models')}"
|
|
232
|
-
),
|
|
229
|
+
# huggingface_hub is part of the light set (2.35.1): missing means a broken install.
|
|
230
|
+
message=f"huggingface_hub is not installed: {light_repair_hint()}",
|
|
233
231
|
)
|
|
234
232
|
return
|
|
235
233
|
|
|
@@ -250,6 +250,35 @@ def _refuse_resident_gguf_embedding(path: Any) -> None:
|
|
|
250
250
|
)
|
|
251
251
|
|
|
252
252
|
|
|
253
|
+
def release_shared_gguf_embeddings_at_exit() -> int:
|
|
254
|
+
"""Close every resident GGUF embedding encoder (llama.cpp) before the interpreter tears modules
|
|
255
|
+
down. Without this, a process that embedded with a GGUF model on Apple silicon aborted at exit
|
|
256
|
+
with ``ggml-metal-device.m: GGML_ASSERT([rsets->data count] == 0)`` (exit code 134) after every
|
|
257
|
+
call had succeeded: the llama.cpp context was freed during module teardown, after the Metal
|
|
258
|
+
device, instead of before it (found on the Mac during the 0.14.0 profile proof, 2.35.1).
|
|
259
|
+
SentenceTransformer models need nothing here. Returns the number of encoders closed."""
|
|
260
|
+
closed = 0
|
|
261
|
+
with _SHARED_EMBEDDING_LOCK:
|
|
262
|
+
entries = list(_SHARED_EMBEDDING_MODELS.values())
|
|
263
|
+
for entry in entries:
|
|
264
|
+
model = entry.model
|
|
265
|
+
close = getattr(model, "close", None)
|
|
266
|
+
if model is None or not callable(close) or not hasattr(model, "_llm"):
|
|
267
|
+
continue
|
|
268
|
+
try:
|
|
269
|
+
close()
|
|
270
|
+
closed += 1
|
|
271
|
+
except Exception:
|
|
272
|
+
pass
|
|
273
|
+
entry.model = None
|
|
274
|
+
return closed
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
# Registered once at import: atexit handlers run before module teardown, in reverse order of
|
|
278
|
+
# registration, so the encoders go first (see release_shared_gguf_embeddings_at_exit).
|
|
279
|
+
atexit.register(release_shared_gguf_embeddings_at_exit)
|
|
280
|
+
|
|
281
|
+
|
|
253
282
|
def _atexit_save_caches(ref: "weakref.ReferenceType") -> None:
|
|
254
283
|
manager = ref()
|
|
255
284
|
if manager is None:
|
|
@@ -1771,6 +1771,8 @@ class HuggingFaceProvider(BaseProvider):
|
|
|
1771
1771
|
"context_reservation": dict(getattr(self, "_context_reservation", None) or {}),
|
|
1772
1772
|
"requested_context": getattr(self, "_gguf_requested_context", None),
|
|
1773
1773
|
"n_gpu_layers": self.n_gpu_layers,
|
|
1774
|
+
# Why GGUF runs where it runs on Linux + NVIDIA (utils/llama_cuda_swap): outcome and reason.
|
|
1775
|
+
"llama_cuda_swap": getattr(self, "gguf_cuda_swap", None),
|
|
1774
1776
|
"max_output_tokens": self.max_output_tokens,
|
|
1775
1777
|
"output_ceiling_source": getattr(self, "_output_ceiling_source", None),
|
|
1776
1778
|
"prompt_cache_store": getattr(self, "_prompt_cache_store", None),
|
|
@@ -7054,6 +7056,21 @@ class HuggingFaceProvider(BaseProvider):
|
|
|
7054
7056
|
# don't need to import PyTorch.
|
|
7055
7057
|
supports_gpu_offload = False
|
|
7056
7058
|
try:
|
|
7059
|
+
# Linux + NVIDIA: an install from PyPI alone carries the processor build of llama.cpp; the
|
|
7060
|
+
# CUDA build is swapped in once per environment before the first import (llama_cuda_swap).
|
|
7061
|
+
from ..utils.llama_cuda_swap import ensure_llama_cpp_cuda_build
|
|
7062
|
+
|
|
7063
|
+
self.gguf_cuda_swap = ensure_llama_cpp_cuda_build()
|
|
7064
|
+
if self.gguf_cuda_swap.get("outcome") == "skipped" and self.gguf_cuda_swap.get("build"):
|
|
7065
|
+
# A driver or card reason (a failed swap announces itself in llama_cuda_swap).
|
|
7066
|
+
from ..utils.llama_cuda_swap import notice
|
|
7067
|
+
|
|
7068
|
+
notice(
|
|
7069
|
+
"GGUF on the processor: llama-cpp-python is the CPU build and the CUDA build was not "
|
|
7070
|
+
f"installed ({self.gguf_cuda_swap.get('reason')}). The one-line installer does it; see "
|
|
7071
|
+
"docs/installation.md."
|
|
7072
|
+
)
|
|
7073
|
+
prepare_llama_cpp_import()
|
|
7057
7074
|
import llama_cpp # type: ignore
|
|
7058
7075
|
|
|
7059
7076
|
if sys.platform == "win32":
|
|
@@ -116,6 +116,11 @@ def light_repair_hint() -> str:
|
|
|
116
116
|
return f"the AbstractCore install is incomplete; repair it with: {LIGHT_INSTALL}"
|
|
117
117
|
|
|
118
118
|
|
|
119
|
+
LLAMA_CPP_LINUX_NOTE = (
|
|
120
|
+
"llama.cpp has no prebuilt wheel on PyPI; the AbstractCore installer adds the right build for this "
|
|
121
|
+
"machine (curl -LsSf https://abstractframework.ai/core/install.sh | sh), and "
|
|
122
|
+
+ GPU_INSTALL + " alone builds it from source (needs a C compiler)"
|
|
123
|
+
)
|
|
119
124
|
LLAMA_CPP_WINDOWS_NOTE = (
|
|
120
125
|
"on Windows the AbstractFramework installer adds llama.cpp's prebuilt GPU build; with plain pip, "
|
|
121
126
|
"llama.cpp is not part of abstractcore[gpu] on Windows"
|
|
@@ -137,4 +142,12 @@ def llama_cpp_hint(what: str = "GGUF models (llama.cpp)") -> str:
|
|
|
137
142
|
|
|
138
143
|
if sys.platform == "win32" and local_engines_setting() == "gpu":
|
|
139
144
|
return f"{what}: {LLAMA_CPP_WINDOWS_NOTE}"
|
|
145
|
+
if sys.platform.startswith("linux") and local_engines_setting() == "gpu":
|
|
146
|
+
# PyPI has llama-cpp-python as a source build only: `abstractcore[gpu]` compiles it (a C
|
|
147
|
+
# compiler and, for CUDA, the toolkit), while the installer adds the prebuilt wheel for this
|
|
148
|
+
# machine (CPU, or CUDA swapped in by AbstractCore itself; utils/llama_cuda_swap). Found on a
|
|
149
|
+
# processor-only Linux host during the 0.14.0 profile proof (2.35.1).
|
|
150
|
+
return (
|
|
151
|
+
f"{what}: {LLAMA_CPP_LINUX_NOTE}"
|
|
152
|
+
)
|
|
140
153
|
return local_engines_hint(what)
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""Give a plain ``pip install "abstractcore[gpu]"`` the CUDA build of llama.cpp on an NVIDIA Linux host.
|
|
2
|
+
|
|
3
|
+
The requirement (operator, 2026-11-10): the ``gpu`` install must work fully on a GPU machine, GGUF models
|
|
4
|
+
included. PyPI carries ``llama-cpp-python`` as a source build only, so pip resolves abetlen's prebuilt
|
|
5
|
+
*processor* wheel (``llama_supports_gpu_offload()`` is False) and every GGUF model runs on the CPU
|
|
6
|
+
although PyTorch sees the card. The prebuilt CUDA builds live on abetlen's own index
|
|
7
|
+
(https://abetlen.github.io/llama-cpp-python/whl/<build>/), which a pip extra cannot name, and they are
|
|
8
|
+
400 to 600 MB each, above PyPI's file limit, so they cannot be re-hosted there either.
|
|
9
|
+
|
|
10
|
+
The one-line installers already swap the CUDA build in after the install (``scripts/install.sh``,
|
|
11
|
+
the framework installer). This module does the same swap from inside the package, once per
|
|
12
|
+
environment, the first time AbstractCore is about to import ``llama_cpp`` on a host where it would
|
|
13
|
+
otherwise run GGUF on the processor:
|
|
14
|
+
|
|
15
|
+
1. Linux x86_64 only (the CUDA pages carry ``manylinux_2_35_x86_64`` wheels alone), opt-out with
|
|
16
|
+
``ABSTRACTCORE_LLAMA_CUDA_SWAP=0``.
|
|
17
|
+
2. The installed ``llama_cpp`` is a CUDA build already (``lib/libggml-cuda.so``, the way the installers
|
|
18
|
+
leave it): nothing to do, no pip call. This is the common case on a host set up by the one-liners.
|
|
19
|
+
3. PyTorch's CUDA major is read from ``torch/version.py`` on disk (torch is never imported here) and the
|
|
20
|
+
NVIDIA driver from ``nvidia-smi``: CUDA 13 wants driver 580 or newer (build ``cu130``), CUDA 12 wants
|
|
21
|
+
525 or newer (``cu125``). Without a CUDA torch, a driver, or with one too old, the processor build
|
|
22
|
+
stays and the reason is recorded.
|
|
23
|
+
4. The swap is the installers' command: ``pip install --no-index --no-deps --force-reinstall
|
|
24
|
+
--find-links <index>/<build>/llama-cpp-python/ llama-cpp-python==<installed version>`` (``uv pip``
|
|
25
|
+
with ``--reinstall-package`` when the environment has no pip, as uv venvs do). Same version, same
|
|
26
|
+
files the installer would have written. One loud log line before and after.
|
|
27
|
+
5. The outcome is written next to the package (``site-packages/llama_cpp/.abstractcore-cuda-swap.json``)
|
|
28
|
+
so a failed swap (offline host, read-only site-packages) is not retried at every model load; a
|
|
29
|
+
reinstall of llama-cpp-python removes the marker with the folder and the check runs again.
|
|
30
|
+
|
|
31
|
+
`ensure_llama_cpp_cuda_build()` returns a dict (``outcome``, ``reason``, ``build``, ``version``) that the
|
|
32
|
+
HuggingFace provider records in its runtime info, so a user whose GGUF model still runs on the processor
|
|
33
|
+
reads why in the first answer. When ``llama_cpp`` was already imported in this process (the processor
|
|
34
|
+
library is loaded), the swap still happens on disk and the outcome says the next process gets the GPU.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
from __future__ import annotations
|
|
38
|
+
|
|
39
|
+
import importlib.metadata
|
|
40
|
+
import importlib.util
|
|
41
|
+
import json
|
|
42
|
+
import logging
|
|
43
|
+
import os
|
|
44
|
+
import platform
|
|
45
|
+
import re
|
|
46
|
+
import shutil
|
|
47
|
+
import subprocess
|
|
48
|
+
import sys
|
|
49
|
+
import time
|
|
50
|
+
from pathlib import Path
|
|
51
|
+
from typing import Any, Dict, List, Optional
|
|
52
|
+
|
|
53
|
+
logger = logging.getLogger(__name__)
|
|
54
|
+
|
|
55
|
+
INDEX = "https://abetlen.github.io/llama-cpp-python/whl"
|
|
56
|
+
# CUDA major of the installed torch -> (llama.cpp build folder, minimum NVIDIA driver major).
|
|
57
|
+
BUILDS: Dict[int, tuple] = {13: ("cu130", 580), 12: ("cu125", 525)}
|
|
58
|
+
ENV_OPT_OUT = "ABSTRACTCORE_LLAMA_CUDA_SWAP"
|
|
59
|
+
MARKER_NAME = ".abstractcore-cuda-swap.json"
|
|
60
|
+
SWAP_TIMEOUT_S = 900
|
|
61
|
+
|
|
62
|
+
_result: Optional[Dict[str, Any]] = None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _package_dir(name: str) -> Optional[Path]:
|
|
66
|
+
try:
|
|
67
|
+
spec = importlib.util.find_spec(name)
|
|
68
|
+
except Exception:
|
|
69
|
+
return None
|
|
70
|
+
if spec is None:
|
|
71
|
+
return None
|
|
72
|
+
locations = list(spec.submodule_search_locations or [])
|
|
73
|
+
if not locations and spec.origin:
|
|
74
|
+
locations = [str(Path(spec.origin).parent)]
|
|
75
|
+
return Path(locations[0]) if locations else None
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def llama_cpp_is_cuda_build() -> bool:
|
|
79
|
+
"""True when the installed llama-cpp-python ships its CUDA backend. Never imports llama_cpp."""
|
|
80
|
+
pkg = _package_dir("llama_cpp")
|
|
81
|
+
if pkg is None:
|
|
82
|
+
return False
|
|
83
|
+
lib = pkg / "lib"
|
|
84
|
+
return lib.is_dir() and any(lib.glob("libggml-cuda.so*"))
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def torch_cuda_major() -> Optional[int]:
|
|
88
|
+
"""The CUDA major of the installed torch wheel, read from ``torch/version.py`` (``cuda = '13.0'``);
|
|
89
|
+
None without torch or for a processor/ROCm build. torch is never imported."""
|
|
90
|
+
pkg = _package_dir("torch")
|
|
91
|
+
if pkg is None:
|
|
92
|
+
return None
|
|
93
|
+
try:
|
|
94
|
+
text = (pkg / "version.py").read_text(encoding="utf-8", errors="replace")
|
|
95
|
+
except OSError:
|
|
96
|
+
return None
|
|
97
|
+
# torch <= 2.12: `cuda = '13.0'`; torch 2.13: `cuda: Optional[str] = '13.0'` (annotated).
|
|
98
|
+
match = re.search(r"^cuda\s*(?::[^=\n]*)?=\s*['\"](\d+)\.(\d+)['\"]", text, re.MULTILINE)
|
|
99
|
+
return int(match.group(1)) if match else None
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def nvidia_driver_major() -> Optional[int]:
|
|
103
|
+
"""The NVIDIA driver's major version from ``nvidia-smi``; None when no driver answers."""
|
|
104
|
+
exe = shutil.which("nvidia-smi")
|
|
105
|
+
if not exe:
|
|
106
|
+
return None
|
|
107
|
+
try:
|
|
108
|
+
out = subprocess.run([exe, "--query-gpu=driver_version", "--format=csv,noheader"],
|
|
109
|
+
capture_output=True, text=True, timeout=10)
|
|
110
|
+
except (OSError, subprocess.SubprocessError):
|
|
111
|
+
return None
|
|
112
|
+
if out.returncode != 0:
|
|
113
|
+
return None
|
|
114
|
+
first = (out.stdout or "").strip().splitlines()
|
|
115
|
+
if not first:
|
|
116
|
+
return None
|
|
117
|
+
head = first[0].strip().split(".")[0]
|
|
118
|
+
return int(head) if head.isdigit() else None
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def installed_version() -> Optional[str]:
|
|
122
|
+
try:
|
|
123
|
+
return importlib.metadata.version("llama-cpp-python")
|
|
124
|
+
except importlib.metadata.PackageNotFoundError:
|
|
125
|
+
return None
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def marker_path() -> Optional[Path]:
|
|
129
|
+
pkg = _package_dir("llama_cpp")
|
|
130
|
+
return (pkg / MARKER_NAME) if pkg is not None else None
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _read_marker() -> Optional[Dict[str, Any]]:
|
|
134
|
+
path = marker_path()
|
|
135
|
+
if path is None or not path.is_file():
|
|
136
|
+
return None
|
|
137
|
+
try:
|
|
138
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
139
|
+
except (OSError, ValueError):
|
|
140
|
+
return None
|
|
141
|
+
return data if isinstance(data, dict) else None
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _write_marker(data: Dict[str, Any]) -> None:
|
|
145
|
+
path = marker_path()
|
|
146
|
+
if path is None:
|
|
147
|
+
return
|
|
148
|
+
try:
|
|
149
|
+
path.write_text(json.dumps(data, indent=1, sort_keys=True), encoding="utf-8")
|
|
150
|
+
except OSError as exc:
|
|
151
|
+
logger.debug("could not write %s: %s", path, exc)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def swap_command(build: str, version: str) -> Optional[List[str]]:
|
|
155
|
+
"""The installers' swap for this interpreter: pip when the environment has it, else ``uv pip``
|
|
156
|
+
(uv venvs carry no pip). None when neither is available."""
|
|
157
|
+
links = f"{INDEX}/{build}/llama-cpp-python/"
|
|
158
|
+
requirement = f"llama-cpp-python=={version}"
|
|
159
|
+
if importlib.util.find_spec("pip") is not None:
|
|
160
|
+
return [sys.executable, "-m", "pip", "install", "--no-index", "--no-deps", "--force-reinstall",
|
|
161
|
+
"--find-links", links, requirement]
|
|
162
|
+
uv = shutil.which("uv")
|
|
163
|
+
if uv:
|
|
164
|
+
return [uv, "pip", "install", "--python", sys.executable, "--no-index", "--no-deps",
|
|
165
|
+
"--reinstall-package", "llama-cpp-python", "--find-links", links, requirement]
|
|
166
|
+
return None
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def run_swap(command: List[str]) -> subprocess.CompletedProcess:
|
|
170
|
+
"""Run the swap command (separate so tests replace it)."""
|
|
171
|
+
return subprocess.run(command, capture_output=True, text=True, timeout=SWAP_TIMEOUT_S)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def notice(message: str) -> None:
|
|
175
|
+
"""One line on stderr AND in the log: AbstractCore's console log level is ERROR by default, so a
|
|
176
|
+
`logger.warning` alone never reaches a user; a download of several hundred MB inside
|
|
177
|
+
`create_llm` must be announced where the user is looking."""
|
|
178
|
+
try:
|
|
179
|
+
sys.stderr.write(f"AbstractCore: {message}\n")
|
|
180
|
+
sys.stderr.flush()
|
|
181
|
+
except Exception:
|
|
182
|
+
pass
|
|
183
|
+
logger.warning("AbstractCore: %s", message)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _outcome(outcome: str, reason: str = "", **extra: Any) -> Dict[str, Any]:
|
|
187
|
+
data: Dict[str, Any] = {"outcome": outcome, "reason": reason}
|
|
188
|
+
data.update(extra)
|
|
189
|
+
return data
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def ensure_llama_cpp_cuda_build() -> Dict[str, Any]:
|
|
193
|
+
"""Make sure llama.cpp is its CUDA build on an NVIDIA Linux host before AbstractCore imports it.
|
|
194
|
+
|
|
195
|
+
Returns the outcome (cached for the process):
|
|
196
|
+
``cuda-build-present`` (nothing done), ``swapped`` (the CUDA build is now installed),
|
|
197
|
+
``swapped-restart-needed`` (installed, but this process already loaded the processor build),
|
|
198
|
+
``failed`` (the swap ran and did not deliver; ``reason`` says why; not retried until
|
|
199
|
+
llama-cpp-python is reinstalled), ``skipped`` (not applicable here; ``reason`` says why)."""
|
|
200
|
+
global _result
|
|
201
|
+
if _result is not None:
|
|
202
|
+
return dict(_result)
|
|
203
|
+
_result = _decide_and_swap()
|
|
204
|
+
return dict(_result)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _decide_and_swap() -> Dict[str, Any]:
|
|
208
|
+
if not sys.platform.startswith("linux"):
|
|
209
|
+
return _outcome("skipped", "not Linux")
|
|
210
|
+
if platform.machine().lower() not in {"x86_64", "amd64"}:
|
|
211
|
+
return _outcome("skipped", f"no prebuilt CUDA llama.cpp for {platform.machine()} (x86_64 only)")
|
|
212
|
+
if os.environ.get(ENV_OPT_OUT, "").strip() == "0":
|
|
213
|
+
return _outcome("skipped", f"{ENV_OPT_OUT}=0")
|
|
214
|
+
version = installed_version()
|
|
215
|
+
if version is None or _package_dir("llama_cpp") is None:
|
|
216
|
+
return _outcome("skipped", "llama-cpp-python is not installed")
|
|
217
|
+
if llama_cpp_is_cuda_build():
|
|
218
|
+
return _outcome("cuda-build-present", "", version=version)
|
|
219
|
+
marker = _read_marker()
|
|
220
|
+
if marker and marker.get("version") == version and marker.get("outcome") in {"failed", "swapped"}:
|
|
221
|
+
# "swapped" with a processor build on disk means someone reinstalled the CPU wheel over it
|
|
222
|
+
# without removing the marker (pip keeps unknown files in the folder): run again.
|
|
223
|
+
if marker.get("outcome") == "failed":
|
|
224
|
+
return dict(marker)
|
|
225
|
+
major = torch_cuda_major()
|
|
226
|
+
if major is None:
|
|
227
|
+
return _outcome("skipped", "PyTorch has no CUDA build here", version=version)
|
|
228
|
+
if major not in BUILDS:
|
|
229
|
+
return _outcome("skipped", f"no prebuilt llama.cpp build for CUDA {major}", version=version)
|
|
230
|
+
build, floor = BUILDS[major]
|
|
231
|
+
driver = nvidia_driver_major()
|
|
232
|
+
if driver is None:
|
|
233
|
+
return _outcome("skipped", "no NVIDIA driver answers (nvidia-smi)", version=version, build=build)
|
|
234
|
+
if driver < floor:
|
|
235
|
+
return _outcome("skipped", f"PyTorch uses CUDA {major}, which needs NVIDIA driver {floor} or newer "
|
|
236
|
+
f"(this one is {driver})", version=version, build=build)
|
|
237
|
+
command = swap_command(build, version)
|
|
238
|
+
if command is None:
|
|
239
|
+
data = _outcome("failed", "neither pip nor uv is available to install the CUDA build",
|
|
240
|
+
version=version, build=build)
|
|
241
|
+
_write_marker(data)
|
|
242
|
+
return data
|
|
243
|
+
already_loaded = "llama_cpp" in sys.modules
|
|
244
|
+
notice(
|
|
245
|
+
f"llama-cpp-python {version} here is the processor build and this machine has an NVIDIA card "
|
|
246
|
+
f"(CUDA {major} torch, driver {driver}): installing its CUDA build ({build}) from {INDEX} so GGUF "
|
|
247
|
+
f"models run on the GPU; one-time, a few hundred MB. Set {ENV_OPT_OUT}=0 to keep the processor build."
|
|
248
|
+
)
|
|
249
|
+
started = time.time()
|
|
250
|
+
try:
|
|
251
|
+
proc = run_swap(command)
|
|
252
|
+
except (OSError, subprocess.SubprocessError) as exc:
|
|
253
|
+
data = _outcome("failed", f"the swap command did not run: {exc}", version=version, build=build,
|
|
254
|
+
command=" ".join(command))
|
|
255
|
+
_write_marker(data)
|
|
256
|
+
notice(f"llama.cpp CUDA build not installed: {data['reason']}. GGUF models stay on the processor; the "
|
|
257
|
+
"one-line installer does this step too (docs/installation.md).")
|
|
258
|
+
return data
|
|
259
|
+
tail = ((proc.stdout or "") + (proc.stderr or "")).strip().splitlines()[-6:]
|
|
260
|
+
if proc.returncode != 0 or not llama_cpp_is_cuda_build():
|
|
261
|
+
why = (f"exit {proc.returncode}" if proc.returncode != 0 else
|
|
262
|
+
"the command succeeded but the installed files are not a CUDA build")
|
|
263
|
+
data = _outcome("failed", f"{why}: {' | '.join(tail)[:600]}", version=version, build=build,
|
|
264
|
+
command=" ".join(command), seconds=round(time.time() - started, 1))
|
|
265
|
+
_write_marker(data)
|
|
266
|
+
notice(f"llama.cpp CUDA build not installed ({data['reason']}); GGUF models stay on the processor. "
|
|
267
|
+
"The one-line installer does this step too: see docs/installation.md.")
|
|
268
|
+
return data
|
|
269
|
+
data = _outcome("swapped-restart-needed" if already_loaded else "swapped", "", version=version, build=build,
|
|
270
|
+
command=" ".join(command), seconds=round(time.time() - started, 1))
|
|
271
|
+
_write_marker(data)
|
|
272
|
+
if already_loaded:
|
|
273
|
+
notice(f"llama.cpp CUDA build {build} installed in {data['seconds']:.0f} s; this process had already loaded "
|
|
274
|
+
"the processor build, the next one runs GGUF models on the GPU.")
|
|
275
|
+
else:
|
|
276
|
+
notice(f"llama.cpp CUDA build {build} installed in {data['seconds']:.0f} s; GGUF models run on the GPU.")
|
|
277
|
+
return data
|
|
@@ -146,7 +146,15 @@ def prepare_llama_cpp_import() -> List[str]:
|
|
|
146
146
|
if folder not in entries:
|
|
147
147
|
os.environ["PATH"] = folder + (os.pathsep + os.environ["PATH"] if os.environ.get("PATH") else "")
|
|
148
148
|
added.append(folder)
|
|
149
|
-
elif sys.platform.startswith("linux")
|
|
149
|
+
elif sys.platform.startswith("linux"):
|
|
150
|
+
# A plain `pip install abstractcore[gpu]` leaves the processor build of llama.cpp on an NVIDIA
|
|
151
|
+
# host (PyPI has no CUDA build); swap the CUDA build in first, once per environment.
|
|
152
|
+
from .llama_cuda_swap import ensure_llama_cpp_cuda_build
|
|
153
|
+
|
|
154
|
+
ensure_llama_cpp_cuda_build()
|
|
155
|
+
if not llama_cpp_is_cuda_build():
|
|
156
|
+
_prepared = added
|
|
157
|
+
return list(added)
|
|
150
158
|
for library in linux_nvidia_cuda_libraries():
|
|
151
159
|
try:
|
|
152
160
|
_handles.append(ctypes.CDLL(str(library), mode=getattr(ctypes, "RTLD_GLOBAL", 0)))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: abstractcore
|
|
3
|
-
Version: 2.35.
|
|
3
|
+
Version: 2.35.1
|
|
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>
|
|
@@ -36,10 +36,11 @@ Requires-Dist: anthropic<1.0.0,>=0.25.0
|
|
|
36
36
|
Requires-Dist: tiktoken<1.0.0,>=0.5.0
|
|
37
37
|
Requires-Dist: requests<3.0.0,>=2.25.0
|
|
38
38
|
Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0
|
|
39
|
-
Requires-Dist: lxml<
|
|
39
|
+
Requires-Dist: lxml<7.0.0,>=4.9.0
|
|
40
40
|
Requires-Dist: ddgs<10.0.0,>=9.10.0; python_version >= "3.10"
|
|
41
41
|
Requires-Dist: duckduckgo-search<4.0.0,>=3.8.0; python_version < "3.10"
|
|
42
42
|
Requires-Dist: psutil<8,>=5.9
|
|
43
|
+
Requires-Dist: huggingface_hub<2.0.0,>=0.20.0
|
|
43
44
|
Requires-Dist: Pillow<13.0.0,>=10.0.0
|
|
44
45
|
Requires-Dist: pypdf<7.0.0,>=6.0.0
|
|
45
46
|
Requires-Dist: unstructured[docx,odt,pptx,rtf,xlsx]<1.0.0,>=0.10.0
|
|
@@ -49,8 +50,8 @@ Requires-Dist: uvicorn[standard]<1.0.0,>=0.23.0
|
|
|
49
50
|
Requires-Dist: python-multipart<1.0.0,>=0.0.6
|
|
50
51
|
Requires-Dist: sse-starlette<4,>=1.8
|
|
51
52
|
Requires-Dist: cryptography>=41.0.0
|
|
52
|
-
Requires-Dist: abstractvoice>=0.
|
|
53
|
-
Requires-Dist: abstractvision>=0.3.
|
|
53
|
+
Requires-Dist: abstractvoice>=0.21.1
|
|
54
|
+
Requires-Dist: abstractvision>=0.3.36
|
|
54
55
|
Requires-Dist: abstractmusic>=0.1.17; python_version >= "3.10"
|
|
55
56
|
Requires-Dist: abstract3d>=0.3.2; python_version >= "3.10"
|
|
56
57
|
Provides-Extra: apple
|
|
@@ -69,9 +70,9 @@ Requires-Dist: accelerate>=1.0.0; extra == "apple"
|
|
|
69
70
|
Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "apple"
|
|
70
71
|
Requires-Dist: numpy<3.0.0,>=2.1.0; extra == "apple"
|
|
71
72
|
Requires-Dist: Pillow<13.0.0,>=12.1.1; extra == "apple"
|
|
72
|
-
Requires-Dist: abstractvoice[all-apple]>=0.
|
|
73
|
+
Requires-Dist: abstractvoice[all-apple]>=0.21.1; extra == "apple"
|
|
73
74
|
Requires-Dist: omnivoice>=0.1.5; extra == "apple"
|
|
74
|
-
Requires-Dist: abstractvision[all-apple]>=0.3.
|
|
75
|
+
Requires-Dist: abstractvision[all-apple]>=0.3.36; extra == "apple"
|
|
75
76
|
Requires-Dist: abstractmusic[all-apple]>=0.1.17; extra == "apple"
|
|
76
77
|
Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "apple"
|
|
77
78
|
Provides-Extra: gpu
|
|
@@ -87,9 +88,9 @@ Requires-Dist: gguf<1.0.0,>=0.10.0; extra == "gpu"
|
|
|
87
88
|
Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "gpu"
|
|
88
89
|
Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "gpu"
|
|
89
90
|
Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "gpu"
|
|
90
|
-
Requires-Dist: abstractvoice[all-gpu]>=0.
|
|
91
|
+
Requires-Dist: abstractvoice[all-gpu]>=0.21.1; extra == "gpu"
|
|
91
92
|
Requires-Dist: omnivoice>=0.1.5; extra == "gpu"
|
|
92
|
-
Requires-Dist: abstractvision[all-gpu]>=0.3.
|
|
93
|
+
Requires-Dist: abstractvision[all-gpu]>=0.3.36; extra == "gpu"
|
|
93
94
|
Requires-Dist: abstractmusic[all-gpu]>=0.1.17; extra == "gpu"
|
|
94
95
|
Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "gpu"
|
|
95
96
|
Provides-Extra: remote
|
|
@@ -135,11 +136,11 @@ Requires-Dist: sentence-transformers<6.0.0,>=5.1.0; extra == "embeddings"
|
|
|
135
136
|
Requires-Dist: numpy<3.0.0,>=1.20.0; python_version < "3.13" and extra == "embeddings"
|
|
136
137
|
Requires-Dist: numpy<3.0.0,>=2.1.0; python_version >= "3.13" and extra == "embeddings"
|
|
137
138
|
Provides-Extra: vision-diffusers
|
|
138
|
-
Requires-Dist: abstractvision[huggingface]>=0.3.
|
|
139
|
+
Requires-Dist: abstractvision[huggingface]>=0.3.36; extra == "vision-diffusers"
|
|
139
140
|
Provides-Extra: vision-sdcpp
|
|
140
|
-
Requires-Dist: abstractvision[sdcpp]>=0.3.
|
|
141
|
+
Requires-Dist: abstractvision[sdcpp]>=0.3.36; extra == "vision-sdcpp"
|
|
141
142
|
Provides-Extra: vision-local
|
|
142
|
-
Requires-Dist: abstractvision[local]>=0.3.
|
|
143
|
+
Requires-Dist: abstractvision[local]>=0.3.36; extra == "vision-local"
|
|
143
144
|
Provides-Extra: browser
|
|
144
145
|
Requires-Dist: playwright<2.0.0,>=1.49.0; extra == "browser"
|
|
145
146
|
Provides-Extra: pdf-pymupdf-commercial
|
|
@@ -196,7 +197,7 @@ Dynamic: license-file
|
|
|
196
197
|
Unified LLM Interface
|
|
197
198
|
> Write once, run everywhere
|
|
198
199
|
|
|
199
|
-
What's new in 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#
|
|
200
|
+
What's new in 2.35.1: a plain `pip install "abstractcore[gpu]"` on a Linux NVIDIA machine now runs GGUF models on the GPU (AbstractCore installs llama.cpp's CUDA build itself, once, the first time it is needed). In 2.35.0: the model capability registry covers the current vendor lineups (GPT-6 and GPT-6.1, Claude 5.5 and Fable 5.1, Grok 4.3 to 4.7, Qwen 3.8, DeepSeek V4.1 Flash, GLM 5.3, MiniMax M3.1 Flash, Kimi K3 and K3.1 Pro, LFM3, Spark X2.5/X2.6, Nemotron 3.5, Bonsai 2 and more), so an image, video or voice route can name them; and a GGUF or MLX re-packaging of a registered model (`unsloth/...-GGUF:Q4_K_M`, `mlx-community/...-4bit`, bartowski's `Org_Model-GGUF`) resolves to that model's entry instead of the text-only default. Transcriptions report `language` and `detected_language`. See the [changelog](CHANGELOG.md#2351---2026-11-10).
|
|
200
201
|
|
|
201
202
|
What's new in 2.34.0: a local model that no call has used for 60 minutes is unloaded from memory and loads
|
|
202
203
|
again on its next call; a model kept loaded (Keep loaded) never is, and no running call is interrupted
|
|
@@ -279,6 +279,7 @@ abstractcore/utils/identity.py
|
|
|
279
279
|
abstractcore/utils/install_settings.py
|
|
280
280
|
abstractcore/utils/jsonish.py
|
|
281
281
|
abstractcore/utils/kv_geometry.py
|
|
282
|
+
abstractcore/utils/llama_cuda_swap.py
|
|
282
283
|
abstractcore/utils/memory.py
|
|
283
284
|
abstractcore/utils/message_preprocessor.py
|
|
284
285
|
abstractcore/utils/model_cache.py
|