diff --git a/pretor/core/individual/consciousness_node/consciousness_node.py b/pretor/core/individual/consciousness_node/consciousness_node.py index cab09f9..b7b3455 100644 --- a/pretor/core/individual/consciousness_node/consciousness_node.py +++ b/pretor/core/individual/consciousness_node/consciousness_node.py @@ -78,6 +78,11 @@ class ConsciousnessNode: ) if ctx.deps.workflow_template: prompt += f"- 选定工作流模板 (Workflow Template): {ctx.deps.workflow_template}\n" + if ctx.deps.available_skills: + prompt += "\n=== 当前可用 Skill Individual ===\n" + prompt += "你可以直接将以下 Skill Individual 安排进工作流的步骤中(设置 node 为 composite_individual 或 primary_individual,并将 agent_id 设置为对应的 Skill Individual 名称),作为可调用的工具。\n" + for skill in ctx.deps.available_skills: + prompt += f"- 名称: {skill['name']}\n 描述: {skill['description']}\n" return prompt @@ -140,7 +145,8 @@ class ConsciousnessNode: deps = ConsciousnessNodeDeps( original_command=payload.original_command, workflow_template=payload.workflow_template, - command="拆解原始命令变成一个工作流" + command="拆解原始命令变成一个工作流", + available_skills=payload.available_skills ) self.logger.debug("ConsciousnessNode: 开始生成工作流 (原生重试开启)") result = await self.agent.run( diff --git a/pretor/core/individual/consciousness_node/template.py b/pretor/core/individual/consciousness_node/template.py index 1e6db31..8ca40d8 100644 --- a/pretor/core/individual/consciousness_node/template.py +++ b/pretor/core/individual/consciousness_node/template.py @@ -44,6 +44,7 @@ class ConsciousnessNodeDeps(DepsModel): original_command: str workflow_template: str | None = None command: str + available_skills: list[dict] | None = None class ConsciousnessNodeInput(InputModel): @@ -53,6 +54,7 @@ class ConsciousnessNodeInput(InputModel): class ForWorkflowEngineInput(ConsciousnessNodeInput): workflow_template: str original_command: str + available_skills: list[dict] | None = None class ForWorkflowInput(ConsciousnessNodeInput): diff --git a/pretor/core/workflow/workflow_runner.py b/pretor/core/workflow/workflow_runner.py index 057f121..f089913 100644 --- a/pretor/core/workflow/workflow_runner.py +++ b/pretor/core/workflow/workflow_runner.py @@ -300,9 +300,21 @@ class WorkflowRunningEngine: workflow_template = event.context.get("workflow_template", "") workflow_template = get_workflow_template(workflow_template) + available_skills = None + if self.global_state_machine: + try: + raw_skills = await self.global_state_machine.get_skill_list.remote() + available_skills = [ + {"name": name, "description": details[0], "instructions": details[1]} + for name, details in raw_skills.items() + ] + except Exception as e: + self.logger.warning(f"获取技能列表失败: {e}") + payload = ForWorkflowEngineInput( original_command=event.message, - workflow_template=workflow_template + workflow_template=workflow_template, + available_skills=available_skills ) result_obj = await self.consciousness_node.working.remote(payload) diff --git a/tests/core/workflow/workflow_runner_test.py b/tests/core/workflow/workflow_runner_test.py index 5a8ee37..6eef628 100644 --- a/tests/core/workflow/workflow_runner_test.py +++ b/tests/core/workflow/workflow_runner_test.py @@ -143,6 +143,11 @@ async def test_workflow_running_engine_runner(): ) await engine.workflow_queue.put(mock_event) + # Mock the global_state_machine get_skill_list.remote method properly + mock_gsm = MagicMock() + mock_gsm.get_skill_list.remote = AsyncMock(return_value={"test_skill": ("description", "instructions")}) + engine.global_state_machine = mock_gsm + with patch("pretor.core.workflow.workflow_runner.WorkflowEngine") as mock_wf_engine_cls, patch("builtins.open", new_callable=MagicMock) as mock_open: # Instead of patching hook, we inject it directly