File size: 4,545 Bytes
12654ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78b9b84
12654ba
 
 
b830cee
12654ba
c34676c
 
 
 
efdd6c6
 
 
12654ba
 
 
 
 
 
7e8476d
12654ba
 
 
 
 
 
0a4de8f
12654ba
 
 
 
 
 
 
 
 
a77a669
c34676c
 
a77a669
 
12654ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efdd6c6
e7058ea
 
 
 
 
3644676
e7058ea
 
 
 
 
 
 
 
 
efdd6c6
12654ba
 
e7058ea
12654ba
 
 
a77a669
 
 
 
 
 
 
 
 
 
 
4313ed0
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# ===========================================
# !-----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("DAYSOFF_API_TOKEN")

API_URL = "https://aivisions.no/data/daysoff/api/v1/booking/"

# You help users retrieve booking information associated with their booking IDs.Provide a conversational answer.
daysoff_assistant_template = """
You are a customer support assistant for Daysoff kundeservice and help users retrieve booking information associated with their booking IDs.
By default, you respond in Norwegian language.
You should always keep in mind the professionalism and warmth of a real human female customer support representative when you provide users with their
the reqyested booking information in a conversational answer.
Chat History: {chat_history}
Question: {question}
Answer:
"""
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)

@cl.on_chat_start
def setup_multiple_chains():
    llm = OpenAI(
        model="gpt-3.5-turbo-instruct", # 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",
        #input_key="question",  # ?
        #output_key="text",     # ?
        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)

@cl.on_message
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:
    
                table = (
                    "| Field      | Info                |\n"
                    "|:-----------|:---------------------|\n"
                    f"| Booking ID | {booking_data.get('booking_id', 'N/A')} |\n"
                    f"| Full Name  | {booking_data.get('full_name', 'N/A')} |\n"
                    f"| Amount     | {booking_data.get('amount', 0)} kr |\n"
                    f"| Check-in   | {booking_data.get('checkin', 'N/A')} |\n"
                    f"| Check-out  | {booking_data.get('checkout', 'N/A')} |\n"
                    f"| Address    | {booking_data.get('address', 'N/A')} |\n"
                    f"| User ID    | {booking_data.get('user_id', 0)} |\n"
                    f"| Info Text  | {booking_data.get('infotext', 'N/A')} |\n"
                    f"| Included   | {booking_data.get('included', 'N/A')} |"
                )
                
                await cl.Message(content=table).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:
        try:
            response = await llm_chain.ainvoke({
                "question": user_message,
                "chat_history": ""
            }, callbacks=[cl.AsyncLangchainCallbackHandler()])
            
            await cl.Message(content=response["text"]).send()
            
        except Exception as e:
            await cl.Message(content=f"Error: {str(e)}").send()