From e96a4e8fc31601e62d808207d7673c5e5c4a40d6 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 22:04:00 +0100 Subject: [PATCH] refactor: share perplexity web search provider base --- .../perplexity-web-search-provider.shared.ts | 46 +++++++++++++++++++ .../src/perplexity-web-search-provider.ts | 38 +++------------ .../perplexity/web-search-contract-api.ts | 42 +++-------------- 3 files changed, 58 insertions(+), 68 deletions(-) diff --git a/extensions/perplexity/src/perplexity-web-search-provider.shared.ts b/extensions/perplexity/src/perplexity-web-search-provider.shared.ts index 016b0979362..29467f33e35 100644 --- a/extensions/perplexity/src/perplexity-web-search-provider.shared.ts +++ b/extensions/perplexity/src/perplexity-web-search-provider.shared.ts @@ -1,5 +1,13 @@ +import { + createWebSearchProviderContractFields, + mergeScopedSearchConfig, + resolveProviderWebSearchPluginConfig, + type WebSearchProviderPlugin, +} from "openclaw/plugin-sdk/provider-web-search-config-contract"; + export const DEFAULT_PERPLEXITY_BASE_URL = "https://openrouter.ai/api/v1"; export const PERPLEXITY_DIRECT_BASE_URL = "https://api.perplexity.ai"; +export const PERPLEXITY_CREDENTIAL_PATH = "plugins.entries.perplexity.config.webSearch.apiKey"; const PERPLEXITY_KEY_PREFIXES = ["pplx-"]; const OPENROUTER_KEY_PREFIXES = ["sk-or-"]; @@ -13,6 +21,44 @@ export type PerplexityRuntimeTransportContext = { fallbackEnvVar?: string; }; +export function createPerplexityWebSearchProviderBase() { + return { + id: "perplexity", + label: "Perplexity Search", + hint: "Requires Perplexity API key or OpenRouter API key · structured results", + onboardingScopes: ["text-inference"], + credentialLabel: "Perplexity API key", + envVars: ["PERPLEXITY_API_KEY", "OPENROUTER_API_KEY"], + placeholder: "pplx-...", + signupUrl: "https://www.perplexity.ai/settings/api", + docsUrl: "https://docs.openclaw.ai/perplexity", + autoDetectOrder: 50, + credentialPath: PERPLEXITY_CREDENTIAL_PATH, + ...createWebSearchProviderContractFields({ + credentialPath: PERPLEXITY_CREDENTIAL_PATH, + searchCredential: { type: "scoped", scopeId: "perplexity" }, + configuredCredential: { pluginId: "perplexity" }, + }), + }; +} + +export function resolvePerplexityWebSearchRuntimeMetadata( + ctx: Parameters>[0], +) { + return { + perplexityTransport: resolvePerplexityRuntimeTransport({ + searchConfig: mergeScopedSearchConfig( + ctx.searchConfig, + "perplexity", + resolveProviderWebSearchPluginConfig(ctx.config, "perplexity"), + ), + resolvedKey: ctx.resolvedCredential?.value, + keySource: ctx.resolvedCredential?.source ?? "missing", + fallbackEnvVar: ctx.resolvedCredential?.fallbackEnvVar, + }), + }; +} + function trimToUndefined(value: unknown): string | undefined { return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined; } diff --git a/extensions/perplexity/src/perplexity-web-search-provider.ts b/extensions/perplexity/src/perplexity-web-search-provider.ts index 390c65d608f..4dbce0c3ef6 100644 --- a/extensions/perplexity/src/perplexity-web-search-provider.ts +++ b/extensions/perplexity/src/perplexity-web-search-provider.ts @@ -1,13 +1,13 @@ import { - createWebSearchProviderContractFields, mergeScopedSearchConfig, resolveProviderWebSearchPluginConfig, type WebSearchProviderPlugin, type WebSearchProviderToolDefinition, } from "openclaw/plugin-sdk/provider-web-search-config-contract"; -import { resolvePerplexityRuntimeTransport } from "./perplexity-web-search-provider.shared.js"; - -const PERPLEXITY_CREDENTIAL_PATH = "plugins.entries.perplexity.config.webSearch.apiKey"; +import { + createPerplexityWebSearchProviderBase, + resolvePerplexityWebSearchRuntimeMetadata, +} from "./perplexity-web-search-provider.shared.js"; type PerplexityWebSearchRuntime = typeof import("./perplexity-web-search-provider.runtime.js"); @@ -112,34 +112,8 @@ function createPerplexityToolDefinition( export function createPerplexityWebSearchProvider(): WebSearchProviderPlugin { return { - id: "perplexity", - label: "Perplexity Search", - hint: "Requires Perplexity API key or OpenRouter API key · structured results", - onboardingScopes: ["text-inference"], - credentialLabel: "Perplexity API key", - envVars: ["PERPLEXITY_API_KEY", "OPENROUTER_API_KEY"], - placeholder: "pplx-...", - signupUrl: "https://www.perplexity.ai/settings/api", - docsUrl: "https://docs.openclaw.ai/perplexity", - autoDetectOrder: 50, - credentialPath: PERPLEXITY_CREDENTIAL_PATH, - ...createWebSearchProviderContractFields({ - credentialPath: PERPLEXITY_CREDENTIAL_PATH, - searchCredential: { type: "scoped", scopeId: "perplexity" }, - configuredCredential: { pluginId: "perplexity" }, - }), - resolveRuntimeMetadata: (ctx) => ({ - perplexityTransport: resolvePerplexityRuntimeTransport({ - searchConfig: mergeScopedSearchConfig( - ctx.searchConfig, - "perplexity", - resolveProviderWebSearchPluginConfig(ctx.config, "perplexity"), - ), - resolvedKey: ctx.resolvedCredential?.value, - keySource: ctx.resolvedCredential?.source ?? "missing", - fallbackEnvVar: ctx.resolvedCredential?.fallbackEnvVar, - }), - }), + ...createPerplexityWebSearchProviderBase(), + resolveRuntimeMetadata: resolvePerplexityWebSearchRuntimeMetadata, createTool: (ctx) => createPerplexityToolDefinition( mergeScopedSearchConfig( diff --git a/extensions/perplexity/web-search-contract-api.ts b/extensions/perplexity/web-search-contract-api.ts index a5cdeb901a8..2d6fcbecccb 100644 --- a/extensions/perplexity/web-search-contract-api.ts +++ b/extensions/perplexity/web-search-contract-api.ts @@ -1,43 +1,13 @@ +import { type WebSearchProviderPlugin } from "openclaw/plugin-sdk/provider-web-search-config-contract"; import { - createWebSearchProviderContractFields, - mergeScopedSearchConfig, - resolveProviderWebSearchPluginConfig, - type WebSearchProviderPlugin, -} from "openclaw/plugin-sdk/provider-web-search-config-contract"; -import { resolvePerplexityRuntimeTransport } from "./src/perplexity-web-search-provider.shared.js"; + createPerplexityWebSearchProviderBase, + resolvePerplexityWebSearchRuntimeMetadata, +} from "./src/perplexity-web-search-provider.shared.js"; export function createPerplexityWebSearchProvider(): WebSearchProviderPlugin { - const credentialPath = "plugins.entries.perplexity.config.webSearch.apiKey"; - return { - id: "perplexity", - label: "Perplexity Search", - hint: "Requires Perplexity API key or OpenRouter API key · structured results", - onboardingScopes: ["text-inference"], - credentialLabel: "Perplexity API key", - envVars: ["PERPLEXITY_API_KEY", "OPENROUTER_API_KEY"], - placeholder: "pplx-...", - signupUrl: "https://www.perplexity.ai/settings/api", - docsUrl: "https://docs.openclaw.ai/perplexity", - autoDetectOrder: 50, - credentialPath, - ...createWebSearchProviderContractFields({ - credentialPath, - searchCredential: { type: "scoped", scopeId: "perplexity" }, - configuredCredential: { pluginId: "perplexity" }, - }), - resolveRuntimeMetadata: (ctx) => ({ - perplexityTransport: resolvePerplexityRuntimeTransport({ - searchConfig: mergeScopedSearchConfig( - ctx.searchConfig, - "perplexity", - resolveProviderWebSearchPluginConfig(ctx.config, "perplexity"), - ), - resolvedKey: ctx.resolvedCredential?.value, - keySource: ctx.resolvedCredential?.source ?? "missing", - fallbackEnvVar: ctx.resolvedCredential?.fallbackEnvVar, - }), - }), + ...createPerplexityWebSearchProviderBase(), + resolveRuntimeMetadata: resolvePerplexityWebSearchRuntimeMetadata, createTool: () => null, }; }