@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,80 @@
|
|
|
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 { searchBrave } from '../../chunk-PPFHA6IL.js';
|
|
6
|
+
export { braveProvider } from '../../chunk-PPFHA6IL.js';
|
|
7
|
+
import '../../chunk-DABZYCVX.js';
|
|
8
|
+
import '../../chunk-MNDGIW47.js';
|
|
9
|
+
import '../../chunk-VD74IPKB.js';
|
|
10
|
+
import '../../chunk-53UGJNHN.js';
|
|
11
|
+
import '../../chunk-RQ74USYU.js';
|
|
12
|
+
import '../../chunk-DGUM43GV.js';
|
|
13
|
+
|
|
14
|
+
// src/tools/brave/index.ts
|
|
15
|
+
function braveSearch(config) {
|
|
16
|
+
return {
|
|
17
|
+
name: "web_search",
|
|
18
|
+
description: `Search the web using Brave 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 searchBrave(
|
|
49
|
+
{
|
|
50
|
+
query: params.query,
|
|
51
|
+
maxResults: params.maxResults ?? config.maxResults ?? 5
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
provider: "brave",
|
|
55
|
+
apiKey: config.apiKey,
|
|
56
|
+
country: config.country,
|
|
57
|
+
language: config.language,
|
|
58
|
+
includeDomains: config.includeDomains,
|
|
59
|
+
excludeDomains: config.excludeDomains,
|
|
60
|
+
timeout: config.timeout
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
const aiContext = formatSearchResultsForAI(response);
|
|
64
|
+
return {
|
|
65
|
+
success: true,
|
|
66
|
+
message: summarizeSearchResults(response),
|
|
67
|
+
data: response,
|
|
68
|
+
_aiContext: aiContext
|
|
69
|
+
};
|
|
70
|
+
} catch (error) {
|
|
71
|
+
const errorMessage = error instanceof Error ? error.message : "Web search failed";
|
|
72
|
+
return failure(errorMessage);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { braveSearch };
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/brave/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAqGO,SAAS,YACd,MAAA,EACmC;AACnC,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,WAAA;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,OAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,SAAS,MAAA,CAAO,OAAA;AAAA,YAChB,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,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 * Brave Search Tool\n *\n * Tree-shakeable import for Brave web search provider.\n * Only imports Brave code - no other providers bundled.\n *\n * @example\n * ```typescript\n * import { braveSearch } from '@yourgpt/copilot-sdk/tools/brave';\n *\n * const webSearch = braveSearch({\n * apiKey: process.env.BRAVE_API_KEY,\n * });\n *\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n *\n * @see https://brave.com/search/api/\n * @module @yourgpt/copilot-sdk/tools/brave\n */\n\nimport type { ToolDefinition } from \"../../core/types/tools\";\nimport { failure } from \"../../core/types/tools\";\nimport {\n searchBrave,\n braveProvider,\n} from \"../../core/tools/webSearch/providers/brave\";\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 { braveProvider };\n\n/**\n * Brave search configuration\n */\nexport interface BraveSearchConfig {\n /** Brave Search API key - get one at https://brave.com/search/api/ */\n apiKey: string;\n /** Maximum number of results (default: 5) */\n maxResults?: number;\n /** Country code for localized results (e.g., 'us', 'gb', 'de') */\n country?: string;\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 BraveSearchParams {\n /** The search query */\n query: string;\n /** Maximum number of results (overrides config) */\n maxResults?: number;\n}\n\n/**\n * Create a Brave web search tool\n *\n * Brave Search is a privacy-focused search engine with its own index.\n * Provides independent search results without tracking.\n *\n * @param config - Brave configuration including API key\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * import { braveSearch } from '@yourgpt/copilot-sdk/tools/brave';\n *\n * // Basic usage\n * const webSearch = braveSearch({\n * apiKey: process.env.BRAVE_API_KEY,\n * });\n *\n * // With locale settings\n * const webSearch = braveSearch({\n * apiKey: process.env.BRAVE_API_KEY,\n * country: 'us',\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 braveSearch(\n config: BraveSearchConfig,\n): ToolDefinition<BraveSearchParams> {\n return {\n name: \"web_search\",\n description: `Search the web using Brave 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 searchBrave(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n },\n {\n provider: \"brave\",\n apiKey: config.apiKey,\n country: config.country,\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"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
var chunk6T5XXJEP_cjs = 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/exa/index.ts
|
|
16
|
+
function exaSearch(config) {
|
|
17
|
+
return {
|
|
18
|
+
name: "web_search",
|
|
19
|
+
description: `Search the web using Exa 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
|
+
searchDepth: {
|
|
43
|
+
type: "string",
|
|
44
|
+
enum: ["basic", "advanced"],
|
|
45
|
+
description: "Search depth - 'advanced' uses semantic search for better results"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
required: ["query"]
|
|
49
|
+
},
|
|
50
|
+
needsApproval: false,
|
|
51
|
+
aiResponseMode: "full",
|
|
52
|
+
handler: async (params) => {
|
|
53
|
+
try {
|
|
54
|
+
const response = await chunk6T5XXJEP_cjs.searchExa(
|
|
55
|
+
{
|
|
56
|
+
query: params.query,
|
|
57
|
+
maxResults: params.maxResults ?? config.maxResults ?? 5,
|
|
58
|
+
searchDepth: params.searchDepth ?? config.searchDepth ?? "basic"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
provider: "exa",
|
|
62
|
+
apiKey: config.apiKey,
|
|
63
|
+
includeDomains: config.includeDomains,
|
|
64
|
+
excludeDomains: config.excludeDomains,
|
|
65
|
+
includeRawContent: config.includeRawContent,
|
|
66
|
+
timeout: config.timeout
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
const aiContext = chunkASV6JLYG_cjs.formatSearchResultsForAI(response);
|
|
70
|
+
return {
|
|
71
|
+
success: true,
|
|
72
|
+
message: chunkASV6JLYG_cjs.summarizeSearchResults(response),
|
|
73
|
+
data: response,
|
|
74
|
+
_aiContext: aiContext
|
|
75
|
+
};
|
|
76
|
+
} catch (error) {
|
|
77
|
+
const errorMessage = error instanceof Error ? error.message : "Web search failed";
|
|
78
|
+
return chunkCEKAYA2Q_cjs.failure(errorMessage);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
Object.defineProperty(exports, "exaProvider", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function () { return chunk6T5XXJEP_cjs.exaProvider; }
|
|
87
|
+
});
|
|
88
|
+
exports.exaSearch = exaSearch;
|
|
89
|
+
//# sourceMappingURL=index.cjs.map
|
|
90
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/exa/index.ts"],"names":["searchExa","formatSearchResultsForAI","summarizeSearchResults","failure"],"mappings":";;;;;;;;;;;;;;;AAsGO,SAAS,UACd,MAAA,EACiC;AACjC,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,SACX;AAAA,QACA,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,UAC1B,WAAA,EACE;AAAA;AACJ,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,2BAAA;AAAA,UACxC;AAAA,YACE,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc,CAAA;AAAA,YACtD,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,IAAe;AAAA,WAC3D;AAAA,UACA;AAAA,YACE,QAAA,EAAU,KAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,YAC1B,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 * Exa Search Tool\n *\n * Tree-shakeable import for Exa web search provider.\n * Only imports Exa code - no other providers bundled.\n *\n * @example\n * ```typescript\n * import { exaSearch } from '@yourgpt/copilot-sdk/tools/exa';\n *\n * const webSearch = exaSearch({\n * apiKey: process.env.EXA_API_KEY,\n * });\n *\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n *\n * @see https://exa.ai/\n * @module @yourgpt/copilot-sdk/tools/exa\n */\n\nimport type { ToolDefinition } from \"../../core/types/tools\";\nimport { failure } from \"../../core/types/tools\";\nimport {\n searchExa,\n exaProvider,\n} from \"../../core/tools/webSearch/providers/exa\";\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 { exaProvider };\n\n/**\n * Exa search configuration\n */\nexport interface ExaSearchConfig {\n /** Exa API key - get one at https://exa.ai/ */\n apiKey: string;\n /** Maximum number of results (default: 5) */\n maxResults?: number;\n /** Search depth - 'advanced' uses autoprompt for better semantic search */\n searchDepth?: \"basic\" | \"advanced\";\n /** Only include results from these domains */\n includeDomains?: string[];\n /** Exclude results from these domains */\n excludeDomains?: string[];\n /** Include raw page content */\n includeRawContent?: boolean;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Search parameters passed to the tool\n */\ninterface ExaSearchParams {\n /** The search query */\n query: string;\n /** Maximum number of results (overrides config) */\n maxResults?: number;\n /** Search depth (overrides config) */\n searchDepth?: \"basic\" | \"advanced\";\n}\n\n/**\n * Create an Exa web search tool\n *\n * Exa (formerly Metaphor) is an AI-native search engine that understands\n * queries semantically for better results.\n *\n * @param config - Exa configuration including API key\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * import { exaSearch } from '@yourgpt/copilot-sdk/tools/exa';\n *\n * // Basic usage\n * const webSearch = exaSearch({\n * apiKey: process.env.EXA_API_KEY,\n * });\n *\n * // With semantic search (autoprompt)\n * const webSearch = exaSearch({\n * apiKey: process.env.EXA_API_KEY,\n * searchDepth: 'advanced',\n * maxResults: 10,\n * });\n *\n * const runtime = createRuntime({\n * provider: openai,\n * model: 'gpt-4o',\n * tools: [webSearch],\n * });\n * ```\n */\nexport function exaSearch(\n config: ExaSearchConfig,\n): ToolDefinition<ExaSearchParams> {\n return {\n name: \"web_search\",\n description: `Search the web using Exa 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 searchDepth: {\n type: \"string\",\n enum: [\"basic\", \"advanced\"],\n description:\n \"Search depth - 'advanced' uses semantic search for better results\",\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 searchExa(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n searchDepth: params.searchDepth ?? config.searchDepth ?? \"basic\",\n },\n {\n provider: \"exa\",\n apiKey: config.apiKey,\n includeDomains: config.includeDomains,\n excludeDomains: config.excludeDomains,\n includeRawContent: config.includeRawContent,\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,92 @@
|
|
|
1
|
+
import { T as ToolDefinition } from '../../tools-DDWrco4h.cjs';
|
|
2
|
+
export { e as exaProvider } from '../../exa-jJSPhyUW.cjs';
|
|
3
|
+
import '../../types-ZguuKEs_.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Exa Search Tool
|
|
7
|
+
*
|
|
8
|
+
* Tree-shakeable import for Exa web search provider.
|
|
9
|
+
* Only imports Exa code - no other providers bundled.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { exaSearch } from '@yourgpt/copilot-sdk/tools/exa';
|
|
14
|
+
*
|
|
15
|
+
* const webSearch = exaSearch({
|
|
16
|
+
* apiKey: process.env.EXA_API_KEY,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const runtime = createRuntime({
|
|
20
|
+
* tools: [webSearch],
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @see https://exa.ai/
|
|
25
|
+
* @module @yourgpt/copilot-sdk/tools/exa
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Exa search configuration
|
|
30
|
+
*/
|
|
31
|
+
interface ExaSearchConfig {
|
|
32
|
+
/** Exa API key - get one at https://exa.ai/ */
|
|
33
|
+
apiKey: string;
|
|
34
|
+
/** Maximum number of results (default: 5) */
|
|
35
|
+
maxResults?: number;
|
|
36
|
+
/** Search depth - 'advanced' uses autoprompt for better semantic search */
|
|
37
|
+
searchDepth?: "basic" | "advanced";
|
|
38
|
+
/** Only include results from these domains */
|
|
39
|
+
includeDomains?: string[];
|
|
40
|
+
/** Exclude results from these domains */
|
|
41
|
+
excludeDomains?: string[];
|
|
42
|
+
/** Include raw page content */
|
|
43
|
+
includeRawContent?: boolean;
|
|
44
|
+
/** Request timeout in milliseconds */
|
|
45
|
+
timeout?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Search parameters passed to the tool
|
|
49
|
+
*/
|
|
50
|
+
interface ExaSearchParams {
|
|
51
|
+
/** The search query */
|
|
52
|
+
query: string;
|
|
53
|
+
/** Maximum number of results (overrides config) */
|
|
54
|
+
maxResults?: number;
|
|
55
|
+
/** Search depth (overrides config) */
|
|
56
|
+
searchDepth?: "basic" | "advanced";
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create an Exa web search tool
|
|
60
|
+
*
|
|
61
|
+
* Exa (formerly Metaphor) is an AI-native search engine that understands
|
|
62
|
+
* queries semantically for better results.
|
|
63
|
+
*
|
|
64
|
+
* @param config - Exa configuration including API key
|
|
65
|
+
* @returns A configured tool definition ready to use
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* import { exaSearch } from '@yourgpt/copilot-sdk/tools/exa';
|
|
70
|
+
*
|
|
71
|
+
* // Basic usage
|
|
72
|
+
* const webSearch = exaSearch({
|
|
73
|
+
* apiKey: process.env.EXA_API_KEY,
|
|
74
|
+
* });
|
|
75
|
+
*
|
|
76
|
+
* // With semantic search (autoprompt)
|
|
77
|
+
* const webSearch = exaSearch({
|
|
78
|
+
* apiKey: process.env.EXA_API_KEY,
|
|
79
|
+
* searchDepth: 'advanced',
|
|
80
|
+
* maxResults: 10,
|
|
81
|
+
* });
|
|
82
|
+
*
|
|
83
|
+
* const runtime = createRuntime({
|
|
84
|
+
* provider: openai,
|
|
85
|
+
* model: 'gpt-4o',
|
|
86
|
+
* tools: [webSearch],
|
|
87
|
+
* });
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
declare function exaSearch(config: ExaSearchConfig): ToolDefinition<ExaSearchParams>;
|
|
91
|
+
|
|
92
|
+
export { type ExaSearchConfig, exaSearch };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { T as ToolDefinition } from '../../tools-DDWrco4h.js';
|
|
2
|
+
export { e as exaProvider } from '../../exa-Dp9U-WTc.js';
|
|
3
|
+
import '../../types-ZguuKEs_.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Exa Search Tool
|
|
7
|
+
*
|
|
8
|
+
* Tree-shakeable import for Exa web search provider.
|
|
9
|
+
* Only imports Exa code - no other providers bundled.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { exaSearch } from '@yourgpt/copilot-sdk/tools/exa';
|
|
14
|
+
*
|
|
15
|
+
* const webSearch = exaSearch({
|
|
16
|
+
* apiKey: process.env.EXA_API_KEY,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* const runtime = createRuntime({
|
|
20
|
+
* tools: [webSearch],
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @see https://exa.ai/
|
|
25
|
+
* @module @yourgpt/copilot-sdk/tools/exa
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Exa search configuration
|
|
30
|
+
*/
|
|
31
|
+
interface ExaSearchConfig {
|
|
32
|
+
/** Exa API key - get one at https://exa.ai/ */
|
|
33
|
+
apiKey: string;
|
|
34
|
+
/** Maximum number of results (default: 5) */
|
|
35
|
+
maxResults?: number;
|
|
36
|
+
/** Search depth - 'advanced' uses autoprompt for better semantic search */
|
|
37
|
+
searchDepth?: "basic" | "advanced";
|
|
38
|
+
/** Only include results from these domains */
|
|
39
|
+
includeDomains?: string[];
|
|
40
|
+
/** Exclude results from these domains */
|
|
41
|
+
excludeDomains?: string[];
|
|
42
|
+
/** Include raw page content */
|
|
43
|
+
includeRawContent?: boolean;
|
|
44
|
+
/** Request timeout in milliseconds */
|
|
45
|
+
timeout?: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Search parameters passed to the tool
|
|
49
|
+
*/
|
|
50
|
+
interface ExaSearchParams {
|
|
51
|
+
/** The search query */
|
|
52
|
+
query: string;
|
|
53
|
+
/** Maximum number of results (overrides config) */
|
|
54
|
+
maxResults?: number;
|
|
55
|
+
/** Search depth (overrides config) */
|
|
56
|
+
searchDepth?: "basic" | "advanced";
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create an Exa web search tool
|
|
60
|
+
*
|
|
61
|
+
* Exa (formerly Metaphor) is an AI-native search engine that understands
|
|
62
|
+
* queries semantically for better results.
|
|
63
|
+
*
|
|
64
|
+
* @param config - Exa configuration including API key
|
|
65
|
+
* @returns A configured tool definition ready to use
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* import { exaSearch } from '@yourgpt/copilot-sdk/tools/exa';
|
|
70
|
+
*
|
|
71
|
+
* // Basic usage
|
|
72
|
+
* const webSearch = exaSearch({
|
|
73
|
+
* apiKey: process.env.EXA_API_KEY,
|
|
74
|
+
* });
|
|
75
|
+
*
|
|
76
|
+
* // With semantic search (autoprompt)
|
|
77
|
+
* const webSearch = exaSearch({
|
|
78
|
+
* apiKey: process.env.EXA_API_KEY,
|
|
79
|
+
* searchDepth: 'advanced',
|
|
80
|
+
* maxResults: 10,
|
|
81
|
+
* });
|
|
82
|
+
*
|
|
83
|
+
* const runtime = createRuntime({
|
|
84
|
+
* provider: openai,
|
|
85
|
+
* model: 'gpt-4o',
|
|
86
|
+
* tools: [webSearch],
|
|
87
|
+
* });
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
declare function exaSearch(config: ExaSearchConfig): ToolDefinition<ExaSearchParams>;
|
|
91
|
+
|
|
92
|
+
export { type ExaSearchConfig, exaSearch };
|
|
@@ -0,0 +1,85 @@
|
|
|
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 { searchExa } from '../../chunk-MNDGIW47.js';
|
|
8
|
+
export { exaProvider } from '../../chunk-MNDGIW47.js';
|
|
9
|
+
import '../../chunk-VD74IPKB.js';
|
|
10
|
+
import '../../chunk-53UGJNHN.js';
|
|
11
|
+
import '../../chunk-RQ74USYU.js';
|
|
12
|
+
import '../../chunk-DGUM43GV.js';
|
|
13
|
+
|
|
14
|
+
// src/tools/exa/index.ts
|
|
15
|
+
function exaSearch(config) {
|
|
16
|
+
return {
|
|
17
|
+
name: "web_search",
|
|
18
|
+
description: `Search the web using Exa 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
|
+
searchDepth: {
|
|
42
|
+
type: "string",
|
|
43
|
+
enum: ["basic", "advanced"],
|
|
44
|
+
description: "Search depth - 'advanced' uses semantic search for better results"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
required: ["query"]
|
|
48
|
+
},
|
|
49
|
+
needsApproval: false,
|
|
50
|
+
aiResponseMode: "full",
|
|
51
|
+
handler: async (params) => {
|
|
52
|
+
try {
|
|
53
|
+
const response = await searchExa(
|
|
54
|
+
{
|
|
55
|
+
query: params.query,
|
|
56
|
+
maxResults: params.maxResults ?? config.maxResults ?? 5,
|
|
57
|
+
searchDepth: params.searchDepth ?? config.searchDepth ?? "basic"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
provider: "exa",
|
|
61
|
+
apiKey: config.apiKey,
|
|
62
|
+
includeDomains: config.includeDomains,
|
|
63
|
+
excludeDomains: config.excludeDomains,
|
|
64
|
+
includeRawContent: config.includeRawContent,
|
|
65
|
+
timeout: config.timeout
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
const aiContext = formatSearchResultsForAI(response);
|
|
69
|
+
return {
|
|
70
|
+
success: true,
|
|
71
|
+
message: summarizeSearchResults(response),
|
|
72
|
+
data: response,
|
|
73
|
+
_aiContext: aiContext
|
|
74
|
+
};
|
|
75
|
+
} catch (error) {
|
|
76
|
+
const errorMessage = error instanceof Error ? error.message : "Web search failed";
|
|
77
|
+
return failure(errorMessage);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { exaSearch };
|
|
84
|
+
//# sourceMappingURL=index.js.map
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/exa/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAsGO,SAAS,UACd,MAAA,EACiC;AACjC,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,SACX;AAAA,QACA,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,UAC1B,WAAA,EACE;AAAA;AACJ,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,SAAA;AAAA,UACxC;AAAA,YACE,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc,CAAA;AAAA,YACtD,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,IAAe;AAAA,WAC3D;AAAA,UACA;AAAA,YACE,QAAA,EAAU,KAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,YACvB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,YAC1B,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 * Exa Search Tool\n *\n * Tree-shakeable import for Exa web search provider.\n * Only imports Exa code - no other providers bundled.\n *\n * @example\n * ```typescript\n * import { exaSearch } from '@yourgpt/copilot-sdk/tools/exa';\n *\n * const webSearch = exaSearch({\n * apiKey: process.env.EXA_API_KEY,\n * });\n *\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n *\n * @see https://exa.ai/\n * @module @yourgpt/copilot-sdk/tools/exa\n */\n\nimport type { ToolDefinition } from \"../../core/types/tools\";\nimport { failure } from \"../../core/types/tools\";\nimport {\n searchExa,\n exaProvider,\n} from \"../../core/tools/webSearch/providers/exa\";\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 { exaProvider };\n\n/**\n * Exa search configuration\n */\nexport interface ExaSearchConfig {\n /** Exa API key - get one at https://exa.ai/ */\n apiKey: string;\n /** Maximum number of results (default: 5) */\n maxResults?: number;\n /** Search depth - 'advanced' uses autoprompt for better semantic search */\n searchDepth?: \"basic\" | \"advanced\";\n /** Only include results from these domains */\n includeDomains?: string[];\n /** Exclude results from these domains */\n excludeDomains?: string[];\n /** Include raw page content */\n includeRawContent?: boolean;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Search parameters passed to the tool\n */\ninterface ExaSearchParams {\n /** The search query */\n query: string;\n /** Maximum number of results (overrides config) */\n maxResults?: number;\n /** Search depth (overrides config) */\n searchDepth?: \"basic\" | \"advanced\";\n}\n\n/**\n * Create an Exa web search tool\n *\n * Exa (formerly Metaphor) is an AI-native search engine that understands\n * queries semantically for better results.\n *\n * @param config - Exa configuration including API key\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * import { exaSearch } from '@yourgpt/copilot-sdk/tools/exa';\n *\n * // Basic usage\n * const webSearch = exaSearch({\n * apiKey: process.env.EXA_API_KEY,\n * });\n *\n * // With semantic search (autoprompt)\n * const webSearch = exaSearch({\n * apiKey: process.env.EXA_API_KEY,\n * searchDepth: 'advanced',\n * maxResults: 10,\n * });\n *\n * const runtime = createRuntime({\n * provider: openai,\n * model: 'gpt-4o',\n * tools: [webSearch],\n * });\n * ```\n */\nexport function exaSearch(\n config: ExaSearchConfig,\n): ToolDefinition<ExaSearchParams> {\n return {\n name: \"web_search\",\n description: `Search the web using Exa 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 searchDepth: {\n type: \"string\",\n enum: [\"basic\", \"advanced\"],\n description:\n \"Search depth - 'advanced' uses semantic search for better results\",\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 searchExa(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n searchDepth: params.searchDepth ?? config.searchDepth ?? \"basic\",\n },\n {\n provider: \"exa\",\n apiKey: config.apiKey,\n includeDomains: config.includeDomains,\n excludeDomains: config.excludeDomains,\n includeRawContent: config.includeRawContent,\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,81 @@
|
|
|
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
|
+
require('../../chunk-GANCV72Z.cjs');
|
|
11
|
+
var chunkXWOHNY3F_cjs = require('../../chunk-XWOHNY3F.cjs');
|
|
12
|
+
require('../../chunk-TXLIY7GF.cjs');
|
|
13
|
+
require('../../chunk-JEQ2X3Z6.cjs');
|
|
14
|
+
|
|
15
|
+
// src/tools/google/index.ts
|
|
16
|
+
function googleSearch(config) {
|
|
17
|
+
return {
|
|
18
|
+
name: "web_search",
|
|
19
|
+
description: `Search the web using Google 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 chunkXWOHNY3F_cjs.searchGoogle(
|
|
50
|
+
{
|
|
51
|
+
query: params.query,
|
|
52
|
+
maxResults: params.maxResults ?? config.maxResults ?? 5
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
provider: "google",
|
|
56
|
+
apiKey: config.apiKey,
|
|
57
|
+
timeout: config.timeout
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
const aiContext = chunkASV6JLYG_cjs.formatSearchResultsForAI(response);
|
|
61
|
+
return {
|
|
62
|
+
success: true,
|
|
63
|
+
message: chunkASV6JLYG_cjs.summarizeSearchResults(response),
|
|
64
|
+
data: response,
|
|
65
|
+
_aiContext: aiContext
|
|
66
|
+
};
|
|
67
|
+
} catch (error) {
|
|
68
|
+
const errorMessage = error instanceof Error ? error.message : "Web search failed";
|
|
69
|
+
return chunkCEKAYA2Q_cjs.failure(errorMessage);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
Object.defineProperty(exports, "googleProvider", {
|
|
76
|
+
enumerable: true,
|
|
77
|
+
get: function () { return chunkXWOHNY3F_cjs.googleProvider; }
|
|
78
|
+
});
|
|
79
|
+
exports.googleSearch = googleSearch;
|
|
80
|
+
//# sourceMappingURL=index.cjs.map
|
|
81
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/tools/google/index.ts"],"names":["searchGoogle","formatSearchResultsForAI","summarizeSearchResults","failure"],"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,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,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 * 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,81 @@
|
|
|
1
|
+
import { T as ToolDefinition } from '../../tools-DDWrco4h.cjs';
|
|
2
|
+
export { g as googleProvider } from '../../google-CHU2yycE.cjs';
|
|
3
|
+
import '../../types-ZguuKEs_.cjs';
|
|
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 };
|