File size: 4,871 Bytes
edf06dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60c332f
edf06dd
58c4259
 
 
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
import os
import requests
import openai
from openai import OpenAI
import gradio as gr

# Set up API key
API_KEY = os.getenv("API_KEY")
URL = os.getenv("URL")
client = OpenAI(
    api_key=API_KEY,
    base_url= URL
)

def generate_character_prompt(persona, quotes):
    return f"You are role-playing as a character with the following persona:\n{persona}\n\nSome of your notable quotes are:\n{quotes}\n\nRespond in character to the user's messages."

def chat_with_character(message, persona, quotes, chat_history):
    prompt = generate_character_prompt(persona, quotes)
    
    messages = [
        {"role": "system", "content": prompt},
    ]
    
    for human, ai in chat_history:
        messages.append({"role": "user", "content": human})
        messages.append({"role": "assistant", "content": ai})
    
    messages.append({"role": "user", "content": message})
    
    return messages

# Example characters
examples = [
    {
        "name": "Sherlock Holmes",
        "image": "https://upload.wikimedia.org/wikipedia/commons/c/cd/Sherlock_Holmes_Portrait_Paget.jpg",
        "persona": "A brilliant detective known for his logical reasoning and deductive skills. Eccentric, observant, and sometimes arrogant.",
        "quotes": "- 'Elementary, my dear Watson.'\n- 'When you have eliminated the impossible, whatever remains, however improbable, must be the truth.'\n- 'The game is afoot.'"
    },
    {
        "name": "Darth Vader",
        "image": "https://upload.wikimedia.org/wikipedia/en/0/0b/Darth_Vader_in_The_Empire_Strikes_Back.jpg",
        "persona": "A powerful Sith Lord and enforcer for the Galactic Empire. Formerly Anakin Skywalker, now more machine than man. Intimidating and ruthless.",
        "quotes": "- 'I find your lack of faith disturbing.'\n- 'No, I am your father.'\n- 'The Force is strong with this one.'"
    },
    {
        "name": "Elizabeth Bennet",
        "image": "https://static.wikia.nocookie.net/janeausten/images/e/e8/Elizabeth-bennet-miss-elizabeth.jpg",
        "persona": "The protagonist of Jane Austen's Pride and Prejudice. Intelligent, witty, and playful. Values independence and isn't afraid to speak her mind.",
        "quotes": "- 'For what do we live, but to make sport for our neighbors, and laugh at them in our turn?'\n- 'I could easily forgive his pride, if he had not mortified mine.'\n- 'There are few people whom I really love, and still fewer of whom I think well.'"
    },
    {
        "name": "Asuna Yuuki",
        "image": "https://static.wikia.nocookie.net/swordartonline/images/0/06/Asuna_with_Yui_Biprobe.png",
        "persona": "A skilled swordswoman and sub-leader of the Knights of the Blood Oath in Sword Art Online. Known as 'The Flash' for her lightning-fast sword skills. Strong-willed, intelligent, and caring. Develops a close relationship with Kirito.",
        "quotes": "- 'I don't want to lose anyone anymore.'\n- 'Even if I die, you keep living okay? Live to see the end of this world, and to see why it was born.'\n- 'My life belongs to you, Kirito. So I'll use it for you.'\n- 'I'll protect you.'"
    }
]

def select_character(evt: gr.SelectData):
    selected = examples[evt.index]
    return selected["persona"], selected["quotes"]

def respond(message, chat_history, persona, quotes):
    messages = chat_with_character(message, persona, quotes, chat_history)
    partial_message = ""
    for chunk in client.chat.completions.create(
        model="Meta-Llama-3.1-405B-Instruct",
        messages=messages,
        stream = True
    ):
        partial_message += chunk.choices[0].delta.content or ""
        yield "", chat_history + [[message, partial_message]]
    chat_history.append((message, partial_message))
    return "", chat_history

with gr.Blocks() as demo:
    gr.Markdown("# Persona AI: AI-Powered Chat")
    gr.Markdown(f"<a href='https://sambanova.ai/fast-api?api_ref=907266'> powered by Llama3.1 405B through SN fast API</a>")
    with gr.Row():
        with gr.Column(scale=1):
            gallery = gr.Gallery(
                [ex["image"] for ex in examples],
                label="Select a character",
                show_label=True,
                elem_id="gallery",
                columns=2,
                rows=2,
                height=400
            )
        
        with gr.Column(scale=2):
            persona_input = gr.Textbox(label="Character Persona", lines=5)
            quotes_input = gr.Textbox(label="Character Quotes", lines=5)
    
    gallery.select(select_character, None, [persona_input, quotes_input])
    
    chatbot = gr.Chatbot()
    msg = gr.Textbox()
    clear = gr.Button("Clear")

    msg.submit(respond, [msg, chatbot, persona_input, quotes_input], [msg, chatbot])
    clear.click(lambda: None, None, chatbot, queue=False)

if __name__ == "__main__":
    demo.queue(max_size=20)
    demo.launch(max_threads = 5)