diff --git a/examples/apps/llm_riddles/app.py b/examples/apps/llm_riddles/app.py index c48b2660..c6786610 100644 --- a/examples/apps/llm_riddles/app.py +++ b/examples/apps/llm_riddles/app.py @@ -10,6 +10,7 @@ from challenges.ch2 import challenge2 from challenges.ch3 import challenge3 from challenges.ch4 import challenge4 from llm import create_model +from PIL import Image, ImageDraw, ImageFont model_cache = {} @@ -21,6 +22,13 @@ challenges = [ challenge4, ] +CONGRATS_STR = '所有挑战完成!👏🏻👏🏻👏🏻👏🏻👏🏻👏🏻' +CONGRATS_QUESTION = f'
{CONGRATS_STR}
\n\n
' + +SHARE_CHALLENGES_HINT = [ + '小试牛刀新手上路', '数字玩家已经上线', '巅峰对决,你就是提示词高手', '无人之境,胜利就在前方', '哇塞,我冲出了LLM的重围' +] + def get_problem(challenge_idx, problem_idx): problems = challenges[challenge_idx]['problems'] @@ -33,6 +41,7 @@ def update_challenge_info(current_chapter_index, current_challenge_index): def update_question_info(current_chapter_index, current_challenge_index): + global challenges current_chapter = challenges[current_chapter_index] challenge = get_problem(current_chapter_index, current_challenge_index) @@ -42,6 +51,8 @@ def update_question_info(current_chapter_index, current_challenge_index): def validate_challenge(response, input, state, generate_response): + if 'success' in state: + return CONGRATS_STR, CONGRATS_QUESTION, '' assert 'current_chapter_index' in state, 'current_chapter_index not found in state' assert 'current_challenge_index' in state, 'current_challenge_index not found in state' current_chapter_index = state['current_chapter_index'] @@ -66,20 +77,24 @@ def validate_challenge(response, input, state, generate_response): current_challenge_index += 1 else: # 如果当前章节的挑战已经完成,移动到下一个章节 - current_challenge_index = 0 if current_chapter_index < len(challenges) - 1: + current_challenge_index = 0 current_chapter_index += 1 else: + state['success'] = True challenge_result = '所有挑战完成!' + else: challenge_result = '挑战失败,请再试一次。' state['current_chapter_index'] = current_chapter_index state['current_challenge_index'] = current_challenge_index print('update state: ', state) - - return challenge_result, \ - update_question_info(current_chapter_index, current_challenge_index), \ - update_challenge_info(current_chapter_index, current_challenge_index) + if 'success' in state: + return CONGRATS_STR, CONGRATS_QUESTION, '' + else: + return challenge_result, \ + update_question_info(current_chapter_index, current_challenge_index), \ + update_challenge_info(current_chapter_index, current_challenge_index) def generate_response(input, model_name): @@ -98,7 +113,7 @@ def generate_response(input, model_name): def on_submit(input, state): - model_name = 'qwen-plus' + model_name = os.environ.get('MODEL', 'qwen-plus') gen_fn = functools.partial(generate_response, model_name=model_name) response = gen_fn(input) history = [(input, response)] @@ -108,13 +123,44 @@ def on_submit(input, state): return challenge_result, history, question_info, challenge_info +def generate_share_image(state): + share_state = state['current_chapter_index'] + if share_state > 3: + share_state = 3 + if 'success' in state: + share_state = 4 # 全部通关为 4 + + img_pil = Image.open(f'assets/background{share_state}.png') + # 设置需要显示的字体 + fontpath = 'assets/font.ttf' + font = ImageFont.truetype(fontpath, 48) + draw = ImageDraw.Draw(img_pil) + # 绘制文字信息 + draw.text((70, 1000), + SHARE_CHALLENGES_HINT[share_state], + font=font, + fill=(255, 255, 255)) + if share_state == 4: + share_chapter_text = '顺利闯过了全部关卡' + else: + share_chapter_text = f"我顺利闯到第 {state['current_chapter_index']+1}-{state['current_challenge_index']+1} 关" + draw.text((70, 1080), share_chapter_text, font=font, fill=(255, 255, 255)) + draw.text((70, 1160), '你也来挑战一下吧~', font=font, fill=(255, 255, 255)) + + return gr.Image.update(visible=True, value=img_pil) + + # Gradio界面构建 block = gr.Blocks() with block as demo: - state = gr.State(dict(current_challenge_index=0, current_chapter_index=0)) current_chapter_index = 0 current_challenge_index = 0 + state = gr.State( + dict( + current_challenge_index=current_challenge_index, + current_chapter_index=current_chapter_index)) + gr.Markdown("""
完蛋!我被LLM包围了!
""") gr.Markdown("""欢迎来玩LLM Riddles复刻版:完蛋!我被LLM包围了! @@ -135,10 +181,26 @@ with block as demo: with gr.Row(): submit = gr.Button('🚀 发送') + shareBtn = gr.Button('💯 分享成绩') + + shareImg = gr.Image(label='分享成绩', visible=False, width=400) submit.click( on_submit, inputs=[message, state], outputs=[challenge_result, chatbot, question_info, challenge_info]) + shareBtn.click(generate_share_image, inputs=[state], outputs=[shareImg]) + + gr.HTML(""" +
+ + Powered by + DashScope + + +
+""") demo.queue(concurrency_count=10).launch(height=800, share=True) diff --git a/examples/apps/llm_riddles/assets/background.png b/examples/apps/llm_riddles/assets/background.png new file mode 100644 index 00000000..9d0cb3c9 --- /dev/null +++ b/examples/apps/llm_riddles/assets/background.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8afcec15a87bcfaff327a5c9564a31ff1fe185a63cb286bd9772c8c68216768a +size 757003 diff --git a/examples/apps/llm_riddles/assets/background0.png b/examples/apps/llm_riddles/assets/background0.png new file mode 100644 index 00000000..16394280 --- /dev/null +++ b/examples/apps/llm_riddles/assets/background0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16afb18994ad0654b31117931aad2ee05863492e964e10f4c559556e29618320 +size 839643 diff --git a/examples/apps/llm_riddles/assets/background1.png b/examples/apps/llm_riddles/assets/background1.png new file mode 100644 index 00000000..9d0cb3c9 --- /dev/null +++ b/examples/apps/llm_riddles/assets/background1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8afcec15a87bcfaff327a5c9564a31ff1fe185a63cb286bd9772c8c68216768a +size 757003 diff --git a/examples/apps/llm_riddles/assets/background2.png b/examples/apps/llm_riddles/assets/background2.png new file mode 100644 index 00000000..adec7723 --- /dev/null +++ b/examples/apps/llm_riddles/assets/background2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:966a013913042e1574ccbc299b1914272cb47df69a552bf1723b96b2d8902de3 +size 1114172 diff --git a/examples/apps/llm_riddles/assets/background3.png b/examples/apps/llm_riddles/assets/background3.png new file mode 100644 index 00000000..97c446d6 --- /dev/null +++ b/examples/apps/llm_riddles/assets/background3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5253bbed99be55e6ac9080ea320df75c95592204696d6d41ba90f9905384fdca +size 1198295 diff --git a/examples/apps/llm_riddles/assets/background4.png b/examples/apps/llm_riddles/assets/background4.png new file mode 100644 index 00000000..fc612898 --- /dev/null +++ b/examples/apps/llm_riddles/assets/background4.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cf462f8db7583843bc152ccfc87bb033b91880c98db9f83ba87fcca5d5d07f2 +size 1056053 diff --git a/examples/apps/llm_riddles/assets/font.ttf b/examples/apps/llm_riddles/assets/font.ttf new file mode 100644 index 00000000..7dc81344 Binary files /dev/null and b/examples/apps/llm_riddles/assets/font.ttf differ diff --git a/examples/apps/llm_riddles/requirements.txt b/examples/apps/llm_riddles/requirements.txt index 76c33f1b..004cc675 100644 --- a/examples/apps/llm_riddles/requirements.txt +++ b/examples/apps/llm_riddles/requirements.txt @@ -1,3 +1,4 @@ dashscope gradio==3.39.0 +pillow sympy