Spaces:
Sleeping
Sleeping
| import os | |
| import json | |
| from flask import Flask, request | |
| from flask_cors import CORS | |
| import google.generativeai | |
| google.generativeai.configure( | |
| api_key=os.environ.get("GEMINI_API_KEY")) | |
| app = Flask(__name__) | |
| CORS(app) | |
| def output_sanitizer(prompt: str) -> dict: | |
| """ | |
| return dictionary from llm output | |
| """ | |
| begin = prompt.find("{") | |
| end = prompt.find("}") | |
| output = prompt[begin: end + 1] | |
| try: | |
| output = json.loads(output) | |
| except json.JSONDecodeError: | |
| return {} | |
| return output | |
| def dict_style_changer(file: dict) -> dict: | |
| """ | |
| parses it in such a way so that mermaid won't crash due to semicolons and such | |
| """ | |
| """ | |
| {"1[a]" : ["2[b]", "3[c]"], "4[d]" : ["5[e]", "6[f]"]} | |
| """ | |
| new = {} | |
| count = 1 | |
| for k, v in file.items(): | |
| new_key = f"{count}[{k}]" | |
| count += 1 | |
| temp = [] | |
| for i in v: | |
| new_value = f"{count}[{i}]" | |
| count += 1 | |
| temp.append(new_value) | |
| new[new_key] = temp | |
| return new | |
| def dict_to_mermaid(file: dict) -> str: | |
| """ | |
| returns a mermaid.js syntax to be rendered for the roadmap | |
| """ | |
| file = dict_style_changer(file) | |
| output = """ | |
| flowchart TB\n\t | |
| """ | |
| arrow = " --> " | |
| thick_arrow = " ==> " | |
| for k, v in file.items(): | |
| output += f"subgraph {k}\n\t{arrow.join(v)}\n\tend\n\t" | |
| output += thick_arrow.join(list(file.keys())) | |
| return output | |
| def get_completion(message: str, current_knowledge: str) -> str: | |
| """ | |
| Returns a string with mermaid syntax. | |
| """ | |
| sys_message = f""" | |
| You are required to provide a learning roadmap for the given topic. The learner profile is provided. Use these data to give a very detailed learning roadmap. Use the output format shown below. Remember to optimize the roadmap as per the learners profile. | |
| Return the output in JSON format. | |
| Example: | |
| {{ | |
| "<Topic>": [ | |
| "<sub topic 1>", | |
| "<sub topic 2>" | |
| ], | |
| "<Topic>": [ | |
| "<sub topic 1>", | |
| "<sub topic 2>" | |
| ] | |
| }} | |
| Topic name: {message} | |
| Learner profile: {current_knowledge} | |
| """ | |
| llm_model = google.generativeai.GenerativeModel('gemini-1.5-flash') | |
| chat_completion = llm_model.generate_content(sys_message) | |
| print(chat_completion) | |
| chat_completion_text = chat_completion.to_dict()['candidates'][0]['content']['parts'][0]['text'] | |
| chat_completion_text = chat_completion_text.replace("(", "") | |
| chat_completion_text = chat_completion_text.replace(")", "") | |
| print(dict_to_mermaid(output_sanitizer(chat_completion_text))) | |
| return dict_to_mermaid(output_sanitizer(chat_completion_text)) | |
| def gemini_output(): | |
| message = request.get_json() | |
| print(message) | |
| if message['prompt'] == "chess": | |
| return {'response': """flowchart TB | |
| subgraph 1[Fundamentals] | |
| 2[Objective of the game] --> 3[Chessboard setup] --> 4[Piece movement King, Queen, Rook, Bishop, Knight, Pawn] --> 5[Special moves Castling, En Passant] --> 6[Check, Checkmate, and Stalemate] | |
| end | |
| subgraph 7[Basic Tactics] | |
| 8[Piece value and development] --> 9[Controlling the center] --> 10[Forks] --> 11[Pins] --> 12[Skewers] --> 13[Discovered attacks] --> 14[Double attacks] --> 15[Traps] | |
| end | |
| subgraph 16[Openings] | |
| 17[Principles of opening theory] --> 18[Common opening traps to avoid] --> 19[Learning a few standard openings e.g., Italian Game, Ruy Lopez, Sicilian Defense] --> 20[Understanding opening goals control of the center, piece development, king safety] | |
| end | |
| subgraph 21[Middlegame Strategy] | |
| 22[Planning and evaluating positions] --> 23[Pawn structures and their weaknesses] --> 24[Identifying tactical opportunities] --> 25[Positional play improving piece placement, creating weaknesses] --> 26[Attacking and defending techniques] | |
| end | |
| subgraph 27[Endgames] | |
| 28[Basic checkmates King and Queen, King and Rook] --> 29[Theoretical endgames King and Pawn vs King, Rook and Pawn vs Rook] --> 30[Key endgame principles opposition, triangulation, key squares] --> 31[Practice common endgame patterns] | |
| end | |
| subgraph 32[Beyond the Basics] | |
| 33[Studying annotated master games] --> 34[Analyzing your own games] --> 35[Solving chess puzzles and tactics] --> 36[Participating in tournaments and online play] --> 37[Utilizing chess software and engines for analysis and training] --> 38[Exploring advanced concepts e.g., prophylaxis, positional sacrifice] | |
| end | |
| 1[Fundamentals] ==> 7[Basic Tactics] ==> 16[Openings] ==> 21[Middlegame Strategy] ==> 27[Endgames] ==> 32[Beyond the Basics]"""} | |
| # return {"prompt": "hi " + message['prompt']} | |
| return {"response": get_completion(message['prompt'], message['current_knowledge'])} | |