AbstractRuntime 0.4.22__tar.gz → 0.4.24__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.22 → abstractruntime-0.4.24}/.github/workflows/ci.yml +3 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/.github/workflows/release.yml +3 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/CHANGELOG.md +29 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/PKG-INFO +12 -12
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/README.md +4 -4
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/README.md +1 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/api.md +7 -7
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/architecture.md +3 -3
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/README.md +2 -1
- abstractruntime-0.4.24/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +53 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +28 -4
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/faq.md +6 -3
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/getting-started.md +1 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/integrations/abstractcore.md +71 -8
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/troubleshooting.md +2 -3
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/llms-full.txt +6 -6
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/llms.txt +7 -7
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/pyproject.toml +11 -8
- abstractruntime-0.4.24/release-notes.md +11 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/__init__.py +5 -1
- abstractruntime-0.4.24/src/abstractruntime/core/run_lifecycle.py +91 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/runtime.py +245 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +29 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +153 -4
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +28 -2
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/llm_client.py +1515 -137
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/output_specs.py +2 -2
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/run_facade.py +47 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/__init__.py +3 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/base.py +20 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/commands.py +61 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/in_memory.py +14 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/json_files.py +27 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/ledger_chain.py +10 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/observable.py +6 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/offloading.py +15 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/sqlite.py +38 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +9 -1
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/compiler.py +92 -3
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +102 -1
- abstractruntime-0.4.24/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +53 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/executor.py +276 -19
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_discovery_facade.py +181 -2
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_run_facade.py +137 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_model_residency_control_plane.py +441 -45
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_multimodal_abstractcore_integration.py +305 -7
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_packaging_extras.py +7 -7
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_queryable_run_store.py +30 -0
- abstractruntime-0.4.24/tests/test_runtime_effect_invocation_trace.py +45 -0
- abstractruntime-0.4.24/tests/test_storage_deletion.py +119 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_media_nodes.py +60 -0
- abstractruntime-0.4.22/release-notes.md +0 -6
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/.gitignore +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/LICENSE +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/ROADMAP.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/SECURITY.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/evidence.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/limits.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/manual_testing.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/proposal.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/provenance.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/snapshots.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/tools-comms.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/emails.config.example.yaml +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/examples/README.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/mkdocs.yml +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/pytest.ini +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/README.md +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/conftest.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_command_store.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_offloading.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.4.22 → abstractruntime-0.4.24}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
|
@@ -40,6 +40,9 @@ jobs:
|
|
|
40
40
|
tests/test_remote_llm_client.py \
|
|
41
41
|
tests/test_prompt_cache_modules.py \
|
|
42
42
|
tests/test_multimodal_abstractcore_integration.py \
|
|
43
|
+
tests/test_abstractcore_run_facade.py \
|
|
44
|
+
tests/test_visualflow_media_nodes.py \
|
|
45
|
+
tests/test_model_residency_control_plane.py \
|
|
43
46
|
tests/test_visualflow_llm_call_multimodal_output.py \
|
|
44
47
|
tests/test_visual_multi_entry_loop_overrides.py \
|
|
45
48
|
tests/test_control_adapter_while.py \
|
|
@@ -55,6 +55,9 @@ jobs:
|
|
|
55
55
|
tests/test_remote_llm_client.py \
|
|
56
56
|
tests/test_prompt_cache_modules.py \
|
|
57
57
|
tests/test_multimodal_abstractcore_integration.py \
|
|
58
|
+
tests/test_abstractcore_run_facade.py \
|
|
59
|
+
tests/test_visualflow_media_nodes.py \
|
|
60
|
+
tests/test_model_residency_control_plane.py \
|
|
58
61
|
tests/test_visualflow_llm_call_multimodal_output.py \
|
|
59
62
|
tests/test_visual_multi_entry_loop_overrides.py \
|
|
60
63
|
tests/test_control_adapter_while.py \
|
|
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.24] - 2026-05-26
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Runtime now surfaces AbstractCore/AbstractVision video generation through the existing generated-media boundary:
|
|
14
|
+
- `LLM_CALL` output selectors for `{"modality":"video","task":"text_to_video"}` and `{"modality":"video","task":"image_to_video"}`
|
|
15
|
+
- remote Core Server routing for `/v1/videos/generations` and `/v1/videos/edits`
|
|
16
|
+
- durable run-facade helpers `generate_video(...)` and `image_to_video(...)`
|
|
17
|
+
- VisualFlow node lowering for `generate_video` / `text_to_video` and `image_to_video`
|
|
18
|
+
- Provider progress callbacks are converted into JSON-safe `abstract.progress` ledger events during `LLM_CALL` execution without persisting Python callback objects.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- 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.
|
|
22
|
+
- Runtime docs and AI-readable `llms.txt` / `llms-full.txt` now document text-to-video, image-to-video, and generated-media progress events.
|
|
23
|
+
|
|
24
|
+
## [0.4.23] - 2026-05-26
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
- Run lifecycle helpers and execution metric surfaces for VisualFlow execution and Gateway run retention workflows.
|
|
28
|
+
- Storage deletion primitives for durable run cleanup across the Runtime storage backends.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
- Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.28` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core capability defaults, MLX-Gen catalog, and OmniVoice discovery contracts.
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
- Effect invocation tracing now records generated-media and code-node execution details consistently across local and Gateway-hosted runs.
|
|
35
|
+
|
|
10
36
|
## [0.4.22] - 2026-05-23
|
|
11
37
|
|
|
12
38
|
### Changed
|
|
@@ -532,7 +558,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
|
|
|
532
558
|
|
|
533
559
|
Initial development version with basic proof-of-concept features.
|
|
534
560
|
|
|
535
|
-
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.
|
|
561
|
+
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.24...HEAD
|
|
562
|
+
[0.4.24]: https://github.com/lpalbou/abstractruntime/compare/v0.4.23...v0.4.24
|
|
563
|
+
[0.4.23]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...v0.4.23
|
|
536
564
|
[0.4.22]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...v0.4.22
|
|
537
565
|
[0.4.21]: https://github.com/lpalbou/abstractruntime/compare/v0.4.20...v0.4.21
|
|
538
566
|
[0.4.20]: https://github.com/lpalbou/abstractruntime/compare/v0.4.19...v0.4.20
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.24
|
|
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.29; 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.29; 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.29; 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.29; 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.29; 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.29; 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.29; 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.24 • **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.29 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.29`, 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.24)
|
|
173
173
|
|
|
174
174
|
Kernel (dependency-light):
|
|
175
175
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -193,7 +193,7 @@ Drivers + distribution:
|
|
|
193
193
|
- run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
|
|
194
194
|
|
|
195
195
|
Optional integrations:
|
|
196
|
-
- AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, local-only prompt-cache export/import admin, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/voice/music outputs, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
|
|
196
|
+
- AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, local-only prompt-cache export/import admin, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/video/voice/music outputs with progress events, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
|
|
197
197
|
- For outbound comms, use the durable run facade when the send belongs to a run: `get_abstractcore_run_facade(...).send_email(...)` / `send_telegram_message(...)`. If that child run pauses for approval or passthrough execution, resume it through `resume_tool_calls(...)`. Direct host-facade send helpers and the standalone email comms facade remain host-local and nondurable.
|
|
198
198
|
- AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
|
|
199
199
|
depends on the light AbstractMemory contract; hosts choose storage backends
|
|
@@ -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.24 • **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.29 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.29`, 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.24)
|
|
96
96
|
|
|
97
97
|
Kernel (dependency-light):
|
|
98
98
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -116,7 +116,7 @@ Drivers + distribution:
|
|
|
116
116
|
- run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
|
|
117
117
|
|
|
118
118
|
Optional integrations:
|
|
119
|
-
- AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, local-only prompt-cache export/import admin, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/voice/music outputs, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
|
|
119
|
+
- AbstractCore (LLM + tools, `MODEL_RESIDENCY`, public discovery/host/run facades, cached sessions, local-only prompt-cache export/import admin, durable bloc prompt-cache controls, bindings, lifecycle operations, generated image/video/voice/music outputs with progress events, host email helpers, Telegram host wrappers, and tool approval waits): `docs/integrations/abstractcore.md`
|
|
120
120
|
- For outbound comms, use the durable run facade when the send belongs to a run: `get_abstractcore_run_facade(...).send_email(...)` / `send_telegram_message(...)`. If that child run pauses for approval or passthrough execution, resume it through `resume_tool_calls(...)`. Direct host-facade send helpers and the standalone email comms facade remain host-local and nondurable.
|
|
121
121
|
- AbstractMemory TripleStore integration for `MEMORY_KG_*` effects. Runtime
|
|
122
122
|
depends on the light AbstractMemory contract; hosts choose storage backends
|
|
@@ -26,7 +26,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
26
26
|
- `faq.md` — common questions (recommended)
|
|
27
27
|
- `troubleshooting.md` — symptom-oriented setup, runtime, and integration fixes
|
|
28
28
|
- `manual_testing.md` — manual smoke tests and how to run the test suite
|
|
29
|
-
- `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, cached sessions, durable bloc prompt-cache control, media inputs, generated media outputs, and tool approval waits via AbstractCore
|
|
29
|
+
- `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, cached sessions, durable bloc prompt-cache control, media inputs, generated media outputs, video progress events, and tool approval waits via AbstractCore
|
|
30
30
|
- `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
|
|
31
31
|
|
|
32
32
|
## Features (reference)
|
|
@@ -125,7 +125,7 @@ Key types:
|
|
|
125
125
|
Artifacts are used by:
|
|
126
126
|
- offloading wrappers (`src/abstractruntime/storage/offloading.py`)
|
|
127
127
|
- evidence capture (`docs/evidence.md`, `src/abstractruntime/evidence/recorder.py`)
|
|
128
|
-
- AbstractCore media integration: input artifact refs can be materialized for LLM calls, and generated image/voice/music/audio outputs are stored as artifact refs
|
|
128
|
+
- AbstractCore media integration: input artifact refs can be materialized for LLM calls, and generated image/video/voice/music/audio outputs are stored as artifact refs
|
|
129
129
|
|
|
130
130
|
## Snapshots / bookmarks
|
|
131
131
|
|
|
@@ -157,7 +157,7 @@ VisualFlow compiler helpers are available from `abstractruntime.visualflow_compi
|
|
|
157
157
|
- `compile_visualflow(...)` and `compile_visualflow_tree(...)` compile VisualFlow JSON into executable `WorkflowSpec` objects.
|
|
158
158
|
|
|
159
159
|
VisualFlow authoring note (media nodes):
|
|
160
|
-
- Runtime recognizes first-class VisualFlow media nodes such as `generate_image`, `edit_image`, `image_to_image`, `generate_voice`, `generate_music`, `transcribe_audio`, and `listen_voice`.
|
|
160
|
+
- Runtime recognizes first-class VisualFlow media nodes such as `generate_image`, `edit_image`, `image_to_image`, `generate_video`, `text_to_video`, `image_to_video`, `generate_voice`, `generate_music`, `transcribe_audio`, and `listen_voice`.
|
|
161
161
|
- Generated-media and transcription nodes lower to a durable `EffectType.LLM_CALL` with an `output` selector (for example `{"modality":"music","task":"music_generation"}`), while `listen_voice` lowers to `WAIT_EVENT`. Hosts should persist the authoring node type rather than pre-lowering to `llm_call`.
|
|
162
162
|
|
|
163
163
|
Public bundle APIs are exported from `src/abstractruntime/workflow_bundle/__init__.py` and re-exported in `src/abstractruntime/__init__.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.29 or newer).
|
|
184
184
|
|
|
185
185
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
186
186
|
|
|
@@ -197,7 +197,7 @@ Entry points:
|
|
|
197
197
|
- host-facade client delegation is implemented by the configured AbstractCore LLM clients in `src/abstractruntime/integrations/abstractcore/llm_client.py` (`get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules`, `upsert_text_bloc`, `get_bloc_record`, `list_blocs`, `get_bloc_kv_manifest`, `ensure_bloc_kv_artifact`, `load_bloc_kv_artifact`, `list_bloc_kv_artifacts`, `delete_bloc_kv_artifact`, `prune_bloc_kv_artifacts`, `delete_bloc`, `get_model_residency_capabilities`, `list_model_residency`, `load_model_residency`, `unload_model_residency`)
|
|
198
198
|
- host-local prompt-cache export/import admin also lives on the host facade and client delegation layer (`list_prompt_cache_exports`, `prompt_cache_export`, `prompt_cache_import`) and is intentionally local-only
|
|
199
199
|
- host-facade email helpers delegate to Runtime's host-local comms facade/export layer (`list_email_accounts`, `list_emails`, `read_email`, `send_email`)
|
|
200
|
-
- run-facade helpers create and resume durable child runs for existing runs (`execute_llm_call`, `execute_tool_calls`, `resume_tool_calls`, `generate_image`, `edit_image`, `generate_voice`, `generate_music`, `transcribe_audio`, `send_email`, `send_telegram_message`)
|
|
200
|
+
- run-facade helpers create and resume durable child runs for existing runs (`execute_llm_call`, `execute_tool_calls`, `resume_tool_calls`, `generate_image`, `edit_image`, `generate_video`, `image_to_video`, `generate_voice`, `generate_music`, `transcribe_audio`, `send_email`, `send_telegram_message`)
|
|
201
201
|
|
|
202
202
|
`LLM_CALL` payloads are JSON-safe effect payloads. Common fields:
|
|
203
203
|
- `prompt`, `messages`, `system_prompt`, and convenience `text`
|
|
@@ -208,11 +208,11 @@ Entry points:
|
|
|
208
208
|
Multimodal support:
|
|
209
209
|
- install `abstractruntime[multimodal]` for common AbstractCore media, vision, voice, audio, and music dependencies
|
|
210
210
|
- local clients call AbstractCore's unified `generate(..., media=..., output=...)`
|
|
211
|
-
- remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
|
|
211
|
+
- remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, image edits, text-to-video, image-to-video, speech, music generation, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
|
|
212
212
|
- remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
|
|
213
|
-
- generated image/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
|
|
213
|
+
- generated image/video/voice/music/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
|
|
214
214
|
- media-only normalized results expose `runtime_provider` / `runtime_model` separately from `media_provider` / `media_model`
|
|
215
|
-
- optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; unsupported local media warmup for `image_generation`, `tts`, `stt`, and `music_generation` reports `requires_long_lived_server=true`, and image
|
|
215
|
+
- optional local media residency failures complete with `status_hint="warning"` and `degraded=true`; unsupported local media warmup for `image_generation`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` reports `requires_long_lived_server=true`, and generated image/video tasks also report `execution_mode="local_one_shot_subprocess"`
|
|
216
216
|
- Gateway/hosts remain responsible for explicit Core server URLs, Core server auth headers, provider/model defaults, selected Core/capability install profiles, and translation of Gateway-owned env/config into explicit Runtime inputs; Runtime persists only JSON-safe routing metadata and artifact refs
|
|
217
217
|
|
|
218
218
|
Prompt cache / cached sessions:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
3
|
> Updated: 2026-05-23
|
|
4
|
-
> Version: 0.4.
|
|
4
|
+
> Version: 0.4.24
|
|
5
5
|
> Scope: this describes **what is implemented in this repository**.
|
|
6
6
|
|
|
7
7
|
AbstractRuntime is a **durable workflow runtime**: it executes workflow graphs as a persisted state machine with explicit waits (user, time, events, jobs, subworkflows). A run can pause for hours/days and resume **without** keeping Python stacks/coroutines alive.
|
|
@@ -28,7 +28,7 @@ Key invariants (enforced by code, not convention):
|
|
|
28
28
|
|
|
29
29
|
## AbstractCore capability boundary
|
|
30
30
|
|
|
31
|
-
AbstractRuntime's job is persistence and orchestration. AbstractCore owns model/provider capability execution: chat, structured output, cached sessions/prompt cache, media input analysis, image generation, voice/audio generation, music generation,
|
|
31
|
+
AbstractRuntime's job is persistence and orchestration. AbstractCore owns model/provider capability execution: chat, structured output, cached sessions/prompt cache, media input analysis, image generation, video generation, voice/audio generation, music generation, and transcription.
|
|
32
32
|
|
|
33
33
|
The boundary is intentionally narrow:
|
|
34
34
|
- Workflow nodes request model work with `EffectType.LLM_CALL`; the runtime persists the request/result and delegates execution to the configured AbstractCore client.
|
|
@@ -169,7 +169,7 @@ Registered in `Runtime._register_builtin_handlers()` (`src/abstractruntime/core/
|
|
|
169
169
|
|
|
170
170
|
### Host-wired effects
|
|
171
171
|
The kernel defines the protocol; concrete integrations provide handlers:
|
|
172
|
-
- `LLM_CALL`, `TOOL_CALLS`, `MODEL_RESIDENCY`: provided by AbstractCore integration (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). The integration supports local/remote/hybrid execution, cached sessions/prompt-cache control, discovery/catalog snapshots, model residency, durable run-scoped media child runs, media inputs, generated media outputs, provider-key header routing for remote servers, passthrough tools, and approval-gated local tool execution.
|
|
172
|
+
- `LLM_CALL`, `TOOL_CALLS`, `MODEL_RESIDENCY`: provided by AbstractCore integration (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). The integration supports local/remote/hybrid execution, cached sessions/prompt-cache control, discovery/catalog snapshots, model residency, durable run-scoped media child runs, media inputs, generated media outputs, provider progress callbacks as ledger events, provider-key header routing for remote servers, passthrough tools, and approval-gated local tool execution.
|
|
173
173
|
- `MEMORY_KG_*`: provided by the AbstractMemory bridge (`src/abstractruntime/integrations/abstractmemory/effect_handlers.py`)
|
|
174
174
|
|
|
175
175
|
### Reliability: retries + idempotency
|
|
@@ -14,7 +14,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
14
14
|
|
|
15
15
|
- Planned: 5
|
|
16
16
|
- Proposed: 3
|
|
17
|
-
- Completed:
|
|
17
|
+
- Completed: 30
|
|
18
18
|
- Deprecated: 13
|
|
19
19
|
- Recurrent: 0
|
|
20
20
|
|
|
@@ -69,6 +69,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
69
69
|
| 0035 | `completed/0035_model_residency_provider_truth_for_local_http_clients.md` |
|
|
70
70
|
| 0037 | `completed/0037_visualflow_generate_music_node_compiler_parity.md` |
|
|
71
71
|
| 0039 | `completed/0039_runtime_music_structure_prompt_bool_contract.md` |
|
|
72
|
+
| 0040 | `completed/0040_task_agnostic_local_residency_listing.md` |
|
|
72
73
|
|
|
73
74
|
## Planned
|
|
74
75
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 0040 Task-Agnostic Local Residency Listing
|
|
2
|
+
|
|
3
|
+
## Metadata
|
|
4
|
+
- Created: 2026-05-24
|
|
5
|
+
- Status: Completed
|
|
6
|
+
- Completed: 2026-05-24
|
|
7
|
+
- Origin: direct bug fix from AbstractFlow model residency UI investigation
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Make Runtime's local model-residency list operation match the Gateway/Core
|
|
12
|
+
control-plane contract: omitting `task` lists resident models across tasks,
|
|
13
|
+
while an explicit `task` remains a filter.
|
|
14
|
+
|
|
15
|
+
## What Shipped
|
|
16
|
+
|
|
17
|
+
- Local and MultiLocal Runtime residency listing now treat an omitted task as
|
|
18
|
+
task-agnostic instead of silently defaulting to `text_generation`.
|
|
19
|
+
- Local capability-backed residency rows are normalized with verified
|
|
20
|
+
`provider_resident` / `provider_residency_verified` fields when the
|
|
21
|
+
capability plugin reports `loaded` or `resident`.
|
|
22
|
+
- AbstractFlow's loaded-model table now honors the canonical `loaded` /
|
|
23
|
+
`resident` state used by Core capability records, while still respecting
|
|
24
|
+
explicit negative provider-residency fields.
|
|
25
|
+
- Regression tests cover local and MultiLocal TTS rows appearing in an
|
|
26
|
+
unfiltered residency list after a capability-backed load.
|
|
27
|
+
|
|
28
|
+
## Current Code Pointers
|
|
29
|
+
|
|
30
|
+
- `src/abstractruntime/integrations/abstractcore/llm_client.py`
|
|
31
|
+
- `tests/test_model_residency_control_plane.py`
|
|
32
|
+
- AbstractFlow `web/frontend/src/components/ModelResidencyPanel.tsx`
|
|
33
|
+
|
|
34
|
+
## Validation
|
|
35
|
+
|
|
36
|
+
Focused validation run on 2026-05-24:
|
|
37
|
+
|
|
38
|
+
- `python -m py_compile abstractruntime/src/abstractruntime/integrations/abstractcore/llm_client.py`
|
|
39
|
+
- `PYTHONPATH=abstractruntime/src pytest -q abstractruntime/tests/test_model_residency_control_plane.py -q`
|
|
40
|
+
- `npm run build` from `abstractflow/web/frontend`
|
|
41
|
+
- `git diff --check` for the touched Runtime and Flow files
|
|
42
|
+
|
|
43
|
+
## Completion Report
|
|
44
|
+
|
|
45
|
+
### Summary
|
|
46
|
+
|
|
47
|
+
The Omnivoice warmup path was already returning a true resident runtime. The
|
|
48
|
+
row disappeared because local Runtime listing with no task returned only text
|
|
49
|
+
rows, and Flow then hid capability rows that used `loaded=true` /
|
|
50
|
+
`state=resident` instead of text-provider-specific `provider_loaded`.
|
|
51
|
+
|
|
52
|
+
The fix is at the control-plane normalization boundary, not an Omnivoice
|
|
53
|
+
special case.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## 025_runtime_retention_and_purge_contract (planned)
|
|
2
2
|
|
|
3
|
-
**Status**:
|
|
3
|
+
**Status**: Partially implemented
|
|
4
4
|
**Priority**: Medium
|
|
5
5
|
**Depends on**: 009_artifact_store (completed), 011_subworkflow_support (completed), 012_run_store_query_and_scheduler_support (completed), 024_runtime_owned_run_scoped_media_execution (completed)
|
|
6
6
|
**Related ADRs**: 0003_provenance_tamper_evident_hash_chain, 0004_runtime_owns_run_scoped_media_execution_truth
|
|
@@ -15,12 +15,18 @@ Define capability-detected runtime purge mechanics for explicitly ephemeral run
|
|
|
15
15
|
|
|
16
16
|
## Current code reality
|
|
17
17
|
|
|
18
|
-
- `RunStore` still exposes only `save()` / `load()
|
|
18
|
+
- `RunStore` still exposes only `save()` / `load()` as its mandatory base interface.
|
|
19
19
|
- `QueryableRunStore` already exposes `list_runs()`, `list_due_wait_until()`, and `list_children()`.
|
|
20
20
|
- `QueryableRunIndexStore` already exposes `list_run_index(...)`, including `session_id` and `root_only`, so hosts can already hide child runs from top-level listings without inventing purge semantics first.
|
|
21
|
-
- `LedgerStore` is still append-only with `append()` / `list()`.
|
|
21
|
+
- `LedgerStore` is still append-only as its mandatory base interface with `append()` / `list()`.
|
|
22
|
+
- Optional deletion protocols now exist for host-owned cleanup paths:
|
|
23
|
+
- `DeletableRunStore.delete(run_id)`
|
|
24
|
+
- `DeletableLedgerStore.delete(run_id)`
|
|
25
|
+
- `DeletableCommandStore.delete_by_run(run_id)`
|
|
26
|
+
- In-memory, JSON-file/JSONL, SQLite, and storage wrapper implementations now support those deletion protocols where applicable.
|
|
22
27
|
- `ArtifactStore` already supports `delete()` and `delete_by_run()`.
|
|
23
28
|
- Runtime already has private tree-walk precedents via `history_bundle._list_descendant_run_ids(...)` and scheduler child-run traversal, but no public host-facing purge helper.
|
|
29
|
+
- Gateway now uses these optional deletion capabilities in `abstractgateway.run_retention` to purge expired ephemeral draft-test run trees. Runtime still does not own the Gateway/Flow draft taxonomy.
|
|
24
30
|
- Runtime-owned child runs now include both classic subworkflows and media child runs, so cleanup is no longer only a Flow/Gateway concern.
|
|
25
31
|
- Provenance hash chains are implemented, which makes purge/archive semantics an explicit audit decision, not just a storage API detail.
|
|
26
32
|
|
|
@@ -101,7 +107,7 @@ Document the consequences clearly:
|
|
|
101
107
|
## Acceptance criteria
|
|
102
108
|
|
|
103
109
|
- [ ] Runtime documents a minimal retention metadata contract centered on `retention_class` and optional `expires_at`.
|
|
104
|
-
- [
|
|
110
|
+
- [x] Optional delete capabilities are defined without widening every storage base class.
|
|
105
111
|
- [ ] A host-facing purge helper can dry-run and execute run-tree cleanup when the configured stores support it.
|
|
106
112
|
- [ ] The helper refuses active runs by default and refuses durable runs unless explicitly forced.
|
|
107
113
|
- [ ] The helper reports descendant runs, deleted checkpoints, deleted ledgers, deleted artifacts, unsupported capabilities, and GC caveats in a structured result.
|
|
@@ -139,3 +145,21 @@ No new ADR is required yet. If this item graduates into an accepted retention ta
|
|
|
139
145
|
## Priority note
|
|
140
146
|
|
|
141
147
|
This matters more now that Runtime owns more child-run patterns, but it is still a medium-priority mechanics item, not the highest-priority runtime correctness gap.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 2026-05-25 implementation note
|
|
152
|
+
|
|
153
|
+
The AbstractFlow draft/published lifecycle slice added the storage-level deletion mechanics needed
|
|
154
|
+
by Gateway-owned draft-test purge:
|
|
155
|
+
|
|
156
|
+
- `abstractruntime.storage.base.DeletableRunStore`
|
|
157
|
+
- `abstractruntime.storage.base.DeletableLedgerStore`
|
|
158
|
+
- `abstractruntime.storage.commands.DeletableCommandStore`
|
|
159
|
+
- concrete deletion support for memory, JSON/JSONL, SQLite, offloading, observable, and hash-chain
|
|
160
|
+
store wrappers
|
|
161
|
+
- focused coverage in `tests/test_storage_deletion.py`
|
|
162
|
+
|
|
163
|
+
The broader Runtime-owned host-facing purge helper remains open. Gateway currently owns the only
|
|
164
|
+
concrete purge policy because `purpose: draft_test` and `retention.mode: ephemeral` are Gateway/Flow
|
|
165
|
+
control-plane semantics, not Runtime taxonomy.
|
|
@@ -90,21 +90,22 @@ Yes, when the configured AbstractCore provider/model supports the media. Pass `p
|
|
|
90
90
|
Install `abstractruntime[multimodal]` for common media/vision/audio/music dependencies.
|
|
91
91
|
Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/effect_handlers.py`, `src/abstractruntime/integrations/abstractcore/llm_client.py`.
|
|
92
92
|
|
|
93
|
-
## How do I generate images, voice/audio, or music?
|
|
93
|
+
## How do I generate images, video, voice/audio, or music?
|
|
94
94
|
|
|
95
95
|
Use `LLM_CALL` with AbstractCore's `output` selector:
|
|
96
96
|
|
|
97
97
|
```python
|
|
98
98
|
{"text": "A red cube on a white table", "output": {"modality": "image", "format": "png"}}
|
|
99
|
+
{"text": "A logo reveal", "output": {"modality": "video", "task": "text_to_video", "provider": "mlx-gen", "model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers", "format": "mp4"}}
|
|
99
100
|
{"text": "Hello from Runtime", "output": {"modality": "voice", "voice": "alloy", "format": "wav"}}
|
|
100
101
|
{"text": "Warm lo-fi piano with brushed drums", "output": {"modality": "music", "provider": "acemusic", "model": "ace-step", "format": "wav"}}
|
|
101
102
|
```
|
|
102
103
|
|
|
103
|
-
Generated bytes require a runtime `ArtifactStore`. The durable result contains `artifact_id` / `artifact_ref`, not inline binary data. Remote and hybrid runtimes support common AbstractCore Server endpoints for image generation, image edits, speech, music generation, transcription, and chat media. Local runtimes can use richer AbstractCore capability plugins for voice cloning, reference-guided generation,
|
|
104
|
+
Generated bytes require a runtime `ArtifactStore`. The durable result contains `artifact_id` / `artifact_ref`, not inline binary data. Remote and hybrid runtimes support common AbstractCore Server endpoints for image generation, image edits, text-to-video, image-to-video, speech, music generation, transcription, and chat media. Local runtimes can use richer AbstractCore capability plugins for voice cloning, reference-guided generation, local text-to-music, and local video generation when those AbstractCore capabilities are installed.
|
|
104
105
|
|
|
105
106
|
## Does AbstractRuntime implement image, voice, music, or video engines?
|
|
106
107
|
|
|
107
|
-
No. AbstractRuntime provides the durable graph runner, checkpoint/ledger model, waits, and artifact boundary. AbstractCore provides the LLM/media generation and analysis capabilities.
|
|
108
|
+
No. AbstractRuntime provides the durable graph runner, checkpoint/ledger model, waits, and artifact boundary. AbstractCore provides the LLM/media generation and analysis capabilities. Image, video, voice, transcription, and music all flow through the same JSON-safe `output` selector plus artifact-backed result shape; Runtime does not implement provider engines itself.
|
|
108
109
|
|
|
109
110
|
## Where should cached session or prompt-cache state live?
|
|
110
111
|
|
|
@@ -283,6 +284,8 @@ Docs: `provenance.md`. Code: `src/abstractruntime/storage/ledger_chain.py`.
|
|
|
283
284
|
If your `LedgerStore` supports subscriptions (or is wrapped with `ObservableLedgerStore`), you can subscribe in-process:
|
|
284
285
|
- `Runtime.subscribe_ledger(callback, run_id=...)`
|
|
285
286
|
|
|
287
|
+
Long-running generated media uses the same ledger stream. Runtime converts provider progress callbacks into `EMIT_EVENT` ledger records named `abstract.progress` with JSON-safe payloads such as `phase`, `step`, `total_steps`, `frame`, `total_frames`, and `progress`.
|
|
288
|
+
|
|
286
289
|
Docs: `architecture.md`. Code: `src/abstractruntime/core/runtime.py` (`subscribe_ledger`), `src/abstractruntime/storage/observable.py`.
|
|
287
290
|
|
|
288
291
|
## What is “evidence capture”?
|
|
@@ -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.29 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.29`, 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.29 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.29`. 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
|
|
|
@@ -101,7 +101,7 @@ print(state.output)
|
|
|
101
101
|
"messages": [{"role": "user", "content": "..."}],
|
|
102
102
|
"system_prompt": "...",
|
|
103
103
|
"media": ["path/or/artifact-ref"],
|
|
104
|
-
"output": {"modality": "text|image|voice|music", "task": "optional"},
|
|
104
|
+
"output": {"modality": "text|image|video|voice|music", "task": "optional"},
|
|
105
105
|
"tools": [{"name": "...", "description": "...", "parameters": {...}}],
|
|
106
106
|
"params": {
|
|
107
107
|
"temperature": 0.0,
|
|
@@ -178,6 +178,48 @@ Effect(
|
|
|
178
178
|
)
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
+
Generate video:
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
Effect(
|
|
185
|
+
type=EffectType.LLM_CALL,
|
|
186
|
+
payload={
|
|
187
|
+
"prompt": "Glowing data streams converge into a geometric logo.",
|
|
188
|
+
"output": {
|
|
189
|
+
"modality": "video",
|
|
190
|
+
"task": "text_to_video",
|
|
191
|
+
"provider": "mlx-gen",
|
|
192
|
+
"model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
|
|
193
|
+
"format": "mp4",
|
|
194
|
+
"num_frames": 41,
|
|
195
|
+
"fps": 24,
|
|
196
|
+
"steps": 10,
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
result_key="video_result",
|
|
200
|
+
)
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Image to video:
|
|
204
|
+
|
|
205
|
+
```python
|
|
206
|
+
Effect(
|
|
207
|
+
type=EffectType.LLM_CALL,
|
|
208
|
+
payload={
|
|
209
|
+
"prompt": "Add a slow camera orbit.",
|
|
210
|
+
"media": {"$artifact": "source_image_artifact_id", "type": "image", "role": "source"},
|
|
211
|
+
"output": {
|
|
212
|
+
"modality": "video",
|
|
213
|
+
"task": "image_to_video",
|
|
214
|
+
"provider": "mlx-gen",
|
|
215
|
+
"model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
|
|
216
|
+
"format": "mp4",
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
result_key="video_result",
|
|
220
|
+
)
|
|
221
|
+
```
|
|
222
|
+
|
|
181
223
|
Transcribe/analyze audio:
|
|
182
224
|
|
|
183
225
|
```python
|
|
@@ -211,21 +253,23 @@ Generated binary media requires a runtime `ArtifactStore` and is stored there. T
|
|
|
211
253
|
Media-only normalized results now distinguish orchestration identity from the actual media backend:
|
|
212
254
|
|
|
213
255
|
- `runtime_provider` / `runtime_model`: the runtime-side orchestration identity, when relevant
|
|
214
|
-
- `media_provider` / `media_model`: the actual image/voice/music backend identity surfaced from the generated output
|
|
256
|
+
- `media_provider` / `media_model`: the actual image/video/voice/music backend identity surfaced from the generated output
|
|
215
257
|
|
|
216
258
|
For local one-shot subprocess image generation, runtime metadata also records `execution_mode="local_one_shot_subprocess"`.
|
|
217
259
|
|
|
218
|
-
|
|
260
|
+
Long-running generated media may expose provider progress callbacks. Runtime injects a transient `on_progress` callback during `LLM_CALL` execution and persists each callback as an `EMIT_EVENT` ledger record named `abstract.progress`. The callback itself is never stored in the effect payload or run vars.
|
|
261
|
+
|
|
262
|
+
Remote runtimes support chat media by sending OpenAI-compatible data URL content arrays to AbstractCore Server. They also support image generation (`/v1/images/generations`), image edits (`/v1/images/edits` or `/{provider}/v1/images/edits`), text-to-video (`/v1/videos/generations`), image-to-video (`/v1/videos/edits` or `/{provider}/v1/videos/edits`), TTS (`/v1/audio/speech`), music generation (`/v1/audio/music`), and STT (`/v1/audio/transcriptions`) with the same artifact-backed result shape. Remote media endpoint calls do not inherit the chat model by default; pass an output-specific `model` only when you want a remote provider/model instead of the server's configured capability default. Remote STT requires exactly one audio media item that resolves to a local file path or artifact-backed temporary file. Remote image edits and image-to-video require one source image media item resolving to a local path or artifact-backed temporary file. For voice clone/register or reference-guided TTS, use local execution so AbstractCore can use its in-process capability dispatcher. Runtime does not import `abstractmusic` directly; local music support comes through the configured AbstractCore capability stack.
|
|
219
263
|
|
|
220
264
|
Remote multimodal generation currently supports one `output` selector per `LLM_CALL`. Hybrid runtimes use the same remote LLM/media path as remote mode while executing tools locally. Local runtimes can use AbstractCore's in-process multimodal dispatcher for richer capability plugin behavior.
|
|
221
265
|
|
|
222
|
-
Local media residency is intentionally explicit when unsupported. `MODEL_RESIDENCY` results for local `image_generation`, `tts`, `stt`, and `music_generation` return:
|
|
266
|
+
Local media residency is intentionally explicit when unsupported. `MODEL_RESIDENCY` results for local `image_generation`, `video_generation`, `text_to_video`, `image_to_video`, `tts`, `stt`, and `music_generation` return:
|
|
223
267
|
|
|
224
268
|
- `code="model_residency_unsupported"`
|
|
225
269
|
- `requires_long_lived_server=true`
|
|
226
270
|
- `config_hint` pointing to `ABSTRACTCORE_SERVER_BASE_URL`
|
|
227
271
|
|
|
228
|
-
Image-generation residency responses also include `execution_mode="local_one_shot_subprocess"` because local
|
|
272
|
+
Image/video-generation residency responses also include `execution_mode="local_one_shot_subprocess"` because local generated media can be isolated into one-shot workers unless a long-lived Core server owns the media backend.
|
|
229
273
|
|
|
230
274
|
When the workflow marks residency as optional (`required=false`), the effect still completes durably but includes `status_hint="warning"` and `degraded=true` so hosts can render the no-op honestly.
|
|
231
275
|
|
|
@@ -665,6 +709,8 @@ Public durable entry points:
|
|
|
665
709
|
- `resume_tool_calls(...)`
|
|
666
710
|
- `generate_image(...)`
|
|
667
711
|
- `edit_image(...)`
|
|
712
|
+
- `generate_video(...)`
|
|
713
|
+
- `image_to_video(...)`
|
|
668
714
|
- `generate_voice(...)`
|
|
669
715
|
- `generate_music(...)`
|
|
670
716
|
- `transcribe_audio(...)`
|
|
@@ -687,7 +733,7 @@ facade = get_abstractcore_run_facade(rt)
|
|
|
687
733
|
child = facade.generate_image(
|
|
688
734
|
"existing-parent-run-id",
|
|
689
735
|
prompt="A red mug on a white table.",
|
|
690
|
-
output={"provider": "
|
|
736
|
+
output={"provider": "mlx-gen", "model": "AbstractFramework/flux.2-klein-4b-4bit", "format": "png"},
|
|
691
737
|
)
|
|
692
738
|
|
|
693
739
|
assert child.status.value == "completed"
|
|
@@ -695,6 +741,23 @@ result = child.output["result"]
|
|
|
695
741
|
print(child.run_id, result["media_model"], result["outputs"]["image"][0]["artifact_id"])
|
|
696
742
|
```
|
|
697
743
|
|
|
744
|
+
For video, use the same child-run boundary:
|
|
745
|
+
|
|
746
|
+
```python
|
|
747
|
+
child = facade.generate_video(
|
|
748
|
+
"existing-parent-run-id",
|
|
749
|
+
prompt="Glowing data streams converge into a geometric logo.",
|
|
750
|
+
output={
|
|
751
|
+
"provider": "mlx-gen",
|
|
752
|
+
"model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
|
|
753
|
+
"format": "mp4",
|
|
754
|
+
"num_frames": 41,
|
|
755
|
+
},
|
|
756
|
+
)
|
|
757
|
+
|
|
758
|
+
print(child.run_id, child.output["result"]["outputs"]["video"][0]["artifact_id"])
|
|
759
|
+
```
|
|
760
|
+
|
|
698
761
|
Outbound comms sends that belong to a run should use the same durable child-run surface:
|
|
699
762
|
|
|
700
763
|
```python
|