























@@ -19,6 +19,7 @@ import {
1919resolveAllowedModelRef,
2020resolveConfiguredModelRef,
2121resolveSubagentConfiguredModelSelection,
22+resolveSubagentSpawnModelSelection,
2223resolveThinkingDefault,
2324resolveModelRefFromString,
2425} from "./model-selection.js";
@@ -1534,3 +1535,98 @@ describe("resolveSubagentConfiguredModelSelection", () => {
15341535);
15351536});
15361537});
1538+1539+describe("resolveSubagentSpawnModelSelection", () => {
1540+it("resolves a model alias override to its full provider/model ref", () => {
1541+const cfg = {
1542+agents: {
1543+defaults: {
1544+model: { primary: "anthropic/claude-sonnet-4-6" },
1545+models: {
1546+"anthropic/claude-opus-4-6": { alias: "opus" },
1547+"openai/gpt-5.4": { alias: "gpt" },
1548+},
1549+},
1550+},
1551+} as OpenClawConfig;
1552+1553+expect(
1554+resolveSubagentSpawnModelSelection({ cfg, agentId: "main", modelOverride: "opus" }),
1555+).toBe("anthropic/claude-opus-4-6");
1556+});
1557+1558+it("resolves bare configured aliases with the target agent runtime default provider", () => {
1559+const cfg = {
1560+agents: {
1561+defaults: {
1562+model: { primary: "openai/gpt-5.4" },
1563+models: {
1564+"claude-opus-4-6": { alias: "opus" },
1565+},
1566+},
1567+list: [
1568+{
1569+id: "research",
1570+model: "anthropic/claude-sonnet-4-6",
1571+},
1572+],
1573+},
1574+} as OpenClawConfig;
1575+1576+expect(
1577+resolveSubagentSpawnModelSelection({
1578+ cfg,
1579+agentId: "research",
1580+modelOverride: "OPUS",
1581+}),
1582+).toBe("anthropic/claude-opus-4-6");
1583+});
1584+1585+it("resolves alias in configured subagent model", () => {
1586+const cfg = {
1587+agents: {
1588+defaults: {
1589+model: { primary: "anthropic/claude-sonnet-4-6" },
1590+models: {
1591+"openai/gpt-5.4": { alias: "gpt" },
1592+},
1593+subagents: { model: "gpt" },
1594+},
1595+},
1596+} as OpenClawConfig;
1597+1598+expect(resolveSubagentSpawnModelSelection({ cfg, agentId: "main" })).toBe("openai/gpt-5.4");
1599+});
1600+1601+it("passes through already-qualified provider/model refs unchanged", () => {
1602+const cfg = {
1603+agents: {
1604+defaults: {
1605+model: { primary: "anthropic/claude-sonnet-4-6" },
1606+},
1607+},
1608+} as OpenClawConfig;
1609+1610+expect(
1611+resolveSubagentSpawnModelSelection({
1612+ cfg,
1613+agentId: "main",
1614+modelOverride: "openai/gpt-5.4",
1615+}),
1616+).toBe("openai/gpt-5.4");
1617+});
1618+1619+it("falls back to runtime default when no override or config", () => {
1620+const cfg = {
1621+agents: {
1622+defaults: {
1623+model: { primary: "anthropic/claude-sonnet-4-6" },
1624+},
1625+},
1626+} as OpenClawConfig;
1627+1628+expect(resolveSubagentSpawnModelSelection({ cfg, agentId: "main" })).toBe(
1629+"anthropic/claude-sonnet-4-6",
1630+);
1631+});
1632+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。