From 25cbaa45b836f356265f87bec827114f18c0d2b3 Mon Sep 17 00:00:00 2001 From: ValueOn AG Date: Mon, 5 Jan 2026 01:36:39 +0100 Subject: [PATCH] fixed cut json handling --- modules/shared/jsonUtils.py | 54 +++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/modules/shared/jsonUtils.py b/modules/shared/jsonUtils.py index 3c8e366f..d89b2f76 100644 --- a/modules/shared/jsonUtils.py +++ b/modules/shared/jsonUtils.py @@ -1397,44 +1397,58 @@ def buildIncompleteContext(jsonContent: str, breakPosition: int) -> str: nextLevelStart = breakPosition # Show opening structure for this level - resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[') - childIndent = indent + " " - - if isCutLevel: - # Cut level: show cut piece - if cutPiece: + # For cut level, check if cut piece already starts with bracket/brace - if so, don't duplicate + if isCutLevel and cutPiece: + cutPieceStripped = cutPiece.strip() + if (levelType == 'array' and cutPieceStripped.startswith('[')) or \ + (levelType == 'object' and cutPieceStripped.startswith('{')): + # Cut piece already includes opening bracket, don't add it separately + # Use parent level's child indent (cut element is a child of parent, not a separate level) + if levelIndex > 0: + parentLevel = hierarchy[levelIndex - 1] + parentIndent = " " * parentLevel['depth'] + childIndent = parentIndent + " " + else: + childIndent = indent + " " for line in cutPiece.split('\n'): stripped = line.strip() if stripped: resultLines.append(f'{childIndent}{stripped}') resultLines[-1] += ' <-- CUT POINT (incomplete)' else: - resultLines.append(f'{childIndent}... <-- CUT POINT (incomplete)') - - elif isParentOfCutLevel and levelType == 'array': - # Parent of cut level: show complete elements with budget + # Cut piece doesn't start with matching bracket, add opening structure + resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[') + childIndent = indent + " " + for line in cutPiece.split('\n'): + stripped = line.strip() + if stripped: + resultLines.append(f'{childIndent}{stripped}') + resultLines[-1] += ' <-- CUT POINT (incomplete)' + elif isCutLevel: + # Cut level but no cut piece - add opening structure + resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[') + childIndent = indent + " " + resultLines.append(f'{childIndent}... <-- CUT POINT (incomplete)') + elif isParentOfCutLevel: + # Parent of cut level: add opening structure, then show complete elements with budget + # Works for both arrays and objects + resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[') + childIndent = indent + " " completeElements = _findCompleteElementsAtLevel( jsonContent, levelStart, nextLevelStart, levelDepth ) - print(f"DEBUG: Found {len(completeElements)} complete elements") - print(f"DEBUG: Budget = {DATA_BUDGET}") - dataBudget = DATA_BUDGET for elementStart, elementEnd in reversed(completeElements): elementData = jsonContent[elementStart:elementEnd].strip() elementSize = len(elementData) - print(f"DEBUG: Element size = {elementSize}, remaining budget = {dataBudget}") - if elementSize == 0: continue if elementSize > dataBudget: - print(f"DEBUG: Element too large, stopping") break - print(f"DEBUG: Adding element (size {elementSize})") for line in elementData.split('\n'): stripped = line.strip() if stripped: @@ -1443,14 +1457,14 @@ def buildIncompleteContext(jsonContent: str, breakPosition: int) -> str: resultLines[-1] += ',' dataBudget -= elementSize - print(f"DEBUG: Budget after decrement = {dataBudget}") if dataBudget <= 0: - print(f"DEBUG: Budget exhausted, stopping") break else: - # Other parent levels: show path content (keys and values) leading to next level + # Other parent levels: add opening structure, then show path content + resultLines.append(f'{indent}{{' if levelType == 'object' else f'{indent}[') + childIndent = indent + " " pathContent = jsonContent[levelStart + 1:nextLevelStart].strip() if pathContent: # Show all path content (structure is always shown, not truncated)