Spaces:
Sleeping
Sleeping
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)}" |