From 1680c86b6cfa0acfcd60cef305b3b82c75a37b94 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 22:01:34 +0100 Subject: [PATCH] refactor: share duckduckgo web search provider base --- .../src/ddg-search-provider.shared.ts | 21 ++++++++++++++++++ .../duckduckgo/src/ddg-search-provider.ts | 22 +++---------------- .../duckduckgo/web-search-contract-api.ts | 22 +++---------------- 3 files changed, 27 insertions(+), 38 deletions(-) create mode 100644 extensions/duckduckgo/src/ddg-search-provider.shared.ts diff --git a/extensions/duckduckgo/src/ddg-search-provider.shared.ts b/extensions/duckduckgo/src/ddg-search-provider.shared.ts new file mode 100644 index 00000000000..265afcbc955 --- /dev/null +++ b/extensions/duckduckgo/src/ddg-search-provider.shared.ts @@ -0,0 +1,21 @@ +import { createWebSearchProviderContractFields } from "openclaw/plugin-sdk/provider-web-search-contract"; + +export function createDuckDuckGoWebSearchProviderBase() { + return { + id: "duckduckgo", + label: "DuckDuckGo Search (experimental)", + hint: "Free web search fallback with no API key required", + requiresCredential: false, + envVars: [], + placeholder: "(no key needed)", + signupUrl: "https://duckduckgo.com/", + docsUrl: "https://docs.openclaw.ai/tools/web", + autoDetectOrder: 100, + credentialPath: "", + ...createWebSearchProviderContractFields({ + credentialPath: "", + searchCredential: { type: "scoped", scopeId: "duckduckgo" }, + selectionPluginId: "duckduckgo", + }), + }; +} diff --git a/extensions/duckduckgo/src/ddg-search-provider.ts b/extensions/duckduckgo/src/ddg-search-provider.ts index abb38f0da6d..88145a93f35 100644 --- a/extensions/duckduckgo/src/ddg-search-provider.ts +++ b/extensions/duckduckgo/src/ddg-search-provider.ts @@ -1,8 +1,6 @@ import { readNumberParam, readStringParam } from "openclaw/plugin-sdk/param-readers"; -import { - createWebSearchProviderContractFields, - type WebSearchProviderPlugin, -} from "openclaw/plugin-sdk/provider-web-search-contract"; +import type { WebSearchProviderPlugin } from "openclaw/plugin-sdk/provider-web-search-contract"; +import { createDuckDuckGoWebSearchProviderBase } from "./ddg-search-provider.shared.js"; type DuckDuckGoClientModule = typeof import("./ddg-client.js"); @@ -37,21 +35,7 @@ const DuckDuckGoSearchSchema = { export function createDuckDuckGoWebSearchProvider(): WebSearchProviderPlugin { return { - id: "duckduckgo", - label: "DuckDuckGo Search (experimental)", - hint: "Free web search fallback with no API key required", - requiresCredential: false, - envVars: [], - placeholder: "(no key needed)", - signupUrl: "https://duckduckgo.com/", - docsUrl: "https://docs.openclaw.ai/tools/web", - autoDetectOrder: 100, - credentialPath: "", - ...createWebSearchProviderContractFields({ - credentialPath: "", - searchCredential: { type: "scoped", scopeId: "duckduckgo" }, - selectionPluginId: "duckduckgo", - }), + ...createDuckDuckGoWebSearchProviderBase(), createTool: (ctx) => ({ description: "Search the web using DuckDuckGo. Returns titles, URLs, and snippets with no API key required.", diff --git a/extensions/duckduckgo/web-search-contract-api.ts b/extensions/duckduckgo/web-search-contract-api.ts index 120b19e6b60..d60e84c2fde 100644 --- a/extensions/duckduckgo/web-search-contract-api.ts +++ b/extensions/duckduckgo/web-search-contract-api.ts @@ -1,25 +1,9 @@ -import { - createWebSearchProviderContractFields, - type WebSearchProviderPlugin, -} from "openclaw/plugin-sdk/provider-web-search-contract"; +import type { WebSearchProviderPlugin } from "openclaw/plugin-sdk/provider-web-search-contract"; +import { createDuckDuckGoWebSearchProviderBase } from "./src/ddg-search-provider.shared.js"; export function createDuckDuckGoWebSearchProvider(): WebSearchProviderPlugin { return { - id: "duckduckgo", - label: "DuckDuckGo Search (experimental)", - hint: "Free web search fallback with no API key required", - requiresCredential: false, - envVars: [], - placeholder: "(no key needed)", - signupUrl: "https://duckduckgo.com/", - docsUrl: "https://docs.openclaw.ai/tools/web", - autoDetectOrder: 100, - credentialPath: "", - ...createWebSearchProviderContractFields({ - credentialPath: "", - searchCredential: { type: "scoped", scopeId: "duckduckgo" }, - selectionPluginId: "duckduckgo", - }), + ...createDuckDuckGoWebSearchProviderBase(), createTool: () => null, }; }