reducer as wf_mcp capability

This commit is contained in:
lda
2026-05-17 17:02:12 +07:00 Verified
parent 281229a78f
commit 32bcba9b35
14 changed files with 169 additions and 13 deletions
+29 -1
View File
@@ -31,7 +31,10 @@ def create_workflow_artifact_from_plan(
output_schema=_required_object_field(plan, "output_schema"),
outcomes=outcomes,
plan=plan,
required_capabilities=dict(required_capabilities or {}),
required_capabilities={
**_required_reducers_from_plan(plan),
**dict(required_capabilities or {}),
},
created_from_catalog_version=created_from_catalog_version,
)
@@ -68,3 +71,28 @@ def _validate_workflow_plan(plan: JsonObject) -> None:
raise ValueError(
f"invalid workflow plan: edge destination {edge.to!r} does not exist"
)
def _required_reducers_from_plan(plan: JsonObject) -> dict[str, RequiredCapability]:
"""Infer reducer dependencies from declared state fields in one plan."""
state_schema = plan.get("state_schema")
if not isinstance(state_schema, dict):
return {}
fields = state_schema.get("fields")
if not isinstance(fields, dict):
return {}
requirements: dict[str, RequiredCapability] = {}
for field in fields.values():
if not isinstance(field, dict):
continue
reducer = field.get("reducer", "wf.std.replace")
if not isinstance(reducer, str) or "." not in reducer:
continue
logical_source, _, capability_name = reducer.rpartition(".")
requirements[reducer] = RequiredCapability(
logical_source=logical_source,
capability_name=capability_name,
kind="reducer",
)
return requirements
+2 -2
View File
@@ -29,7 +29,7 @@ class RequiredCapability(BaseModel):
logical_source: str
capability_name: str
kind: Literal["tool", "resource", "prompt", "node_spec", "workflow"]
kind: Literal["tool", "resource", "prompt", "node_spec", "reducer", "workflow"]
input_schema_hash: str | None = None
input_schema_snapshot: JsonObject | None = None
output_schema_hash: str | None = None
@@ -42,7 +42,7 @@ class AvailableCapability(BaseModel):
"""Current contract for one capability exposed by a bound source."""
name: str
kind: Literal["tool", "resource", "prompt", "node_spec", "workflow"]
kind: Literal["tool", "resource", "prompt", "node_spec", "reducer", "workflow"]
input_schema_hash: str | None = None
output_schema_hash: str | None = None