feat: 工作流画布支持草稿试运行(target=draft 执行当前草稿图)

This commit is contained in:
董宏凯 committed 2026-08-30 20:02:15 +08:00
1 parent 3384f2e51c
commit 222595d6c4
7 files changed
+198 -32

No files matched your search

@@ -131,6 +131,7 @@ class _AgentInvocation:
response_schema: dict[str, Any],
thread_mode: str,
failure_code: str,
model_name: str = "",
) -> NodeResult:
run_agent = require_dep(ctx.deps.run_agent, node=node, what="智能体执行")
coalescer = _DeltaCoalescer(ctx, node.id)
@@ -176,6 +177,7 @@ class _AgentInvocation:
prompt=prompt,
skill_names=skill_names,
thread_mode=thread_mode,
model_name=model_name or None,
cancel=ctx.cancel,
on_delta=on_delta,
on_tool=on_tool,
@@ -251,9 +253,10 @@ class _AgentInvocation:
class AgentNodeExecutor(_AgentInvocation):
async def execute(self, node: WorkflowNode, ctx: RunContext) -> NodeResult:
agent_id = str(node.config.get("agentId") or node.config.get("agent_id") or "")
if not agent_id:
raise WorkflowError("WORKFLOW_AGENT_FAILED", "智能体节点未选择智能体", node_id=node.id)
# Empty agentId falls back to the runtime's built-in default agent —
# canvas nodes may only pick a model and a prompt.
agent_id = str(node.config.get("agentId") or node.config.get("agent_id") or "") or "default"
model_name = str(node.config.get("modelName") or node.config.get("model_name") or "")
template = str(node.config.get("promptTemplate") or node.config.get("prompt_template") or "")
prompt = render_template(template, ctx.state()).strip()
if not prompt:
@@ -264,6 +267,7 @@ class AgentNodeExecutor(_AgentInvocation):
ctx,
agent_id=agent_id,
prompt=prompt,
model_name=model_name,
skill_names=[str(s) for s in (node.config.get("skillNames") or node.config.get("skill_names") or [])],
response_mode=str(node.config.get("responseMode") or node.config.get("response_mode") or "text"),
response_schema=schema if isinstance(schema, dict) else {},
@@ -285,9 +289,10 @@ class SkillNodeExecutor(_AgentInvocation):
node_id=node.id,
details={"mode": mode},
)
agent_id = str(node.config.get("agentId") or node.config.get("agent_id") or "")
agent_id = str(node.config.get("agentId") or node.config.get("agent_id") or "") or "default"
model_name = str(node.config.get("modelName") or node.config.get("model_name") or "")
skill_names = [str(s) for s in (node.config.get("skillNames") or node.config.get("skill_names") or [])]
if not agent_id or not skill_names:
if not skill_names:
raise WorkflowError("WORKFLOW_SKILL_FAILED", "技能节点需要同时指定智能体与技能", node_id=node.id)
template = str(node.config.get("promptTemplate") or node.config.get("prompt_template") or "")
prompt = render_template(template, ctx.state()).strip() or f"请使用技能 {skill_names[0]} 完成任务。"
@@ -296,6 +301,7 @@ class SkillNodeExecutor(_AgentInvocation):
ctx,
agent_id=agent_id,
prompt=prompt,
model_name=model_name,
skill_names=skill_names,
response_mode="text",
response_schema={},