CubePlex:开源企业级多Agent平台,让智能体安全可控落地生产
2026/9/8 8:26:04 网站建设 项目流程

上个月,我把团队内部沉淀了大半年的多Agent项目正式开源了,名字叫CubePlex。简单说,它是一套企业级的Agent平台,也是一个开箱就能跑的agent框架:你可以在上面声明智能体、挂接工具、编排多Agent协作,同时把记忆、安全、可观测性这些生产环境必须的东西一次性补齐。代码放在GitHub上,协议用的Apache 2.0。如果你正在做agent开发,或者你跟我一样需要给团队搭一套能扛住业务压力的AI agent基础设施,那这个项目值得你花五分钟看下去。

1. CubePlex到底是什么:我为什么要做这样一个Agent平台

1.1 单体Agent在生产环境的三道坎

先说一个感受:很多人第一次把Agent跑起来的时候,兴奋感都集中在“它居然会自己调用工具”上,但真正落到业务里,问题马上就会浮出来。

第一道坎是失控。Agent本质上是一个循环,每一步想干什么没有人能提前预知。我最早的版本就是一个while True加function calling,看起来聪明,结果连续跑几次之后发现它经常陷入“调用工具、报错、换一种说法再调用、再报错”的死循环。更要命的是,你很难在循环中途打断它,只能等整轮超时。Demo阶段这不算什么,上线之后就是灾难。

第二道坎是记忆。测试环境里你可以把整个聊天历史全塞进上下文,但生产场景不行。一份客服工单背后的知识,可能来自用户昨天说过的话、前几天的工单记录、商品知识库,这些信息分散在不同系统里。光靠拼上下文,既花钱又不稳定。而且企业环境里用户数据必须隔离,A用户的聊天记录不能串到B用户的会话里,这对单机Demo来说基本没人管过。

第三道坎是观测黑洞。模型到底调了哪个工具、传入的参数是什么、中间为什么走了弯路、最终为什么给出这个答案,这些在Jupyter里跑的时候无所谓,一旦上线,就是事故定位的救命稻草。没有日志、没有Trace、没有审计,出了问题连“复现”都做不到,更不用说满足合规要求。

所以CubePlex从一开始就没有做成“又一个链式调用库”,而是往平台方向设计。核心引擎只关心三件事:调模型、管工具、存记忆;往上提供编排层,把Agent之间的协作关系用声明式工作流表达;对外提供统一的REST API和Python SDK。这套抽象参考了当前主流agent框架的设计,同时结合企业落地时的实际约束,做了不少取舍。

1.2 平台设计的四个核心约束

我给CubePlex定了四条硬性原则,之后的每个功能决策都会对照这几条来检查。

  • 模型中立:任何提供OpenAI兼容接口的模型都能接入,不管是云厂商的大模型还是本地部署的开源模型,平台不绑定任何一家。
  • 编排优先:多Agent协作不是把一堆Prompt拼在一起,而是靠流程引擎来控制节点关系、错误策略和人工介入点。
  • 安全内建:工具调用必须走权限、限流和审计,不能裸奔。Agent不是万能管家,它是一个受管控的执行者。
  • 可观测默认:每一次调度、每一步思考、每一次工具调用,默认全部记录。没记录当作没发生。

这四条其实是“企业级”和“开源Demo项目”的分水岭。后者解决“能不能跑”,前者解决“敢不敢上线”。

2. 核心架构与关键抽象:Agent、Tool、Harness 与 Memory

2.1 一次Agent任务从进入到完成会经历什么

在讲具体对象之前,先描述一个完整流程,这样你会对平台有个整体画面。

用户通过API或者控制台提交一个任务后,平台会先创建一个会话上下文,把对应的短期记忆和向量记忆加载进来。然后启动Harness,也就是Agent的执行控制器。Harness会进入循环:把系统Prompt、历史记忆、用户输入组装成请求,发送给大模型;模型如果返回工具调用,Harness就去注册中心找到对应工具,做权限校验后执行,再把执行结果返回给模型;模型如果返回最终答案,Harness会对输出做格式和内容的检查,然后写记忆、写审计日志,结束任务。

这段描述听起来简单,但其中每一步都可能出问题。模型超时怎么办?工具执行失败算不算Agent需要修正?人工审核节点怎么插入?这些问题在纯函数调用场景里不存在,但在生产环境里全是坑。CubePlex把这一整段流程封装成可配置的Harness,让开发者不用每次重复造轮子。

2.2 Agent、Task、Tool、Harness这些对象分别是什么

在CubePlex里,核心对象一共五个,我把它们列出来,并对应到业务里的实际含义。

对象含义对应到业务
Agent带系统提示词和执行循环的智能体客服、数据分析助理、工单分类员
Task一次具体的执行请求“查询订单12345”
Tool可被模型调用的外部能力订单API、数据库查询、企业微信发送
Workflow多个Agent与人工节点的编排工单全流程处理流水线
Harness单个Agent执行循环的控制管理器赛车手、教练、裁判三合一
Memory持久化的上下文存储用户画像、历史工单、企业知识库

这里要特别解释一下Harness,因为很多人刚接触时会问“harness和agent区别到底是什么”。简单讲,Agent回答的是“要做什么”,Harness负责“怎么安全地做完这件事”。举个例子,如果Agent是一位赛车手,那Harness就是坐在副驾的教练加场边裁判:它决定什么时候进站、什么时候强制刹车、什么时候直接取消比赛资格。在CubePlex里,Harness统一处理迭代次数上限、单次任务超时、工具调用白名单、异常回复重试等机制,这些策略都可以在Agent配置里按需调整。

2.3 记忆三级体系

记忆是Agent从“玩具”变成“生产力工具”的关键。CubePlex把记忆拆成三层,每层的存储和生命周期都不一样。

第一层是短期记忆,直接挂在会话上,本质是最近几轮的消息列表。平台会设置一个上限,比如默认保留最近的20轮对话,超过之后会对更早的内容做摘要压缩。这样既保留关键信息,又不会让上下文无限膨胀。

第二层是场景记忆,用向量方式存储。平台会把每轮用户意图、Agent总结沉淀成向量,写入矢量数据库。下一次会话开始时,Harness会根据当前问题做相似度检索,把相关的历史信息带进上下文。这个设计很适合“用户前几天问过类似问题”这种场景。

第三层是长期知识库,对接企业内部的文档、商品资料、FAQ。它不是某个用户对话产生的,而是由管理员预先导入的静态知识。CubePlex默认使用PostgreSQL加pgvector作为向量存储,数据量不大时不需要额外引入Milvus这类重组件,架构更简单。

记忆隔离也是企业环境的硬需求。CubePlex给每个Agent提供一个namespace参数,同一个命名空间下的记忆可以共享,不同命名空间之间物理隔离。这样你可以让“售前咨询Agent”和“售后工单Agent”各自维护独立的记忆,互不干扰。

3. 核心功能拆解:编排、安全与可观测性

3.1 Agent编排:4种最常用的工作流模式

多Agent编排是CubePlex和普通单Agent框架最大的区别。我总结了四种最常用的模式,基本能覆盖大多数业务场景。

第一种是顺序执行。比如先由意图识别Agent判断用户的问题属于哪个领域,再交给对应的业务Agent继续处理。这种方式逻辑清晰,适合流程固定的场景。

第二种是并行执行。比如一个数据分析Agent需要同时查询销售、库存、物流三个系统的数据,三个子Agent可以并发运行,最后由聚合节点把结果合并。对响应时间有要求的场景,并行是最有效的提效手段。

第三种是条件分支。根据模型输出或者工具返回值,动态决定下一步走哪个节点。比如信用评分Agent返回“通过”时走自动放款流程,返回“拒绝”时走人工复核节点,这就是典型的分支。

第四种是人工审核汇合。有些操作不能完全交给模型决定,比如发生退款、发送营销短信、修改核心配置。CubePlex支持在Workflow中插入一个human_approval节点,任务到这里会暂停,等指定的审核人通过或驳回后才继续执行。

下面是一个很简单的Workflow定义,你可以直接在当前版本里跑起来:

workflow: id: customer_service_flow steps: - node: intent_agent type: agent - node: order_agent type: agent depends_on: [intent_agent] - node: human_review type: human_approval depends_on: [order_agent] error_policy: rerun

3.2 安全机制:工具权限、限流与审计日志

安全是CubePlex的核心投资,也是我认为做Agent平台最不能轻视的地方。平台采用“默认拒绝”的模型:一个工具即使注册成功,如果Agent没有在allowed_tools里声明,Harness也不会允许模型调用它。

在工具调用路径上,平台内置了四道关卡。第一道是身份校验,API请求必须携带有效的Bearer Token。第二道是Agent级权限,核对当前Agent是否允许调用该工具。第三道是限流,每个Agent每分钟和每小时的调用次数都可配置,防止某个异常任务把下游API打爆。第四道是参数校验,工具定义里声明的参数类型和必填项,在执行前会强制校验。

审计日志是安全体系里容易被忽略的一块。CubePlex默认记录每一次工具调用的时间、任务ID、Agent名称、工具名称、参数、返回摘要、人工审核人。这些日志不仅是为了排查问题,更是为了满足企业审计和合规要求。我建议你在生产环境把审计日志接入独立的日志系统,保留时间至少180天,出事的时候你就知道这个决定有多值钱。

3.3 可观测性:一次Agent任务的完整追踪

可观测性这块,CubePlex默认集成了OpenTelemetry。你可以在配置里打开Tracing,然后任何标准可观测系统都能收到数据。一个任务的处理过程会生成一条完整的链路,里面包含模型请求耗时、工具执行耗时、记忆检索耗时以及每一轮LLM的输入输出。

用量统计也是企业关心的点。控制台里可以看到每个Agent消耗了多少Token、调用了多少次模型、平均响应时间是多少。这些数据对于成本分摊和后期的模型路由优化非常有用。我见过不少团队上线Agent应用后,才发现一个简单的客服任务单次要消耗上万Token,没有这个统计根本发现不了问题。

4. 部署实操:5分钟本地跑通CubePlex

4.1 环境准备与配置说明

CubePlex的最低配置是4核8G内存,推荐配置是8核16G。如果只跑单机演示,4核8G足够;如果对接本地模型,建议至少16G内存,因为模型服务本身也很吃资源。部署依赖就是Docker和Docker Compose v2,不需要额外安装数据库和缓存,编排文件里都已经配好了。

你只需要三步就能拉起来。先克隆仓库,然后复制环境变量文件:

git clone https://github.com/cubeplex/cubeplex.git cd cubeplex cp .env.example .env

打开.env,重点配置模型相关参数。CubePlex默认走OpenAI兼容接口,所以你只需要填LLM_BASE_URLLLM_API_KEYLLM_MODEL_NAME。如果你暂时没有API Key,可以先不用改,平台会在模型调用失败时给出明确的错误信息,其他功能照常可以看界面。

4.2 Docker Compose 快速启动

配置好之后,直接在项目根目录执行:

docker compose up -d

首次启动会拉镜像,包括PostgreSQL、Redis、API服务、Worker和控制台,大概需要几分钟。等所有容器状态变成healthy之后,打开两个地址:API文档在http://localhost:8000/docs,管理控制台在http://localhost:3000

验证是否跑通,可以直接用控制台创建一个测试Agent,或者在API文档里调用/v1/agents/hello/run,传递一句“你好,介绍一下你自己”。如果返回了正常的回复,说明核心链路已经打通。我把第一次启动后顺手验证系统健康的习惯保留了下来,毕竟部署成功不等于启动成功,模型调用成功才算真的活。

4.3 接入本地开源模型

如果你不想用云端API,想完全本地化,CubePlex支持通过Ollama或者vLLM提供一个OpenAI兼容端点。以Ollama为例,先拉一个开源模型:

ollama pull qwen2.5:7b ollama serve

然后把.env里的LLM_BASE_URL改成http://host.docker.internal:11434/v1LLM_API_KEY随便填一个占位符,LLM_MODEL_NAMEqwen2.5:7b。重新启动服务即可。

这里要注意一个点:CubePlex的服务端平台定位,和Codex CLI这类单机开发中的Agent工具完全不同。后者更适合开发者在终端里做编码辅助,前者是给多用户、多Agent协作和业务流程编排用的。你在选择部署方案之前,先想清楚自己的使用场景,不要为了“本地部署”而强行在低配机器上跑大模型,体验反而更差。

5. Agent开发实战:从零搭建一个客服工单智能体

5.1 用YAML声明你的第一个Agent

CubePlex的Agent配置用YAML声明,一个最小可用的Agent大概长这样:

id: order_agent name: "订单助手" model: provider: openai_compatible base_url: ${LLM_BASE_URL} api_key: ${LLM_API_KEY} model_name: qwen2.5:32b system_prompt: | 你是一个负责处理订单查询的客服智能体。 如果用户想查询订单状态,请使用 query_order 工具。 不要编造订单信息。如果工具调用失败,请直接告诉用户暂时无法查询。 tools: - query_order memory: enabled: true type: vector namespace: order_agent safety: max_steps: 8 timeout_seconds: 60 require_human_approval: false allowed_tools: [query_order]

这里最关键的是safety段。max_steps限制了模型最多跑8轮循环,防止死循环;timeout_seconds限制单次任务最长60秒;allowed_tools进一步收紧了工具调用白名单。这个Agent即使模型疯了,也不可能去调用query_order之外的工具,这是安全兜底的第一道网。

5.2 用Python编写并注册一个工具

工具注册在CubePlex里通过Python装饰器完成。平台会根据函数签名自动生成OpenAI兼容的函数Schema,不需要你手写JSON描述。

# tools/order_tools.py import httpx from cube_plex import tool @tool( name="query_order", description="根据订单编号查询订单状态与物流信息", parameters={ "order_id": {"type": "string", "description": "订单编号"}, }, ) def query_order(order_id: str) -> dict: resp = httpx.get( f"https://api.shop.example/orders/{order_id}", timeout=5, ) resp.raise_for_status() return resp.json()

把文件放到项目的tools目录,平台启动时会自动扫描并注册。你只需要注意一点:工具函数必须对超时和异常做处理,抛出异常的话,Harness会把这个结果原样返回给模型,有些模型会因此陷入“反复尝试同样操作”的怪圈。建议在工具内部做好超时控制,失败时返回结构化错误信息,比如{"error": "query timeout"},这比直接抛异常要安全得多。

5.3 编排一个“意图识别-订单查询-人工复核”完整流程

单一Agent解决了“单点问题”,但真实业务往往是多条流程串起来的。我以一个客服工单场景为例,展示怎么用CubePlex编排一个完整流程。

流程分三步。第一步是意图识别Agent,判断用户的问题是不是关于订单的。第二步是订单查询Agent,也就是刚才定义的那个,负责调用工具取数据。第三步是人工复核节点,因为这笔查询可能涉及用户隐私,管理员要求所有对订单详情接口的调用都必须有人工确认。

workflow: id: order_query_flow steps: - node: intent_agent type: agent - node: order_agent type: agent depends_on: [intent_agent] - node: human_review type: human_approval depends_on: [order_agent] config: approver: customer_service_manager timeout_hours: 24 error_policy: rerun

当任务进入第3个节点时,平台会通知管理员审核。管理员可以在控制台看到订单Agent生成的回复草稿、工具调用记录以及原始输入输出,选择通过或者驳回。如果驳回,任务直接进入失败状态,一般情况下不会自动重试,避免重复打扰用户。

这个流程跑通之后,你会明显感受到多Agent编排的价值:每个Agent只负责一块逻辑,模型需要做的决策变小了,准确性自然提升;人工审核只出现在关键节点,不会拖慢全局;而且每一步都有记录,不管是团队内部复盘还是对客户解释,都有据可查。

6. 生产落地经验:我在实际项目中踩过的坑

6.1 模型层问题与应对

Agent在生产环境跑起来之后,遇到最多的坑基本都在模型行为上。

死循环是头号问题。模型在遇到工具返回错误后,经常换一种说法去重试,几轮下来任务才超时。CubePlex的做法是同时用两层机制遏制:max_steps硬性限制循环次数,同时在System Prompt里加一句“如果某个工具连续调用两次都失败,直接告诉用户当前无法完成,不要再尝试”。前者是刹车,后者是引导,缺一不可。

空回复和参数幻觉也很常见。特别是部分开源模型在function calling时,会把工具调用对象写成空字段,或者给出一个模型想象出来的订单号。这种错误在离线测试里不容易暴露,生产环境一压流量就出来了。我的处理经验是:在Harness里增加参数校验环节,发现参数为空或者格式不对时,直接返回“参数错误”让模型重新组织语言,而不是硬着头皮去请求下游系统。

6.2 工具层问题与应对

工具层最大的坑是超时和幂等。

模型对工具调用的期望是“立刻有结果”,但下游系统不会惯着你。订单查询接口可能因为数据库锁、网络抖动,两秒变二十秒。所以我强烈建议所有工具在内部设置独立的超时时间,并且比Harness的全局超时短得多。比如全局超时60秒,工具内部最多等待10秒,这样即使下游慢,也有足够时间留给模型做二次判断。

写操作必须考虑幂等。模型可能因为一次网络重试,把同一个“创建工单”调用发送两次。我在生产里做过一个笨办法:所有工具的写操作都要求传入一个request_id,下游根据这个ID做去重。虽然增加了调用方的成本,但比事后人工清理重复数据要省心太多。

6.3 记忆层问题与应对

上下文膨胀是记忆使用中的经典问题。模型输入长度有限,如果你把几个月的历史全塞进去,很快就把上下文撑爆。CubePlex的做法是对短期记忆做滚动窗口加摘要,超过20轮后就只保留摘要。测试下来,这个策略在大多数业务场景下都能保留关键信息,同时把Token消耗压在一个可控范围内。

记忆“串话”是另一个隐蔽问题,尤其在多Agent场景里。如果两个Agent共用同一个记忆namespace,A用户的会话信息很可能被B用户的任务检索到。所以namespace的规划一定要在前期就做好,我的建议是至少按业务域划分,严格一点可以按用户ID划分。虽然存储成本会增加,但数据隔离性会好很多。

6.4 稳定性与成本调优

最后说稳定性和成本。企业环境里,并发量和成本往往是一对矛盾。

模型调用是主要成本来源,CubePlex支持设置模型路由策略:简单任务走小模型,复杂任务走大模型。比如意图识别用7B级别的小模型就够了,订单查询和工单总结用32B以上的大模型。配置一个规则,让Workflow里的不同节点使用不同Agent,每个Agent指定不同的模型,成本能明显降下来。

并发调优方面,Worker数量和数据库连接池要配套调整。默认的Worker数是2,如果你有8核机器,可以改成4到6个;但如果同时调大PostgreSQL连接池,否则数据库会成为瓶颈。我踩过最明显的一个坑是:Worker数量增加后,Redis连接数和DB连接数没有同步调整,结果高峰期出现大量连接超时。排查半天,最后发现根本不是模型的问题,而是连接池配置得太小。

7. 开源之后我打算怎么继续维护

项目开源不是终点,反而是维护工作的开始。CubePlex目前的规划里,优先级最高的是插件市场,让第三方开发者可以发布自己的Agent模板和工具包,减少重复造轮子。其次是Workflow可视化编辑器,现在的YAML配置对于习惯用界面的运维和业务同学还是不够友好。

如果你对这个项目感兴趣,我建议从三个方向入手参与贡献:一是写文档和示例,别小看这个,很多用户第一次跑通全靠示例;二是补充工具库,尤其是企业里常用的CRM、ERP、数据库工具封装;三是做Workflow节点的新类型,比如等待事件节点、定时触发节点。这些代码量不大,但对整个社区的生态会很有帮助。

跑完这几个月的生产验证,我对Agent平台的体会其实很朴素:先把不确定性关进笼子里,再谈智能。CubePlex不会让模型变聪明,但它能让模型的每一次尝试都可控、可查、可纠正。如果你想在企业里搭一套Agent基础设施,我的建议是从一个最小闭环开始——单机部署、接一个模型、写一个工具、跑通一条客服流程,再逐步加记忆和编排。最后分享一个救过我很多次的习惯:所有Agent生成的内容,只要涉及写操作或对外输出,都必须留一层人工确认。这个习惯,建议你别省。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询