fix: 修复 5 项确定 bug + Provider UX 重做 + 文档统一
Bug fixes: - fix(dao): AsyncSession.delete 补齐漏掉的 await(provider/user/individual 共 4 处) - fix(worker): result.data.output → result.output.output(pydantic-ai 1.x API 适配) - fix(api): 删除 create_worker_from_template 死端点(ORM 字段不匹配必崩) - fix(api): /provider/test 按 provider_type 分支适配 Anthropic/Gemini/OpenAI 三种协议 - fix(chat): SSE 流式聊天在 distributed 模式 fallback 到非流式,避免 asyncio.Queue 序列化崩溃 Features (previously unstaged): - feat(provider): Provider 管理页重做(品牌图标、5 种类型、Test Connection、编辑模式) - feat(provider): 新增 Gemini provider_type 支持 - feat(workflow): Finalize 节点输出 blackboard 摘要 + 失败原因;步骤完成/失败实时推送 SSE - feat(i18n): regulatory_node 提示词从路由模式改为直接对话模式(中英双语) - feat(consciousness): dynamic_prompt 支持 locale 国际化 - feat(logs): SystemLogsView 自动刷新 + 暂停按钮 Docs: - docs: README/README-EN 统一为"开源通用多 Agent 协作平台"口径 - docs: ROADMAP 按 v0.1.x / v0.2.x / v0.3.x 重组 - docs: project.md 重写为结构化项目介绍 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -39,6 +39,7 @@ class ConsciousnessNode:
|
||||
|
||||
self.logger = get_logger("consciousness_node")
|
||||
self.agent: None | Agent = None
|
||||
self.locale: str = "zh"
|
||||
|
||||
async def create_agent(
|
||||
self,
|
||||
@@ -51,6 +52,7 @@ class ConsciousnessNode:
|
||||
custom_system_prompt: str | None = None,
|
||||
) -> None:
|
||||
system_prompt: str = agent_prompt("consciousness_node", locale=locale, custom_system_prompt=custom_system_prompt)
|
||||
self.locale = locale or "zh"
|
||||
output_type = Union[ForregulatoryNode, ForWorkflow, ForWorkflowEngine]
|
||||
from kilostar.core.global_state_machine.gsm_snapshot import fetch_snapshot
|
||||
|
||||
@@ -74,23 +76,43 @@ class ConsciousnessNode:
|
||||
|
||||
@self.agent.system_prompt
|
||||
async def dynamic_prompt(ctx: RunContext[ConsciousnessNodeDeps]):
|
||||
locale = ctx.deps.locale
|
||||
prompt = system_prompt + "\n\n"
|
||||
prompt += (
|
||||
f"=== 当前任务上下文 ===\n"
|
||||
f"- 当前指令 (Command): {ctx.deps.command}\n"
|
||||
f"- 原始用户命令 (Original Command): {ctx.deps.original_command}\n"
|
||||
)
|
||||
if ctx.deps.available_skills:
|
||||
prompt += "\n=== 当前可用 Skill Individual ===\n"
|
||||
prompt += "你可以直接将以下 Skill Individual 安排进工作流的步骤中(设置 node 为 skill_individual,并将 agent_id 设置为对应 Skill Individual 的真实 agent_id,不要用名称!),作为可调用的工具。\n"
|
||||
for skill in ctx.deps.available_skills:
|
||||
prompt += f"- 真实 agent_id: {skill.get('agent_id')}\n 名称: {skill['name']}\n 描述: {skill['description']}\n"
|
||||
|
||||
if locale == "en":
|
||||
prompt += (
|
||||
f"=== Current Task Context ===\n"
|
||||
f"- Command: {ctx.deps.command}\n"
|
||||
f"- Original User Command: {ctx.deps.original_command}\n"
|
||||
)
|
||||
if ctx.deps.available_skills:
|
||||
prompt += "\n=== Available Skill Individuals ===\n"
|
||||
prompt += "You may assign the following Skill Individuals to workflow steps (set node to skill_individual, and set agent_id to the real agent_id below — never use the name!).\n"
|
||||
for skill in ctx.deps.available_skills:
|
||||
prompt += f"- agent_id: {skill.get('agent_id')}\n Name: {skill['name']}\n Description: {skill['description']}\n"
|
||||
else:
|
||||
prompt += "\n=== IMPORTANT: No Worker Individuals Available ===\n"
|
||||
prompt += "No Worker Individuals are registered. When generating a workflow, you have exactly two options:\n"
|
||||
prompt += "1. Assign the step to consciousness_node itself (set node to consciousness_node, agent_id to null).\n"
|
||||
prompt += "2. If the task truly requires specialized tools, refuse and explain that a Worker must be created first.\n"
|
||||
prompt += "NEVER fabricate non-existent agent_ids!\n"
|
||||
else:
|
||||
prompt += "\n=== 重要:当前无可用 Worker Individual ===\n"
|
||||
prompt += "系统中当前没有注册任何 Worker Individual。在生成工作流时,你有且仅有以下两种选择:\n"
|
||||
prompt += "1. 将步骤分配给 consciousness_node 自己完成(设置 node 为 consciousness_node,agent_id 为 null)。\n"
|
||||
prompt += "2. 如果任务确实需要专用工具或技能才能完成,则拒绝执行并在输出中说明需要先创建对应的 Worker。\n"
|
||||
prompt += "绝对禁止编造不存在的 agent_id!\n"
|
||||
prompt += (
|
||||
f"=== 当前任务上下文 ===\n"
|
||||
f"- 当前指令: {ctx.deps.command}\n"
|
||||
f"- 原始用户命令: {ctx.deps.original_command}\n"
|
||||
)
|
||||
if ctx.deps.available_skills:
|
||||
prompt += "\n=== 当前可用 Skill Individual ===\n"
|
||||
prompt += "你可以直接将以下 Skill Individual 安排进工作流的步骤中(设置 node 为 skill_individual,并将 agent_id 设置为对应 Skill Individual 的真实 agent_id,不要用名称!)。\n"
|
||||
for skill in ctx.deps.available_skills:
|
||||
prompt += f"- 真实 agent_id: {skill.get('agent_id')}\n 名称: {skill['name']}\n 描述: {skill['description']}\n"
|
||||
else:
|
||||
prompt += "\n=== 重要:当前无可用 Worker Individual ===\n"
|
||||
prompt += "系统中当前没有注册任何 Worker Individual。在生成工作流时,你有且仅有以下两种选择:\n"
|
||||
prompt += "1. 将步骤分配给 consciousness_node 自己完成(设置 node 为 consciousness_node,agent_id 为 null)。\n"
|
||||
prompt += "2. 如果任务确实需要专用工具或技能才能完成,则拒绝执行并在输出中说明需要先创建对应的 Worker。\n"
|
||||
prompt += "绝对禁止编造不存在的 agent_id!\n"
|
||||
|
||||
return prompt
|
||||
|
||||
@@ -127,7 +149,6 @@ class ConsciousnessNode:
|
||||
original_command=command, available_skills=available_skills
|
||||
)
|
||||
|
||||
# 通知 SSE 正在生成图结构(pending 队列:节点端写入 → API SSE 读取,单向下行)
|
||||
global_workflow_manager = ray_actor_hook(
|
||||
"global_workflow_manager"
|
||||
).global_workflow_manager
|
||||
@@ -135,7 +156,6 @@ class ConsciousnessNode:
|
||||
trace_id, "正在为您构建并规划工作流任务节点,请稍候..."
|
||||
)
|
||||
|
||||
# 实际构建过程
|
||||
result = await self.working(payload)
|
||||
|
||||
if result and isinstance(result, ForWorkflowEngine):
|
||||
@@ -197,6 +217,7 @@ class ConsciousnessNode:
|
||||
original_command=payload.original_command,
|
||||
command="自主分析并拆解原始命令,生成严密可执行的工作流",
|
||||
available_skills=payload.available_skills,
|
||||
locale=self.locale,
|
||||
)
|
||||
self.logger.debug("ConsciousnessNode: 开始生成工作流 (原生重试开启)")
|
||||
prompt = "根据original_command制定严密的可执行workflow"
|
||||
@@ -207,6 +228,7 @@ class ConsciousnessNode:
|
||||
deps = ConsciousnessNodeDeps(
|
||||
original_command=payload.original_command,
|
||||
command="完成workflow step中分配给意识节点的特定任务或指导",
|
||||
locale=self.locale,
|
||||
)
|
||||
self.logger.debug(
|
||||
"ConsciousnessNode: 开始处理工作流节点任务 (原生重试开启)"
|
||||
@@ -221,6 +243,7 @@ class ConsciousnessNode:
|
||||
deps = ConsciousnessNodeDeps(
|
||||
original_command=payload.original_command,
|
||||
command="对于工作流整体执行结果进行检查,并且生成一份专业的技术性总结报告",
|
||||
locale=self.locale,
|
||||
)
|
||||
self.logger.debug(
|
||||
"ConsciousnessNode: 开始生成技术总结报告 (原生重试开启)"
|
||||
|
||||
@@ -28,7 +28,8 @@ class ConsciousnessNodeDeps(DepsModel):
|
||||
"""ConsciousnessNode 在 pydantic-ai Agent 中使用的依赖:原始指令、当前指令以及可用 Skill 列表。"""
|
||||
original_command: str
|
||||
command: str
|
||||
available_skills: Optional[List[str]] = None
|
||||
available_skills: Optional[List[dict]] = None
|
||||
locale: str = "zh"
|
||||
|
||||
class ConsciousnessNodeInput(RequestModel):
|
||||
"""ConsciousnessNode 各类入参的共同基类,仅用于打 schema 标签。"""
|
||||
|
||||
Reference in New Issue
Block a user