OpenProgram · Agents

Agent 配置完整设计

可复用配置、可选长期记忆、统一执行语义。

English
目标设计 · 尚未实现新增运行能力;交互仅修改本文档示例,不保存真实配置。

打开 Agents Web UI 交互原型

可编辑配置、选择模型、设置记忆、保存或恢复草稿,并演示试运行和新对话。使用项目现有动态图标与主题;所有数据仅用于原型。

范围与对象模型

Agent 是可复用的执行配置,可以选择关联持久状态。它不要求专门职责、人格、固定模型、工作目录、长期记忆或后台计划。Agents 页面保存的配置与 Python 临时配置使用同一套执行语义。

对象 身份与生命周期 边界
AgentConfig 一次解析使用的不可变配置值,可匿名、临时创建 不隐式创建持久记录、会话或记忆空间
AgentSpec 保存的 ID、显示名、revision 与 AgentConfig 字段 保存配置与元数据,不代表正在运行的进程
Execution 沿用 run/job ID,持有不可变生效配置 一次调用;同一 Agent 可以有多个执行
Session / DAG 沿用会话与执行历史 是否复用历史与选择哪个 Agent 分别决定
Memory space 有稳定引用与访问策略的存储空间 可选,不能仅凭显示名相同就自动关联

保留 AgentSpec 作为持久化对象,AgentConfig 是其中执行字段的类型化投影,不增加第二份磁盘注册表。资源管理、上下文引擎、记忆 backend 与任务控制继续由现有子系统负责。

源码核对与现有差距

范围 确认的现有实现 设计差距
持久化配置 AgentSpec / manager 保存模型、effort、指令、tools、skills、MCP、身份与会话策略 没有明确的逐 Agent 记忆策略与配置 revision
Agents UI AgentsPage 有六个页签与统一草稿 模型是文本输入,effort 固定,没有记忆页或生效来源
函数执行 agent() 与 llm() 进入 Runtime.exec 缺少保存 Agent / 临时配置选择参数
委派 agent 工具 支持 agent_id、clean/inherit、后台和 to 共享配置解析,同时保留直接调用与持久任务派发的不同语义
管理写入 Agent routes 在 manager 写入前检查可选 updated_at;tools 单独写入 检查不在写锁内,分次写入不能保证整份配置的原子 CAS
记忆 MemoryConfig 与 MemoryBackend 已有全局检索、注入与 writer 控制 逐执行策略与空间绑定需要覆盖所有写入入口
工作目录 workspace helpers 初始化指令文件 独立目录不等于安全隔离

这里是源码核对结果,不是重新执行的端到端验收。当前六页界面已在默认 App 中查看;新增目标配置未安装。CodeGraph 没有可用索引,检查使用限定范围的源码读取。文档不声明新增运行能力已完成。

配置结构与默认值

字段 目标语义 默认值与校验
schema_version / revision 持久化格式版本 / 单调递增的配置版本 新格式为 2;revision 由 manager 分配
name / description / identity 显示名称、可选描述、频道身份 不要求角色或描述;只有保存对象需要固定 ID
model / thinking_effort 带 provider 的模型引用和模型支持的思考强度 未指定表示继承;明确指定但不支持时阻止执行
system_prompt / instruction_files 内联指令和允许范围内的 Agent 指令文件引用 省略表示继承;空指令只清空这一层
tools / skills / mcp 独立能力策略,保存稳定引用 inherit、all、selected、none;selected 空集合表示无能力
memory mode、read_spaces、write_space、required 新 Agent 与匿名配置明确关闭;已有 Agent 保留原行为迁移
context history: inherit、clean、selected;指定节点引用 旧直接调用保留继承;显式切换 Agent 或配置默认 clean
environment cwd 引用与现有 sandbox 配置引用 默认继承环境;明确目录不存在时执行工具前失败
limits 引用或覆盖现有资源管理支持的限制 省略表示继承;子调用生效限制不得超过父调用
session policy 现有频道会话范围、重置字段与明确时区引用 不决定函数的历史选择或记忆访问

首期不加入任意 provider 参数、命名 Agent 之间多层继承、自定义执行引擎或任意记忆插件。匿名配置从系统默认值开始,不隐式复制调用方 Agent 的其他字段。描述可以为空,保存 Agent 只要求名称;已有可用默认模型时无需再选模型。

线格式与类型边界

以下为目标线格式,ID 均为示例。保留现有扁平 AgentSpec,新增类型字段,不嵌套第二份注册表。POST 接受 name 与可选执行字段;除合法旧版显式 ID 外,id/revision/时间戳由服务端分配。AgentConfig 只含执行字段。导出/导入不携带服务端元数据,导入保存时分配新身份。Python 包在 agent、llm 同一公开位置导出 AgentConfig;允许带 provider 的模型字符串作为简写,统一转成持久化的 provider/id 对象。

{
  "schema_version": 2,
  "id": "general",
  "name": "General",
  "revision": 1,
  "model": {"provider": "provider-id", "id": "model-id"},
  "system_prompt": "",
  "tools": {"mode": "selected", "allowed": ["tool_a"], "disabled": []},
  "skills": {"mode": "none"},
  "mcp": {"mode": "none"},
  "memory": {"mode": "off"},
  "context": {"history": "clean"}
}

PATCH /api/agents/general
{
  "expected_revision": 1,
  "system_prompt": "Use concise answers.",
  "memory": {"mode": "off"},
  "reset_fields": ["model", "thinking_effort"]
}

memory 包含 mode、可选 read_spaces: string[]、write_space: string、required: boolean(默认 false)。启用读取至少需要一个授权空间,read_write 必须有且仅有一个同时可读的写入目标。off 使绑定不生效但不删除已存数据;编辑器可在草稿保留未启用的绑定,实际执行不获得记忆权限。instruction_files 每项包含 path: string 与 required: boolean(默认 true),路径限于 Agent workspace。未知字段、类型错误、同字段同时出现在 reset_fields 与修改值中,均在写入前拒绝。就绪信息与保存配置分开返回。

统一解析与明确合并规则

基础配置只选一个来源,依次是显式 agent_id、显式 config、当前 Agent、系统默认。agent_id 与 config 互斥。只有继续同一 Agent 身份时才应用当前会话覆盖;切换 Agent 或临时配置,不继承旧 Agent 的模型、指令、工具与记忆绑定。随后应用经过授权的本次覆盖,最后执行权限约束;每次有副作用的操作仍重新检查撤销权限。

取值或操作 含义
省略 / UNSET 继承;PATCH 省略则不改存储
空字符串 清空指令或描述;清除模型覆盖使用 reset_fields,不提交无效空模型 ID
selected 空列表 明确的空范围,不能解释为全部
mode=none / memory.mode=off 明确关闭,不表示继承
reset_fields 删除本地覆盖并恢复基础值;拒绝 JSON null
列表 / 策略对象 原子替换整份列表或策略,不隐式取并集
普通对象中的标量 只修改明确字段;策略在提交前规范化为完整对象
覆盖参数冲突 旧关键字参数与 overrides 指定同一字段时拒绝
权限 / 配额 能力取交集,拒绝优先,有限额度取较小值,不按后写覆盖

派发被接受时固定生效快照、Agent revision、策略版本及相关目录/预设版本。排队任务保留此意图,启动时重查撤销和必需资源。重试与恢复使用原快照,不读取后来修改的配置;独立新一轮重新解析。来源记录保存引用与散列,不保存凭据。

公开调用与执行边界

以下 API 是目标接口,尚未实现。在现有 Python agent()、llm() 中加入 agent_id、config、overrides 与历史选择,不建立另一套执行器。llm() 不执行 Python/Program/MCP 工具循环,即使选中 Agent 允许这些工具。保留显式 web_search=True 的 provider 原生搜索,并执行相同原生能力权限检查;仅选择 Agent 不会自动启用搜索。输出校验与返回类型保持不变。

from openprogram import Agent



agent(prompt, agent_id="reviewer", history="selected", context_nodes=[node_id])

class ExampleAgent(Agent):
    method_options = {
        'extract': {'tool': True},
        'classify': {'tool': True},
    }

    def extract(self, document):
        return agent(document, agent_id="my-agent",
                     overrides={"memory": {"mode": "off"}},
                     response_format=Result)

    def classify(self, document):
        return llm(document,
                   config=AgentConfig(model="provider:model", memory={"mode": "off"}),
                   response_format=Label)

_example_agent = ExampleAgent()
extract = _example_agent.extract
classify = _example_agent.classify
入口 创建的对象 历史与继续执行
agent() / llm() 带生效配置的执行节点,不创建保存 Agent 保存在同一 DAG,模型可见历史独立过滤
无 to 的 agent 工具 沿用持久子任务/分支 保留 start_from=clean/inherit/指定节点语义
有 to 的 agent 工具 在明确目标分支追加一轮 不隐式改变目标 Agent;冲突 agent_id 拒绝
聊天 / CLI / scheduler 沿用 session/job,并使用统一解析器 定时任务引用 Agent ID,每次新触发重新解析;恢复使用原快照

通过上下文局部作用域绑定不可变生效配置,在 finally 中恢复,包括异常和取消。不得修改共享 Runtime.model 或进程级当前 Agent。指定 Agent 不存在时明确报错,不回退 main。聊天切换 Agent 默认开始新上下文;保留历史必须明确选择,并说明数据已在历史中出现。

可选记忆:访问、保留与写入

模式 自动检索与注入 记忆工具 后台写入与压缩前提取
off 不读取 不提供读写或重组调用 不从这些执行节点提取记忆
read_only 仅访问授权 read_spaces 只读与检索 不从这些执行节点提取记忆
read_write 仅访问授权 read_spaces 读与检索,以及一个授权 write_space 按 writer 策略和执行来源写入
inherit 先解析成明确模式 不能把未解析模式交给工具 迁移仅保留已有生效行为

read_spaces 保存稳定引用:self、指定项目或明确选择的共享空间。write_space 只有一个,且必须也可读。保存 Agent 的 self 解析成自身空间;匿名配置没有持久身份,因此 self 无效。匿名配置可以显式绑定项目或共享空间,而无需保存 Agent。新 Agent 开启记忆时默认 self,不静默复制原全局记忆。

上下文、指令与环境

clean 表示不继承对话消息,不表示移除系统或项目策略。指定历史节点必须检查调用方可见范围,同属 DAG 不等于有权访问。存储历史与模型实际上下文分开。默认继续保存执行记录,本设计不增加“无痕运行”的保留承诺。

来源 处理方式
运行时 / 用户权限策略 在模型外执行,Agent prompt 无权覆盖
用户、项目及有作用范围的 workspace 指令 沿用现有来源优先级与范围规则;显示来源和冲突诊断
Agent system_prompt 与允许的指令文件 可配置指令来源;空 prompt 只清空自身层
Skills 按允许范围按需加载,不复制进 AgentSpec
记忆与工具/网页结果 带来源的上下文数据,不提升为高优先级指令

持久化指令文件使用限定在 Agent workspace 允许列表内的路径引用;内容与散列在现有受保护执行存储中形成快照。Agent workspace 与项目 cwd 分别表达,cwd 不代表访问权限。环境配置不可用或主机/沙箱不兼容时明确失败。上下文长度沿用 Context Engine,不增加第二个摘要器,也不手动拼接原始工具结果。

能力范围与权限

Programs、Skills、MCP 和 provider 目录拥有能力定义与凭据;Agent 保存引用与默认选择。运行时先解析请求范围,再与用户授权、父执行委派上限、项目/环境限制、全局可用性和显式拒绝取交集。all 只表示当前可用且获授权的全部项目,不意味着有权使用所有已安装集成。

能力和选择器细节分别由分项文档负责。资源管理文档继续定义准入、用量、取消和配额;本页只引用现有配置并展示生效限制。

多 Agent 组合与选择

运行分支、Job、消息和 attach 的详细契约见协作设计与协作架构图,数量和执行预算见资源治理。保存 Agent 配置与运行分支分别管理;公开执行 ID、查询/取消入口及当前完成回送差距以协作设计的实现状态为准。

选择保存配置不要求指定角色。只选模型、只改表达风格、关闭记忆、使用项目记忆,都属于有效 Agent。并发复用一份配置创建多个 run,不创建多个保存 Agent。

操作 契约
独立调用 不自动继承上个任务历史;同一 Agent ID 可服务多个会话
委派 传递明确目标、输入和筛选后的上下文;取消与预算沿用现有任务控制
继续已有任务 明确寻址已有 run/branch,目标 Agent 身份保持稳定
共享记忆 明确绑定;并发写入由 backend 版本检查与执行幂等 ID 控制
共享文件/浏览器 有冲突的修改需要资源所有权和串行控制;名称不同不代表资源隔离
自动选择 后续扩展:用可选描述对已有合格配置排序;不自动创建 Agent 或扩大权限

单次成功不自动持久化配置变更、新技能或长期偏好。长期更新使用已有明确配置、技能或记忆写入机制并保留来源。角色编排、自动拓扑生成和市场发布不在本范围。可选 Agent/模型选择由实施计划 P6 完整定义,在所有入口支持显式选择之后实现。

管理 API 与原子持久化

操作 目标契约
GET /api/agents[/{id}] 摘要/详情包含 schema_version、revision,不返回记忆正文或凭据
POST /api/agents 仅名称即可创建;使用明确的新默认值,可选幂等键,不调用模型
PATCH /api/agents/{id} 新客户端提供 expected_revision;顶层修改字段与 reset_fields;先验证整份候选,再在跨进程锁内比较并一次写入
POST /api/agents/resolve 拟新增只读预览:接受保存或草稿配置和调用上下文;不创建会话、不检索记忆、不返回凭据
POST /api/agents/{id}/duplicate 默认仅复制配置;新 ID/revision;self 指向新空空间,共享绑定明确展示
POST /api/agents/{id}/default 默认指针只有一个权威来源,原子更新;profile.default 是展示投影
DELETE /api/agents/{id} 默认 Agent 或有活跃引用时 409;用户确认前列明资源;先记录可恢复删除意图,再执行清理

updated_at 仅用于展示和临时旧客户端适配;旧时间戳也在同一写锁内比较,再使用取得的 revision。新客户端使用 expected_revision。两种前置条件均缺少时返回 428,版本过期 409,结构错误 400,范围无权限 403,ID 不存在 404。依赖不可用使用明确预检错误,不回退其他配置。允许保存不可用引用并显示就绪警告,但必需依赖缺失时禁止启动。未知 schema 版本拒绝解析且不重写文件。

文件存储保留唯一 agent.json 并原子替换。创建、默认指针、删除涉及索引和多个资源时使用小型恢复日志,不能把多次 os.replace 称为事务。启动时先处理未完成意图,再接受写入。删除 Agent 不删除共享记忆、全局凭据或任意外部工作目录。会话/DAG 引用按实际存储枚举,不能假设都在 Agent 目录下。

生命周期、导出与失败处理

参考资料与设计取舍

参考 采用或调整 边界
Meta Muse — 官方系统说明 持续工作;行为权限由执行模型以外的机制约束 不声称 OpenProgram 已有同等 VM 隔离;记忆和人格仍可选
Grok Bot — 管理说明 / 概览 保存配置、独立对话、明确共享资源 不要求专门职责;不复制计划或已学习记忆
OpenClaw — 配置 / CLI / workspace / runtime 保留逐 Agent 工作目录和策略引用 工作目录不等于沙箱;不增加多层 profile 继承
Claude Code — CLI 参考 模型、指令、工具、会话分别设置 仅参考概念;Anthropic 接入仍使用官方 API key
Codex — 配置参考 配置、provider 和 MCP 职责分离 不声称 profile 或审批语义完全相同

参考资料用于对照产品和配置概念,不作为内部实现已验证的证据。无固定版本的官方页面可能变化,以表内列明能力作为对照范围。不声称研究创新、基准优势或自动路由已实现。

可观察验收契约

ID 公开入口 可观察结果
A01 Agent API / UI 仅名称即可创建通用 Agent,无强制职责,默认无长期记忆
A02 两客户端 PATCH 同一 revision 仅一方成功;模型与 tools 不出现混合或半保存
A03 agent()、llm()、聊天、委派 相同基础和授权覆盖得到等价生效配置;llm 无 Program/MCP 工具循环;原生搜索仍需显式开启且获授权
A04 并发嵌套函数 模型、记忆策略互不泄漏;失败与取消恢复作用域
A05 所有记忆读写入口 关闭或只读执行不被后续扫描、提取或压缩转成长期记忆
A06 切换 Agent / 指定历史 不隐式继承上个任务;无权 DAG 节点拒绝
A07 能力发现与调用 空集合始终为空;失效引用可见;被拒绝动作不执行
A08 排队 / 重试 / 恢复 保留固定 revision;新撤销能力不能执行
A09 复制 / 导出 / 删除 不误复制或删除记忆、凭据、计划、共享资源
A10 Agents 页 / 窄屏 / 键盘 所有分区可达,无整页溢出,草稿、错误、冲突与降级可见
A11 旧配置迁移 保留原生效模型、能力、记忆行为及存储历史
A12 默认 App / CLI / scheduler 统一解析证据;只使用默认 App,不增加开发 profile

场景输入、文件范围、阶段验证和执行顺序由实施计划负责。文档静态检查通过不代表这些运行时验收条件已满足。

已保存的专用 Agent

决策、轻量助手和统筹规划是普通的已保存 Agent。显式安装操作通过现有 manager 在配置锁内创建缺少的记录,保留已有同名 ID、用户修改和默认 Agent。读取列表不创建记录,删除后不自动重建。产品没有模板目录或模板选择。

三者是现有 Agent 类的固定参数配置,通过 AgentSpec 和 Agent.from_spec 解析,不添加角色 system prompt。任务和指令由调用处与 Context 提供,空的保存指令不会清除调用处已有指令。决策通过 Agent.choose 从给定选项中选一项:复用现有选择解析器,执行一次无工具的 llm 请求,不增加角色提示词、顾问式回答或自动重选。它返回选中项的 ID,非法答案直接报错;调用保留当前 Context 和 DAG 作用域。决策和轻量任务关闭工具;统筹规划可以检查证据并委派已授权任务。模型可编辑;本地安装明确指定已配置且可用的模型。角色名称不保证费用或输出质量。

页面布局

页面分为已保存 Agent 列表和完整宽度的编辑区。二级导航复用共享 ManagePage 布局与侧栏宽度变量,不为 Agents 单独设置桌面宽度。详情标题只显示名称、ID 和对话操作。七个顶部标签在所有宽度下都使用横向排列,空间不足时滚动。常规分区只显示名称、用途、模型和思考参数。可选的手动指令在高级分区编辑,保留原有草稿和调用行为。常规分区不设置内部导航列、重复说明标题或配置摘要。输入内容使用正常字重,字段标签使用中等字重。统一沿用应用字体、中性背景、控件尺寸和蓝色选中提示。全部配置分区填满标准内边距之间的可用宽度,不设置固定内容宽度上限。编辑区独立滚动,保存区固定可见。窄屏用下拉选择替代 Agent 列表,身份字段纵向排列。已保存但不兼容的思考强度继续显示,未编辑时不作为新错误播报。

验收

三个保存记录可见且可编辑,没有模板选择;重复安装保留用户修改;Agent.from_spec 能执行保存记录。草稿、冲突、复制和对话操作继续工作。紧凑保存区显示草稿状态;继承的旧设置不在未编辑时触发表单错误。通过真实 React 页面和默认 App 检查桌面与窄屏布局。

专用保存 Agent 已通过独立规格与质量审查。合并后的常规编辑区和顶部配置标签已在源码中实现,审查与验收证据保存在交付记录中。公开登记保留、Agent.from_spec 执行、模型选择、草稿与冲突处理,以及响应式键盘导航均通过检查。安装版 App 验收另行记录。

实现状态

生产 Agents 页面已使用七分区编辑器、共享草稿、模型目录选择、保存冲突比较和原有动态图标。配置增加 description、revision、原子条件保存,以及新配置默认关闭、旧配置保持共享读写的记忆策略。Web 新对话使用已保存 Agent,独立试运行保存只读或关闭记忆的会话快照;必需 MCP 缺失时在模型请求前失败。

记忆权限作用于执行、后台提取、派生结果与恢复入口;提交前重新检查策略 epoch。实际空间为 self 与 legacy_global。产品使用方法见 配置 Agent。

完整 schema 2 迁移、多文件生命周期事务、统一 Python AgentConfig 接口、所有调用入口的解析一致性、任意共享空间目录、有效配置预览、内嵌试运行面板、便携导入导出及自动 Agent/模型选择仍是目标设计。不能将当前 Web 实现视为整个方案验收完成。实际提交、测试命令和安装验收结果由交付记录保存。