AbstractRuntime 0.4.10__tar.gz → 0.4.12__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.10 → abstractruntime-0.4.12}/.github/workflows/release.yml +45 -22
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/CHANGELOG.md +19 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/PKG-INFO +8 -8
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/integrations/abstractcore.md +15 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/pyproject.toml +8 -8
- abstractruntime-0.4.12/release-notes.md +6 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/core/runtime.py +20 -2
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +43 -2
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/llm_client.py +310 -54
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +89 -5
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/compiler.py +22 -6
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/executor.py +46 -39
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_client_media_artifacts.py +8 -3
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_client_system_context.py +73 -35
- abstractruntime-0.4.12/tests/test_media_artifact_resolution.py +66 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_multimodal_abstractcore_integration.py +109 -1
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_runtime_llm_call_grounding_in_ledger.py +16 -3
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_session_attachments_registry_and_open_tool.py +9 -1
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_multi_entry_loop_overrides.py +32 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_media_nodes.py +25 -7
- abstractruntime-0.4.10/release-notes.md +0 -6
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/.gitignore +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/LICENSE +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/README.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/ROADMAP.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/SECURITY.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/README.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/adr/README.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/api.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/architecture.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/README.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/planned/015_agent_integration_improvements.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/proposed/2026-05-08_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/proposed/2026-05-08_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/backlog/proposed/2026-05-09_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/evidence.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/faq.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/getting-started.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/limits.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/manual_testing.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/proposal.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/provenance.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/snapshots.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/tools-comms.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/emails.config.example.yaml +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/examples/05_persistence.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/examples/README.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/llms-full.txt +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/llms.txt +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/mkdocs.yml +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/pytest.ini +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/json_files.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/README.md +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/conftest.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_command_store.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_offloading.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.4.10 → abstractruntime-0.4.12}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
name: Release
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*.*.*"
|
|
4
7
|
workflow_dispatch:
|
|
5
8
|
inputs:
|
|
6
9
|
version:
|
|
@@ -111,7 +114,9 @@ jobs:
|
|
|
111
114
|
import urllib.request
|
|
112
115
|
from pathlib import Path
|
|
113
116
|
|
|
114
|
-
|
|
117
|
+
version_input = os.environ.get("RELEASE_INPUT_VERSION", "").strip()
|
|
118
|
+
ref_name = os.environ.get("GITHUB_REF_NAME", "").strip()
|
|
119
|
+
raw_version = version_input or ref_name
|
|
115
120
|
version = raw_version[1:] if raw_version.startswith("v") else raw_version
|
|
116
121
|
if not re.fullmatch(r"\d+\.\d+\.\d+(?:[a-zA-Z0-9.-]+)?", version):
|
|
117
122
|
raise SystemExit(f"Invalid release version: {raw_version!r}")
|
|
@@ -136,28 +141,36 @@ jobs:
|
|
|
136
141
|
raise SystemExit(f"CHANGELOG.md entry for {version} is empty")
|
|
137
142
|
Path("release-notes.md").write_text(notes + "\n", encoding="utf-8")
|
|
138
143
|
|
|
139
|
-
|
|
144
|
+
event_name = os.environ.get("GITHUB_EVENT_NAME", "")
|
|
145
|
+
publish = event_name == "push" or os.environ["RELEASE_PUBLISH"].lower() == "true"
|
|
140
146
|
if publish:
|
|
141
|
-
if os.environ.get("GITHUB_REF") != "refs/heads/main":
|
|
147
|
+
if event_name == "workflow_dispatch" and os.environ.get("GITHUB_REF") != "refs/heads/main":
|
|
142
148
|
raise SystemExit("Publishing is only allowed from the main branch.")
|
|
143
149
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
+
if event_name == "workflow_dispatch":
|
|
151
|
+
expected = f"publish-abstractruntime-{version}"
|
|
152
|
+
confirmation = os.environ.get("RELEASE_CONFIRMATION", "").strip()
|
|
153
|
+
if confirmation != expected:
|
|
154
|
+
raise SystemExit(
|
|
155
|
+
f"publish_confirmation must be exactly {expected!r}; got {confirmation!r}"
|
|
156
|
+
)
|
|
150
157
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
if event_name == "workflow_dispatch":
|
|
159
|
+
tag_check = subprocess.run(
|
|
160
|
+
["git", "ls-remote", "--exit-code", "--tags", "origin", f"refs/tags/{tag}^{{}}"],
|
|
161
|
+
check=False,
|
|
162
|
+
capture_output=True,
|
|
163
|
+
text=True,
|
|
164
|
+
)
|
|
165
|
+
if tag_check.returncode == 0:
|
|
166
|
+
remote_sha = tag_check.stdout.split()[0].strip() if tag_check.stdout.split() else ""
|
|
167
|
+
local_sha = subprocess.check_output(["git", "rev-parse", "HEAD"], text=True).strip()
|
|
168
|
+
if remote_sha != local_sha:
|
|
169
|
+
raise SystemExit(
|
|
170
|
+
f"Remote tag {tag} already exists at {remote_sha}, but current commit is {local_sha}."
|
|
171
|
+
)
|
|
172
|
+
elif tag_check.returncode != 2:
|
|
173
|
+
raise SystemExit(f"Could not check remote tag {tag}.")
|
|
161
174
|
|
|
162
175
|
try:
|
|
163
176
|
with urllib.request.urlopen(
|
|
@@ -200,17 +213,27 @@ jobs:
|
|
|
200
213
|
- uses: actions/checkout@v4
|
|
201
214
|
with:
|
|
202
215
|
fetch-depth: 0
|
|
203
|
-
- name: Create annotated tag
|
|
216
|
+
- name: Create annotated tag for manual releases
|
|
217
|
+
if: github.event_name == 'workflow_dispatch'
|
|
204
218
|
run: |
|
|
205
219
|
tag="${{ needs.build.outputs.tag }}"
|
|
206
220
|
if git ls-remote --exit-code --tags origin "refs/tags/${tag}" >/dev/null 2>&1; then
|
|
207
|
-
|
|
208
|
-
|
|
221
|
+
remote_sha="$(git ls-remote --tags origin "refs/tags/${tag}^{}" | awk '{print $1}')"
|
|
222
|
+
local_sha="$(git rev-parse HEAD)"
|
|
223
|
+
if [ "${remote_sha}" != "${local_sha}" ]; then
|
|
224
|
+
echo "Tag ${tag} already exists at ${remote_sha}, but current commit is ${local_sha}."
|
|
225
|
+
exit 1
|
|
226
|
+
fi
|
|
227
|
+
echo "Tag ${tag} already exists on origin for the same commit. Reusing it."
|
|
228
|
+
exit 0
|
|
209
229
|
fi
|
|
210
230
|
git config user.name "github-actions[bot]"
|
|
211
231
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
212
232
|
git tag -a "${tag}" -m "AbstractRuntime ${tag}"
|
|
213
233
|
git push origin "${tag}"
|
|
234
|
+
- name: Tag already supplied by push trigger
|
|
235
|
+
if: github.event_name != 'workflow_dispatch'
|
|
236
|
+
run: echo "Using existing tag ${{ needs.build.outputs.tag }}"
|
|
214
237
|
|
|
215
238
|
publish-pypi:
|
|
216
239
|
name: Publish to PyPI
|
|
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.12] - 2026-05-19
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Remote AbstractCore transcription now uses provider-scoped audio routes such as `/{provider}/v1/audio/transcriptions` when an STT provider is selected.
|
|
14
|
+
- VisualFlow generated media nodes now keep LLM `provider`/`model` routing separate from image, TTS, and STT provider/model pins.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- Minimum AbstractCore optional dependency floor is now `abstractcore>=2.13.15`.
|
|
18
|
+
|
|
19
|
+
## [0.4.11] - 2026-05-13
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- AbstractCore effect-handler media materialization now preserves artifact `content_type`, media `type`, artifact ids, and safe filename extensions instead of dropping artifact-backed media to bare paths. This keeps generated WAV artifacts valid for downstream transcription nodes.
|
|
23
|
+
- Added explicit MIME extension aliases for common generated media types such as `audio/wav`, `image/png`, and `video/mp4` so platform MIME table differences do not create extensionless temp files.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
- Minimum AbstractCore optional dependency floor is now `abstractcore>=2.13.14`.
|
|
27
|
+
|
|
28
|
+
|
|
10
29
|
## [0.4.10] - 2026-05-12
|
|
11
30
|
|
|
12
31
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.12
|
|
4
4
|
Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
|
|
5
5
|
Project-URL: AbstractCore (website), https://www.abstractcore.ai/
|
|
6
6
|
Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
|
|
@@ -23,23 +23,23 @@ Requires-Python: >=3.10
|
|
|
23
23
|
Requires-Dist: abstractmemory>=0.2.6
|
|
24
24
|
Requires-Dist: abstractsemantics>=0.0.3
|
|
25
25
|
Provides-Extra: abstractcore
|
|
26
|
-
Requires-Dist: abstractcore>=2.13.
|
|
26
|
+
Requires-Dist: abstractcore>=2.13.15; extra == 'abstractcore'
|
|
27
27
|
Provides-Extra: all-apple
|
|
28
|
-
Requires-Dist: abstractcore[all-apple]>=2.13.
|
|
28
|
+
Requires-Dist: abstractcore[all-apple]>=2.13.15; extra == 'all-apple'
|
|
29
29
|
Provides-Extra: all-gpu
|
|
30
|
-
Requires-Dist: abstractcore[all-gpu]>=2.13.
|
|
30
|
+
Requires-Dist: abstractcore[all-gpu]>=2.13.15; extra == 'all-gpu'
|
|
31
31
|
Provides-Extra: apple
|
|
32
|
-
Requires-Dist: abstractcore[apple]>=2.13.
|
|
32
|
+
Requires-Dist: abstractcore[apple]>=2.13.15; extra == 'apple'
|
|
33
33
|
Provides-Extra: docs
|
|
34
34
|
Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
|
|
35
35
|
Requires-Dist: mkdocs>=1.6.0; extra == 'docs'
|
|
36
36
|
Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
|
|
37
37
|
Provides-Extra: gpu
|
|
38
|
-
Requires-Dist: abstractcore[gpu]>=2.13.
|
|
38
|
+
Requires-Dist: abstractcore[gpu]>=2.13.15; extra == 'gpu'
|
|
39
39
|
Provides-Extra: mcp-worker
|
|
40
|
-
Requires-Dist: abstractcore[tools]>=2.13.
|
|
40
|
+
Requires-Dist: abstractcore[tools]>=2.13.15; extra == 'mcp-worker'
|
|
41
41
|
Provides-Extra: multimodal
|
|
42
|
-
Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.
|
|
42
|
+
Requires-Dist: abstractcore[audio,media,openai,vision,voice]>=2.13.15; extra == 'multimodal'
|
|
43
43
|
Provides-Extra: test
|
|
44
44
|
Requires-Dist: pytest>=7.0.0; extra == 'test'
|
|
45
45
|
Description-Content-Type: text/markdown
|
|
@@ -115,6 +115,21 @@ Notes:
|
|
|
115
115
|
- `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.
|
|
116
116
|
- Host-supplied run defaults such as `run.vars["_runtime"]["provider"]` and `run.vars["_runtime"]["model"]` are persisted as JSON-safe routing metadata; provider clients, auth objects, downloaded model handles, and server sessions are not durable runtime state.
|
|
117
117
|
|
|
118
|
+
## Runtime grounding
|
|
119
|
+
|
|
120
|
+
AbstractRuntime records per-call grounding as structured response metadata under `metadata.runtime_grounding`. The current fields include local datetime, timezone when detectable, country, source, whether prompt injection occurred, and an optional user identity when supplied by trace metadata or local environment.
|
|
121
|
+
|
|
122
|
+
For text/chat LLM calls only, the same grounding is rendered into the current user turn as a tagged runtime envelope:
|
|
123
|
+
|
|
124
|
+
```text
|
|
125
|
+
<runtime_metadata>{"country":"FR","local_datetime":"2026-05-13T18:00:00+02:00"}</runtime_metadata>
|
|
126
|
+
hello
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
This makes time/location/user context visible to the LLM without mutating the durable human message into a natural-language prefix. If a model echoes the runtime-owned envelope, AbstractRuntime removes that envelope from user-facing response text while preserving `metadata.runtime_grounding` for audit.
|
|
130
|
+
|
|
131
|
+
Direct media requests, including image generation, TTS, and transcription, do not receive prompt-injected grounding. They still receive trace headers/tags for observability and artifact ownership, but TTS `input` and image prompts remain the literal text supplied by the workflow.
|
|
132
|
+
|
|
118
133
|
## Multimodal generation
|
|
119
134
|
|
|
120
135
|
AbstractRuntime forwards AbstractCore's unified `generate(..., output=...)` selector and normalizes multimodal responses into JSON-safe, artifact-backed results.
|
|
@@ -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.12"
|
|
8
8
|
description = "AbstractRuntime: a durable graph runner designed to pair with AbstractCore."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -46,34 +46,34 @@ dependencies = [
|
|
|
46
46
|
[project.optional-dependencies]
|
|
47
47
|
# Enables `abstractruntime.integrations.abstractcore.*` imports.
|
|
48
48
|
abstractcore = [
|
|
49
|
-
"abstractcore>=2.13.
|
|
49
|
+
"abstractcore>=2.13.15",
|
|
50
50
|
]
|
|
51
51
|
|
|
52
52
|
apple = [
|
|
53
|
-
"abstractcore[apple]>=2.13.
|
|
53
|
+
"abstractcore[apple]>=2.13.15",
|
|
54
54
|
]
|
|
55
55
|
|
|
56
56
|
gpu = [
|
|
57
|
-
"abstractcore[gpu]>=2.13.
|
|
57
|
+
"abstractcore[gpu]>=2.13.15",
|
|
58
58
|
]
|
|
59
59
|
|
|
60
60
|
all-apple = [
|
|
61
|
-
"abstractcore[all-apple]>=2.13.
|
|
61
|
+
"abstractcore[all-apple]>=2.13.15",
|
|
62
62
|
]
|
|
63
63
|
|
|
64
64
|
all-gpu = [
|
|
65
|
-
"abstractcore[all-gpu]>=2.13.
|
|
65
|
+
"abstractcore[all-gpu]>=2.13.15",
|
|
66
66
|
]
|
|
67
67
|
|
|
68
68
|
# Enables AbstractCore multimodal generation helpers with common OpenAI-backed
|
|
69
69
|
# image/voice capability packages.
|
|
70
70
|
multimodal = [
|
|
71
|
-
"abstractcore[media,openai,vision,voice,audio]>=2.13.
|
|
71
|
+
"abstractcore[media,openai,vision,voice,audio]>=2.13.15",
|
|
72
72
|
]
|
|
73
73
|
|
|
74
74
|
# Enables `abstractruntime-mcp-worker` with the default toolsets (includes bs4/lxml).
|
|
75
75
|
mcp-worker = [
|
|
76
|
-
"abstractcore[tools]>=2.13.
|
|
76
|
+
"abstractcore[tools]>=2.13.15",
|
|
77
77
|
]
|
|
78
78
|
|
|
79
79
|
# CI/test dependencies. The workflow runs the basic contract suite plus focused
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
### Fixed
|
|
2
|
+
- Remote AbstractCore transcription now uses provider-scoped audio routes such as `/{provider}/v1/audio/transcriptions` when an STT provider is selected.
|
|
3
|
+
- VisualFlow generated media nodes now keep LLM `provider`/`model` routing separate from image, TTS, and STT provider/model pins.
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Minimum AbstractCore optional dependency floor is now `abstractcore>=2.13.15`.
|
|
@@ -291,12 +291,30 @@ def _maybe_inject_llm_call_grounding_for_ledger(*, effect: Effect) -> Effect:
|
|
|
291
291
|
prompt_str = str(prompt or "")
|
|
292
292
|
messages_list = messages if isinstance(messages, list) else None
|
|
293
293
|
|
|
294
|
+
output_request = payload.get("output")
|
|
295
|
+
if output_request is None:
|
|
296
|
+
output_request = payload.get("outputs")
|
|
297
|
+
|
|
294
298
|
try:
|
|
295
|
-
from abstractruntime.integrations.abstractcore.llm_client import
|
|
299
|
+
from abstractruntime.integrations.abstractcore.llm_client import (
|
|
300
|
+
_mark_grounding_prompt_injected,
|
|
301
|
+
_normalize_turn_grounding,
|
|
302
|
+
_output_request_has_non_text_result,
|
|
303
|
+
_runtime_grounding_metadata,
|
|
304
|
+
)
|
|
296
305
|
except Exception:
|
|
297
306
|
return effect
|
|
298
307
|
|
|
299
|
-
|
|
308
|
+
skip_turn_grounding = _output_request_has_non_text_result(output_request)
|
|
309
|
+
grounding = None
|
|
310
|
+
if not skip_turn_grounding:
|
|
311
|
+
grounding = _mark_grounding_prompt_injected(_runtime_grounding_metadata(), True)
|
|
312
|
+
|
|
313
|
+
updated_prompt, updated_messages = _normalize_turn_grounding(
|
|
314
|
+
prompt=prompt_str,
|
|
315
|
+
messages=messages_list,
|
|
316
|
+
grounding=grounding,
|
|
317
|
+
)
|
|
300
318
|
|
|
301
319
|
changed = False
|
|
302
320
|
if updated_prompt != prompt_str:
|
|
@@ -63,6 +63,23 @@ def _guess_ext_from_content_type(content_type: str) -> str:
|
|
|
63
63
|
ct = str(content_type or "").strip().lower()
|
|
64
64
|
if not ct:
|
|
65
65
|
return ""
|
|
66
|
+
explicit = {
|
|
67
|
+
"audio/wav": ".wav",
|
|
68
|
+
"audio/wave": ".wav",
|
|
69
|
+
"audio/x-wav": ".wav",
|
|
70
|
+
"audio/mpeg": ".mp3",
|
|
71
|
+
"audio/mp3": ".mp3",
|
|
72
|
+
"audio/ogg": ".ogg",
|
|
73
|
+
"audio/flac": ".flac",
|
|
74
|
+
"image/jpeg": ".jpg",
|
|
75
|
+
"image/jpg": ".jpg",
|
|
76
|
+
"image/png": ".png",
|
|
77
|
+
"image/webp": ".webp",
|
|
78
|
+
"video/mp4": ".mp4",
|
|
79
|
+
"video/quicktime": ".mov",
|
|
80
|
+
}
|
|
81
|
+
if ct in explicit:
|
|
82
|
+
return explicit[ct]
|
|
66
83
|
ext = mimetypes.guess_extension(ct) or ""
|
|
67
84
|
if ext == ".jpe":
|
|
68
85
|
return ".jpg"
|
|
@@ -679,9 +696,21 @@ def _resolve_llm_call_media(
|
|
|
679
696
|
raw_name = source_path or item.get("filename") or item.get("name")
|
|
680
697
|
if isinstance(raw_name, str) and raw_name.strip():
|
|
681
698
|
filename = raw_name.strip()
|
|
699
|
+
content_type = ""
|
|
700
|
+
if isinstance(item, dict):
|
|
701
|
+
for key in ("content_type", "mime_type", "mimeType", "mime"):
|
|
702
|
+
raw_ct = item.get(key)
|
|
703
|
+
if isinstance(raw_ct, str) and raw_ct.strip():
|
|
704
|
+
content_type = raw_ct.strip()
|
|
705
|
+
break
|
|
706
|
+
if not content_type:
|
|
707
|
+
raw_artifact_ct = getattr(artifact, "content_type", None)
|
|
708
|
+
if isinstance(raw_artifact_ct, str) and raw_artifact_ct.strip():
|
|
709
|
+
content_type = raw_artifact_ct.strip()
|
|
710
|
+
|
|
682
711
|
ext = Path(filename).suffix if filename else ""
|
|
683
712
|
if not ext:
|
|
684
|
-
ct = str(getattr(getattr(artifact, "metadata", None), "content_type", "") or "")
|
|
713
|
+
ct = content_type or str(getattr(getattr(artifact, "metadata", None), "content_type", "") or "")
|
|
685
714
|
ext = _guess_ext_from_content_type(ct)
|
|
686
715
|
|
|
687
716
|
desired = source_path or filename or artifact_id
|
|
@@ -691,7 +720,19 @@ def _resolve_llm_call_media(
|
|
|
691
720
|
p.write_bytes(bytes(content))
|
|
692
721
|
except Exception as e:
|
|
693
722
|
return None, f"Failed to materialize artifact '{artifact_id}': {e}"
|
|
694
|
-
|
|
723
|
+
resolved: Dict[str, Any] = {"file_path": str(p), "$artifact": str(artifact_id), "artifact_id": str(artifact_id)}
|
|
724
|
+
if content_type:
|
|
725
|
+
resolved["content_type"] = content_type
|
|
726
|
+
base_type = content_type.split(";", 1)[0].strip().lower()
|
|
727
|
+
if base_type.startswith("audio/"):
|
|
728
|
+
resolved["type"] = "audio"
|
|
729
|
+
elif base_type.startswith("image/"):
|
|
730
|
+
resolved["type"] = "image"
|
|
731
|
+
elif base_type.startswith("video/"):
|
|
732
|
+
resolved["type"] = "video"
|
|
733
|
+
elif base_type.startswith("text/"):
|
|
734
|
+
resolved["type"] = "text"
|
|
735
|
+
out.append(resolved)
|
|
695
736
|
|
|
696
737
|
return (out or None), None
|
|
697
738
|
|