File size: 3,987 Bytes
c066489
 
 
 
 
 
 
 
 
bddc184
13b2053
 
 
 
9e98957
 
 
5e20594
 
 
 
 
 
 
3b0d04c
9e98957
 
 
 
 
 
 
 
 
 
 
 
 
 
c066489
afb4c93
fddab77
3b0d04c
 
633a011
 
174a913
3b0d04c
 
 
 
 
afb4c93
 
 
f2aae0d
 
 
451c271
633a011
 
f2aae0d
 
afb4c93
45be55d
 
 
 
c53a1c5
bddc184
c53a1c5
 
 
 
 
 
 
9e98957
c066489
 
 
9e98957
c066489
 
 
87521b4
afb4c93
320328c
5e20594
 
afb4c93
4d2023a
5e20594
 
afb4c93
 
45be55d
 
c066489
 
 
9e98957
c066489
 
 
45be55d
 
9e98957
c066489
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
import openai
import gradio as gr
import os
import logging
import json

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

openai.api_key = os.environ['key']
initMsg = os.environ['init']
roleAns = os.environ['roleAns']
classAsk = os.environ['classAsk']
classAns = os.environ['classAns']
defaultMsg = os.environ['defaultMsg']

mod = 3;

def localRace(race):    
    race = race
    return race

def localClass(cls):    
    cls = cls
    return cls

def trimMessages(messages):
    # Assuming messages is an array of objects with "role" and "content" properties
    content = {}
    for message in messages:        
        if message["role"] == "assistant":
            if "Current Status:" in message["content"]:
                content = message["content"]
                start_index = message["content"].index("Current Status:") + len("Current Status:")
                end_index = message["content"].index("Wielding:")
                new_content = message["content"][:start_index] + message["content"][end_index:]
                message["content"] = new_content
    if content != {}:
        messages.append({"role": "assistant", "content": content})
    return messages

def getChooseRole(msg):
    start_index = msg.index("As a") + len("As a")
    if start_index >= 0:
        end_index = msg.index(",")
        str = msg[start_index:] + msg[:end_index]
        str = str.strip()
        if str.lower() == "dm":
            return ""
        else:
            return str
    else:
        return ""

def getChooseClass(msg):
    full = getChooseRole(msg)
    if full != "":
        start_index = full.index(" ") + len(" ")
        end_index = msg.index(",")
        str = full[start_index:] + full[:end_index]
        str = str.strip()
        return str
    else:
        return ""

def chatbot(input, localvar):    
    #messages = messages or [{"role": "system", "content": initMsg}]
    localvar = localvar or {"messages": [{"role": "system", "content": initMsg}], "race": "", "class": ""}
    messages = localvar['messages']
    #if len(messages) == 1:
        
        #memory = trimMessages(messages)
        #logging.info("put memory:"+printMessages(memory))
        #chat = openai.ChatCompletion.create(
        #    model="gpt-3.5-turbo", messages=memory,
        #    max_tokens=1048,n=1,temperature=0.5,
        #)
        #logging.info("put memory return:"+chat.choices[0].message.content)

    if input:
        messages.append({"role": "user", "content": input})
        chat = openai.ChatCompletion.create(
            model="gpt-3.5-turbo", messages=messages[-2:],
            max_tokens=2048,n=1,temperature=0.5,
        )
        reply = chat.choices[0].message.content
        logging.info("AI Reply:"+reply)
        ans = ""
        if len(messages) == 2:
            localvar['race'] = localRace(getChooseRole(reply))
            ans = "I choose "+ localvar['race'] +" as my race." + classAsk
            logging.info("ChooseRole:"+ans)
        if len(messages) == 4:
            localvar['class'] = getChooseClass(reply)
            ans = "My Race is "+ localvar['race'] +",I choose "+ localvar['class'] +" as my class." + classAns
            logging.info("ChooseClass:"+ans)
        messages.append({"role": "assistant", "content": ans})
        localvar['messages'] = messages
        return reply, printMessages(messages), localvar

def printMessages(messages):
    delimiter = '\n'
    msg_string = delimiter.join([f"{obj['role']}:{obj['content']}" for obj in messages])
    logging.info("messages:"+msg_string)
    return msg_string

app = gr.Interface(fn=chatbot, inputs=[gr.Textbox(lines=7, label="You ask and answer questions below"), "state"], 
                   outputs=[gr.Textbox(label="DND Game Reply", placeholder=roleAns), gr.Textbox(label="History"), "state"], title="DND Game",#, gr.Textbox(label="History"), 
                   description="DND Game",theme="compact")
app.launch(share=False)