

























1-import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
21import { isDiagnosticFlagEnabled } from "openclaw/plugin-sdk/diagnostic-runtime";
32import type {
43SearchConfigRecord,
54WebSearchProviderPlugin,
65WebSearchProviderToolDefinition,
76} from "openclaw/plugin-sdk/provider-web-search";
87import {
9-createWebSearchProviderContractFields,
108mergeScopedSearchConfig,
119resolveProviderWebSearchPluginConfig,
1210} from "openclaw/plugin-sdk/provider-web-search-config-contract";
1311import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
14-15-const BRAVE_CREDENTIAL_PATH = "plugins.entries.brave.config.webSearch.apiKey";
12+import { buildBraveWebSearchProviderBase } from "../web-search-shared.js";
16131714type BraveWebSearchRuntime = typeof import("./brave-web-search-provider.runtime.js");
1815@@ -67,28 +64,6 @@ const BraveSearchSchema = {
6764},
6865} satisfies Record<string, unknown>;
696670-function resolveLegacyTopLevelBraveCredential(
71-config: OpenClawConfig | undefined,
72-): { path: string; value: unknown } | undefined {
73-if (!isRecord(config)) {
74-return undefined;
75-}
76-const tools = isRecord(config.tools) ? config.tools : undefined;
77-const web = isRecord(tools?.web) ? tools.web : undefined;
78-const search = isRecord(web?.search) ? web.search : undefined;
79-if (!search || !("apiKey" in search)) {
80-return undefined;
81-}
82-return { path: "tools.web.search.apiKey", value: search.apiKey };
83-}
84-85-function resolveConfiguredBraveCredential(config: OpenClawConfig | undefined): unknown {
86-return (
87-resolveProviderWebSearchPluginConfig(config, "brave")?.apiKey ??
88-resolveLegacyTopLevelBraveCredential(config)?.value
89-);
90-}
91-9267function resolveBraveMode(searchConfig?: Record<string, unknown>): "web" | "llm-context" {
9368const brave = isRecord(searchConfig?.brave) ? searchConfig.brave : undefined;
9469return brave?.mode === "llm-context" ? "llm-context" : "web";
@@ -116,24 +91,7 @@ function createBraveToolDefinition(
1169111792export function createBraveWebSearchProvider(): WebSearchProviderPlugin {
11893return {
119-id: "brave",
120-label: "Brave Search",
121-hint: "Structured results · country/language/time filters",
122-onboardingScopes: ["text-inference"],
123-credentialLabel: "Brave Search API key",
124-envVars: ["BRAVE_API_KEY"],
125-placeholder: "BSA...",
126-signupUrl: "https://brave.com/search/api/",
127-docsUrl: "https://docs.openclaw.ai/tools/brave-search",
128-autoDetectOrder: 10,
129-credentialPath: BRAVE_CREDENTIAL_PATH,
130- ...createWebSearchProviderContractFields({
131-credentialPath: BRAVE_CREDENTIAL_PATH,
132-searchCredential: { type: "top-level" },
133-configuredCredential: { pluginId: "brave" },
134-}),
135-getConfiguredCredentialValue: resolveConfiguredBraveCredential,
136-getConfiguredCredentialFallback: resolveLegacyTopLevelBraveCredential,
94+ ...buildBraveWebSearchProviderBase(),
13795createTool: (ctx) =>
13896createBraveToolDefinition(
13997mergeScopedSearchConfig(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。