当前架构契约

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

入口含义唯一位置
llm()单次模型调用,不包含工具循环。agentic_programming/llm.py
agent()模型工具调用循环。agentic_programming/agent.py
goal()反复执行 Agent 并验证完成条件,是完整 Workflow,不是第三个基础原语。programs/workflow/goal/

4. Goal 只有一个执行函数

唯一 Workflow
from 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、循环、轮次预算、提问、取消、事件、终态和返回值
聊天输入框 → /goalcontext_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 写入。提示词字面量修复已通过独立规格和质量审查,并导入本地包。组合源码与已安装界面验收分别记录。

工具参数的动态 mapping

工具的 canonical schema 区分调用时才确定键名的 mapping 与声明固定字段的对象。公开 program.args 接受已注册程序合法的关键字参数,包括 task。匿名 object mapping 与 Python dict/Mapping 注解保留开放键名及已声明的值类型。含 properties 的对象,包括显式空字段集合,保留固定字段限制。显式 additionalProperties: false 不会被打开;nullable mapping 保留原有 null 语义。本次不额外关闭既有隐式开放的顶层参数对象。

Canonical 对象本地验证Provider 工具模式
匿名或 typed mapping接受合法动态键,验证 object 与已声明的值类型保留 mapping schema,使用非 strict 工具模式
声明固定字段或显式关闭对象保留必填字段、类型与额外字段拒绝支持时保留原 strict 模式
两类工具同时出现在请求中每次调用按各自 canonical schema 验证逐工具选择模式,不对整个请求关闭 strict 验证

共享 provider schema adapter 不得把开放 mapping 转成只能为空的关闭对象。OpenAI function calling 要求 strict 模式使用关闭对象,并说明 Responses 通过显式 strict: false 保留非 strict 行为。因此动态 mapping 工具在 Responses、Codex 与 Chat Completions 中显式使用该标志;可兼容的固定字段工具继续 strict。Anthropic strict tool use 同样逐工具启用 strict 验证;mapping 工具保留普通 input schema,不设置 strict 标志。原 provider 可用性、认证、请求级能力开关和其他 schema dialect 不变。

验收在自有 session 中调用真实公开 schema、生产本地 validator 和注册程序 consumer。合法 task 参数到达 consumer;未知程序和 child 不支持的关键字保留现有错误,mapping 的错误类型或值仍无效。生产 provider payload 保留动态 mapping,同时关闭对象的 companion 工具继续 strict。固定 execute_code schema 保持 strict,不给它新增动态参数。测试包括固定对象额外键拒绝、nullable 与 typed nested mapping、不修改输入、受影响 provider/program 测试与 repository contracts。现有 live session、App、worker 和用户 state 不参与受控测试。

实现状态:canonical 设计已完成;实现、独立 SPEC、不同作者 fresh QUALITY 与单独安装验收仍待完成。

Wiki 修改元数据

公开 Wiki ingest 报告实际修改和新建的内容页,包括新目录中的页面以及含中文、空格或引号的路径。修改发现请求逐项列出未跟踪文件,使用 NUL 分隔的 Git porcelain 记录,保留准确路径,不解码展示引号或按箭头字符串拆分文件名。重命名记录消费配对的原路径,并保留目的路径。内容页后缀、目录索引排除、文件存在与 Git-ignore 规则保持不变;不修改无关的链接、页面、模板、生成、提交或索引行为。

验收通过已注册 ingest 入口创建目录内新页,验证 slot、实际 Git 提交及可搜索索引,并核对交给既有 conclusion 步骤的页面和目录元数据不为零。自有 Git 案例验证中文、特殊路径、重命名、忽略文件及排除目录索引。原 dirty ops 文件保存在独立输入基线提交中。路径发现及索引刷新修复已通过独立规格和质量审查,并导入本地包。组合源码与已安装界面验收分别记录。