resolve runtime dependencies

This commit is contained in:
lda
2026-05-18 00:57:58 +07:00 Verified
parent acd2e2ecb4
commit 78613b876c
7 changed files with 290 additions and 8 deletions
+6
View File
@@ -121,6 +121,11 @@ def builtin_reducers() -> dict[str, ReducerSpec]:
}
def builtin_reducer_definitions():
"""Return executable built-in reducers for trusted runtime dependency wiring."""
return dict(DEFAULT_REDUCER_DEFINITIONS)
def mcp_specs(service: ToolCaller) -> dict[str, NodeSpec[Any, Any]]:
"""Return service-bound MCP utility specs available to raw plans."""
@@ -153,6 +158,7 @@ def builtin_sources(service: ToolCaller) -> dict[str, CapabilitySource]:
capabilities=CapabilityBuckets(
node_specs=builtin_specs(),
reducers=builtin_reducers(),
reducer_definitions=builtin_reducer_definitions(),
),
visibility=SourceVisibility(
planner=True,
@@ -5,6 +5,7 @@ from typing import Any, Literal
from wf_authoring import NodeSpec
from wf_core import ReducerSpec
from wf_core.runtime.ops.merges import ReducerDefinition
SourceKind = Literal["system", "connection"]
@@ -29,6 +30,7 @@ class CapabilityBuckets:
tools: dict[str, Any] = field(default_factory=dict)
node_specs: dict[str, NodeSpec[Any, Any]] = field(default_factory=dict)
reducers: dict[str, ReducerSpec] = field(default_factory=dict)
reducer_definitions: dict[str, ReducerDefinition] = field(default_factory=dict)
prompts: dict[str, Any] = field(default_factory=dict)
resources: dict[str, Any] = field(default_factory=dict)
+28 -7
View File
@@ -7,11 +7,12 @@ from typing import Any
from pydantic import BaseModel
from wf_authoring import NodeReturn, NodeSpec, build_async_registry
from wf_authoring import NodeReturn, NodeSpec
from wf_artifacts import (
FileWorkflowArtifactStore,
WorkflowArtifact,
WorkflowArtifactCatalogEntry,
WorkflowDeployment,
WorkflowArtifactStore,
artifact_catalog_entry,
)
@@ -33,6 +34,7 @@ from ...shared.errors import error_payload
from ...shared.names import RESERVED_CONNECTION_IDS
from ...storage import Store
from ...workflow.wrappers import _model_from_schema
from ...workflow_surface.runtime_dependencies import resolve_runtime_dependencies
from ..catalog import CombinedCatalog, snapshot_from_specs
from ..discovery import discover_connection_capabilities, specs_from_discovered_tools
from ..admin_capabilities import admin_source
@@ -545,6 +547,8 @@ class WfMcpService:
self,
plan: RawWorkflowPlan,
workflow_input: dict[str, Any],
deployment: WorkflowDeployment | None = None,
artifact: WorkflowArtifact | None = None,
):
self._record_event(
make_event(
@@ -554,13 +558,30 @@ class WfMcpService:
)
)
workflow = self.compile_plan(plan)
specs = [
self._get_qualified_spec(node.node)
for node in workflow.nodes
if isinstance(node, NodeUse)
plan_node_names = [
node.node for node in workflow.nodes if isinstance(node, NodeUse)
]
registry = build_async_registry(*specs)
run = await execute_workflow_async(workflow, workflow_input, registry)
runtime_artifact = artifact or WorkflowArtifact(
id=plan.name,
version=1,
title=plan.name,
input_schema=plan.input_schema,
output_schema=plan.output_schema,
outcomes=("completed",),
plan=plan.model_dump(mode="json", by_alias=True),
)
dependencies = resolve_runtime_dependencies(
artifact=runtime_artifact,
deployment=deployment,
sources=self.capability_sources,
plan_node_names=plan_node_names,
)
run = await execute_workflow_async(
workflow,
workflow_input,
dependencies.node_registry,
reducers=dependencies.reducers,
)
self._record_event(
make_event(
"workflow_run_completed",