from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse import threading import asyncio import mysql.connector import json import logging import pandas as pd from llama_cpp import Llama from transformers import pipeline import os app = FastAPI() # Configure logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) # Email and database configuration DB_CONFIG = os.getenv('db') # System prompt for LLM prompt = os.getenv('prompt') # Function to insert extracted shipment details into MySQL database def insert_data(extracted_details): try: mydb = mysql.connector.connect(**DB_CONFIG) cursor = mydb.cursor() # Skip insertion if all required fields are empty required_fields = ['origin', 'destination', 'expected_shipment_datetime', 'types_of_service', 'warehouse', 'description', 'quantities', 'carrier_details'] if all(extracted_details.get(field) in [None, ""] for field in required_fields): logger.info("Skipping insertion: All extracted values are empty.") return sql = """ INSERT INTO shipment_details ( origin, destination, expected_shipment_datetime, types_of_service, warehouse, description, quantities, carrier_details ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) """ values = ( extracted_details.get('origin'), extracted_details.get('destination'), extracted_details.get('expected_shipment_datetime'), extracted_details.get('types_of_service'), extracted_details.get('warehouse'), extracted_details.get('description'), extracted_details.get('quantities'), extracted_details.get('carrier_details') ) cursor.execute(sql, values) mydb.commit() logger.info("Data inserted successfully.") except mysql.connector.Error as db_err: logger.error(f"Database error: {db_err}") except Exception as ex: logger.error(f"Error inserting data: {ex}") # Function to read and process emails def read_email(): logger.info("Loading Llama model...") llm = Llama.from_pretrained( repo_id="microsoft/Phi-3-mini-4k-instruct-gguf", filename="Phi-3-mini-4k-instruct-fp16.gguf", n_ctx=2048 ) logger.info("Llama model loaded.") logger.info("Reading emails from CSV...") df = pd.read_csv('./emails.csv') for i in df['Body']: logger.info(f"Processing email: {i}") output = llm( f"<|system|>\n{prompt}<|end|><|user|>\n{i}<|end|>\n<|assistant|>", max_tokens=256, stop=["<|end|>"], echo=False) logger.info("Extracting details...") t = output['choices'][0]['text'] logger.info('the model output : \n',t) extracted_details = json.loads(t[t.find('{'):t.find('}') + 1].replace("'", '"')) extracted_details = {key.lower().replace(" ", "_"): value for key, value in extracted_details.items()} # Add meta data placeholders meta_data = { 'sender': None, 'receiver': None, 'cc': None, 'bcc': None, 'subject': None } extracted_details.update(meta_data) logger.info(f"Full extracted data: {extracted_details}") insert_data(extracted_details) # Global variable to control the email processing loop running = False # HTML content for the web interface html_content = """