ClearSpend / handler.py
MonilM's picture
Improved NLP Logic
07b50c0
import json
# Remove direct model/util imports if calling analyze_text
# from model_setup import zero_shot, ner
# from utils import parse_entities
# from config import CATEGORY_KEYWORDS
# Import the centralized analysis function
from nlp_service import analyze_text
def lambda_handler(event, context):
# ... (Keep body parsing logic) ...
body_str = event.get("body", "{}")
try:
body = json.loads(body_str)
except json.JSONDecodeError:
print(f"Error decoding JSON body: {body_str}")
return {
"statusCode": 400,
"body": json.dumps({"error": "Invalid JSON in request body"})
}
text = body.get("text", "")
if not text:
return {
"statusCode": 400,
"body": json.dumps({"error": "Missing 'text' field in request body"})
}
print(f"Processing text via nlp_service: {text}") # Log input
# Call the centralized NLP service function
try:
analysis_result = analyze_text(text)
status = analysis_result.get("status")
if status == "failed":
print(f"NLP analysis failed: {analysis_result.get('message')}")
# Return 400 for input errors, 500 for internal NLP errors?
# Let's return 400 if it's a known failure from analyze_text
return {
"statusCode": 400,
"body": json.dumps(analysis_result)
}
elif status == "fallback_required":
print(f"NLP analysis requires fallback: {analysis_result.get('message')}")
# Return 200 but indicate fallback needed
return {
"statusCode": 200,
"body": json.dumps(analysis_result)
}
elif status == "success":
print(f"NLP analysis successful: {analysis_result}")
# Return the successful analysis result
return {
"statusCode": 200,
"body": json.dumps(analysis_result) # Already contains status
}
else:
# Should not happen if analyze_text always returns a status
print(f"Error: Unknown status from analyze_text: {status}")
return {
"statusCode": 500,
"body": json.dumps({"error": "Internal server error: Unexpected NLP response"})
}
except Exception as e:
print(f"Error calling analyze_text from handler: {e}")
import traceback
traceback.print_exc()
return {
"statusCode": 500,
"body": json.dumps({"error": "Internal server error during NLP processing", "details": str(e)})
}
# Example event structure (for local testing if needed)
if __name__ == '__main__':
# ... (Keep example test cases, they should still work) ...
example_event = {
"body": json.dumps({
"text": "spent 5 eur on coffee"
})
}
context = {}
response = lambda_handler(example_event, context)
print("\n--- Lambda Response ---")
# The body is already a JSON string containing the result from analyze_text
print(json.dumps(json.loads(response['body']), indent=2))
example_event_query = {
"body": json.dumps({
"text": "how much did I spend last month"
})
}
response_query = lambda_handler(example_event_query, context)
print("\n--- Lambda Response (Query) ---")
print(json.dumps(json.loads(response_query['body']), indent=2))
example_event_income = {
"body": json.dumps({
"text": "salary credited 50000"
})
}
response_income = lambda_handler(example_event_income, context)
print("\n--- Lambda Response (Income) ---")
print(json.dumps(json.loads(response_income['body']), indent=2))