|
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 localVar(lv): |
|
lv = lv or {"race":"", "cls":""} |
|
return lv |
|
|
|
def trimMessages(messages): |
|
|
|
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 = trim(msg[start_index:] + msg[:end_index]) |
|
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(",") |
|
return trim(full[start_index:] + full[:end_index]) |
|
else: |
|
return "" |
|
|
|
def chatbot(input, messages): |
|
messages = messages or [{"role": "system", "content": initMsg}] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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: |
|
lv.race = getChooseRole(reply) |
|
lv.cls = "" |
|
lv = localVar(lv) |
|
ans = "I choose "+ lv.race +" as my race." + classAsk |
|
logging.info("ChooseRole:"+ans) |
|
if len(messages) == 4: |
|
lv = localVar(lv) |
|
lv.cls = getChooseClass(reply) |
|
lv = localVar(lv) |
|
ans = "My Race is "+ lv.race +",I choose "+ lv.cls +" as my class." + classAns |
|
logging.info("ChooseClass:"+ans) |
|
messages.append({"role": "assistant", "content": ans}) |
|
return reply, printMessages(messages), messages |
|
|
|
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", |
|
description="DND Game",theme="compact") |
|
app.launch(share=False) |