Spaces:
Sleeping
Sleeping
# ---------------------------------------------------for backend looks------------------------------------------------- | |
#with open('/usr/local/lib/python3.10/site-packages/transformers/utils/chat_template_utils.py', 'r') as file: | |
#content = file.read() | |
#print("base.py:", content) | |
# ------------------------------------------------------the end-------------------------------------------------------- | |
# =========================================== | |
# !-----app.py | |
# =========================================== | |
import json | |
import asyncio | |
import os | |
import re | |
import requests | |
from dotenv import load_dotenv | |
import chainlit as cl | |
from langchain import hub | |
from langchain_openai import OpenAI | |
from langchain.chains import LLMChain | |
from langchain_core.prompts import PromptTemplate | |
from langchain.memory.buffer import ConversationBufferMemory | |
load_dotenv() | |
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") | |
auth_token = os.environ.get("CHAINLIT_AUTH_SECRET") | |
# API endpoint | |
API_URL = "https://aivisions.no/data/daysoff/api/v1/booking/" | |
# LLM prompt template | |
daysoff_assistant_template = """ | |
#You are a customer support assistant (โkundeservice AI assistentโ) for Daysoff. | |
#By default, you respond in Norwegian language, using a warm, direct, and professional tone. | |
Your expertise is exclusively in retrieving booking information for a given booking ID assistance related to | |
to this. | |
You do not provide information outside of this scope. If a question is not about this topic, respond with | |
"Jeg driver faktisk kun med henvendelser omkring bestillingsinformasjon. Gjelder det andre henvendelser | |
mรฅ du nok kontakte kundeservice pรฅ [email protected]๐" | |
""" | |
daysoff_assistant_prompt = PromptTemplate( | |
input_variables=["chat_history", "question"], | |
template=daysoff_assistant_template, | |
) | |
# Async wrapper for requests.post | |
async def async_post_request(url, headers, data): | |
return await asyncio.to_thread(requests.post, url, headers=headers, json=data) | |
def setup_multiple_chains(): | |
llm = OpenAI( | |
model="gpt-3.5-turbo-instruct", | |
temperature=0.7, | |
openai_api_key=OPENAI_API_KEY, | |
max_tokens=2048, | |
top_p=0.9, | |
frequency_penalty=0.1, | |
presence_penalty=0.1, | |
) | |
conversation_memory = ConversationBufferMemory( | |
memory_key="chat_history", max_len=30, return_messages=True | |
) | |
llm_chain = LLMChain( | |
llm=llm, | |
prompt=daysoff_assistant_prompt, | |
memory=conversation_memory, | |
) | |
cl.user_session.set("llm_chain", llm_chain) | |
async def handle_message(message: cl.Message): | |
user_message = message.content | |
llm_chain = cl.user_session.get("llm_chain") | |
booking_pattern = r'\b[A-Z]{6}\d{6}\b' | |
match = re.search(booking_pattern, user_message) | |
if match: | |
bestillingskode = match.group() | |
headers = { | |
"Authorization": auth_token, | |
"Content-Type": "application/json" | |
} | |
payload = {"booking_id": bestillingskode} | |
try: | |
response = await async_post_request(API_URL, headers, payload) | |
response.raise_for_status() | |
booking_data = response.json() | |
if "booking_id" in booking_data: | |
await cl.Message( | |
content=f""" | |
Booking Info: | |
- Booking ID: {booking_data.get('booking_id', 'N/A')} | |
- Full Name: {booking_data.get('full_name', 'N/A')} | |
- Amount: {booking_data.get('amount', 0)} | |
- Check-in: {booking_data.get('checkin', 'N/A')} | |
- Check-out: {booking_data.get('checkout', 'N/A')} | |
- Address: {booking_data.get('address', 'N/A')} | |
- User ID: {booking_data.get('user_id', 0)} | |
- Info Text: {booking_data.get('infotext', 'N/A')} | |
- Included: {booking_data.get('included', 'N/A')} | |
""" | |
).send() | |
else: | |
await cl.Message(content="Booking not found or invalid response.").send() | |
except requests.exceptions.RequestException as e: | |
await cl.Message(content=f"Request failed: {str(e)}").send() | |
else: | |
response = await llm_chain.ainvoke(user_message, callbacks=[cl.AsyncLangchainCallbackHandler()]) | |
response_key = "output" if "output" in response else "text" | |
await cl.Message(response.get(response_key, "")).send() | |
return message.content | |