File size: 4,718 Bytes
1f7542b
 
 
 
4ddf4f2
 
12fc0e4
4ddf4f2
 
1f7542b
 
 
 
 
 
 
 
1378b3b
1f7542b
 
 
 
1378b3b
4ddf4f2
1378b3b
 
c3c81f6
c768bce
50a8343
 
1f7542b
 
 
832aaea
f07c0a1
 
376a0a9
1f7542b
 
 
 
50a8343
26fe4df
 
1f7542b
 
 
 
 
c768bce
1f7542b
c768bce
1f7542b
4ddf4f2
22b0671
12fc0e4
4ddf4f2
c768bce
1378b3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c3c81f6
1378b3b
4dd02a3
1378b3b
 
12fc0e4
1ba3b01
 
4ddf4f2
 
 
12c72db
ab372d4
9dd8e4a
 
 
 
1f7542b
ab372d4
1f7542b
 
932bf9e
ab372d4
 
 
1f7542b
204de46
fab4b1c
12fc0e4
 
1c8ab2e
1f7542b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import urllib
import warnings
from pathlib import Path as p
from pprint import pprint
import os
import time
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
import pandas as pd
from langchain import PromptTemplate
from langchain.chains.question_answering import load_qa_chain
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
import os
from fastapi.responses import JSONResponse
from pydantic import BaseModel  # Add this import
# restart python kernal if issues with langchain import.
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_google_genai import GoogleGenerativeAIEmbeddings
import uuid  # for generating unique IDs
import datetime
from fastapi.middleware.cors import CORSMiddleware
from fastapi.templating import Jinja2Templates
import json
from deep_translator import GoogleTranslator
from langchain.embeddings import HuggingFaceEmbeddings
from sentence_transformers import SentenceTransformer
import re
GOOGLE_API_KEY= os.getenv("HF_TOKEN")
warnings.filterwarnings("ignore")
model = ChatGoogleGenerativeAI(model="gemini-pro",google_api_key=GOOGLE_API_KEY,
                             temperature=0.2,convert_system_message_to_human=True,system_message="You are the Hotel voice chatbot and your name is Hotel Helper. Your goal is to provide accurate, professional, and helpful answers to user queries based on the hotel's data. Always ensure your responses are clear and concise. Give response within 10-15 words only. Respond in the same language as the user's query."
                              )
pdf_loader = PyPDFLoader("data/ITCGrandChola.pdf")
pages = pdf_loader.load_and_split()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000, chunk_overlap=1000)
context = "\n\n".join(str(p.page_content) for p in pages)
texts = text_splitter.split_text(context)
#embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001",google_api_key=GOOGLE_API_KEY)
#sentence_transformer_model = SentenceTransformer()
embeddings = HuggingFaceEmbeddings(model_name='BAAI/bge-small-en-v1.5')
vector_index = Chroma.from_texts(texts, embeddings).as_retriever(search_kwargs={"k":10})
qa_chain = RetrievalQA.from_chain_type(
    model,
    retriever=vector_index,
    return_source_documents=True

)

class MessageRequest(BaseModel):  # Define the MessageRequest model
    message: str
    language: str

app = FastAPI()

@app.middleware("http")
async def add_security_headers(request: Request, call_next):
    response = await call_next(request)
    response.headers["Content-Security-Policy"] = "frame-ancestors *; frame-src *; object-src *;"
    response.headers["X-Frame-Options"] = "ALLOWALL"
    return response
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/favicon.ico")
async def favicon():
    return HTMLResponse("")  # or serve a real favicon if you have one

app.mount("/static", StaticFiles(directory="static"), name="static")

templates = Jinja2Templates(directory="static")
@app.get("/ch/{id}", response_class=HTMLResponse)
async def load_chat(request: Request, id: str):
    return templates.TemplateResponse("index.html", {"request": request, "user_id": id})
@app.post("/chat/")
async def chat(request: MessageRequest):
    message = request.message  # Access the message from the request body
    language = request.language
    language_code = request.language.split('-')[0]
    system_message="You are the Hotel voice chatbot and your name is hotel helper. Your goal is to provide accurate, professional, and helpful answers to user queries based on the hotel's data. Always ensure your responses are clear and concise. Give response within 10-15 words only."
    response = qa_chain({"query": message,
                        "system_message": system_message
                        })
    response1 = response['result']  # Correctly access the response result
    try:
        translator = GoogleTranslator(source='en', target=language_code)  # Translate to target language
        response1 = translator.translate(response1)
        print(response1)
    except Exception as e:
        # Handle translation errors
        print(f"Translation error: {e}")
        response1 = "Sorry, I couldn't translate the response."
    print(f"Selected Language: {language}")
    return {"response": response1}

@app.get("/")
def read_root(request: Request):
    return templates.TemplateResponse("home.html", {"request": request})