reducer as wf_mcp capability
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user