import {
createWebSearchProviderContractFields,
mergeScopedSearchConfig,
resolveProviderWebSearchPluginConfig,
type WebSearchProviderPlugin,
type WebSearchProviderToolDefinition,
} from
"openclaw/plugin-sdk/provider-web-search-config-contract" ;
import { resolveGeminiApiKey, resolveGeminiModel } from
"./gemini-web-search-provider.shared.js" ;
const GEMINI_CREDENTIAL_PATH =
"plugins.entries.google.config.webSearch.apiKey" ;
type GeminiWebSearchRuntime =
typeof import (
"./gemini-web-search-provider.runtime.js" );
let geminiWebSearchRuntimePromise: Promise<GeminiWebSearchRuntime> | undefined;
function loadGeminiWebSearchRuntime(): Promise<GeminiWebSearchRuntime> {
geminiWebSearchRuntimePromise ??=
import (
"./gemini-web-search-provider.runtime.js" );
return geminiWebSearchRuntimePromise;
}
const GEMINI_TOOL_PARAMETERS = {
type: "object" ,
properties: {
query: { type: "string" , description: "Search query string." },
count: {
type: "number" ,
description: "Number of results to return (1-10)." ,
minimum: 1 ,
maximum: 10 ,
},
country: { type: "string" , description: "Not supported by Gemini." },
language: { type: "string" , description: "Not supported by Gemini." },
freshness: { type: "string" , description: "Not supported by Gemini." },
date_after: { type: "string" , description: "Not supported by Gemini." },
date_before: { type: "string" , description: "Not supported by Gemini." },
},
required: ["query" ],
} satisfies Record<string, unknown>;
function createGeminiToolDefinition(
searchConfig?: Record<string, unknown>,
): WebSearchProviderToolDefinition {
return {
description:
"Search the web using Gemini with Google Search grounding. Returns AI-synthesized answers with citations from Google Search." ,
parameters: GEMINI_TOOL_PARAMETERS,
execute: async (args) => {
const { executeGeminiSearch } = await loadGeminiWebSearchRuntime();
return await executeGeminiSearch(args, searchConfig);
},
};
}
export function createGeminiWebSearchProvider(): WebSearchProviderPlugin {
return {
id: "gemini" ,
label: "Gemini (Google Search)" ,
hint: "Requires Google Gemini API key · Google Search grounding" ,
onboardingScopes: ["text-inference" ],
credentialLabel: "Google Gemini API key" ,
envVars: ["GEMINI_API_KEY" ],
placeholder: "AIza..." ,
signupUrl: "https://aistudio.google.com/apikey ",
docsUrl: "https://docs.openclaw.ai/tools/web ",
autoDetectOrder: 20 ,
credentialPath: GEMINI_CREDENTIAL_PATH,
...createWebSearchProviderContractFields({
credentialPath: GEMINI_CREDENTIAL_PATH,
searchCredential: { type: "scoped" , scopeId: "gemini" },
configuredCredential: { pluginId: "google" },
}),
createTool: (ctx) =>
createGeminiToolDefinition(
mergeScopedSearchConfig(
ctx.searchConfig,
"gemini" ,
resolveProviderWebSearchPluginConfig(ctx.config, "google" ),
),
),
};
}
export const __testing = {
resolveGeminiApiKey,
resolveGeminiModel,
} as const ;
Messung V0.5 in Prozent C=98 H=100 G=98
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland