AbstractRuntime 0.4.24__tar.gz → 0.4.25__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.
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/CHANGELOG.md +14 -1
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/PKG-INFO +11 -11
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/README.md +3 -3
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/api.md +1 -1
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/getting-started.md +1 -1
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/integrations/abstractcore.md +2 -2
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/troubleshooting.md +1 -1
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/llms-full.txt +3 -3
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/llms.txt +3 -3
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/pyproject.toml +8 -8
- abstractruntime-0.4.25/release-notes.md +9 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +5 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/llm_client.py +39 -7
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/artifacts.py +12 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_artifacts.py +20 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_media_artifact_resolution.py +33 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_model_residency_control_plane.py +4 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_media_nodes.py +17 -1
- abstractruntime-0.4.24/release-notes.md +0 -11
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/.gitignore +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/LICENSE +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/ROADMAP.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/SECURITY.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/README.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/architecture.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/README.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/evidence.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/faq.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/limits.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/manual_testing.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/proposal.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/provenance.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/snapshots.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/tools-comms.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/emails.config.example.yaml +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/examples/README.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/mkdocs.yml +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/pytest.ini +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/README.md +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/conftest.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_command_store.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_offloading.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.25] - 2026-05-29
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- File-backed artifact stores now expose `content_path(...)` for hosts that need a stable local path while in-memory stores continue to return `None`.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.30` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core media/plugin floors and image-to-image residency truth.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- Artifact-backed media resolution now preserves image roles such as `source` and `mask`, keeping image-edit and image-to-video requests wired correctly through AbstractCore.
|
|
20
|
+
- Model-residency discovery now treats `image_to_image` as its own vision task and deduplicates shared loaded-model records when task is omitted.
|
|
21
|
+
|
|
10
22
|
## [0.4.24] - 2026-05-26
|
|
11
23
|
|
|
12
24
|
### Added
|
|
@@ -558,7 +570,8 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
|
|
|
558
570
|
|
|
559
571
|
Initial development version with basic proof-of-concept features.
|
|
560
572
|
|
|
561
|
-
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.
|
|
573
|
+
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.25...HEAD
|
|
574
|
+
[0.4.25]: https://github.com/lpalbou/abstractruntime/compare/v0.4.24...v0.4.25
|
|
562
575
|
[0.4.24]: https://github.com/lpalbou/abstractruntime/compare/v0.4.23...v0.4.24
|
|
563
576
|
[0.4.23]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...v0.4.23
|
|
564
577
|
[0.4.22]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...v0.4.22
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.25
|
|
4
4
|
Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
|
|
5
5
|
Project-URL: AbstractCore (website), https://www.abstractcore.ai/
|
|
6
6
|
Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
|
|
@@ -23,24 +23,24 @@ Requires-Python: >=3.10
|
|
|
23
23
|
Requires-Dist: abstractmemory>=0.2.6
|
|
24
24
|
Requires-Dist: abstractsemantics>=0.0.3
|
|
25
25
|
Provides-Extra: abstractcore
|
|
26
|
-
Requires-Dist: abstractcore>=2.13.
|
|
26
|
+
Requires-Dist: abstractcore>=2.13.30; extra == 'abstractcore'
|
|
27
27
|
Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'abstractcore'
|
|
28
28
|
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'abstractcore'
|
|
29
29
|
Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'abstractcore'
|
|
30
30
|
Provides-Extra: all-apple
|
|
31
|
-
Requires-Dist: abstractcore[all-apple]>=2.13.
|
|
31
|
+
Requires-Dist: abstractcore[all-apple]>=2.13.30; extra == 'all-apple'
|
|
32
32
|
Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'all-apple'
|
|
33
33
|
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'all-apple'
|
|
34
34
|
Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'all-apple'
|
|
35
35
|
Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'all-apple'
|
|
36
36
|
Provides-Extra: all-gpu
|
|
37
|
-
Requires-Dist: abstractcore[all-gpu]>=2.13.
|
|
37
|
+
Requires-Dist: abstractcore[all-gpu]>=2.13.30; extra == 'all-gpu'
|
|
38
38
|
Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'all-gpu'
|
|
39
39
|
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'all-gpu'
|
|
40
40
|
Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'all-gpu'
|
|
41
41
|
Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'all-gpu'
|
|
42
42
|
Provides-Extra: apple
|
|
43
|
-
Requires-Dist: abstractcore[apple]>=2.13.
|
|
43
|
+
Requires-Dist: abstractcore[apple]>=2.13.30; extra == 'apple'
|
|
44
44
|
Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'apple'
|
|
45
45
|
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'apple'
|
|
46
46
|
Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'apple'
|
|
@@ -50,18 +50,18 @@ Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
|
|
|
50
50
|
Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
|
|
51
51
|
Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
|
|
52
52
|
Provides-Extra: gpu
|
|
53
|
-
Requires-Dist: abstractcore[gpu]>=2.13.
|
|
53
|
+
Requires-Dist: abstractcore[gpu]>=2.13.30; extra == 'gpu'
|
|
54
54
|
Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'gpu'
|
|
55
55
|
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'gpu'
|
|
56
56
|
Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'gpu'
|
|
57
57
|
Requires-Dist: setuptools<82.0.0,>=80.10.2; extra == 'gpu'
|
|
58
58
|
Provides-Extra: mcp-worker
|
|
59
|
-
Requires-Dist: abstractcore[tools]>=2.13.
|
|
59
|
+
Requires-Dist: abstractcore[tools]>=2.13.30; extra == 'mcp-worker'
|
|
60
60
|
Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'mcp-worker'
|
|
61
61
|
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'mcp-worker'
|
|
62
62
|
Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'mcp-worker'
|
|
63
63
|
Provides-Extra: multimodal
|
|
64
|
-
Requires-Dist: abstractcore[audio,music,remote,vision,voice]>=2.13.
|
|
64
|
+
Requires-Dist: abstractcore[audio,music,remote,vision,voice]>=2.13.30; extra == 'multimodal'
|
|
65
65
|
Requires-Dist: anyio<5.0.0,>=4.12.1; extra == 'multimodal'
|
|
66
66
|
Requires-Dist: httpx<1.0.0,>=0.28.1; extra == 'multimodal'
|
|
67
67
|
Requires-Dist: openai<2.0.0,>=1.109.1; extra == 'multimodal'
|
|
@@ -81,7 +81,7 @@ Description-Content-Type: text/markdown
|
|
|
81
81
|
|
|
82
82
|
It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
|
|
83
83
|
|
|
84
|
-
**Version:** 0.4.
|
|
84
|
+
**Version:** 0.4.25 • **Python:** 3.10+
|
|
85
85
|
|
|
86
86
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
87
87
|
|
|
@@ -115,7 +115,7 @@ AbstractCore integration (LLM + tools):
|
|
|
115
115
|
pip install "abstractruntime[abstractcore]"
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
The `abstractcore` extra installs AbstractCore 2.13.
|
|
118
|
+
The `abstractcore` extra installs AbstractCore 2.13.30 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/video/TTS/STT, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
|
|
119
119
|
|
|
120
120
|
Hardware profile cascades are available for native Python installs:
|
|
121
121
|
`abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
|
|
@@ -169,7 +169,7 @@ state = rt.resume(
|
|
|
169
169
|
assert state.status.value == "completed"
|
|
170
170
|
```
|
|
171
171
|
|
|
172
|
-
## What’s included (v0.4.
|
|
172
|
+
## What’s included (v0.4.25)
|
|
173
173
|
|
|
174
174
|
Kernel (dependency-light):
|
|
175
175
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
It is designed for long-running workflows that must survive restarts and explicitly model blocking (human input, timers, external events, subworkflows) without keeping Python stacks alive.
|
|
6
6
|
|
|
7
|
-
**Version:** 0.4.
|
|
7
|
+
**Version:** 0.4.25 • **Python:** 3.10+
|
|
8
8
|
|
|
9
9
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
10
10
|
|
|
@@ -38,7 +38,7 @@ AbstractCore integration (LLM + tools):
|
|
|
38
38
|
pip install "abstractruntime[abstractcore]"
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
The `abstractcore` extra installs AbstractCore 2.13.
|
|
41
|
+
The `abstractcore` extra installs AbstractCore 2.13.30 or newer so the hardened server auth model, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings, lifecycle operations, public output-selector contract, async/sync text-generation output-selector parity, task-aware model residency for text/image/video/TTS/STT, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery remain aligned. Use `abstractruntime[multimodal]` when you need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
|
|
42
42
|
|
|
43
43
|
Hardware profile cascades are available for native Python installs:
|
|
44
44
|
`abstractruntime[apple]`, `abstractruntime[gpu]`, `abstractruntime[all-apple]`,
|
|
@@ -92,7 +92,7 @@ state = rt.resume(
|
|
|
92
92
|
assert state.status.value == "completed"
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
## What’s included (v0.4.
|
|
95
|
+
## What’s included (v0.4.25)
|
|
96
96
|
|
|
97
97
|
Kernel (dependency-light):
|
|
98
98
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -180,7 +180,7 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
|
|
|
180
180
|
|
|
181
181
|
### AbstractCore (LLM + tools)
|
|
182
182
|
|
|
183
|
-
Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.
|
|
183
|
+
Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.30 or newer).
|
|
184
184
|
|
|
185
185
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
186
186
|
|
|
@@ -18,7 +18,7 @@ Optional (LLM + tools via AbstractCore):
|
|
|
18
18
|
pip install "abstractruntime[abstractcore]"
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
This installs AbstractCore 2.13.
|
|
21
|
+
This installs AbstractCore 2.13.30 or newer, which matches the documented server auth, provider-key header routing, generated-media contracts, capability catalog, prompt-cache control plane, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool behavior, public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery. Use `abstractruntime[multimodal]` when your workflows need common media dependencies and capability plugins (installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`, including `abstractmusic>=0.1.12`).
|
|
22
22
|
|
|
23
23
|
## Mental model (source of truth)
|
|
24
24
|
|
|
@@ -16,7 +16,7 @@ Implementation pointers (this repo):
|
|
|
16
16
|
pip install "abstractruntime[abstractcore]"
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
This extra installs AbstractCore 2.13.
|
|
19
|
+
This extra installs AbstractCore 2.13.30 or newer. That is the supported baseline for the current server auth split (`Authorization` for server auth, `X-AbstractCore-Provider-API-Key` for provider overrides), generated-media contracts, capability catalog, prompt-cache control-plane endpoints, durable bloc prompt-cache helpers, bindings and lifecycle operations, task-aware model residency for text/image/video/TTS/STT, current tool catalog, AbstractCore's public output-selector contract, async/sync text-generation output-selector parity, video generation endpoints, and the public local vision-cache catalog helper used by Runtime discovery.
|
|
20
20
|
|
|
21
21
|
For AbstractCore's multimodal `generate(..., output=...)` path, use the newer baseline and optional media packages:
|
|
22
22
|
|
|
@@ -24,7 +24,7 @@ For AbstractCore's multimodal `generate(..., output=...)` path, use the newer ba
|
|
|
24
24
|
pip install "abstractruntime[multimodal]"
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
This installs `abstractcore[remote,vision,voice,audio,music]>=2.13.
|
|
27
|
+
This installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`. Local image/video/voice/music generation still depends on the configured AbstractCore capability backends (for example AbstractVision, AbstractVoice, and AbstractMusic, or OpenAI/OpenAI-compatible remote engines). With `abstractmusic>=0.1.12`, the base music extra includes the lightweight remote ACE Music backend without local model-runtime extras.
|
|
28
28
|
|
|
29
29
|
The MCP worker entrypoint uses the `mcp-worker` extra:
|
|
30
30
|
|
|
@@ -21,7 +21,7 @@ Fix:
|
|
|
21
21
|
- `abstractruntime[abstractcore]` for LLM/tools integration.
|
|
22
22
|
- `abstractruntime[multimodal]` for common image, voice, audio, and music dependencies.
|
|
23
23
|
- `abstractruntime[mcp-worker]` for the MCP worker entry point.
|
|
24
|
-
- The current AbstractCore integration expects `abstractcore>=2.13.
|
|
24
|
+
- The current AbstractCore integration expects `abstractcore>=2.13.30`.
|
|
25
25
|
|
|
26
26
|
Verify:
|
|
27
27
|
|
|
@@ -10,11 +10,11 @@ This file is an **agent-oriented build guide** for the AbstractRuntime *library*
|
|
|
10
10
|
|
|
11
11
|
Quick facts:
|
|
12
12
|
- Python: 3.10+ (`pyproject.toml`)
|
|
13
|
-
- Version: 0.4.
|
|
13
|
+
- Version: 0.4.25
|
|
14
14
|
- Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella; pairs with [AbstractCore](https://github.com/lpalbou/abstractcore)
|
|
15
15
|
- Public export surface (source of truth): `src/abstractruntime/__init__.py`
|
|
16
|
-
- Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.
|
|
17
|
-
- Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.
|
|
16
|
+
- Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.30`
|
|
17
|
+
- Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`
|
|
18
18
|
- Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned env/config should be translated into explicit Runtime inputs or Runtime-owned env names.
|
|
19
19
|
|
|
20
20
|
```mermaid
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
> Durable workflow runtime (interrupt → checkpoint → resume) with an append-only execution ledger.
|
|
4
4
|
|
|
5
5
|
- Python: 3.10+ (see `pyproject.toml`)
|
|
6
|
-
- Version: 0.4.
|
|
6
|
+
- Version: 0.4.25
|
|
7
7
|
- Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
|
|
8
8
|
- Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
|
|
9
|
-
- Current AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.
|
|
10
|
-
- Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.
|
|
9
|
+
- Current AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.30`
|
|
10
|
+
- Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.30`
|
|
11
11
|
- Config boundary: Runtime does not read `ABSTRACTGATEWAY_*`; Gateway-owned config should be translated into explicit Runtime inputs or Runtime-owned env names.
|
|
12
12
|
|
|
13
13
|
## Start here
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "AbstractRuntime"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.25"
|
|
8
8
|
description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -46,14 +46,14 @@ dependencies = [
|
|
|
46
46
|
[project.optional-dependencies]
|
|
47
47
|
# Enables `abstractruntime.integrations.abstractcore.*` imports.
|
|
48
48
|
abstractcore = [
|
|
49
|
-
"abstractcore>=2.13.
|
|
49
|
+
"abstractcore>=2.13.30",
|
|
50
50
|
"openai<2.0.0,>=1.109.1",
|
|
51
51
|
"httpx<1.0.0,>=0.28.1",
|
|
52
52
|
"anyio<5.0.0,>=4.12.1",
|
|
53
53
|
]
|
|
54
54
|
|
|
55
55
|
apple = [
|
|
56
|
-
"abstractcore[apple]>=2.13.
|
|
56
|
+
"abstractcore[apple]>=2.13.30",
|
|
57
57
|
"openai<2.0.0,>=1.109.1",
|
|
58
58
|
"httpx<1.0.0,>=0.28.1",
|
|
59
59
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -61,7 +61,7 @@ apple = [
|
|
|
61
61
|
]
|
|
62
62
|
|
|
63
63
|
gpu = [
|
|
64
|
-
"abstractcore[gpu]>=2.13.
|
|
64
|
+
"abstractcore[gpu]>=2.13.30",
|
|
65
65
|
"openai<2.0.0,>=1.109.1",
|
|
66
66
|
"httpx<1.0.0,>=0.28.1",
|
|
67
67
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -69,7 +69,7 @@ gpu = [
|
|
|
69
69
|
]
|
|
70
70
|
|
|
71
71
|
all-apple = [
|
|
72
|
-
"abstractcore[all-apple]>=2.13.
|
|
72
|
+
"abstractcore[all-apple]>=2.13.30",
|
|
73
73
|
"openai<2.0.0,>=1.109.1",
|
|
74
74
|
"httpx<1.0.0,>=0.28.1",
|
|
75
75
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -77,7 +77,7 @@ all-apple = [
|
|
|
77
77
|
]
|
|
78
78
|
|
|
79
79
|
all-gpu = [
|
|
80
|
-
"abstractcore[all-gpu]>=2.13.
|
|
80
|
+
"abstractcore[all-gpu]>=2.13.30",
|
|
81
81
|
"openai<2.0.0,>=1.109.1",
|
|
82
82
|
"httpx<1.0.0,>=0.28.1",
|
|
83
83
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -87,7 +87,7 @@ all-gpu = [
|
|
|
87
87
|
# Enables AbstractCore multimodal generation helpers with common image/voice/
|
|
88
88
|
# audio/music capability packages.
|
|
89
89
|
multimodal = [
|
|
90
|
-
"abstractcore[remote,vision,voice,audio,music]>=2.13.
|
|
90
|
+
"abstractcore[remote,vision,voice,audio,music]>=2.13.30",
|
|
91
91
|
"openai<2.0.0,>=1.109.1",
|
|
92
92
|
"httpx<1.0.0,>=0.28.1",
|
|
93
93
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -101,7 +101,7 @@ multimodal = [
|
|
|
101
101
|
|
|
102
102
|
# Enables `abstractruntime-mcp-worker` with the default toolsets (includes bs4/lxml).
|
|
103
103
|
mcp-worker = [
|
|
104
|
-
"abstractcore[tools]>=2.13.
|
|
104
|
+
"abstractcore[tools]>=2.13.30",
|
|
105
105
|
"openai<2.0.0,>=1.109.1",
|
|
106
106
|
"httpx<1.0.0,>=0.28.1",
|
|
107
107
|
"anyio<5.0.0,>=4.12.1",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
### Added
|
|
2
|
+
- File-backed artifact stores now expose `content_path(...)` for hosts that need a stable local path while in-memory stores continue to return `None`.
|
|
3
|
+
|
|
4
|
+
### Changed
|
|
5
|
+
- Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.30` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core media/plugin floors and image-to-image residency truth.
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- Artifact-backed media resolution now preserves image roles such as `source` and `mask`, keeping image-edit and image-to-video requests wired correctly through AbstractCore.
|
|
9
|
+
- Model-residency discovery now treats `image_to_image` as its own vision task and deduplicates shared loaded-model records when task is omitted.
|
|
@@ -780,6 +780,11 @@ def _resolve_llm_call_media(
|
|
|
780
780
|
except Exception as e:
|
|
781
781
|
return None, f"Failed to materialize artifact '{artifact_id}': {e}"
|
|
782
782
|
resolved: Dict[str, Any] = {"file_path": str(p), "$artifact": str(artifact_id), "artifact_id": str(artifact_id)}
|
|
783
|
+
if isinstance(item, dict):
|
|
784
|
+
for key in ("role", "purpose", "kind"):
|
|
785
|
+
raw_role = item.get(key)
|
|
786
|
+
if isinstance(raw_role, str) and raw_role.strip():
|
|
787
|
+
resolved[key] = raw_role.strip()
|
|
783
788
|
if content_type:
|
|
784
789
|
resolved["content_type"] = content_type
|
|
785
790
|
base_type = content_type.split(";", 1)[0].strip().lower()
|
|
@@ -2145,10 +2145,10 @@ def _normalize_residency_task(task: Any) -> str:
|
|
|
2145
2145
|
"vision": "image_generation",
|
|
2146
2146
|
"t2i": "image_generation",
|
|
2147
2147
|
"text_to_image": "image_generation",
|
|
2148
|
-
"i2i": "
|
|
2149
|
-
"image_to_image": "
|
|
2150
|
-
"image_edit": "
|
|
2151
|
-
"edit_image": "
|
|
2148
|
+
"i2i": "image_to_image",
|
|
2149
|
+
"image_to_image": "image_to_image",
|
|
2150
|
+
"image_edit": "image_to_image",
|
|
2151
|
+
"edit_image": "image_to_image",
|
|
2152
2152
|
"video": "video_generation",
|
|
2153
2153
|
"videos": "video_generation",
|
|
2154
2154
|
"video_generation": "video_generation",
|
|
@@ -2189,6 +2189,7 @@ def _residency_task_filter(task: Any) -> Optional[str]:
|
|
|
2189
2189
|
|
|
2190
2190
|
_LOCAL_CAPABILITY_RESIDENCY_LIST_TASKS = (
|
|
2191
2191
|
"image_generation",
|
|
2192
|
+
"image_to_image",
|
|
2192
2193
|
"video_generation",
|
|
2193
2194
|
"text_to_video",
|
|
2194
2195
|
"image_to_video",
|
|
@@ -2223,7 +2224,7 @@ def _model_residency_unsupported_payload(
|
|
|
2223
2224
|
"diagnostics": {"source": "abstractruntime"},
|
|
2224
2225
|
"affected_models": [],
|
|
2225
2226
|
}
|
|
2226
|
-
if task_s in {"image_generation", "video_generation", "text_to_video", "image_to_video"}:
|
|
2227
|
+
if task_s in {"image_generation", "image_to_image", "video_generation", "text_to_video", "image_to_video"}:
|
|
2227
2228
|
payload["execution_mode"] = "local_one_shot_subprocess"
|
|
2228
2229
|
payload["local_media_residency_backend"] = "none"
|
|
2229
2230
|
payload["requires_long_lived_core_backend"] = True
|
|
@@ -2285,6 +2286,16 @@ def _local_model_residency_capabilities(*, mode: str, source: str, text_loads_ot
|
|
|
2285
2286
|
"requires_installed_capability_plugin": True,
|
|
2286
2287
|
},
|
|
2287
2288
|
),
|
|
2289
|
+
"image_to_image": _model_residency_capability_task(
|
|
2290
|
+
task="image_to_image",
|
|
2291
|
+
supported=True,
|
|
2292
|
+
truth_source="abstractcore.capability_plugin",
|
|
2293
|
+
extra={
|
|
2294
|
+
"local_media_residency_backend": "capability_plugin",
|
|
2295
|
+
"requires_installed_capability_plugin": True,
|
|
2296
|
+
"shares_backend_cache_with": "image_generation",
|
|
2297
|
+
},
|
|
2298
|
+
),
|
|
2288
2299
|
"text_to_video": _model_residency_capability_task(
|
|
2289
2300
|
task="text_to_video",
|
|
2290
2301
|
supported=True,
|
|
@@ -2680,7 +2691,7 @@ def _local_capability_residency_target(core: Any, task: str) -> Tuple[Any, str]:
|
|
|
2680
2691
|
return getattr(core, "audio", None), "audio"
|
|
2681
2692
|
if task_s == "music_generation":
|
|
2682
2693
|
return getattr(core, "music", None), "music"
|
|
2683
|
-
if task_s
|
|
2694
|
+
if task_s in {"image_generation", "image_to_image"}:
|
|
2684
2695
|
return getattr(core, "vision", None), "vision"
|
|
2685
2696
|
raise ValueError(f"Unsupported local capability residency task: {task!r}")
|
|
2686
2697
|
|
|
@@ -2762,7 +2773,22 @@ def _local_all_model_residency_result(
|
|
|
2762
2773
|
if isinstance(result, dict) and result.get("ok") is False and result.get("error"):
|
|
2763
2774
|
task_errors[task_s] = str(result.get("error"))
|
|
2764
2775
|
|
|
2765
|
-
|
|
2776
|
+
deduped: List[Dict[str, Any]] = []
|
|
2777
|
+
seen_record_keys: set[str] = set()
|
|
2778
|
+
for record in records:
|
|
2779
|
+
record_key = str(record.get("runtime_id") or record.get("load_id") or "").strip()
|
|
2780
|
+
if not record_key:
|
|
2781
|
+
record_key = "|".join(
|
|
2782
|
+
str(record.get(key) or "").strip()
|
|
2783
|
+
for key in ("task", "provider", "model")
|
|
2784
|
+
)
|
|
2785
|
+
if record_key and record_key in seen_record_keys:
|
|
2786
|
+
continue
|
|
2787
|
+
if record_key:
|
|
2788
|
+
seen_record_keys.add(record_key)
|
|
2789
|
+
deduped.append(record)
|
|
2790
|
+
|
|
2791
|
+
records = sorted(deduped, key=lambda item: str(item.get("runtime_id") or item.get("load_id") or ""))
|
|
2766
2792
|
diagnostics: Dict[str, Any] = {"source": source, "count": len(records), "task_counts": task_counts}
|
|
2767
2793
|
if task_errors:
|
|
2768
2794
|
diagnostics["task_errors"] = task_errors
|
|
@@ -7085,6 +7111,12 @@ class RemoteAbstractCoreLLMClient:
|
|
|
7085
7111
|
supported=True,
|
|
7086
7112
|
truth_source="abstractcore.server./acore/models",
|
|
7087
7113
|
),
|
|
7114
|
+
"image_to_image": _model_residency_capability_task(
|
|
7115
|
+
task="image_to_image",
|
|
7116
|
+
supported=True,
|
|
7117
|
+
truth_source="abstractcore.server./acore/models",
|
|
7118
|
+
extra={"shares_backend_cache_with": "image_generation"},
|
|
7119
|
+
),
|
|
7088
7120
|
"text_to_video": _model_residency_capability_task(
|
|
7089
7121
|
task="text_to_video",
|
|
7090
7122
|
supported=True,
|
|
@@ -273,6 +273,14 @@ class ArtifactStore(ABC):
|
|
|
273
273
|
candidates.sort(key=lambda m: m.created_at, reverse=True)
|
|
274
274
|
return candidates[:limit]
|
|
275
275
|
|
|
276
|
+
def content_path(self, artifact_id: str) -> Optional[Path]:
|
|
277
|
+
"""Return a local content path when this store is file-backed.
|
|
278
|
+
|
|
279
|
+
Stores that cannot expose a stable local file path return ``None``; callers
|
|
280
|
+
should fall back to ``load()``.
|
|
281
|
+
"""
|
|
282
|
+
return None
|
|
283
|
+
|
|
276
284
|
# Convenience methods
|
|
277
285
|
|
|
278
286
|
def store_text(
|
|
@@ -453,6 +461,10 @@ class FileArtifactStore(ArtifactStore):
|
|
|
453
461
|
return self._blob_path(blob_id.strip())
|
|
454
462
|
return self._legacy_content_path(artifact_id)
|
|
455
463
|
|
|
464
|
+
def content_path(self, artifact_id: str) -> Optional[Path]:
|
|
465
|
+
path = self._content_path(artifact_id)
|
|
466
|
+
return path if path.exists() else None
|
|
467
|
+
|
|
456
468
|
def _metadata_path(self, artifact_id: str) -> Path:
|
|
457
469
|
validate_artifact_id(artifact_id)
|
|
458
470
|
p = self._ref_metadata_path(artifact_id)
|
|
@@ -235,6 +235,26 @@ class TestFileArtifactStore:
|
|
|
235
235
|
artifact = store.load(metadata.artifact_id)
|
|
236
236
|
assert artifact.content == content
|
|
237
237
|
|
|
238
|
+
def test_content_path_is_public_for_file_backed_store(self):
|
|
239
|
+
"""File stores expose a stable content path; memory stores do not."""
|
|
240
|
+
memory_store = InMemoryArtifactStore()
|
|
241
|
+
memory_meta = memory_store.store(b"in memory", content_type="text/plain")
|
|
242
|
+
assert memory_store.content_path(memory_meta.artifact_id) is None
|
|
243
|
+
|
|
244
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
245
|
+
store = FileArtifactStore(tmpdir)
|
|
246
|
+
metadata = store.store(b"Persistent content", content_type="text/plain", run_id="run-1")
|
|
247
|
+
path = store.content_path(metadata.artifact_id)
|
|
248
|
+
assert path is not None
|
|
249
|
+
assert path.exists()
|
|
250
|
+
assert path.read_bytes() == b"Persistent content"
|
|
251
|
+
|
|
252
|
+
restarted = FileArtifactStore(tmpdir)
|
|
253
|
+
restarted_path = restarted.content_path(metadata.artifact_id)
|
|
254
|
+
assert restarted_path is not None
|
|
255
|
+
assert restarted_path.exists()
|
|
256
|
+
assert restarted_path.read_bytes() == b"Persistent content"
|
|
257
|
+
|
|
238
258
|
def test_persistence_across_instances(self):
|
|
239
259
|
"""Artifacts persist across store instances."""
|
|
240
260
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
@@ -64,3 +64,36 @@ def test_effect_handler_materialized_audio_artifact_preserves_content_type(tmp_p
|
|
|
64
64
|
assert item["type"] == "audio"
|
|
65
65
|
assert Path(item["file_path"]).suffix == ".wav"
|
|
66
66
|
assert BaseProvider._media_type(item) == "audio"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_effect_handler_materialized_image_artifacts_preserve_roles(tmp_path: Path) -> None:
|
|
70
|
+
from abstractruntime.integrations.abstractcore.effect_handlers import _resolve_llm_call_media
|
|
71
|
+
|
|
72
|
+
class Artifact:
|
|
73
|
+
content = PNG_1X1 = (
|
|
74
|
+
b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR"
|
|
75
|
+
b"\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00"
|
|
76
|
+
b"\x1f\x15\xc4\x89"
|
|
77
|
+
)
|
|
78
|
+
content_type = "image/png"
|
|
79
|
+
metadata = None
|
|
80
|
+
|
|
81
|
+
class Store:
|
|
82
|
+
def load(self, artifact_id: str) -> Artifact:
|
|
83
|
+
assert artifact_id in {"source-img", "mask-img"}
|
|
84
|
+
return Artifact()
|
|
85
|
+
|
|
86
|
+
resolved, error = _resolve_llm_call_media(
|
|
87
|
+
[
|
|
88
|
+
{"$artifact": "source-img", "content_type": "image/png", "role": "source"},
|
|
89
|
+
{"$artifact": "mask-img", "content_type": "image/png", "role": "mask"},
|
|
90
|
+
],
|
|
91
|
+
artifact_store=Store(),
|
|
92
|
+
temp_dir=tmp_path,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
assert error is None
|
|
96
|
+
assert isinstance(resolved, list)
|
|
97
|
+
assert [item.get("role") for item in resolved] == ["source", "mask"]
|
|
98
|
+
assert all(item.get("type") == "image" for item in resolved)
|
|
99
|
+
assert all(Path(str(item.get("file_path") or "")).is_file() for item in resolved)
|
{abstractruntime-0.4.24 → abstractruntime-0.4.25}/tests/test_model_residency_control_plane.py
RENAMED
|
@@ -872,6 +872,8 @@ def test_model_residency_capabilities_describe_core_backed_truth_by_task() -> No
|
|
|
872
872
|
assert local_caps["tasks"]["text_generation"]["truth_source"] == "abstractcore.provider.get_model_residency"
|
|
873
873
|
assert local_caps["tasks"]["image_generation"]["supported"] is True
|
|
874
874
|
assert local_caps["tasks"]["image_generation"]["truth_source"] == "abstractcore.capability_plugin"
|
|
875
|
+
assert local_caps["tasks"]["image_to_image"]["supported"] is True
|
|
876
|
+
assert local_caps["tasks"]["image_to_image"]["shares_backend_cache_with"] == "image_generation"
|
|
875
877
|
assert local_caps["tasks"]["video_generation"]["supported"] is True
|
|
876
878
|
assert local_caps["tasks"]["text_to_video"]["supported"] is True
|
|
877
879
|
assert local_caps["tasks"]["image_to_video"]["supported"] is True
|
|
@@ -882,6 +884,8 @@ def test_model_residency_capabilities_describe_core_backed_truth_by_task() -> No
|
|
|
882
884
|
assert multi_caps["tasks"]["tts"]["local_media_residency_backend"] == "capability_plugin"
|
|
883
885
|
assert remote_caps["relay_only"] is True
|
|
884
886
|
assert remote_caps["tasks"]["image_generation"]["truth_source"] == "abstractcore.server./acore/models"
|
|
887
|
+
assert remote_caps["tasks"]["image_to_image"]["truth_source"] == "abstractcore.server./acore/models"
|
|
888
|
+
assert remote_caps["tasks"]["image_to_image"]["supported"] is True
|
|
885
889
|
assert remote_caps["tasks"]["video_generation"]["truth_source"] == "abstractcore.server./acore/models"
|
|
886
890
|
assert remote_caps["tasks"]["text_to_video"]["supported"] is True
|
|
887
891
|
assert remote_caps["tasks"]["image_to_video"]["supported"] is True
|
|
@@ -47,6 +47,8 @@ def test_generate_image_node_compiles_to_llm_call_output_selector() -> None:
|
|
|
47
47
|
"width": 512,
|
|
48
48
|
"height": 512,
|
|
49
49
|
"steps": 8,
|
|
50
|
+
"seed": 1234,
|
|
51
|
+
"guidance_scale": 6.5,
|
|
50
52
|
},
|
|
51
53
|
)
|
|
52
54
|
|
|
@@ -65,6 +67,8 @@ def test_generate_image_node_compiles_to_llm_call_output_selector() -> None:
|
|
|
65
67
|
assert output["width"] == 512
|
|
66
68
|
assert output["height"] == 512
|
|
67
69
|
assert output["steps"] == 8
|
|
70
|
+
assert output["seed"] == 1234
|
|
71
|
+
assert output["guidance_scale"] == 6.5
|
|
68
72
|
|
|
69
73
|
|
|
70
74
|
def test_generate_image_legacy_provider_model_are_not_media_fallbacks() -> None:
|
|
@@ -112,6 +116,8 @@ def test_edit_image_node_compiles_to_llm_call_image_edit_selector() -> None:
|
|
|
112
116
|
"format": "png",
|
|
113
117
|
"size": "1024x1024",
|
|
114
118
|
"strength": 0.65,
|
|
119
|
+
"seed": 1234,
|
|
120
|
+
"guidance_scale": 6.5,
|
|
115
121
|
},
|
|
116
122
|
)
|
|
117
123
|
|
|
@@ -127,6 +133,8 @@ def test_edit_image_node_compiles_to_llm_call_image_edit_selector() -> None:
|
|
|
127
133
|
assert output["model"] == "gpt-image-1"
|
|
128
134
|
assert output["size"] == "1024x1024"
|
|
129
135
|
assert output["strength"] == 0.65
|
|
136
|
+
assert output["seed"] == 1234
|
|
137
|
+
assert output["guidance_scale"] == 6.5
|
|
130
138
|
assert media[0]["$artifact"] == "source-img"
|
|
131
139
|
assert media[0]["type"] == "image"
|
|
132
140
|
assert media[0]["role"] == "source"
|
|
@@ -137,13 +145,15 @@ def test_edit_image_node_compiles_to_llm_call_image_edit_selector() -> None:
|
|
|
137
145
|
def test_image_to_image_alias_compiles_to_image_edit_selector() -> None:
|
|
138
146
|
plan = _plan_for_node(
|
|
139
147
|
"image_to_image",
|
|
140
|
-
{"prompt": "Add clouds.", "source_image": "img-1"},
|
|
148
|
+
{"prompt": "Add clouds.", "source_image": "img-1", "seed": 42, "guidance_scale": 5.5},
|
|
141
149
|
)
|
|
142
150
|
|
|
143
151
|
assert plan.effect is not None
|
|
144
152
|
payload = dict(plan.effect.payload or {})
|
|
145
153
|
output = dict(payload.get("output") or {})
|
|
146
154
|
assert output["task"] == "image_edit"
|
|
155
|
+
assert output["seed"] == 42
|
|
156
|
+
assert output["guidance_scale"] == 5.5
|
|
147
157
|
assert payload["media"] == [{"type": "image", "role": "source", "$artifact": "img-1"}]
|
|
148
158
|
|
|
149
159
|
|
|
@@ -160,6 +170,7 @@ def test_generate_video_node_compiles_to_llm_call_video_selector() -> None:
|
|
|
160
170
|
"frames": 121,
|
|
161
171
|
"fps": 24,
|
|
162
172
|
"steps": 50,
|
|
173
|
+
"seed": 4321,
|
|
163
174
|
"guidance_scale": 5.0,
|
|
164
175
|
},
|
|
165
176
|
)
|
|
@@ -181,6 +192,7 @@ def test_generate_video_node_compiles_to_llm_call_video_selector() -> None:
|
|
|
181
192
|
assert output["num_frames"] == 121
|
|
182
193
|
assert output["fps"] == 24
|
|
183
194
|
assert output["steps"] == 50
|
|
195
|
+
assert output["seed"] == 4321
|
|
184
196
|
assert output["guidance_scale"] == 5.0
|
|
185
197
|
|
|
186
198
|
|
|
@@ -193,6 +205,8 @@ def test_image_to_video_node_compiles_to_llm_call_video_selector() -> None:
|
|
|
193
205
|
"video_provider": "mlx-gen",
|
|
194
206
|
"video_model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
|
|
195
207
|
"frames": 41,
|
|
208
|
+
"seed": 4321,
|
|
209
|
+
"guidance_scale": 5.0,
|
|
196
210
|
},
|
|
197
211
|
)
|
|
198
212
|
|
|
@@ -204,6 +218,8 @@ def test_image_to_video_node_compiles_to_llm_call_video_selector() -> None:
|
|
|
204
218
|
assert output["provider"] == "mlx-gen"
|
|
205
219
|
assert output["model"] == "Wan-AI/Wan2.2-TI2V-5B-Diffusers"
|
|
206
220
|
assert output["num_frames"] == 41
|
|
221
|
+
assert output["seed"] == 4321
|
|
222
|
+
assert output["guidance_scale"] == 5.0
|
|
207
223
|
assert payload["media"] == [{"type": "image", "role": "source", "$artifact": "img-1"}]
|
|
208
224
|
|
|
209
225
|
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
### Added
|
|
2
|
-
- Runtime now surfaces AbstractCore/AbstractVision video generation through the existing generated-media boundary:
|
|
3
|
-
- `LLM_CALL` output selectors for `{"modality":"video","task":"text_to_video"}` and `{"modality":"video","task":"image_to_video"}`
|
|
4
|
-
- remote Core Server routing for `/v1/videos/generations` and `/v1/videos/edits`
|
|
5
|
-
- durable run-facade helpers `generate_video(...)` and `image_to_video(...)`
|
|
6
|
-
- VisualFlow node lowering for `generate_video` / `text_to_video` and `image_to_video`
|
|
7
|
-
- Provider progress callbacks are converted into JSON-safe `abstract.progress` ledger events during `LLM_CALL` execution without persisting Python callback objects.
|
|
8
|
-
|
|
9
|
-
### Changed
|
|
10
|
-
- Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.29` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with Core video endpoints, video residency tasks, and AbstractVision 0.3.16 progress-capable generation.
|
|
11
|
-
- Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now document text-to-video, image-to-video, and generated-media progress events.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|