formiq / chatbot_utils.py
chandini2595's picture
Add detailed logging to chatbot_utils and update app
975d352
import os
import boto3
from openai import OpenAI
import logging
logger = logging.getLogger(__name__)
def ask_receipt_chatbot(question, region_name='us-east-1', table_name='Receipts'):
"""
Given a user question, fetch all receipts from DynamoDB, format them as context, and query Perplexity LLM.
Returns the LLM's answer or an error message.
"""
logger.info(f"[chatbot] Received chatbot question: {question}")
# Initialize OpenAI client for Perplexity
api_key = os.environ.get('PERPLEXITY_API_KEY') or os.environ.get('OPENAI_API_KEY')
if api_key:
logger.info("[chatbot] Using Perplexity/OpenAI API key from environment.")
else:
logger.warning("[chatbot] No Perplexity/OpenAI API key found in environment!")
client = OpenAI(
api_key=api_key,
base_url="https://api.perplexity.ai"
)
try:
logger.info(f"[chatbot] Connecting to DynamoDB in region: {region_name}")
dynamodb = boto3.resource('dynamodb', region_name=region_name)
logger.info(f"[chatbot] Getting table: {table_name}")
table = dynamodb.Table(table_name)
logger.info(f"[chatbot] Scanning DynamoDB table: {table_name}")
response = table.scan()
items = response.get('Items', [])
logger.info(f"[chatbot] Fetched {len(items)} items from DynamoDB. Response: {response}")
# Format items for context
context = "\n".join([
f"Receipt {item.get('receipt_no', '')}:\n"
f" Name: {item.get('name', '')}\n"
f" Date: {item.get('date', '')}\n"
f" Product: {item.get('product', '')}\n"
f" Amount Paid: {item.get('amount_paid', '')}\n"
for item in items
])
logger.info(f"[chatbot] Context for LLM prompt created. Length: {len(context)} characters. Context: {context}")
prompt = f"Based on these receipts:\n{context}\n\nQuestion: {question}\nPlease provide a 2-3 line answer."
logger.info(f"[chatbot] Prompt for LLM: {prompt}")
messages = [
{
"role": "system",
"content": (
"You are an artificial intelligence assistant and you need to "
"engage in a helpful, detailed, polite conversation with a user. "
"Give a 2-3 line answer."
)
},
{
"role": "user",
"content": prompt
}
]
logger.info("[chatbot] Sending request to Perplexity LLM...")
response = client.chat.completions.create(
model="sonar",
messages=messages
)
logger.info(f"[chatbot] Received response from Perplexity LLM: {response}")
answer = response.choices[0].message.content
logger.info(f"[chatbot] LLM answer: {answer}")
return answer
except Exception as e:
logger.error(f"[chatbot] Error in ask_receipt_chatbot: {str(e)}", exc_info=True)
return f"Error from LLM or DynamoDB: {str(e)}"