Skip to content

workflow - 工作流 ​

字数
1318 字
阅读时间
6 分钟

概述 ​

NekoBot 的工作流是一个基于 AI + 工具调用的自动化任务执行系统,由 nbot/web/server.py 中的 WebServer._execute_workflow 实现。每个工作流绑定一个 agent 会话,触发时把工作流描述作为 用户消息,复用统一的 AgentHarness(详见 agent_service.md)执行多轮 工具调用,最终结果写回会话历史。

两个工作流模块的关系 ​

项目中存在两个与工作流相关的模块,定位不同:

1. nbot/web/server.py — 真实工作流执行(已生效) ​

实际被调用的工作流实现。WebServer._execute_workflow 负责完整流程:

  1. Gateway 提交(非 gateway 入口时):通过 gateway.submit_internal_task_sync 把 执行交给 Gateway worker 池,避免阻塞调用方
  2. 会话解析:若工作流未绑定 session_id 或会话已丢失,调 _create_workflow_session 创建一个 session_mode: "agent" 的会话
  3. 消息构建:
    • system: 工作流 description
    • history: 会话历史中的 user/assistant 消息
    • user: 触发消息,格式为 [工作流触发 - {source}] 任务内容:{content} 或 [工作流触发 - {source}] 请根据以下工作流描述执行任务。触发时间:{time}\n\n{workflow_desc}
  4. AI + 工具循环:调用 run_tool_call_loop(messages, model_call, tool_executor, max_iterations=50)
    • model_call 委托 WebServer._get_ai_response_with_tools
    • tool_executor 委托 nbot.services.tools.execute_tool(统一工具入口)
  5. 结果回写:通过 _send_workflow_result 把最终回复写回会话历史、Socket.IO 推送

2. nbot/core/workflow.py — DAG 引擎占位(未生效) ​

当前状态:占位实现,未被主流程调用。 保留作为未来可能的 DAG 节点图引擎的基础。

已定义但未生效的类:

类说明
WorkflowEngine工作流引擎主体,提供 execute_workflow / list_workflows 等接口
Workflow工作流数据模型(name/description/steps/enabled)
WorkflowStep单步定义(action_type/action_data/condition)
WorkflowInstance执行实例(status/logs/context)
TriggerType触发类型枚举(manual/schedule/event/webhook)
WorkflowStatus状态枚举(idle/running/completed/error)

已实现 4 个 action handler,但 fetch_data 和 condition 仅 print 不真执行:

  • _action_log — 记录日志
  • _action_send_message — 通过 channel adapter 发送消息
  • _action_fetch_data — 占位:仅 print
  • _action_condition — 占位:仅 print

不要在主流程中调用 core/workflow.py 的 WorkflowEngine。 工作流执行必须走 WebServer._execute_workflow。

数据模型 ​

工作流以 JSON 对象存储在 data/web/workflows.json。字段:

字段类型说明
idstr工作流 ID
namestr名称
descriptionstr工作流描述(作为 system prompt 和触发消息)
promptstr备用提示词
enabledbool是否启用
session_idstr关联的 agent 会话 ID(懒创建)
configobject模型/工具配置
triggerobject触发器配置(cron / manual / webhook / event)
last_trace_idstr最近一次 Gateway trace ID
last_gateway_statusstr最近一次 Gateway 状态

触发方式 ​

1. 手动触发 ​

http
POST /api/workflows/{workflow_id}/execute

Web 路由:nbot/web/routes/workflows.py:execute_workflow

2. 定时触发(cron) ​

_init_workflow_scheduler 在 server 启动时读取所有 enabled 工作流的 trigger,若 type == "cron" 则用 APScheduler 注册定时任务。到点后调 _execute_workflow(workflow_id, {"source": "scheduler"})。

3. 消息触发 ​

trigger_workflow_by_message(conversation_id, content):根据会话绑定的 workflow_id 自动触发, 用于"对工作流会话发消息"的场景。

4. Hook action 触发 ​

Hook 的 workflow action 通过 HookManager.set_workflow_trigger 注入的回调把执行路由到 WebServer._execute_workflow:

json
{
  "type": "workflow",
  "workflow": "wf_goodnight_event"
}

回调由 nbot/web/ai_service.py 在 WebServer 初始化时注入。详见 hooks/index.md。

注意:早期版本中 _action_workflow 直接调用 core/workflow.py:get_workflow_engine(), 但由于该引擎未实现完整(fetch_data/condition 仅 print)且未对接 web 数据源, 实际从未生效。现已改为通过 callback 路由到 WebServer._execute_workflow, hook 触发的工作流才能真实执行。

5. 任务中心 ​

nbot/web/routes/task_center.py 的任务中心可在 UI 触发工作流执行。

Agent 模式会话 ​

工作流创建的会话对象支持 session_mode: "agent" 字段:

json
{
  "session_id": "wf_xxx",
  "session_mode": "agent"
}

启用 agent 模式后:

  • ai_service 会把 session_mode 同步到 ctx.metadata,AIPipeline 通过 ModePolicy 据此识别 agent 模式会话(详见 ai_pipeline.md)
  • agent 模式下自动跳过角色记忆注入(character.memories_legacy / MemoryFS 等), 避免上下文污染
  • 定时触发使用工作流自身描述/提示作为用户消息,移除系统提示中多余的 CORE_INSTRUCTIONS
  • 工具调用循环统一复用 AgentHarness,与主对话/CLI 保持同一套错误处理与退出语义

该模式适合让工作流会话以「无角色身份」的方式直接响应调度系统,绕开角色卡片的情感/状态/记忆层。

Web 界面 ​

工作流可以在 Web 后台的管理界面中创建和编辑:

  • 编辑工作流名称、描述、提示词
  • 配置触发器(cron 表达式 / 手动 / 消息触发)
  • 启用/禁用工作流
  • 查看执行历史与 Gateway trace

相关代码 ​

模块文件关键函数
工作流执行nbot/web/server.pyWebServer._execute_workflow
工作流会话nbot/web/server.pyWebServer._create_workflow_session
工作流调度nbot/web/server.pyWebServer._init_workflow_scheduler / _schedule_workflow
消息触发nbot/web/server.pyWebServer.trigger_workflow_by_message
Hook 集成nbot/hooks/manager.pyHookManager.set_workflow_trigger
Hook actionnbot/hooks/actions.pyActionExecutor._action_workflow
Web 路由nbot/web/routes/workflows.pyregister_workflow_routes
工具执行nbot/services/tools.pyexecute_tool(统一入口)
Agent harnessnbot/core/agent_service.pyAgentHarness
DAG 引擎占位nbot/core/workflow.pyWorkflowEngine(未生效,保留作未来扩展)

页面历史