{"record":{"id":"9203dbae9607456c","repo":"microsoft/vscode","slug":"invalid-request-tool-call-part-must-be-followed-b","errorCode":null,"errorMessage":"Invalid request: Tool call part must be followed by a User message with a LanguageModelToolResultPart with a matching callId.","messagePattern":"Invalid request: Tool call part must be followed by a User message with a LanguageModelToolResultPart with a matching callId\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts","lineNumber":1023,"sourceCode":"\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);\n\t\t\t\tconst toolCallIds = new Set(filteredContent\n\t\t\t\t\t.filter(part => part instanceof vscode.LanguageModelToolCallPart)\n\t\t\t\t\t.map(part => part.callId));\n\t\t\t\tlet nextMessageIdx = i + 1;\n\t\t\t\tconst errMsg = 'Invalid request: Tool call part must be followed by a User message with a LanguageModelToolResultPart with a matching callId.';\n\t\t\t\twhile (toolCallIds.size > 0) {\n\t\t\t\t\tconst nextMessage = _messages.at(nextMessageIdx++);\n\t\t\t\t\tif (!nextMessage || nextMessage.role !== vscode.LanguageModelChatMessageRole.User) {\n\t\t\t\t\t\tthrow new Error(errMsg);\n\t\t\t\t\t}\n\n\t\t\t\t\tnextMessage.content.forEach(part => {\n\t\t\t\t\t\tif (!(part instanceof vscode.LanguageModelToolResultPart2 || part instanceof vscode.LanguageModelToolResultPart)) {\n\t\t\t\t\t\t\tthrow new Error(errMsg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttoolCallIds.delete(part.callId);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n\nfunction or(...checks: ((value: unknown) => boolean)[]): (value: unknown) => boolean {\n\treturn (value) => checks.some(check => check(value));","sourceCodeStart":1005,"sourceCodeEnd":1041,"githubUrl":"https://github.com/microsoft/vscode/blob/a94b963a32aa9749d69504576791fa29700ae46d/extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts#L1005-L1041","documentation":"Error \"Invalid request: Tool call part must be followed by a User message with a LanguageModelToolResultPart with a matching callId.\" thrown in microsoft/vscode.","triggerScenarios":"Thrown at extensions/copilot/src/extension/conversation/vscode-node/languageModelAccess.ts:1023 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"}