




















@@ -318,6 +318,77 @@ describe("normalizeCompatibilityConfigValues", () => {
318318expect(res.changes).toEqual([]);
319319});
320320321+it("migrates legacy Codex primary refs to OpenAI refs plus explicit Codex harness", () => {
322+const res = normalizeCompatibilityConfigValues({
323+agents: {
324+defaults: {
325+embeddedHarness: { runtime: "auto", fallback: "pi" },
326+model: {
327+primary: "codex/gpt-5.5",
328+fallbacks: ["anthropic/claude-sonnet-4-6", "codex/gpt-5.4-mini"],
329+},
330+models: {
331+"codex/gpt-5.5": { alias: "legacy-codex" },
332+"openai/gpt-5.5": { alias: "gpt", params: { temperature: 0.2 } },
333+"codex/gpt-5.4-mini": {},
334+},
335+},
336+list: [
337+{
338+id: "reviewer",
339+model: "codex/gpt-5.4-mini",
340+},
341+],
342+},
343+} as unknown as OpenClawConfig);
344+345+expect(res.config.agents?.defaults?.model).toEqual({
346+primary: "openai/gpt-5.5",
347+fallbacks: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4-mini"],
348+});
349+expect(res.config.agents?.defaults?.embeddedHarness).toEqual({
350+runtime: "codex",
351+fallback: "pi",
352+});
353+expect(res.config.agents?.defaults?.models).toEqual({
354+"openai/gpt-5.5": { alias: "gpt", params: { temperature: 0.2 } },
355+"openai/gpt-5.4-mini": {},
356+});
357+expect(res.config.agents?.list?.[0]).toMatchObject({
358+id: "reviewer",
359+embeddedHarness: { runtime: "codex" },
360+model: "openai/gpt-5.4-mini",
361+});
362+expect(res.changes).toEqual(
363+expect.arrayContaining([
364+"Moved agents.defaults.model legacy codex/* primary refs to openai/* with Codex harness.",
365+"Moved agents.defaults.models legacy codex/* keys to openai/*.",
366+"Moved agents.list.reviewer.model legacy codex/* primary refs to openai/* with Codex harness.",
367+]),
368+);
369+});
370+371+it("does not force Codex harness for legacy fallback-only refs", () => {
372+const input = {
373+agents: {
374+defaults: {
375+model: {
376+primary: "openai/gpt-5.5",
377+fallbacks: ["codex/gpt-5.4-mini"],
378+},
379+models: {
380+"codex/gpt-5.4-mini": { alias: "legacy-codex" },
381+},
382+},
383+},
384+} as unknown as OpenClawConfig;
385+386+const res = normalizeCompatibilityConfigValues(input);
387+388+expect(res.config).toEqual(input);
389+expect(res.changes).toEqual([]);
390+});
391+321392it("prefers legacy nano-banana env.GEMINI_API_KEY over skill apiKey during migration", () => {
322393const res = normalizeCompatibilityConfigValues({
323394skills: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。