章节 01
导读 / 主楼:MissionBay:基于BASE3框架的声明式智能体工作流编排引擎
本文介绍MissionBay,一个为BASE3框架设计的PHP智能体编排插件。它通过JSON声明式定义工作流,支持HTTP、OpenAI、RAG、嵌入等多种节点类型,提供资源对接和事件驱动机制,为构建分布式智能体自动化系统提供灵活可扩展的技术基础。
正文
本文介绍MissionBay,一个为BASE3框架设计的PHP智能体编排插件。它通过JSON声明式定义工作流,支持HTTP、OpenAI、RAG、嵌入等多种节点类型,提供资源对接和事件驱动机制,为构建分布式智能体自动化系统提供灵活可扩展的技术基础。
章节 01
本文介绍MissionBay,一个为BASE3框架设计的PHP智能体编排插件。它通过JSON声明式定义工作流,支持HTTP、OpenAI、RAG、嵌入等多种节点类型,提供资源对接和事件驱动机制,为构建分布式智能体自动化系统提供灵活可扩展的技术基础。
章节 02
json\n{\n \"nodes\": [\n { \"id\": \"get\", \"type\": \"httpgetnode\", \"inputs\": {\n \"url\": \"https://api.example.com/data\"\n }},\n { \"id\": \"parse\", \"type\": \"jsontoarraynode\" }\n ],\n \"connections\": [\n { \"from\": \"get\", \"output\": \"body\", \"to\": \"parse\", \"input\": \"json\" }\n ]\n}\n\n\n### 执行上下文与内存\n\nMissionBay引入了AgentContext概念,为工作流执行提供共享状态:\n\n- 全局运行时变量:通过setVar()/getVar()在节点间传递数据\n- 内存访问:通过IAgentMemory接口实现持久化存储,支持NoMemory(无状态)等实现\n- 依赖注入:可通过上下文注入ILogger等服务\n\n这种设计使得工作流既可以是纯函数式的(给定输入产生确定输出),也可以是有状态的(利用内存实现多轮对话、长期记忆等)。\n\n### 资源对接机制\n\n资源是MissionBay的一大特色。与节点不同,资源是独立配置、可复用的服务对象。节点通过"对接端口"声明自己需要什么类型的资源,运行时系统自动完成匹配。\n\n示例:日志资源对接\njson\n{\n \"resources\": [\n {\n \"id\": \"log-res\",\n \"type\": \"loggerresource\",\n \"config\": {\n \"scope\": { \"mode\": \"fixed\", \"value\": \"MyApp\" }\n }\n }\n ],\n \"nodes\": [\n {\n \"id\": \"telegram\",\n \"type\": \"telegramsendmessage\",\n \"inputs\": { \"message\": \"Hello!\" },\n \"docks\": { \"logger\": [\"log-res\"] }\n }\n ]\n}\n\n\n资源配置支持多种解析模式:固定值、默认值、上下文变量、环境变量、配置项、继承值。这种灵活性使得同一工作流可以在不同环境(开发、测试、生产)中复用,只需调整资源配置。\n\n## 节点类型与功能\n\nMissionBay提供了丰富的内置节点类型,覆盖智能体工作流的常见需求:\n\n### 基础节点\n- HttpGetNode/HttpRequestNode:HTTP客户端,支持GET/POST等方法\n- JsonToArrayNode/ArrayGetNode/ArraySetNode:JSON数据处理\n- StaticMessageNode:输出静态消息\n- TestInputNode:返回测试数据\n\n### AI能力节点\n- SimpleOpenAiNode:基础OpenAI对话调用\n- OpenAiResponseNode:带状态的多轮对话\n- AiAssistantNode:支持工具调用的智能助手,集成内存和日志\n- AiEmbeddingNode:完整的嵌入流水线(提取→解析→分块→嵌入→存储)\n\n### 控制流节点\n- SwitchNode:多分支选择(类似switch语句)\n- IfNode:布尔条件分支\n- ForEachNode:列表迭代\n- LoopNode:通用循环结构\n- DelayNode:延时等待\n- SubFlowNode:嵌套子工作流\n\n### 上下文操作节点\n- SetContextVarNode/GetContextVarNode:上下文变量的读写\n- GetConfigurationNode:读取BASE3框架配置\n- LoggerNode:日志记录\n\n## RAG与嵌入流水线\n\nMissionBay对检索增强生成(RAG)场景提供了原生支持,通过专用节点和资源实现完整的嵌入流水线:\n\n### 典型嵌入流程\n\n1. 内容提取(Content Extractor):从数据库、HTTP接口、文件等来源获取原始内容\n2. 内容解析(Parser):根据内容类型选择解析器(如Docling、纯文本),输出标准化格式\n3. 文本分块(Chunker):将长文本切分为适合嵌入的片段\n4. 向量嵌入(Embedding):调用嵌入模型(如OpenAI)生成向量\n5. 向量存储(Vector Store):持久化存储向量及元数据\n\n### 去重机制\n\n流水线内置基于内容哈希的重复检测,通过existsByHash()接口在向量存储层面避免重复处理。\n\n### 测试资源\n\n项目提供了多种测试资源实现:\n- DummyExtractorAgentResource:静态文本列表,用于测试\n- NoParserAgentResource:纯文本透传\n- NoChunkerAgentResource:单块策略\n- MemoryVectorStoreAgentResource:内存向量存储(非持久化)\n- OpenAiEmbeddingModelAgentResource:OpenAI嵌入API适配器\n\n## OpenAI兼容的MCP接口\n\nMissionBay提供了一个符合OpenAI规范的MCP(Model Context Protocol)接口,使外部系统(包括ChatGPT)能够通过标准OpenAPI 3.1发现并调用智能体功能。\n\n### 接口能力\n\n- 功能发现:返回完整的OpenAPI 3.1规范,包含所有可用函数\n- 函数调用:通过POST请求执行特定函数\n- 安全保护:基于Token的访问控制\n\n### 应用场景\n\n- 聊天机器人集成:让ChatGPT能够调用自定义智能体功能\n- 自动化工作流:外部系统触发结构化智能体动作\n- 跨系统集成:不同服务间的标准化互操作\n\n示例函数定义:\njson\n{\n \"openapi\": \"3.1.0\",\n \"paths\": {\n \"/functions/reverse_string\": {\n \"post\": {\n \"operationId\": \"reverse_string\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"text\": { \"type\": \"string\" }\n }\n }\n }\n }\n }\n }\n }\n }\n}\n\n\n## 扩展开发\n\n### 自定义节点\n\n创建新节点只需实现IAgentNode接口或继承AbstractAgentNode:\n\nphp\nclass UpperCaseNode extends AbstractAgentNode {\n public static function getName(): string {\n return 'uppercasenode'; }\n public function getInputDefinitions(): array {\n return [new AgentNodePort(name: 'text', type: 'string')];\n }\n public function getOutputDefinitions(): array {\n return [new AgentNodePort(name: 'result', type: 'string')];\n }\n public function execute(array $inputs, AgentContext $ctx): array {\n return ['result' => strtoupper($inputs['text'] ?? '')];\n }\n}\n\n\n### 支持配置与对接\n\n如需支持节点配置和资源对接:\n\nphp\npublic function setConfig(array $config): void {\n $this->prefix = $config['prefix'] ?? '';\n}\n\npublic function execute(array $inputs, array $resources, AgentContext $ctx): array {\n $loggers = $resources['logger'] ?? [];\n foreach ($loggers as $logger) {\n if ($logger instanceof ILogger) {\n $logger->log('node', $this->prefix . $inputs['text']);\n }\n }\n return ['result' => strtoupper($inputs['text'])];\n}\n\n\n## 项目状态与路线图\n\n### 已完成功能\n- 稳定的JSON工作流架构\n- 配置、上下文、日志、内存集成\n- 资源与对接系统\n- RAG和嵌入流水线\n- MCP接口\n\n### 进行中功能\n- 子工作流(Subflows)\n- 工作流验证\n- 可视化工具\n\n## 技术栈与依赖\n\n- PHP 8.1+:最低版本要求\n- PSR-4自动加载:标准PHP包管理\n- BASE3框架集成:依赖注入、配置管理、类映射\n- GPL 3.0许可证:开源协议\n\n## 适用场景\n\nMissionBay适合以下应用场景:\n\n1. 企业自动化:将多个内部系统的API调用编排成自动化工作流\n2. AI客服系统:结合OpenAI节点和上下文内存构建多轮对话系统\n3. 文档处理流水线:利用RAG节点实现文档的自动解析、嵌入和检索\n4. 数据同步任务:定时从多个数据源提取、转换、加载数据\n5. 智能体协作:多个专业化智能体通过工作流协调完成复杂任务\n\n## 总结\n\nMissionBay为PHP生态提供了一个轻量级但功能完备的智能体工作流编排方案。其声明式JSON配置、灵活的资源对接机制、丰富的节点类型以及对RAG场景的原生支持,使其成为构建分布式智能体自动化系统的有力工具。对于已经在使用BASE3框架或寻求PHP生态AI解决方案的开发者,MissionBay值得深入探索。章节 03
MissionBay:基于BASE3框架的声明式智能体工作流编排引擎\n\n项目背景与定位\n\n随着AI智能体(Agent)技术的快速发展,如何将多个智能体协调起来完成复杂任务成为关键挑战。现有的智能体框架往往过于重量级,或局限于特定语言生态。MissionBay应运而生,它是一个为BASE3 PHP框架设计的模块化智能体流引擎,旨在提供一种轻量级、声明式的智能体工作流编排方案。\n\nMissionBay的核心理念是"配置即代码"——通过JSON定义工作流结构,开发者无需编写大量命令式代码即可构建复杂的智能体协作逻辑。这种设计使得工作流可以被版本控制、动态加载,甚至由非技术人员参与设计。\n\n核心架构设计\n\n声明式工作流定义\n\nMissionBay的工作流完全通过JSON描述,包含三个核心要素:\n\n节点(Nodes):工作流的基本执行单元,每个节点有唯一ID、类型和输入配置。\n\n连接(Connections):定义节点间的数据流向,指定从哪个节点的哪个输出连接到哪个节点的哪个输入。\n\n资源(Resources):可复用的服务对象,如日志记录器、嵌入模型、向量存储等,通过"对接(Docking)"机制与节点关联。\n\n示例工作流定义:\njson\n{\n \"nodes\": [\n { \"id\": \"get\", \"type\": \"httpgetnode\", \"inputs\": {\n \"url\": \"https://api.example.com/data\"\n }},\n { \"id\": \"parse\", \"type\": \"jsontoarraynode\" }\n ],\n \"connections\": [\n { \"from\": \"get\", \"output\": \"body\", \"to\": \"parse\", \"input\": \"json\" }\n ]\n}\n\n\n执行上下文与内存\n\nMissionBay引入了AgentContext概念,为工作流执行提供共享状态:\n\n- 全局运行时变量:通过setVar()/getVar()在节点间传递数据\n- 内存访问:通过IAgentMemory接口实现持久化存储,支持NoMemory(无状态)等实现\n- 依赖注入:可通过上下文注入ILogger等服务\n\n这种设计使得工作流既可以是纯函数式的(给定输入产生确定输出),也可以是有状态的(利用内存实现多轮对话、长期记忆等)。\n\n资源对接机制\n\n资源是MissionBay的一大特色。与节点不同,资源是独立配置、可复用的服务对象。节点通过"对接端口"声明自己需要什么类型的资源,运行时系统自动完成匹配。\n\n示例:日志资源对接\njson\n{\n \"resources\": [\n {\n \"id\": \"log-res\",\n \"type\": \"loggerresource\",\n \"config\": {\n \"scope\": { \"mode\": \"fixed\", \"value\": \"MyApp\" }\n }\n }\n ],\n \"nodes\": [\n {\n \"id\": \"telegram\",\n \"type\": \"telegramsendmessage\",\n \"inputs\": { \"message\": \"Hello!\" },\n \"docks\": { \"logger\": [\"log-res\"] }\n }\n ]\n}\n\n\n资源配置支持多种解析模式:固定值、默认值、上下文变量、环境变量、配置项、继承值。这种灵活性使得同一工作流可以在不同环境(开发、测试、生产)中复用,只需调整资源配置。\n\n节点类型与功能\n\nMissionBay提供了丰富的内置节点类型,覆盖智能体工作流的常见需求:\n\n基础节点\n- HttpGetNode/HttpRequestNode:HTTP客户端,支持GET/POST等方法\n- JsonToArrayNode/ArrayGetNode/ArraySetNode:JSON数据处理\n- StaticMessageNode:输出静态消息\n- TestInputNode:返回测试数据\n\nAI能力节点\n- SimpleOpenAiNode:基础OpenAI对话调用\n- OpenAiResponseNode:带状态的多轮对话\n- AiAssistantNode:支持工具调用的智能助手,集成内存和日志\n- AiEmbeddingNode:完整的嵌入流水线(提取→解析→分块→嵌入→存储)\n\n控制流节点\n- SwitchNode:多分支选择(类似switch语句)\n- IfNode:布尔条件分支\n- ForEachNode:列表迭代\n- LoopNode:通用循环结构\n- DelayNode:延时等待\n- SubFlowNode:嵌套子工作流\n\n上下文操作节点\n- SetContextVarNode/GetContextVarNode:上下文变量的读写\n- GetConfigurationNode:读取BASE3框架配置\n- LoggerNode:日志记录\n\nRAG与嵌入流水线\n\nMissionBay对检索增强生成(RAG)场景提供了原生支持,通过专用节点和资源实现完整的嵌入流水线:\n\n典型嵌入流程\n\n1. 内容提取(Content Extractor):从数据库、HTTP接口、文件等来源获取原始内容\n2. 内容解析(Parser):根据内容类型选择解析器(如Docling、纯文本),输出标准化格式\n3. 文本分块(Chunker):将长文本切分为适合嵌入的片段\n4. 向量嵌入(Embedding):调用嵌入模型(如OpenAI)生成向量\n5. 向量存储(Vector Store):持久化存储向量及元数据\n\n去重机制\n\n流水线内置基于内容哈希的重复检测,通过existsByHash()接口在向量存储层面避免重复处理。\n\n测试资源\n\n项目提供了多种测试资源实现:\n- DummyExtractorAgentResource:静态文本列表,用于测试\n- NoParserAgentResource:纯文本透传\n- NoChunkerAgentResource:单块策略\n- MemoryVectorStoreAgentResource:内存向量存储(非持久化)\n- OpenAiEmbeddingModelAgentResource:OpenAI嵌入API适配器\n\nOpenAI兼容的MCP接口\n\nMissionBay提供了一个符合OpenAI规范的MCP(Model Context Protocol)接口,使外部系统(包括ChatGPT)能够通过标准OpenAPI 3.1发现并调用智能体功能。\n\n接口能力\n\n- 功能发现:返回完整的OpenAPI 3.1规范,包含所有可用函数\n- 函数调用:通过POST请求执行特定函数\n- 安全保护:基于Token的访问控制\n\n应用场景\n\n- 聊天机器人集成:让ChatGPT能够调用自定义智能体功能\n- 自动化工作流:外部系统触发结构化智能体动作\n- 跨系统集成:不同服务间的标准化互操作\n\n示例函数定义:\njson\n{\n \"openapi\": \"3.1.0\",\n \"paths\": {\n \"/functions/reverse_string\": {\n \"post\": {\n \"operationId\": \"reverse_string\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"text\": { \"type\": \"string\" }\n }\n }\n }\n }\n }\n }\n }\n }\n}\n\n\n扩展开发\n\n自定义节点\n\n创建新节点只需实现IAgentNode接口或继承AbstractAgentNode:\n\nphp\nclass UpperCaseNode extends AbstractAgentNode {\n public static function getName(): string {\n return 'uppercasenode'; }\n public function getInputDefinitions(): array {\n return [new AgentNodePort(name: 'text', type: 'string')];\n }\n public function getOutputDefinitions(): array {\n return [new AgentNodePort(name: 'result', type: 'string')];\n }\n public function execute(array $inputs, AgentContext $ctx): array {\n return ['result' => strtoupper($inputs['text'] ?? '')];\n }\n}\n\n\n支持配置与对接\n\n如需支持节点配置和资源对接:\n\nphp\npublic function setConfig(array $config): void {\n $this->prefix = $config['prefix'] ?? '';\n}\n\npublic function execute(array $inputs, array $resources, AgentContext $ctx): array {\n $loggers = $resources['logger'] ?? [];\n foreach ($loggers as $logger) {\n if ($logger instanceof ILogger) {\n $logger->log('node', $this->prefix . $inputs['text']);\n }\n }\n return ['result' => strtoupper($inputs['text'])];\n}\n\n\n项目状态与路线图\n\n已完成功能\n- 稳定的JSON工作流架构\n- 配置、上下文、日志、内存集成\n- 资源与对接系统\n- RAG和嵌入流水线\n- MCP接口\n\n进行中功能\n- 子工作流(Subflows)\n- 工作流验证\n- 可视化工具\n\n技术栈与依赖\n\n- PHP 8.1+:最低版本要求\n- PSR-4自动加载:标准PHP包管理\n- BASE3框架集成:依赖注入、配置管理、类映射\n- GPL 3.0许可证:开源协议\n\n适用场景\n\nMissionBay适合以下应用场景:\n\n1. 企业自动化:将多个内部系统的API调用编排成自动化工作流\n2. AI客服系统:结合OpenAI节点和上下文内存构建多轮对话系统\n3. 文档处理流水线:利用RAG节点实现文档的自动解析、嵌入和检索\n4. 数据同步任务:定时从多个数据源提取、转换、加载数据\n5. 智能体协作:多个专业化智能体通过工作流协调完成复杂任务\n\n总结\n\nMissionBay为PHP生态提供了一个轻量级但功能完备的智能体工作流编排方案。其声明式JSON配置、灵活的资源对接机制、丰富的节点类型以及对RAG场景的原生支持,使其成为构建分布式智能体自动化系统的有力工具。对于已经在使用BASE3框架或寻求PHP生态AI解决方案的开发者,MissionBay值得深入探索。