fix web search fallback explicitness

This commit is contained in:
Tak Hoffman
2026-04-07 07:18:10 -05:00
parent f461033c66
commit 59aea1e74d
2 changed files with 65 additions and 4 deletions

View File

@@ -503,6 +503,49 @@ describe("web search runtime", () => {
).rejects.toThrow('Unknown web_search provider "missing-id".');
});
it("still falls back when config names an unknown provider id", async () => {
resolveRuntimeWebSearchProvidersMock.mockReturnValue([
createProvider({
pluginId: "google",
id: "google",
credentialPath: "tools.web.search.google.apiKey",
autoDetectOrder: 1,
getCredentialValue: () => "configured",
createTool: () => {
throw new Error("google aborted");
},
}),
createProvider({
pluginId: "duckduckgo",
id: "duckduckgo",
credentialPath: "",
autoDetectOrder: 100,
requiresCredential: false,
}),
]);
await expect(
runWebSearch({
config: {
tools: {
web: {
search: {
provider: "missing-id",
},
},
},
},
args: { query: "config-typo" },
}),
).resolves.toMatchObject({
provider: "duckduckgo",
result: expect.objectContaining({
provider: "duckduckgo",
query: "config-typo",
}),
});
});
it("honors preferRuntimeProviders during execution", async () => {
const configuredProvider = createProvider({
pluginId: "google",

View File

@@ -265,19 +265,36 @@ function hasExplicitWebSearchSelection(params: {
search?: WebSearchConfig;
runtimeWebSearch?: RuntimeWebSearchMetadata;
providerId?: string;
providers?: PluginWebSearchProviderEntry[];
}): boolean {
if (params.providerId?.trim()) {
return true;
}
if (
const availableProviderIds = new Set(
(params.providers ?? []).map((provider) => provider.id.trim().toLowerCase()),
);
const configuredProviderId =
params.search &&
"provider" in params.search &&
typeof params.search.provider === "string" &&
params.search.provider.trim()
typeof params.search.provider === "string"
? params.search.provider.trim().toLowerCase()
: "";
if (configuredProviderId && availableProviderIds.has(configuredProviderId)) {
return true;
}
const runtimeConfiguredId = (
params.runtimeWebSearch?.selectedProvider ?? params.runtimeWebSearch?.providerConfigured
)
?.trim()
.toLowerCase();
if (
params.runtimeWebSearch?.providerSource === "configured" &&
runtimeConfiguredId &&
availableProviderIds.has(runtimeConfiguredId)
) {
return true;
}
return params.runtimeWebSearch?.providerSource === "configured";
return false;
}
export async function runWebSearch(
@@ -297,6 +314,7 @@ export async function runWebSearch(
search,
runtimeWebSearch,
providerId: params.providerId,
providers: candidates,
});
let lastError: unknown;
let sawUnavailableProvider = false;