
















@@ -221,4 +221,77 @@ describe("web_fetch provider fallback normalization", () => {
221221}),
222222);
223223});
224+225+it("scopes provider fallback cache entries by the late-bound provider", async () => {
226+global.fetch = withFetchPreconnect(
227+vi.fn(async () => {
228+throw new Error("network failed");
229+}),
230+);
231+resolveWebFetchDefinitionMock.mockImplementation(
232+({ runtimeWebFetch }: { runtimeWebFetch?: { selectedProvider?: string } }) => {
233+const providerId = runtimeWebFetch?.selectedProvider ?? "unknown";
234+return {
235+provider: { id: providerId },
236+definition: {
237+description: providerId,
238+parameters: {},
239+execute: async () => ({
240+text: `${providerId} fallback body`,
241+}),
242+},
243+};
244+},
245+);
246+247+const executeWithProvider = async (providerId: string) => {
248+runtimeState.activeSecretsRuntimeSnapshot = {
249+config: {
250+tools: {
251+web: {
252+fetch: {
253+provider: providerId,
254+},
255+},
256+},
257+},
258+};
259+runtimeState.activeRuntimeWebToolsMetadata = {
260+fetch: {
261+providerConfigured: providerId,
262+providerSource: "configured",
263+selectedProvider: providerId,
264+selectedProviderKeySource: "config",
265+diagnostics: [],
266+},
267+diagnostics: [],
268+};
269+const tool = createWebFetchTool({
270+config: {} as OpenClawConfig,
271+sandboxed: false,
272+lateBindRuntimeConfig: true,
273+});
274+return tool?.execute?.("call-provider-fallback", {
275+url: "https://example.com/provider-cache-scope",
276+});
277+};
278+279+const first = await executeWithProvider("firecrawl");
280+const second = await executeWithProvider("perplexity-fetch");
281+const firstDetails = first?.details as {
282+externalContent?: { provider?: string };
283+text?: string;
284+};
285+const secondDetails = second?.details as {
286+cached?: boolean;
287+externalContent?: { provider?: string };
288+text?: string;
289+};
290+291+expect(firstDetails.externalContent?.provider).toBe("firecrawl");
292+expect(firstDetails.text).toContain("firecrawl fallback body");
293+expect(secondDetails.externalContent?.provider).toBe("perplexity-fetch");
294+expect(secondDetails.text).toContain("perplexity-fetch fallback body");
295+expect(secondDetails.cached).toBeUndefined();
296+});
224297});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。