UI Communication fixed
This commit is contained in:
parent
9521823958
commit
9e1cff460a
6 changed files with 51 additions and 53 deletions
4
app.py
4
app.py
|
|
@ -422,5 +422,5 @@ app.include_router(voiceGoogleRouter)
|
||||||
from modules.routes.routeSecurityAdmin import router as adminSecurityRouter
|
from modules.routes.routeSecurityAdmin import router as adminSecurityRouter
|
||||||
app.include_router(adminSecurityRouter)
|
app.include_router(adminSecurityRouter)
|
||||||
|
|
||||||
from modules.routes.routeChatbot import router as chatbotRouter
|
# from modules.routes.routeChatbot import router as chatbotRouter
|
||||||
app.include_router(chatbotRouter)
|
# app.include_router(chatbotRouter)
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ Analyze the user's intent and determine:
|
||||||
2. What format they expect (raw data, formatted, structured, visual, etc.)
|
2. What format they expect (raw data, formatted, structured, visual, etc.)
|
||||||
3. What quality requirements they have (accuracy, completeness, format)
|
3. What quality requirements they have (accuracy, completeness, format)
|
||||||
4. What specific success criteria define completion
|
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.
|
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"
|
"formatRequirement": "any|formatted|raw|structured"
|
||||||
}},
|
}},
|
||||||
"successCriteria": ["specific criterion 1", "specific criterion 2"],
|
"successCriteria": ["specific criterion 1", "specific criterion 2"],
|
||||||
|
"languageUserDetected": "en",
|
||||||
"confidenceScore": 0.0-1.0
|
"confidenceScore": 0.0-1.0
|
||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
@ -108,6 +110,18 @@ CRITICAL: Respond with ONLY the JSON object below. Do not include any explanator
|
||||||
try:
|
try:
|
||||||
aiResult = json.loads(result)
|
aiResult = json.loads(result)
|
||||||
logger.info("AI intent analysis JSON parsed successfully")
|
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
|
return aiResult
|
||||||
|
|
||||||
except json.JSONDecodeError as json_error:
|
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)}")
|
logger.error(f"AI intent analysis failed: {str(e)}")
|
||||||
return None
|
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:
|
def _isValidJsonResponse(self, response: str) -> bool:
|
||||||
"""Checks if response contains valid JSON structure"""
|
"""Checks if response contains valid JSON structure"""
|
||||||
|
|
|
||||||
|
|
@ -146,26 +146,11 @@ class TaskPlanner:
|
||||||
if not taskPlanDict.get('tasks'):
|
if not taskPlanDict.get('tasks'):
|
||||||
raise ValueError("Task plan contains no 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 = []
|
tasks = []
|
||||||
for i, taskDict in enumerate(taskPlanDict.get('tasks', [])):
|
for i, taskDict in enumerate(taskPlanDict.get('tasks', [])):
|
||||||
if not isinstance(taskDict, dict):
|
if not isinstance(taskDict, dict):
|
||||||
|
|
@ -193,7 +178,6 @@ class TaskPlanner:
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info(f"Task plan generated successfully with {len(tasks)} tasks")
|
logger.info(f"Task plan generated successfully with {len(tasks)} tasks")
|
||||||
logger.info(f"Workflow user language set to: {userLanguage}")
|
|
||||||
|
|
||||||
return taskPlan
|
return taskPlan
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ NAMING CONVENTION:
|
||||||
MAPPING TABLE (keys → function) with usage [taskplan | actionplan | react]:
|
MAPPING TABLE (keys → function) with usage [taskplan | actionplan | react]:
|
||||||
{{KEY:USER_PROMPT}} -> extractUserPrompt() [taskplan, actionplan, react]
|
{{KEY:USER_PROMPT}} -> extractUserPrompt() [taskplan, actionplan, react]
|
||||||
{{KEY:USER_LANGUAGE}} -> extractUserLanguage() [actionplan, react]
|
{{KEY:USER_LANGUAGE}} -> extractUserLanguage() [actionplan, react]
|
||||||
|
{{KEY:LANGUAGE_USER_DETECTED}} -> extractLanguageUserDetected() [taskplan]
|
||||||
{{KEY:WORKFLOW_HISTORY}} -> extractWorkflowHistory() [taskplan, actionplan, react]
|
{{KEY:WORKFLOW_HISTORY}} -> extractWorkflowHistory() [taskplan, actionplan, react]
|
||||||
{{KEY:AVAILABLE_CONNECTIONS_INDEX}} -> extractAvailableConnectionsIndex() [actionplan, react]
|
{{KEY:AVAILABLE_CONNECTIONS_INDEX}} -> extractAvailableConnectionsIndex() [actionplan, react]
|
||||||
{{KEY:AVAILABLE_CONNECTIONS_SUMMARY}} -> extractAvailableConnectionsSummary() []
|
{{KEY:AVAILABLE_CONNECTIONS_SUMMARY}} -> extractAvailableConnectionsSummary() []
|
||||||
|
|
@ -421,3 +422,28 @@ def extractAvailableConnectionsIndex(service: Any) -> str:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error getting connection index: {str(e)}")
|
logger.error(f"Error getting connection index: {str(e)}")
|
||||||
return "No connections available"
|
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'
|
||||||
|
|
|
||||||
|
|
@ -71,8 +71,7 @@ Break down user requests into logical, executable task steps.
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"overview": "Brief description of the overall plan",
|
"overview": "Brief description of the overall plan",
|
||||||
"languageUserDetected": "en",
|
"userMessage": "User-friendly message explaining the task plan (use the user's detected language from intent)",
|
||||||
"userMessage": "User-friendly message explaining the task plan",
|
|
||||||
"tasks": [
|
"tasks": [
|
||||||
{
|
{
|
||||||
"id": "task_1",
|
"id": "task_1",
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,9 @@ class WorkflowProcessor:
|
||||||
# Check workflow status before generating task plan
|
# Check workflow status before generating task plan
|
||||||
self._checkWorkflowStopped(workflow)
|
self._checkWorkflowStopped(workflow)
|
||||||
|
|
||||||
|
# Initialize currentUserLanguage to empty at workflow start
|
||||||
|
self.services.currentUserLanguage = ""
|
||||||
|
|
||||||
logger.info(f"=== STARTING TASK PLAN GENERATION ===")
|
logger.info(f"=== STARTING TASK PLAN GENERATION ===")
|
||||||
logger.info(f"Workflow ID: {workflow.id}")
|
logger.info(f"Workflow ID: {workflow.id}")
|
||||||
logger.info(f"User Input: {userInput}")
|
logger.info(f"User Input: {userInput}")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue