当前架构契约
Programs 代码结构
确定性工具放在 tools/,所有需要模型推理或流程编排的完整能力放在 workflow/,完整产品放在 packages/。基础调用原语只保留 llm() 与 agent()。
状态:当前设计范围:源码、注册、Programs UI、打包
1. 唯一目录合同
openprogram/
├── agentic_programming/
│ ├── llm.py # 单次模型调用原语
│ └── agent.py # 带工具调用的 Agent 循环原语
└── programs/
├── tools/ # 确定性、可直接调用的工具
│ ├── files/ web/ code/ planning/ ...
├── workflow/ # 所有模型推理、Agent 编排和复合能力
│ ├── auto_workflow.py # 单文件完整 Workflow,不建同名空目录
│ ├── goal/ # 唯一 Goal Workflow 与会话 Goal 机制
│ │ ├── __init__.py
│ │ ├── goal.py # 公开入口 goal()
│ │ ├── command.py # /goal 命令适配
│ │ ├── judge.py # 完成条件判定
│ │ ├── refinement.py # 目标规格与验收清单
│ │ ├── loop.py # 唯一循环的状态迁移、重试与停止规则
│ │ ├── state.py # 同一 GoalRun 的持久状态与事件
│ │ └── notices.py # 会话状态通知
│ ├── browser/ document/ research/ ...
├── packages/ # 提供可调用能力的独立程序包
├── _registry.py # 统一注册与发现
└── _programs.py # Application 来源与安装元数据不再存在 programs/functions/、programs/functions/agentic/、programs/workflows/ 或 agentic_programming/goal.py。同一能力只有一个权威实现和一个公开导入路径。
2. 三类 Program
programs/tools/工具
输入到输出由普通代码决定,不发起模型推理,不启动 Agent loop。使用 @function 注册,可被 Agent、Workflow 和 Application 复用。
可迁移包来源
项目内 Program 使用带 programs 范围的相对路径记录位置;一个外部安装绑定负责连接已安装 runtime 与源码 checkout。相对路径不使用聊天的工作目录。只有已授权的确切包名参与 Python 解析,不扩展整个外部目录的 import 范围。迁移、拒绝条件与发布规范以 Workflow 包合同 为准。
programs/workflow/工作流
凡是调用 llm()、agent()、其他 Workflow,或包含多阶段状态与完成判定的能力,都归入这里。单次模型调用能力也属于 Workflow,不再单列 Agentic Function 目录。
可迁移包来源
项目内 Program 使用带 programs 范围的相对路径记录位置;一个外部安装绑定负责连接已安装 runtime 与源码 checkout。相对路径不使用聊天的工作目录。只有已授权的确切包名参与 Python 解析,不扩展整个外部目录的 import 范围。迁移、拒绝条件与发布规范以 Workflow 包合同 为准。
programs/packages/包
程序包是可调用能力的安装单位,包含自己的依赖和发布边界,可提供多个 Tool 或 Workflow。软件 Application 使用独立管理页、声明和注册目录,调用公开 Program 能力;它不属于此源码分类。旧 applications/ 程序包位置保留兼容读取。
可迁移包来源
项目内 Program 使用带 programs 范围的相对路径记录位置;一个外部安装绑定负责连接已安装 runtime 与源码 checkout。相对路径不使用聊天的工作目录。只有已授权的确切包名参与 Python 解析,不扩展整个外部目录的 import 范围。迁移、拒绝条件与发布规范以 Workflow 包合同 为准。
3. 基础原语与 Workflow
工作流决定流程、状态和验收
→
agent()模型多轮推理并调用 Tools
→
llm()单次模型请求与结构化输出
| 入口 | 含义 | 唯一位置 |
|---|
llm() | 单次模型调用,不包含工具循环。 | agentic_programming/llm.py |
agent() | 模型工具调用循环。 | agentic_programming/agent.py |
goal() | 反复执行 Agent 并验证完成条件,是完整 Workflow,不是第三个基础原语。 | programs/workflow/goal/ |
4. Goal 只有一个执行函数
唯一 Workflowfrom openprogram.programs.workflow.goal import goal 是唯一执行函数,唯一负责 GoalRun 初始化、spec refinement、Agent 轮次、完成判定、用户提问、停止规则、状态写入和终态。不得在 dispatcher、命令适配或其他模块保留第二个 Goal 循环。
Programs 表单表单直接调用 goal(prompt, condition, context_mode="isolated", ...)。运行记录可以归属当前 session,但 goal() 的模型上下文不读取调用前的聊天历史;它只读取表单参数和本次 GoalRun 内已经产生的调用。
Chat 命令/goal <condition> 只是同一 Workflow 的会话适配:解析命令后调用 goal(prompt=condition, condition=condition, context_mode="session", ...)。context_mode="session" 在执行开始时读取当前会话视图;除此之外与表单使用同一状态机。
状态与控制两种入口产生相同 GoalState、进度事件、GoalChip、提问、取消、clear/status 和终态。/goal clear 控制当前 session 关联的 GoalRun,不启动或维护第二种 Goal 对象。
内部模块judge.py、refinement.py、state.py、loop.py 只服务该函数。command.py 只解析 set/status/clear 并构造一次 goal() 调用,不创建状态、不完善目标、不运行 continuation。
禁止重复禁止保留 continue_goal_turns() 与 goal() 两套轮次控制;禁止从 session Goal 向 isolated Goal 复制 spec/checklist;禁止根据入口改变默认轮数、need_user 或终态语义。
| 公开路径 | 唯一允许差异 | 必须相同 |
|---|
| Programs → Use → Goal 表单 | context_mode="isolated" | GoalState、refinement、judge、循环、轮次预算、提问、取消、事件、终态和返回值 |
聊天输入框 → /goal | context_mode="session" |
结果归属与模型上下文是两个字段:表单运行可以把 DAG/runtime card 写进当前 session,但仍必须用 render_range.callers=0 隔离调用前历史;会话命令通过显式 session context 输入恢复当前聊天证据。
4.1 实现与验证记录
| 类型 | 已确认证据 |
|---|
| 实现 | 0629e2fd 及其前置提交已删除 dispatcher 的 Goal continuation;/goal 构造一次 goal(..., context_mode="session") forced call;Programs 表单仍调用同一函数并默认 isolated。 |
| 独立规格审查 | 通过。审查覆盖单一函数、两种上下文模式、refinement/judge 期间 clear 竞态、轮次预算和终态。 |
| 独立质量审查 | 通过。审查覆盖取消、异常、最后一轮提问、跨进程 Goal 事件与 Web/CLI 适配。 |
| 自动验证 | Goal/Programs/Web/CLI/进程桥聚焦集 116 passed;Web 单元测试 54 passed;TypeScript tsc --noEmit、Ruff、文档链接和 git diff --check 通过。 |
本节只记录已审查的实现证据,不改变上方的设计合同。
5. 文件与目录的选择
| 形态 | 使用条件 | 示例 |
|---|
单个 .py | 一个公开入口和少量局部 helper,文件可以独立阅读。 | workflow/auto_workflow.py |
| 同名包 | 存在多个明确职责模块、资源文件或会话适配。 | workflow/goal/、workflow/browser/ |
| 内部目录 | 只服务于相邻 Workflow 的共享实现,以 _ 开头,不成为 Programs UI 节点。 | workflow/_runtime/ |
不为形式统一而给每个 Workflow 创建同名文件夹。文件数量与职责边界决定是否拆包。
6. 允许的依赖方向
| 调用方 | 允许 | 禁止 |
|---|
| Tool | 标准库、批准的依赖、确定性 helper。 | llm()、agent()、Workflow、Application。 |
| 工作流 | Tools、llm()、agent()、无环的其他 Workflow。 | 依赖 Application、复制其他 Workflow、字符串名称调度。 |
| 应用 | 公开 Tool、公开 Workflow、应用自己的 UI 与服务。 | 修改被调用 Program,或维护第二份实现。 |
7. 注册与 Programs UI
统一注册_registry.py 从 tools/ 和 workflow/ 加载公开入口;Application 使用来源记录与安装合同。
UI 顶层只显示 Tools、Workflow、Applications,不再显示 Functions、Vanilla、Agentic Function 等历史层级。
实体识别注册入口是可运行实体,Programs 侧栏对它显示 Use。同名包展开后按真实目录列出职责模块(如 goal/command.py);这些文件可以打开查看调用关系,但不注册为第二个 Program,没有 Use。__init__.py 和 _ 内部目录仍不成为节点。
唯一路径迁移后只支持新 import。旧路径直接失败,不设置 alias,不同时扫描新旧目录。
稳定合同移动源码不改变公开名称、参数 Schema、权限、DAG 语义和会话状态格式。
8. 一次性迁移验收
| 迁移项 | 理想状态 |
|---|
functions/vanilla → tools | 全部确定性工具从新路径注册,旧目录不存在。 |
functions/agentic + workflows → workflow | 模型能力和复合流程只从 singular workflow/ 加载。 |
| Goal 合并 | agentic_programming 只导出 llm、agent;Goal 只位于 workflow/goal/。 |
| 调用方 | Python import、注册器、CLI、Server、Web Programs、文档和打包配置全部使用新路径。 |
| 旧结构 | 不存在旧目录、兼容模块、重复装饰器注册和双路径扫描。 |
| 功能 | 公开名称和 Schema 不变;Goal、Auto Workflow、Programs 浏览和运行入口均可使用。 |
9. 不引入的设计
不增加新装饰器
不新增 @workflow;目录与元数据表达分类。
可迁移包来源
项目内 Program 使用带 programs 范围的相对路径记录位置;一个外部安装绑定负责连接已安装 runtime 与源码 checkout。相对路径不使用聊天的工作目录。只有已授权的确切包名参与 Python 解析,不扩展整个外部目录的 import 范围。迁移、拒绝条件与发布规范以 Workflow 包合同 为准。
不增加字符串调度
Workflow 使用普通 Python import 和调用,不新增 call_workflow(name)。
可迁移包来源
项目内 Program 使用带 programs 范围的相对路径记录位置;一个外部安装绑定负责连接已安装 runtime 与源码 checkout。相对路径不使用聊天的工作目录。只有已授权的确切包名参与 Python 解析,不扩展整个外部目录的 import 范围。迁移、拒绝条件与发布规范以 Workflow 包合同 为准。
不保留两套结构
不按版本并存新旧目录,不在运行时判断加载哪一套。
可迁移包来源
项目内 Program 使用带 programs 范围的相对路径记录位置;一个外部安装绑定负责连接已安装 runtime 与源码 checkout。相对路径不使用聊天的工作目录。只有已授权的确切包名参与 Python 解析,不扩展整个外部目录的 import 范围。迁移、拒绝条件与发布规范以 Workflow 包合同 为准。
源码、注册表、Programs explorer 与 /goal 均按本页目录合同加载。公开名称和 Schema 不因源码移动而改变。
已安装 Wiki 的提示词字段替换
已安装 wiki_agent 的生成与 enrichment 提示词只替换已声明的内容字段。alert-{info|warning|success|error} 等 CSS 示例在 Python 格式化后完整保留,不作为替换字段。默认提示词不因示例花括号抛出格式化异常,ingest 与 enrich 继续执行既有模型调用和自有 vault 操作。修复仅转义原提示词中的两处字面量,保留 Wiki 的生成、slot、Git 和索引机制。公开验收分别调用两个动作的真实注册入口,在受控生成处核对示例未变,并验证自有页面和 slot 写入。提示词字面量修复已通过独立规格和质量审查,并导入本地包。组合源码与已安装界面验收分别记录。