@yourgpt/copilot-sdk 2.0.1 → 2.0.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -0
- package/dist/{ThreadManager-JT0sqSSD.d.ts → ThreadManager-Dkp_eLty.d.ts} +1 -1
- package/dist/{ThreadManager-CUq5Ocu2.d.cts → ThreadManager-LfFRhr4e.d.cts} +1 -1
- package/dist/anthropic-6F5GRE3B.js +4 -0
- package/dist/anthropic-6F5GRE3B.js.map +1 -0
- package/dist/anthropic-DGalr_Fw.d.cts +17 -0
- package/dist/anthropic-DkCEDYOt.d.ts +17 -0
- package/dist/anthropic-NMTRABEH.cjs +21 -0
- package/dist/anthropic-NMTRABEH.cjs.map +1 -0
- package/dist/brave-DdnWb7Gb.d.cts +17 -0
- package/dist/brave-DsI9n7Wr.d.ts +17 -0
- package/dist/brave-OYKCOZEM.cjs +21 -0
- package/dist/brave-OYKCOZEM.cjs.map +1 -0
- package/dist/brave-XSASGGH2.js +4 -0
- package/dist/brave-XSASGGH2.js.map +1 -0
- package/dist/chunk-2FAWEBZS.cjs +88 -0
- package/dist/chunk-2FAWEBZS.cjs.map +1 -0
- package/dist/chunk-53UGJNHN.js +92 -0
- package/dist/chunk-53UGJNHN.js.map +1 -0
- package/dist/chunk-6T5XXJEP.cjs +80 -0
- package/dist/chunk-6T5XXJEP.cjs.map +1 -0
- package/dist/chunk-7K7HZMP4.cjs +1170 -0
- package/dist/chunk-7K7HZMP4.cjs.map +1 -0
- package/dist/chunk-7W7QLZNC.js +72 -0
- package/dist/chunk-7W7QLZNC.js.map +1 -0
- package/dist/{chunk-JM7PB2LP.js → chunk-7XFFRV7D.js} +10 -66
- package/dist/chunk-7XFFRV7D.js.map +1 -0
- package/dist/chunk-ASV6JLYG.cjs +99 -0
- package/dist/chunk-ASV6JLYG.cjs.map +1 -0
- package/dist/chunk-BH7MNDWW.js +1152 -0
- package/dist/chunk-BH7MNDWW.js.map +1 -0
- package/dist/chunk-BKO7DSPU.js +67 -0
- package/dist/chunk-BKO7DSPU.js.map +1 -0
- package/dist/chunk-CBAHCI4R.cjs +76 -0
- package/dist/chunk-CBAHCI4R.cjs.map +1 -0
- package/dist/chunk-CEKAYA2Q.cjs +74 -0
- package/dist/chunk-CEKAYA2Q.cjs.map +1 -0
- package/dist/chunk-CEOMTQTP.js +85 -0
- package/dist/chunk-CEOMTQTP.js.map +1 -0
- package/dist/chunk-DABZYCVX.js +84 -0
- package/dist/chunk-DABZYCVX.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-G4SF2PNQ.js +33 -0
- package/dist/chunk-G4SF2PNQ.js.map +1 -0
- package/dist/chunk-GANCV72Z.cjs +110 -0
- package/dist/chunk-GANCV72Z.cjs.map +1 -0
- package/dist/{chunk-BLSI67J6.cjs → chunk-H5XMKBBA.cjs} +425 -30
- package/dist/chunk-H5XMKBBA.cjs.map +1 -0
- package/dist/{chunk-CJ7UWN2Y.js → chunk-IXFV6AW6.js} +397 -7
- package/dist/chunk-IXFV6AW6.js.map +1 -0
- package/dist/chunk-JEQ2X3Z6.cjs +12 -0
- package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
- package/dist/chunk-JO4BHPAD.cjs +40 -0
- package/dist/chunk-JO4BHPAD.cjs.map +1 -0
- package/dist/chunk-MEBXW75C.cjs +89 -0
- package/dist/chunk-MEBXW75C.cjs.map +1 -0
- package/dist/chunk-MNDGIW47.js +76 -0
- package/dist/chunk-MNDGIW47.js.map +1 -0
- package/dist/chunk-PPFHA6IL.js +83 -0
- package/dist/chunk-PPFHA6IL.js.map +1 -0
- package/dist/chunk-RQ74USYU.js +128 -0
- package/dist/chunk-RQ74USYU.js.map +1 -0
- package/dist/chunk-TXLIY7GF.cjs +132 -0
- package/dist/chunk-TXLIY7GF.cjs.map +1 -0
- package/dist/chunk-UIWFYMAO.cjs +82 -0
- package/dist/chunk-UIWFYMAO.cjs.map +1 -0
- package/dist/{chunk-4PRWNAXQ.cjs → chunk-UOWLKFXK.cjs} +27 -89
- package/dist/chunk-UOWLKFXK.cjs.map +1 -0
- package/dist/chunk-VD74IPKB.js +106 -0
- package/dist/chunk-VD74IPKB.js.map +1 -0
- package/dist/chunk-W73FBYIH.cjs +87 -0
- package/dist/chunk-W73FBYIH.cjs.map +1 -0
- package/dist/chunk-XGITAEXU.js +93 -0
- package/dist/chunk-XGITAEXU.js.map +1 -0
- package/dist/chunk-XWOHNY3F.cjs +96 -0
- package/dist/chunk-XWOHNY3F.cjs.map +1 -0
- package/dist/chunk-ZPYQDMUX.js +79 -0
- package/dist/chunk-ZPYQDMUX.js.map +1 -0
- package/dist/core/index.cjs +156 -84
- package/dist/core/index.d.cts +16 -4
- package/dist/core/index.d.ts +16 -4
- package/dist/core/index.js +13 -1
- package/dist/exa-72KFY5A7.cjs +21 -0
- package/dist/exa-72KFY5A7.cjs.map +1 -0
- package/dist/exa-Dp9U-WTc.d.ts +17 -0
- package/dist/exa-NNVPBC2M.js +4 -0
- package/dist/exa-NNVPBC2M.js.map +1 -0
- package/dist/exa-jJSPhyUW.d.cts +17 -0
- package/dist/google-CHU2yycE.d.cts +17 -0
- package/dist/google-CTEK6SV2.js +4 -0
- package/dist/google-CTEK6SV2.js.map +1 -0
- package/dist/google-Da8IQxaI.d.ts +17 -0
- package/dist/google-IIUXFFVF.cjs +21 -0
- package/dist/google-IIUXFFVF.cjs.map +1 -0
- package/dist/index-2VtgKM8S.d.cts +206 -0
- package/dist/index-pWEH7pUE.d.ts +206 -0
- package/dist/mcp/index.cjs +670 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +779 -0
- package/dist/mcp/index.d.ts +779 -0
- package/dist/mcp/index.js +574 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/openai-6KTCQ7PZ.cjs +21 -0
- package/dist/openai-6KTCQ7PZ.cjs.map +1 -0
- package/dist/openai-7W2PCNW5.js +4 -0
- package/dist/openai-7W2PCNW5.js.map +1 -0
- package/dist/openai-Cam8hF4f.d.ts +17 -0
- package/dist/openai-HVSCuXgO.d.cts +17 -0
- package/dist/react/index.cjs +75 -42
- package/dist/react/index.d.cts +270 -45
- package/dist/react/index.d.ts +270 -45
- package/dist/react/index.js +15 -2
- package/dist/searxng-AXLVGY7Z.js +4 -0
- package/dist/searxng-AXLVGY7Z.js.map +1 -0
- package/dist/searxng-EJKNY236.cjs +21 -0
- package/dist/searxng-EJKNY236.cjs.map +1 -0
- package/dist/searxng-K0qtY9vp.d.ts +17 -0
- package/dist/searxng-QGOte_Gq.d.cts +17 -0
- package/dist/serper-3JYJHJX6.js +4 -0
- package/dist/serper-3JYJHJX6.js.map +1 -0
- package/dist/serper-63FT4AOL.cjs +21 -0
- package/dist/serper-63FT4AOL.cjs.map +1 -0
- package/dist/serper-7Czya3PW.d.ts +17 -0
- package/dist/serper-JzdaSnS9.d.cts +17 -0
- package/dist/styles.css +38 -0
- package/dist/tavily-AWFP4RM7.cjs +21 -0
- package/dist/tavily-AWFP4RM7.cjs.map +1 -0
- package/dist/tavily-C8cXXojE.d.cts +17 -0
- package/dist/tavily-CIWAAZPH.js +4 -0
- package/dist/tavily-CIWAAZPH.js.map +1 -0
- package/dist/tavily-DdSGVgkE.d.ts +17 -0
- package/dist/themes/catppuccin.css +2 -0
- package/dist/themes/claude.css +2 -0
- package/dist/themes/linear.css +2 -0
- package/dist/themes/modern-minimal.css +2 -0
- package/dist/themes/posthog.css +2 -0
- package/dist/themes/supabase.css +2 -0
- package/dist/themes/twitter.css +2 -0
- package/dist/themes/vercel.css +2 -0
- package/dist/tools/anthropic/index.cjs +61 -0
- package/dist/tools/anthropic/index.cjs.map +1 -0
- package/dist/tools/anthropic/index.d.cts +67 -0
- package/dist/tools/anthropic/index.d.ts +67 -0
- package/dist/tools/anthropic/index.js +56 -0
- package/dist/tools/anthropic/index.js.map +1 -0
- package/dist/tools/brave/index.cjs +85 -0
- package/dist/tools/brave/index.cjs.map +1 -0
- package/dist/tools/brave/index.d.cts +91 -0
- package/dist/tools/brave/index.d.ts +91 -0
- package/dist/tools/brave/index.js +80 -0
- package/dist/tools/brave/index.js.map +1 -0
- package/dist/tools/exa/index.cjs +90 -0
- package/dist/tools/exa/index.cjs.map +1 -0
- package/dist/tools/exa/index.d.cts +92 -0
- package/dist/tools/exa/index.d.ts +92 -0
- package/dist/tools/exa/index.js +85 -0
- package/dist/tools/exa/index.js.map +1 -0
- package/dist/tools/google/index.cjs +81 -0
- package/dist/tools/google/index.cjs.map +1 -0
- package/dist/tools/google/index.d.cts +81 -0
- package/dist/tools/google/index.d.ts +81 -0
- package/dist/tools/google/index.js +76 -0
- package/dist/tools/google/index.js.map +1 -0
- package/dist/tools/openai/index.cjs +83 -0
- package/dist/tools/openai/index.cjs.map +1 -0
- package/dist/tools/openai/index.d.cts +84 -0
- package/dist/tools/openai/index.d.ts +84 -0
- package/dist/tools/openai/index.js +78 -0
- package/dist/tools/openai/index.js.map +1 -0
- package/dist/tools/searxng/index.cjs +85 -0
- package/dist/tools/searxng/index.cjs.map +1 -0
- package/dist/tools/searxng/index.d.cts +91 -0
- package/dist/tools/searxng/index.d.ts +91 -0
- package/dist/tools/searxng/index.js +80 -0
- package/dist/tools/searxng/index.js.map +1 -0
- package/dist/tools/serper/index.cjs +85 -0
- package/dist/tools/serper/index.cjs.map +1 -0
- package/dist/tools/serper/index.d.cts +91 -0
- package/dist/tools/serper/index.d.ts +91 -0
- package/dist/tools/serper/index.js +80 -0
- package/dist/tools/serper/index.js.map +1 -0
- package/dist/tools/tavily/index.cjs +91 -0
- package/dist/tools/tavily/index.cjs.map +1 -0
- package/dist/tools/tavily/index.d.cts +95 -0
- package/dist/tools/tavily/index.d.ts +95 -0
- package/dist/tools/tavily/index.js +86 -0
- package/dist/tools/tavily/index.js.map +1 -0
- package/dist/tools/web-search/index.cjs +31 -0
- package/dist/tools/web-search/index.cjs.map +1 -0
- package/dist/tools/web-search/index.d.cts +3 -0
- package/dist/tools/web-search/index.d.ts +3 -0
- package/dist/tools/web-search/index.js +14 -0
- package/dist/tools/web-search/index.js.map +1 -0
- package/dist/{types-BtAaOV07.d.cts → tools-DDWrco4h.d.cts} +43 -367
- package/dist/{types-BtAaOV07.d.ts → tools-DDWrco4h.d.ts} +43 -367
- package/dist/types-B20VCJXL.d.cts +347 -0
- package/dist/types-B20VCJXL.d.ts +347 -0
- package/dist/types-Cizh9K_f.d.ts +441 -0
- package/dist/types-DG2ya08y.d.cts +367 -0
- package/dist/types-DG2ya08y.d.ts +367 -0
- package/dist/types-DjSfYNKj.d.cts +441 -0
- package/dist/types-ZguuKEs_.d.cts +127 -0
- package/dist/types-ZguuKEs_.d.ts +127 -0
- package/dist/ui/index.cjs +1075 -148
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.d.cts +410 -4
- package/dist/ui/index.d.ts +410 -4
- package/dist/ui/index.js +1007 -96
- package/dist/ui/index.js.map +1 -1
- package/package.json +52 -2
- package/dist/chunk-4PRWNAXQ.cjs.map +0 -1
- package/dist/chunk-BLSI67J6.cjs.map +0 -1
- package/dist/chunk-CJ7UWN2Y.js.map +0 -1
- package/dist/chunk-JM7PB2LP.js.map +0 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { T as ToolDefinition } from '../../tools-DDWrco4h.js';
|
|
2
|
+
export { g as googleProvider } from '../../google-Da8IQxaI.js';
|
|
3
|
+
import '../../types-ZguuKEs_.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Google Search Tool
|
|
7
|
+
*
|
|
8
|
+
* Tree-shakeable import for Google's built-in web search via Gemini API.
|
|
9
|
+
* Uses Google's grounding with Google Search feature.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { googleSearch } from '@yourgpt/copilot-sdk/tools/google';
|
|
14
|
+
*
|
|
15
|
+
* const webSearch = googleSearch({
|
|
16
|
+
* apiKey: process.env.GOOGLE_API_KEY,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const runtime = createRuntime({
|
|
20
|
+
* tools: [webSearch],
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @see https://ai.google.dev/gemini-api/docs/google-search
|
|
25
|
+
* @module @yourgpt/copilot-sdk/tools/google
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Google native search configuration
|
|
30
|
+
*/
|
|
31
|
+
interface GoogleSearchConfig {
|
|
32
|
+
/** Google/Gemini API key - uses your existing Google API key */
|
|
33
|
+
apiKey: string;
|
|
34
|
+
/** Maximum number of results (default: 5) */
|
|
35
|
+
maxResults?: number;
|
|
36
|
+
/** Request timeout in milliseconds */
|
|
37
|
+
timeout?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Search parameters passed to the tool
|
|
41
|
+
*/
|
|
42
|
+
interface GoogleSearchParams {
|
|
43
|
+
/** The search query */
|
|
44
|
+
query: string;
|
|
45
|
+
/** Maximum number of results (overrides config) */
|
|
46
|
+
maxResults?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a Google native web search tool
|
|
50
|
+
*
|
|
51
|
+
* Uses Google's built-in grounding with Google Search via the Gemini API.
|
|
52
|
+
* No third-party API key required - uses your existing Google/Gemini API key.
|
|
53
|
+
*
|
|
54
|
+
* @param config - Google configuration including API key
|
|
55
|
+
* @returns A configured tool definition ready to use
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* import { googleSearch } from '@yourgpt/copilot-sdk/tools/google';
|
|
60
|
+
*
|
|
61
|
+
* // Basic usage
|
|
62
|
+
* const webSearch = googleSearch({
|
|
63
|
+
* apiKey: process.env.GOOGLE_API_KEY,
|
|
64
|
+
* });
|
|
65
|
+
*
|
|
66
|
+
* // Or with Gemini API key
|
|
67
|
+
* const webSearch = googleSearch({
|
|
68
|
+
* apiKey: process.env.GEMINI_API_KEY,
|
|
69
|
+
* maxResults: 5,
|
|
70
|
+
* });
|
|
71
|
+
*
|
|
72
|
+
* const runtime = createRuntime({
|
|
73
|
+
* provider: gemini,
|
|
74
|
+
* model: 'gemini-2.0-flash',
|
|
75
|
+
* tools: [webSearch],
|
|
76
|
+
* });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
declare function googleSearch(config: GoogleSearchConfig): ToolDefinition<GoogleSearchParams>;
|
|
80
|
+
|
|
81
|
+
export { type GoogleSearchConfig, googleSearch };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { failure } from '../../chunk-BKO7DSPU.js';
|
|
2
|
+
import { formatSearchResultsForAI, summarizeSearchResults } from '../../chunk-XGITAEXU.js';
|
|
3
|
+
import '../../chunk-7W7QLZNC.js';
|
|
4
|
+
import '../../chunk-CEOMTQTP.js';
|
|
5
|
+
import '../../chunk-PPFHA6IL.js';
|
|
6
|
+
import '../../chunk-DABZYCVX.js';
|
|
7
|
+
import '../../chunk-MNDGIW47.js';
|
|
8
|
+
import '../../chunk-VD74IPKB.js';
|
|
9
|
+
import { searchGoogle } from '../../chunk-53UGJNHN.js';
|
|
10
|
+
export { googleProvider } from '../../chunk-53UGJNHN.js';
|
|
11
|
+
import '../../chunk-RQ74USYU.js';
|
|
12
|
+
import '../../chunk-DGUM43GV.js';
|
|
13
|
+
|
|
14
|
+
// src/tools/google/index.ts
|
|
15
|
+
function googleSearch(config) {
|
|
16
|
+
return {
|
|
17
|
+
name: "web_search",
|
|
18
|
+
description: `Search the web using Google Search for current information. Use this when the user asks about:
|
|
19
|
+
- Recent events, news, or current affairs
|
|
20
|
+
- Real-time data (prices, weather, stocks, sports scores)
|
|
21
|
+
- Information that might have changed after your training cutoff
|
|
22
|
+
- Facts that need verification with current sources
|
|
23
|
+
- Research topics that require up-to-date information`,
|
|
24
|
+
location: "server",
|
|
25
|
+
title: (args) => `Searching for "${args.query}"`,
|
|
26
|
+
executingTitle: (args) => `Searching the web for "${args.query}"...`,
|
|
27
|
+
completedTitle: (args) => `Found results for "${args.query}"`,
|
|
28
|
+
inputSchema: {
|
|
29
|
+
type: "object",
|
|
30
|
+
properties: {
|
|
31
|
+
query: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "The search query to find relevant information"
|
|
34
|
+
},
|
|
35
|
+
maxResults: {
|
|
36
|
+
type: "number",
|
|
37
|
+
description: "Maximum number of results to return (default: 5, max: 10)",
|
|
38
|
+
minimum: 1,
|
|
39
|
+
maximum: 10
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
required: ["query"]
|
|
43
|
+
},
|
|
44
|
+
needsApproval: false,
|
|
45
|
+
aiResponseMode: "full",
|
|
46
|
+
handler: async (params) => {
|
|
47
|
+
try {
|
|
48
|
+
const response = await searchGoogle(
|
|
49
|
+
{
|
|
50
|
+
query: params.query,
|
|
51
|
+
maxResults: params.maxResults ?? config.maxResults ?? 5
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
provider: "google",
|
|
55
|
+
apiKey: config.apiKey,
|
|
56
|
+
timeout: config.timeout
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
const aiContext = formatSearchResultsForAI(response);
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
message: summarizeSearchResults(response),
|
|
63
|
+
data: response,
|
|
64
|
+
_aiContext: aiContext
|
|
65
|
+
};
|
|
66
|
+
} catch (error) {
|
|
67
|
+
const errorMessage = error instanceof Error ? error.message : "Web search failed";
|
|
68
|
+
return failure(errorMessage);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { googleSearch };
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/google/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AA2FO,SAAS,aACd,MAAA,EACoC;AACpC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAAA,CAAA;AAAA,IAOb,QAAA,EAAU,QAAA;AAAA,IAEV,KAAA,EAAO,CAAC,IAAA,KAAS,CAAA,eAAA,EAAkB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAC7C,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,uBAAA,EAA0B,KAAK,KAAK,CAAA,IAAA,CAAA;AAAA,IAC9D,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,mBAAA,EAAsB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAE1D,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EACE,2DAAA;AAAA,UACF,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,QAAA,EAAU,CAAC,OAAO;AAAA,KACpB;AAAA,IAEA,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB,MAAA;AAAA,IAEhB,OAAA,EAAS,OAAO,MAAA,KAAW;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,WAA8B,MAAM,YAAA;AAAA,UACxC;AAAA,YACE,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc;AAAA,WACxD;AAAA,UACA;AAAA,YACE,QAAA,EAAU,QAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,SAAS,MAAA,CAAO;AAAA;AAClB,SACF;AAEA,QAAA,MAAM,SAAA,GAAY,yBAAyB,QAAQ,CAAA;AAEnD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,uBAAuB,QAAQ,CAAA;AAAA,UACxC,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,mBAAA;AAC3C,QAAA,OAAO,QAAQ,YAAY,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACF;AACF","file":"index.js","sourcesContent":["/**\n * Google Search Tool\n *\n * Tree-shakeable import for Google's built-in web search via Gemini API.\n * Uses Google's grounding with Google Search feature.\n *\n * @example\n * ```typescript\n * import { googleSearch } from '@yourgpt/copilot-sdk/tools/google';\n *\n * const webSearch = googleSearch({\n * apiKey: process.env.GOOGLE_API_KEY,\n * });\n *\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n *\n * @see https://ai.google.dev/gemini-api/docs/google-search\n * @module @yourgpt/copilot-sdk/tools/google\n */\n\nimport type { ToolDefinition } from \"../../core/types/tools\";\nimport { failure } from \"../../core/types/tools\";\nimport {\n searchGoogle,\n googleProvider,\n} from \"../../core/tools/webSearch/providers/google\";\nimport {\n formatSearchResultsForAI,\n summarizeSearchResults,\n} from \"../../core/tools/webSearch\";\nimport type { WebSearchResponse } from \"../../core/tools/webSearch/types\";\n\n// Re-export provider for direct access\nexport { googleProvider };\n\n/**\n * Google native search configuration\n */\nexport interface GoogleSearchConfig {\n /** Google/Gemini API key - uses your existing Google API key */\n apiKey: string;\n /** Maximum number of results (default: 5) */\n maxResults?: number;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Search parameters passed to the tool\n */\ninterface GoogleSearchParams {\n /** The search query */\n query: string;\n /** Maximum number of results (overrides config) */\n maxResults?: number;\n}\n\n/**\n * Create a Google native web search tool\n *\n * Uses Google's built-in grounding with Google Search via the Gemini API.\n * No third-party API key required - uses your existing Google/Gemini API key.\n *\n * @param config - Google configuration including API key\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * import { googleSearch } from '@yourgpt/copilot-sdk/tools/google';\n *\n * // Basic usage\n * const webSearch = googleSearch({\n * apiKey: process.env.GOOGLE_API_KEY,\n * });\n *\n * // Or with Gemini API key\n * const webSearch = googleSearch({\n * apiKey: process.env.GEMINI_API_KEY,\n * maxResults: 5,\n * });\n *\n * const runtime = createRuntime({\n * provider: gemini,\n * model: 'gemini-2.0-flash',\n * tools: [webSearch],\n * });\n * ```\n */\nexport function googleSearch(\n config: GoogleSearchConfig,\n): ToolDefinition<GoogleSearchParams> {\n return {\n name: \"web_search\",\n description: `Search the web using Google Search for current information. Use this when the user asks about:\n- Recent events, news, or current affairs\n- Real-time data (prices, weather, stocks, sports scores)\n- Information that might have changed after your training cutoff\n- Facts that need verification with current sources\n- Research topics that require up-to-date information`,\n\n location: \"server\",\n\n title: (args) => `Searching for \"${args.query}\"`,\n executingTitle: (args) => `Searching the web for \"${args.query}\"...`,\n completedTitle: (args) => `Found results for \"${args.query}\"`,\n\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query to find relevant information\",\n },\n maxResults: {\n type: \"number\",\n description:\n \"Maximum number of results to return (default: 5, max: 10)\",\n minimum: 1,\n maximum: 10,\n },\n },\n required: [\"query\"],\n },\n\n needsApproval: false,\n aiResponseMode: \"full\",\n\n handler: async (params) => {\n try {\n const response: WebSearchResponse = await searchGoogle(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n },\n {\n provider: \"google\",\n apiKey: config.apiKey,\n timeout: config.timeout,\n },\n );\n\n const aiContext = formatSearchResultsForAI(response);\n\n return {\n success: true,\n message: summarizeSearchResults(response),\n data: response,\n _aiContext: aiContext,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Web search failed\";\n return failure(errorMessage);\n }\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkCEKAYA2Q_cjs = require('../../chunk-CEKAYA2Q.cjs');
|
|
4
|
+
var chunkASV6JLYG_cjs = require('../../chunk-ASV6JLYG.cjs');
|
|
5
|
+
require('../../chunk-CBAHCI4R.cjs');
|
|
6
|
+
require('../../chunk-MEBXW75C.cjs');
|
|
7
|
+
require('../../chunk-W73FBYIH.cjs');
|
|
8
|
+
require('../../chunk-2FAWEBZS.cjs');
|
|
9
|
+
require('../../chunk-6T5XXJEP.cjs');
|
|
10
|
+
var chunkGANCV72Z_cjs = require('../../chunk-GANCV72Z.cjs');
|
|
11
|
+
require('../../chunk-XWOHNY3F.cjs');
|
|
12
|
+
require('../../chunk-TXLIY7GF.cjs');
|
|
13
|
+
require('../../chunk-JEQ2X3Z6.cjs');
|
|
14
|
+
|
|
15
|
+
// src/tools/openai/index.ts
|
|
16
|
+
function openaiSearch(config) {
|
|
17
|
+
return {
|
|
18
|
+
name: "web_search",
|
|
19
|
+
description: `Search the web using OpenAI's native search for current information. Use this when the user asks about:
|
|
20
|
+
- Recent events, news, or current affairs
|
|
21
|
+
- Real-time data (prices, weather, stocks, sports scores)
|
|
22
|
+
- Information that might have changed after your training cutoff
|
|
23
|
+
- Facts that need verification with current sources
|
|
24
|
+
- Research topics that require up-to-date information`,
|
|
25
|
+
location: "server",
|
|
26
|
+
title: (args) => `Searching for "${args.query}"`,
|
|
27
|
+
executingTitle: (args) => `Searching the web for "${args.query}"...`,
|
|
28
|
+
completedTitle: (args) => `Found results for "${args.query}"`,
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
query: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: "The search query to find relevant information"
|
|
35
|
+
},
|
|
36
|
+
maxResults: {
|
|
37
|
+
type: "number",
|
|
38
|
+
description: "Maximum number of results to return (default: 5, max: 10)",
|
|
39
|
+
minimum: 1,
|
|
40
|
+
maximum: 10
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
required: ["query"]
|
|
44
|
+
},
|
|
45
|
+
needsApproval: false,
|
|
46
|
+
aiResponseMode: "full",
|
|
47
|
+
handler: async (params) => {
|
|
48
|
+
try {
|
|
49
|
+
const response = await chunkGANCV72Z_cjs.searchOpenAI(
|
|
50
|
+
{
|
|
51
|
+
query: params.query,
|
|
52
|
+
maxResults: params.maxResults ?? config.maxResults ?? 5
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
provider: "openai",
|
|
56
|
+
apiKey: config.apiKey,
|
|
57
|
+
includeDomains: config.includeDomains,
|
|
58
|
+
timeout: config.timeout
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
const aiContext = chunkASV6JLYG_cjs.formatSearchResultsForAI(response);
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
message: chunkASV6JLYG_cjs.summarizeSearchResults(response),
|
|
65
|
+
data: response,
|
|
66
|
+
_aiContext: aiContext
|
|
67
|
+
};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
const errorMessage = error instanceof Error ? error.message : "Web search failed";
|
|
70
|
+
console.error("[OpenAI Search] Error:", errorMessage);
|
|
71
|
+
return chunkCEKAYA2Q_cjs.failure(errorMessage);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
Object.defineProperty(exports, "openaiProvider", {
|
|
78
|
+
enumerable: true,
|
|
79
|
+
get: function () { return chunkGANCV72Z_cjs.openaiProvider; }
|
|
80
|
+
});
|
|
81
|
+
exports.openaiSearch = openaiSearch;
|
|
82
|
+
//# sourceMappingURL=index.cjs.map
|
|
83
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/openai/index.ts"],"names":["searchOpenAI","formatSearchResultsForAI","summarizeSearchResults","failure"],"mappings":";;;;;;;;;;;;;;;AA8FO,SAAS,aACd,MAAA,EACoC;AACpC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAAA,CAAA;AAAA,IAOb,QAAA,EAAU,QAAA;AAAA,IAEV,KAAA,EAAO,CAAC,IAAA,KAAS,CAAA,eAAA,EAAkB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAC7C,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,uBAAA,EAA0B,KAAK,KAAK,CAAA,IAAA,CAAA;AAAA,IAC9D,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,mBAAA,EAAsB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAE1D,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EACE,2DAAA;AAAA,UACF,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,QAAA,EAAU,CAAC,OAAO;AAAA,KACpB;AAAA,IAEA,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB,MAAA;AAAA,IAEhB,OAAA,EAAS,OAAO,MAAA,KAAW;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,WAA8B,MAAMA,8BAAA;AAAA,UACxC;AAAA,YACE,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc;AAAA,WACxD;AAAA,UACA;AAAA,YACE,QAAA,EAAU,QAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,SAAS,MAAA,CAAO;AAAA;AAClB,SACF;AAEA,QAAA,MAAM,SAAA,GAAYC,2CAAyB,QAAQ,CAAA;AAEnD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAASC,yCAAuB,QAAQ,CAAA;AAAA,UACxC,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,mBAAA;AAC3C,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,YAAY,CAAA;AACpD,QAAA,OAAOC,0BAAQ,YAAY,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["/**\n * OpenAI Search Tool\n *\n * Tree-shakeable import for OpenAI's built-in web search.\n * Uses OpenAI's Responses API with the web_search tool.\n *\n * @example\n * ```typescript\n * import { openaiSearch } from '@yourgpt/copilot-sdk/tools/openai';\n *\n * const webSearch = openaiSearch({\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n *\n * @see https://platform.openai.com/docs/guides/tools-web-search\n * @module @yourgpt/copilot-sdk/tools/openai\n */\n\nimport type { ToolDefinition } from \"../../core/types/tools\";\nimport { failure } from \"../../core/types/tools\";\nimport {\n searchOpenAI,\n openaiProvider,\n} from \"../../core/tools/webSearch/providers/openai\";\nimport {\n formatSearchResultsForAI,\n summarizeSearchResults,\n} from \"../../core/tools/webSearch\";\nimport type { WebSearchResponse } from \"../../core/tools/webSearch/types\";\n\n// Re-export provider for direct access\nexport { openaiProvider };\n\n/**\n * OpenAI search configuration\n */\nexport interface OpenAISearchConfig {\n /** OpenAI API key - uses your existing OpenAI key */\n apiKey: string;\n /** Maximum number of results (default: 5) */\n maxResults?: number;\n /** Only include results from these domains */\n includeDomains?: string[];\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Search parameters passed to the tool\n */\ninterface OpenAISearchParams {\n /** The search query */\n query: string;\n /** Maximum number of results (overrides config) */\n maxResults?: number;\n}\n\n/**\n * Create an OpenAI web search tool\n *\n * Uses OpenAI's built-in web_search tool via the Responses API.\n * No third-party API key required - uses your existing OpenAI API key.\n *\n * @param config - OpenAI configuration including API key\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * import { openaiSearch } from '@yourgpt/copilot-sdk/tools/openai';\n *\n * // Basic usage\n * const webSearch = openaiSearch({\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * // With domain filtering\n * const webSearch = openaiSearch({\n * apiKey: process.env.OPENAI_API_KEY,\n * includeDomains: ['docs.python.org', 'stackoverflow.com'],\n * maxResults: 5,\n * });\n *\n * const runtime = createRuntime({\n * provider: openai,\n * model: 'gpt-4o',\n * tools: [webSearch],\n * });\n * ```\n */\nexport function openaiSearch(\n config: OpenAISearchConfig,\n): ToolDefinition<OpenAISearchParams> {\n return {\n name: \"web_search\",\n description: `Search the web using OpenAI's native search for current information. Use this when the user asks about:\n- Recent events, news, or current affairs\n- Real-time data (prices, weather, stocks, sports scores)\n- Information that might have changed after your training cutoff\n- Facts that need verification with current sources\n- Research topics that require up-to-date information`,\n\n location: \"server\",\n\n title: (args) => `Searching for \"${args.query}\"`,\n executingTitle: (args) => `Searching the web for \"${args.query}\"...`,\n completedTitle: (args) => `Found results for \"${args.query}\"`,\n\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query to find relevant information\",\n },\n maxResults: {\n type: \"number\",\n description:\n \"Maximum number of results to return (default: 5, max: 10)\",\n minimum: 1,\n maximum: 10,\n },\n },\n required: [\"query\"],\n },\n\n needsApproval: false,\n aiResponseMode: \"full\",\n\n handler: async (params) => {\n try {\n const response: WebSearchResponse = await searchOpenAI(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n },\n {\n provider: \"openai\",\n apiKey: config.apiKey,\n includeDomains: config.includeDomains,\n timeout: config.timeout,\n },\n );\n\n const aiContext = formatSearchResultsForAI(response);\n\n return {\n success: true,\n message: summarizeSearchResults(response),\n data: response,\n _aiContext: aiContext,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Web search failed\";\n console.error(\"[OpenAI Search] Error:\", errorMessage);\n return failure(errorMessage);\n }\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { T as ToolDefinition } from '../../tools-DDWrco4h.cjs';
|
|
2
|
+
export { o as openaiProvider } from '../../openai-HVSCuXgO.cjs';
|
|
3
|
+
import '../../types-ZguuKEs_.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* OpenAI Search Tool
|
|
7
|
+
*
|
|
8
|
+
* Tree-shakeable import for OpenAI's built-in web search.
|
|
9
|
+
* Uses OpenAI's Responses API with the web_search tool.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { openaiSearch } from '@yourgpt/copilot-sdk/tools/openai';
|
|
14
|
+
*
|
|
15
|
+
* const webSearch = openaiSearch({
|
|
16
|
+
* apiKey: process.env.OPENAI_API_KEY,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const runtime = createRuntime({
|
|
20
|
+
* tools: [webSearch],
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @see https://platform.openai.com/docs/guides/tools-web-search
|
|
25
|
+
* @module @yourgpt/copilot-sdk/tools/openai
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* OpenAI search configuration
|
|
30
|
+
*/
|
|
31
|
+
interface OpenAISearchConfig {
|
|
32
|
+
/** OpenAI API key - uses your existing OpenAI key */
|
|
33
|
+
apiKey: string;
|
|
34
|
+
/** Maximum number of results (default: 5) */
|
|
35
|
+
maxResults?: number;
|
|
36
|
+
/** Only include results from these domains */
|
|
37
|
+
includeDomains?: string[];
|
|
38
|
+
/** Request timeout in milliseconds */
|
|
39
|
+
timeout?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Search parameters passed to the tool
|
|
43
|
+
*/
|
|
44
|
+
interface OpenAISearchParams {
|
|
45
|
+
/** The search query */
|
|
46
|
+
query: string;
|
|
47
|
+
/** Maximum number of results (overrides config) */
|
|
48
|
+
maxResults?: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create an OpenAI web search tool
|
|
52
|
+
*
|
|
53
|
+
* Uses OpenAI's built-in web_search tool via the Responses API.
|
|
54
|
+
* No third-party API key required - uses your existing OpenAI API key.
|
|
55
|
+
*
|
|
56
|
+
* @param config - OpenAI configuration including API key
|
|
57
|
+
* @returns A configured tool definition ready to use
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* import { openaiSearch } from '@yourgpt/copilot-sdk/tools/openai';
|
|
62
|
+
*
|
|
63
|
+
* // Basic usage
|
|
64
|
+
* const webSearch = openaiSearch({
|
|
65
|
+
* apiKey: process.env.OPENAI_API_KEY,
|
|
66
|
+
* });
|
|
67
|
+
*
|
|
68
|
+
* // With domain filtering
|
|
69
|
+
* const webSearch = openaiSearch({
|
|
70
|
+
* apiKey: process.env.OPENAI_API_KEY,
|
|
71
|
+
* includeDomains: ['docs.python.org', 'stackoverflow.com'],
|
|
72
|
+
* maxResults: 5,
|
|
73
|
+
* });
|
|
74
|
+
*
|
|
75
|
+
* const runtime = createRuntime({
|
|
76
|
+
* provider: openai,
|
|
77
|
+
* model: 'gpt-4o',
|
|
78
|
+
* tools: [webSearch],
|
|
79
|
+
* });
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
declare function openaiSearch(config: OpenAISearchConfig): ToolDefinition<OpenAISearchParams>;
|
|
83
|
+
|
|
84
|
+
export { type OpenAISearchConfig, openaiSearch };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { T as ToolDefinition } from '../../tools-DDWrco4h.js';
|
|
2
|
+
export { o as openaiProvider } from '../../openai-Cam8hF4f.js';
|
|
3
|
+
import '../../types-ZguuKEs_.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* OpenAI Search Tool
|
|
7
|
+
*
|
|
8
|
+
* Tree-shakeable import for OpenAI's built-in web search.
|
|
9
|
+
* Uses OpenAI's Responses API with the web_search tool.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { openaiSearch } from '@yourgpt/copilot-sdk/tools/openai';
|
|
14
|
+
*
|
|
15
|
+
* const webSearch = openaiSearch({
|
|
16
|
+
* apiKey: process.env.OPENAI_API_KEY,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const runtime = createRuntime({
|
|
20
|
+
* tools: [webSearch],
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @see https://platform.openai.com/docs/guides/tools-web-search
|
|
25
|
+
* @module @yourgpt/copilot-sdk/tools/openai
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* OpenAI search configuration
|
|
30
|
+
*/
|
|
31
|
+
interface OpenAISearchConfig {
|
|
32
|
+
/** OpenAI API key - uses your existing OpenAI key */
|
|
33
|
+
apiKey: string;
|
|
34
|
+
/** Maximum number of results (default: 5) */
|
|
35
|
+
maxResults?: number;
|
|
36
|
+
/** Only include results from these domains */
|
|
37
|
+
includeDomains?: string[];
|
|
38
|
+
/** Request timeout in milliseconds */
|
|
39
|
+
timeout?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Search parameters passed to the tool
|
|
43
|
+
*/
|
|
44
|
+
interface OpenAISearchParams {
|
|
45
|
+
/** The search query */
|
|
46
|
+
query: string;
|
|
47
|
+
/** Maximum number of results (overrides config) */
|
|
48
|
+
maxResults?: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create an OpenAI web search tool
|
|
52
|
+
*
|
|
53
|
+
* Uses OpenAI's built-in web_search tool via the Responses API.
|
|
54
|
+
* No third-party API key required - uses your existing OpenAI API key.
|
|
55
|
+
*
|
|
56
|
+
* @param config - OpenAI configuration including API key
|
|
57
|
+
* @returns A configured tool definition ready to use
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* import { openaiSearch } from '@yourgpt/copilot-sdk/tools/openai';
|
|
62
|
+
*
|
|
63
|
+
* // Basic usage
|
|
64
|
+
* const webSearch = openaiSearch({
|
|
65
|
+
* apiKey: process.env.OPENAI_API_KEY,
|
|
66
|
+
* });
|
|
67
|
+
*
|
|
68
|
+
* // With domain filtering
|
|
69
|
+
* const webSearch = openaiSearch({
|
|
70
|
+
* apiKey: process.env.OPENAI_API_KEY,
|
|
71
|
+
* includeDomains: ['docs.python.org', 'stackoverflow.com'],
|
|
72
|
+
* maxResults: 5,
|
|
73
|
+
* });
|
|
74
|
+
*
|
|
75
|
+
* const runtime = createRuntime({
|
|
76
|
+
* provider: openai,
|
|
77
|
+
* model: 'gpt-4o',
|
|
78
|
+
* tools: [webSearch],
|
|
79
|
+
* });
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
declare function openaiSearch(config: OpenAISearchConfig): ToolDefinition<OpenAISearchParams>;
|
|
83
|
+
|
|
84
|
+
export { type OpenAISearchConfig, openaiSearch };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { failure } from '../../chunk-BKO7DSPU.js';
|
|
2
|
+
import { formatSearchResultsForAI, summarizeSearchResults } from '../../chunk-XGITAEXU.js';
|
|
3
|
+
import '../../chunk-7W7QLZNC.js';
|
|
4
|
+
import '../../chunk-CEOMTQTP.js';
|
|
5
|
+
import '../../chunk-PPFHA6IL.js';
|
|
6
|
+
import '../../chunk-DABZYCVX.js';
|
|
7
|
+
import '../../chunk-MNDGIW47.js';
|
|
8
|
+
import { searchOpenAI } from '../../chunk-VD74IPKB.js';
|
|
9
|
+
export { openaiProvider } from '../../chunk-VD74IPKB.js';
|
|
10
|
+
import '../../chunk-53UGJNHN.js';
|
|
11
|
+
import '../../chunk-RQ74USYU.js';
|
|
12
|
+
import '../../chunk-DGUM43GV.js';
|
|
13
|
+
|
|
14
|
+
// src/tools/openai/index.ts
|
|
15
|
+
function openaiSearch(config) {
|
|
16
|
+
return {
|
|
17
|
+
name: "web_search",
|
|
18
|
+
description: `Search the web using OpenAI's native search for current information. Use this when the user asks about:
|
|
19
|
+
- Recent events, news, or current affairs
|
|
20
|
+
- Real-time data (prices, weather, stocks, sports scores)
|
|
21
|
+
- Information that might have changed after your training cutoff
|
|
22
|
+
- Facts that need verification with current sources
|
|
23
|
+
- Research topics that require up-to-date information`,
|
|
24
|
+
location: "server",
|
|
25
|
+
title: (args) => `Searching for "${args.query}"`,
|
|
26
|
+
executingTitle: (args) => `Searching the web for "${args.query}"...`,
|
|
27
|
+
completedTitle: (args) => `Found results for "${args.query}"`,
|
|
28
|
+
inputSchema: {
|
|
29
|
+
type: "object",
|
|
30
|
+
properties: {
|
|
31
|
+
query: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "The search query to find relevant information"
|
|
34
|
+
},
|
|
35
|
+
maxResults: {
|
|
36
|
+
type: "number",
|
|
37
|
+
description: "Maximum number of results to return (default: 5, max: 10)",
|
|
38
|
+
minimum: 1,
|
|
39
|
+
maximum: 10
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
required: ["query"]
|
|
43
|
+
},
|
|
44
|
+
needsApproval: false,
|
|
45
|
+
aiResponseMode: "full",
|
|
46
|
+
handler: async (params) => {
|
|
47
|
+
try {
|
|
48
|
+
const response = await searchOpenAI(
|
|
49
|
+
{
|
|
50
|
+
query: params.query,
|
|
51
|
+
maxResults: params.maxResults ?? config.maxResults ?? 5
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
provider: "openai",
|
|
55
|
+
apiKey: config.apiKey,
|
|
56
|
+
includeDomains: config.includeDomains,
|
|
57
|
+
timeout: config.timeout
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
const aiContext = formatSearchResultsForAI(response);
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
message: summarizeSearchResults(response),
|
|
64
|
+
data: response,
|
|
65
|
+
_aiContext: aiContext
|
|
66
|
+
};
|
|
67
|
+
} catch (error) {
|
|
68
|
+
const errorMessage = error instanceof Error ? error.message : "Web search failed";
|
|
69
|
+
console.error("[OpenAI Search] Error:", errorMessage);
|
|
70
|
+
return failure(errorMessage);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export { openaiSearch };
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/openai/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AA8FO,SAAS,aACd,MAAA,EACoC;AACpC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAAA,CAAA;AAAA,IAOb,QAAA,EAAU,QAAA;AAAA,IAEV,KAAA,EAAO,CAAC,IAAA,KAAS,CAAA,eAAA,EAAkB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAC7C,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,uBAAA,EAA0B,KAAK,KAAK,CAAA,IAAA,CAAA;AAAA,IAC9D,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,mBAAA,EAAsB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAE1D,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EACE,2DAAA;AAAA,UACF,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,QAAA,EAAU,CAAC,OAAO;AAAA,KACpB;AAAA,IAEA,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB,MAAA;AAAA,IAEhB,OAAA,EAAS,OAAO,MAAA,KAAW;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,WAA8B,MAAM,YAAA;AAAA,UACxC;AAAA,YACE,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc;AAAA,WACxD;AAAA,UACA;AAAA,YACE,QAAA,EAAU,QAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,SAAS,MAAA,CAAO;AAAA;AAClB,SACF;AAEA,QAAA,MAAM,SAAA,GAAY,yBAAyB,QAAQ,CAAA;AAEnD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,uBAAuB,QAAQ,CAAA;AAAA,UACxC,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,mBAAA;AAC3C,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,YAAY,CAAA;AACpD,QAAA,OAAO,QAAQ,YAAY,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACF;AACF","file":"index.js","sourcesContent":["/**\n * OpenAI Search Tool\n *\n * Tree-shakeable import for OpenAI's built-in web search.\n * Uses OpenAI's Responses API with the web_search tool.\n *\n * @example\n * ```typescript\n * import { openaiSearch } from '@yourgpt/copilot-sdk/tools/openai';\n *\n * const webSearch = openaiSearch({\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n *\n * @see https://platform.openai.com/docs/guides/tools-web-search\n * @module @yourgpt/copilot-sdk/tools/openai\n */\n\nimport type { ToolDefinition } from \"../../core/types/tools\";\nimport { failure } from \"../../core/types/tools\";\nimport {\n searchOpenAI,\n openaiProvider,\n} from \"../../core/tools/webSearch/providers/openai\";\nimport {\n formatSearchResultsForAI,\n summarizeSearchResults,\n} from \"../../core/tools/webSearch\";\nimport type { WebSearchResponse } from \"../../core/tools/webSearch/types\";\n\n// Re-export provider for direct access\nexport { openaiProvider };\n\n/**\n * OpenAI search configuration\n */\nexport interface OpenAISearchConfig {\n /** OpenAI API key - uses your existing OpenAI key */\n apiKey: string;\n /** Maximum number of results (default: 5) */\n maxResults?: number;\n /** Only include results from these domains */\n includeDomains?: string[];\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Search parameters passed to the tool\n */\ninterface OpenAISearchParams {\n /** The search query */\n query: string;\n /** Maximum number of results (overrides config) */\n maxResults?: number;\n}\n\n/**\n * Create an OpenAI web search tool\n *\n * Uses OpenAI's built-in web_search tool via the Responses API.\n * No third-party API key required - uses your existing OpenAI API key.\n *\n * @param config - OpenAI configuration including API key\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * import { openaiSearch } from '@yourgpt/copilot-sdk/tools/openai';\n *\n * // Basic usage\n * const webSearch = openaiSearch({\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * // With domain filtering\n * const webSearch = openaiSearch({\n * apiKey: process.env.OPENAI_API_KEY,\n * includeDomains: ['docs.python.org', 'stackoverflow.com'],\n * maxResults: 5,\n * });\n *\n * const runtime = createRuntime({\n * provider: openai,\n * model: 'gpt-4o',\n * tools: [webSearch],\n * });\n * ```\n */\nexport function openaiSearch(\n config: OpenAISearchConfig,\n): ToolDefinition<OpenAISearchParams> {\n return {\n name: \"web_search\",\n description: `Search the web using OpenAI's native search for current information. Use this when the user asks about:\n- Recent events, news, or current affairs\n- Real-time data (prices, weather, stocks, sports scores)\n- Information that might have changed after your training cutoff\n- Facts that need verification with current sources\n- Research topics that require up-to-date information`,\n\n location: \"server\",\n\n title: (args) => `Searching for \"${args.query}\"`,\n executingTitle: (args) => `Searching the web for \"${args.query}\"...`,\n completedTitle: (args) => `Found results for \"${args.query}\"`,\n\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query to find relevant information\",\n },\n maxResults: {\n type: \"number\",\n description:\n \"Maximum number of results to return (default: 5, max: 10)\",\n minimum: 1,\n maximum: 10,\n },\n },\n required: [\"query\"],\n },\n\n needsApproval: false,\n aiResponseMode: \"full\",\n\n handler: async (params) => {\n try {\n const response: WebSearchResponse = await searchOpenAI(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n },\n {\n provider: \"openai\",\n apiKey: config.apiKey,\n includeDomains: config.includeDomains,\n timeout: config.timeout,\n },\n );\n\n const aiContext = formatSearchResultsForAI(response);\n\n return {\n success: true,\n message: summarizeSearchResults(response),\n data: response,\n _aiContext: aiContext,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Web search failed\";\n console.error(\"[OpenAI Search] Error:\", errorMessage);\n return failure(errorMessage);\n }\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkCEKAYA2Q_cjs = require('../../chunk-CEKAYA2Q.cjs');
|
|
4
|
+
var chunkASV6JLYG_cjs = require('../../chunk-ASV6JLYG.cjs');
|
|
5
|
+
require('../../chunk-CBAHCI4R.cjs');
|
|
6
|
+
require('../../chunk-MEBXW75C.cjs');
|
|
7
|
+
require('../../chunk-W73FBYIH.cjs');
|
|
8
|
+
var chunk2FAWEBZS_cjs = require('../../chunk-2FAWEBZS.cjs');
|
|
9
|
+
require('../../chunk-6T5XXJEP.cjs');
|
|
10
|
+
require('../../chunk-GANCV72Z.cjs');
|
|
11
|
+
require('../../chunk-XWOHNY3F.cjs');
|
|
12
|
+
require('../../chunk-TXLIY7GF.cjs');
|
|
13
|
+
require('../../chunk-JEQ2X3Z6.cjs');
|
|
14
|
+
|
|
15
|
+
// src/tools/searxng/index.ts
|
|
16
|
+
function searxngSearch(config) {
|
|
17
|
+
return {
|
|
18
|
+
name: "web_search",
|
|
19
|
+
description: `Search the web using SearXNG for current information. Use this when the user asks about:
|
|
20
|
+
- Recent events, news, or current affairs
|
|
21
|
+
- Real-time data (prices, weather, stocks, sports scores)
|
|
22
|
+
- Information that might have changed after your training cutoff
|
|
23
|
+
- Facts that need verification with current sources
|
|
24
|
+
- Research topics that require up-to-date information`,
|
|
25
|
+
location: "server",
|
|
26
|
+
title: (args) => `Searching for "${args.query}"`,
|
|
27
|
+
executingTitle: (args) => `Searching the web for "${args.query}"...`,
|
|
28
|
+
completedTitle: (args) => `Found results for "${args.query}"`,
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
query: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: "The search query to find relevant information"
|
|
35
|
+
},
|
|
36
|
+
maxResults: {
|
|
37
|
+
type: "number",
|
|
38
|
+
description: "Maximum number of results to return (default: 5, max: 10)",
|
|
39
|
+
minimum: 1,
|
|
40
|
+
maximum: 10
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
required: ["query"]
|
|
44
|
+
},
|
|
45
|
+
needsApproval: false,
|
|
46
|
+
aiResponseMode: "full",
|
|
47
|
+
handler: async (params) => {
|
|
48
|
+
try {
|
|
49
|
+
const response = await chunk2FAWEBZS_cjs.searchSearxng(
|
|
50
|
+
{
|
|
51
|
+
query: params.query,
|
|
52
|
+
maxResults: params.maxResults ?? config.maxResults ?? 5
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
provider: "searxng",
|
|
56
|
+
baseUrl: config.baseUrl,
|
|
57
|
+
apiKey: config.apiKey,
|
|
58
|
+
language: config.language,
|
|
59
|
+
includeDomains: config.includeDomains,
|
|
60
|
+
excludeDomains: config.excludeDomains,
|
|
61
|
+
timeout: config.timeout
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
const aiContext = chunkASV6JLYG_cjs.formatSearchResultsForAI(response);
|
|
65
|
+
return {
|
|
66
|
+
success: true,
|
|
67
|
+
message: chunkASV6JLYG_cjs.summarizeSearchResults(response),
|
|
68
|
+
data: response,
|
|
69
|
+
_aiContext: aiContext
|
|
70
|
+
};
|
|
71
|
+
} catch (error) {
|
|
72
|
+
const errorMessage = error instanceof Error ? error.message : "Web search failed";
|
|
73
|
+
return chunkCEKAYA2Q_cjs.failure(errorMessage);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Object.defineProperty(exports, "searxngProvider", {
|
|
80
|
+
enumerable: true,
|
|
81
|
+
get: function () { return chunk2FAWEBZS_cjs.searxngProvider; }
|
|
82
|
+
});
|
|
83
|
+
exports.searxngSearch = searxngSearch;
|
|
84
|
+
//# sourceMappingURL=index.cjs.map
|
|
85
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/searxng/index.ts"],"names":["searchSearxng","formatSearchResultsForAI","summarizeSearchResults","failure"],"mappings":";;;;;;;;;;;;;;;AAqGO,SAAS,cACd,MAAA,EACqC;AACrC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAAA,CAAA;AAAA,IAOb,QAAA,EAAU,QAAA;AAAA,IAEV,KAAA,EAAO,CAAC,IAAA,KAAS,CAAA,eAAA,EAAkB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAC7C,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,uBAAA,EAA0B,KAAK,KAAK,CAAA,IAAA,CAAA;AAAA,IAC9D,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,mBAAA,EAAsB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IAE1D,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EACE,2DAAA;AAAA,UACF,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,QAAA,EAAU,CAAC,OAAO;AAAA,KACpB;AAAA,IAEA,aAAA,EAAe,KAAA;AAAA,IACf,cAAA,EAAgB,MAAA;AAAA,IAEhB,OAAA,EAAS,OAAO,MAAA,KAAW;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,WAA8B,MAAMA,+BAAA;AAAA,UACxC;AAAA,YACE,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc;AAAA,WACxD;AAAA,UACA;AAAA,YACE,QAAA,EAAU,SAAA;AAAA,YACV,SAAS,MAAA,CAAO,OAAA;AAAA,YAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,SAAS,MAAA,CAAO;AAAA;AAClB,SACF;AAEA,QAAA,MAAM,SAAA,GAAYC,2CAAyB,QAAQ,CAAA;AAEnD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAASC,yCAAuB,QAAQ,CAAA;AAAA,UACxC,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,mBAAA;AAC3C,QAAA,OAAOC,0BAAQ,YAAY,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["/**\n * SearXNG Search Tool\n *\n * Tree-shakeable import for SearXNG web search provider.\n * Only imports SearXNG code - no other providers bundled.\n *\n * @example\n * ```typescript\n * import { searxngSearch } from '@yourgpt/copilot-sdk/tools/searxng';\n *\n * const webSearch = searxngSearch({\n * baseUrl: 'https://your-searxng-instance.com',\n * });\n *\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n *\n * @see https://docs.searxng.org/\n * @module @yourgpt/copilot-sdk/tools/searxng\n */\n\nimport type { ToolDefinition } from \"../../core/types/tools\";\nimport { failure } from \"../../core/types/tools\";\nimport {\n searchSearxng,\n searxngProvider,\n} from \"../../core/tools/webSearch/providers/searxng\";\nimport {\n formatSearchResultsForAI,\n summarizeSearchResults,\n} from \"../../core/tools/webSearch\";\nimport type { WebSearchResponse } from \"../../core/tools/webSearch/types\";\n\n// Re-export provider for direct access\nexport { searxngProvider };\n\n/**\n * SearXNG search configuration\n */\nexport interface SearxngSearchConfig {\n /** Base URL of your SearXNG instance (e.g., 'https://searx.example.com') */\n baseUrl: string;\n /** Optional API key if your instance requires authentication */\n apiKey?: string;\n /** Maximum number of results (default: 5) */\n maxResults?: number;\n /** Language code for results (e.g., 'en', 'es', 'fr') */\n language?: string;\n /** Only include results from these domains */\n includeDomains?: string[];\n /** Exclude results from these domains */\n excludeDomains?: string[];\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Search parameters passed to the tool\n */\ninterface SearxngSearchParams {\n /** The search query */\n query: string;\n /** Maximum number of results (overrides config) */\n maxResults?: number;\n}\n\n/**\n * Create a SearXNG web search tool\n *\n * SearXNG is a privacy-respecting, self-hostable metasearch engine.\n * It aggregates results from multiple search engines without tracking.\n *\n * @param config - SearXNG configuration including instance URL\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * import { searxngSearch } from '@yourgpt/copilot-sdk/tools/searxng';\n *\n * // Basic usage with self-hosted instance\n * const webSearch = searxngSearch({\n * baseUrl: 'https://your-searxng-instance.com',\n * });\n *\n * // With authentication\n * const webSearch = searxngSearch({\n * baseUrl: 'https://your-searxng-instance.com',\n * apiKey: process.env.SEARXNG_API_KEY,\n * language: 'en',\n * maxResults: 10,\n * });\n *\n * const runtime = createRuntime({\n * provider: openai,\n * model: 'gpt-4o',\n * tools: [webSearch],\n * });\n * ```\n */\nexport function searxngSearch(\n config: SearxngSearchConfig,\n): ToolDefinition<SearxngSearchParams> {\n return {\n name: \"web_search\",\n description: `Search the web using SearXNG for current information. Use this when the user asks about:\n- Recent events, news, or current affairs\n- Real-time data (prices, weather, stocks, sports scores)\n- Information that might have changed after your training cutoff\n- Facts that need verification with current sources\n- Research topics that require up-to-date information`,\n\n location: \"server\",\n\n title: (args) => `Searching for \"${args.query}\"`,\n executingTitle: (args) => `Searching the web for \"${args.query}\"...`,\n completedTitle: (args) => `Found results for \"${args.query}\"`,\n\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query to find relevant information\",\n },\n maxResults: {\n type: \"number\",\n description:\n \"Maximum number of results to return (default: 5, max: 10)\",\n minimum: 1,\n maximum: 10,\n },\n },\n required: [\"query\"],\n },\n\n needsApproval: false,\n aiResponseMode: \"full\",\n\n handler: async (params) => {\n try {\n const response: WebSearchResponse = await searchSearxng(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n },\n {\n provider: \"searxng\",\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n language: config.language,\n includeDomains: config.includeDomains,\n excludeDomains: config.excludeDomains,\n timeout: config.timeout,\n },\n );\n\n const aiContext = formatSearchResultsForAI(response);\n\n return {\n success: true,\n message: summarizeSearchResults(response),\n data: response,\n _aiContext: aiContext,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Web search failed\";\n return failure(errorMessage);\n }\n },\n };\n}\n"]}
|