From 5ff460688519e48fd0bfab893ebaed4258dee789 Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Wed, 10 Jun 2026 09:51:00 +0900 Subject: kernel/run-turn: thread providerOpts (model) into provider.stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit executeStep built the stream opts with only the logger, so providerOpts.model (the selected model) never reached any provider — each fell back to its own default. Carry providerOpts through StepContext into the per-step stream opts, plus a regression test asserting the model is forwarded. --- packages/kernel/src/runtime/run-turn.test.ts | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'packages/kernel/src/runtime/run-turn.test.ts') diff --git a/packages/kernel/src/runtime/run-turn.test.ts b/packages/kernel/src/runtime/run-turn.test.ts index 6db6645..fa2aba4 100644 --- a/packages/kernel/src/runtime/run-turn.test.ts +++ b/packages/kernel/src/runtime/run-turn.test.ts @@ -1523,6 +1523,35 @@ describe("runTurn", () => { expect(capturedOpts).toBeDefined(); expect(capturedOpts?.logger).toBeUndefined(); }); + + it("threads providerOpts.model through to provider.stream opts", async () => { + let capturedOpts: Record | undefined; + + const provider: ProviderContract = { + id: "fake", + stream(_messages, _tools, opts) { + capturedOpts = opts !== undefined ? { ...opts } : undefined; + return (async function* () { + yield { type: "text-delta", delta: "hi" } as ProviderEvent; + yield { type: "usage", usage: { inputTokens: 1, outputTokens: 1 } } as ProviderEvent; + yield { type: "finish", reason: "stop" } as ProviderEvent; + })(); + }, + }; + + await runTurn({ + provider, + messages: [userMessage], + tools: [], + dispatch: { maxConcurrent: 1, eager: false }, + conversationId: "conv-1", + turnId: "turn-1", + emit: () => {}, + providerOpts: { model: "some-model-id" }, + }); + + expect(capturedOpts?.model).toBe("some-model-id"); + }); }); describe("span tree nesting", () => { -- cgit v1.2.3