fixed kpi identification

This commit is contained in:
ValueOn AG 2025-11-30 23:09:25 +01:00
parent bd893ef072
commit a8ef757046

View file

@ -316,9 +316,10 @@ Respond with ONLY a JSON object in this exact format:
if accumulationState and accumulationState.isAccumulationMode and iteration == 1 and not accumulationState.kpis:
logger.info(f"Iteration {iteration}: Defining KPIs for accumulation tracking")
continuationContext = buildContinuationContext(allSections, result)
# Pass raw response string from first iteration for KPI definition
kpiDefinitions = await self._defineKpisFromPrompt(
userPrompt or prompt,
parsedResult,
result, # Pass raw JSON string from first iteration
continuationContext,
debugPrefix
)
@ -509,46 +510,40 @@ Respond with ONLY a JSON object in this exact format:
async def _defineKpisFromPrompt(
self,
userPrompt: str,
parsedJson: Optional[Dict[str, Any]],
rawJsonString: Optional[str],
continuationContext: Dict[str, Any],
debugPrefix: str = "kpi"
) -> List[Dict[str, Any]]:
"""
Make separate AI call to define KPIs based on user prompt and delivered data.
Make separate AI call to define KPIs based on user prompt and incomplete JSON.
Args:
userPrompt: Original user prompt
parsedJson: Parsed JSON from first iteration (if available)
continuationContext: Continuation context with delivered summary
rawJsonString: Raw JSON string from first iteration response
continuationContext: Continuation context (not used for JSON, kept for compatibility)
Returns:
List of KPI definitions: [{"id": str, "description": str, "jsonPath": str, "targetValue": int}, ...]
"""
deliveredSummary = continuationContext.get("delivered_summary", "")
cutOffElement = continuationContext.get("cut_off_element")
elementBeforeCutoff = continuationContext.get("element_before_cutoff")
# Use raw JSON string from first iteration response
if rawJsonString:
# Remove markdown code fences if present
from modules.shared.jsonUtils import stripCodeFences
incompleteJson = stripCodeFences(rawJsonString.strip())
else:
incompleteJson = "Not available"
# Build prompt for KPI definition
kpiDefinitionPrompt = f"""Analyze the user request and delivered data to define KPIs (Key Performance Indicators) for tracking progress.
kpiDefinitionPrompt = f"""Analyze the user request and incomplete JSON to define KPIs (Key Performance Indicators) for tracking progress.
User Request:
{userPrompt}
Delivered Data Summary:
{deliveredSummary}
Current JSON Structure (if available):
{json.dumps(parsedJson, indent=2) if parsedJson else "Not available"}
Cut-off Element:
{cutOffElement if cutOffElement else "Not available"}
Last Complete Element:
{elementBeforeCutoff if elementBeforeCutoff else "Not available"}
Delivered JSON part:
{incompleteJson}
Task: Define which JSON items should be tracked to measure completion progress.
IMPORTANT: Analyze the JSON structure to understand what is being tracked:
IMPORTANT: Analyze the Delivered JSON part structure to understand what is being tracked:
1. Identify the structure type (table with rows, list with items, etc.)
2. Determine what the jsonPath actually counts (number of rows, number of items, etc.)
3. Calculate targetValue based on what is being tracked, NOT the total quantity requested
@ -556,7 +551,7 @@ IMPORTANT: Analyze the JSON structure to understand what is being tracked:
For each trackable item, provide:
- id: Unique identifier (use descriptive name)
- description: What this KPI measures (be specific about what is counted)
- jsonPath: Path to extract value from JSON (use dot notation with array indices, e.g., "documents[0].sections[0].elements")
- jsonPath: Path to extract value from JSON (use dot notation with array indices, e.g., "documents[0].sections[1].elements[0].rows")
- targetValue: Target value to reach (integer) - MUST match what jsonPath actually tracks (rows count, items count, etc.)
Return ONLY valid JSON in this format: