diff --git a/extensions/brave/web-search-contract-api.ts b/extensions/brave/web-search-contract-api.ts new file mode 100644 index 00000000000..a0c4d04005e --- /dev/null +++ b/extensions/brave/web-search-contract-api.ts @@ -0,0 +1,41 @@ +import { + resolveProviderWebSearchPluginConfig, + setProviderWebSearchPluginConfigValue, + type WebSearchProviderPlugin, +} from "openclaw/plugin-sdk/provider-web-search-contract"; + +function getTopLevelCredentialValue(searchConfig?: Record): unknown { + return searchConfig?.apiKey; +} + +function setTopLevelCredentialValue( + searchConfigTarget: Record, + value: unknown, +): void { + searchConfigTarget.apiKey = value; +} + +export function createBraveWebSearchProvider(): WebSearchProviderPlugin { + return { + id: "brave", + label: "Brave Search", + hint: "Structured results ยท country/language/time filters", + onboardingScopes: ["text-inference"], + credentialLabel: "Brave Search API key", + envVars: ["BRAVE_API_KEY"], + placeholder: "BSA...", + signupUrl: "https://brave.com/search/api/", + docsUrl: "https://docs.openclaw.ai/brave-search", + autoDetectOrder: 10, + credentialPath: "plugins.entries.brave.config.webSearch.apiKey", + inactiveSecretPaths: ["plugins.entries.brave.config.webSearch.apiKey"], + getCredentialValue: getTopLevelCredentialValue, + setCredentialValue: setTopLevelCredentialValue, + getConfiguredCredentialValue: (config) => + resolveProviderWebSearchPluginConfig(config, "brave")?.apiKey, + setConfiguredCredentialValue: (configTarget, value) => { + setProviderWebSearchPluginConfigValue(configTarget, "brave", "apiKey", value); + }, + createTool: () => null, + }; +}