






























@@ -191,22 +191,39 @@ function createTestProvider(params: {
191191},
192192getConfiguredCredentialValue: (config) => {
193193const entryConfig = config?.plugins?.entries?.[params.pluginId]?.config;
194-return entryConfig && typeof entryConfig === "object"
195- ? (entryConfig as { webSearch?: { apiKey?: unknown } }).webSearch?.apiKey
194+const configuredValue =
195+entryConfig && typeof entryConfig === "object"
196+ ? (entryConfig as { webSearch?: { apiKey?: unknown } }).webSearch?.apiKey
197+ : undefined;
198+if (configuredValue !== undefined || params.provider !== "brave") {
199+return configuredValue;
200+}
201+const search = config?.tools?.web?.search;
202+return search && typeof search === "object"
203+ ? (search as { apiKey?: unknown }).apiKey
196204 : undefined;
197205},
198-getConfiguredCredentialFallback:
199-params.provider === "gemini"
200- ? (config) => {
201-const provider = config?.models?.providers?.google;
202-return provider && typeof provider === "object" && "apiKey" in provider
203- ? {
204-path: "models.providers.google.apiKey",
205-value: (provider as { apiKey?: unknown }).apiKey,
206-}
207- : undefined;
208-}
209- : undefined,
206+getConfiguredCredentialFallback: (config) => {
207+if (params.provider === "brave") {
208+const search = config?.tools?.web?.search;
209+return search && typeof search === "object" && "apiKey" in search
210+ ? {
211+path: "tools.web.search.apiKey",
212+value: (search as { apiKey?: unknown }).apiKey,
213+}
214+ : undefined;
215+}
216+if (params.provider === "gemini") {
217+const provider = config?.models?.providers?.google;
218+return provider && typeof provider === "object" && "apiKey" in provider
219+ ? {
220+path: "models.providers.google.apiKey",
221+value: (provider as { apiKey?: unknown }).apiKey,
222+}
223+ : undefined;
224+}
225+return undefined;
226+},
210227setConfiguredCredentialValue: (configTarget, value) => {
211228setConfiguredProviderKey(configTarget, params.pluginId, value);
212229},
@@ -1119,6 +1136,29 @@ describe("runtime web tools resolution", () => {
11191136expect(resolvePluginWebSearchProvidersMock).not.toHaveBeenCalled();
11201137});
112111381139+it("prefers legacy top-level web search apiKey over provider env fallback", async () => {
1140+const { metadata, resolvedConfig } = await runRuntimeWebTools({
1141+config: asConfig({
1142+tools: {
1143+web: {
1144+search: {
1145+apiKey: { source: "env", provider: "default", id: "LEGACY_WEB_SEARCH_REF" },
1146+},
1147+},
1148+},
1149+}),
1150+env: {
1151+BRAVE_API_KEY: "ambient-brave-key",
1152+LEGACY_WEB_SEARCH_REF: "legacy-web-search-key",
1153+},
1154+});
1155+1156+expect(metadata.search.providerSource).toBe("auto-detect");
1157+expect(metadata.search.selectedProvider).toBe("brave");
1158+expect(metadata.search.selectedProviderKeySource).toBe("secretRef");
1159+expect(readProviderKey(resolvedConfig, "brave")).toBe("legacy-web-search-key");
1160+});
1161+11221162it("does not resolve web fetch provider SecretRef when web fetch is inactive", async () => {
11231163const resolveSpy = vi.spyOn(secretResolve, "resolveSecretRefValues");
11241164restoreResolveSecretRefValuesSpy = () => resolveSpy.mockRestore();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。