{"record":{"id":"7845da8b4f2e4d43","repo":"microsoft/vscode","slug":"invalid-tool-name-tool-name-only-alphanumeri","errorCode":null,"errorMessage":"Invalid tool name \"${tool.name}\": only alphanumeric characters, hyphens, and underscores are allowed.","messagePattern":"Invalid tool name \"(.+?)\": only alphanumeric characters, hyphens, and underscores are allowed\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts","lineNumber":996,"sourceCode":"\t\t\t\t\t\tname: message.name,\n\t\t\t\t\t\ttoolCalls: message.content\n\t\t\t\t\t\t\t.filter(part => part instanceof vscode.LanguageModelToolCallPart)\n\t\t\t\t\t\t\t.map(part => part as vscode.LanguageModelToolCallPart)\n\t\t\t\t\t\t\t.map(part => ({ function: { name: part.name, arguments: JSON.stringify(part.input) }, id: part.callId, type: 'function' })),\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn endpoint.acquireTokenizer().countMessageTokens(raw);\n\t\t}\n\t}\n\n\tprivate validateTools(tools: readonly vscode.LanguageModelChatTool[]): void {\n\t\tfor (const tool of tools) {\n\t\t\tif (!tool.name.match(/^[\\w-]+$/)) {\n\t\t\t\tthrow new Error(`Invalid tool name \"${tool.name}\": only alphanumeric characters, hyphens, and underscores are allowed.`);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async countToolTokens(endpoint: IChatEndpoint, tools: readonly vscode.LanguageModelChatTool[]): Promise<number> {\n\t\treturn await endpoint.acquireTokenizer().countToolTokens(tools);\n\t}\n\n\tprivate validateRequest(_messages: Array<vscode.LanguageModelChatMessage | vscode.LanguageModelChatMessage2>): void {\n\t\tconst lastMessage = _messages.at(-1);\n\t\tif (!lastMessage) {\n\t\t\tthrow new Error('Invalid request: no messages.');\n\t\t}\n\n\t\t_messages.forEach((message, i) => {\n\t\t\tif (message.role === vscode.LanguageModelChatMessageRole.Assistant) {\n\t\t\t\t// Filter out DataPart since it does not share the same value type and does not have callId, function, etc.\n\t\t\t\tconst filteredContent = message.content.filter(part => part instanceof vscode.LanguageModelDataPart);","sourceCodeStart":978,"sourceCodeEnd":1014,"githubUrl":"https://github.com/microsoft/vscode/blob/a94b963a32aa9749d69504576791fa29700ae46d/extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts#L978-L1014","documentation":"Error \"Invalid tool name \"${tool.name}\": only alphanumeric characters, hyphens, and underscores are allowed.\" thrown in microsoft/vscode.","triggerScenarios":"Thrown at extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts:996 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"analyzedSha":"a94b963a32aa9749d69504576791fa29700ae46d","analyzedAt":"2026-08-12T01:08:56.794Z","schemaVersion":2},"datasetVersion":"2026-08-12T06:17:24.410Z"}