refactor(web): unify proxy-guarded fetch path for web tools

This commit is contained in:
Peter Steinberger
2026-02-26 12:44:06 +01:00
parent 8bf1c9a23a
commit b74be2577f
5 changed files with 386 additions and 252 deletions

View File

@@ -46,6 +46,29 @@ function createKimiSearchTool(kimiConfig?: { apiKey?: string; baseUrl?: string;
});
}
function createProviderSearchTool(provider: "brave" | "perplexity" | "grok" | "gemini" | "kimi") {
const searchConfig =
provider === "perplexity"
? { provider, perplexity: { apiKey: "pplx-config-test" } }
: provider === "grok"
? { provider, grok: { apiKey: "xai-config-test" } }
: provider === "gemini"
? { provider, gemini: { apiKey: "gemini-config-test" } }
: provider === "kimi"
? { provider, kimi: { apiKey: "moonshot-config-test" } }
: { provider, apiKey: "brave-config-test" };
return createWebSearchTool({
config: {
tools: {
web: {
search: searchConfig,
},
},
},
sandboxed: true,
});
}
function parseFirstRequestBody(mockFetch: ReturnType<typeof installMockFetch>) {
const request = mockFetch.mock.calls[0]?.[1] as RequestInit | undefined;
const requestBody = request?.body;
@@ -62,6 +85,34 @@ function installPerplexitySuccessFetch() {
});
}
function createProviderSuccessPayload(
provider: "brave" | "perplexity" | "grok" | "gemini" | "kimi",
) {
if (provider === "brave") {
return { web: { results: [] } };
}
if (provider === "perplexity") {
return { choices: [{ message: { content: "ok" } }], citations: [] };
}
if (provider === "grok") {
return { output_text: "ok", citations: [] };
}
if (provider === "gemini") {
return {
candidates: [
{
content: { parts: [{ text: "ok" }] },
groundingMetadata: { groundingChunks: [] },
},
],
};
}
return {
choices: [{ finish_reason: "stop", message: { role: "assistant", content: "ok" } }],
search_results: [],
};
}
async function executePerplexitySearch(
query: string,
options?: {
@@ -159,6 +210,32 @@ describe("web_search country and language parameters", () => {
});
});
describe("web_search provider proxy dispatch", () => {
const priorFetch = global.fetch;
afterEach(() => {
vi.unstubAllEnvs();
global.fetch = priorFetch;
});
it.each(["brave", "perplexity", "grok", "gemini", "kimi"] as const)(
"uses proxy-aware dispatcher for %s provider when HTTP_PROXY is configured",
async (provider) => {
vi.stubEnv("HTTP_PROXY", "http://127.0.0.1:7890");
const mockFetch = installMockFetch(createProviderSuccessPayload(provider));
const tool = createProviderSearchTool(provider);
expect(tool).not.toBeNull();
await tool?.execute?.("call-1", { query: `proxy-${provider}-test` });
const requestInit = mockFetch.mock.calls[0]?.[1] as
| (RequestInit & { dispatcher?: unknown })
| undefined;
expect(requestInit?.dispatcher).toBeInstanceOf(EnvHttpProxyAgent);
},
);
});
describe("web_search perplexity baseUrl defaults", () => {
const priorFetch = global.fetch;