Spaces:
Running
Running
ChenyuRabbitLove
commited on
Commit
•
00da133
1
Parent(s):
ac80710
refactor: change the render order to one response a time
Browse files- app.py +57 -8
- utils/completion_reward.py +42 -6
- utils/completion_reward_utils.py +15 -6
app.py
CHANGED
@@ -21,6 +21,7 @@ from utils.completion_reward_utils import (
|
|
21 |
create_certificate,
|
22 |
complete_reward,
|
23 |
check_is_in_completion_reward,
|
|
|
24 |
)
|
25 |
|
26 |
seafoam = Seafoam()
|
@@ -49,8 +50,12 @@ def get_player_info(player_backend_user_id):
|
|
49 |
|
50 |
temp_log = """你開始了星空探險隊的冒險! 你在離家 2 天後,找到了迷失已久的星際繪圖師,並在他的引導下進入了下一個未知的領域。 在完成了 41 關學習內容後,你獲得了遙遠星球上的神秘遺產。 在某天,你在冰晶極地找到了一顆具有神秘力量的寒冰寶石。 你在奇特的花園中找到了一種新的能源。 在雲端星球中,你遇見了一位雲之精靈,並從她那裡獲得了一個神祕的能量水球。 132 天之後,你們獲得了一個神秘的地圖,這將引導你們找到隱藏的神秘能量源。\n你們在一個古老的地下洞穴中找到了一個巨大的藍色能量晶體,這將極大地援助你們的旅程。 你在混亂的黑洞中找到了一片完好無損的石碑,上面記載著光束寶石的由來和使用方式。 你用寶石的力量召喚傳說中的先知,獲得了狐狸貓族的力量, 向黑洞發動了終極一擊。 你在繼續活動了 7 天後,你的行為感動了星際,你獲得了一個可以轉換成任何形象的能量護盾。 你在一場巨大的黑洞爆炸後,成功找回了去往家鄉的方向。 連日交戰後達成了學習 209 個內容的紀錄,獲得了星系長老的讚賞,並贈與你們神秘的光護符。 你成功與神秘的月亮寶石建立連結,從而獲得月亮之力。 你在遙遠的星海之上發現了一顆寂靜的星體,星體的中心藏有一個帶著神秘能量的寶藏。 你在神祕的狐狸貓族祖先墳場找到了一塊古老的碑文,裡面記載了如何使用和提煉能量的方法。 在經歷了若干日月後,你終於在 229 號洞穴找到了第一塊結晶。 你們在探索神秘洞穴的過程中,發現了一個神秘寶箱,裡面有 229 個神秘道具。 你們在冬季島上找到了冰晶葉,並獲得了 678 點的能量。 你剛剛結束了 14 天的劍橋學堂,你們獲得了 726 點的能量供給。 你剛剛結束了 14 天的劍橋學堂,你們獲得了 726 點的能量供給。 你在星空探險隊的冒險期間和狐貍貓一起度過了聖誕佳節 🎄 你從超空間黑洞脫離時發現了一串神秘的密碼,這個密碼包含著黑洞能量的謎題。 你們在一個神秘的星球上探險,在那裡你們發現了新的能量源。 你們在一片未知的領域中尋找到了狐狸貓族的古老遺蹟,並獲得了 780 的能量點數。 你收集了 836 個痕跡之星,並用風暴龍的力量打開了神秘之門。 你收集了 941 個痕跡之星,並用風暴龍的力量打開了神秘之門。 你結束了 2023 與狐貍貓的星空探險!"""
|
51 |
processed_datas["alvin.lau@junyiacademy.org"] = temp_log
|
52 |
-
processed_datas[
|
53 |
-
|
|
|
|
|
|
|
|
|
54 |
|
55 |
with open("processed_adventure_logs.json", "w") as f:
|
56 |
json.dump(processed_datas, f)
|
@@ -340,9 +345,11 @@ with gr.Blocks(theme=seafoam, css=get_content("css/style.css")) as demo:
|
|
340 |
queue=False,
|
341 |
)
|
342 |
|
343 |
-
player_info_query_btn.click(
|
344 |
-
|
345 |
-
).then(
|
|
|
|
|
346 |
render_player_data,
|
347 |
player_info,
|
348 |
[avatar, pet_gallery, badge_gallery, adventure_log, achievements, adventure],
|
@@ -391,7 +398,11 @@ with gr.Blocks(theme=seafoam, css=get_content("css/style.css")) as demo:
|
|
391 |
gr.update(visible=True),
|
392 |
)
|
393 |
else:
|
394 |
-
return
|
|
|
|
|
|
|
|
|
395 |
|
396 |
confirm_player_name.click(
|
397 |
lambda: (gr.update(interactive=False), gr.update(visible=False)),
|
@@ -408,7 +419,11 @@ with gr.Blocks(theme=seafoam, css=get_content("css/style.css")) as demo:
|
|
408 |
)
|
409 |
|
410 |
cancel_player_name.click(
|
411 |
-
lambda: (
|
|
|
|
|
|
|
|
|
412 |
None,
|
413 |
[player_name, confirm_player_name, player_name_too_long],
|
414 |
queue=False,
|
@@ -456,6 +471,34 @@ with gr.Blocks(theme=seafoam, css=get_content("css/style.css")) as demo:
|
|
456 |
queue=False,
|
457 |
)
|
458 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
459 |
start_generate_story.click(
|
460 |
lambda: gr.update(visible=False), None, start_generate_story, queue=False
|
461 |
).then(
|
@@ -464,7 +507,13 @@ with gr.Blocks(theme=seafoam, css=get_content("css/style.css")) as demo:
|
|
464 |
[bot1, bot2, bot3, bot4, weaving],
|
465 |
queue=False,
|
466 |
).then(
|
467 |
-
**
|
|
|
|
|
|
|
|
|
|
|
|
|
468 |
).then(
|
469 |
lambda: gr.update(visible=True), None, [select_story], queue=False
|
470 |
).then(
|
|
|
21 |
create_certificate,
|
22 |
complete_reward,
|
23 |
check_is_in_completion_reward,
|
24 |
+
get_llm_response_once,
|
25 |
)
|
26 |
|
27 |
seafoam = Seafoam()
|
|
|
50 |
|
51 |
temp_log = """你開始了星空探險隊的冒險! 你在離家 2 天後,找到了迷失已久的星際繪圖師,並在他的引導下進入了下一個未知的領域。 在完成了 41 關學習內容後,你獲得了遙遠星球上的神秘遺產。 在某天,你在冰晶極地找到了一顆具有神秘力量的寒冰寶石。 你在奇特的花園中找到了一種新的能源。 在雲端星球中,你遇見了一位雲之精靈,並從她那裡獲得了一個神祕的能量水球。 132 天之後,你們獲得了一個神秘的地圖,這將引導你們找到隱藏的神秘能量源。\n你們在一個古老的地下洞穴中找到了一個巨大的藍色能量晶體,這將極大地援助你們的旅程。 你在混亂的黑洞中找到了一片完好無損的石碑,上面記載著光束寶石的由來和使用方式。 你用寶石的力量召喚傳說中的先知,獲得了狐狸貓族的力量, 向黑洞發動了終極一擊。 你在繼續活動了 7 天後,你的行為感動了星際,你獲得了一個可以轉換成任何形象的能量護盾。 你在一場巨大的黑洞爆炸後,成功找回了去往家鄉的方向。 連日交戰後達成了學習 209 個內容的紀錄,獲得了星系長老的讚賞,並贈與你們神秘的光護符。 你成功與神秘的月亮寶石建立連結,從而獲得月亮之力。 你在遙遠的星海之上發現了一顆寂靜的星體,星體的中心藏有一個帶著神秘能量的寶藏。 你在神祕的狐狸貓族祖先墳場找到了一塊古老的碑文,裡面記載了如何使用和提煉能量的方法。 在經歷了若干日月後,你終於在 229 號洞穴找到了第一塊結晶。 你們在探索神秘洞穴的過程中,發現了一個神秘寶箱,裡面有 229 個神秘道具。 你們在冬季島上找到了冰晶葉,並獲得了 678 點的能量。 你剛剛結束了 14 天的劍橋學堂,你們獲得了 726 點的能量供給。 你剛剛結束了 14 天的劍橋學堂,你們獲得了 726 點的能量供給。 你在星空探險隊的冒險期間和狐貍貓一起度過了聖誕佳節 🎄 你從超空間黑洞脫離時發現了一串神秘的密碼,這個密碼包含著黑洞能量的謎題。 你們在一個神秘的星球上探險,在那裡你們發現了新的能量源。 你們在一片未知的領域中尋找到了狐狸貓族的古老遺蹟,並獲得了 780 的能量點數。 你收集了 836 個痕跡之星,並用風暴龍的力量打開了神秘之門。 你收集了 941 個痕跡之星,並用風暴龍的力量打開了神秘之門。 你結束了 2023 與狐貍貓的星空探險!"""
|
52 |
processed_datas["alvin.lau@junyiacademy.org"] = temp_log
|
53 |
+
processed_datas[
|
54 |
+
"http://googleid.junyiacademy.org/115084976189396533674"
|
55 |
+
] = temp_log
|
56 |
+
processed_datas[
|
57 |
+
"http://googleid.junyiacademy.org/106428943548495187296"
|
58 |
+
] = temp_log
|
59 |
|
60 |
with open("processed_adventure_logs.json", "w") as f:
|
61 |
json.dump(processed_datas, f)
|
|
|
345 |
queue=False,
|
346 |
)
|
347 |
|
348 |
+
player_info_query_btn.click(
|
349 |
+
get_player_info, player_backend_id, player_info, queue=False
|
350 |
+
).then(get_player_logs, player_backend_id, player_logs, queue=False).then(
|
351 |
+
lambda: gr.update(visible=True), None, start_make_reward, queue=False
|
352 |
+
).then(
|
353 |
render_player_data,
|
354 |
player_info,
|
355 |
[avatar, pet_gallery, badge_gallery, adventure_log, achievements, adventure],
|
|
|
398 |
gr.update(visible=True),
|
399 |
)
|
400 |
else:
|
401 |
+
return (
|
402 |
+
gr.update(visible=True),
|
403 |
+
gr.update(visible=True),
|
404 |
+
gr.update(visible=False),
|
405 |
+
)
|
406 |
|
407 |
confirm_player_name.click(
|
408 |
lambda: (gr.update(interactive=False), gr.update(visible=False)),
|
|
|
419 |
)
|
420 |
|
421 |
cancel_player_name.click(
|
422 |
+
lambda: (
|
423 |
+
gr.update(interactive=True),
|
424 |
+
gr.update(visible=True),
|
425 |
+
gr.update(visible=False),
|
426 |
+
),
|
427 |
None,
|
428 |
[player_name, confirm_player_name, player_name_too_long],
|
429 |
queue=False,
|
|
|
471 |
queue=False,
|
472 |
)
|
473 |
|
474 |
+
get_first_llm_response_args = dict(
|
475 |
+
fn=get_llm_response_once,
|
476 |
+
inputs=[completion_reward, player_logs],
|
477 |
+
output=bot1,
|
478 |
+
queue=False,
|
479 |
+
)
|
480 |
+
|
481 |
+
get_second_llm_response_args = dict(
|
482 |
+
fn=get_llm_response_once,
|
483 |
+
inputs=[completion_reward, player_logs],
|
484 |
+
output=bot2,
|
485 |
+
queue=False,
|
486 |
+
)
|
487 |
+
|
488 |
+
get_third_llm_response_args = dict(
|
489 |
+
fn=get_llm_response_once,
|
490 |
+
inputs=[completion_reward, player_logs],
|
491 |
+
output=bot3,
|
492 |
+
queue=False,
|
493 |
+
)
|
494 |
+
|
495 |
+
get_fourth_llm_response_args = dict(
|
496 |
+
fn=get_llm_response_once,
|
497 |
+
inputs=[completion_reward, player_logs],
|
498 |
+
output=bot4,
|
499 |
+
queue=False,
|
500 |
+
)
|
501 |
+
|
502 |
start_generate_story.click(
|
503 |
lambda: gr.update(visible=False), None, start_generate_story, queue=False
|
504 |
).then(
|
|
|
507 |
[bot1, bot2, bot3, bot4, weaving],
|
508 |
queue=False,
|
509 |
).then(
|
510 |
+
**get_first_llm_response_args
|
511 |
+
).then(
|
512 |
+
**get_second_llm_response_args
|
513 |
+
).then(
|
514 |
+
**get_third_llm_response_args
|
515 |
+
).then(
|
516 |
+
**get_fourth_llm_response_args
|
517 |
).then(
|
518 |
lambda: gr.update(visible=True), None, [select_story], queue=False
|
519 |
).then(
|
utils/completion_reward.py
CHANGED
@@ -53,7 +53,14 @@ class CompletionReward:
|
|
53 |
self.aws_agent = AWSAgent()
|
54 |
self.google_agent = GoogleAgent()
|
55 |
self.mtk_agent = MTKAgent()
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
self.shuffled_response_order = {}
|
|
|
57 |
self.paragraph_map = {
|
58 |
"openai": self.paragraph_openai,
|
59 |
"aws": self.paragraph_aws,
|
@@ -67,10 +74,10 @@ class CompletionReward:
|
|
67 |
google_story = self.google_agent.get_story(player_logs)
|
68 |
mtk_story = self.mtk_agent.get_story(player_logs)
|
69 |
agents_responses = {
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
}
|
75 |
self.paragraph_openai = agents_responses["openai"]
|
76 |
self.paragraph_aws = agents_responses["aws"]
|
@@ -91,6 +98,24 @@ class CompletionReward:
|
|
91 |
[(None, shuffled_responses[3])],
|
92 |
)
|
93 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
def set_player_name(self, player_name, player_backend_user_id):
|
95 |
self.player_backend_user_id = player_backend_user_id
|
96 |
self.player_name = player_name
|
@@ -206,6 +231,7 @@ class CompletionReward:
|
|
206 |
|
207 |
class OpenAIAgent:
|
208 |
def __init__(self):
|
|
|
209 |
self.temperature = 0.8
|
210 |
self.frequency_penalty = 0
|
211 |
self.presence_penalty = 0
|
@@ -285,6 +311,9 @@ class OpenAIAgent:
|
|
285 |
|
286 |
|
287 |
class AWSAgent:
|
|
|
|
|
|
|
288 |
def get_story(self, user_log):
|
289 |
system_prompt = """
|
290 |
我正在舉辦一個學習型的活動,我為學生設計了一個獨特的故事機制,每天每個學生都會收到屬於自己獨特的冒險紀錄,現在我需要你協助我將這些冒險紀錄,製作成一段冒險故事,請
|
@@ -341,6 +370,9 @@ class GoogleAgent:
|
|
341 |
|
342 |
gemini_pro_model = GenerativeModel("gemini-pro")
|
343 |
|
|
|
|
|
|
|
344 |
def get_story(self, user_log):
|
345 |
system_prompt = """
|
346 |
我正在舉辦一個學習型的活動,我為學生設計了一個獨特的故事機制,每天每個學生都會收到屬於自己獨特的冒險紀錄,現在我需要你協助我將這些冒險紀錄,製作成一段冒險故事,請
|
@@ -377,6 +409,9 @@ class GoogleAgent:
|
|
377 |
|
378 |
|
379 |
class MTKAgent:
|
|
|
|
|
|
|
380 |
def get_story(self, user_log):
|
381 |
system_prompt = """
|
382 |
我正在舉辦一個學習型的活動,我為學生設計了一個獨特的故事機制,每天每個學生都會收到屬於自己獨特的冒險紀錄,現在我需要你協助我將這些冒險紀錄,製作成一段冒險故事,請
|
@@ -491,10 +526,11 @@ class ImageProcessor:
|
|
491 |
for line in paragraph.split("\n"):
|
492 |
wrapped_lines = textwrap.wrap(line, width=63)
|
493 |
for wrapped_line in wrapped_lines:
|
494 |
-
_, _, _, line_height = draw.textbbox(
|
|
|
|
|
495 |
paragraph_height += line_height + 10
|
496 |
|
497 |
-
|
498 |
# Draw the box
|
499 |
padding = 40
|
500 |
left, right = 50, img.width - 50
|
|
|
53 |
self.aws_agent = AWSAgent()
|
54 |
self.google_agent = GoogleAgent()
|
55 |
self.mtk_agent = MTKAgent()
|
56 |
+
self.agent_list = [
|
57 |
+
self.openai_agent,
|
58 |
+
self.aws_agent,
|
59 |
+
self.google_agent,
|
60 |
+
self.mtk_agent,
|
61 |
+
]
|
62 |
self.shuffled_response_order = {}
|
63 |
+
self.pop_response_order = []
|
64 |
self.paragraph_map = {
|
65 |
"openai": self.paragraph_openai,
|
66 |
"aws": self.paragraph_aws,
|
|
|
74 |
google_story = self.google_agent.get_story(player_logs)
|
75 |
mtk_story = self.mtk_agent.get_story(player_logs)
|
76 |
agents_responses = {
|
77 |
+
"openai": openai_story,
|
78 |
+
"aws": aws_story,
|
79 |
+
"google": google_story,
|
80 |
+
"mtk": mtk_story,
|
81 |
}
|
82 |
self.paragraph_openai = agents_responses["openai"]
|
83 |
self.paragraph_aws = agents_responses["aws"]
|
|
|
98 |
[(None, shuffled_responses[3])],
|
99 |
)
|
100 |
|
101 |
+
def get_llm_response_once(self, player_logs):
|
102 |
+
if self.agent_list:
|
103 |
+
# Randomly select and remove an agent from the list
|
104 |
+
agent = self.agent_list.pop(random.randint(0, len(self.agent_list) - 1))
|
105 |
+
else:
|
106 |
+
return "No agents left", None
|
107 |
+
|
108 |
+
story = agent.get_story(player_logs)
|
109 |
+
self.agents_responses[agent.name] = story
|
110 |
+
self.pop_response_order.append(agent.name)
|
111 |
+
|
112 |
+
if len(self.pop_response_order) == 4:
|
113 |
+
self.shuffled_response_order = {
|
114 |
+
str(index): agent for index, agent in enumerate(self.pop_response_order)
|
115 |
+
}
|
116 |
+
|
117 |
+
return [(None, story)]
|
118 |
+
|
119 |
def set_player_name(self, player_name, player_backend_user_id):
|
120 |
self.player_backend_user_id = player_backend_user_id
|
121 |
self.player_name = player_name
|
|
|
231 |
|
232 |
class OpenAIAgent:
|
233 |
def __init__(self):
|
234 |
+
self.name = "openai"
|
235 |
self.temperature = 0.8
|
236 |
self.frequency_penalty = 0
|
237 |
self.presence_penalty = 0
|
|
|
311 |
|
312 |
|
313 |
class AWSAgent:
|
314 |
+
def __init__(self):
|
315 |
+
self.name = "aws"
|
316 |
+
|
317 |
def get_story(self, user_log):
|
318 |
system_prompt = """
|
319 |
我正在舉辦一個學習型的活動,我為學生設計了一個獨特的故事機制,每天每個學生都會收到屬於自己獨特的冒險紀錄,現在我需要你協助我將這些冒險紀錄,製作成一段冒險故事,請
|
|
|
370 |
|
371 |
gemini_pro_model = GenerativeModel("gemini-pro")
|
372 |
|
373 |
+
def __init__(self):
|
374 |
+
self.name = "google"
|
375 |
+
|
376 |
def get_story(self, user_log):
|
377 |
system_prompt = """
|
378 |
我正在舉辦一個學習型的活動,我為學生設計了一個獨特的故事機制,每天每個學生都會收到屬於自己獨特的冒險紀錄,現在我需要你協助我將這些冒險紀錄,製作成一段冒險故事,請
|
|
|
409 |
|
410 |
|
411 |
class MTKAgent:
|
412 |
+
def __init__(self):
|
413 |
+
self.name = "mtk"
|
414 |
+
|
415 |
def get_story(self, user_log):
|
416 |
system_prompt = """
|
417 |
我正在舉辦一個學習型的活動,我為學生設計了一個獨特的故事機制,每天每個學生都會收到屬於自己獨特的冒險紀錄,現在我需要你協助我將這些冒險紀錄,製作成一段冒險故事,請
|
|
|
526 |
for line in paragraph.split("\n"):
|
527 |
wrapped_lines = textwrap.wrap(line, width=63)
|
528 |
for wrapped_line in wrapped_lines:
|
529 |
+
_, _, _, line_height = draw.textbbox(
|
530 |
+
(0, 0), wrapped_line, font=body_font
|
531 |
+
)
|
532 |
paragraph_height += line_height + 10
|
533 |
|
|
|
534 |
# Draw the box
|
535 |
padding = 40
|
536 |
left, right = 50, img.width - 50
|
utils/completion_reward_utils.py
CHANGED
@@ -7,6 +7,10 @@ def get_llm_response(completion_reward, *args):
|
|
7 |
return completion_reward.get_llm_response(*args)
|
8 |
|
9 |
|
|
|
|
|
|
|
|
|
10 |
def set_player_name(completion_reward, *args):
|
11 |
return completion_reward.set_player_name(*args)
|
12 |
|
@@ -31,9 +35,13 @@ def check_is_in_completion_reward(player_backend_user_id):
|
|
31 |
with open("./data/completion_reward_issue_status.json") as f:
|
32 |
completion_reward_issue_status_dict = json.load(f)
|
33 |
completion_reward_issue_status_dict["alvin.lau@junyiacademy.org"] = "not_issued"
|
34 |
-
completion_reward_issue_status_dict[
|
35 |
-
|
36 |
-
|
|
|
|
|
|
|
|
|
37 |
preview_list = [
|
38 |
"chen.kao@junyiacademy.org",
|
39 |
"alvin.lau@junyiacademy.org",
|
@@ -44,9 +52,10 @@ def check_is_in_completion_reward(player_backend_user_id):
|
|
44 |
"http://id.junyiacademy.org/28f0f5bb784441c58ad4bafad00a2c3d",
|
45 |
]
|
46 |
|
47 |
-
|
48 |
-
|
49 |
-
|
|
|
50 |
if player_backend_user_id in preview_list:
|
51 |
value = completion_reward_issue_status_dict[player_backend_user_id]
|
52 |
if value == "not_issued":
|
|
|
7 |
return completion_reward.get_llm_response(*args)
|
8 |
|
9 |
|
10 |
+
def get_llm_response_once(completion_reward, *args):
|
11 |
+
return completion_reward.get_llm_response_once(*args)
|
12 |
+
|
13 |
+
|
14 |
def set_player_name(completion_reward, *args):
|
15 |
return completion_reward.set_player_name(*args)
|
16 |
|
|
|
35 |
with open("./data/completion_reward_issue_status.json") as f:
|
36 |
completion_reward_issue_status_dict = json.load(f)
|
37 |
completion_reward_issue_status_dict["alvin.lau@junyiacademy.org"] = "not_issued"
|
38 |
+
completion_reward_issue_status_dict[
|
39 |
+
"http://googleid.junyiacademy.org/115084976189396533674"
|
40 |
+
] = "not_issued"
|
41 |
+
completion_reward_issue_status_dict[
|
42 |
+
"http://googleid.junyiacademy.org/106428943548495187296"
|
43 |
+
] = "not_issued"
|
44 |
+
|
45 |
preview_list = [
|
46 |
"chen.kao@junyiacademy.org",
|
47 |
"alvin.lau@junyiacademy.org",
|
|
|
52 |
"http://id.junyiacademy.org/28f0f5bb784441c58ad4bafad00a2c3d",
|
53 |
]
|
54 |
|
55 |
+
if (
|
56 |
+
player_backend_user_id in completion_reward_issue_status_dict
|
57 |
+
or player_backend_user_id in preview_list
|
58 |
+
):
|
59 |
if player_backend_user_id in preview_list:
|
60 |
value = completion_reward_issue_status_dict[player_backend_user_id]
|
61 |
if value == "not_issued":
|