UI Communication fixed

This commit is contained in:
ValueOn AG 2025-10-18 00:33:28 +02:00
parent 9521823958
commit 9e1cff460a
6 changed files with 51 additions and 53 deletions

4
app.py
View file

@ -422,5 +422,5 @@ app.include_router(voiceGoogleRouter)
from modules.routes.routeSecurityAdmin import router as adminSecurityRouter
app.include_router(adminSecurityRouter)
from modules.routes.routeChatbot import router as chatbotRouter
app.include_router(chatbotRouter)
# from modules.routes.routeChatbot import router as chatbotRouter
# app.include_router(chatbotRouter)

View file

@ -39,6 +39,7 @@ Analyze the user's intent and determine:
2. What format they expect (raw data, formatted, structured, visual, etc.)
3. What quality requirements they have (accuracy, completeness, format)
4. What specific success criteria define completion
5. What language the user is communicating in (detect from the user request)
CRITICAL: Respond with ONLY the JSON object below. Do not include any explanatory text, analysis, or other content before or after the JSON.
@ -52,6 +53,7 @@ CRITICAL: Respond with ONLY the JSON object below. Do not include any explanator
"formatRequirement": "any|formatted|raw|structured"
}},
"successCriteria": ["specific criterion 1", "specific criterion 2"],
"languageUserDetected": "en",
"confidenceScore": 0.0-1.0
}}
"""
@ -108,6 +110,18 @@ CRITICAL: Respond with ONLY the JSON object below. Do not include any explanator
try:
aiResult = json.loads(result)
logger.info("AI intent analysis JSON parsed successfully")
# Set language only if currentUserLanguage is empty
detected_lang = (aiResult.get('languageUserDetected') or '').strip()
if detected_lang and detected_lang.lower() != 'unknown' and self.services.currentUserLanguage == "":
self.services.currentUserLanguage = detected_lang
logger.info(f"Set currentUserLanguage from intent: {detected_lang}")
# Also set services.user.language if it's empty
if self.services.user and not self.services.user.language:
self.services.user.language = detected_lang
logger.info(f"Set services.user.language from intent: {detected_lang}")
return aiResult
except json.JSONDecodeError as json_error:
@ -121,35 +135,7 @@ CRITICAL: Respond with ONLY the JSON object below. Do not include any explanator
logger.error(f"AI intent analysis failed: {str(e)}")
return None
def _createBasicIntentAnalysis(self, userPrompt: str) -> Dict[str, Any]:
"""Creates basic intent analysis without AI"""
return {
"primaryGoal": userPrompt.strip(),
"dataType": "unknown",
"expectedFormat": "unknown",
"qualityRequirements": {
"accuracyThreshold": 0.8,
"completenessThreshold": 0.8,
"formatRequirement": "any"
},
"successCriteria": ["Delivers what the user requested"],
"confidenceScore": 0.5
}
def _createDefaultIntentAnalysis(self, userPrompt: str) -> Dict[str, Any]:
"""Creates a default intent analysis when analysis fails"""
return {
"primaryGoal": userPrompt,
"dataType": "unknown",
"expectedFormat": "unknown",
"qualityRequirements": {
"accuracyThreshold": 0.8,
"completenessThreshold": 0.8,
"formatRequirement": "any"
},
"successCriteria": ["Delivers what the user requested"],
"confidenceScore": 0.1
}
def _isValidJsonResponse(self, response: str) -> bool:
"""Checks if response contains valid JSON structure"""

View file

@ -146,25 +146,10 @@ class TaskPlanner:
if not taskPlanDict.get('tasks'):
raise ValueError("Task plan contains no tasks")
# LANGUAGE DETECTION: Determine user language once for the entire workflow
# Priority: 1. languageUserDetected from AI response, 2. service.user.language, 3. "en"
detectedLanguage = taskPlanDict.get('languageUserDetected', '').strip()
serviceUserLanguage = getattr(self.services.user, 'language', '') if self.services and self.services.user else ''
if detectedLanguage and len(detectedLanguage) == 2: # Valid language code like "en", "de", "fr"
userLanguage = detectedLanguage
logger.info(f"Using detected language from AI response: {userLanguage}")
elif serviceUserLanguage and len(serviceUserLanguage) == 2:
userLanguage = serviceUserLanguage
logger.info(f"Using language from service user object: {userLanguage}")
else:
userLanguage = "en"
logger.info(f"Using default language: {userLanguage}")
# Set the detected language in the service for use throughout the workflow
if self.services and self.services.user:
self.services.user.language = userLanguage
logger.info(f"Set workflow user language to: {userLanguage}")
# Use already detected language from services; do not detect here
userLanguage = self.services.currentUserLanguage or 'en'
logger.info(f"Task planning using user language: {userLanguage}")
tasks = []
for i, taskDict in enumerate(taskPlanDict.get('tasks', [])):
@ -193,7 +178,6 @@ class TaskPlanner:
)
logger.info(f"Task plan generated successfully with {len(tasks)} tasks")
logger.info(f"Workflow user language set to: {userLanguage}")
return taskPlan
except Exception as e:

View file

@ -11,6 +11,7 @@ NAMING CONVENTION:
MAPPING TABLE (keys function) with usage [taskplan | actionplan | react]:
{{KEY:USER_PROMPT}} -> extractUserPrompt() [taskplan, actionplan, react]
{{KEY:USER_LANGUAGE}} -> extractUserLanguage() [actionplan, react]
{{KEY:LANGUAGE_USER_DETECTED}} -> extractLanguageUserDetected() [taskplan]
{{KEY:WORKFLOW_HISTORY}} -> extractWorkflowHistory() [taskplan, actionplan, react]
{{KEY:AVAILABLE_CONNECTIONS_INDEX}} -> extractAvailableConnectionsIndex() [actionplan, react]
{{KEY:AVAILABLE_CONNECTIONS_SUMMARY}} -> extractAvailableConnectionsSummary() []
@ -421,3 +422,28 @@ def extractAvailableConnectionsIndex(service: Any) -> str:
except Exception as e:
logger.error(f"Error getting connection index: {str(e)}")
return "No connections available"
def extractLanguageUserDetected(context: Any) -> str:
"""Extract the detected user language from intent analysis or context."""
try:
# Try to get language from intent analysis if available
if hasattr(context, 'intent_analysis') and context.intent_analysis:
language = context.intent_analysis.get('languageUserDetected', '')
if language and language != 'unknown':
return language
# Try to get language from workflow context
if hasattr(context, 'workflow') and hasattr(context.workflow, 'intent_analysis'):
language = context.workflow.intent_analysis.get('languageUserDetected', '') if context.workflow.intent_analysis else ''
if language and language != 'unknown':
return language
# Try to get language from user service
if hasattr(context, 'services') and hasattr(context.services, 'user') and hasattr(context.services.user, 'language'):
return context.services.user.language
# Default fallback
return 'en'
except Exception as e:
logger.error(f"Error extracting user language: {str(e)}")
return 'en'

View file

@ -71,8 +71,7 @@ Break down user requests into logical, executable task steps.
```json
{
"overview": "Brief description of the overall plan",
"languageUserDetected": "en",
"userMessage": "User-friendly message explaining the task plan",
"userMessage": "User-friendly message explaining the task plan (use the user's detected language from intent)",
"tasks": [
{
"id": "task_1",

View file

@ -51,6 +51,9 @@ class WorkflowProcessor:
# Check workflow status before generating task plan
self._checkWorkflowStopped(workflow)
# Initialize currentUserLanguage to empty at workflow start
self.services.currentUserLanguage = ""
logger.info(f"=== STARTING TASK PLAN GENERATION ===")
logger.info(f"Workflow ID: {workflow.id}")
logger.info(f"User Input: {userInput}")