"""Response generation using Groq LLM""" from langchain_groq import ChatGroq from langchain_core.prompts import PromptTemplate from orchestration.state import ConversationState from typing import Dict, Any import logging from backend.config import settings from orchestration.latency_tracker import get_tracker logger = logging.getLogger(__name__) def response_generation_node(state: ConversationState) -> Dict[str, Any]: """ Generate final response using Groq LLM Incorporates KB context, customer history, intent, and sentiment Returns: state update with response field """ tracker = get_tracker() tracker.start("response_generation") try: logger.info("Response Generation: Initializing Groq LLM...") # Initialize Groq LLM llm = ChatGroq( model=settings.groq_model, temperature=settings.groq_temperature, max_tokens=settings.groq_max_tokens, groq_api_key=settings.groq_api_key ) # Determine tone based on sentiment sentiment_label = state['sentiment']['label'] tone_instruction = { "POSITIVE": "Use a friendly, upbeat tone.", "NEGATIVE": "Use an empathetic, understanding tone. Acknowledge frustration.", "NEUTRAL": "Use a professional, helpful tone." }.get(sentiment_label, "Use a professional tone.") # Build response prompt response_prompt = PromptTemplate( input_variables=[ "user_input", "intent", "kb_context", "history_context", "tone_instruction" ], template="""You are a helpful customer service AI assistant. User Intent: {intent} {tone_instruction} Knowledge Base Context: {kb_context} Customer History: {history_context} User Message: {user_input} Provide a helpful, accurate response based on the context above. Keep response concise (2-3 sentences). If you don't have relevant information, say so clearly.""" ) # Generate response using chain pattern logger.info("🤖 Response Generation: Invoking LLM chain...") chain = response_prompt | llm response = chain.invoke({ "user_input": state['user_input'], "intent": state['intent']['intent'], "kb_context": state['kb_context'], "history_context": state['history_context'], "tone_instruction": tone_instruction }) response_text = response.content.strip() logger.info(f"✅ Response generated: '{response_text[:80]}...'") tracker.end("response_generation") return {"response": response_text} except Exception as e: logger.error(f"❌ Response generation failed: {type(e).__name__}: {str(e)}") import traceback logger.error(traceback.format_exc()) tracker.end("response_generation") # Return fallback response return {"response": "I apologize, but I encountered an error processing your request. Please try again."}