|
import gradio as gr |
|
import pandas as pd |
|
import random |
|
import json |
|
|
|
with open('pokemon.json', 'r') as f: |
|
pokemons = json.load(f) |
|
pokemons_types = ["λͺ¨λ νμ
"] + sorted(set([t for poke in pokemons for t in poke['types']])) |
|
df = pd.DataFrame(pokemons) |
|
GEN_RANGE = { |
|
"λͺ¨λ μΈλ": [1, 1017], |
|
"1μΈλ": [1, 151], |
|
"2μΈλ": [152, 251], |
|
"3μΈλ": [252, 386], |
|
"4μΈλ": [387, 493], |
|
"5μΈλ": [494, 649], |
|
"6μΈλ": [650, 721], |
|
"7μΈλ": [722, 809], |
|
"8μΈλ": [810, 905], |
|
"9μΈλ": [906, 1017] |
|
} |
|
|
|
QUESTION_TEMPLATE = {"question": "λ€μ ν¬μΌλͺ¬μ μ΄λ¦μ λκΉμ?![]({img_url})", "answer": "{name}"} |
|
|
|
def get_question_answer(pokemons_set): |
|
chosen = random.choice(pokemons_set) |
|
name = chosen['name'] |
|
image_path = chosen['image_path'] |
|
answer.value = QUESTION_TEMPLATE['answer'].format(name=name) |
|
img_url = f"https://huggingface.co/spaces/yoon-gu/pokemon/resolve/main/{image_path}" |
|
q = QUESTION_TEMPLATE["question"].format(img_url=img_url) |
|
a = QUESTION_TEMPLATE['answer'].format(name=name) |
|
return q, a |
|
|
|
MD = """# ν¬μΌλͺ¬ ν΄μ¦ |
|
""" |
|
with gr.Blocks() as demo: |
|
quiz_start = gr.State(value=False) |
|
score = gr.State(value=0) |
|
answer = gr.State(value="") |
|
with gr.Row(): |
|
with gr.Column(): |
|
gr.Markdown(MD) |
|
with gr.Column(): |
|
with gr.Row(): |
|
generation = gr.Dropdown( |
|
[f"{k}μΈλ" for k in range(1, 10)] + ["λͺ¨λ μΈλ"], value="1μΈλ", label="ν¬μΌλͺ¬ μΈλ", info="μνλ ν¬μΌλͺ¬ μΈλλ₯Ό μ ννμΈμ." |
|
) |
|
poke_types = gr.Dropdown( |
|
pokemons_types, value="λͺ¨λ νμ
", label="ν¬μΌλͺ¬ νμ
", info="μνλ ν¬μΌλͺ¬ νμ
μ μ ννμΈμ." |
|
) |
|
chatbot = gr.Chatbot(bubble_full_width=False) |
|
msg = gr.Textbox(value="ν΄μ¦ μμ") |
|
clear = gr.ClearButton([msg, chatbot, quiz_start]) |
|
|
|
def respond(gen, types, message, chat_history, request: gr.Request): |
|
start, end = GEN_RANGE[gen] |
|
sdf = df[start:end] |
|
pokemons_set = sdf[sdf['types'].apply(lambda x: (types in x)) | (types == "λͺ¨λ νμ
")] |
|
pokemons_set = pokemons_set.to_dict("records") |
|
if "ν΄μ¦ μμ" == message: |
|
quiz_start.value = True |
|
if not quiz_start.value: |
|
if "ν΄μ¦ μμ" == message: |
|
q, a = get_question_answer(pokemons_set) |
|
bot_message = f"ν΄μ¦λ₯Ό μμν©λλ€.\n{q}" |
|
answer.value = a |
|
quiz_start.value = True |
|
else: |
|
bot_message = "ν΄μ¦λ₯Ό μμνκ³ μΆμΌμλ©΄, **ν΄μ¦ μμ**μ΄λΌκ³ λ§μν΄μ£ΌμΈμ." |
|
else: |
|
if answer.value == message: |
|
q, a = get_question_answer(pokemons_set) |
|
answer.value = a |
|
bot_message = f"πμ λ΅μ
λλ€! λ€μ λ¬Έμ μ
λλ€.\n{q}" |
|
else: |
|
bot_message = f"***{message}***!? π§ λ€μ νλ² μκ°ν΄λ³΄μΈμ." |
|
|
|
chat_history.append((message, bot_message)) |
|
return "", chat_history |
|
|
|
msg.submit(respond, [generation, poke_types, msg, chatbot], [msg, chatbot]) |
|
|
|
demo.queue(concurrency_count=3) |
|
demo.launch() |