from typing import Callable, Literal
import gradio as gr
from uuid import uuid4
chinese_examples = [
["你好!"],
["你是谁?"],
["请介绍一下上海"],
["请介绍一下英特尔公司"],
["晚上睡不着怎么办?"],
["给我讲一个年轻人奋斗创业最终取得成功的故事。"],
["给这个故事起一个标题。"],
]
english_examples = [
["Hello there! How are you doing?"],
["What is OpenVINO?"],
["Who are you?"],
["Can you explain to me briefly what is Python programming language?"],
["Explain the plot of Cinderella in a sentence."],
["What are some common mistakes to avoid when writing code?"],
["Write a 100-word blog post on “Benefits of Artificial Intelligence and OpenVINO“"],
]
japanese_examples = [
["こんにちは!調子はどうですか?"],
["OpenVINOとは何ですか?"],
["あなたは誰ですか?"],
["Pythonプログラミング言語とは何か簡単に説明してもらえますか?"],
["シンデレラのあらすじを一文で説明してください。"],
["コードを書くときに避けるべきよくある間違いは何ですか?"],
["人工知能と「OpenVINOの利点」について100語程度のブログ記事を書いてください。"],
]
def get_uuid():
"""
universal unique identifier for thread
"""
return str(uuid4())
def handle_user_message(message, history):
"""
callback function for updating user messages in interface on submit button click
Params:
message: current message
history: conversation history
Returns:
None
"""
# Append the user's message to the conversation history
return "", history + [[message, ""]]
def make_demo(
run_fn: Callable,
stop_fn: Callable,
title: str = "OpenVINO Chatbot",
language: Literal["English", "Chinese", "Japanese"] = "English"
):
# Define examples based on the selected language
examples = (
chinese_examples if language == "Chinese"
else japanese_examples if language == "Japanese"
else english_examples
)
with gr.Blocks(
theme=gr.themes.Soft(),
css=".disclaimer {font-variant-caps: all-small-caps;}"
) as demo:
conversation_id = gr.State(get_uuid) # Ensure get_uuid is defined elsewhere
gr.Markdown(f"
{title}
")
chatbot = gr.Chatbot(height=500)
# User message input
with gr.Row():
with gr.Column():
msg = gr.Textbox(
label="Chat Message Box",
placeholder="Chat Message Box",
show_label=False,
container=False,
)
with gr.Column():
submit = gr.Button("Submit")
stop = gr.Button("Stop")
clear = gr.Button("Clear")
# Advanced options for the chat
with gr.Row():
with gr.Accordion("Advanced Options:", open=False):
temperature = gr.Slider(
label="Temperature",
value=0.1,
minimum=0.0,
maximum=1.0,
step=0.1,
interactive=True,
info="Higher values produce more diverse outputs",
)
top_p = gr.Slider(
label="Top-p (nucleus sampling)",
value=1.0,
minimum=0.0,
maximum=1.0,
step=0.01,
interactive=True,
info=("Sample from the smallest possible set of tokens whose cumulative probability exceeds top_p. "
"Set to 1 to disable and sample from all tokens."),
)
top_k = gr.Slider(
label="Top-k",
value=50,
minimum=0,
maximum=200,
step=1,
interactive=True,
info="Sample from a shortlist of top-k tokens — 0 to disable and sample from all tokens.",
)
repetition_penalty = gr.Slider(
label="Repetition Penalty",
value=1.1,
minimum=1.0,
maximum=2.0,
step=0.1,
interactive=True,
info="Penalize repetition — 1.0 to disable.",
)
# Example messages
gr.Examples(examples, inputs=msg, label="Click on any example and press the 'Submit' button")
# Submit message event
submit_event = msg.submit(
fn=handle_user_message,
inputs=[msg, chatbot],
outputs=[msg, chatbot],
queue=False,
).then(
fn=run_fn,
inputs=[chatbot, temperature, top_p, top_k, repetition_penalty, conversation_id],
outputs=chatbot,
queue=True,
)
# Submit button click event
submit.click(
fn=handle_user_message,
inputs=[msg, chatbot],
outputs=[msg, chatbot],
queue=False,
).then(
fn=run_fn,
inputs=[chatbot, temperature, top_p, top_k, repetition_penalty, conversation_id],
outputs=chatbot,
queue=True,
)
# Stop button functionality
stop.click(
fn=stop_fn,
inputs=None,
outputs=None,
cancels=[submit_event], # Cancels the submission event
queue=False,
)
# Clear chat button functionality
clear.click(lambda: None, None, chatbot, queue=False)
return demo