






















@@ -146,7 +146,7 @@ vi.mock("./openrouter-model-capabilities.js", () => ({
146146mockLoadOpenRouterModelCapabilities(modelId),
147147}));
148148149-import type { OpenClawConfig } from "../../config/config.js";
149+import type { OpenClawConfig, OpenClawConfigInput } from "../../config/config.js";
150150import { COPILOT_INTEGRATION_ID, buildCopilotIdeHeaders } from "../copilot-dynamic-headers.js";
151151import { getModelProviderLocalService } from "../provider-local-service.js";
152152import { getModelProviderRequestTransport } from "../provider-request-config.js";
@@ -593,10 +593,11 @@ describe("resolveModel", () => {
593593});
594594595595it("defaults missing model cost before handing models to PI", () => {
596-const cfg = {
596+const cfg: OpenClawConfig = {
597597models: {
598598providers: {
599599openai: {
600+baseUrl: "",
600601api: "openai-responses",
601602models: [
602603{
@@ -605,14 +606,15 @@ describe("resolveModel", () => {
605606api: "openai-responses",
606607reasoning: true,
607608input: ["text"],
609+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
608610contextWindow: 400_000,
609611maxTokens: 128_000,
610612},
611613],
612614},
613615},
614616},
615-} as unknown as OpenClawConfig;
617+};
616618617619const result = resolveModelForTest("openai", "gpt-5.5", "/tmp/agent", cfg);
618620@@ -663,6 +665,50 @@ describe("resolveModel", () => {
663665expect(result.error).toBe("Unknown model: openai/typo-model");
664666});
665667668+it("does not create fallback models from provider overlays alone", () => {
669+const cfg = {
670+models: {
671+providers: {
672+typoProvider: {
673+timeoutSeconds: 600,
674+},
675+},
676+},
677+} satisfies OpenClawConfigInput;
678+679+const result = resolveModelForTest(
680+"typoProvider",
681+"typoed-model",
682+"/tmp/agent",
683+cfg as unknown as OpenClawConfig,
684+);
685+686+expect(result.model).toBeUndefined();
687+expect(result.error).toBe("Unknown model: typoProvider/typoed-model");
688+});
689+690+it("does not create fallback models from built-in provider api overlays", () => {
691+const cfg = {
692+models: {
693+providers: {
694+openai: {
695+api: "openai-responses",
696+},
697+},
698+},
699+} satisfies OpenClawConfigInput;
700+701+const result = resolveModelForTest(
702+"openai",
703+"typoed-model",
704+"/tmp/agent",
705+cfg as unknown as OpenClawConfig,
706+);
707+708+expect(result.model).toBeUndefined();
709+expect(result.error).toBe("Unknown model: openai/typoed-model");
710+});
711+666712it("defaults baseUrl-only local custom fallback models to chat completions", () => {
667713const cfg = {
668714agents: {
@@ -1174,9 +1220,14 @@ describe("resolveModel", () => {
11741220},
11751221},
11761222},
1177-} as unknown as OpenClawConfig;
1223+} satisfies OpenClawConfigInput;
117812241179-const result = resolveModelForTest("openai", "gpt-5.5", "/tmp/agent", cfg);
1225+const result = resolveModelForTest(
1226+"openai",
1227+"gpt-5.5",
1228+"/tmp/agent",
1229+cfg as unknown as OpenClawConfig,
1230+);
1180123111811232expect(result.error).toBeUndefined();
11821233expect((result.model as { requestTimeoutMs?: number } | undefined)?.requestTimeoutMs).toBe(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。