CaveAgent:一个面向工程落地的有状态Agent运行时框架
- 论文地址:https://arxiv.org/abs/2601.01569
- 项目地址:https://github.com/acodercat/cave-agent
- 安装:
pip install 'cave-agent[all]'
这项由香港科技大学(HKUST)主导的研究,为我们展示了一种"Code as Action, State as Memory"的全新可能性。当LLM不再局限于生成文本,而是能够直接操作和持久化Python运行时中的原生对象时,Agent的工程化落地将进入一个新阶段。
研究动机
当前所有主流Agent框架都遵循同一个交互范式:Text-in-Text-out——LLM只能接收文本、输出文本,所有数据必须经过序列化/反序列化。这带来一个核心工程问题:外部系统无法直接将Python对象(DataFrame、模型、数据库连接)交给Agent操作,Agent的产出也无法作为原生对象直接对接下游应用(数据可视化、Agentic UI、数据库写入)。 中间永远隔着一层文本解析和对象重建。
CaveAgent提出了有状态运行时管理(Stateful Runtime Management),将Agent的交互范式扩展为 (Text & Object)-in-(Text & Object)-out——通过变量注入与检索机制,让LLM直接操作运行时中的原生Python对象,并将结果作为原生对象输出给下游系统。
亮点
- CaveAgent将持久化Python运行时提升为Agent的主工作空间,LLM退化为轻量控制器,实现了从"以文本上下文为中心"到"以运行时为中心"的架构反转。
- 通过变量注入(Injection)和检索(Retrieval),外部系统可以将任意Python对象直接推入Agent运行时,Agent处理后取回的依然是带有完整类型和方法的原生对象——直接对接可视化、数据库等下游流水线,零文本解析。
- 提出运行时中介的多Agent协作:多个Agent共享同一个Python运行时,通过对象引用实现零开销状态同步,替代传统的文本消息传递。
- 扩展了Agent Skills开放标准(Claude Code、Gemini CLI、Cursor通用),新增
injection.py模块,激活技能时将函数、变量、类型直接注入运行时命名空间。 - 运行时状态的确定性可检查性,为可验证评估和RLVR(Reinforcement Learning with Verifiable Rewards)提供了程序化奖励信号生成的结构性基础。
- 内置基于AST的静态安全分析(ImportRule / FunctionRule / AttributeRule / RegexRule),生产环境可叠加容器或微虚拟机实现多层防御。
- Tau²-bench上12个设置中11个胜出(最高+13.5%),多轮交互token减少28.4%,数据密集型任务token减少59%。
核心方法
双流架构

CaveAgent采用语义流 + 运行时流的双流架构。语义流中LLM负责推理和代码生成;运行时流是一个持久的IPython内核,承载数据存储、状态管理和代码执行。语义流生成代码,运行时流执行并更新状态,执行结果经过截断和格式化后反馈回语义流引导下一步决策。
变量注入与检索:Object-in-Object-out的核心机制
注入:外部系统将DataFrame、模型、数据库连接等任意Python对象直接推入运行时全局命名空间。LLM获得的是轻量元数据描述(变量名、类型、docstring),实际数据驻留在运行时内存中,不消耗context token。
runtime = PythonRuntime(
variables=[
Variable("df", stock_dataframe, "5年的股票行情数据"),
Variable("model", trained_xgboost, "已训练的XGBoost模型"),
],
functions=[Function(get_market_cap)],
)
agent = CaveAgent(model, runtime=runtime)
LLM生成代码时直接通过变量名引用这些对象,新创建的变量自动持久化,后续轮次直接引用无需重新序列化。
检索:Agent执行完毕后,取回原生Python对象,保留完整类型信息和方法接口:
result_df = runtime.retrieve("high_vol") # pandas.DataFrame
preds = runtime.retrieve("predictions") # numpy.ndarray
这些对象可直接送进可视化渲染、写入数据库、传递给另一个Agent——不需要任何解析或重建。
与CodeAct等代码Agent的关键区别在于运行时的开放性:CodeAct的变量只能通过 print()输出为文本,CaveAgent将运行时开放为双向接口。
Agent Skills:从文本指令到运行时注入
CaveAgent扩展了Agent Skills开放标准,在 SKILL.md旁增加 injection.py。激活技能时,函数、变量、类型定义直接注入运行时命名空间——技能从"LLM读说明书"变成"运行时里多了一组可直接调用的工具"。采用渐进式加载,启动仅约100 token元数据开销。
安全机制
LLM生成的代码在执行前经过基于AST的静态分析,四类可配置规则拦截危险操作。违规不中断交互,而是返回结构化错误引导LLM自我修正。AST分析提供应用层安全策略,生产环境可叠加容器(Docker + gVisor)或微虚拟机(Firecracker)实现系统级隔离。
下游应用场景
数据分析与可视化

用户在地图上画两个区域查询人口密度差异。GeoJSON多边形直接注入运行时作为Python变量,LLM生成一个代码块引用几何体执行区域统计,一轮完成。JSON范式下至少需要五个LLM轮次,且面临坐标截断和精度损失。CaveAgent在数据查询任务上以123K token达到100%准确率,JSON方案和CodeAct均在80%处溢出失败。
可验证评估与RLVR
运行时状态确定性可检查,可以像写单元测试一样验证Agent行为:
order = runtime.retrieve("target_order")
assert order.status == "cancelled"
assert order.refund_amount == order.total_price
直接对Python对象做程序化断言,为强化学习提供细粒度奖励信号,无需人工标注。
多Agent协作

提出运行时中介的状态流,三种模式:元Agent控制(子Agent作为对象注入编排器运行时)、类型化交接(retrieve + inject传递原生对象)、共享运行时同步(多Agent操作同一运行时,修改即时可见)。以AutoML训练循环演示:数据以原生对象形式在Agent间流动,全类型保真,每步可程序化验证。
共享运行时示例:城镇模拟

多个Agent共享同一个Python Runtime。编排器执行 town.weather = "storm_warning",所有Agent通过对象引用立刻感知。新实体动态注入后即时可交互。全程零消息传递,零序列化。
总结
CaveAgent的核心范式转变:将LLM的交互模式从Text-in-Text-out扩展为(Text & Object)-in-(Text & Object)-out。通过变量注入与检索,LLM可以直接操作原生Python对象并将结果作为原生对象输出给下游系统,解决了Agent在处理真实数据、对接下游应用、嵌入工程流水线时的结构性瓶颈。
📄 论文: https://arxiv.org/abs/2601.01569 💻 GitHub: https://github.com/acodercat/cave-agent
如果这个方向对你有帮助,欢迎在GitHub上给个 ⭐ 支持。