games-development-ai/docs/architecture/架构/生成引擎/tier2细节图说-C-单写ReAct循环.md
zizi 32adda9517 docs(tier2): 核心三族细图——C 单写循环×4 / D 三层校验×3新 / E 能力面×3新 + 三族图说
10 张新图经 draw→对抗验证→族汇编 workflow(23 个 opus 子代理)产出,保留首批 3 张手绘样板:
- C 单写循环:单写ReAct循环 / M3 Anthropic原生接法 / 四道熔断+预算闸 / 多轮范式承amodel-gen
- D 三层校验:富游戏专属门(三联动+经济+latch) / advisory分级+Goodhart隔离 / CDP探针Phaser重写
- E 能力面:引擎能力包五件套 / prompt两阶段角色 / A-model 4插件复用

对抗验证逮修真问题:D3 'P3'命名碰撞(张冠李戴·grep证伪后改)/ D5 半角冒号 / E2 虚实线图例自相矛盾。
全 13 张复验 界内/良构/脚注/ok。3 份族图说带防漂移 commit hash + 人读散文(正反例传下子代理)。
D 族 advisory 跨分支状态校准:A-model 分支已落、未合并 dev/2.0.0,主干视角=接(非现)。
3 份细节图说接进 agentic运行时架构图说.md 看图入口。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 08:17:45 +00:00

18 KiB
Raw Blame History

date, topic, status, 映射源档
date topic status 映射源档
2026-06-23 tier2 细节图说 · C 族——单写 ReAct 循环 / M3 原生接法 / 四道熔断 / 多轮范式承 amodel 设计中tier2 待 0号 spike 验证、尚未落代码)
doc hash
docs/architecture/架构/生成引擎/自治富游戏引擎.md 4858e6cf
doc hash
docs/architecture/架构/生成引擎/tier2实现详设.md d5efe45f
doc hash
docs/plans/2026-06-22-003-feat-tier2-富游戏自治生成线-plan.md ccb00bb9
doc hash
tier2/HANDOFF.md ccb00bb9

tier2 细节图说 · C 族 — 谁在写富游戏

C 族四张图围着一个问题转tier2 要造现有廉价线做不出来的多系统富游戏,那么到底是谁在写、用什么模型写、写的时候被什么关着、这套写法又是从哪条已经跑通的路演进来的。图 C1 画清写者的形态——一个单写者 ReAct agent 在三层校验门内自治迭代;图 C2 画清这个 agent 怎么把中等档的 MiniMax-M3 接对;图 C3 画清自治多轮被四道熔断关在笼子里;图 C4 把这套写法回溯到它的两个 working reference说明它是 fork 演进而非推倒重来。

整个 C 族对应的是一条尚未落代码的设计轨。tier2 的中心赌注——便宜或中等模型的自治 agent 能不能稳定写出富游戏里那一大块表现层——要靠一个叫 0号 spike 的最小验证来证伪或证成,过了这道生死门才进建设。所以读这四张图时,要把它们当成「计划怎么干」的施工图,而不是「已经在跑」的现状图。

0 阅读约定与同步纪律

C 族把生成引擎子树里三份设计档画成图:写者形态与四道熔断出自《自治富游戏引擎》的「谁在写:单写者 ReAct + 四道熔断」一节运行时形态、建设五步、模型矩阵出自《tier2 实现详设》;与 A-model 分支的复用边界出自 tier2 富游戏自治生成线的实现计划与 tier2/HANDOFF.md。frontmatter 记了这四份的当前 commit hash 作为防漂移门——设计一变动,本图说与对应 SVG 必须同步更新hash 对不上就说明图已落后于源档。

四张图整体状态都是「建」tier2 整轨待 0号 spike 验证、尚未落代码。但「待建」不等于「全凭空想」。这套写法承袭了两条已经在跑的真实参照系——现行 WG1 廉价线的 studio.py(单轮调用加外层重试)和 A-model 分支的 amodel-gen/gen.mjs(在 M3 上已跑通的多轮 ReAct——所以图里凡是承袭这两条已落机制的部分画实线tier2 专属、要新写的部分画虚线。这条虚实之分贯穿全族,是读图时最该先盯住的一层:实线 = 现行已落或官方现成、可以直接信;虚线 = tier2 待建、还要写还要验。状态码就四个——现现行已落、接待接线、建待建、缓收窄后缓做C 族绝大多数元素是「建」。

1 全图通用图例

四张图共用一套视觉语言。实线箭头/实线框表示承袭现行已落的机制:九门 harness、new-api 计费平面、studio.py 单轮形态、amodel-gen 多轮范式都属此类,它们是已经跑过的 working reference。虚线箭头/虚线框stroke-dasharray 6 4)表示 tier2 专属的待建新机制Agent 内多轮 ReAct、M3 原生接法、thinking 分离、三道自建硬熔断、Phaser 富游戏产物,都还没落代码。红线专用于四道熔断——任一道先触发即停本局生成。

徽章标的是这块内容服务哪个生产维度:绿色的质量(造出真能玩的富游戏)、可靠(稳定收敛不靠运气擦边)、成本(压住自治多轮的烧钱)、蓝色的可观测每步推理动作观察可对账。状态徽章里紫底的「待建」「tier2 待建」标 tier2 自己要写的部分深灰底的「现行已落」「working ref」标可直接复用的参照系橙底的「best-effort 非硬闸」标一处已知没焊死的设计缝。

2 图集

图 C1 · 单写 ReAct 循环SVG·建

图 C1 单写 ReAct 循环

这张图回答「谁在写富游戏、以什么节奏写」。写者是一个单写者 ReAct agent。ReAct 指 agent「想一步、调一个工具、看结果、再想下一步」的循环——图中央那个 reason→act→observe 的三角就是这个节奏,它的反面是「一次把整个游戏的答案写完」。富游戏工程跨十几个源文件、多个系统互相接线,一次写完几乎不可能对,所以必须让 agent 每观测一次就回头重想,在循环里把游戏逼出来。

图左侧的两态并列是这张图最该让人看出的东西tier2 和现行 WG1 廉价线的真正差别,不在 prompt、不在生成域而在「多轮自治放在哪一层」。WG1 现行用的是 ReActConfig(max_iters=1) 的单轮调用,加一个外层 for attempt in range(max_repairs) 的重试循环——生成一次外层把错误喂回去重跑一次单写、单轮。它故意这么做是为了压住便宜档的单价L1 生产主线明确不引 AgentScope因为框架本身的 token 膨胀会吃掉便宜档那点利润空间。tier2 则把 max_iters 放开AgentScope 2.0.3 默认 20把「多轮」从外层 repair 循环搬进 Agent 内部的 ReAct 循环——同一套多角色 prompt 和生成域躯干复用,但自治的位置变了。这就是为什么左下角那块 tier2 态画虚线、还标着「独立锁 AgentScope 2.0.3、独立演进」:它从 WG1 fork 起步,但锁自己的框架版本、独立往前走,不强求两条线跟同一份 AgentScope。

中下那个虚线笼子是另一处要点——agent 的自治不是放任。它被关在一圈验收门里迭代:读引擎文档和资产 → 写源文件 → esbuild 构建 → headless 无头快检 → 九门 L1 真浏览器真玩 → 读 verdict → 没过就改、改完回到写源。这里有一条画成实线的关键节点:九门 L1 那一格。一款游戏算不算过关,不靠模型自己说,靠在真浏览器里真玩一遍——这套确定性判定继承自现行九门,铁律是绝不让 LLM 给自己打分。LLM 一旦进验收当裁判会学会把游戏优化成「让裁判说好」而不是「真的好」门就废了。所以图里九门那一格是实线承袭现行已落而它前后的写源、改、快检都是虚线tier2 内循环待建)——确定性的判定承袭旧机制,自治的写法是新的。

右上角那个红框是四道熔断,任一触发即停:步数硬顶、预算闸、卡死探测、双层超时。其中预算闸现在还不是强制硬闸——这是一处已知设计缝,详见图 C3。

底部那条铁律带讲清「单写者」这三个字的边界,很容易误读。单写者只指阶段 2 写代码这一环:只有一个 agent 持有整个工程的全局视图,它一个人写,不并行拆给多个 agent。坚持这点是因为经营游戏的多个系统共享同一套状态和约定拆给并行 agent 几乎必然不一致——一手教训是曾经把「造一个 Flappy Bird」拆给并行子 agent结果背景跑成了马里奥。但阶段 1 的工作室设计仍然用 Agent Team 星形多 agent 去发散玩法、关卡、数值、UI、音乐、特效各路 worker收敛成设计结论后才进阶段 2 的单写。设计要发散和专业分工用多 agent实现要防写冲突收敛到单写——所以「单写」专指写代码那一段不是说整轨只有一个 agent。

图 C2 · M3 Anthropic 原生接法SVG·建

图 C2 M3 Anthropic 原生接法

这张图回答「中等 agentic 档的 MiniMax-M3 怎么接进 tier2 的 agent」。主链路从左到右一条线tier2 agent → AnthropicChatModel → AnthropicCredential.base_url → MiniMax-M3。读这条链要抓两个事实。一是接法本身可信——它走 AgentScope 2.0.3 的官方模型类 AnthropicChatModel构造时不传 formatter 就会自动配对一个 AnthropicChatFormatter无需手接这套已经逐条核过 2.0.3 源码。二是出口统一——AnthropicCredential 的 base_url 指向 new-api 的 Anthropic 端点(即 /v1/messages),模型计费统一从 new-api 这一个平面走。链路上的箭头里agent 到模型那几跳画虚线tier2 待建),但 new-api 计费出口画实线(现行已落)。

中间三个要点框讲「用对 M3」要满足的三件事它们合起来定义了 M3 的正确用法。其一,走 Anthropic 原生协议加 agentic 工具循环——不是 OpenAI 式的单次 JSON 填空,而是让 agent 在循环里调工具写源、build、跑门、读 verdict、改多轮自治收敛。其二thinking 分离:开 thinking_enable / thinking_budget 拿到推理与答案分离这里有一条硬约束——max_tokens 必须严格大于 thinking_budgetbudget 缺省取 max_tokens 的一半;如果把 budget 设得不小于 max_tokens2.0.3 会自动把 max_tokens 抬到 budget+1024但别依赖这个兜底显式设对。其三完整 response 和历史保留:每轮把 thinking / text / tool_use 所有块原样回传入历史,不剥、不丢、不只抠 JSON——这样 M3 的交错思维Interleaved Thinking才不失效才发挥得出最佳 agentic 性能。

图中间那条红框是这张图的命门,也是为什么它值得单独画一张:旧用法是 60% 失败的最深根因,而且是用法错、不是模型天花板。错用法等于三连违反——关掉 thinking、单次 JSON 填空、失败就从头重生成。把一个 agentic 加交错思维的模型当成一次性填空机来用等于把它最强的那部分能力全关掉了。这处误读还连着另一处max_tokens 是「输出上限」、不是 512K 的上下文窗——输出可以抬到小于 128K 给 thinking 加答案用,输入窗 512K 不受它限。

底部那条绿带收口一个设计原则:模型统一从 new-api 出口走,但协议和 SDK 不锁死每档走它各自最优端点。M3 之所以特意走 Anthropic 原生端点,是因为「用对它」要的就是原生 thinking 加 agentic 工具循环便宜档deepseek-v4-flash / v4-pro照旧各自端点。不论走哪条端点计量都收口到 new-api 的 quota 口径折算成每款多少钱——一个计费平面成本可对账。这是「all roads 收口到一个计费平面」的具体含义:端点可以多样,账只有一本。

图 C3 · 四道熔断 + 预算闸SVG·建

图 C3 四道熔断 + 预算闸

这张图回答「自治多轮会不会失控、靠什么关住」。agent 在三层校验门内可以任意迭代,但被四道熔断关在笼子里,任一道先触发即停本局生成。四道分别是:步数硬顶、预算闸、卡死探测、双层超时。读这张图最该看出的,是它们的来源和成熟度并不一致——这正是图里实线虚线混用的原因。

步数硬顶防的是「靠运气擦边」。它给每系统的构建-修复定上限、给整局定 max_iters建议单系统不超过 8 轮、整局不超过 40 轮,超 max_iters 即判不收敛),走的是 AgentScope 的 ReActConfig.max_iters。它要防的不是慢,而是模型靠多轮反复试错把门擦边混过去——擦边过门和真收敛是两回事,没有步数顶就分不开。这道是 tier2 自建、待落,画虚线。

预算闸是四道里唯一画实线的——它用官方的 ReplyBudgetControlMiddleware是现成中间件在 on_reasoning / on_reply 钩子里按预算优雅收尾。但这恰恰是这张图最该被 review 的设计缝:它是软刹,不是强杀,现在还只是 best-effort不强制截断。图里专门给它配了橙底「best-effort 非硬闸」徽章,又在底部拉了一整条警示带说清后果——自治多轮一旦不强制,会在那 56% 的表现层上烧钱发散。强制硬闸的完整口径归《agentic 集成架构》那份规模化premium 量起来)之前必须落地,否则成本不可控。这条缝在 spike 阶段可以容忍:先只挂官方软刹把路跑通,三道自建硬熔断加强制硬闸到建设期再补,不阻塞 spike。

卡死探测和双层超时都是 tier2 自建、待落(虚线)。卡死探测在语义层判 agent 是不是原地打转、无实质进展而不是单纯计步——单纯计步拦不住「换汤不换药」的空转。它还要防一种更刁的逃避agent 改 driver 来绕过卡死探测,这是 Goodhart 问题的一个具体形态(优化代理指标反而偏离真目标)。双层超时是两层墙钟上限——单步钉死一次工具调用或一轮推理,整局钉死本局总时长,兜住单步挂起和整局拖死两种失控。

机制上,这四道不是散落各处,而是叠在 AgentScope 的中间件洋葱里:官方软刹加三道自建硬熔断(各做成 MiddlewareBase 子类)一层层套进 ReAct 循环,软刹优雅收尾、硬熔断强制截断。底部那条退路带把 spike 阶段的可行起点钉死——先只挂官方 ReplyBudgetControlMiddleware 软刹跑通验证就够了,强制硬闸和三道自建硬熔断到建设期再补,不让一道还没建的硬熔断挡住最该先证的那个赌注。

图 C4 · 多轮自治范式(承 amodel-genSVG·建

图 C4 多轮自治范式 承 amodel-gen

这张图回答「tier2 这套多轮自治写法是凭空发明的吗」——不是,它是从两条已经跑通的真实参照系演进来的。图上方那条三态演进带从左到右画清这条血脉:① WG1 的 studio.py 是现行已落的单轮加外层 repair 形态(实线);② A-model 分支的 amodel-gen/gen.mjs 是已经在 M3 上跑通的多轮 ReAct实线working reference③ tier2 是要在 Phaser 上造富游戏的多轮自治虚线待建。①到②标「参照系」、②到③标「fork 演进」——tier2 是 fork 起步、独立演进,不是返工。

中间那三块是 amodel-gen 留给 tier2 的三件可复用范式,每件都配了一个紫色虚线小条,标明 tier2 在哪个工作单元复用它。done 门——agent 自己 reason 判「够了」才终止不靠外层固定轮数tier2 在 U2 复用为多轮 ReActfinish 工具收尾吐出 src/ 源工程。check/build 快反馈——每轮先跑便宜的检查再决定下一步拿快反馈喂下一轮而不是等重门才纠错tier2 在 U7 复用为「写源 → build → headless 快检 → L1 门」的闭环。历史压缩——多文件富游戏迭代轮数多、上下文长压缩历史让长程多轮不撑爆窗口tier2 在 U7 复用为长程一致性12 个以上文件的工程过程中无 checkpoint 丢失)。

图底那条蓝带是这张图最该读透的部分它讲清一处极易被误导的边界——「fork 演进」不等于「整轨是平移」。tier2 复用 studio 那套多角色 prompt 和生成域躯干,把「多轮」从外层 repair 搬进 Agent 内部 ReAct这层确实是 fork 加版本钉级别的轻活:种子 studio.py 用到的 AgentScope 框架接缝6 个符号)在 2.0.3 全兼容零签名改。但别被「6 符号兼容」误导——studio.py 拖着的 validate.py / run.py / prompt.py / roles.py 是 LittleJS 专属,按 Phaser 重写、工作量约等于全新写net-new。最典型的是 validate 的硬规则:它对 LittleJS 要求「禁 import、单 export default 工厂」,这套规则对 Phaser 多文件源工程完全反转。所以真正的功夫不在框架接缝,而在这些重写面加 net-new 的多轮 ReAct / Workspace / ServicePhase B

这条边界还连着一处口径的精确化(创始人 2026-06-23 裁):两线分立、不收敛。旧的边界叫「能力档(声明式 vs 自治)」,但 A-model 分支已经让廉价线也走向自治写真 JS所以旧口径过时了。新口径是「引擎 / 表现层复杂度档」——A-model 吃 LittleJS 轻量经营档tier2 吃 Phaser 重表现富游戏档。两条线各吃各的市场、各跑各的运行时运行期零依赖。amodel-gen 合并 dev/2.0.0 之后tier2 的循环范式以合并后版本为参照系重取,种子仍是 Python 的 studio.pyamodel-gen 只作 JS 参照、不照搬。

3 图清单与状态表

# 图名 形式 状态 覆盖内容
C1 单写 ReAct 循环 SVG 建(演进自 WG1 studio.py reason→act→observe 三角WG1 单轮+repair vs tier2 内多轮两态并列验收门笼子读文档→写源→build→快检→九门 L1→verdict→改九门实线承袭、自治内循环虚线待建单写者只指阶段 2、阶段 1 仍多 agent底部四道熔断红框引子
C2 M3 Anthropic 原生接法 SVG 建(接法走官方 AnthropicChatModel2.0.3 已核) 主链路 agent→AnthropicChatModel→base_url 指 new-api→MiniMax-M3用对 M3 三要点(原生协议+工具循环 / thinking 分离 / 完整 response 保留);红框警示旧用法=60% 失败最深根因new-api 统一计费平面、协议不锁死
C3 四道熔断 + 预算闸 SVG 建(软刹官方现成、三道硬熔断+强制硬闸自建待落) 四道熔断(步数硬顶 / 预算闸 / 卡死探测 / 双层超时);预算闸=官方软刹实线 best-effort、非强制硬闸设计缝卡死探测防 Goodhart中间件洋葱叠加机制spike 阶段先只挂官方软刹的退路
C4 多轮自治范式(承 amodel-gen SVG 建(范式承 A-model 已落、tier2 fork 演进待建) 三态演进带studio.py 单轮 → amodel-gen 多轮 → tier2 Phaser 富游戏三件可复用范式done 门 / check-build 快反馈 / 历史压缩)映射 U2/U7fork 演进≠平移6 符号兼容是版本钉、validate/run/prompt/roles 是 net-new 重写);两线分立不收敛、边界精确为引擎/表现层复杂度档