AbstractRuntime 0.4.4__tar.gz → 0.4.5__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.4 → abstractruntime-0.4.5}/CHANGELOG.md +11 -1
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/PKG-INFO +7 -7
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/README.md +3 -3
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/api.md +1 -1
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/architecture.md +1 -1
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/getting-started.md +1 -1
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/integrations/abstractcore.md +2 -2
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/limits.md +1 -1
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/proposal.md +1 -1
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/provenance.md +1 -1
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/llms-full.txt +3 -3
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/llms.txt +3 -3
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/pyproject.toml +4 -4
- abstractruntime-0.4.5/release-notes.md +6 -0
- abstractruntime-0.4.5/src/abstractruntime/integrations/abstractcore/output_specs.py +73 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_multimodal_abstractcore_integration.py +50 -4
- abstractruntime-0.4.4/release-notes.md +0 -35
- abstractruntime-0.4.4/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -173
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/.gitignore +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/LICENSE +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/ROADMAP.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/SECURITY.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/README.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/README.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/evidence.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/faq.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/manual_testing.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/snapshots.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/tools-comms.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/emails.config.example.yaml +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/examples/README.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/mkdocs.yml +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/pytest.ini +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/README.md +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/conftest.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_command_store.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_offloading.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.4.4 → abstractruntime-0.4.5}/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.5] - 2026-05-07
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Minimum `abstractcore` optional dependency increased to `>=2.13.9` so Runtime can use AbstractCore's public output-selector contract instead of mirroring provider-private multimodal selector logic.
|
|
14
|
+
- Runtime's AbstractCore output-spec adapter now delegates selector detection, normalization, generated-media detection, non-chat dispatch detection, and runtime metadata stripping to `abstractcore.core.output_specs`.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
- Explicit `voice_clone` output specs no longer require a Runtime `ArtifactStore` before dispatch because AbstractCore exposes them as generated resources rather than binary media outputs.
|
|
18
|
+
|
|
10
19
|
## [0.4.4] - 2026-05-07
|
|
11
20
|
|
|
12
21
|
### Added
|
|
@@ -323,7 +332,8 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
|
|
|
323
332
|
|
|
324
333
|
Initial development version with basic proof-of-concept features.
|
|
325
334
|
|
|
326
|
-
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.
|
|
335
|
+
[Unreleased]: https://github.com/lpalbou/abstractruntime/compare/v0.4.5...HEAD
|
|
336
|
+
[0.4.5]: https://github.com/lpalbou/abstractruntime/compare/v0.4.4...v0.4.5
|
|
327
337
|
[0.4.4]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.4
|
|
328
338
|
[0.4.3]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.3
|
|
329
339
|
[0.4.2]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.2
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
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
|
|
@@ -22,15 +22,15 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
Requires-Dist: abstractsemantics>=0.0.2
|
|
24
24
|
Provides-Extra: abstractcore
|
|
25
|
-
Requires-Dist: abstractcore>=2.13.
|
|
25
|
+
Requires-Dist: abstractcore>=2.13.9; extra == 'abstractcore'
|
|
26
26
|
Provides-Extra: docs
|
|
27
27
|
Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
|
|
28
28
|
Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
|
|
29
29
|
Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
|
|
30
30
|
Provides-Extra: mcp-worker
|
|
31
|
-
Requires-Dist: abstractcore[tools]>=2.13.
|
|
31
|
+
Requires-Dist: abstractcore[tools]>=2.13.9; extra == 'mcp-worker'
|
|
32
32
|
Provides-Extra: multimodal
|
|
33
|
-
Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.
|
|
33
|
+
Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.9; extra == 'multimodal'
|
|
34
34
|
Provides-Extra: test
|
|
35
35
|
Requires-Dist: pytest>=7.0.0; extra == 'test'
|
|
36
36
|
Description-Content-Type: text/markdown
|
|
@@ -41,7 +41,7 @@ Description-Content-Type: text/markdown
|
|
|
41
41
|
|
|
42
42
|
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.
|
|
43
43
|
|
|
44
|
-
**Version:** 0.4.
|
|
44
|
+
**Version:** 0.4.5 • **Python:** 3.10+
|
|
45
45
|
|
|
46
46
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
47
47
|
|
|
@@ -75,7 +75,7 @@ AbstractCore integration (LLM + tools):
|
|
|
75
75
|
pip install "abstractruntime[abstractcore]"
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
The `abstractcore` extra installs AbstractCore 2.13.
|
|
78
|
+
The `abstractcore` extra installs AbstractCore 2.13.9 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, unified multimodal generation response types, and public output-selector contract are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
|
|
79
79
|
|
|
80
80
|
MCP worker entrypoint (default toolsets over stdio):
|
|
81
81
|
|
|
@@ -124,7 +124,7 @@ state = rt.resume(
|
|
|
124
124
|
assert state.status.value == "completed"
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
-
## What’s included (v0.4.
|
|
127
|
+
## What’s included (v0.4.5)
|
|
128
128
|
|
|
129
129
|
Kernel (dependency-light):
|
|
130
130
|
- 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.5 • **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.9 or newer so the hardened server auth model, provider-key header routing, prompt-cache control plane, current tool catalog, unified multimodal generation response types, and public output-selector contract are available. Use `abstractruntime[multimodal]` when you need common media, vision, voice, and audio dependencies.
|
|
42
42
|
|
|
43
43
|
MCP worker entrypoint (default toolsets over stdio):
|
|
44
44
|
|
|
@@ -87,7 +87,7 @@ state = rt.resume(
|
|
|
87
87
|
assert state.status.value == "completed"
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
-
## What’s included (v0.4.
|
|
90
|
+
## What’s included (v0.4.5)
|
|
91
91
|
|
|
92
92
|
Kernel (dependency-light):
|
|
93
93
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -176,7 +176,7 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
|
|
|
176
176
|
|
|
177
177
|
### AbstractCore (LLM + tools)
|
|
178
178
|
|
|
179
|
-
Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.
|
|
179
|
+
Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.9 or newer).
|
|
180
180
|
|
|
181
181
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
182
182
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
3
|
> Updated: 2026-05-07
|
|
4
|
-
> Version: 0.4.
|
|
4
|
+
> Version: 0.4.5
|
|
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.
|
|
@@ -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.9 or newer, which matches the documented server auth, provider-key header routing, prompt-cache control plane, current tool behavior, unified multimodal generation response types, and public output-selector contract. Use `abstractruntime[multimodal]` when your workflows need common media, vision, voice, or audio dependencies.
|
|
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.9 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), prompt-cache control-plane endpoints, current tool catalog, the unified multimodal `generate(..., output=...)` response types, and AbstractCore's public output-selector contract.
|
|
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[media,openai,vision,voice,audio]>=2.13.
|
|
27
|
+
This installs `abstractcore[media,openai,vision,voice,audio]>=2.13.9`. Local image/voice generation still depends on the configured AbstractCore capability backends (for example AbstractVision and AbstractVoice, or OpenAI/OpenAI-compatible remote engines).
|
|
28
28
|
|
|
29
29
|
The MCP worker entrypoint uses the `mcp-worker` extra:
|
|
30
30
|
|
|
@@ -62,7 +62,7 @@ Returns a structured dict for UI/status display. (`src/abstractruntime/core/runt
|
|
|
62
62
|
|
|
63
63
|
Returns a list of `LimitWarning` objects for limits approaching/exceeded. (`src/abstractruntime/core/models.py`, `src/abstractruntime/core/runtime.py`)
|
|
64
64
|
|
|
65
|
-
As of v0.4.
|
|
65
|
+
As of v0.4.5, warnings are computed for:
|
|
66
66
|
- `iterations` (`current_iteration` vs `max_iterations`)
|
|
67
67
|
- `tokens` (`estimated_tokens_used` vs `max_tokens`)
|
|
68
68
|
|
|
@@ -79,7 +79,7 @@ AbstractRuntime stays dependency-light at the kernel level; concrete integration
|
|
|
79
79
|
|
|
80
80
|
## Status (implemented in this repository)
|
|
81
81
|
|
|
82
|
-
As of v0.4.
|
|
82
|
+
As of v0.4.5:
|
|
83
83
|
- durable kernel: `RunState`, `WaitState`, `Runtime.start/tick/resume`
|
|
84
84
|
- built-in waits + events: `WAIT_EVENT`, `WAIT_UNTIL`, `ASK_USER`, `EMIT_EVENT`
|
|
85
85
|
- persistence backends: in-memory, JSON/JSONL, SQLite
|
|
@@ -8,7 +8,7 @@ Implementation pointers:
|
|
|
8
8
|
- model fields: `src/abstractruntime/core/models.py` (`StepRecord.prev_hash`, `StepRecord.record_hash`, `StepRecord.signature`)
|
|
9
9
|
- hash-chain decorator + verifier: `src/abstractruntime/storage/ledger_chain.py`
|
|
10
10
|
|
|
11
|
-
## What is implemented (v0.4.
|
|
11
|
+
## What is implemented (v0.4.5)
|
|
12
12
|
|
|
13
13
|
- `HashChainedLedgerStore(inner_store)` — wraps any `LedgerStore` to compute hashes on append
|
|
14
14
|
- `verify_ledger_chain(records)` — validates the chain and returns a verification report
|
|
@@ -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.5
|
|
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[media,openai,vision,voice,audio]>=2.13.
|
|
16
|
+
- Optional AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.9`
|
|
17
|
+
- Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.9`
|
|
18
18
|
|
|
19
19
|
```mermaid
|
|
20
20
|
flowchart LR
|
|
@@ -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.5
|
|
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[media,openai,vision,voice,audio]>=2.13.
|
|
9
|
+
- Current AbstractCore baseline: `abstractruntime[abstractcore]` installs `abstractcore>=2.13.9`
|
|
10
|
+
- Multimodal extra: `abstractruntime[multimodal]` installs `abstractcore[media,openai,vision,voice,audio]>=2.13.9`
|
|
11
11
|
|
|
12
12
|
## Start here
|
|
13
13
|
|
|
@@ -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.5"
|
|
8
8
|
description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -42,18 +42,18 @@ dependencies = [
|
|
|
42
42
|
[project.optional-dependencies]
|
|
43
43
|
# Enables `abstractruntime.integrations.abstractcore.*` imports.
|
|
44
44
|
abstractcore = [
|
|
45
|
-
"abstractcore>=2.13.
|
|
45
|
+
"abstractcore>=2.13.9",
|
|
46
46
|
]
|
|
47
47
|
|
|
48
48
|
# Enables AbstractCore multimodal generation helpers with common OpenAI-backed
|
|
49
49
|
# image/voice capability packages.
|
|
50
50
|
multimodal = [
|
|
51
|
-
"abstractcore[media,openai,vision,voice,audio]>=2.13.
|
|
51
|
+
"abstractcore[media,openai,vision,voice,audio]>=2.13.9",
|
|
52
52
|
]
|
|
53
53
|
|
|
54
54
|
# Enables `abstractruntime-mcp-worker` with the default toolsets (includes bs4/lxml).
|
|
55
55
|
mcp-worker = [
|
|
56
|
-
"abstractcore[tools]>=2.13.
|
|
56
|
+
"abstractcore[tools]>=2.13.9",
|
|
57
57
|
]
|
|
58
58
|
|
|
59
59
|
# CI/test dependencies. The workflow runs the basic contract suite plus focused
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
### Changed
|
|
2
|
+
- Minimum `abstractcore` optional dependency increased to `>=2.13.9` so Runtime can use AbstractCore's public output-selector contract instead of mirroring provider-private multimodal selector logic.
|
|
3
|
+
- Runtime's AbstractCore output-spec adapter now delegates selector detection, normalization, generated-media detection, non-chat dispatch detection, and runtime metadata stripping to `abstractcore.core.output_specs`.
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- Explicit `voice_clone` output specs no longer require a Runtime `ArtifactStore` before dispatch because AbstractCore exposes them as generated resources rather than binary media outputs.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Runtime adapters around AbstractCore's public output-selector contract."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
6
|
+
|
|
7
|
+
try:
|
|
8
|
+
from abstractcore.core.output_specs import (
|
|
9
|
+
is_output_request,
|
|
10
|
+
normalize_output_spec,
|
|
11
|
+
normalize_output_specs,
|
|
12
|
+
output_has_generated_media,
|
|
13
|
+
output_requires_non_chat_dispatch,
|
|
14
|
+
strip_runtime_output_metadata,
|
|
15
|
+
)
|
|
16
|
+
except ImportError as exc: # pragma: no cover - import-time dependency guard
|
|
17
|
+
raise ImportError(
|
|
18
|
+
"abstractruntime.integrations.abstractcore requires abstractcore>=2.13.9 "
|
|
19
|
+
"for the public output selector contract."
|
|
20
|
+
) from exc
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def is_abstractcore_output_request(output: Any) -> bool:
|
|
24
|
+
"""Return True when `output` is AbstractCore's multimodal output selector."""
|
|
25
|
+
|
|
26
|
+
return is_output_request(output)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def normalize_output_spec_for_runtime(output: Any) -> Dict[str, Any]:
|
|
30
|
+
"""Normalize an AbstractCore output selector using the same public aliases as core."""
|
|
31
|
+
|
|
32
|
+
return normalize_output_spec(output)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def normalize_output_specs_for_runtime(output: Any) -> List[Dict[str, Any]]:
|
|
36
|
+
return normalize_output_specs(output)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def strip_runtime_output_metadata_for_core(output: Any) -> Any:
|
|
40
|
+
"""Keep runtime artifact metadata out of AbstractCore capability kwargs."""
|
|
41
|
+
|
|
42
|
+
return strip_runtime_output_metadata(output)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def output_runtime_metadata(output: Any) -> tuple[Optional[str], Dict[str, Any]]:
|
|
46
|
+
"""Extract runtime storage metadata from an AbstractCore output selector."""
|
|
47
|
+
|
|
48
|
+
if not is_abstractcore_output_request(output):
|
|
49
|
+
return None, {}
|
|
50
|
+
|
|
51
|
+
specs = normalize_output_specs_for_runtime(output)
|
|
52
|
+
run_id: Optional[str] = None
|
|
53
|
+
tags: Dict[str, Any] = {}
|
|
54
|
+
for spec in specs:
|
|
55
|
+
raw_run_id = spec.get("run_id")
|
|
56
|
+
if run_id is None and isinstance(raw_run_id, str) and raw_run_id.strip():
|
|
57
|
+
run_id = raw_run_id.strip()
|
|
58
|
+
|
|
59
|
+
raw_tags = spec.get("tags")
|
|
60
|
+
if isinstance(raw_tags, dict):
|
|
61
|
+
tags.update({str(k): str(v) for k, v in raw_tags.items() if k is not None and v is not None})
|
|
62
|
+
|
|
63
|
+
return run_id, tags
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def output_request_has_generated_media(output: Any) -> bool:
|
|
67
|
+
"""Return True when an output selector can produce generated binary media."""
|
|
68
|
+
|
|
69
|
+
return output_has_generated_media(output)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def output_request_has_non_text_result(output: Any) -> bool:
|
|
73
|
+
return output_requires_non_chat_dispatch(output)
|
{abstractruntime-0.4.4 → abstractruntime-0.4.5}/tests/test_multimodal_abstractcore_integration.py
RENAMED
|
@@ -13,7 +13,10 @@ from abstractruntime.integrations.abstractcore.llm_client import (
|
|
|
13
13
|
RemoteAbstractCoreLLMClient,
|
|
14
14
|
_normalize_local_response,
|
|
15
15
|
)
|
|
16
|
-
from abstractruntime.integrations.abstractcore.output_specs import
|
|
16
|
+
from abstractruntime.integrations.abstractcore.output_specs import (
|
|
17
|
+
is_abstractcore_output_request,
|
|
18
|
+
output_request_has_generated_media,
|
|
19
|
+
)
|
|
17
20
|
from abstractruntime.storage.artifacts import InMemoryArtifactStore
|
|
18
21
|
from abstractruntime.storage.in_memory import InMemoryLedgerStore, InMemoryRunStore
|
|
19
22
|
|
|
@@ -239,8 +242,8 @@ def test_llm_call_generated_media_requires_artifact_store() -> None:
|
|
|
239
242
|
assert "ArtifactStore" in str(state.error)
|
|
240
243
|
|
|
241
244
|
|
|
242
|
-
def
|
|
243
|
-
from abstractcore.
|
|
245
|
+
def test_runtime_output_selector_adapter_delegates_to_public_abstractcore_contract() -> None:
|
|
246
|
+
from abstractcore.core.output_specs import is_output_request, output_has_generated_media
|
|
244
247
|
|
|
245
248
|
cases = [
|
|
246
249
|
"text",
|
|
@@ -255,7 +258,50 @@ def test_runtime_output_selector_detection_matches_abstractcore_for_known_shapes
|
|
|
255
258
|
]
|
|
256
259
|
|
|
257
260
|
for case in cases:
|
|
258
|
-
assert is_abstractcore_output_request(case) is
|
|
261
|
+
assert is_abstractcore_output_request(case) is is_output_request(case)
|
|
262
|
+
|
|
263
|
+
assert output_request_has_generated_media("image") is output_has_generated_media("image")
|
|
264
|
+
assert output_request_has_generated_media({"task": "voice_clone"}) is False
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def test_local_voice_clone_resource_does_not_require_artifact_store() -> None:
|
|
268
|
+
from abstractcore.core.multimodal_generation import GeneratedResource, MultimodalGenerateResponse
|
|
269
|
+
|
|
270
|
+
seen = {}
|
|
271
|
+
|
|
272
|
+
class _FakeLLM:
|
|
273
|
+
def generate(self, **kwargs):
|
|
274
|
+
seen.update(kwargs)
|
|
275
|
+
return MultimodalGenerateResponse(
|
|
276
|
+
resources={
|
|
277
|
+
"voice": [
|
|
278
|
+
GeneratedResource(
|
|
279
|
+
modality="voice",
|
|
280
|
+
task="voice_clone",
|
|
281
|
+
resource_type="voice",
|
|
282
|
+
resource_id="voice-demo",
|
|
283
|
+
)
|
|
284
|
+
]
|
|
285
|
+
}
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
client = object.__new__(LocalAbstractCoreLLMClient)
|
|
289
|
+
client._provider = "openai"
|
|
290
|
+
client._model = "gpt-4o-mini"
|
|
291
|
+
client._artifact_store = None
|
|
292
|
+
client._generate_lock = None
|
|
293
|
+
client._llm = _FakeLLM()
|
|
294
|
+
client._maybe_prepare_prompt_cache = lambda **_kwargs: None
|
|
295
|
+
|
|
296
|
+
out = client.generate(
|
|
297
|
+
prompt="Reference text.",
|
|
298
|
+
media=[{"type": "audio", "path": "reference.wav"}],
|
|
299
|
+
params={"output": {"task": "voice_clone", "run_id": "run-voice", "tags": {"node_id": "n-voice"}}},
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
assert seen["output"] == {"task": "voice_clone"}
|
|
303
|
+
resource = out["resources"]["voice"][0]
|
|
304
|
+
assert resource["resource_id"] == "voice-demo"
|
|
259
305
|
|
|
260
306
|
|
|
261
307
|
class _RemoteImageSender:
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
### Added
|
|
2
|
-
- **AbstractCore multimodal generation integration**:
|
|
3
|
-
- `LLM_CALL` now forwards AbstractCore's unified `generate(..., output=...)` selector for image generation, TTS/voice output, and audio transcription
|
|
4
|
-
- generated binary outputs are normalized into JSON-safe runtime results with ArtifactStore-backed refs instead of inline bytes
|
|
5
|
-
- local runtimes can use AbstractCore capability plugins such as AbstractVision and AbstractVoice through the same runtime effect shape
|
|
6
|
-
- remote runtimes support AbstractCore Server image generation, speech, and transcription endpoints, plus OpenAI-compatible chat media content arrays
|
|
7
|
-
- **Multimodal packaging extra**:
|
|
8
|
-
- new `abstractruntime[multimodal]` extra installs `abstractcore[media,openai,vision,voice,audio]>=2.13.8`
|
|
9
|
-
- **VisualFlow LLM media selectors**:
|
|
10
|
-
- LLM nodes lowered from VisualFlow can request generated media through `output` / `outputs` from node config or input data
|
|
11
|
-
|
|
12
|
-
### Changed
|
|
13
|
-
- Minimum `abstractcore` optional dependency increased to `>=2.13.8` for the unified multimodal response types.
|
|
14
|
-
- `LLM_CALL` accepts top-level `text`, top-level `output`, and top-level `outputs` as a runtime alias for AbstractCore `output`.
|
|
15
|
-
- `LLM_CALL.media` accepts one media item or a list; artifact refs are materialized to provider-ready temporary files before model calls.
|
|
16
|
-
- Remote AbstractCore clients now preserve existing OpenAI-style content arrays when adding media attachments.
|
|
17
|
-
- Remote AbstractCore clients now resolve ArtifactStore-backed media refs for direct client use, matching the runtime effect-handler path.
|
|
18
|
-
- VisualFlow LLM pending-call lowering now carries `output` / `outputs` selectors into runtime LLM effects.
|
|
19
|
-
- VisualFlow LLM result syncing now projects generated media artifacts into node outputs such as `outputs`, `resources`, `artifact_ref`, `artifact_id`, and `meta.output_mode`.
|
|
20
|
-
|
|
21
|
-
### Fixed
|
|
22
|
-
- Runtime artifact metadata (`run_id`, tags, artifact ids) is kept out of AbstractCore provider/capability kwargs while still being applied to stored generated media artifacts.
|
|
23
|
-
- Generated binary media now fails closed without an ArtifactStore instead of embedding base64 bytes in durable state.
|
|
24
|
-
- Remote image/TTS/STT calls no longer reuse the chat model unless an output-specific media model is supplied.
|
|
25
|
-
- Remote media inputs now either convert to a provider-ready content item or fail before dispatch; unsupported remote image edits, voice reference inputs, and non-file STT inputs are rejected explicitly.
|
|
26
|
-
- Turn-grounding injection now preserves structured multimodal message content arrays instead of stringifying them.
|
|
27
|
-
- Session-scoped prompt-cache key derivation now uses the effective AbstractCore client provider/model identity when an `LLM_CALL` payload omits explicit provider/model overrides.
|
|
28
|
-
|
|
29
|
-
### Documentation
|
|
30
|
-
- Documented multimodal `LLM_CALL` payloads, artifact-backed response shape, remote endpoint coverage, cached-session/prompt-cache boundaries, and the `abstractruntime[multimodal]` extra in the AbstractCore integration guide, API reference, architecture guide, FAQ, README, getting-started guide, docs index, and AI-ready `llms*.txt` files.
|
|
31
|
-
- Added a planned workspace/media access policy item covering default workspace-only access, explicit user allow/deny paths, and a conscious full-machine access mode for long-running agency deployments.
|
|
32
|
-
|
|
33
|
-
### Testing
|
|
34
|
-
- Added focused coverage for multimodal response normalization, artifact-backed generated media, media-only transcription calls, remote image/TTS/STT endpoints, remote media guardrails, remote chat media content arrays, content-array prompt extraction, direct remote artifact-ref media resolution, text-alias routing, provider-request redaction, and runtime metadata/tag boundaries.
|
|
35
|
-
- Added coverage for effective prompt-cache key identity and VisualFlow LLM media selector/result projection.
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
"""AbstractCore output-selector helpers used by Runtime effect wiring and clients."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from typing import Any, Dict, List, Optional
|
|
6
|
-
|
|
7
|
-
_ACORE_OUTPUT_MODALITY_ALIASES = {
|
|
8
|
-
"speech": ("voice", "tts"),
|
|
9
|
-
"tts": ("voice", "tts"),
|
|
10
|
-
"audio": ("voice", "tts"),
|
|
11
|
-
"transcript": ("text", "transcription"),
|
|
12
|
-
"transcription": ("text", "transcription"),
|
|
13
|
-
"t2i": ("image", "image_generation"),
|
|
14
|
-
"image_generation": ("image", "image_generation"),
|
|
15
|
-
"i2i": ("image", "image_edit"),
|
|
16
|
-
"image_to_image": ("image", "image_edit"),
|
|
17
|
-
"image_edit": ("image", "image_edit"),
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
_ACORE_OUTPUT_TASK_ALIASES = {
|
|
21
|
-
"speech": "tts",
|
|
22
|
-
"audio": "tts",
|
|
23
|
-
"clone": "voice_clone",
|
|
24
|
-
"transcript": "transcription",
|
|
25
|
-
"t2i": "image_generation",
|
|
26
|
-
"i2i": "image_edit",
|
|
27
|
-
"image_to_image": "image_edit",
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
_ACORE_OUTPUT_STRING_VALUES = {
|
|
31
|
-
"text",
|
|
32
|
-
"transcript",
|
|
33
|
-
"transcription",
|
|
34
|
-
"image",
|
|
35
|
-
"voice",
|
|
36
|
-
"speech",
|
|
37
|
-
"tts",
|
|
38
|
-
"audio",
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
_ACORE_OUTPUT_DICT_VALUES = {
|
|
42
|
-
"text",
|
|
43
|
-
"transcript",
|
|
44
|
-
"transcription",
|
|
45
|
-
"text_generation",
|
|
46
|
-
"image",
|
|
47
|
-
"image_generation",
|
|
48
|
-
"image_edit",
|
|
49
|
-
"t2i",
|
|
50
|
-
"i2i",
|
|
51
|
-
"image_to_image",
|
|
52
|
-
"voice",
|
|
53
|
-
"speech",
|
|
54
|
-
"tts",
|
|
55
|
-
"voice_clone",
|
|
56
|
-
"clone",
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def is_abstractcore_output_request(output: Any) -> bool:
|
|
61
|
-
"""Return True when `output` is AbstractCore's multimodal output selector."""
|
|
62
|
-
|
|
63
|
-
if output is None:
|
|
64
|
-
return False
|
|
65
|
-
if isinstance(output, str):
|
|
66
|
-
return output.strip().lower() in _ACORE_OUTPUT_STRING_VALUES
|
|
67
|
-
if isinstance(output, (list, tuple)):
|
|
68
|
-
return bool(output) and all(is_abstractcore_output_request(item) for item in output)
|
|
69
|
-
if isinstance(output, dict):
|
|
70
|
-
raw = output.get("modality", output.get("type", output.get("output")))
|
|
71
|
-
task = output.get("task")
|
|
72
|
-
values = {str(v).strip().lower() for v in (raw, task) if isinstance(v, str) and v.strip()}
|
|
73
|
-
return bool(values & _ACORE_OUTPUT_DICT_VALUES)
|
|
74
|
-
return False
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def normalize_output_spec_for_runtime(output: Any) -> Dict[str, Any]:
|
|
78
|
-
"""Normalize an AbstractCore output selector using the same public aliases as core."""
|
|
79
|
-
|
|
80
|
-
if isinstance(output, str):
|
|
81
|
-
spec: Dict[str, Any] = {"modality": output}
|
|
82
|
-
elif isinstance(output, dict):
|
|
83
|
-
spec = dict(output)
|
|
84
|
-
spec["modality"] = spec.get("modality", spec.get("type", spec.get("output")))
|
|
85
|
-
else:
|
|
86
|
-
raise ValueError("output must be a string, dict, or list of output specs")
|
|
87
|
-
|
|
88
|
-
modality = str(spec.get("modality") or "").strip().lower()
|
|
89
|
-
task = str(spec.get("task") or "").strip().lower()
|
|
90
|
-
|
|
91
|
-
if modality in _ACORE_OUTPUT_MODALITY_ALIASES:
|
|
92
|
-
modality, default_task = _ACORE_OUTPUT_MODALITY_ALIASES[modality]
|
|
93
|
-
task = task or default_task
|
|
94
|
-
|
|
95
|
-
if task in _ACORE_OUTPUT_TASK_ALIASES:
|
|
96
|
-
task = _ACORE_OUTPUT_TASK_ALIASES[task]
|
|
97
|
-
|
|
98
|
-
if not modality:
|
|
99
|
-
if task in {"tts", "voice_clone"}:
|
|
100
|
-
modality = "voice"
|
|
101
|
-
elif task in {"transcription"}:
|
|
102
|
-
modality = "text"
|
|
103
|
-
elif task in {"image_generation", "image_edit"}:
|
|
104
|
-
modality = "image"
|
|
105
|
-
|
|
106
|
-
spec["modality"] = modality
|
|
107
|
-
if task:
|
|
108
|
-
spec["task"] = task
|
|
109
|
-
return spec
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
def normalize_output_specs_for_runtime(output: Any) -> List[Dict[str, Any]]:
|
|
113
|
-
if isinstance(output, (list, tuple)):
|
|
114
|
-
return [normalize_output_spec_for_runtime(item) for item in output]
|
|
115
|
-
return [normalize_output_spec_for_runtime(output)]
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def strip_runtime_output_metadata_for_core(output: Any) -> Any:
|
|
119
|
-
"""Keep runtime artifact metadata out of AbstractCore capability kwargs."""
|
|
120
|
-
|
|
121
|
-
if isinstance(output, (list, tuple)):
|
|
122
|
-
return [strip_runtime_output_metadata_for_core(item) for item in output]
|
|
123
|
-
if not isinstance(output, dict):
|
|
124
|
-
return output
|
|
125
|
-
|
|
126
|
-
spec = dict(output)
|
|
127
|
-
# Runtime stores generated bytes after normalization. Keep artifact metadata
|
|
128
|
-
# away from provider/capability kwargs that may receive output specs directly.
|
|
129
|
-
for key in ("run_id", "tags", "artifact_id"):
|
|
130
|
-
spec.pop(key, None)
|
|
131
|
-
return spec
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def output_runtime_metadata(output: Any) -> tuple[Optional[str], Dict[str, Any]]:
|
|
135
|
-
"""Extract runtime storage metadata from an AbstractCore output selector."""
|
|
136
|
-
|
|
137
|
-
if not is_abstractcore_output_request(output):
|
|
138
|
-
return None, {}
|
|
139
|
-
|
|
140
|
-
specs = normalize_output_specs_for_runtime(output)
|
|
141
|
-
run_id: Optional[str] = None
|
|
142
|
-
tags: Dict[str, Any] = {}
|
|
143
|
-
for spec in specs:
|
|
144
|
-
raw_run_id = spec.get("run_id")
|
|
145
|
-
if run_id is None and isinstance(raw_run_id, str) and raw_run_id.strip():
|
|
146
|
-
run_id = raw_run_id.strip()
|
|
147
|
-
|
|
148
|
-
raw_tags = spec.get("tags")
|
|
149
|
-
if isinstance(raw_tags, dict):
|
|
150
|
-
tags.update({str(k): str(v) for k, v in raw_tags.items() if k is not None and v is not None})
|
|
151
|
-
|
|
152
|
-
return run_id, tags
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
def output_request_has_generated_media(output: Any) -> bool:
|
|
156
|
-
"""Return True when an output selector can produce generated binary media."""
|
|
157
|
-
|
|
158
|
-
if not is_abstractcore_output_request(output):
|
|
159
|
-
return False
|
|
160
|
-
specs = normalize_output_specs_for_runtime(output)
|
|
161
|
-
return any(str(spec.get("modality") or "").strip().lower() != "text" for spec in specs)
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
def output_request_has_non_text_result(output: Any) -> bool:
|
|
165
|
-
if not is_abstractcore_output_request(output):
|
|
166
|
-
return False
|
|
167
|
-
specs = normalize_output_specs_for_runtime(output)
|
|
168
|
-
for spec in specs:
|
|
169
|
-
modality = str(spec.get("modality") or "").strip().lower()
|
|
170
|
-
task = str(spec.get("task") or "").strip().lower()
|
|
171
|
-
if modality != "text" or task == "transcription":
|
|
172
|
-
return True
|
|
173
|
-
return False
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/0001_layered_coupling_with_abstractcore.md
RENAMED
|
File without changes
|
{abstractruntime-0.4.4 → abstractruntime-0.4.5}/docs/adr/0002_execution_modes_local_remote_hybrid.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|