Skip to content

Commit 7c85812

Browse files
author
Gio Della-Libera
committed
fix(models): reject overlay-only fallback models
1 parent f264291 commit 7c85812

2 files changed

Lines changed: 35 additions & 1 deletion

File tree

src/agents/pi-embedded-runner/model.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,25 @@ describe("resolveModel", () => {
643643
expect(model.api).toBe("openai-completions");
644644
});
645645

646+
it("does not synthesize unknown models from timeout-only provider overlays", () => {
647+
const cfg = {
648+
models: {
649+
providers: {
650+
openai: {
651+
timeoutSeconds: 300,
652+
baseUrl: "",
653+
models: [],
654+
},
655+
},
656+
},
657+
} as unknown as OpenClawConfig;
658+
659+
const result = resolveModelForTest("openai", "typo-model", "/tmp/agent", cfg);
660+
661+
expect(result.model).toBeUndefined();
662+
expect(result.error).toBe("Unknown model: openai/typo-model");
663+
});
664+
646665
it("defaults baseUrl-only local custom fallback models to chat completions", () => {
647666
const cfg = {
648667
agents: {

src/agents/pi-embedded-runner/model.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,21 @@ function findConfiguredProviderModel(
447447
);
448448
}
449449

450+
function hasConfiguredFallbackSurface(params: {
451+
providerConfig: InlineProviderConfig | undefined;
452+
configuredModel: ReturnType<typeof findConfiguredProviderModel>;
453+
modelId: string;
454+
}): boolean {
455+
if (params.modelId.startsWith("mock-")) {
456+
return true;
457+
}
458+
if (params.configuredModel) {
459+
return true;
460+
}
461+
const baseUrl = params.providerConfig?.baseUrl?.trim();
462+
return Boolean(baseUrl);
463+
}
464+
450465
function readModelParams(value: unknown): Record<string, unknown> | undefined {
451466
if (!value || typeof value !== "object" || Array.isArray(value)) {
452467
return undefined;
@@ -870,7 +885,7 @@ function resolveConfiguredFallbackModel(params: {
870885
providerParams: providerConfig?.params,
871886
configuredParams: configuredModel?.params,
872887
});
873-
if (!providerConfig && !modelId.startsWith("mock-")) {
888+
if (!hasConfiguredFallbackSurface({ providerConfig, configuredModel, modelId })) {
874889
return undefined;
875890
}
876891
const fallbackTransport = resolveProviderTransport({

0 commit comments

Comments
 (0)