curfox_chatbot / main.py
Arafath10's picture
Update main.py
f077ece verified
raw
history blame
4.91 kB
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)