From 8a26d1973c0930cf74c7998e3c203e0fdbfbf5c7 Mon Sep 17 00:00:00 2001 From: host Date: Fri, 30 Oct 2026 00:04:34 +0800 Subject: [PATCH] =?UTF-8?q?align:=20ChatGPT=20Codex=20=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=89=B9=EF=BC=9A=E6=8A=80=E8=83=BD=E5=8C=85?= =?UTF-8?q?=20+=20=E5=AF=B9=E7=85=A7=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对照用户提供的 ChatGPT Codex 工具目录,区分可对齐与 不照搬:核心编程工作流已对齐,ChatGPT 托管专属 (CUA、宠物、Docs/Sites 连接器、图片生成模型)不在 开源宿主编排层范围,不凭空宣称对齐。 第一批只补技能层,不改 worker、不改生产行为: - cloud/skills/live-info:天气/时区/股票/体育,查一级 来源、带来源和快照时间,绝不编数字。 - cloud/skills/document-tools:LaTeX/Word/PDF/表格/ 演示文稿,先核查工具、缺了明说、产出后重读验证。 - cloud/skills/image-workflow:已有图片处理 + 生成工具 已配置时才生成,未配置时明说、绝不顶替。 - docs/chatgpt-codex-alignment.md:逐项对照表与不照搬 的诚实边界,方向为自动化编程任务平台。 - cloud/tests/test_chatgpt_codex_skills.py:校验技能 frontmatter、名字与目录一致、正文非空、无密钥占位。 验证:新测试 2 项全过。播种进租户 codex-home、 worker 改动、CUA/连接器/图片模型均不在本批,另行评审。 --- cloud/skills/document-tools/SKILL.md | 55 ++++++++++++++++++++++ cloud/skills/image-workflow/SKILL.md | 52 +++++++++++++++++++++ cloud/skills/live-info/SKILL.md | 55 ++++++++++++++++++++++ cloud/tests/test_chatgpt_codex_skills.py | 52 +++++++++++++++++++++ docs/chatgpt-codex-alignment.md | 58 ++++++++++++++++++++++++ 5 files changed, 272 insertions(+) create mode 100644 cloud/skills/document-tools/SKILL.md create mode 100644 cloud/skills/image-workflow/SKILL.md create mode 100644 cloud/skills/live-info/SKILL.md create mode 100644 cloud/tests/test_chatgpt_codex_skills.py create mode 100644 docs/chatgpt-codex-alignment.md diff --git a/cloud/skills/document-tools/SKILL.md b/cloud/skills/document-tools/SKILL.md new file mode 100644 index 0000000..d691a55 --- /dev/null +++ b/cloud/skills/document-tools/SKILL.md @@ -0,0 +1,55 @@ +--- +name: document-tools +description: 创建或编译 LaTeX 项目,处理 Word、PDF、表格和演示文稿时使用。先核查本机工具有没有,缺工具就明说,绝不假装产出了文件。 +--- + +# document-tools:文档处理 + +## 何时用 + +用户要做 LaTeX 编译、Word(.docx)读写、PDF 读写、表格 +(.xlsx / .csv)处理、演示文稿(.pptx)制作时用。 + +## 何时不用 + +- 只是读一段纯文本、改代码、写 Markdown:不用本技能, + 直接用文件工具。 +- 用户没说要产出文档,只是问文档里写了什么:先读文件, + 不用走编译流程。 + +## 工具前提(先核查,不满足就明说) + +在工作区 shell 里先查,缺什么就报什么,不要跳过核查直接写: + +- LaTeX:`latexmk` / `pdflatex` / `xelatex` 是否存在。 +- 通用转换:`pandoc` 是否存在。 +- Python 库:`python3 -c "import docx, openpyxl, pptx, fitz"`, + 哪个 import 失败就说明哪个缺失。 +- PDF 阅读:`pdftotext` 或 Python 的 `fitz` / `pypdf`。 + +核查命令本身不产出文件,核查失败时回答里写清“缺 XX, +本环境无法编译 / 无法处理该格式”,并给出可替代的方案 +(例如只产出 Markdown / CSV),不要伪造一个文件路径。 + +## 步骤 + +1. 先确认输入和输出:输入文件路径、输出格式、输出路径、 + 语言(中文 LaTeX 优先 xelatex + CJK 字体,缺字体先报)。 +2. 选最小工具链:能用 pandoc 就不用手写 LaTeX 模板; + 能用 Python 库读写就不用先转格式。 +3. 编译 / 生成后必须验证产出: + - 文件确实存在,大小不是 0。 + - LaTeX:编译日志无致命错误(error / Emergency stop), + 页数符合预期。 + - docx / xlsx / pptx:用对应库重新打开一次,能读回 + 刚才写的内容(标题、表头、页数/幻灯片数)。 + - PDF:能用 `pdftotext` 或 `fitz` 读回文本,确认不是空白页。 +4. 验证失败时不要把半成品当成品交,先贴出报错,再修。 + +## 输出要求 + +- 交代产出文件的真实路径、页数 / 幻灯片数 / 表格行数, + 以及用哪条命令验证过。 +- 不要编造页数、字数、文件大小;写不出的就写“未验证”。 +- 涉及用户数据的文件不要写到工作区以外,不要上传到 + 第三方服务,除非用户明确要求。 diff --git a/cloud/skills/image-workflow/SKILL.md b/cloud/skills/image-workflow/SKILL.md new file mode 100644 index 0000000..dbd4147 --- /dev/null +++ b/cloud/skills/image-workflow/SKILL.md @@ -0,0 +1,52 @@ +--- +name: image-workflow +description: 查看、裁剪、缩放、格式转换已有图片,或在图片生成工具已配置时按描述生成/编辑图片时使用。未配置生成工具时必须明说无法生成,绝不把已有图片或占位图当成生成结果。 +--- + +# image-workflow:图片查看与处理 + +## 何时用 + +- 查看已有图片、裁剪、缩放、转格式、读图片尺寸和格式。 +- 用户明确要求“按描述生成一张图”或“按描述改这张图”, + 且本环境已配置图片生成工具 / API 时。 + +## 何时不用 + +- 只是写代码、改文本、查文档:不用本技能。 +- 用户要生成图片,但本环境没有生成工具:不要硬做, + 走下面的“未配置”分支。 + +## 工具前提(先核查,不满足就明说) + +1. 查看和处理已有图片:查 `python3 -c "import PIL"`, + 以及 `convert` / `magick`(ImageMagick)是否存在。 + 有其一即可做裁剪、缩放、转格式;都没有就明说。 +2. 生成 / 编辑图片:先查任务环境里是否已配置图片生成 + 工具或 MCP / API(包括需要什么 key、走哪个 endpoint)。 + 没有配置时,回答必须是“本环境未配置图片生成工具, + 无法按描述生成”,并给出替代方案(例如用 shell 画示意图、 + 或用户提供已有图片后做裁剪/缩放),绝不能: + - 把网上找来的图、占位图、已有图片说成是刚生成的; + - 编造一个图片路径或图片内容描述。 + +## 步骤(已有图片处理) + +1. 先读原图信息:格式、尺寸、文件大小,确认输入路径存在。 +2. 按用户要求做裁剪 / 缩放 / 转格式,产出到用户指定的 + 路径(未指定时用工作区内的新文件名,不覆盖原图)。 +3. 验证产出:重新打开产出图,确认格式、尺寸符合要求, + 文件大小不是 0。 + +## 步骤(生成 / 编辑,仅当工具已配置时) + +1. 把用户描述原样记下来,不要自己加没说的元素。 +2. 调已配置的生成工具,记录工具名、提示词、产出路径。 +3. 验证产出图存在且能打开,再交给用户;失败时贴出 + 工具报错,不要换一张别的图顶替。 + +## 输出要求 + +- 每个产出图都要给真实路径和尺寸,生成类还要给提示词。 +- 未配置时不要绕弯子说“已生成”,直接说缺什么、 + 用户补什么才能生成。 diff --git a/cloud/skills/live-info/SKILL.md b/cloud/skills/live-info/SKILL.md new file mode 100644 index 0000000..1a7e272 --- /dev/null +++ b/cloud/skills/live-info/SKILL.md @@ -0,0 +1,55 @@ +--- +name: live-info +description: 查询天气、时区、股票价格、体育赛程等实时公开信息时使用。只用可查证的公开来源,绝不编造数字,回答必须带来源和快照时间。 +--- + +# live-info:实时公开信息查询 + +## 何时用 + +用户问天气、时区换算、某只股票的当前价、某场比赛的赛程或比分等 +“现在是多少”类问题时用。编程任务里需要查官方文档、发布说明、 +最新版本时,同样走本技能的查证流程,不要凭记忆给数字。 + +## 何时不用 + +- 用户只问概念、历史、代码怎么写:不用本技能。 +- 已经有任务内文件、数据库、日志能直接回答的:以任务内证据为准, + 不用再上网。 + +## 工具前提(先核查,不满足就明说) + +1. 先确认本任务里是否有网页搜索工具(codex-app-server 里是 + websearch MCP 的 `web_search` / `web_fetch`,生产 worker 需 + 带 `--websearch-mcp` 才播种)。没有搜索工具时,直接告诉用户 + “本环境无联网查询工具,无法核实实时数字”,不要编一个。 +2. 有搜索工具时,优先查官方或一级来源:气象部门、交易所、 + 联赛/球队官网、时区数据库说明。聚合新闻、论坛、二手转载 + 只能当线索,不能当唯一来源。 + +## 步骤 + +1. 把问题拆成可查的实体 + 时间 + 地点:例如“北京明天天气” + → 城市 = 北京,日期 = 明天(换算成具体日期并写出来), + 指标 = 气温/降水/风力。 +2. 用 `web_search` 查 1-2 个一级来源,打开来源页核对数字, + 不要只抄搜索摘要。 +3. 股票:只报快照价 + 涨跌 + 快照时间,并说明“快照价不是 + 投资建议,盘中价格会变”。不要给买入/卖出建议。 +4. 时区:先写出两个时区的 UTC 偏移和夏令时状态,再换算, + 不要只给换算结果。 +5. 体育赛程:写清联赛、主客队、开赛时间(含时区)、比分 + 是“已结束 / 进行中 / 未开始”哪一种。 + +## 输出要求 + +- 数字后面必须跟来源和时间,例如“来源:XX 官网,查询时间 + 2026-10-30 00:00 CST”。 +- 查不到、来源冲突、或时间已过期时,明说查不到 / 冲突, + 不要选一个看起来顺眼的数字。 +- 不要把预测(天气预报、分析师目标价)写成事实。 + +## 校验 + +回答前自查:每个数字都有来源吗?时间写了吗?时区写了吗? +有一项没有,就补查或删掉该数字。 diff --git a/cloud/tests/test_chatgpt_codex_skills.py b/cloud/tests/test_chatgpt_codex_skills.py new file mode 100644 index 0000000..8dc6aa2 --- /dev/null +++ b/cloud/tests/test_chatgpt_codex_skills.py @@ -0,0 +1,52 @@ +"""ChatGPT Codex 对齐第一批:技能包校验。 + +只校验技能文件本身,不启动 worker、不跑模型、不改生产行为: +每个 cloud/skills/<名>/SKILL.md 必须有 name + description +frontmatter、名字与目录一致、正文非空、不含密钥占位。 +""" + +import os +import re +import unittest +from pathlib import Path + +SKILLS_DIR = Path(__file__).resolve().parents[1] / "skills" +EXPECTED = {"live-info", "document-tools", "image-workflow"} + + +def _frontmatter(text): + m = re.match(r"^---\n(.*?)\n---\n", text, re.DOTALL) + if not m: + return None + out = {} + for line in m.group(1).splitlines(): + if ":" in line: + k, v = line.split(":", 1) + out[k.strip()] = v.strip() + return out + + +class ChatGptCodexSkillsTestCase(unittest.TestCase): + def test_expected_skills_exist(self): + names = {p.name for p in SKILLS_DIR.iterdir() if p.is_dir()} + self.assertEqual(names, EXPECTED) + + def test_skill_frontmatter_and_body(self): + for name in sorted(EXPECTED): + path = SKILLS_DIR / name / "SKILL.md" + self.assertTrue(path.is_file(), str(path)) + text = path.read_text(encoding="utf-8") + fm = _frontmatter(text) + self.assertIsNotNone(fm, name) + self.assertEqual(fm.get("name"), name) + desc = fm.get("description", "") + self.assertTrue(desc, name) + self.assertLessEqual(len(desc), 200, name) + body = text.split("---", 2)[-1].strip() + self.assertTrue(len(body) > 200, name) + for bad in ("API_KEY", "sk-", "password"): + self.assertNotIn(bad, text, name) + + +if __name__ == "__main__": + unittest.main() diff --git a/docs/chatgpt-codex-alignment.md b/docs/chatgpt-codex-alignment.md new file mode 100644 index 0000000..fc6a8fc --- /dev/null +++ b/docs/chatgpt-codex-alignment.md @@ -0,0 +1,58 @@ +# codex-app-server 对齐 ChatGPT Codex:工具目录对照 + +来源:用户 2026-10-30 提供的 ChatGPT Codex 工具目录(ChatGPT Codex +在其自有 app 里的工具清单),对照对象是 codex-app-server 现生产 +(main d4a517f,2026-10-29)与本分支第一批。 + +方向先说清:用户 2026-10-29 已定,往自动化编程任务平台方向 +做生产级提升,不是个人 agent OS 方向。所以本对照只对齐 +“编程任务平台”相关的能力,ChatGPT 托管专属能力不照搬, +见文末“不照搬”一节。 + +## 对照表 + +| ChatGPT Codex 能力 | codex-app-server 现状 | 结论 | +|---|---|---| +| 终端与文件:shell、读写工作区、看图片、apply_patch、看终端输出 | codex-core 工具 + worktree + 沙箱,host/cloud 已有 | 对齐 | +| 联网查询:网页搜索、打开网页、找页面内容 | websearch MCP(SearXNG / DuckDuckGo / Brave),生产 worker 带 `--websearch-mcp` 才播种 | 对齐(搜索本体) | +| 联网查询:天气、时区、股票、体育赛程 | 无专用垂类工具;本分支新增 `live-info` 技能,教 agent 用 web_search 查一级来源、带来源和快照时间,绝不编数字 | 第一批:技能对齐,工具未新增 | +| 图片生成:按描述生成、按已有图片编辑 | 无图片生成模型工具;查看/裁剪/缩放靠 PIL / ImageMagick(若装了)。本分支新增 `image-workflow` 技能,未配置生成工具时必须明说无法生成,绝不拿占位图顶替 | 第一批:流程对齐,生成能力仍缺工具 | +| 浏览器与界面操作(CUA):读界面、开网页、操作标签页、桌面应用 | 无。README 已写:Computer Use 是另一条管线,不在 host / CLI 中间层 | 不照搬,见下 | +| 协作代理:启动代理、发任务、看进度、等结果 | host delegate、模型内子代理、云端协调员/子任务 | 对齐 | +| Codex 任务与工作区:列项目/任务、读任务记录、建/切 worktree、开文件或终端面板、管理标题、归档、附件 | projects / tasks / fork / archive / uploads 已有;任务文件读取在 PR #146(未合) | 对齐,文件端点待 #146 | +| 自动化:创建/查看/更新定时任务和提醒 | automations --add + run-due、云端自动化 | 对齐 | +| 文档工具:LaTeX 编译、Word / PDF / 表格 / 演示文稿 | 无一等工具,只能靠 shell 调系统里装好的工具。本分支新增 `document-tools` 技能:先核查 pandoc / latexmk / python-docx 等,缺了明说,产出后必须重读验证 | 第一批:技能对齐,工具未新增 | +| 连接的应用与服务:GitHub、文档会话、Sites 等,须安装/授权 | GitHub PR 链路、MCP / skills / 插件已有;ChatGPT 的 Docs / Sites 连接器目录没有 | 部分,不照搬连接器目录 | +| 专项能力:管理插件、技能 | skills/list、`.agents/skills`、MCP 已有;本分支在 `cloud/skills/` 新增 3 个技能包 | 部分,第一批补技能包 | +| 专项能力:ChatGPT 宠物 | 无,ChatGPT app 专属 | 不照搬 | +| 专项能力:AIMemory Runner 远程运维 | 2026-10-28 已停用全部 7 个 aimemory 容器,数据未删但不在活跃能力里 | 不照搬,现不活跃 | + +## 第一批做了什么(本分支) + +- `cloud/skills/live-info/SKILL.md`:天气/时区/股票/体育, + 查一级来源、带来源和快照时间、不编数字。 +- `cloud/skills/document-tools/SKILL.md`:LaTeX / Word / PDF / + 表格 / 演示文稿,先核查工具、缺了明说、产出后重读验证。 +- `cloud/skills/image-workflow/SKILL.md`:已有图片处理 + + 生成工具已配置时才生成,未配置时明说、绝不顶替。 +- `cloud/tests/test_chatgpt_codex_skills.py`:校验每个技能 + 都有 name + description、名字与目录一致、无密钥占位、 + 正文非空。技能本身不改 worker 行为,生产行为不变。 +- 本分支不改 worker 播种、不改生产配置、不部署。把技能 + 播种进租户 codex-home(仿 websearch MCP 的播种方式) + 是下一批,需要单独评审 worker 改动。 + +## 不照搬(诚实边界) + +- CUA / 桌面操作:需要浏览器自动化 + 桌面操作基础设施, + 不是加一个技能就能对齐的,且与“自动化编程任务平台” + 方向不符;若用户另行立项,再单独评估 Playwright / + 浏览器 MCP 路线。 +- 图片生成模型:需要图片生成模型或 API 配置,codex-app-server + 现用中转 chat 模型,没有图片生成工具;技能只能管“有工具 + 时怎么用、没工具时怎么明说”,不能凭空变出生成能力。 +- ChatGPT 连接器目录(Docs / Sites 等)与宠物:ChatGPT + 托管服务专属,需要 OAuth 与托管后端,不在开源宿主编排层 + 的范围里。 +- AIMemory Runner:已停用,不为对齐而恢复;恢复需用户 + 另行定是否启用 docker 自启与数据清理。