Upload 3 files
Browse files- main.py +59 -0
- requirements.txt +5 -0
- sdluk.json +1 -0
main.py
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI, Request
|
2 |
+
from pydantic import BaseModel
|
3 |
+
import json
|
4 |
+
import os
|
5 |
+
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
|
6 |
+
from llama_index.core.schema import Document
|
7 |
+
from llama_index.llms.openai import OpenAI
|
8 |
+
|
9 |
+
# Load and prepare user data once at startup
|
10 |
+
with open("sdluk.json", "r", encoding="utf-8") as f:
|
11 |
+
raw_data = json.load(f)
|
12 |
+
|
13 |
+
user_id = "IpJycOGcYkPNs0iYhpzUigcvbBG2"
|
14 |
+
user_data = {
|
15 |
+
"profile": raw_data["__collections__"]["users"].get(user_id, {}),
|
16 |
+
"cart": [v for v in raw_data["__collections__"]["carts"].values() if v.get("userId") == user_id],
|
17 |
+
"favorites": [v for v in raw_data["__collections__"]["favorites"].values() if v.get("userId") == user_id],
|
18 |
+
"issues": [v for v in raw_data["__collections__"]["issue_reports"].values() if v.get("userId") == user_id],
|
19 |
+
"plans": list(raw_data["__collections__"]["pricingPlans"].values())[0]["plans"],
|
20 |
+
"products": list(raw_data["__collections__"]["products"].values()),
|
21 |
+
}
|
22 |
+
|
23 |
+
# Convert to document
|
24 |
+
document = Document(text=json.dumps(user_data, indent=2))
|
25 |
+
|
26 |
+
# Set OpenAI key (ensure this is set securely)
|
27 |
+
os.environ["OPENAI_API_KEY"] = "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"
|
28 |
+
|
29 |
+
# Initialize LLM and index
|
30 |
+
llm = OpenAI(model="gpt-4o")
|
31 |
+
index = VectorStoreIndex.from_documents([document])
|
32 |
+
query_engine = index.as_query_engine(llm=llm)
|
33 |
+
|
34 |
+
# Chatbot instruction
|
35 |
+
instruction = """
|
36 |
+
You are a friendly and smart assistant for a retail telecom company. Use the given user data (profile, cart, favorites, plans, issues, products) to answer questions.
|
37 |
+
|
38 |
+
1. Be polite and personalized if possible. Greetings and Politeness (e.g., "Hi", "Good morning", "How are you?")
|
39 |
+
- Respond politely and warmly like a friendly customer support assistant.
|
40 |
+
2. If the question is about products, look in 'products'.
|
41 |
+
3. For current plan or registration, use 'profile' and 'plans'.
|
42 |
+
4. For cart/favorite items, check 'cart' and 'favorites'.
|
43 |
+
5. For issues or help, refer to 'issues'.
|
44 |
+
6. If the info is missing, say: "I couldn't find that in your records. Want me to check online?"
|
45 |
+
|
46 |
+
Always answer clearly using available data.
|
47 |
+
"""
|
48 |
+
|
49 |
+
# FastAPI app
|
50 |
+
app = FastAPI()
|
51 |
+
|
52 |
+
class QueryInput(BaseModel):
|
53 |
+
query: str
|
54 |
+
|
55 |
+
@app.post("/chat")
|
56 |
+
def retail_chatbot(input: QueryInput):
|
57 |
+
full_prompt = f"instruction: {instruction}\nquery: {input.query}"
|
58 |
+
response = query_engine.query(full_prompt)
|
59 |
+
return {"response": response.response}
|
requirements.txt
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
fastapi
|
2 |
+
uvicorn
|
3 |
+
openai
|
4 |
+
llama-index
|
5 |
+
pydantic
|
sdluk.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"__collections__":{"carts":{"TpkT0g7CHFE7udbFY7u2":{"quantity":1,"productId":"3aI9JITZTpDonqEqUrbV","price":649,"title":"Galaxy Tab S10","userId":"IpJycOGcYkPNs0iYhpzUigcvbBG2","addedAt":{"__datatype__":"timestamp","value":{"_seconds":1743351032,"_nanoseconds":948000000}},"__collections__":{}}},"favorites":{"PmFZcasBjAdbZb3P0lyY":{"productId":"99CXhM0kUbaklQoytOce","title":"Pro Earbuds","userId":"IpJycOGcYkPNs0iYhpzUigcvbBG2","addedAt":{"__datatype__":"timestamp","value":{"_seconds":1743351021,"_nanoseconds":270000000}},"__collections__":{}}},"issue_reports":{"mw4RXqXiV2KIUpxPb5zB":{"issueType":"Ask for Help","description":"jo","title":"hi","priority":"Medium","userId":"IpJycOGcYkPNs0iYhpzUigcvbBG2","timestamp":{"__datatype__":"timestamp","value":{"_seconds":1743351334,"_nanoseconds":490000000}},"__collections__":{}}},"otps":{"[email protected]":{"otp":"141142","expiresAt":{"__datatype__":"timestamp","value":{"_seconds":1743351102,"_nanoseconds":182780000}},"createdAt":{"__datatype__":"timestamp","value":{"_seconds":1743350517,"_nanoseconds":589000000}},"verified":true,"__collections__":{}},"[email protected]":{"verified":false,"otp":"946051","expiresAt":{"__datatype__":"timestamp","value":{"_seconds":1743691043,"_nanoseconds":352295000}},"createdAt":{"__datatype__":"timestamp","value":{"_seconds":1743690442,"_nanoseconds":537000000}},"__collections__":{}}},"pricingPlans":{"zU60jnxDVNMrm8vgA97W":{"category":"DATA PLANS","plans":[{"dataLimit":"UNLIMITED ","price":30,"minutes":"Unlimited","data":"DATA UNLIMITED PLAN","texts":"Unlimited","discountPrice":25},{"texts":"Unlimited","dataLimit":"100GB","discountPrice":17,"data":"GIGA BOOST PLAN","price":25,"minutes":"Unlimited"},{"dataLimit":"80GB","discountPrice":15,"price":20,"data":"DATA LITE PLAN","minutes":"Unlimited","texts":"Unlimited"},{"price":15,"discountPrice":10,"minutes":"Unlimited","data":"MINI PLAN","texts":"Unlimited","dataLimit":"30GB"},{"dataLimit":"3GB","minutes":"Unlimited","texts":"Unlimited","discountPrice":5,"data":"FREEDOM PLAN","price":10}],"__collections__":{}}},"products":{"2SnlMfo7VvS7uuOWIOPH":{"salePercentage":0,"emoji":"๐ณ","reviews":78,"price":10,"rating":4.5,"description":"Standard + Micro + Nano","isSale":false,"isNew":false,"title":"Physical SIM Card","category":"SIM Cards","__collections__":{}},"3aI9JITZTpDonqEqUrbV":{"salePercentage":0,"emoji":"๐","reviews":92,"price":649,"rating":4.7,"description":"Premium Android tablet","isSale":false,"isNew":true,"title":"Galaxy Tab S10","category":"Tablets","__collections__":{}},"99CXhM0kUbaklQoytOce":{"salePercentage":0,"emoji":"๐ง","reviews":89,"price":199,"rating":5,"description":"Noise cancelling","isSale":false,"isNew":false,"title":"Pro Earbuds","category":"Accessories","__collections__":{}},"HDQ05AGVJ3Rx1WoM9eE8":{"salePercentage":0,"emoji":"๐ฑ","reviews":128,"price":899,"rating":4.5,"description":"Latest Android flagship","isSale":false,"isNew":true,"title":"Galaxy S25","category":"Phones","__collections__":{}},"TPIepQWGnAoh0WgNbZRA":{"salePercentage":0,"emoji":"โ","reviews":112,"price":299,"rating":4.8,"description":"Health & fitness tracking","isSale":false,"isNew":true,"title":"Smart Watch Pro","category":"Wearables","__collections__":{}},"jNpnUkXAaaovqO72UJZt":{"salePercentage":20,"emoji":"๐ ","reviews":67,"price":129,"rating":4.5,"description":"Voice controlled","isSale":true,"isNew":false,"title":"Smart Hub","category":"Smart Home","__collections__":{}},"nsfASK4Y5LpW1aowsY7t":{"salePercentage":10,"emoji":"๐ฎ","reviews":203,"price":69,"rating":4.6,"description":"Low latency wireless","isSale":true,"isNew":false,"title":"Gaming Controller","category":"Gaming","__collections__":{}},"pGfBLy0VFVWn55W9qbJi":{"salePercentage":0,"emoji":"๐ณ","reviews":45,"price":15,"rating":5,"description":"Digital SIM activation","isSale":false,"isNew":true,"title":"Premium eSIM","category":"SIM Cards","__collections__":{}},"qCzwl4V81KrVOjwwveFA":{"salePercentage":15,"emoji":"๐ฑ","reviews":256,"price":999,"rating":5,"description":"Pro Max Edition","isSale":true,"isNew":false,"title":"iPhone 16","category":"Phones","__collections__":{}}},"registrations":{"7MfWFe7hGqPE0WAFiNKW":{"simType":"esim","firstName":"kenthiran","lastName":"thiyakarasa","email":"[email protected]","confirmEmail":"[email protected]","sex":"male","age":"18","phone":"079139 23409","plan":"GIGA BOOST PLAN","price":"17","role":"manager","otherRole":"","dateOfBirth":"2007-04-05","houseNumber":"12","address":"123 Example Street","city":"Kathiraveli","postcode":"BA21 3DJ","marketingConsent":false,"lookupPostcode":"","status":"pending","createdAt":{"__datatype__":"timestamp","value":{"_seconds":1743827686,"_nanoseconds":869000000}},"adminNotified":true,"__collections__":{}}},"users":{"IpJycOGcYkPNs0iYhpzUigcvbBG2":{"packageDetails":"Unlimited - 60","gender":"Male","address2":"UK","city":"UK","isVerified":true,"address1":"UK","postalCode":"UK","createdAt":"2025-03-30T21:32:13.155496","dob":"2025-03-04","designation":"Student","email":"[email protected]","age":"25","username":"kenthu","contactNo":"0757105553","__collections__":{}},"sampleUserId123":{"phoneNumber":"+1234567890","name":"Karthik","email":"[email protected]","createdAt":{"__datatype__":"timestamp","value":{"_seconds":1743350924,"_nanoseconds":159000000}},"__collections__":{}}}}}
|