import os import aiohttp import asyncio import requests from fastapi import FastAPI, HTTPException import openai # Initialize FastAPI app app = FastAPI() # Set your OpenAI API key here openai.api_key = os.environ["OPENAI_API_KEY"] # Authorization headers AUTH_HEADERS = { 'X-Tenant': 'royalexpress', 'Accept': 'application/json', 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIiwianRpIjoiYjczMDAxYzMyMTE1ZGIyNTY4ODUzMTg2OWVjMzUwNTdjZmE3YTJmN2I3ZWZjMjQzNjdmZTA2ZTk4ZjY4ZjMwMTE0ZTIzOGUwY2I0ZmQ0YjIiLCJpYXQiOjE3MzA3ODIxNjEuMjkyNDM0LCJuYmYiOjE3MzA3ODIxNjEuMjkyNDM3LCJleHAiOjQ4ODY0NTU3NjEuMDc2ODExLCJzdWIiOiIxIiwic2NvcGVzIjpbXX0.I4wGFzoepmAC2RaADetE95BdbY4AYPUfUouFepVthZq_KewQLoYEiYMmxErgAOvYDL9IdhTg8pHm3KtCjtfF79Toigvzl-4RIYE9qwavVYabUaIMtxdkvLmzC2uSSxNkQ-Jx4ZsEVt34NpMMZ6ZsMsgszkreed_s7i5I6ek6T2-p9cZYPpFfGhlRIrgAhOL1yZe0t5HQMM7P1cULB7IMb3s0fvwLNBimPC4Iznick5o2lWO6KcubsKSAMyPwBaCQhjGTKd0eJCde1IvL8mEaMvhu8v853AIDSiBsC83hjK41hPAaiBHeev1JjdDhEd6_qO9dpucKaGCqYiVfBFH_pgnynErmhKlPEIz7sZlBWz8zxISDW5PRo9d-jXRP-A31W76Q3H-ZKfnam0D8yYFY0EIZHhvgvZUl3r0dR4PRh7PYlNZgnyfAcAYmK9Bektjbbx5RuzH6gtT9hLQrxYiQNg0irCNwgTYnuQ4AjPA3BpZuOfWtygeDZKgv1gnveTzMJG7T6s95k8yNSNT1_OfRQONPX8LBasRwZWCGkWj7fopO6K8gcrEU5FIpql0UviwGJOTZeFmqwWJ1AIcOM0MHWNp--Y8evHrvuNGk3SDcjBcvhF58I2Hd5F4MefN_ZB9N7oxUUDBYbxnTH6SN7Wx-VsluEOlf9ShfBNvHZaUi61E' } # Helper function to get the order ID from the waybill number def get_order_id(waybill_no): url = f"https://dev3.api.curfox.parallaxtec.com/api/ml/order/{waybill_no}" response = requests.get(url, headers=AUTH_HEADERS) if response.status_code == 200: return response.json().get("data", {}).get("id") else: raise HTTPException(status_code=404, detail="Order ID not found") # Asynchronous function to fetch data concurrently async def fetch_data(session, url): async with session.get(url, headers=AUTH_HEADERS) as response: return await response.text() # Asynchronous function to get all order data async def get_all_order_data(order_id): urls = [ f"https://dev3.api.curfox.parallaxtec.com/api/ml/order/{order_id}/time-line", f"https://dev3.api.curfox.parallaxtec.com/api/ml/order/{order_id}/finance-time-line", f"https://dev3.api.curfox.parallaxtec.com/api/ml/order/{order_id}/invoice-time-line" ] async with aiohttp.ClientSession() as session: tasks = [fetch_data(session, url) for url in urls] responses = await asyncio.gather(*tasks) full_data = { "Timeline Details": responses[0], "Finance Time Line": responses[1], "Invoice Time Line": responses[2] } return full_data # Function to interact with OpenAI API def ask_openai(messages): response = openai.ChatCompletion.create(model="gpt-4o-mini", messages=messages) return response.choices[0].message['content'] # Main endpoint to handle user queries @app.post("/process_query/") async def process_query(query: str): # Initial message to check for waybill number in the query messages = [ {"role": "system", "content": "You are a helpful assistant for Curfox delivery system."}, {"role": "user", "content": f"""always check user query mentioned the order number/id (example : CA000001) if order id provided then output is only : "done" if user not given the order number then ask the number from user (include or response to greetings) user query : {query}""" } ] result = ask_openai(messages) if result == "done": # Extract the waybill number extract_message = [ {"role": "system", "content": "You are a helpful assistant for Curfox delivery system."}, {"role": "user", "content": f"""extract the number from the user query example output is only : CA000001 user query : {query}""" } ] waybill_number = ask_openai(extract_message) # Fetch order ID and order details try: order_id = get_order_id(waybill_number) full_data = await get_all_order_data(order_id) except HTTPException as e: return {"error": str(e.detail)} # Generate final response based on collected data response_message = [ {"role": "system", "content": "You are a helpful assistant for Curfox delivery system."}, {"role": "user", "content": f"Answer based on the provided data only. Data: {full_data}. User query: {query}"} ] final_answer = ask_openai(response_message) return {"answer": final_answer} else: # If no order number is found, prompt the user return {"message": result} # Start the FastAPI app # Run the app on Colab using Uvicorn # import uvicorn # uvicorn.run(app, host="0.0.0.0", port=8000)