AbstractRuntime 0.4.3__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.3 → abstractruntime-0.4.5}/.github/workflows/ci.yml +2 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/.github/workflows/release.yml +2 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/CHANGELOG.md +47 -2
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/PKG-INFO +9 -7
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/README.md +4 -4
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/README.md +1 -1
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/api.md +20 -1
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/architecture.md +17 -3
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/README.md +1 -1
- abstractruntime-0.4.5/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +74 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/faq.md +29 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/getting-started.md +2 -2
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/integrations/abstractcore.md +79 -1
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/limits.md +1 -1
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/proposal.md +2 -2
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/provenance.md +1 -1
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/llms-full.txt +78 -3
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/llms.txt +6 -3
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/pyproject.toml +9 -3
- abstractruntime-0.4.5/release-notes.md +6 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +146 -6
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/factory.py +2 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/llm_client.py +1010 -25
- abstractruntime-0.4.5/src/abstractruntime/integrations/abstractcore/output_specs.py +73 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/compiler.py +75 -1
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/executor.py +32 -9
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_integration_abstractcore.py +14 -6
- abstractruntime-0.4.5/tests/test_multimodal_abstractcore_integration.py +796 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_prompt_cache_modules.py +70 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_real_integration.py +11 -5
- abstractruntime-0.4.5/tests/test_visualflow_llm_call_multimodal_output.py +146 -0
- abstractruntime-0.4.3/0 +0 -0
- abstractruntime-0.4.3/release-notes.md +0 -33
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/.gitignore +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/LICENSE +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/ROADMAP.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/SECURITY.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/evidence.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/manual_testing.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/snapshots.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/tools-comms.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/emails.config.example.yaml +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/examples/README.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/mkdocs.yml +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/pytest.ini +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/README.md +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/conftest.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_command_store.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_offloading.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.4.3 → abstractruntime-0.4.5}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
|
@@ -39,6 +39,8 @@ jobs:
|
|
|
39
39
|
tests/test_tool_approval_resume_executes.py \
|
|
40
40
|
tests/test_remote_llm_client.py \
|
|
41
41
|
tests/test_prompt_cache_modules.py \
|
|
42
|
+
tests/test_multimodal_abstractcore_integration.py \
|
|
43
|
+
tests/test_visualflow_llm_call_multimodal_output.py \
|
|
42
44
|
tests/test_visual_multi_entry_loop_overrides.py \
|
|
43
45
|
tests/test_control_adapter_while.py \
|
|
44
46
|
tests/test_jsonl_ledger_recovery.py \
|
|
@@ -51,6 +51,8 @@ jobs:
|
|
|
51
51
|
tests/test_tool_approval_resume_executes.py \
|
|
52
52
|
tests/test_remote_llm_client.py \
|
|
53
53
|
tests/test_prompt_cache_modules.py \
|
|
54
|
+
tests/test_multimodal_abstractcore_integration.py \
|
|
55
|
+
tests/test_visualflow_llm_call_multimodal_output.py \
|
|
54
56
|
tests/test_visual_multi_entry_loop_overrides.py \
|
|
55
57
|
tests/test_control_adapter_while.py \
|
|
56
58
|
tests/test_jsonl_ledger_recovery.py \
|
|
@@ -7,9 +7,52 @@ 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
|
+
|
|
19
|
+
## [0.4.4] - 2026-05-07
|
|
20
|
+
|
|
10
21
|
### Added
|
|
22
|
+
- **AbstractCore multimodal generation integration**:
|
|
23
|
+
- `LLM_CALL` now forwards AbstractCore's unified `generate(..., output=...)` selector for image generation, TTS/voice output, and audio transcription
|
|
24
|
+
- generated binary outputs are normalized into JSON-safe runtime results with ArtifactStore-backed refs instead of inline bytes
|
|
25
|
+
- local runtimes can use AbstractCore capability plugins such as AbstractVision and AbstractVoice through the same runtime effect shape
|
|
26
|
+
- remote runtimes support AbstractCore Server image generation, speech, and transcription endpoints, plus OpenAI-compatible chat media content arrays
|
|
27
|
+
- **Multimodal packaging extra**:
|
|
28
|
+
- new `abstractruntime[multimodal]` extra installs `abstractcore[media,openai,vision,voice,audio]>=2.13.8`
|
|
29
|
+
- **VisualFlow LLM media selectors**:
|
|
30
|
+
- LLM nodes lowered from VisualFlow can request generated media through `output` / `outputs` from node config or input data
|
|
31
|
+
|
|
11
32
|
### Changed
|
|
33
|
+
- Minimum `abstractcore` optional dependency increased to `>=2.13.8` for the unified multimodal response types.
|
|
34
|
+
- `LLM_CALL` accepts top-level `text`, top-level `output`, and top-level `outputs` as a runtime alias for AbstractCore `output`.
|
|
35
|
+
- `LLM_CALL.media` accepts one media item or a list; artifact refs are materialized to provider-ready temporary files before model calls.
|
|
36
|
+
- Remote AbstractCore clients now preserve existing OpenAI-style content arrays when adding media attachments.
|
|
37
|
+
- Remote AbstractCore clients now resolve ArtifactStore-backed media refs for direct client use, matching the runtime effect-handler path.
|
|
38
|
+
- VisualFlow LLM pending-call lowering now carries `output` / `outputs` selectors into runtime LLM effects.
|
|
39
|
+
- VisualFlow LLM result syncing now projects generated media artifacts into node outputs such as `outputs`, `resources`, `artifact_ref`, `artifact_id`, and `meta.output_mode`.
|
|
40
|
+
|
|
12
41
|
### Fixed
|
|
42
|
+
- 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.
|
|
43
|
+
- Generated binary media now fails closed without an ArtifactStore instead of embedding base64 bytes in durable state.
|
|
44
|
+
- Remote image/TTS/STT calls no longer reuse the chat model unless an output-specific media model is supplied.
|
|
45
|
+
- 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.
|
|
46
|
+
- Turn-grounding injection now preserves structured multimodal message content arrays instead of stringifying them.
|
|
47
|
+
- 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.
|
|
48
|
+
|
|
49
|
+
### Documentation
|
|
50
|
+
- 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.
|
|
51
|
+
- 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.
|
|
52
|
+
|
|
53
|
+
### Testing
|
|
54
|
+
- 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.
|
|
55
|
+
- Added coverage for effective prompt-cache key identity and VisualFlow LLM media selector/result projection.
|
|
13
56
|
|
|
14
57
|
## [0.4.3] - 2026-05-06
|
|
15
58
|
|
|
@@ -19,7 +62,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
19
62
|
- local clients can maintain compartmentalized `system | tools | history` prompt-cache modules when providers support `local_control_plane`
|
|
20
63
|
- remote clients proxy `/acore/prompt_cache/*` endpoints for gateway/CLI hosts
|
|
21
64
|
- **Artifact-backed media for AbstractCore LLM calls**:
|
|
22
|
-
- local
|
|
65
|
+
- local and remote AbstractCore clients can resolve runtime artifact refs into provider-ready media inputs
|
|
23
66
|
- AbstractCore runtime factories now pass the runtime artifact store into LLM clients
|
|
24
67
|
- **Durable tool approval execution**:
|
|
25
68
|
- `ToolApprovalPolicy` and `ApprovalToolExecutor` support safe auto-approval, durable approval waits, and approved re-execution
|
|
@@ -289,7 +332,9 @@ AbstractRuntime is the durable execution substrate designed to pair with Abstrac
|
|
|
289
332
|
|
|
290
333
|
Initial development version with basic proof-of-concept features.
|
|
291
334
|
|
|
292
|
-
[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
|
|
337
|
+
[0.4.4]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.4
|
|
293
338
|
[0.4.3]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.3
|
|
294
339
|
[0.4.2]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.2
|
|
295
340
|
[0.4.1]: https://github.com/lpalbou/abstractruntime/releases/tag/v0.4.1
|
|
@@ -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,13 +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
|
+
Provides-Extra: multimodal
|
|
33
|
+
Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.9; extra == 'multimodal'
|
|
32
34
|
Provides-Extra: test
|
|
33
35
|
Requires-Dist: pytest>=7.0.0; extra == 'test'
|
|
34
36
|
Description-Content-Type: text/markdown
|
|
@@ -39,7 +41,7 @@ Description-Content-Type: text/markdown
|
|
|
39
41
|
|
|
40
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.
|
|
41
43
|
|
|
42
|
-
**Version:** 0.4.
|
|
44
|
+
**Version:** 0.4.5 • **Python:** 3.10+
|
|
43
45
|
|
|
44
46
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
45
47
|
|
|
@@ -73,7 +75,7 @@ AbstractCore integration (LLM + tools):
|
|
|
73
75
|
pip install "abstractruntime[abstractcore]"
|
|
74
76
|
```
|
|
75
77
|
|
|
76
|
-
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.
|
|
77
79
|
|
|
78
80
|
MCP worker entrypoint (default toolsets over stdio):
|
|
79
81
|
|
|
@@ -122,7 +124,7 @@ state = rt.resume(
|
|
|
122
124
|
assert state.status.value == "completed"
|
|
123
125
|
```
|
|
124
126
|
|
|
125
|
-
## What’s included (v0.4.
|
|
127
|
+
## What’s included (v0.4.5)
|
|
126
128
|
|
|
127
129
|
Kernel (dependency-light):
|
|
128
130
|
- workflow graphs: `WorkflowSpec` (`src/abstractruntime/core/spec.py`)
|
|
@@ -146,7 +148,7 @@ Drivers + distribution:
|
|
|
146
148
|
- run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
|
|
147
149
|
|
|
148
150
|
Optional integrations:
|
|
149
|
-
- AbstractCore (LLM + tools, prompt cache, tool approval waits): `docs/integrations/abstractcore.md`
|
|
151
|
+
- AbstractCore (LLM + tools, cached sessions/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
|
|
150
152
|
- comms toolset gating (email/WhatsApp/Telegram): `docs/tools-comms.md`
|
|
151
153
|
|
|
152
154
|
## Built-in scheduler (zero-config)
|
|
@@ -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`)
|
|
@@ -111,7 +111,7 @@ Drivers + distribution:
|
|
|
111
111
|
- run history export: `export_run_history_bundle(...)` (`src/abstractruntime/history_bundle.py`)
|
|
112
112
|
|
|
113
113
|
Optional integrations:
|
|
114
|
-
- AbstractCore (LLM + tools, prompt cache, tool approval waits): `docs/integrations/abstractcore.md`
|
|
114
|
+
- AbstractCore (LLM + tools, cached sessions/prompt cache, media inputs, generated media, tool approval waits): `docs/integrations/abstractcore.md`
|
|
115
115
|
- comms toolset gating (email/WhatsApp/Telegram): `docs/tools-comms.md`
|
|
116
116
|
|
|
117
117
|
## Built-in scheduler (zero-config)
|
|
@@ -24,7 +24,7 @@ In this repo, the AbstractCore wiring lives under `src/abstractruntime/integrati
|
|
|
24
24
|
|
|
25
25
|
- `faq.md` — common questions (recommended)
|
|
26
26
|
- `manual_testing.md` — manual smoke tests and how to run the test suite
|
|
27
|
-
- `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, prompt-cache control, and tool approval waits via AbstractCore
|
|
27
|
+
- `integrations/abstractcore.md` — wiring `LLM_CALL` / `TOOL_CALLS`, cached sessions/prompt-cache control, media inputs, generated media outputs, and tool approval waits via AbstractCore
|
|
28
28
|
- `tools-comms.md` — enabling the optional comms toolset (email/WhatsApp/Telegram)
|
|
29
29
|
|
|
30
30
|
## Features (reference)
|
|
@@ -125,6 +125,7 @@ Key types:
|
|
|
125
125
|
Artifacts are used by:
|
|
126
126
|
- offloading wrappers (`src/abstractruntime/storage/offloading.py`)
|
|
127
127
|
- evidence capture (`docs/evidence.md`, `src/abstractruntime/evidence/recorder.py`)
|
|
128
|
+
- AbstractCore media integration: input artifact refs can be materialized for LLM calls, and generated image/voice/audio outputs are stored as artifact refs
|
|
128
129
|
|
|
129
130
|
## Snapshots / bookmarks
|
|
130
131
|
|
|
@@ -175,7 +176,7 @@ This produces a portable record of a run’s state + ledger + artifacts suitable
|
|
|
175
176
|
|
|
176
177
|
### AbstractCore (LLM + tools)
|
|
177
178
|
|
|
178
|
-
Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.
|
|
179
|
+
Requires: `pip install "abstractruntime[abstractcore]"` (AbstractCore 2.13.9 or newer).
|
|
179
180
|
|
|
180
181
|
Implementation: `src/abstractruntime/integrations/abstractcore/*`.
|
|
181
182
|
|
|
@@ -185,6 +186,24 @@ Entry points:
|
|
|
185
186
|
- tool executors: `MappingToolExecutor`, `AbstractCoreToolExecutor`, `PassthroughToolExecutor`, `ApprovalToolExecutor`, `ToolApprovalPolicy` (`src/abstractruntime/integrations/abstractcore/tool_executor.py`)
|
|
186
187
|
- prompt-cache control methods on the configured LLM client: `get_prompt_cache_capabilities`, `get_prompt_cache_stats`, `prompt_cache_set`, `prompt_cache_update`, `prompt_cache_fork`, `prompt_cache_clear`, `prompt_cache_prepare_modules` (`src/abstractruntime/integrations/abstractcore/llm_client.py`)
|
|
187
188
|
|
|
189
|
+
`LLM_CALL` payloads are JSON-safe effect payloads. Common fields:
|
|
190
|
+
- `prompt`, `messages`, `system_prompt`, and convenience `text`
|
|
191
|
+
- `media`: a media path, artifact ref (`{"$artifact": "..."}` or `{"artifact_id": "..."}`), media dict, or list of those
|
|
192
|
+
- `output`: AbstractCore output selector; top-level `outputs` is accepted as a runtime alias
|
|
193
|
+
- `params`: provider/model routing, generation controls, prompt-cache keys, structured-output schema options, and tracing metadata
|
|
194
|
+
|
|
195
|
+
Multimodal support:
|
|
196
|
+
- install `abstractruntime[multimodal]` for common AbstractCore media, vision, voice, and audio dependencies
|
|
197
|
+
- local clients call AbstractCore's unified `generate(..., media=..., output=...)`
|
|
198
|
+
- remote and hybrid clients support AbstractCore Server chat media content arrays plus image generation, speech, and transcription endpoints; pass an output-specific `model` for remote media provider routing, otherwise the server endpoint can use its configured capability default
|
|
199
|
+
- remote transcription requires one audio media item that resolves to a local file path or artifact-backed temporary file
|
|
200
|
+
- generated image/voice/audio bytes require a runtime `ArtifactStore`; the result contains `artifact_id` / `artifact_ref` instead of inline bytes
|
|
201
|
+
|
|
202
|
+
Prompt cache / cached sessions:
|
|
203
|
+
- LLM clients expose cache control methods listed above for host-side preparation and inspection
|
|
204
|
+
- `LLM_CALL.params.prompt_cache_key` selects a cache key for a call; runtime can also derive a session-scoped key from `run.vars["_runtime"]["prompt_cache"]`
|
|
205
|
+
- provider cache/session handles are not durable runtime state and should not be stored in `RunState.vars`
|
|
206
|
+
|
|
188
207
|
Docs: `integrations/abstractcore.md`.
|
|
189
208
|
|
|
190
209
|
### AbstractMemory bridge (KG effects)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# AbstractRuntime — Architecture
|
|
2
2
|
|
|
3
|
-
> Updated: 2026-05-
|
|
4
|
-
> Version: 0.4.
|
|
3
|
+
> Updated: 2026-05-07
|
|
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.
|
|
@@ -26,6 +26,20 @@ Key invariants (enforced by code, not convention):
|
|
|
26
26
|
- **Append-only observability**: every step is recorded as a `StepRecord` in a `LedgerStore` (`src/abstractruntime/core/models.py`, `src/abstractruntime/storage/base.py`).
|
|
27
27
|
- **Side effects are mediated**: nodes request work via `Effect`/`EffectType`; execution happens via effect handlers (`src/abstractruntime/core/runtime.py`).
|
|
28
28
|
|
|
29
|
+
## AbstractCore capability boundary
|
|
30
|
+
|
|
31
|
+
AbstractRuntime's job is persistence and orchestration. AbstractCore owns model/provider capability execution: chat, structured output, cached sessions/prompt cache, media input analysis, image generation, voice/audio generation, transcription, and future modalities such as music or video.
|
|
32
|
+
|
|
33
|
+
The boundary is intentionally narrow:
|
|
34
|
+
- Workflow nodes request model work with `EffectType.LLM_CALL`; the runtime persists the request/result and delegates execution to the configured AbstractCore client.
|
|
35
|
+
- `media` inputs remain JSON-safe in the effect payload. Artifact refs are materialized into temporary provider-ready files for the call, then cleaned up.
|
|
36
|
+
- Generated binary outputs are written to `ArtifactStore` and returned as `artifact_id` / `artifact_ref`, keeping `RunState.vars` and ledger records bounded and JSON-safe.
|
|
37
|
+
- Remote chat media is sent to AbstractCore Server as provider-ready content arrays, but persisted provider-request metadata redacts data URLs so checkpoints and ledgers do not embed media bytes.
|
|
38
|
+
- Provider sessions and prompt-cache objects are not runtime state. Runtime may carry stable cache keys, while AbstractCore clients/servers manage warm caches.
|
|
39
|
+
- Local execution can use richer AbstractCore capability plugins. Remote and hybrid execution map the common media cases to AbstractCore Server endpoints and OpenAI-compatible content arrays, while hybrid keeps tool execution local.
|
|
40
|
+
|
|
41
|
+
This keeps the runtime usable by `../abstractgateway` and application layers such as `../abstractflow`, `../abstractassistant`, `../abstractobserver`, and `../abstractcode` without embedding provider-specific model logic in the durable kernel.
|
|
42
|
+
|
|
29
43
|
## Component map
|
|
30
44
|
|
|
31
45
|
```mermaid
|
|
@@ -152,7 +166,7 @@ Registered in `Runtime._register_builtin_handlers()` (`src/abstractruntime/core/
|
|
|
152
166
|
|
|
153
167
|
### Host-wired effects
|
|
154
168
|
The kernel defines the protocol; concrete integrations provide handlers:
|
|
155
|
-
- `LLM_CALL`, `TOOL_CALLS`: provided by AbstractCore integration (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). The integration supports local/remote/hybrid execution, prompt-cache control, provider-key header routing for remote servers, passthrough tools, and approval-gated local tool execution.
|
|
169
|
+
- `LLM_CALL`, `TOOL_CALLS`: provided by AbstractCore integration (`src/abstractruntime/integrations/abstractcore/effect_handlers.py`). The integration supports local/remote/hybrid execution, cached sessions/prompt-cache control, media inputs, generated media outputs, provider-key header routing for remote servers, passthrough tools, and approval-gated local tool execution.
|
|
156
170
|
- `MEMORY_KG_*`: provided by the AbstractMemory bridge (`src/abstractruntime/integrations/abstractmemory/effect_handlers.py`)
|
|
157
171
|
|
|
158
172
|
### Reliability: retries + idempotency
|
|
@@ -33,8 +33,8 @@ If you are new to the project, start with `../README.md` and `../architecture.md
|
|
|
33
33
|
| 014 | `planned/014_remote_tool_worker_executor.md` |
|
|
34
34
|
| 015 | `planned/015_agent_integration_improvements.md` |
|
|
35
35
|
| 017 | `planned/017_limit_warnings_and_observability.md` |
|
|
36
|
+
| 018 | `planned/018_workspace_access_policy_for_media_and_tools.md` |
|
|
36
37
|
|
|
37
38
|
## Deprecated
|
|
38
39
|
|
|
39
40
|
See `deprecated/DEPRECATED_README.md` for context on the deprecated backlog set.
|
|
40
|
-
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
## 018_workspace_access_policy_for_media_and_tools (planned)
|
|
2
|
+
|
|
3
|
+
**Status**: Planned
|
|
4
|
+
**Priority**: High
|
|
5
|
+
**Depends on**: 005_abstractcore_integration (completed), 009_artifact_store (completed)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Define and verify the runtime policy for local filesystem access used by LLMs,
|
|
12
|
+
agents, media inputs, generated outputs, and tool execution.
|
|
13
|
+
|
|
14
|
+
This item should determine which checks belong in AbstractRuntime, which checks
|
|
15
|
+
belong in host applications, and how the effective policy is represented in
|
|
16
|
+
durable run state and effect payloads.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Context / Problem
|
|
21
|
+
|
|
22
|
+
AbstractRuntime can pass local media paths to AbstractCore and can execute tools
|
|
23
|
+
that read and write files. That is expected for local agency, but it must be
|
|
24
|
+
controlled consistently.
|
|
25
|
+
|
|
26
|
+
The default posture should be deny by default:
|
|
27
|
+
- all filesystem paths are blacklisted unless explicitly allowed
|
|
28
|
+
- the active local workspace folder is whitelisted by default
|
|
29
|
+
- callers may consciously add whitelist or blacklist entries
|
|
30
|
+
- a separate risky mode may allow access to the whole machine, limited only by
|
|
31
|
+
the OS permissions of the user/group running the runtime process
|
|
32
|
+
|
|
33
|
+
This matters especially for remote AbstractCore execution, where a local media
|
|
34
|
+
path may be read by the runtime and sent to a remote server as request content.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Proposed Investigation
|
|
39
|
+
|
|
40
|
+
1. Inventory every runtime path where filesystem content can be read or written:
|
|
41
|
+
LLM media inputs, artifact materialization, generated media storage, tool
|
|
42
|
+
calls, workspace-scoped tools, and attachment/session helpers.
|
|
43
|
+
2. Identify the current source of truth for workspace roots, allowlists,
|
|
44
|
+
denylists, and risky full-machine access.
|
|
45
|
+
3. Decide whether raw path authorization should be enforced before effect
|
|
46
|
+
handlers call providers, inside shared path helpers, or entirely by hosts
|
|
47
|
+
before they submit workflows.
|
|
48
|
+
4. Define durable policy metadata for a run so replay, resume, and audit can
|
|
49
|
+
explain why a path was allowed.
|
|
50
|
+
5. Make artifact refs the preferred boundary for externally supplied media;
|
|
51
|
+
raw local paths should be trusted only after policy validation.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Acceptance Criteria
|
|
56
|
+
|
|
57
|
+
- [ ] Document the effective default policy: deny all paths except the active workspace.
|
|
58
|
+
- [ ] Document how users consciously add whitelist and blacklist paths.
|
|
59
|
+
- [ ] Document the semantics and warning requirements for risky full-machine access.
|
|
60
|
+
- [ ] Determine the enforcement layer for raw path media passed to AbstractCore.
|
|
61
|
+
- [ ] Determine the enforcement layer for tool read/write access.
|
|
62
|
+
- [ ] Add tests or conformance fixtures for allowed workspace paths, denied external paths, explicit allowlist paths, explicit blacklist overrides, and full-machine mode.
|
|
63
|
+
- [ ] Ensure remote media forwarding cannot bypass the chosen path policy.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Notes
|
|
68
|
+
|
|
69
|
+
- Policy should be expressed in terms of canonical resolved paths where possible.
|
|
70
|
+
- Blacklist entries should override broad whitelist entries.
|
|
71
|
+
- The active workspace should be explicit in runtime-visible configuration, not
|
|
72
|
+
inferred from process current working directory alone.
|
|
73
|
+
- Full-machine access is intentionally risky and should require an explicit mode
|
|
74
|
+
or consent signal.
|
|
@@ -83,6 +83,35 @@ LLM and tool execution are wired via the **AbstractCore integration**:
|
|
|
83
83
|
|
|
84
84
|
Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/*`.
|
|
85
85
|
|
|
86
|
+
## Can `LLM_CALL` analyze images, audio, or files?
|
|
87
|
+
|
|
88
|
+
Yes, when the configured AbstractCore provider/model supports the media. Pass `payload.media` as a path, a media dict, an artifact ref such as `{"$artifact": "..."}`, or a list of those. The runtime keeps the effect payload JSON-safe and materializes artifact refs into temporary provider-ready files for the call.
|
|
89
|
+
|
|
90
|
+
Install `abstractruntime[multimodal]` for common media/vision/audio dependencies.
|
|
91
|
+
Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/effect_handlers.py`, `src/abstractruntime/integrations/abstractcore/llm_client.py`.
|
|
92
|
+
|
|
93
|
+
## How do I generate images or voice/audio?
|
|
94
|
+
|
|
95
|
+
Use `LLM_CALL` with AbstractCore's `output` selector:
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
{"text": "A red cube on a white table", "output": {"modality": "image", "format": "png"}}
|
|
99
|
+
{"text": "Hello from Runtime", "output": {"modality": "voice", "voice": "alloy", "format": "wav"}}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Generated bytes require a runtime `ArtifactStore`. The durable result contains `artifact_id` / `artifact_ref`, not inline binary data. Remote and hybrid runtimes support common AbstractCore Server endpoints for image generation, speech, transcription, and chat media. Local runtimes can use richer AbstractCore capability plugins for image edits, voice cloning, and reference-guided generation.
|
|
103
|
+
|
|
104
|
+
## Does AbstractRuntime implement image, voice, music, or video engines?
|
|
105
|
+
|
|
106
|
+
No. AbstractRuntime provides the durable graph runner, checkpoint/ledger model, waits, and artifact boundary. AbstractCore provides the LLM/media generation and analysis capabilities. Future music/video support should use the same JSON-safe `output` selector plus artifact-backed result shape unless a new workflow-level wait/effect semantic is needed.
|
|
107
|
+
|
|
108
|
+
## Where should cached session or prompt-cache state live?
|
|
109
|
+
|
|
110
|
+
Store stable cache keys or cache configuration in runtime-visible JSON, for example `payload.params.prompt_cache_key` or `run.vars["_runtime"]["prompt_cache"]`. Do not store provider session objects, cache handles, clients, or warm-cache state in `RunState.vars`. AbstractCore clients/servers own those objects, and runtime correctness should still hold when a cache is cold.
|
|
111
|
+
|
|
112
|
+
Hosts can inspect or prepare caches through the configured `_abstractcore_llm_client` control-plane methods (`get_prompt_cache_capabilities`, `prompt_cache_prepare_modules`, and related methods).
|
|
113
|
+
Docs: `integrations/abstractcore.md`. Code: `src/abstractruntime/integrations/abstractcore/llm_client.py`.
|
|
114
|
+
|
|
86
115
|
## What are “local / remote / hybrid” execution modes?
|
|
87
116
|
|
|
88
117
|
They refer to where LLM and tools execute:
|
|
@@ -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
|
|
|
@@ -142,4 +142,4 @@ rt = create_local_runtime(provider="ollama", model="qwen3:4b")
|
|
|
142
142
|
- `architecture.md` — component map + durability invariants (with diagrams)
|
|
143
143
|
- `manual_testing.md` — smoke tests and how to run `pytest`
|
|
144
144
|
- `../examples/README.md` — runnable scripts
|
|
145
|
-
- `integrations/abstractcore.md` — `LLM_CALL` / `TOOL_CALLS
|
|
145
|
+
- `integrations/abstractcore.md` — `LLM_CALL` / `TOOL_CALLS`, cached sessions/prompt-cache, media inputs, generated media
|
|
@@ -16,7 +16,15 @@ 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
|
+
|
|
21
|
+
For AbstractCore's multimodal `generate(..., output=...)` path, use the newer baseline and optional media packages:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pip install "abstractruntime[multimodal]"
|
|
25
|
+
```
|
|
26
|
+
|
|
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).
|
|
20
28
|
|
|
21
29
|
The MCP worker entrypoint uses the `mcp-worker` extra:
|
|
22
30
|
|
|
@@ -82,8 +90,11 @@ print(state.output)
|
|
|
82
90
|
```json
|
|
83
91
|
{
|
|
84
92
|
"prompt": "...",
|
|
93
|
+
"text": "optional text alias, useful for TTS",
|
|
85
94
|
"messages": [{"role": "user", "content": "..."}],
|
|
86
95
|
"system_prompt": "...",
|
|
96
|
+
"media": ["path/or/artifact-ref"],
|
|
97
|
+
"output": {"modality": "text|image|voice", "task": "optional"},
|
|
87
98
|
"tools": [{"name": "...", "description": "...", "parameters": {...}}],
|
|
88
99
|
"params": {
|
|
89
100
|
"temperature": 0.0,
|
|
@@ -97,6 +108,73 @@ Notes:
|
|
|
97
108
|
- Remote mode supports per-request dynamic routing by forwarding `params.base_url` to the AbstractCore server request body (`src/abstractruntime/integrations/abstractcore/llm_client.py`).
|
|
98
109
|
- Remote mode sends per-request provider key overrides from `params.api_key` / `params.provider_api_key` as `X-AbstractCore-Provider-API-Key` headers. Server/master auth should be supplied separately through the client's configured headers, usually `Authorization: Bearer <ABSTRACTCORE_SERVER_API_KEY>`.
|
|
99
110
|
- Local mode treats `base_url` as a provider construction concern; the local client intentionally strips `params.base_url`.
|
|
111
|
+
- `media` accepts one item or a list. Durable artifact refs such as `{"$artifact": "...", "filename": "speech.wav"}` are materialized to temporary files for AbstractCore and never stored as raw bytes in `RunState`.
|
|
112
|
+
- `output` may be top-level or inside `params`; top-level `outputs` is accepted as a runtime alias for AbstractCore's `output`.
|
|
113
|
+
- `output.tags`, when present, are merged into the generated artifact metadata. Runtime metadata such as `run_id` and `tags` is used by AbstractRuntime's ArtifactStore boundary and is not forwarded as provider-specific generation kwargs.
|
|
114
|
+
|
|
115
|
+
## Multimodal generation
|
|
116
|
+
|
|
117
|
+
AbstractRuntime forwards AbstractCore's unified `generate(..., output=...)` selector and normalizes multimodal responses into JSON-safe, artifact-backed results.
|
|
118
|
+
|
|
119
|
+
Generate an image:
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
Effect(
|
|
123
|
+
type=EffectType.LLM_CALL,
|
|
124
|
+
payload={
|
|
125
|
+
"prompt": "A red ceramic mug on a white table.",
|
|
126
|
+
"output": {"modality": "image", "format": "png", "width": 1024, "height": 1024},
|
|
127
|
+
},
|
|
128
|
+
result_key="image_result",
|
|
129
|
+
)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Generate speech:
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
Effect(
|
|
136
|
+
type=EffectType.LLM_CALL,
|
|
137
|
+
payload={
|
|
138
|
+
"text": "Hello from AbstractRuntime.",
|
|
139
|
+
"output": {"modality": "voice", "voice": "coral", "format": "wav"},
|
|
140
|
+
},
|
|
141
|
+
result_key="speech_result",
|
|
142
|
+
)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Transcribe/analyze audio:
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
Effect(
|
|
149
|
+
type=EffectType.LLM_CALL,
|
|
150
|
+
payload={
|
|
151
|
+
"media": {"$artifact": "audio_artifact_id", "filename": "speech.wav"},
|
|
152
|
+
"output": "text",
|
|
153
|
+
},
|
|
154
|
+
result_key="transcript",
|
|
155
|
+
)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Generated binary media requires a runtime `ArtifactStore` and is stored there. The persisted result contains artifact references:
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"outputs": {
|
|
163
|
+
"image": [
|
|
164
|
+
{
|
|
165
|
+
"modality": "image",
|
|
166
|
+
"task": "image_generation",
|
|
167
|
+
"artifact_id": "...",
|
|
168
|
+
"artifact_ref": {"$artifact": "...", "content_type": "image/png"}
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Remote runtimes support chat media by sending OpenAI-compatible data URL content arrays to AbstractCore Server. They also support image generation (`/v1/images/generations`), TTS (`/v1/audio/speech`), and STT (`/v1/audio/transcriptions`) with the same artifact-backed result shape. Remote media endpoint calls do not inherit the chat model by default; pass an output-specific `model` only when you want a remote provider/model instead of the server's configured capability default. Remote STT requires exactly one audio media item that resolves to a local file path or artifact-backed temporary file. For image edits, input-media image generation, voice clone/register, or reference-guided TTS, use local execution so AbstractCore can use its in-process capability dispatcher.
|
|
176
|
+
|
|
177
|
+
Remote multimodal generation currently supports one `output` selector per `LLM_CALL`. Hybrid runtimes use the same remote LLM/media path as remote mode while executing tools locally. Local runtimes can use AbstractCore's in-process multimodal dispatcher for richer capability plugin behavior.
|
|
100
178
|
|
|
101
179
|
Remote auth example:
|
|
102
180
|
|
|
@@ -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
|
|
@@ -88,7 +88,7 @@ As of v0.4.3 (`pyproject.toml`):
|
|
|
88
88
|
- snapshots, tamper-evident ledger chain, ledger subscriptions
|
|
89
89
|
- VisualFlow compiler + WorkflowBundles (`src/abstractruntime/visualflow_compiler/*`, `src/abstractruntime/workflow_bundle/*`)
|
|
90
90
|
- VisualFlow multi-entry lowering for fan-in execution routes (`join_exec` / `path_mux`)
|
|
91
|
-
- AbstractCore integration with local/remote/hybrid LLM execution, prompt-cache control, tool approval waits, and provider-key header routing (`integrations/abstractcore.md`)
|
|
91
|
+
- AbstractCore integration with local/remote/hybrid LLM execution, cached sessions/prompt-cache control, media inputs, generated media outputs, tool approval waits, and provider-key header routing (`integrations/abstractcore.md`)
|
|
92
92
|
- evidence capture helpers (`src/abstractruntime/evidence/recorder.py`, `Runtime.list_evidence/load_evidence`)
|
|
93
93
|
- run history bundle export (`src/abstractruntime/history_bundle.py`)
|
|
94
94
|
|
|
@@ -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
|