mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-12 12:54:07 -07:00
refactor: optimize shell tool description and instructions
This commit is contained in:
@@ -1,69 +1,9 @@
|
|||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
exports[`ShellTool > getDescription > should return the non-windows description when not on windows 1`] = `
|
exports[`ShellTool > getDescription > should return the non-windows description when not on windows 1`] = `"This tool executes a given shell command as \`bash -c <command>\`."`;
|
||||||
"This tool executes a given shell command as \`bash -c <command>\`. Command can start background processes using \`&\`. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.
|
|
||||||
|
|
||||||
Efficiency Guidelines:
|
exports[`ShellTool > getDescription > should return the windows description when on windows 1`] = `"This tool executes a given shell command as \`powershell.exe -NoProfile -Command <command>\`."`;
|
||||||
- Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
|
|
||||||
- Pagination: Always disable terminal pagination to ensure commands terminate (e.g., use \`git --no-pager\`, \`systemctl --no-pager\`, or set \`PAGER=cat\`).
|
|
||||||
|
|
||||||
The following information is returned:
|
exports[`ShellTool > getSchema > should return the base schema when no modelId is provided 1`] = `"This tool executes a given shell command as \`bash -c <command>\`."`;
|
||||||
|
|
||||||
Output: Combined stdout/stderr. Can be \`(empty)\` or partial on error and for any unwaited background processes.
|
exports[`ShellTool > getSchema > should return the schema from the resolver when modelId is provided 1`] = `"This tool executes a given shell command as \`bash -c <command>\`."`;
|
||||||
Exit Code: Only included if non-zero (command failed).
|
|
||||||
Error: Only included if a process-level error occurred (e.g., spawn failure).
|
|
||||||
Signal: Only included if process was terminated by a signal.
|
|
||||||
Background PIDs: Only included if background processes were started.
|
|
||||||
Process Group PGID: Only included if available."
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`ShellTool > getDescription > should return the windows description when on windows 1`] = `
|
|
||||||
"This tool executes a given shell command as \`powershell.exe -NoProfile -Command <command>\`. Command can start background processes using PowerShell constructs such as \`Start-Process -NoNewWindow\` or \`Start-Job\`.
|
|
||||||
|
|
||||||
Efficiency Guidelines:
|
|
||||||
- Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
|
|
||||||
- Pagination: Always disable terminal pagination to ensure commands terminate (e.g., use \`git --no-pager\`, \`systemctl --no-pager\`, or set \`PAGER=cat\`).
|
|
||||||
|
|
||||||
The following information is returned:
|
|
||||||
|
|
||||||
Output: Combined stdout/stderr. Can be \`(empty)\` or partial on error and for any unwaited background processes.
|
|
||||||
Exit Code: Only included if non-zero (command failed).
|
|
||||||
Error: Only included if a process-level error occurred (e.g., spawn failure).
|
|
||||||
Signal: Only included if process was terminated by a signal.
|
|
||||||
Background PIDs: Only included if background processes were started.
|
|
||||||
Process Group PGID: Only included if available."
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`ShellTool > getSchema > should return the base schema when no modelId is provided 1`] = `
|
|
||||||
"This tool executes a given shell command as \`bash -c <command>\`. Command can start background processes using \`&\`. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.
|
|
||||||
|
|
||||||
Efficiency Guidelines:
|
|
||||||
- Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
|
|
||||||
- Pagination: Always disable terminal pagination to ensure commands terminate (e.g., use \`git --no-pager\`, \`systemctl --no-pager\`, or set \`PAGER=cat\`).
|
|
||||||
|
|
||||||
The following information is returned:
|
|
||||||
|
|
||||||
Output: Combined stdout/stderr. Can be \`(empty)\` or partial on error and for any unwaited background processes.
|
|
||||||
Exit Code: Only included if non-zero (command failed).
|
|
||||||
Error: Only included if a process-level error occurred (e.g., spawn failure).
|
|
||||||
Signal: Only included if process was terminated by a signal.
|
|
||||||
Background PIDs: Only included if background processes were started.
|
|
||||||
Process Group PGID: Only included if available."
|
|
||||||
`;
|
|
||||||
|
|
||||||
exports[`ShellTool > getSchema > should return the schema from the resolver when modelId is provided 1`] = `
|
|
||||||
"This tool executes a given shell command as \`bash -c <command>\`. Command can start background processes using \`&\`. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.
|
|
||||||
|
|
||||||
Efficiency Guidelines:
|
|
||||||
- Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
|
|
||||||
- Pagination: Always disable terminal pagination to ensure commands terminate (e.g., use \`git --no-pager\`, \`systemctl --no-pager\`, or set \`PAGER=cat\`).
|
|
||||||
|
|
||||||
The following information is returned:
|
|
||||||
|
|
||||||
Output: Combined stdout/stderr. Can be \`(empty)\` or partial on error and for any unwaited background processes.
|
|
||||||
Exit Code: Only included if non-zero (command failed).
|
|
||||||
Error: Only included if a process-level error occurred (e.g., spawn failure).
|
|
||||||
Signal: Only included if process was terminated by a signal.
|
|
||||||
Background PIDs: Only included if background processes were started.
|
|
||||||
Process Group PGID: Only included if available."
|
|
||||||
`;
|
|
||||||
|
|||||||
+4
-2
@@ -568,7 +568,8 @@ A good instruction should concisely answer:
|
|||||||
|
|
||||||
exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: run_shell_command 1`] = `
|
exports[`coreTools snapshots for specific models > Model: gemini-2.5-pro > snapshot for tool: run_shell_command 1`] = `
|
||||||
{
|
{
|
||||||
"description": "This tool executes a given shell command as \`bash -c <command>\`. To run a command in the background, set the \`is_background\` parameter to true. Do NOT use \`&\` to background commands. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.
|
"description": "This tool executes a given shell command as \`bash -c <command>\`.",
|
||||||
|
"instructions": "To run a command in the background, set the \`is_background\` parameter to true. Do NOT use \`&\` to background commands. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.
|
||||||
|
|
||||||
Efficiency Guidelines:
|
Efficiency Guidelines:
|
||||||
- Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
|
- Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
|
||||||
@@ -1357,7 +1358,8 @@ A good instruction should concisely answer:
|
|||||||
|
|
||||||
exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: run_shell_command 1`] = `
|
exports[`coreTools snapshots for specific models > Model: gemini-3-pro-preview > snapshot for tool: run_shell_command 1`] = `
|
||||||
{
|
{
|
||||||
"description": "This tool executes a given shell command as \`bash -c <command>\`. To run a command in the background, set the \`is_background\` parameter to true. Do NOT use \`&\` to background commands. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.
|
"description": "This tool executes a given shell command as \`bash -c <command>\`.",
|
||||||
|
"instructions": "To run a command in the background, set the \`is_background\` parameter to true. Do NOT use \`&\` to background commands. Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.
|
||||||
|
|
||||||
Efficiency Guidelines:
|
Efficiency Guidelines:
|
||||||
- Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
|
- Quiet Flags: Always prefer silent or quiet flags (e.g., \`npm install --silent\`, \`git --no-pager\`) to reduce output volume while still capturing necessary information.
|
||||||
|
|||||||
@@ -420,12 +420,12 @@ export const LS_DEFINITION: ToolDefinition = {
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the platform-specific description for the shell tool.
|
* Generates the platform-specific description and instructions for the shell tool.
|
||||||
*/
|
*/
|
||||||
export function getShellToolDescription(
|
export function getShellToolDescription(
|
||||||
enableInteractiveShell: boolean,
|
enableInteractiveShell: boolean,
|
||||||
enableEfficiency: boolean,
|
enableEfficiency: boolean,
|
||||||
): string {
|
): { description: string; instructions: string } {
|
||||||
const efficiencyGuidelines = enableEfficiency
|
const efficiencyGuidelines = enableEfficiency
|
||||||
? `
|
? `
|
||||||
|
|
||||||
@@ -449,12 +449,18 @@ export function getShellToolDescription(
|
|||||||
const backgroundInstructions = enableInteractiveShell
|
const backgroundInstructions = enableInteractiveShell
|
||||||
? 'To run a command in the background, set the `is_background` parameter to true. Do NOT use PowerShell background constructs.'
|
? 'To run a command in the background, set the `is_background` parameter to true. Do NOT use PowerShell background constructs.'
|
||||||
: 'Command can start background processes using PowerShell constructs such as `Start-Process -NoNewWindow` or `Start-Job`.';
|
: 'Command can start background processes using PowerShell constructs such as `Start-Process -NoNewWindow` or `Start-Job`.';
|
||||||
return `This tool executes a given shell command as \`powershell.exe -NoProfile -Command <command>\`. ${backgroundInstructions}${efficiencyGuidelines}${returnedInfo}`;
|
return {
|
||||||
|
description: `This tool executes a given shell command as \`powershell.exe -NoProfile -Command <command>\`.`,
|
||||||
|
instructions: `${backgroundInstructions}${efficiencyGuidelines}${returnedInfo}`,
|
||||||
|
};
|
||||||
} else {
|
} else {
|
||||||
const backgroundInstructions = enableInteractiveShell
|
const backgroundInstructions = enableInteractiveShell
|
||||||
? 'To run a command in the background, set the `is_background` parameter to true. Do NOT use `&` to background commands.'
|
? 'To run a command in the background, set the `is_background` parameter to true. Do NOT use `&` to background commands.'
|
||||||
: 'Command can start background processes using `&`.';
|
: 'Command can start background processes using `&`.';
|
||||||
return `This tool executes a given shell command as \`bash -c <command>\`. ${backgroundInstructions} Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.${efficiencyGuidelines}${returnedInfo}`;
|
return {
|
||||||
|
description: `This tool executes a given shell command as \`bash -c <command>\`.`,
|
||||||
|
instructions: `${backgroundInstructions} Command is executed as a subprocess that leads its own process group. Command process group can be terminated as \`kill -- -PGID\` or signaled as \`kill -s SIGNAL -- -PGID\`.${efficiencyGuidelines}${returnedInfo}`,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -475,13 +481,15 @@ export function getShellDefinition(
|
|||||||
enableInteractiveShell: boolean,
|
enableInteractiveShell: boolean,
|
||||||
enableEfficiency: boolean,
|
enableEfficiency: boolean,
|
||||||
): ToolDefinition {
|
): ToolDefinition {
|
||||||
|
const { description, instructions } = getShellToolDescription(
|
||||||
|
enableInteractiveShell,
|
||||||
|
enableEfficiency,
|
||||||
|
);
|
||||||
return {
|
return {
|
||||||
base: {
|
base: {
|
||||||
name: SHELL_TOOL_NAME,
|
name: SHELL_TOOL_NAME,
|
||||||
description: getShellToolDescription(
|
description,
|
||||||
enableInteractiveShell,
|
instructions,
|
||||||
enableEfficiency,
|
|
||||||
),
|
|
||||||
parametersJsonSchema: {
|
parametersJsonSchema: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
|
|||||||
@@ -466,19 +466,27 @@ export class ShellTool extends BaseDeclarativeTool<
|
|||||||
void initializeShellParsers().catch(() => {
|
void initializeShellParsers().catch(() => {
|
||||||
// Errors are surfaced when parsing commands.
|
// Errors are surfaced when parsing commands.
|
||||||
});
|
});
|
||||||
|
const modelId =
|
||||||
|
typeof config.getActiveModel === 'function'
|
||||||
|
? config.getActiveModel()
|
||||||
|
: undefined;
|
||||||
const definition = getShellDefinition(
|
const definition = getShellDefinition(
|
||||||
config.getEnableInteractiveShell(),
|
config.getEnableInteractiveShell(),
|
||||||
config.getEnableShellOutputEfficiency(),
|
config.getEnableShellOutputEfficiency(),
|
||||||
);
|
);
|
||||||
|
const resolved = resolveToolDeclaration(definition, modelId);
|
||||||
super(
|
super(
|
||||||
ShellTool.Name,
|
ShellTool.Name,
|
||||||
'Shell',
|
'Shell',
|
||||||
definition.base.description!,
|
resolved.description!,
|
||||||
Kind.Execute,
|
Kind.Execute,
|
||||||
definition.base.parametersJsonSchema,
|
resolved.parametersJsonSchema,
|
||||||
messageBus,
|
messageBus,
|
||||||
false, // output is not markdown
|
false, // output is not markdown
|
||||||
true, // output can be updated
|
true, // output can be updated
|
||||||
|
undefined, // extensionName
|
||||||
|
undefined, // extensionId
|
||||||
|
resolved.instructions,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user