From d253392ea2a30d3245164693c2e943daa53ad6c3 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Mon, 4 May 2026 16:53:12 -0700 Subject: [PATCH] fix(plugins): keep explicit web providers on fast path --- src/agents/openai-transport-stream.test.ts | 74 +++----------------- src/plugins/web-provider-public-artifacts.ts | 12 ++-- 2 files changed, 14 insertions(+), 72 deletions(-) diff --git a/src/agents/openai-transport-stream.test.ts b/src/agents/openai-transport-stream.test.ts index 8ab0b6afe13..9e149f806e4 100644 --- a/src/agents/openai-transport-stream.test.ts +++ b/src/agents/openai-transport-stream.test.ts @@ -781,8 +781,8 @@ describe("openai transport stream", () => { expect(output.stopReason).toBe("stop"); }); - it("keeps OpenRouter thinking format for declared OpenRouter providers on custom proxy URLs", async () => { - const streamFn = buildTransportAwareSimpleStreamFn( + it("keeps OpenRouter thinking format for declared OpenRouter providers on custom proxy URLs", () => { + const params = buildOpenAICompletionsParams( attachModelProviderRequestTransport( { id: "anthropic/claude-sonnet-4", @@ -803,28 +803,6 @@ describe("openai transport stream", () => { }, }, ), - ); - - expect(streamFn).toBeTypeOf("function"); - let capturedPayload: Record | undefined; - let resolveCaptured!: () => void; - const captured = new Promise((resolve) => { - resolveCaptured = resolve; - }); - - void streamFn!( - { - id: "anthropic/claude-sonnet-4", - name: "Claude Sonnet 4", - api: "openclaw-openai-completions-transport", - provider: "openrouter", - baseUrl: "https://proxy.example.com/v1", - reasoning: true, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 200000, - maxTokens: 8192, - } as Model<"openclaw-openai-completions-transport">, { systemPrompt: "system", messages: [], @@ -832,25 +810,18 @@ describe("openai transport stream", () => { } as never, { reasoningEffort: "high", - onPayload: async (payload: unknown) => { - capturedPayload = payload as Record; - resolveCaptured(); - return payload; - }, } as never, - ); + ) as Record; - await captured; - - expect(capturedPayload).toMatchObject({ + expect(params).toMatchObject({ reasoning: { effort: "high", }, }); }); - it("keeps OpenRouter thinking format for native OpenRouter hosts behind custom provider ids", async () => { - const streamFn = buildTransportAwareSimpleStreamFn( + it("keeps OpenRouter thinking format for native OpenRouter hosts behind custom provider ids", () => { + const params = buildOpenAICompletionsParams( attachModelProviderRequestTransport( { id: "anthropic/claude-sonnet-4", @@ -871,28 +842,6 @@ describe("openai transport stream", () => { }, }, ), - ); - - expect(streamFn).toBeTypeOf("function"); - let capturedPayload: Record | undefined; - let resolveCaptured!: () => void; - const captured = new Promise((resolve) => { - resolveCaptured = resolve; - }); - - void streamFn!( - { - id: "anthropic/claude-sonnet-4", - name: "Claude Sonnet 4", - api: "openclaw-openai-completions-transport", - provider: "custom-openrouter", - baseUrl: "https://openrouter.ai/api/v1", - reasoning: true, - input: ["text"], - cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, - contextWindow: 200000, - maxTokens: 8192, - } as Model<"openclaw-openai-completions-transport">, { systemPrompt: "system", messages: [], @@ -900,17 +849,10 @@ describe("openai transport stream", () => { } as never, { reasoningEffort: "high", - onPayload: async (payload: unknown) => { - capturedPayload = payload as Record; - resolveCaptured(); - return payload; - }, } as never, - ); + ) as Record; - await captured; - - expect(capturedPayload).toMatchObject({ + expect(params).toMatchObject({ reasoning: { effort: "high", }, diff --git a/src/plugins/web-provider-public-artifacts.ts b/src/plugins/web-provider-public-artifacts.ts index 34ab13233b9..b528eb40919 100644 --- a/src/plugins/web-provider-public-artifacts.ts +++ b/src/plugins/web-provider-public-artifacts.ts @@ -54,17 +54,17 @@ function resolveBundledCandidatePluginIds(params: { bundledAllowlistCompat?: boolean; onlyPluginIds?: readonly string[]; }): BundledCandidateResolution { - const resolvedConfig = - params.contract === "webSearchProviders" - ? resolveBundledWebSearchResolutionConfig(params).config - : resolveBundledWebFetchResolutionConfig(params).config; - if (params.onlyPluginIds && params.onlyPluginIds.length > 0) { + if (params.onlyPluginIds !== undefined) { return { - pluginIds: filterAllowlistedBundledPluginIds(resolvedConfig, [ + pluginIds: filterAllowlistedBundledPluginIds(params.config, [ ...new Set(params.onlyPluginIds), ]).toSorted((left, right) => left.localeCompare(right)), }; } + const resolvedConfig = + params.contract === "webSearchProviders" + ? resolveBundledWebSearchResolutionConfig(params).config + : resolveBundledWebFetchResolutionConfig(params).config; const candidates = resolveManifestDeclaredWebProviderCandidates({ contract: params.contract, configKey: params.configKey,