ChenyuRabbitLove commited on
Commit
00da133
1 Parent(s): ac80710

refactor: change the render order to one response a time

Browse files
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["http://googleid.junyiacademy.org/115084976189396533674"] = temp_log
53
- processed_datas["http://googleid.junyiacademy.org/106428943548495187296"] = temp_log
 
 
 
 
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(get_player_info, player_backend_id, player_info, queue=False).then(
344
- get_player_logs, player_backend_id, player_logs, queue=False
345
- ).then(lambda: gr.update(visible=True), None, start_make_reward, queue=False).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 gr.update(visible=True), gr.update(visible=True), gr.update(visible=False)
 
 
 
 
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: (gr.update(interactive=True), gr.update(visible=True), gr.update(visible=False)),
 
 
 
 
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
- **get_llm_response_args
 
 
 
 
 
 
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
- 'openai': openai_story,
71
- 'aws': aws_story,
72
- 'google': google_story,
73
- 'mtk': mtk_story,
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((0, 0), wrapped_line, font=body_font)
 
 
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["http://googleid.junyiacademy.org/115084976189396533674"] = "not_issued"
35
- completion_reward_issue_status_dict["http://googleid.junyiacademy.org/106428943548495187296"] = "not_issued"
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
- if player_backend_user_id in completion_reward_issue_status_dict or player_backend_user_id in preview_list:
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":