




















@@ -16,6 +16,8 @@ import {
1616resolveAgentModelFallbacksOverride,
1717resolveAgentModelPrimary,
1818resolveRunModelFallbacksOverride,
19+resolveSubagentModelConfigSelection,
20+resolveSubagentModelFallbacksOverride,
1921resolveAgentWorkspaceDir,
2022resolveAgentIdByWorkspacePath,
2123resolveAgentIdsByWorkspacePath,
@@ -514,6 +516,150 @@ describe("resolveAgentConfig", () => {
514516).toBe(false);
515517});
516518519+it("resolves subagent model fallbacks from the selected subagent model source", () => {
520+const cfg: OpenClawConfig = {
521+agents: {
522+defaults: {
523+model: {
524+primary: "anthropic/claude-opus-4-6",
525+fallbacks: ["openai/gpt-5.4"],
526+},
527+subagents: {
528+model: {
529+primary: "kimi/kimi-code",
530+fallbacks: ["openai-codex/gpt-5.4", "zai/glm-5"],
531+},
532+},
533+},
534+list: [
535+{
536+id: "research",
537+subagents: {
538+model: {
539+primary: "kimi/kimi-code",
540+fallbacks: ["openai-codex/gpt-5.4", "zai/glm-5"],
541+},
542+},
543+},
544+{
545+id: "agent-model",
546+model: {
547+primary: "anthropic/claude-sonnet-4-6",
548+fallbacks: ["google/gemini-3-pro"],
549+},
550+},
551+{
552+id: "metadata-only-subagent",
553+model: {
554+primary: "anthropic/claude-sonnet-4-6",
555+fallbacks: ["google/gemini-3-pro"],
556+},
557+subagents: {
558+model: { timeoutMs: 1_000 },
559+},
560+},
561+{
562+id: "fallback-only-agent-model",
563+model: {
564+fallbacks: ["google/gemini-3-pro"],
565+},
566+},
567+{
568+id: "fallback-only-subagent-model",
569+subagents: {
570+model: {
571+fallbacks: [],
572+},
573+},
574+},
575+{
576+id: "default-subagent",
577+},
578+{
579+id: "strict",
580+subagents: {
581+model: "kimi/kimi-code",
582+},
583+},
584+],
585+},
586+};
587+588+expect(resolveSubagentModelFallbacksOverride(cfg, "research")).toEqual([
589+"openai-codex/gpt-5.4",
590+"zai/glm-5",
591+]);
592+expect(resolveSubagentModelFallbacksOverride(cfg, "agent-model")).toEqual([
593+"google/gemini-3-pro",
594+]);
595+expect(resolveSubagentModelFallbacksOverride(cfg, "metadata-only-subagent")).toEqual([
596+"google/gemini-3-pro",
597+]);
598+expect(resolveSubagentModelFallbacksOverride(cfg, "fallback-only-agent-model")).toEqual([
599+"openai-codex/gpt-5.4",
600+"zai/glm-5",
601+]);
602+expect(
603+resolveSubagentModelFallbacksOverride(cfg, "fallback-only-subagent-model"),
604+).toStrictEqual([]);
605+expect(resolveSubagentModelFallbacksOverride(cfg, "default-subagent")).toEqual([
606+"openai-codex/gpt-5.4",
607+"zai/glm-5",
608+]);
609+expect(resolveSubagentModelFallbacksOverride(cfg, "strict")).toStrictEqual([]);
610+});
611+612+it("resolves the subagent model config selected for isolated runs", () => {
613+const cfg: OpenClawConfig = {
614+agents: {
615+defaults: {
616+subagents: { model: "openai/gpt-5.4" },
617+},
618+list: [
619+{
620+id: "agent-model",
621+model: {
622+primary: "anthropic/claude-sonnet-4-6",
623+fallbacks: ["google/gemini-3-pro"],
624+},
625+},
626+{
627+id: "subagent-model",
628+model: "anthropic/claude-sonnet-4-6",
629+subagents: {
630+model: {
631+primary: "kimi/kimi-code",
632+fallbacks: ["openai-codex/gpt-5.4"],
633+},
634+},
635+},
636+{
637+id: "metadata-only-subagent",
638+model: "anthropic/claude-sonnet-4-6",
639+subagents: {
640+model: { timeoutMs: 1_000 },
641+},
642+},
643+],
644+},
645+};
646+647+expect(resolveSubagentModelConfigSelection({ cfg, agentId: "agent-model" })).toEqual({
648+primary: "anthropic/claude-sonnet-4-6",
649+fallbacks: ["google/gemini-3-pro"],
650+});
651+expect(resolveSubagentModelConfigSelection({ cfg, agentId: "subagent-model" })).toEqual({
652+primary: "kimi/kimi-code",
653+fallbacks: ["openai-codex/gpt-5.4"],
654+});
655+expect(resolveSubagentModelConfigSelection({ cfg, agentId: "metadata-only-subagent" })).toBe(
656+"anthropic/claude-sonnet-4-6",
657+);
658+expect(resolveSubagentModelConfigSelection({ cfg, agentId: "default-subagent" })).toBe(
659+"openai/gpt-5.4",
660+);
661+});
662+517663it("should return agent-specific sandbox config", () => {
518664const cfg = {
519665agents: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。