From aa581460a9afd6c959268f099e4fe22edc4a04fe Mon Sep 17 00:00:00 2001 From: lunov Date: Wed, 28 Jan 2026 19:48:02 +0700 Subject: [PATCH] fix: merge provider config api into registry model Fixes #1695 --- src/agents/pi-embedded-runner/model.test.ts | 36 +++++++++++++++++++++ src/agents/pi-embedded-runner/model.ts | 4 ++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/agents/pi-embedded-runner/model.test.ts b/src/agents/pi-embedded-runner/model.test.ts index cdcb5fe8e..3bf5d17f9 100644 --- a/src/agents/pi-embedded-runner/model.test.ts +++ b/src/agents/pi-embedded-runner/model.test.ts @@ -127,4 +127,40 @@ describe("resolveModel", () => { expect(result.model?.provider).toBe("custom"); expect(result.model?.id).toBe("missing-model"); }); + + it("inherits provider api when registry model has no api (issue #1695)", async () => { + const { discoverModels } = await import("@mariozechner/pi-coding-agent"); + const mockModel = { + id: "test-model", + name: "test-model", + provider: "lmstudio", + reasoning: false, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 4096, + maxTokens: 4096, + // No api field set + }; + + vi.mocked(discoverModels).mockReturnValue({ + find: vi.fn(() => mockModel), + } as any); + + const cfg = { + models: { + providers: { + lmstudio: { + api: "openai-responses", + baseUrl: "http://localhost:1234", + }, + }, + }, + } as MoltbotConfig; + + const result = resolveModel("lmstudio", "test-model", "/tmp/agent", cfg); + + expect(result.model?.api).toBe("openai-responses"); + expect(result.model?.id).toBe("test-model"); + expect(result.model?.provider).toBe("lmstudio"); + }); }); diff --git a/src/agents/pi-embedded-runner/model.ts b/src/agents/pi-embedded-runner/model.ts index 1792e6706..633ce9972 100644 --- a/src/agents/pi-embedded-runner/model.ts +++ b/src/agents/pi-embedded-runner/model.ts @@ -97,5 +97,7 @@ export function resolveModel( modelRegistry, }; } - return { model: normalizeModelCompat(model), authStorage, modelRegistry }; + const providerCfg = cfg?.models?.providers?.[provider]; + const merged = { ...model, api: model.api ?? providerCfg?.api }; + return { model: normalizeModelCompat(merged), authStorage, modelRegistry }; }