From ea1b18c7118e6c8cb1755fa19f337d063401449d Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Tue, 29 Sep 2026 16:11:30 +0200 Subject: [PATCH] fix(coding-agent): route managed llama.cpp classify requests after auth resolution Auth resolution replaces the classifier baseUrl with the /v1 inference placeholder, so classify skipped the managed server and requests failed against managed.llama.invalid. --- .../src/extensions/llama/provider.ts | 5 ++++- .../coding-agent/test/llama-managed.test.ts | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/coding-agent/src/extensions/llama/provider.ts b/packages/coding-agent/src/extensions/llama/provider.ts index bce3581f5..0c3371c53 100644 --- a/packages/coding-agent/src/extensions/llama/provider.ts +++ b/packages/coding-agent/src/extensions/llama/provider.ts @@ -363,7 +363,10 @@ export function createLlamaProvider(managed: ManagedLlama = createManagedLlama() streamSimple(requestModel, context, requestOptions), ), classify: async (model, context, options) => { - if (model.baseUrl !== MANAGED_LLAMA_SERVER_URL) return classifier.classify(model, context, options); + // Auth resolution replaces the catalog URL with the inference URL (`/v1`), so accept both placeholder forms. + if (model.baseUrl !== MANAGED_LLAMA_SERVER_URL && model.baseUrl !== MANAGED_INFERENCE_URL) { + return classifier.classify(model, context, options); + } let server: ManagedLlamaServerInfo; try { server = await managed.acquire(options?.signal); diff --git a/packages/coding-agent/test/llama-managed.test.ts b/packages/coding-agent/test/llama-managed.test.ts index 67b535ffd..c5a3d40fe 100644 --- a/packages/coding-agent/test/llama-managed.test.ts +++ b/packages/coding-agent/test/llama-managed.test.ts @@ -345,6 +345,23 @@ describe("managed llama.cpp provider", () => { expect(calls).toEqual(["probe", "acquire", "acquire"]); expect(requests.at(-1)?.authorization).toBe("Bearer secret"); expect(requests.at(-1)?.url.startsWith("/v1")).toBe(false); + + // The model runtime applies the auth baseUrl (the `/v1` inference placeholder) before classifying. + const resolvedClassification = await provider.classify!( + { + ...(classifierModel as ClassifierModel<"llama-cpp-classify">), + baseUrl: `${MANAGED_LLAMA_SERVER_URL}/v1`, + }, + { + state: {}, + questions: { ok: { type: "bool", instructions: "ok?", criteria: { true: "yes", false: "no" } } }, + }, + { apiKey: "managed" }, + ); + expect(resolvedClassification.stopReason).toBe("error"); + expect(calls).toEqual(["probe", "acquire", "acquire", "acquire"]); + expect(requests.at(-1)?.authorization).toBe("Bearer secret"); + expect(requests.at(-1)?.url.startsWith("/v1")).toBe(false); }); it("reports a managed server that cannot start as a classifier error", async () => {