fix: switch system prompt to avoid malformed tool_calls (#650)

* fix: switch system prompt to avoid malformed tool_calls

* fix: circular dependency issue and configurable tool-call style

* fix: regExp issue
This commit is contained in:
Mingholy
2025-09-18 21:10:03 +08:00
committed by GitHub
parent 761833c915
commit 5f68a8b6b3
17 changed files with 2191 additions and 878 deletions

View File

@@ -24,6 +24,7 @@ import { ApprovalMode } from '../config/config.js';
import { ensureCorrectEdit } from '../utils/editCorrector.js';
import { DEFAULT_DIFF_OPTIONS, getDiffStat } from './diffOptions.js';
import { ReadFileTool } from './read-file.js';
import { ToolNames } from './tool-names.js';
import type {
ModifiableDeclarativeTool,
ModifyContext,
@@ -461,7 +462,7 @@ export class EditTool
extends BaseDeclarativeTool<EditToolParams, ToolResult>
implements ModifiableDeclarativeTool<EditToolParams>
{
static readonly Name = 'edit';
static readonly Name = ToolNames.EDIT;
constructor(private readonly config: Config) {
super(
EditTool.Name,

View File

@@ -9,6 +9,7 @@ import path from 'node:path';
import { glob, escape } from 'glob';
import type { ToolInvocation, ToolResult } from './tools.js';
import { BaseDeclarativeTool, BaseToolInvocation, Kind } from './tools.js';
import { ToolNames } from './tool-names.js';
import { shortenPath, makeRelative } from '../utils/paths.js';
import type { Config } from '../config/config.js';
import { ToolErrorType } from './tool-error.js';
@@ -252,7 +253,7 @@ class GlobToolInvocation extends BaseToolInvocation<
* Implementation of the Glob tool logic
*/
export class GlobTool extends BaseDeclarativeTool<GlobToolParams, ToolResult> {
static readonly Name = 'glob';
static readonly Name = ToolNames.GLOB;
constructor(private config: Config) {
super(

View File

@@ -12,6 +12,7 @@ import { spawn } from 'node:child_process';
import { globStream } from 'glob';
import type { ToolInvocation, ToolResult } from './tools.js';
import { BaseDeclarativeTool, BaseToolInvocation, Kind } from './tools.js';
import { ToolNames } from './tool-names.js';
import { makeRelative, shortenPath } from '../utils/paths.js';
import { getErrorMessage, isNodeError } from '../utils/errors.js';
import { isGitRepository } from '../utils/gitUtils.js';
@@ -597,7 +598,7 @@ class GrepToolInvocation extends BaseToolInvocation<
* Implementation of the Grep tool logic (moved from CLI)
*/
export class GrepTool extends BaseDeclarativeTool<GrepToolParams, ToolResult> {
static readonly Name = 'search_file_content'; // Keep static name
static readonly Name = ToolNames.GREP;
constructor(private readonly config: Config) {
super(

View File

@@ -8,6 +8,7 @@ import path from 'node:path';
import { makeRelative, shortenPath } from '../utils/paths.js';
import type { ToolInvocation, ToolLocation, ToolResult } from './tools.js';
import { BaseDeclarativeTool, BaseToolInvocation, Kind } from './tools.js';
import { ToolNames } from './tool-names.js';
import type { PartUnion } from '@google/genai';
import {
@@ -136,7 +137,7 @@ export class ReadFileTool extends BaseDeclarativeTool<
ReadFileToolParams,
ToolResult
> {
static readonly Name: string = 'read_file';
static readonly Name: string = ToolNames.READ_FILE;
constructor(private config: Config) {
super(

View File

@@ -6,6 +6,7 @@
import type { ToolInvocation, ToolResult } from './tools.js';
import { BaseDeclarativeTool, BaseToolInvocation, Kind } from './tools.js';
import { ToolNames } from './tool-names.js';
import { getErrorMessage } from '../utils/errors.js';
import * as fs from 'node:fs';
import * as path from 'node:path';
@@ -526,7 +527,7 @@ export class ReadManyFilesTool extends BaseDeclarativeTool<
ReadManyFilesParams,
ToolResult
> {
static readonly Name: string = 'read_many_files';
static readonly Name: string = ToolNames.READ_MANY_FILES;
constructor(private config: Config) {
const parameterSchema = {

View File

@@ -9,6 +9,7 @@ import path from 'node:path';
import os, { EOL } from 'node:os';
import crypto from 'node:crypto';
import type { Config } from '../config/config.js';
import { ToolNames } from './tool-names.js';
import { ToolErrorType } from './tool-error.js';
import type {
ToolInvocation,
@@ -403,7 +404,7 @@ export class ShellTool extends BaseDeclarativeTool<
ShellToolParams,
ToolResult
> {
static Name: string = 'run_shell_command';
static Name: string = ToolNames.SHELL;
private allowlist: Set<string> = new Set();
constructor(private readonly config: Config) {

View File

@@ -5,6 +5,7 @@
*/
import { BaseDeclarativeTool, BaseToolInvocation, Kind } from './tools.js';
import { ToolNames } from './tool-names.js';
import type {
ToolResult,
ToolResultDisplay,
@@ -46,7 +47,7 @@ export interface TaskParams {
* for the model to choose from.
*/
export class TaskTool extends BaseDeclarativeTool<TaskParams, ToolResult> {
static readonly Name: string = 'task';
static readonly Name: string = ToolNames.TASK;
private subagentManager: SubagentManager;
private availableSubagents: SubagentConfig[] = [];

View File

@@ -0,0 +1,23 @@
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* Tool name constants to avoid circular dependencies.
* These constants are used across multiple files and should be kept in sync
* with the actual tool class names.
*/
export const ToolNames = {
EDIT: 'edit',
WRITE_FILE: 'write_file',
READ_FILE: 'read_file',
READ_MANY_FILES: 'read_many_files',
GREP: 'search_file_content',
GLOB: 'glob',
SHELL: 'run_shell_command',
TODO_WRITE: 'todo_write',
MEMORY: 'save_memory',
TASK: 'task',
} as const;

View File

@@ -31,6 +31,7 @@ import {
ensureCorrectFileContent,
} from '../utils/editCorrector.js';
import { DEFAULT_DIFF_OPTIONS, getDiffStat } from './diffOptions.js';
import { ToolNames } from './tool-names.js';
import type {
ModifiableDeclarativeTool,
ModifyContext,
@@ -403,7 +404,7 @@ export class WriteFileTool
extends BaseDeclarativeTool<WriteFileToolParams, ToolResult>
implements ModifiableDeclarativeTool<WriteFileToolParams>
{
static readonly Name: string = 'write_file';
static readonly Name: string = ToolNames.WRITE_FILE;
constructor(private readonly config: Config) {
super(