From 2172e21c934166d66501114f86e94d4f663dac1c Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth Date: Mon, 1 Dec 2025 11:17:36 +0530 Subject: [PATCH] Fix crash when LLM returns no mappings --- .../ai/service/datamapper/datamapper.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts index 6d2cf6179a..64a1a6262a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -43,6 +43,12 @@ import { URI } from "vscode-uri"; import fs from 'fs'; import { writeBallerinaFileDidOpenTemp } from "../../../../../src/utils/modification"; +const NO_MAPPINGS_GENERATED_WARNING = `**No Relevant Mappings Generated**\n\n` + + `The AI was unable to identify compatible field mappings between the input and output structures.\n\n` + + `**Suggestions:**\n` + + `- Check if input and output record structures are correct\n` + + `- Try providing mapping hints or examples\n`; + // ============================================================================= // ENHANCED MAIN ORCHESTRATOR FUNCTION // ============================================================================= @@ -340,6 +346,13 @@ export async function generateMappingCodeCore(mappingRequest: ProcessMappingPara attachments: mappingRequest.attachments }, context, eventHandler); + // Check if no mappings were generated + if (!allMappingsRequest.mappings || allMappingsRequest.mappings.length === 0) { + eventHandler({ type: "content_block", content: NO_MAPPINGS_GENERATED_WARNING }); + eventHandler({ type: "stop", command: Command.DataMap }); + return; + } + const sourceCodeResponse = await getAllDataMapperSource(allMappingsRequest); await updateSourceCode({ textEdits: sourceCodeResponse.textEdits, skipPayloadCheck: true }); @@ -694,6 +707,13 @@ export async function generateInlineMappingCodeCore(inlineMappingRequest: Metada const inlineMappingsResult: InlineMappingsSourceResult = await generateInlineMappingsSource(inlineMappingRequest, langClient, context, eventHandler); + // Check if no mappings were generated + if (!inlineMappingsResult.allMappingsRequest.mappings || inlineMappingsResult.allMappingsRequest.mappings.length === 0) { + eventHandler({ type: "content_block", content: NO_MAPPINGS_GENERATED_WARNING }); + eventHandler({ type: "stop", command: Command.DataMap }); + return; + } + await updateSourceCode({ textEdits: inlineMappingsResult.sourceResponse.textEdits, skipPayloadCheck: true }); await new Promise((resolve) => setTimeout(resolve, 100));