File size: 7,723 Bytes
16f75b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5759067
16f75b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e3ddfeb
16f75b9
 
 
 
 
68eaa74
16f75b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5759067
373921e
83ebe62
849004f
16f75b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
849004f
16f75b9
 
 
 
849004f
16f75b9
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import json
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import openai
from typing import List, Dict, Any
import os

app = FastAPI()

# Pydantic models for request body
class StudyInput(BaseModel):
    overall_study_pattern: str
    memorization_study_pattern: str
    problem_solving_study_pattern: str
    visualization_study_pattern: str
    obstacle_study_pattern: str
    new_topic_approach: str
    old_topic_approach: str
    topic_ratio: str
    hours_of_study: str
    hours_of_study_weekends: str
    revision_days: str
    test_days: str
    physicsStartIndex: int
    chemistryStartIndex: int
    mathematicsStartIndex: int
    completed_phy_chapters: List[str]
    completed_chem_chapters: List[str]
    completed_maths_chapters: List[str]
    currentDate: str
# Function to remove completed chapters
def remove_completed_chapters(subject_data, completed_chapters):
    subject_data["chapters"] = [chapter for chapter in subject_data["chapters"]
                                if chapter["chapter"] not in completed_chapters]
    return subject_data

# Function to get data at index
def get_data_at_index(json_data, index):
    if 0 <= index < len(json_data['chapters']):
        return json_data['chapters'][index]
    else:
        return {}

@app.post("/generate_roadmap")
async def generate_roadmap(study_input: StudyInput):
    # Load JSON data for each subject
    # Note: You'll need to adjust the file paths or include these JSON files in your Docker image
    with open('Physics.json', 'r', encoding='utf-8') as file:
        phy = json.load(file)
    with open('Chemistry.json', 'r', encoding='utf-8') as file:
        chem = json.load(file)
    with open('Maths.json', 'r', encoding='utf-8') as file:
        maths = json.load(file)
  
    # Remove completed chapters
    phy = remove_completed_chapters(phy, study_input.completed_phy_chapters)
    chem = remove_completed_chapters(chem, study_input.completed_chem_chapters)
    maths = remove_completed_chapters(maths, study_input.completed_maths_chapters)
   
    # Get data at specified indices
    phy = get_data_at_index(phy, study_input.physicsStartIndex)
    chem = get_data_at_index(chem, study_input.chemistryStartIndex)
    maths = get_data_at_index(maths, study_input.mathematicsStartIndex)
    # Prepare user persona
    user_persona = f"""
    You are required to generate a highly personalized roadmap for a student studying Physics, Chemistry, and Mathematics for the JEE Main exam.
    The roadmap should be tailored based on the following student-specific details:

    1. *Study Preferences:*
       - Study Pattern: {study_input.overall_study_pattern}
       - Memorization Approach: {study_input.memorization_study_pattern}
       - Problem-Solving Approach: {study_input.problem_solving_study_pattern}
       - Visualization Approach: {study_input.visualization_study_pattern}

    2. *Handling Challenges:*
       - If unable to understand a topic: {study_input.obstacle_study_pattern}
       - Approach to New Topics: {study_input.new_topic_approach}
       - Approach to Previously Encountered Topics: {study_input.old_topic_approach}

    3. *Study Hours:*
       - Weekdays: {study_input.hours_of_study} hours/day
       - Weekends: {study_input.hours_of_study_weekends} hours/day
       - Time Allocation Ratio (Physics:Chemistry:Mathematics): {study_input.topic_ratio}
       - By weekdays I mean day 1, day 2 , day 3 , day 4 , day 5
       - By weekends I mean day 6 , day 7
    4. *Revision and Test Strategy:*
       - The days of the week when you do revision : {study_input.revision_days}
       - The days of the week when you give tests : {study_input.test_days}
    """
    output_structure = """{
  "schedule": [
    {
      "dayNumber": int,
      "date":YYYY-MM-DD
      "subjects": [
        {
          "name": "string",
          "tasks": [
            {
              "ChapterName": "string",
              "type": "string",
              "topic": "string",
              "time": "string"
            }
          ]
        }
      ]
    }
  ]
}
"""
    # Prepare system prompt
    sys_prompt = f"""
    You are required to generate a highly personalized roadmap for a student studying Physics, Chemistry, and Mathematics for the JEE Main exam.
    The roadmap should be tailored based on the following student-specific details:

    The roadmap must be provided in the following format:
    {output_structure}

    Do not include anything other than the roadmap, and ensure the focus remains strictly on the subjects {phy}, {chem}, and {maths} and associated chapters.
    MAKE SURE THAT YOU MAKE THE ROADMAP FOR ALL THE THREE CHAPTERS EACH OF PHYSICS , CHEMISTRY AND MATHS TO COMPLETE THOSE CHAPTERS WITH 4 ASPECTS i.e "CONCEPT UNDERSTANDING","QUESTION PRACTICE","REVISION","TEST". ALSO INCLUDE TIME FOR EACH TASK THAT YOU GENERATE
    MAKE SURE THAT WE FIRST COMPLETE 1) CONCEPT UNDERSTANDING , 2) QUESTION PRACTICE FOR EVERY SUBTOPIC AND THEN REVISION AND TEST FOR WHOLE CHAPTER TOGETHER.
    MAKE SURE THAT WE INCULDE EACH SUBTOPIC OF EACH CHAPTER FROM {phy},{chem} and {maths} IS FINISHED
    YOU ARE NOT CONSTRAINED TO CREATE A ROADMAP FOR ONLY 'X' NUMBER OF DAYS , YOU CAN EXTEND TILL THE TOPICS ARE FINISHED BUT ONLY STICK TO THE TIMEFRAME ALLOTED FOR EACH SUBJECT AND DO NOT GO ABOVE OR BELOW THAT TIME FRAME.
    Make sure you make the roadmap for 7-10 days only.
    Make Sure that you start the roadmap date from the date the roadmap is generated (Current Date : {study_input.currentDate})
    Make Sure you newer leave any field empty
    Make Sure that you take care of the year in the date entry for example you are generating a roadmap from 30-12-2024 for 8 days then you must chnage the year after 31-12-2024 to 2025.
    
    """

    # Make OpenAI API call
    openai.api_key = os.getenv("KEY")  # Replace with your actual API key or use environment variables
    try:
        response = openai.ChatCompletion.create(
            model="gpt-4o-mini",
            messages=[
                {
                    "role": "system",
                    "content": sys_prompt + "MAKE SURE YOU VERY VERY STRUCTLY FOLLOW THE JSON STRUCTURE BECAUSE I WILL PARSE YOUR OUTPUT TO JSON"
                },
                {
                    "role": "user",
                    "content": user_persona
                }
            ]
        )

        answer = response['choices'][0]['message']['content'].strip()

        # Second OpenAI API call
        response = openai.ChatCompletion.create(
            model="gpt-4o-mini",
            messages=[
                {
                    "role": "system",
                    "content": f'''
                    you created a very good roadmap {answer} but you make sure that you dont forget any subtopics from  Physics : {phy}, Chemistry : {chem} and Maths : {maths}. ensure that the style is same as the previous roadmap.
                    MAKE SURE YOU VERY VERY STRUCTLY FOLLOW THE JSON STRUCTURE BECAUSE I WILL PARSE YOUR OUTPUT TO JSON.
                    DO not include json at the top of the answer
                    
                    '''
                },
                {
                    "role": "user",
                    "content": "Generate the roadmap, and follow the output format very very very strictly"
                }
            ]
        )

        final_answer = response['choices'][0]['message']['content'].strip()
        parsed_json = json.loads(final_answer)

        return parsed_json
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)