feat(saa): U5 M3-only override(bake-off)+ 10 品类多样验证集

Plan A U5「只用 M3」(创始人 2026-06-19;deepseek 留作最终模型对照):
- SaaStudioGraph.Models.allSame(model): 全 11 角色统一模型工厂(bake-off 用)
- SaaGraphDispatcher: saaForceModel 非空→Models.allSame(全角色统一、无跨家回退)+ 单模型路日志;空→stage1 默认(deepseek 主力,字节零变)
- AigcExecutorProperties.saaForceModel(默认空=字节零变)
- SaaFullGraphE2eTest: -Dsaa.e2e.model flag(全角色统一模型)+ [config] 打印
- saa-e2e-briefs-diverse10.txt: 10 个不同玩法品类(覆盖 U4 全 8 driver 家族 a-h),优于按行序前 10(仅 4 品类聚集)

验证:编译绿(test-compile exit 0)。默认 saaForceModel 空→stage1(deepseek)字节零变,仅 dispatcher=saa 生效。
实测对照(K=10/diverse-10/anthropic):deepseek 主力基线 3/10(30%,主因生成 llm_error,到门者败于 F_wiring/G_input/E_live/H_progress);M3-only 基线量测中。
不碰 gd-runtime/build-from-source(Plan B 域)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
lili 2026-06-19 10:22:45 -07:00
parent 5fde4e2609
commit 1cd199cb3c
5 changed files with 46 additions and 2 deletions

View File

@ -396,9 +396,18 @@ public class SaaGraphDispatcher implements GenerationDispatcher {
mf = SaaStudioGraph.openAiFactory(api);
upstreamDesc = "openai(" + baseUrl + ")";
}
// Plan A U5只用 M3创始人 2026-06-19saaForceModel 非空 全角色统一该模型 stage2/fallback 单模型无跨家回退=stage1 默认deepseek 主力字节零变
String forceModel = properties.getSaaForceModel();
boolean singleModel = forceModel != null && !forceModel.isBlank();
SaaStudioGraph.Models models = singleModel
? SaaStudioGraph.Models.allSame(forceModel.trim())
: SaaStudioGraph.Models.stage1();
if (singleModel) {
log.info("[saa-dispatch] 单模型路U5 只用 M3forceModel={}(全 11 角色统一、无跨家回退)", forceModel.trim());
}
// 固定架构 B2透传救场阶梯 stage2 额外救场轮saaStage2ExtraRepairs factory-based build 重载recursionLimit 5+3 重算
// Plan A/U2historyEnabled=anthropicanthropic generate 跨轮保留 thinking 历史 + 连续对话救场openai 路关字节零变
compiledGraph = SaaStudioGraph.build(mf, SaaStudioGraph.Models.stage1(), gameRuntimeRoot,
compiledGraph = SaaStudioGraph.build(mf, models, gameRuntimeRoot,
properties.getSaaMaxRepairs(), properties.getSaaMaxPlayerRounds(),
properties.getSaaStage2ExtraRepairs(),
properties.getSaaSourceMode(), // plan U3factory(默认,iife) | gamedef(真结构化源)

View File

@ -129,6 +129,15 @@ public final class SaaStudioGraph {
return new Models(M_DESIGN, M_CODE, M_FIX, M_PLAYER_TEXT, M_PLAYER_VISION, M_CLASSIFY, M_NARRATIVE,
M_CODE_STAGE2, M_FIX_STAGE2, M_CODE_FALLBACK, M_FIX_FALLBACK);
}
/**
* 全角色统一同一模型Plan A U5只用 M3创始人 2026-06-19bake-off / 单模型基线用
* 11 个角色名全置为 {@code model} stage2 强档位与 code/fix fallback 单模型路<b>无跨家回退</b>符合"只用 M3"语义
* per-role maxTokens/temperature 不变 assemble 故小位 playerVision=900仍按其预算thinking 预算 clamp 后自动降级
*/
public static Models allSame(String model) {
return new Models(model, model, model, model, model, model, model, model, model, model, model);
}
}
/**

View File

@ -222,6 +222,14 @@ public class AigcExecutorProperties {
*/
private Integer saaCdpPortBase = 9222;
/**
* SAA 全角色强制统一模型Plan A U5只用 M3创始人 2026-06-19bake-off / 单模型基线用
* 非空 SAA 11 个角色名全置为此模型 stage2 强档位与 code/fix fallback 单模型路<b>无跨家回退</b>
* <b>(默认)= stage1 默认路由deepseek 主力 + M3 视觉/分类/回退字节零变</b>per-role maxTokens/temperature 不变
* <p> dispatcher=saa 生效 M3-only 基线设 {@code MiniMax-M3}deepseek 对照留空(默认) deepseek 主力路
*/
private String saaForceModel;
// ===== SAA 模型协议Plan A · U1用对 M3flag 旁挂默认 openai 字节零变=====
/**

View File

@ -220,6 +220,8 @@ class SaaFullGraphE2eTest {
// SAA 模型协议Plan A U1用对 M3 flag = P1-6flip 须同切协议的量测面孪生-Dsaa.e2e.protocol 默认 openai字节零变基线
// anthropic 真基线R1 硬要求 ==在用协议=anthropic须显式 -Dsaa.e2e.protocol=anthropicbase/thinkingBudget props 默认
String protocol = System.getProperty("saa.e2e.protocol", "openai").trim();
// 强制单模型Plan A U5只用 M3创始人 2026-06-19-Dsaa.e2e.model 非空 全角色统一该模型 MiniMax-M3未设=stage1 默认(deepseek 主力)
String forceModel = System.getProperty("saa.e2e.model", "").trim();
// 端口基址Plan A U3 暴露 superpowers-chrome 等本机进程共存防撞未设=props 默认 4320/9222字节零变
// 本机 9222 常被 superpowers-chrome 占用 量测可 -Dsaa.e2e.cdpPortBase=9322 避撞serve-and-play 净场只杀本槽端口不误杀他者
Integer playPortBase = Integer.getInteger("saa.e2e.playPortBase");
@ -239,9 +241,10 @@ class SaaFullGraphE2eTest {
props.setSaaSourceMode(sourceMode); // 003-U1 发现量对路gamedef 基线须显式 -Dsaa.e2e.sourceMode=gamedef
props.setSaaConcurrency(concurrency); // 003-U1后台并发度默认 1=串行基线>1 job 并行真玩各占错开端口
props.setSaaModelProtocol(protocol); // Plan A U1anthropic=用对 M3 真路R1 ==默认 openai 字节零变base/budget props 默认saaAnthropicBase / saaThinkingBudget
if (!forceModel.isEmpty()) props.setSaaForceModel(forceModel); // Plan A U5全角色统一模型 MiniMax-M3未设=stage1 默认(deepseek 主力)
if (playPortBase != null) props.setSaaPlayPortBase(playPortBase); // 未设=props 默认 4320字节零变
if (cdpPortBase != null) props.setSaaCdpPortBase(cdpPortBase); // 未设=props 默认 9222本机避 superpowers-chrome -Dsaa.e2e.cdpPortBase=9322
System.out.println("[config] sourceMode=" + sourceMode + "factory=iife旧路/gamedef=真结构化), concurrency=" + concurrency + ", protocol=" + protocol + ", playPortBase=" + props.getSaaPlayPortBase() + ", cdpPortBase=" + props.getSaaCdpPortBase());
System.out.println("[config] sourceMode=" + sourceMode + "factory=iife旧路/gamedef=真结构化), concurrency=" + concurrency + ", protocol=" + protocol + ", forceModel=" + (forceModel.isEmpty() ? "(stage1默认/deepseek主力)" : forceModel) + ", playPortBase=" + props.getSaaPlayPortBase() + ", cdpPortBase=" + props.getSaaCdpPortBase());
// 2) 结果容器 + stub 回调共享 latch(N) + byTrace 精确归位+ 派发器5 sourceProjectApi=null=create
long runStart = System.currentTimeMillis();

View File

@ -0,0 +1,15 @@
# saa-e2e-briefs-diverse10.txt —— 003-U1/U5 验证集10 个不同玩法品类(创始人 2026-06-19 指令)
# 用法:-Dsaa.e2e.sourceMode=gamedef -Dsaa.e2e.briefFile=src/test/resources/saa-e2e-briefs-diverse10.txt -Dsaa.e2e.n=10
# 选品原则:一品类一条、覆盖 U4 全部 8 个 driver 家族a-h避免单品类偶过/偶不过;优于按行序取前 10前 10 仅 4 品类聚集)。
# 行式:去首尾空白、跳空行与本行式 # 注释SaaFullGraphE2eTest.parseBriefLines
#
打砖块:挡板接球把上方砖块全部消除即胜,掉球则负。
贪吃蛇:操控小蛇吃食物变长,撞到自己身体或墙壁则游戏结束。
小恐龙跑酷:按键让恐龙跳过仙人掌和飞鸟,撞到障碍即结束,跑得越远分越高。
点击消除:点击三个或以上相连的同色方块把它们消掉,消满目标分数过关。
太空射击:飞船左右移动并发射子弹击落持续下降的敌机,被敌机撞到则失败。
打地鼠:地鼠随机从洞口冒头,点击敲中得分,限时结束时分数越高越好。
钢琴块:只点黑色方块别碰白块,节奏越来越快,点错或漏点即结束。
像素鸟穿管:点击让小鸟扇翅上升,穿过一根根上下水管的缝隙,撞管或落地即结束。
愤怒投石:拖拽瞄准弹射石块,砸倒所有目标木箱即通关,弹药用尽未清场则失败。
太空躲陨石:上下左右移动飞船躲避飞来的陨石,坚持到计时归零即通关。