@google/gemini-cli-core 0.1.20 → 0.1.22
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 +27 -29
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/code_assist/converter.d.ts +1 -0
- package/dist/src/code_assist/converter.js +1 -0
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +1 -0
- package/dist/src/code_assist/oauth2.js +37 -20
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +51 -8
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +1 -1
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +47 -16
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +114 -8
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/config/config.d.ts +8 -3
- package/dist/src/config/config.js +25 -12
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +83 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/client.d.ts +7 -12
- package/dist/src/core/client.js +67 -30
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +354 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +19 -11
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +39 -15
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +6 -2
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +46 -65
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/logger.d.ts +22 -1
- package/dist/src/core/logger.js +103 -17
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +86 -20
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +79 -36
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +4 -4
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +7 -0
- package/dist/src/generated/git-commit.js +10 -0
- package/dist/src/generated/git-commit.js.map +1 -0
- package/dist/src/ide/constants.d.ts +6 -0
- package/dist/src/ide/constants.js +7 -0
- package/dist/src/ide/constants.js.map +1 -0
- package/dist/src/ide/detect-ide.d.ts +2 -0
- package/dist/src/ide/detect-ide.js +22 -6
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/detect-ide.test.d.ts +6 -0
- package/dist/src/ide/detect-ide.test.js +65 -0
- package/dist/src/ide/detect-ide.test.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +5 -1
- package/dist/src/ide/ide-client.js +57 -21
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-client.test.d.ts +6 -0
- package/dist/src/ide/ide-client.test.js +43 -0
- package/dist/src/ide/ide-client.test.js.map +1 -0
- package/dist/src/ide/ide-installer.js +5 -4
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/process-utils.d.ts +14 -0
- package/dist/src/ide/process-utils.js +57 -0
- package/dist/src/ide/process-utils.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +0 -1
- package/dist/src/mcp/oauth-provider.js +176 -59
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +132 -62
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +3 -1
- package/dist/src/mcp/oauth-utils.js +50 -12
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +17 -2
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +5 -5
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +13 -3
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +23 -4
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +84 -33
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +11 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +143 -29
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +8 -2
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +17 -9
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +1 -0
- package/dist/src/telemetry/constants.js +1 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/integration.test.circular.js +1 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +3 -1
- package/dist/src/telemetry/loggers.js +37 -4
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +27 -2
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +4 -0
- package/dist/src/telemetry/metrics.js +21 -8
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +31 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sdk.js +64 -36
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/sdk.test.d.ts +6 -0
- package/dist/src/telemetry/sdk.test.js +82 -0
- package/dist/src/telemetry/sdk.test.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +40 -14
- package/dist/src/telemetry/types.js +46 -23
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/tools.d.ts +21 -6
- package/dist/src/test-utils/tools.js +78 -13
- package/dist/src/test-utils/tools.js.map +1 -1
- package/dist/src/tools/edit.js +2 -2
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/glob.js +2 -2
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/grep.js +2 -2
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/ls.d.ts +3 -22
- package/dist/src/tools/ls.js +81 -77
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +62 -34
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +40 -10
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +31 -1
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +3 -5
- package/dist/src/tools/mcp-tool.js +62 -21
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +110 -51
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +9 -13
- package/dist/src/tools/memoryTool.js +124 -117
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +28 -17
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +2 -2
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +4 -5
- package/dist/src/tools/read-many-files.js +112 -100
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +60 -37
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +4 -6
- package/dist/src/tools/shell.js +116 -105
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +52 -46
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +1 -0
- package/dist/src/tools/tool-error.js +1 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +8 -3
- package/dist/src/tools/tool-registry.js +56 -30
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +28 -86
- package/dist/src/tools/tools.js +67 -122
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +91 -2
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/web-fetch.d.ts +4 -7
- package/dist/src/tools/web-fetch.js +62 -62
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +8 -4
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +4 -5
- package/dist/src/tools/web-search.js +51 -50
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.d.ts +6 -0
- package/dist/src/tools/web-search.test.js +139 -0
- package/dist/src/tools/web-search.test.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +15 -10
- package/dist/src/tools/write-file.js +133 -141
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +57 -88
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/browser.js +4 -3
- package/dist/src/utils/browser.js.map +1 -1
- package/dist/src/utils/editCorrector.js +13 -13
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editor.js +1 -1
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +10 -10
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/errorParsing.d.ts +8 -0
- package/dist/src/utils/errorParsing.js +93 -0
- package/dist/src/utils/errorParsing.js.map +1 -0
- package/dist/src/utils/errorParsing.test.d.ts +6 -0
- package/dist/src/utils/errorParsing.test.js +172 -0
- package/dist/src/utils/errorParsing.test.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.d.ts +15 -0
- package/dist/src/utils/filesearch/crawler.js +50 -0
- package/dist/src/utils/filesearch/crawler.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawler.test.js +468 -0
- package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +9 -53
- package/dist/src/utils/filesearch/fileSearch.js +63 -118
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +95 -197
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.d.ts +7 -0
- package/dist/src/utils/filesearch/ignore.js +25 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.test.js +89 -2
- package/dist/src/utils/filesearch/ignore.test.js.map +1 -1
- package/dist/src/utils/filesearch/result-cache.d.ts +1 -2
- package/dist/src/utils/filesearch/result-cache.js +1 -3
- package/dist/src/utils/filesearch/result-cache.js.map +1 -1
- package/dist/src/utils/filesearch/result-cache.test.js +3 -4
- package/dist/src/utils/filesearch/result-cache.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +3 -3
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +3 -2
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +3 -7
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js +17 -20
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +7 -0
- package/dist/src/utils/paths.js +15 -0
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +74 -2
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.d.ts +1 -5
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/secure-browser-launcher.js +4 -3
- package/dist/src/utils/secure-browser-launcher.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +39 -0
- package/dist/src/utils/shell-utils.js +72 -2
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +132 -4
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +1 -1
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/systemEncoding.test.js +23 -23
- package/dist/src/utils/systemEncoding.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +22 -7
- package/dist/src/utils/workspaceContext.js +81 -55
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +221 -137
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -2
- package/dist/src/core/modelCheck.d.ts +0 -14
- package/dist/src/core/modelCheck.js +0 -62
- package/dist/src/core/modelCheck.js.map +0 -1
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { SchemaValidator } from '../utils/schemaValidator.js';
|
|
7
|
-
import {
|
|
7
|
+
import { BaseDeclarativeTool, BaseToolInvocation, Kind, ToolConfirmationOutcome, } from './tools.js';
|
|
8
8
|
import { getErrorMessage } from '../utils/errors.js';
|
|
9
9
|
import { ApprovalMode } from '../config/config.js';
|
|
10
10
|
import { getResponseText } from '../utils/generateContentResponseUtilities.js';
|
|
@@ -18,31 +18,14 @@ function extractUrls(text) {
|
|
|
18
18
|
const urlRegex = /(https?:\/\/[^\s]+)/g;
|
|
19
19
|
return text.match(urlRegex) || [];
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
* Implementation of the WebFetch tool logic
|
|
23
|
-
*/
|
|
24
|
-
export class WebFetchTool extends BaseTool {
|
|
21
|
+
class WebFetchToolInvocation extends BaseToolInvocation {
|
|
25
22
|
config;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
super(WebFetchTool.Name, 'WebFetch', "Processes content from URL(s), including local and private network addresses (e.g., localhost), embedded in a prompt. Include up to 20 URLs and instructions (e.g., summarize, extract specific data) directly in the 'prompt' parameter.", Icon.Globe, {
|
|
29
|
-
properties: {
|
|
30
|
-
prompt: {
|
|
31
|
-
description: 'A comprehensive prompt that includes the URL(s) (up to 20) to fetch and specific instructions on how to process their content (e.g., "Summarize https://example.com/article and extract key points from https://another.com/data"). Must contain as least one URL starting with http:// or https://.',
|
|
32
|
-
type: 'string',
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
required: ['prompt'],
|
|
36
|
-
type: 'object',
|
|
37
|
-
});
|
|
23
|
+
constructor(config, params) {
|
|
24
|
+
super(params);
|
|
38
25
|
this.config = config;
|
|
39
|
-
const proxy = config.getProxy();
|
|
40
|
-
if (proxy) {
|
|
41
|
-
setGlobalDispatcher(new ProxyAgent(proxy));
|
|
42
|
-
}
|
|
43
26
|
}
|
|
44
|
-
async executeFallback(
|
|
45
|
-
const urls = extractUrls(params.prompt);
|
|
27
|
+
async executeFallback(signal) {
|
|
28
|
+
const urls = extractUrls(this.params.prompt);
|
|
46
29
|
if (urls.length === 0) {
|
|
47
30
|
return {
|
|
48
31
|
llmContent: 'Error: No URL found in the prompt for fallback.',
|
|
@@ -71,13 +54,14 @@ export class WebFetchTool extends BaseTool {
|
|
|
71
54
|
],
|
|
72
55
|
}).substring(0, MAX_CONTENT_LENGTH);
|
|
73
56
|
const geminiClient = this.config.getGeminiClient();
|
|
74
|
-
const fallbackPrompt = `The user requested the following: "${params.prompt}".
|
|
57
|
+
const fallbackPrompt = `The user requested the following: "${this.params.prompt}".
|
|
75
58
|
|
|
76
|
-
I was unable to access the URL directly. Instead, I have fetched the raw content of the page. Please use the following content to answer the
|
|
59
|
+
I was unable to access the URL directly. Instead, I have fetched the raw content of the page. Please use the following content to answer the request. Do not attempt to access the URL again.
|
|
77
60
|
|
|
78
61
|
---
|
|
79
62
|
${textContent}
|
|
80
|
-
|
|
63
|
+
---
|
|
64
|
+
`;
|
|
81
65
|
const result = await geminiClient.generateContent([{ role: 'user', parts: [{ text: fallbackPrompt }] }], {}, signal);
|
|
82
66
|
const resultText = getResponseText(result) || '';
|
|
83
67
|
return {
|
|
@@ -94,37 +78,19 @@ ${textContent}
|
|
|
94
78
|
};
|
|
95
79
|
}
|
|
96
80
|
}
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
if (!params.prompt || params.prompt.trim() === '') {
|
|
103
|
-
return "The 'prompt' parameter cannot be empty and must contain URL(s) and instructions.";
|
|
104
|
-
}
|
|
105
|
-
if (!params.prompt.includes('http://') &&
|
|
106
|
-
!params.prompt.includes('https://')) {
|
|
107
|
-
return "The 'prompt' must contain at least one valid URL (starting with http:// or https://).";
|
|
108
|
-
}
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
getDescription(params) {
|
|
112
|
-
const displayPrompt = params.prompt.length > 100
|
|
113
|
-
? params.prompt.substring(0, 97) + '...'
|
|
114
|
-
: params.prompt;
|
|
81
|
+
getDescription() {
|
|
82
|
+
const displayPrompt = this.params.prompt.length > 100
|
|
83
|
+
? this.params.prompt.substring(0, 97) + '...'
|
|
84
|
+
: this.params.prompt;
|
|
115
85
|
return `Processing URLs and instructions from prompt: "${displayPrompt}"`;
|
|
116
86
|
}
|
|
117
|
-
async shouldConfirmExecute(
|
|
87
|
+
async shouldConfirmExecute() {
|
|
118
88
|
if (this.config.getApprovalMode() === ApprovalMode.AUTO_EDIT) {
|
|
119
89
|
return false;
|
|
120
90
|
}
|
|
121
|
-
const validationError = this.validateParams(params);
|
|
122
|
-
if (validationError) {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
91
|
// Perform GitHub URL conversion here to differentiate between user-provided
|
|
126
92
|
// URL and the actual URL to be fetched.
|
|
127
|
-
const urls = extractUrls(params.prompt).map((url) => {
|
|
93
|
+
const urls = extractUrls(this.params.prompt).map((url) => {
|
|
128
94
|
if (url.includes('github.com') && url.includes('/blob/')) {
|
|
129
95
|
return url
|
|
130
96
|
.replace('github.com', 'raw.githubusercontent.com')
|
|
@@ -135,7 +101,7 @@ ${textContent}
|
|
|
135
101
|
const confirmationDetails = {
|
|
136
102
|
type: 'info',
|
|
137
103
|
title: `Confirm Web Fetch`,
|
|
138
|
-
prompt: params.prompt,
|
|
104
|
+
prompt: this.params.prompt,
|
|
139
105
|
urls,
|
|
140
106
|
onConfirm: async (outcome) => {
|
|
141
107
|
if (outcome === ToolConfirmationOutcome.ProceedAlways) {
|
|
@@ -145,20 +111,13 @@ ${textContent}
|
|
|
145
111
|
};
|
|
146
112
|
return confirmationDetails;
|
|
147
113
|
}
|
|
148
|
-
async execute(
|
|
149
|
-
const
|
|
150
|
-
if (validationError) {
|
|
151
|
-
return {
|
|
152
|
-
llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
|
|
153
|
-
returnDisplay: validationError,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
const userPrompt = params.prompt;
|
|
114
|
+
async execute(signal) {
|
|
115
|
+
const userPrompt = this.params.prompt;
|
|
157
116
|
const urls = extractUrls(userPrompt);
|
|
158
117
|
const url = urls[0];
|
|
159
118
|
const isPrivate = isPrivateIp(url);
|
|
160
119
|
if (isPrivate) {
|
|
161
|
-
return this.executeFallback(
|
|
120
|
+
return this.executeFallback(signal);
|
|
162
121
|
}
|
|
163
122
|
const geminiClient = this.config.getGeminiClient();
|
|
164
123
|
try {
|
|
@@ -189,7 +148,7 @@ ${textContent}
|
|
|
189
148
|
processingError = true;
|
|
190
149
|
}
|
|
191
150
|
if (processingError) {
|
|
192
|
-
return this.executeFallback(
|
|
151
|
+
return this.executeFallback(signal);
|
|
193
152
|
}
|
|
194
153
|
const sourceListFormatted = [];
|
|
195
154
|
if (sources && sources.length > 0) {
|
|
@@ -242,4 +201,45 @@ ${sourceListFormatted.join('\n')}`;
|
|
|
242
201
|
}
|
|
243
202
|
}
|
|
244
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Implementation of the WebFetch tool logic
|
|
206
|
+
*/
|
|
207
|
+
export class WebFetchTool extends BaseDeclarativeTool {
|
|
208
|
+
config;
|
|
209
|
+
static Name = 'web_fetch';
|
|
210
|
+
constructor(config) {
|
|
211
|
+
super(WebFetchTool.Name, 'WebFetch', "Processes content from URL(s), including local and private network addresses (e.g., localhost), embedded in a prompt. Include up to 20 URLs and instructions (e.g., summarize, extract specific data) directly in the 'prompt' parameter.", Kind.Fetch, {
|
|
212
|
+
properties: {
|
|
213
|
+
prompt: {
|
|
214
|
+
description: 'A comprehensive prompt that includes the URL(s) (up to 20) to fetch and specific instructions on how to process their content (e.g., "Summarize https://example.com/article and extract key points from https://another.com/data"). Must contain as least one URL starting with http:// or https://.',
|
|
215
|
+
type: 'string',
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
required: ['prompt'],
|
|
219
|
+
type: 'object',
|
|
220
|
+
});
|
|
221
|
+
this.config = config;
|
|
222
|
+
const proxy = config.getProxy();
|
|
223
|
+
if (proxy) {
|
|
224
|
+
setGlobalDispatcher(new ProxyAgent(proxy));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
validateToolParams(params) {
|
|
228
|
+
const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
|
|
229
|
+
if (errors) {
|
|
230
|
+
return errors;
|
|
231
|
+
}
|
|
232
|
+
if (!params.prompt || params.prompt.trim() === '') {
|
|
233
|
+
return "The 'prompt' parameter cannot be empty and must contain URL(s) and instructions.";
|
|
234
|
+
}
|
|
235
|
+
if (!params.prompt.includes('http://') &&
|
|
236
|
+
!params.prompt.includes('https://')) {
|
|
237
|
+
return "The 'prompt' must contain at least one valid URL (starting with http:// or https://).";
|
|
238
|
+
}
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
createInvocation(params) {
|
|
242
|
+
return new WebFetchToolInvocation(this.config, params);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
245
|
//# sourceMappingURL=web-fetch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../../src/tools/web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,8 @@ describe('WebFetchTool', () => {
|
|
|
17
17
|
it('should return confirmation details with the correct prompt and urls', async () => {
|
|
18
18
|
const tool = new WebFetchTool(mockConfig);
|
|
19
19
|
const params = { prompt: 'fetch https://example.com' };
|
|
20
|
-
const
|
|
20
|
+
const invocation = tool.build(params);
|
|
21
|
+
const confirmationDetails = await invocation.shouldConfirmExecute(new AbortController().signal);
|
|
21
22
|
expect(confirmationDetails).toEqual({
|
|
22
23
|
type: 'info',
|
|
23
24
|
title: 'Confirm Web Fetch',
|
|
@@ -31,7 +32,8 @@ describe('WebFetchTool', () => {
|
|
|
31
32
|
const params = {
|
|
32
33
|
prompt: 'fetch https://github.com/google/gemini-react/blob/main/README.md',
|
|
33
34
|
};
|
|
34
|
-
const
|
|
35
|
+
const invocation = tool.build(params);
|
|
36
|
+
const confirmationDetails = await invocation.shouldConfirmExecute(new AbortController().signal);
|
|
35
37
|
expect(confirmationDetails).toEqual({
|
|
36
38
|
type: 'info',
|
|
37
39
|
title: 'Confirm Web Fetch',
|
|
@@ -48,7 +50,8 @@ describe('WebFetchTool', () => {
|
|
|
48
50
|
getApprovalMode: () => ApprovalMode.AUTO_EDIT,
|
|
49
51
|
});
|
|
50
52
|
const params = { prompt: 'fetch https://example.com' };
|
|
51
|
-
const
|
|
53
|
+
const invocation = tool.build(params);
|
|
54
|
+
const confirmationDetails = await invocation.shouldConfirmExecute(new AbortController().signal);
|
|
52
55
|
expect(confirmationDetails).toBe(false);
|
|
53
56
|
});
|
|
54
57
|
it('should call setApprovalMode when onConfirm is called with ProceedAlways', async () => {
|
|
@@ -58,7 +61,8 @@ describe('WebFetchTool', () => {
|
|
|
58
61
|
setApprovalMode,
|
|
59
62
|
});
|
|
60
63
|
const params = { prompt: 'fetch https://example.com' };
|
|
61
|
-
const
|
|
64
|
+
const invocation = tool.build(params);
|
|
65
|
+
const confirmationDetails = await invocation.shouldConfirmExecute(new AbortController().signal);
|
|
62
66
|
if (confirmationDetails &&
|
|
63
67
|
typeof confirmationDetails === 'object' &&
|
|
64
68
|
'onConfirm' in confirmationDetails) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.test.js","sourceRoot":"","sources":["../../../src/tools/web-fetch.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAU,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,MAAM,UAAU,GAAG;QACjB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;QACxB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;QACxB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;KACG,CAAC;IAEvB,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;YACvD,MAAM,mBAAmB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"web-fetch.test.js","sourceRoot":"","sources":["../../../src/tools/web-fetch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { GroundingMetadata } from '@google/genai';
|
|
7
|
-
import {
|
|
7
|
+
import { BaseDeclarativeTool, ToolInvocation, ToolResult } from './tools.js';
|
|
8
8
|
import { Config } from '../config/config.js';
|
|
9
9
|
interface GroundingChunkWeb {
|
|
10
10
|
uri?: string;
|
|
@@ -33,7 +33,7 @@ export interface WebSearchToolResult extends ToolResult {
|
|
|
33
33
|
/**
|
|
34
34
|
* A tool to perform web searches using Google Search via the Gemini API.
|
|
35
35
|
*/
|
|
36
|
-
export declare class WebSearchTool extends
|
|
36
|
+
export declare class WebSearchTool extends BaseDeclarativeTool<WebSearchToolParams, WebSearchToolResult> {
|
|
37
37
|
private readonly config;
|
|
38
38
|
static readonly Name: string;
|
|
39
39
|
constructor(config: Config);
|
|
@@ -42,8 +42,7 @@ export declare class WebSearchTool extends BaseTool<WebSearchToolParams, WebSear
|
|
|
42
42
|
* @param params The parameters to validate
|
|
43
43
|
* @returns An error message string if validation fails, null if valid
|
|
44
44
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
execute(params: WebSearchToolParams, signal: AbortSignal): Promise<WebSearchToolResult>;
|
|
45
|
+
protected validateToolParams(params: WebSearchToolParams): string | null;
|
|
46
|
+
protected createInvocation(params: WebSearchToolParams): ToolInvocation<WebSearchToolParams, WebSearchToolResult>;
|
|
48
47
|
}
|
|
49
48
|
export {};
|
|
@@ -3,66 +3,30 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import { Type } from '@google/genai';
|
|
6
|
+
import { BaseDeclarativeTool, BaseToolInvocation, Kind, } from './tools.js';
|
|
8
7
|
import { SchemaValidator } from '../utils/schemaValidator.js';
|
|
9
8
|
import { getErrorMessage } from '../utils/errors.js';
|
|
10
9
|
import { getResponseText } from '../utils/generateContentResponseUtilities.js';
|
|
11
|
-
|
|
12
|
-
* A tool to perform web searches using Google Search via the Gemini API.
|
|
13
|
-
*/
|
|
14
|
-
export class WebSearchTool extends BaseTool {
|
|
10
|
+
class WebSearchToolInvocation extends BaseToolInvocation {
|
|
15
11
|
config;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
super(WebSearchTool.Name, 'GoogleSearch', 'Performs a web search using Google Search (via the Gemini API) and returns the results. This tool is useful for finding information on the internet based on a query.', Icon.Globe, {
|
|
19
|
-
type: Type.OBJECT,
|
|
20
|
-
properties: {
|
|
21
|
-
query: {
|
|
22
|
-
type: Type.STRING,
|
|
23
|
-
description: 'The search query to find information on the web.',
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
required: ['query'],
|
|
27
|
-
});
|
|
12
|
+
constructor(config, params) {
|
|
13
|
+
super(params);
|
|
28
14
|
this.config = config;
|
|
29
15
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
* @param params The parameters to validate
|
|
33
|
-
* @returns An error message string if validation fails, null if valid
|
|
34
|
-
*/
|
|
35
|
-
validateParams(params) {
|
|
36
|
-
const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
|
|
37
|
-
if (errors) {
|
|
38
|
-
return errors;
|
|
39
|
-
}
|
|
40
|
-
if (!params.query || params.query.trim() === '') {
|
|
41
|
-
return "The 'query' parameter cannot be empty.";
|
|
42
|
-
}
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
getDescription(params) {
|
|
46
|
-
return `Searching the web for: "${params.query}"`;
|
|
16
|
+
getDescription() {
|
|
17
|
+
return `Searching the web for: "${this.params.query}"`;
|
|
47
18
|
}
|
|
48
|
-
async execute(
|
|
49
|
-
const validationError = this.validateToolParams(params);
|
|
50
|
-
if (validationError) {
|
|
51
|
-
return {
|
|
52
|
-
llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
|
|
53
|
-
returnDisplay: validationError,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
19
|
+
async execute(signal) {
|
|
56
20
|
const geminiClient = this.config.getGeminiClient();
|
|
57
21
|
try {
|
|
58
|
-
const response = await geminiClient.generateContent([{ role: 'user', parts: [{ text: params.query }] }], { tools: [{ googleSearch: {} }] }, signal);
|
|
22
|
+
const response = await geminiClient.generateContent([{ role: 'user', parts: [{ text: this.params.query }] }], { tools: [{ googleSearch: {} }] }, signal);
|
|
59
23
|
const responseText = getResponseText(response);
|
|
60
24
|
const groundingMetadata = response.candidates?.[0]?.groundingMetadata;
|
|
61
25
|
const sources = groundingMetadata?.groundingChunks;
|
|
62
26
|
const groundingSupports = groundingMetadata?.groundingSupports;
|
|
63
27
|
if (!responseText || !responseText.trim()) {
|
|
64
28
|
return {
|
|
65
|
-
llmContent: `No search results or information found for query: "${params.query}"`,
|
|
29
|
+
llmContent: `No search results or information found for query: "${this.params.query}"`,
|
|
66
30
|
returnDisplay: 'No information found.',
|
|
67
31
|
};
|
|
68
32
|
}
|
|
@@ -91,24 +55,23 @@ export class WebSearchTool extends BaseTool {
|
|
|
91
55
|
insertions.sort((a, b) => b.index - a.index);
|
|
92
56
|
const responseChars = modifiedResponseText.split(''); // Use new variable
|
|
93
57
|
insertions.forEach((insertion) => {
|
|
94
|
-
// Fixed arrow function syntax
|
|
95
58
|
responseChars.splice(insertion.index, 0, insertion.marker);
|
|
96
59
|
});
|
|
97
60
|
modifiedResponseText = responseChars.join(''); // Assign back to modifiedResponseText
|
|
98
61
|
}
|
|
99
62
|
if (sourceListFormatted.length > 0) {
|
|
100
63
|
modifiedResponseText +=
|
|
101
|
-
'\n\nSources:\n' + sourceListFormatted.join('\n');
|
|
64
|
+
'\n\nSources:\n' + sourceListFormatted.join('\n');
|
|
102
65
|
}
|
|
103
66
|
}
|
|
104
67
|
return {
|
|
105
|
-
llmContent: `Web search results for "${params.query}":\n\n${modifiedResponseText}`,
|
|
106
|
-
returnDisplay: `Search results for "${params.query}" returned.`,
|
|
68
|
+
llmContent: `Web search results for "${this.params.query}":\n\n${modifiedResponseText}`,
|
|
69
|
+
returnDisplay: `Search results for "${this.params.query}" returned.`,
|
|
107
70
|
sources,
|
|
108
71
|
};
|
|
109
72
|
}
|
|
110
73
|
catch (error) {
|
|
111
|
-
const errorMessage = `Error during web search for query "${params.query}": ${getErrorMessage(error)}`;
|
|
74
|
+
const errorMessage = `Error during web search for query "${this.params.query}": ${getErrorMessage(error)}`;
|
|
112
75
|
console.error(errorMessage, error);
|
|
113
76
|
return {
|
|
114
77
|
llmContent: `Error: ${errorMessage}`,
|
|
@@ -117,4 +80,42 @@ export class WebSearchTool extends BaseTool {
|
|
|
117
80
|
}
|
|
118
81
|
}
|
|
119
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* A tool to perform web searches using Google Search via the Gemini API.
|
|
85
|
+
*/
|
|
86
|
+
export class WebSearchTool extends BaseDeclarativeTool {
|
|
87
|
+
config;
|
|
88
|
+
static Name = 'google_web_search';
|
|
89
|
+
constructor(config) {
|
|
90
|
+
super(WebSearchTool.Name, 'GoogleSearch', 'Performs a web search using Google Search (via the Gemini API) and returns the results. This tool is useful for finding information on the internet based on a query.', Kind.Search, {
|
|
91
|
+
type: 'object',
|
|
92
|
+
properties: {
|
|
93
|
+
query: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: 'The search query to find information on the web.',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
required: ['query'],
|
|
99
|
+
});
|
|
100
|
+
this.config = config;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Validates the parameters for the WebSearchTool.
|
|
104
|
+
* @param params The parameters to validate
|
|
105
|
+
* @returns An error message string if validation fails, null if valid
|
|
106
|
+
*/
|
|
107
|
+
validateToolParams(params) {
|
|
108
|
+
const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
|
|
109
|
+
if (errors) {
|
|
110
|
+
return errors;
|
|
111
|
+
}
|
|
112
|
+
if (!params.query || params.query.trim() === '') {
|
|
113
|
+
return "The 'query' parameter cannot be empty.";
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
createInvocation(params) {
|
|
118
|
+
return new WebSearchToolInvocation(this.config, params);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
120
121
|
//# sourceMappingURL=web-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../../src/tools/web-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { WebSearchTool } from './web-search.js';
|
|
8
|
+
import { GeminiClient } from '../core/client.js';
|
|
9
|
+
// Mock GeminiClient and Config constructor
|
|
10
|
+
vi.mock('../core/client.js');
|
|
11
|
+
vi.mock('../config/config.js');
|
|
12
|
+
describe('WebSearchTool', () => {
|
|
13
|
+
const abortSignal = new AbortController().signal;
|
|
14
|
+
let mockGeminiClient;
|
|
15
|
+
let tool;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
const mockConfigInstance = {
|
|
18
|
+
getGeminiClient: () => mockGeminiClient,
|
|
19
|
+
getProxy: () => undefined,
|
|
20
|
+
};
|
|
21
|
+
mockGeminiClient = new GeminiClient(mockConfigInstance);
|
|
22
|
+
tool = new WebSearchTool(mockConfigInstance);
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
vi.restoreAllMocks();
|
|
26
|
+
});
|
|
27
|
+
describe('build', () => {
|
|
28
|
+
it('should return an invocation for a valid query', () => {
|
|
29
|
+
const params = { query: 'test query' };
|
|
30
|
+
const invocation = tool.build(params);
|
|
31
|
+
expect(invocation).toBeDefined();
|
|
32
|
+
expect(invocation.params).toEqual(params);
|
|
33
|
+
});
|
|
34
|
+
it('should throw an error for an empty query', () => {
|
|
35
|
+
const params = { query: '' };
|
|
36
|
+
expect(() => tool.build(params)).toThrow("The 'query' parameter cannot be empty.");
|
|
37
|
+
});
|
|
38
|
+
it('should throw an error for a query with only whitespace', () => {
|
|
39
|
+
const params = { query: ' ' };
|
|
40
|
+
expect(() => tool.build(params)).toThrow("The 'query' parameter cannot be empty.");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('getDescription', () => {
|
|
44
|
+
it('should return a description of the search', () => {
|
|
45
|
+
const params = { query: 'test query' };
|
|
46
|
+
const invocation = tool.build(params);
|
|
47
|
+
expect(invocation.getDescription()).toBe('Searching the web for: "test query"');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('execute', () => {
|
|
51
|
+
it('should return search results for a successful query', async () => {
|
|
52
|
+
const params = { query: 'successful query' };
|
|
53
|
+
mockGeminiClient.generateContent.mockResolvedValue({
|
|
54
|
+
candidates: [
|
|
55
|
+
{
|
|
56
|
+
content: {
|
|
57
|
+
role: 'model',
|
|
58
|
+
parts: [{ text: 'Here are your results.' }],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
const invocation = tool.build(params);
|
|
64
|
+
const result = await invocation.execute(abortSignal);
|
|
65
|
+
expect(result.llmContent).toBe('Web search results for "successful query":\n\nHere are your results.');
|
|
66
|
+
expect(result.returnDisplay).toBe('Search results for "successful query" returned.');
|
|
67
|
+
expect(result.sources).toBeUndefined();
|
|
68
|
+
});
|
|
69
|
+
it('should handle no search results found', async () => {
|
|
70
|
+
const params = { query: 'no results query' };
|
|
71
|
+
mockGeminiClient.generateContent.mockResolvedValue({
|
|
72
|
+
candidates: [
|
|
73
|
+
{
|
|
74
|
+
content: {
|
|
75
|
+
role: 'model',
|
|
76
|
+
parts: [{ text: '' }],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
const invocation = tool.build(params);
|
|
82
|
+
const result = await invocation.execute(abortSignal);
|
|
83
|
+
expect(result.llmContent).toBe('No search results or information found for query: "no results query"');
|
|
84
|
+
expect(result.returnDisplay).toBe('No information found.');
|
|
85
|
+
});
|
|
86
|
+
it('should handle API errors gracefully', async () => {
|
|
87
|
+
const params = { query: 'error query' };
|
|
88
|
+
const testError = new Error('API Failure');
|
|
89
|
+
mockGeminiClient.generateContent.mockRejectedValue(testError);
|
|
90
|
+
const invocation = tool.build(params);
|
|
91
|
+
const result = await invocation.execute(abortSignal);
|
|
92
|
+
expect(result.llmContent).toContain('Error:');
|
|
93
|
+
expect(result.llmContent).toContain('API Failure');
|
|
94
|
+
expect(result.returnDisplay).toBe('Error performing web search.');
|
|
95
|
+
});
|
|
96
|
+
it('should correctly format results with sources and citations', async () => {
|
|
97
|
+
const params = { query: 'grounding query' };
|
|
98
|
+
mockGeminiClient.generateContent.mockResolvedValue({
|
|
99
|
+
candidates: [
|
|
100
|
+
{
|
|
101
|
+
content: {
|
|
102
|
+
role: 'model',
|
|
103
|
+
parts: [{ text: 'This is a test response.' }],
|
|
104
|
+
},
|
|
105
|
+
groundingMetadata: {
|
|
106
|
+
groundingChunks: [
|
|
107
|
+
{ web: { uri: 'https://example.com', title: 'Example Site' } },
|
|
108
|
+
{ web: { uri: 'https://google.com', title: 'Google' } },
|
|
109
|
+
],
|
|
110
|
+
groundingSupports: [
|
|
111
|
+
{
|
|
112
|
+
segment: { startIndex: 5, endIndex: 14 },
|
|
113
|
+
groundingChunkIndices: [0],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
segment: { startIndex: 15, endIndex: 24 },
|
|
117
|
+
groundingChunkIndices: [0, 1],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
});
|
|
124
|
+
const invocation = tool.build(params);
|
|
125
|
+
const result = await invocation.execute(abortSignal);
|
|
126
|
+
const expectedLlmContent = `Web search results for "grounding query":
|
|
127
|
+
|
|
128
|
+
This is a test[1] response.[1][2]
|
|
129
|
+
|
|
130
|
+
Sources:
|
|
131
|
+
[1] Example Site (https://example.com)
|
|
132
|
+
[2] Google (https://google.com)`;
|
|
133
|
+
expect(result.llmContent).toBe(expectedLlmContent);
|
|
134
|
+
expect(result.returnDisplay).toBe('Search results for "grounding query" returned.');
|
|
135
|
+
expect(result.sources).toHaveLength(2);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=web-search.test.js.map
|