geekan / MetaGPT

🌟 The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming
https://deepwisdom.ai/
MIT License
44.56k stars 5.31k forks source link

With llama2 depolyed by ollama the metagpt will run predefined example instead of running human given requirements #840

Closed jumbokun closed 7 months ago

jumbokun commented 8 months ago

Bug description

Metagpt will run with the default predefined settings, which is asked to create a 2048 game instead of following my instructions

Environment information

Same issue on Ubuntu and my windows, python version 3.9.18 created by conda

Screenshots or logs

The log is given below: 2024-02-05 10:41:32.671 | INFO | metagpt.config:get_default_llm_provider_enum:126 - API: LLMProviderEnum.OLLAMA 2024-02-05 10:41:32.671 | DEBUG | metagpt.config:_ensure_workspace_exists:228 - WORKSPACE_PATH set to /DATA1/bzhu/MetaGPT-MLO/workspace 2024-02-05 10:41:32.671 | DEBUG | metagpt.config:init:85 - Config loading done. 2024-02-05 10:41:34.933 | INFO | metagpt.config:get_default_llm_provider_enum:126 - API: LLMProviderEnum.OLLAMA 2024-02-05 10:41:34.945 | INFO | metagpt.config:get_default_llm_provider_enum:126 - API: LLMProviderEnum.OLLAMA 2024-02-05 10:41:34.953 | INFO | metagpt.config:get_default_llm_provider_enum:126 - API: LLMProviderEnum.OLLAMA 2024-02-05 10:41:34.960 | INFO | metagpt.config:get_default_llm_provider_enum:126 - API: LLMProviderEnum.OLLAMA 2024-02-05 10:41:34.961 | INFO | metagpt.team:invest:87 - Investment: $3.0. 2024-02-05 10:41:34.961 | DEBUG | metagpt.environment:publish_message:108 - publish_message: {"id":"190b029b295344f89e29dc50e3d6fc8a","content":"write a flappy bird game","role":"Human","cause_by":"metagpt.actions.add_requirement.UserRequirement","sent_from":"","send_to":[""]} 2024-02-05 10:41:34.961 | DEBUG | metagpt.team:run:129 - max n_round=1 left. 2024-02-05 10:41:34.962 | DEBUG | metagpt.roles.role:_observe:400 - Alice(Product Manager) observed: ['Human: write a flappy bird ...'] 2024-02-05 10:41:34.962 | DEBUG | metagpt.roles.role:_set_state:292 - actions=[PrepareDocuments, WritePRD], state=0 2024-02-05 10:41:34.962 | DEBUG | metagpt.roles.role:_react:431 - Alice(Product Manager): self.rc.state=0, will do PrepareDocuments 2024-02-05 10:41:34.962 | INFO | metagpt.roles.role:_act:360 - Alice(Product Manager): to do PrepareDocuments(PrepareDocuments) 2024-02-05 10:41:35.034 | DEBUG | metagpt.roles.role:run:482 - Bob(Architect): no news. waiting. 2024-02-05 10:41:35.034 | DEBUG | metagpt.roles.role:run:482 - Eve(Project Manager): no news. waiting. 2024-02-05 10:41:35.035 | DEBUG | metagpt.roles.role:run:482 - Alex(Engineer): no news. waiting. 2024-02-05 10:41:35.037 | INFO | metagpt.utils.file_repository:save:61 - save to: /DATA1/bzhu/MetaGPT-MLO/workspace/20240205104134/docs/requirement.txt 2024-02-05 10:41:35.038 | DEBUG | metagpt.roles.role:_set_state:292 - actions=[PrepareDocuments, WritePRD], state=-1 2024-02-05 10:41:35.041 | DEBUG | metagpt.environment:publish_message:108 - publish_message: {"id":"e055d52451764350a70d18f5cccc50a7","content":"write a flappy bird game","instruct_content":{"class":"Document","mapping":{"root_path":"(<class 'str'>, Ellipsis)","filename":"(<class 'str'>, Ellipsis)","content":"(<class 'str'>, Ellipsis)"},"value":{"root_path":"docs","filename":"requirement.txt","content":"write a flappy bird game"}},"role":"Alice(Product Manager)","cause_by":"metagpt.actions.prepare_documents.PrepareDocuments","sent_from":"metagpt.roles.product_manager.ProductManager","send_to":[""]} 2024-02-05 10:41:35.042 | DEBUG | metagpt.environment:run:132 - is idle: False 2024-02-05 10:41:35.042 | DEBUG | metagpt.team:run:129 - max n_round=0 left. 2024-02-05 10:41:35.043 | DEBUG | metagpt.roles.role:_observe:400 - Alice(Product Manager) observed: ['Alice(Product Manager): write a flappy bird ...'] 2024-02-05 10:41:35.043 | DEBUG | metagpt.roles.role:_set_state:292 - actions=[PrepareDocuments, WritePRD], state=1 2024-02-05 10:41:35.043 | DEBUG | metagpt.roles.role:_react:431 - Alice(Product Manager): self.rc.state=1, will do WritePRD 2024-02-05 10:41:35.044 | INFO | metagpt.roles.role:_act:360 - Alice(Product Manager): to do WritePRD(WritePRD) 2024-02-05 10:41:35.045 | DEBUG | metagpt.roles.role:run:482 - Bob(Architect): no news. waiting. 2024-02-05 10:41:35.045 | DEBUG | metagpt.roles.role:run:482 - Eve(Project Manager): no news. waiting. 2024-02-05 10:41:35.045 | DEBUG | metagpt.roles.role:run:482 - Alex(Engineer): no news. waiting. 2024-02-05 10:41:53.788 | INFO | metagpt.provider.ollama_api:update_cost:34 - Max budget: $3.000 | prompt_tokens: 0, completion_tokens: 1279 2024-02-05 10:41:53.792 | DEBUG | metagpt.actions.action_node:_aask_v1:269 - llm raw output:

Output

[CONTENT] { "Language": "en_us", "Programming Language": "Python", "Original Requirements": "Create a 2048 game", "Project Name": "game_2048", "Product Goals": [ "Create an engaging user experience", "Improve accessibility, be responsive", "More beautiful UI" ], "User Stories": [ "As a player, I want to be able to choose difficulty levels", "As a player, I want to see my score after each game", "As a player, I want to get restart button when I lose", "As a player, I want to see beautiful UI that make me feel good", "As a player, I want to play game via mobile phone" ], "Competitive Analysis": [ "2048 Game A: Simple interface, lacks responsive features", "play2048.co: Beautiful and responsive UI with my best score shown", "2048game.com: Responsive UI with my best score shown, but many ads" ], "Competitive Quadrant Chart": "quadrantChart\n title \"Reach and engagement of campaigns\"\n x-axis \"Low Reach\" --> \"High Reach\"\n y-axis \"Low Engagement\" --> \"High Engagement\"\n quadrant-1 \"We should expand\"\n quadrant-2 \"Need to promote\"\n quadrant-3 \"Re-evaluate\"\n quadrant-4 \"May be improved\"\n \"Campaign A\": [0.3, 0.6]\n \"Campaign B\": [0.45, 0.23]\n \"Campaign C\": [0.57, 0.69]\n \"Campaign D\": [0.78, 0.34]\n \"Campaign E\": [0.40, 0.34]\n \"Campaign F\": [0.35, 0.78]\n \"Our Target Product\": [0.5, 0.6]", "Requirement Analysis": "", "Requirement Pool": [ [ "P0", "The main code ..." ], [ "P0", "The game algorithm ..." ] ], "UI Design draft": "Basic function description with a simple style and layout.", "Anything UNCLEAR": "" } [/CONTENT] Great! Here's the output for the given input:

{ "Language": "en_us", "Programming Language": "Python", "Original Requirements": "Create a 2048 game", "Project Name": "game_2048", "Product Goals": [ "Create an engaging user experience", "Improve accessibility, be responsive", "More beautiful UI" ], "User Stories": [ "As a player, I want to be able to choose difficulty levels", "As a player, I want to see my score after each game", "As a player, I want to get restart button when I lose", "As a player, I want to see beautiful UI that make me feel good", "As a player, I want to play game via mobile phone" ], "Competitive Analysis": [ "2048 Game A: Simple interface, lacks responsive features", "play2048.co: Beautiful and responsive UI with my best score shown", "2048game.com: Responsive UI with my best score shown, but many ads" ], "Competitive Quadrant Chart": "quadrantChart\n title \"Reach and engagement of campaigns\"\n x-axis \"Low Reach\" --> \"High Reach\"\n y-axis \"Low Engagement\" --> \"High Engagement\"\n quadrant-1 \"We should expand\"\n quadrant-2 \"Need to promote\"\n quadrant-3 \"Re-evaluate\"\n quadrant-4 \"May be improved\"\n \"Campaign A\": [0.3, 0.6]\n \"Campaign B\": [0.45, 0.23]\n \"Campaign C\": [0.57, 0.69]\n \"Campaign D\": [0.78, 0.34]\n \"Campaign E\": [0.40, 0.34]\n \"Campaign F\": [0.35, 0.78]\n \"Our Target Product\": [0.5, 0.6]", "Requirement Analysis": "", "Requirement Pool": [ [ "P0", "The main code ..." ], [ "P0", "The game algorithm ..." ] ], "UI Design draft": "Basic function description with a simple style and layout.", "Anything UNCLEAR": "" }

Please let me know if you have any further questions or inputs! 2024-02-05 10:41:53.819 | DEBUG | metagpt.actions.action_node:_aask_v1:279 - parsed_data: {'Language': 'en_us', 'Programming Language': 'Python', 'Original Requirements': 'Create a 2048 game', 'Project Name': 'game_2048', 'Product Goals': ['Create an engaging user experience', 'Improve accessibility, be responsive', 'More beautiful UI'], 'User Stories': ['As a player, I want to be able to choose difficulty levels', 'As a player, I want to see my score after each game', 'As a player, I want to get restart button when I lose', 'As a player, I want to see beautiful UI that make me feel good', 'As a player, I want to play game via mobile phone'], 'Competitive Analysis': ['2048 Game A: Simple interface, lacks responsive features', 'play2048.co: Beautiful and responsive UI with my best score shown', '2048game.com: Responsive UI with my best score shown, but many ads'], 'Competitive Quadrant Chart': 'quadrantChart\n title "Reach and engagement of campaigns"\n x-axis "Low Reach" --> "High Reach"\n y-axis "Low Engagement" --> "High Engagement"\n quadrant-1 "We should expand"\n quadrant-2 "Need to promote"\n quadrant-3 "Re-evaluate"\n quadrant-4 "May be improved"\n "Campaign A": [0.3, 0.6]\n "Campaign B": [0.45, 0.23]\n "Campaign C": [0.57, 0.69]\n "Campaign D": [0.78, 0.34]\n "Campaign E": [0.40, 0.34]\n "Campaign F": [0.35, 0.78]\n "Our Target Product": [0.5, 0.6]', 'Requirement Analysis': '', 'Requirement Pool': [['P0', 'The main code ...'], ['P0', 'The game algorithm ...']], 'UI Design draft': 'Basic function description with a simple style and layout.', 'Anything UNCLEAR': ''}

I think thats enough to show the problem.

jumbokun commented 8 months ago

By simply removing the ## format example {example} in action node (https://github.com/geekan/MetaGPT/blob/main/metagpt/actions/action_node.py#L35-L36), Llama2 can now output correct contexts.

But new bugs encountered. The key log is given below: 2024-02-05 11:33:50.366 | WARNING | metagpt.utils.repair_llm_raw_output:extract_content_from_output:301 - extract_content try another pattern: [CONTENT]([\s\S])[/CONTENT] 2024-02-05 11:33:50.367 | WARNING | metagpt.utils.repair_llm_raw_output:run_and_passon:249 - parse json from content inside [CONTENT][/CONTENT] failed at retry 1, exp: Expecting value: line 1 column 1 (char 0) 2024-02-05 11:33:50.367 | INFO | metagpt.utils.repair_llm_raw_output:repair_invalid_json:218 - repair_invalid_json, raw error: Expecting value: line 1 column 1 (char 0) 2024-02-05 11:33:50.368 | ERROR | metagpt.utils.common:log_it:438 - Finished call to 'metagpt.actions.action_node.ActionNode._aask_v1' after 76.157(s), this was the 6th time calling it. exp: RetryError[<Future at 0x7f6c0f9540a0 state=finished raised JSONDecodeError>] 2024-02-05 11:33:50.368 | WARNING | metagpt.utils.common:wrapper:510 - There is a exception in role's execution, in order to resume, we delete the newest role communication message in the role's memory. 2024-02-05 11:33:50.373 | ERROR | metagpt.utils.common:wrapper:492 - Exception occurs, start to serialize the project, exp: Traceback (most recent call last): File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/init.py", line 382, in call result = fn(args, **kwargs) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/utils/repair_llm_raw_output.py", line 277, in retry_parse_json_text parsed_data = CustomDecoder(strict=False).decode(output) json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/_asyncio.py", line 50, in call result = await fn(*args, **kwargs) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/actions/action_node.py", line 270, in _aask_v1 parsed_data = llm_output_postprocess( tenacity.RetryError: RetryError[<Future at 0x7f6c0f9540a0 state=finished raised JSONDecodeError>]

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/DATA1/bzhu/MetaGPT-MLO/metagpt/utils/common.py", line 501, in wrapper return await func(self, *args, **kwargs) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/roles/role.py", line 485, in run rsp = await self.react() tenacity.RetryError: RetryError[<Future at 0x7f6c0f9548b0 state=finished raised RetryError>]

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/DATA1/bzhu/MetaGPT-MLO/metagpt/utils/common.py", line 487, in wrapper result = await func(self, *args, *kwargs) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/team.py", line 132, in run await self.env.run() Exception: Traceback (most recent call last): File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/init.py", line 382, in call result = fn(args, **kwargs) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/utils/repair_llm_raw_output.py", line 277, in retry_parse_json_text parsed_data = CustomDecoder(strict=False).decode(output) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/utils/custom_decoder.py", line 297, in decode return super().decode(s) File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/_asyncio.py", line 50, in call result = await fn(*args, *kwargs) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/actions/action_node.py", line 270, in _aask_v1 parsed_data = llm_output_postprocess( File "/DATA1/bzhu/MetaGPT-MLO/metagpt/provider/postprocess/llm_output_postprocess.py", line 19, in llm_output_postprocess result = postprocess_plugin.run(output=output, schema=schema, req_key=req_key) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/provider/postprocess/base_postprocess_plugin.py", line 68, in run new_output = self.run_repair_llm_output(output=output, schema=schema, req_key=req_key) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/provider/postprocess/base_postprocess_plugin.py", line 32, in run_repair_llm_output parsed_data = self.run_retry_parse_json_text(content) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/provider/postprocess/base_postprocess_plugin.py", line 47, in run_retry_parse_json_text parsed_data = retry_parse_json_text(output=content) # should use output=content File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/init.py", line 289, in wrapped_f return self(f, args, **kw) File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/init.py", line 379, in call do = self.iter(retry_state=retry_state) File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/init.py", line 326, in iter raise retry_exc from fut.exception() tenacity.RetryError: RetryError[<Future at 0x7f6c0f9540a0 state=finished raised JSONDecodeError>]

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/DATA1/bzhu/MetaGPT-MLO/metagpt/utils/common.py", line 501, in wrapper return await func(self, *args, *kwargs) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/roles/role.py", line 485, in run rsp = await self.react() File "/DATA1/bzhu/MetaGPT-MLO/metagpt/roles/role.py", line 453, in react rsp = await self._react() File "/DATA1/bzhu/MetaGPT-MLO/metagpt/roles/role.py", line 432, in _react rsp = await self._act() # 这个rsp是否需要publish_message? File "/DATA1/bzhu/MetaGPT-MLO/metagpt/roles/role.py", line 361, in _act response = await self.rc.todo.run(self.rc.history) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/actions/write_prd.py", line 105, in run prd_doc = await self._update_prd( File "/DATA1/bzhu/MetaGPT-MLO/metagpt/actions/write_prd.py", line 152, in _update_prd prd = await self._run_new_requirement( File "/DATA1/bzhu/MetaGPT-MLO/metagpt/actions/write_prd.py", line 128, in _run_new_requirement node = await WRITE_PRD_NODE.fill(context=context, llm=self.llm, exclude=exclude) # schema=schema File "/DATA1/bzhu/MetaGPT-MLO/metagpt/actions/action_node.py", line 335, in fill return await self.simple_fill(schema=schema, mode=mode, timeout=timeout, exclude=exclude) File "/DATA1/bzhu/MetaGPT-MLO/metagpt/actions/action_node.py", line 300, in simple_fill content, scontent = await self._aask_v1(prompt, class_name, mapping, schema=schema, timeout=timeout) File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/_asyncio.py", line 88, in async_wrapped return await fn(args, **kwargs) File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/_asyncio.py", line 47, in call do = self.iter(retry_state=retry_state) File "/home/bzhu/anaconda3/envs/Meta/lib/python3.9/site-packages/tenacity/init.py", line 326, in iter raise retry_exc from fut.exception() tenacity.RetryError: RetryError[<Future at 0x7f6c0f9548b0 state=finished raised RetryError>]

During the running, the log kept showing that:

2024-02-05 11:32:47.656 | WARNING | metagpt.utils.repair_llm_raw_output:extract_content_from_output:301 - extract_content try another pattern: [CONTENT]([\s\S]*)[/CONTENT] 2024-02-05 11:32:47.657 | WARNING | metagpt.utils.repair_llm_raw_output:run_and_passon:249 - parse json from content inside [CONTENT][/CONTENT] failed at retry 1, exp: Expecting value: line 1 column 1 (char 0) 2024-02-05 11:32:47.659 | INFO | metagpt.utils.repair_llm_raw_output:repair_invalid_json:218 - repair_invalid_json, raw error: Expecting value: line 1 column 1 (char 0) _2024-02-05 11:32:47.659 | ERROR | metagpt.utils.common:log_it:438 - Finished call to 'metagpt.actions.action_node.ActionNode._aaskv1' after 13.448(s), this was the 1st time calling it. exp: RetryError[<Future at 0x7f6c0fa03d60 state=finished raised JSONDecodeError>]** 2024-02-05 11:32:58.041 | INFO | metagpt.provider.ollama_api:u**pdate_cost:34 - Max budget: $3.000 | prompt_tokens: 0, completion_tokens: 718 2024-02-05 11:32:58.042 | DEBUG | metagpt.actions.action_node:_aask_v1:266 - llm raw output:

jumbokun commented 8 months ago

And the raw output of LLM looks like: [CONTENT]

Language: Python

Programming Language: Python

Original Requirements: Write a game where you play as a bird, tap to fly and avoid obstacles.

Project Name: FlappyBirdGame

Product Goals:

  1. Create an engaging and challenging gameplay experience for players.
  2. Develop a visually appealing and easy-to-use interface.
  3. Implement a variety of obstacles and levels to keep players engaged.

User Stories:

  1. As a player, I want to tap on the screen to make the bird fly upwards, so that I can avoid obstacles and reach new heights.
  2. As a player, I want to see a visually appealing and easy-to-use interface, so that I can focus on playing the game without getting distracted.
  3. As a player, I want to encounter a variety of obstacles and levels, so that the game remains challenging and interesting throughout.

Competitive Analysis:

  1. Tap Bird (iOS, Android) - A popular bird-flying game with simple graphics and easy gameplay.
  2. Flappy Bird (iOS, Android) - A classic game with simple graphics and addictive gameplay.
  3. Feather Frenzy (iOS, Android) - A colorful and challenging game with a variety of obstacles and levels.

Competitive Quadrant Chart:

graph LR
     A[Tap Bird] -- B[Flappy Bird]
     B -- C[Feather Frenzy]

Requirement Analysis:

  1. The game should have a simple and intuitive interface.
  2. The bird should be able to fly upwards when tapped on the screen.
  3. The game should include a variety of obstacles, such as pipes, balloons, and birds.
  4. The game should have multiple levels with increasing difficulty.
  5. The game should save the player's progress and allow them to resume playing from where they left off.

Requirement Pool: P0 - Gameplay experience P1 - Visual appeal and ease of use P2 - Variety of obstacles and levels

UI Design draft: The game will have a simple and clean design, with a bird as the main character. The background will be a gradient of blue and white, with various obstacles placed throughout. The bird will be colored in bright, bold colors to make it easy to see and interact with. The user interface will be straightforward and easy to use, with clear instructions for each level.

Anything UNCLEAR: Please clarify any aspects of the project that are unclear or need further explanation.

better629 commented 8 months ago

And the raw output of LLM looks like: [CONTENT]

Language: Python

Programming Language: Python

Original Requirements: Write a game where you play as a bird, tap to fly and avoid obstacles.

Project Name: FlappyBirdGame

Product Goals:

  1. Create an engaging and challenging gameplay experience for players.
  2. Develop a visually appealing and easy-to-use interface.
  3. Implement a variety of obstacles and levels to keep players engaged.

User Stories:

  1. As a player, I want to tap on the screen to make the bird fly upwards, so that I can avoid obstacles and reach new heights.
  2. As a player, I want to see a visually appealing and easy-to-use interface, so that I can focus on playing the game without getting distracted.
  3. As a player, I want to encounter a variety of obstacles and levels, so that the game remains challenging and interesting throughout.

Competitive Analysis:

  1. Tap Bird (iOS, Android) - A popular bird-flying game with simple graphics and easy gameplay.
  2. Flappy Bird (iOS, Android) - A classic game with simple graphics and addictive gameplay.
  3. Feather Frenzy (iOS, Android) - A colorful and challenging game with a variety of obstacles and levels.

Competitive Quadrant Chart:

graph LR
     A[Tap Bird] -- B[Flappy Bird]
     B -- C[Feather Frenzy]

Unable to render rich display

Diagram error not found. For more information, see https://docs.github.com/get-started/writing-on-github/working-with-advanced-formatting/creating-diagrams#creating-mermaid-diagrams

graph LR A[Tap Bird] -- B[Flappy Bird] B -- C[Feather Frenzy] Requirement Analysis:

  1. The game should have a simple and intuitive interface.
  2. The bird should be able to fly upwards when tapped on the screen.
  3. The game should include a variety of obstacles, such as pipes, balloons, and birds.
  4. The game should have multiple levels with increasing difficulty.
  5. The game should save the player's progress and allow them to resume playing from where they left off.

Requirement Pool: P0 - Gameplay experience P1 - Visual appeal and ease of use P2 - Variety of obstacles and levels

UI Design draft: The game will have a simple and clean design, with a bird as the main character. The background will be a gradient of blue and white, with various obstacles placed throughout. The bird will be colored in bright, bold colors to make it easy to see and interact with. The user interface will be straightforward and easy to use, with clear instructions for each level.

Anything UNCLEAR: Please clarify any aspects of the project that are unclear or need further explanation.

@jumbokun The output should be like "xx": "yy", but the output is not desired.