AbstractRuntime 0.4.21__tar.gz → 0.4.22__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.21 → abstractruntime-0.4.22}/CHANGELOG.md +11 -1
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/PKG-INFO +11 -11
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/README.md +3 -3
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/api.md +1 -1
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/architecture.md +2 -2
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/README.md +2 -1
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +1 -1
- abstractruntime-0.4.22/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +43 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/getting-started.md +1 -1
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/integrations/abstractcore.md +2 -2
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/troubleshooting.md +1 -1
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/llms-full.txt +3 -3
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/llms.txt +3 -3
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/pyproject.toml +8 -8
- abstractruntime-0.4.22/release-notes.md +6 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/llm_client.py +8 -8
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/output_specs.py +2 -2
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/run_facade.py +12 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/executor.py +7 -5
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_run_facade.py +18 -1
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_multimodal_abstractcore_integration.py +19 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_packaging_extras.py +7 -7
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_media_nodes.py +27 -2
- abstractruntime-0.4.21/release-notes.md +0 -15
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/.gitignore +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/LICENSE +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/ROADMAP.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/SECURITY.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/README.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/evidence.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/faq.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/limits.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/manual_testing.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/proposal.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/provenance.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/snapshots.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/tools-comms.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/emails.config.example.yaml +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/examples/README.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/mkdocs.yml +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/pytest.ini +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/README.md +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/conftest.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_command_store.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_offloading.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
|
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.22] - 2026-05-23
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.27` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core capability plugin floors and server contracts.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- Remote and VisualFlow music generation now fail closed on legacy `backend` / `music_backend` selectors and require `provider` / `music_provider` as the backend selector, matching AbstractCore Server `/v1/audio/music` validation.
|
|
17
|
+
- VisualFlow `generate_music` lowering now preserves boolean `structure_prompt` values (including explicit `False`) in the pending output selector, keeping the Flow/Gateway/Core contract consistent.
|
|
18
|
+
|
|
10
19
|
## [0.4.21] - 2026-05-22
|
|
11
20
|
|
|
12
21
|
### Added
|
|
@@ -523,7 +532,8 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
|
|
|
523
532
|
|
|
524
533
|
Initial development version with basic proof-of-concept features.
|
|
525
534
|
|
|
526
|
-
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.
|
|
535
|
+
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.22...HEAD
|
|
536
|
+
[0.4.22]: https://github.com/lpalbou/abstractruntime/compare/v0.4.21...v0.4.22
|
|
527
537
|
[0.4.21]: https://github.com/lpalbou/abstractruntime/compare/v0.4.20...v0.4.21
|
|
528
538
|
[0.4.20]: https://github.com/lpalbou/abstractruntime/compare/v0.4.19...v0.4.20
|
|
529
539
|
[0.4.19]: https://github.com/lpalbou/abstractruntime/compare/v0.4.18...v0.4.19
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.22
|
|
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.27; 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.27; 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.27; 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.27; 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.27; 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.27; 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.27; 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.22 • **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.27 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/TTS/STT, 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.27`, 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.22)
|
|
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.22 • **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.27 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/TTS/STT, 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.27`, 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.22)
|
|
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.27 or newer).
|
|
184
184
|
|
|
185
185
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
186
186
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
|
-
> Updated: 2026-05-
|
|
4
|
-
> Version: 0.4.
|
|
3
|
+
> Updated: 2026-05-23
|
|
4
|
+
> Version: 0.4.22
|
|
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.
|
|
@@ -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: 29
|
|
18
18
|
- Deprecated: 13
|
|
19
19
|
- Recurrent: 0
|
|
20
20
|
|
|
@@ -68,6 +68,7 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
68
68
|
| 0033 | `completed/0033_runtime_host_local_prompt_cache_export_import_surface.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
|
+
| 0039 | `completed/0039_runtime_music_structure_prompt_bool_contract.md` |
|
|
71
72
|
|
|
72
73
|
## Planned
|
|
73
74
|
|
|
@@ -25,7 +25,7 @@ AbstractFlow now ships a `generate_music` authoring node. Runtime must recognize
|
|
|
25
25
|
## What shipped
|
|
26
26
|
- Added first-class VisualFlow lowering support for `nodeType="generate_music"` in Runtime:
|
|
27
27
|
- compiles into an `EffectType.LLM_CALL` pending effect with output selector `{modality: "music", task: "music_generation"}`
|
|
28
|
-
- accepts `prompt`, `music_provider`, `music_model`, `
|
|
28
|
+
- accepts `prompt`, `music_provider`, `music_model`, `lyrics`, `duration_s`, `format`, `seed`, `num_inference_steps`, `guidance_scale`, `instrumental`, `enhance_prompt`, `auto_lyrics`, `structure_prompt`, `text_planner_mode`, and `extra` from pins or `effectConfig` (`music_backend` is a legacy alias and is rejected; use `music_provider`)
|
|
29
29
|
- keeps runtime LLM `provider`/`model` separate from music provider/model selectors (no legacy fallback)
|
|
30
30
|
- Extended VisualFlow compiler routing so `generate_music` is treated as an LLM-call-backed effect node (like `generate_image` / `generate_voice` / `transcribe_audio`).
|
|
31
31
|
- Extended VisualFlow effect-result mapping so completed `generate_music` nodes populate:
|
abstractruntime-0.4.22/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Completed: Runtime Music `structure_prompt` Boolean Contract Alignment
|
|
2
|
+
|
|
3
|
+
## Metadata
|
|
4
|
+
- Created: 2026-05-22
|
|
5
|
+
- Completed: 2026-05-22
|
|
6
|
+
- Status: Completed
|
|
7
|
+
- Origin: moved from `docs/backlog/proposed/0039_runtime_music_structure_prompt_bool_contract.md`
|
|
8
|
+
|
|
9
|
+
## Problem
|
|
10
|
+
|
|
11
|
+
Gateway `MusicGenerateRequest` exposes `structure_prompt` as `Optional[bool]`.
|
|
12
|
+
AbstractFlow mirrors that boolean contract in its Generate Music node.
|
|
13
|
+
|
|
14
|
+
Runtime's native `generate_music` VisualFlow handler forwarded
|
|
15
|
+
`structure_prompt` only through the string-field path. Boolean values authored
|
|
16
|
+
by Flow were therefore dropped before the Gateway/Core music call.
|
|
17
|
+
|
|
18
|
+
## Implementation
|
|
19
|
+
|
|
20
|
+
- Moved `structure_prompt` from the music string option group to the boolean
|
|
21
|
+
option group in the native `generate_music` VisualFlow handler.
|
|
22
|
+
- Preserved explicit `False` values so callers can distinguish "disabled" from
|
|
23
|
+
"not specified".
|
|
24
|
+
- Added compiler coverage proving:
|
|
25
|
+
- `structure_prompt=True` is forwarded as a boolean in the pending music
|
|
26
|
+
output selector.
|
|
27
|
+
- `structure_prompt=False` from node input pins is preserved as an explicit
|
|
28
|
+
boolean override.
|
|
29
|
+
|
|
30
|
+
## Outcome
|
|
31
|
+
|
|
32
|
+
Runtime now keeps the same boolean contract used by AbstractFlow, Gateway, and
|
|
33
|
+
AbstractCore. A Flow-authored Generate Music node can enable or disable backend
|
|
34
|
+
structured prompt planning without Runtime stringifying or dropping the control.
|
|
35
|
+
|
|
36
|
+
## Validation
|
|
37
|
+
|
|
38
|
+
- `PYTHONPATH=src python -m pytest -q tests/test_visualflow_media_nodes.py`
|
|
39
|
+
|
|
40
|
+
## Related Flow work
|
|
41
|
+
|
|
42
|
+
AbstractFlow completed Gateway `0.2.17` native media alignment in
|
|
43
|
+
`abstractflow/docs/backlog/completed/0072_gateway_0_2_17_native_media_contract_alignment.md`.
|
|
@@ -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.27 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/TTS/STT, current tool behavior, public output-selector contract, async/sync text-generation output-selector parity, 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.27`, 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.27 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/TTS/STT, current tool catalog, AbstractCore's public output-selector contract, async/sync text-generation output-selector parity, 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.27`. Local image/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.27`.
|
|
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.22
|
|
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.27`
|
|
17
|
+
- Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.27`
|
|
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.22
|
|
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.27`
|
|
10
|
+
- Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[remote,vision,voice,audio,music]>=2.13.27`
|
|
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.22"
|
|
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.27",
|
|
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.27",
|
|
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.27",
|
|
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.27",
|
|
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.27",
|
|
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.27",
|
|
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.27",
|
|
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,6 @@
|
|
|
1
|
+
### Changed
|
|
2
|
+
- Minimum optional AbstractCore dependency floor is now `abstractcore>=2.13.27` (and matching `multimodal`, `mcp-worker`, and hardware-profile cascade extras), aligning Runtime with the latest Core capability plugin floors and server contracts.
|
|
3
|
+
|
|
4
|
+
### Fixed
|
|
5
|
+
- Remote and VisualFlow music generation now fail closed on legacy `backend` / `music_backend` selectors and require `provider` / `music_provider` as the backend selector, matching AbstractCore Server `/v1/audio/music` validation.
|
|
6
|
+
- VisualFlow `generate_music` lowering now preserves boolean `structure_prompt` values (including explicit `False`) in the pending output selector, keeping the Flow/Gateway/Core contract consistent.
|
|
@@ -7692,12 +7692,17 @@ class RemoteAbstractCoreLLMClient:
|
|
|
7692
7692
|
params: Dict[str, Any],
|
|
7693
7693
|
) -> Dict[str, Any]:
|
|
7694
7694
|
fmt = str(spec.get("format") or spec.get("response_format") or "wav").strip().lower() or "wav"
|
|
7695
|
+
legacy_backend = str(spec.get("backend") or spec.get("music_backend") or "").strip()
|
|
7696
|
+
if legacy_backend:
|
|
7697
|
+
raise ValueError(
|
|
7698
|
+
"Music output routing uses `provider` as the backend selector; "
|
|
7699
|
+
"`backend` and `music_backend` are not supported."
|
|
7700
|
+
)
|
|
7695
7701
|
body: Dict[str, Any] = {
|
|
7696
7702
|
"prompt": str(prompt or ""),
|
|
7697
7703
|
"task": str(spec.get("task") or "music_generation"),
|
|
7698
7704
|
"format": fmt,
|
|
7699
7705
|
}
|
|
7700
|
-
route_selector = str(spec.get("backend") or spec.get("music_backend") or "").strip().lower().replace("_", "-")
|
|
7701
7706
|
for key, value in spec.items():
|
|
7702
7707
|
if key in {
|
|
7703
7708
|
"modality",
|
|
@@ -7722,15 +7727,10 @@ class RemoteAbstractCoreLLMClient:
|
|
|
7722
7727
|
if isinstance(base_url, str) and base_url.strip():
|
|
7723
7728
|
body["base_url"] = base_url.strip()
|
|
7724
7729
|
|
|
7725
|
-
|
|
7726
|
-
url = _join_core_provider_v1_url(self._server_base_url, route_selector, "/audio/music")
|
|
7727
|
-
else:
|
|
7728
|
-
url = _join_core_v1_url(self._server_base_url, "/audio/music")
|
|
7730
|
+
url = _join_core_v1_url(self._server_base_url, "/audio/music")
|
|
7729
7731
|
audio_bytes, resp_headers = self._post_bytes(url, headers=headers, json_body=body)
|
|
7730
7732
|
content_type = str(resp_headers.get("content-type") or f"audio/{fmt}").split(";", 1)[0].strip() or f"audio/{fmt}"
|
|
7731
|
-
media_provider = (
|
|
7732
|
-
str(body.get("provider") or route_selector or "abstractcore-server").strip() or "abstractcore-server"
|
|
7733
|
-
)
|
|
7733
|
+
media_provider = str(body.get("provider") or "abstractcore-server").strip() or "abstractcore-server"
|
|
7734
7734
|
run_id, tags = self._trace_run_id_and_tags(
|
|
7735
7735
|
params,
|
|
7736
7736
|
task="music_generation",
|
|
@@ -4,8 +4,8 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import Any, Dict, List, Optional
|
|
6
6
|
|
|
7
|
-
_MIN_ABSTRACTCORE_VERSION = (2, 13,
|
|
8
|
-
_MIN_ABSTRACTCORE_VERSION_TEXT = "2.13.
|
|
7
|
+
_MIN_ABSTRACTCORE_VERSION = (2, 13, 27)
|
|
8
|
+
_MIN_ABSTRACTCORE_VERSION_TEXT = "2.13.27"
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def _version_tuple(value: str) -> tuple[int, int, int]:
|
|
@@ -76,6 +76,17 @@ def _workflow_id_for_output(output: Any) -> str:
|
|
|
76
76
|
return f"{_WORKFLOW_PREFIX}_{safe}"
|
|
77
77
|
|
|
78
78
|
|
|
79
|
+
def _validate_music_output_spec(output: Any) -> None:
|
|
80
|
+
if not isinstance(output, dict):
|
|
81
|
+
return
|
|
82
|
+
legacy_backend = str(output.get("backend") or output.get("music_backend") or "").strip()
|
|
83
|
+
if legacy_backend:
|
|
84
|
+
raise ValueError(
|
|
85
|
+
"Music output uses `provider` as the backend selector; "
|
|
86
|
+
"`backend` and `music_backend` are not supported."
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
79
90
|
def _workflow_id_for_tool_calls(tool_calls: list[Dict[str, Any]]) -> str:
|
|
80
91
|
suffix = "tool_calls"
|
|
81
92
|
if isinstance(tool_calls, list) and tool_calls:
|
|
@@ -410,6 +421,7 @@ class AbstractCoreRunFacade:
|
|
|
410
421
|
|
|
411
422
|
spec = {"modality": "music", "task": "music_generation"}
|
|
412
423
|
if isinstance(output, dict):
|
|
424
|
+
_validate_music_output_spec(output)
|
|
413
425
|
spec.update(copy.deepcopy(output))
|
|
414
426
|
return self.execute_llm_call(
|
|
415
427
|
run_id,
|
|
@@ -1823,7 +1823,6 @@ def visual_to_flow(visual: VisualFlow) -> Flow:
|
|
|
1823
1823
|
|
|
1824
1824
|
for key in (
|
|
1825
1825
|
"lyrics",
|
|
1826
|
-
"structure_prompt",
|
|
1827
1826
|
"text_planner_mode",
|
|
1828
1827
|
"vocal_language",
|
|
1829
1828
|
"negative_prompt",
|
|
@@ -1858,7 +1857,7 @@ def visual_to_flow(visual: VisualFlow) -> Flow:
|
|
|
1858
1857
|
if guidance is not None:
|
|
1859
1858
|
output_spec["guidance_scale"] = guidance
|
|
1860
1859
|
|
|
1861
|
-
for key in ("instrumental", "enhance_prompt", "auto_lyrics", "planning"):
|
|
1860
|
+
for key in ("instrumental", "enhance_prompt", "structure_prompt", "auto_lyrics", "planning"):
|
|
1862
1861
|
raw_value = _input_or_config(payload, config, key, default=None)
|
|
1863
1862
|
if raw_value is not None:
|
|
1864
1863
|
output_spec[key] = _coerce_bool(raw_value)
|
|
@@ -1869,15 +1868,18 @@ def visual_to_flow(visual: VisualFlow) -> Flow:
|
|
|
1869
1868
|
music_model = _nonempty_str(
|
|
1870
1869
|
_input_or_config(payload, config, "music_model", "musicModel", "model_music")
|
|
1871
1870
|
)
|
|
1872
|
-
|
|
1871
|
+
legacy_music_backend = _nonempty_str(
|
|
1873
1872
|
_input_or_config(payload, config, "music_backend", "musicBackend", "backend_music")
|
|
1874
1873
|
)
|
|
1875
1874
|
if music_provider:
|
|
1876
1875
|
output_spec["provider"] = music_provider
|
|
1877
1876
|
if music_model:
|
|
1878
1877
|
output_spec["model"] = music_model
|
|
1879
|
-
if
|
|
1880
|
-
|
|
1878
|
+
if legacy_music_backend:
|
|
1879
|
+
raise ValueError(
|
|
1880
|
+
"generate_music uses `music_provider` as the backend selector; "
|
|
1881
|
+
"`music_backend` is not supported."
|
|
1882
|
+
)
|
|
1881
1883
|
|
|
1882
1884
|
extra = _input_or_config(payload, config, "extra")
|
|
1883
1885
|
if isinstance(extra, dict) and extra:
|
|
@@ -285,7 +285,7 @@ def test_run_facade_generate_music_creates_durable_child_run_with_artifact_backe
|
|
|
285
285
|
parent_run_id = runtime.start(
|
|
286
286
|
workflow=parent,
|
|
287
287
|
session_id="sess-music",
|
|
288
|
-
vars={"_runtime": {"
|
|
288
|
+
vars={"_runtime": {"prompt_cache": {"enabled": True}}},
|
|
289
289
|
)
|
|
290
290
|
runtime.tick(workflow=parent, run_id=parent_run_id)
|
|
291
291
|
|
|
@@ -317,6 +317,23 @@ def test_run_facade_generate_music_creates_durable_child_run_with_artifact_backe
|
|
|
317
317
|
assert artifact.metadata.tags["kind"] == "generated_media"
|
|
318
318
|
|
|
319
319
|
|
|
320
|
+
def test_run_facade_generate_music_rejects_legacy_backend_fields() -> None:
|
|
321
|
+
class _StubRuntime:
|
|
322
|
+
def start(self, **kwargs):
|
|
323
|
+
raise AssertionError("legacy music backend fields should be rejected before runtime start")
|
|
324
|
+
|
|
325
|
+
def tick(self, **kwargs):
|
|
326
|
+
raise AssertionError("legacy music backend fields should be rejected before runtime tick")
|
|
327
|
+
|
|
328
|
+
def get_state(self, run_id: str):
|
|
329
|
+
raise AssertionError(f"unexpected get_state({run_id})")
|
|
330
|
+
|
|
331
|
+
facade = AbstractCoreRunFacade(_StubRuntime())
|
|
332
|
+
|
|
333
|
+
with pytest.raises(ValueError, match="provider.*backend selector"):
|
|
334
|
+
facade.generate_music("run-1", prompt="Warm lo-fi piano.", output={"backend": "acemusic"})
|
|
335
|
+
|
|
336
|
+
|
|
320
337
|
def test_run_facade_send_telegram_message_creates_durable_child_tool_run() -> None:
|
|
321
338
|
seen: Dict[str, Any] = {}
|
|
322
339
|
|
{abstractruntime-0.4.21 → abstractruntime-0.4.22}/tests/test_multimodal_abstractcore_integration.py
RENAMED
|
@@ -737,6 +737,25 @@ def test_remote_music_output_uses_music_endpoint_and_stores_artifact() -> None:
|
|
|
737
737
|
assert out["media_model"] == "ace-step"
|
|
738
738
|
|
|
739
739
|
|
|
740
|
+
def test_remote_music_output_rejects_legacy_backend_fields() -> None:
|
|
741
|
+
store = InMemoryArtifactStore()
|
|
742
|
+
sender = _RemoteMusicSender()
|
|
743
|
+
client = RemoteAbstractCoreLLMClient(
|
|
744
|
+
server_base_url="http://core.test",
|
|
745
|
+
model="openai/gpt-4o-mini",
|
|
746
|
+
request_sender=sender,
|
|
747
|
+
artifact_store=store,
|
|
748
|
+
)
|
|
749
|
+
|
|
750
|
+
with pytest.raises(ValueError, match="provider.*backend selector"):
|
|
751
|
+
client.generate(
|
|
752
|
+
prompt="Warm lo-fi piano with brushed drums.",
|
|
753
|
+
params={"output": {"modality": "music", "backend": "acemusic", "format": "wav"}},
|
|
754
|
+
)
|
|
755
|
+
|
|
756
|
+
assert sender.calls == []
|
|
757
|
+
|
|
758
|
+
|
|
740
759
|
def test_remote_voice_output_uses_speech_endpoint_and_stores_artifact() -> None:
|
|
741
760
|
store = InMemoryArtifactStore()
|
|
742
761
|
sender = _RemoteTtsSender()
|
|
@@ -49,8 +49,8 @@ def test_runtime_exposes_abstractcore_and_worker_extras_with_gateway_aligned_flo
|
|
|
49
49
|
assert "[project.optional-dependencies]" in text
|
|
50
50
|
assert "abstractcore = [" in text
|
|
51
51
|
assert "mcp-worker = [" in text
|
|
52
|
-
assert '"abstractcore>=2.13.
|
|
53
|
-
assert '"abstractcore[remote,vision,voice,audio,music]>=2.13.
|
|
52
|
+
assert '"abstractcore>=2.13.27"' in text
|
|
53
|
+
assert '"abstractcore[remote,vision,voice,audio,music]>=2.13.27"' in text
|
|
54
54
|
assert '"openai<2.0.0,>=1.109.1"' in text
|
|
55
55
|
assert '"httpx<1.0.0,>=0.28.1"' in text
|
|
56
56
|
assert '"anyio<5.0.0,>=4.12.1"' in text
|
|
@@ -59,7 +59,7 @@ def test_runtime_exposes_abstractcore_and_worker_extras_with_gateway_aligned_flo
|
|
|
59
59
|
assert '"python-pptx<2.0.0,>=1.0.2"' in text
|
|
60
60
|
|
|
61
61
|
worker_block = _extract_optional_dependency_block(text, key="mcp-worker")
|
|
62
|
-
assert '"abstractcore[tools]>=2.13.
|
|
62
|
+
assert '"abstractcore[tools]>=2.13.27"' in worker_block
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
def test_runtime_exposes_python_install_hardware_profile_cascades() -> None:
|
|
@@ -78,10 +78,10 @@ def test_runtime_exposes_python_install_hardware_profile_cascades() -> None:
|
|
|
78
78
|
all_apple_block = _extract_optional_dependency_block(text, key="all-apple")
|
|
79
79
|
all_gpu_block = _extract_optional_dependency_block(text, key="all-gpu")
|
|
80
80
|
|
|
81
|
-
assert '"abstractcore[apple]>=2.13.
|
|
82
|
-
assert '"abstractcore[gpu]>=2.13.
|
|
83
|
-
assert '"abstractcore[all-apple]>=2.13.
|
|
84
|
-
assert '"abstractcore[all-gpu]>=2.13.
|
|
81
|
+
assert '"abstractcore[apple]>=2.13.27"' in apple_block
|
|
82
|
+
assert '"abstractcore[gpu]>=2.13.27"' in gpu_block
|
|
83
|
+
assert '"abstractcore[all-apple]>=2.13.27"' in all_apple_block
|
|
84
|
+
assert '"abstractcore[all-gpu]>=2.13.27"' in all_gpu_block
|
|
85
85
|
assert '"setuptools<82.0.0,>=80.10.2"' in apple_block
|
|
86
86
|
assert '"setuptools<82.0.0,>=80.10.2"' in gpu_block
|
|
87
87
|
assert '"setuptools<82.0.0,>=80.10.2"' in all_apple_block
|