WaysAhead Global commited on
Commit
caeb9cd
Β·
verified Β·
1 Parent(s): 4531584

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +26 -26
main.py CHANGED
@@ -1,4 +1,5 @@
1
  import os
 
2
  from datetime import datetime, timedelta
3
  from fastapi import FastAPI, HTTPException
4
  from pydantic import BaseModel
@@ -11,18 +12,6 @@ from langchain.prompts import SystemMessagePromptTemplate, HumanMessagePromptTem
11
  from langchain.prompts.chat import ChatPromptTemplate
12
  import pytz
13
  import uvicorn
14
- import json
15
-
16
- def safe_json_parse(content: str):
17
- try:
18
- while isinstance(content, str):
19
- content = content.strip()
20
- content = content.strip('"').strip("'") # remove outer quotes
21
- content = json.loads(content) # keep parsing until it becomes dict
22
- return content
23
- except Exception as e:
24
- raise ValueError(f"JSON parsing failed: {e}")
25
-
26
 
27
  # πŸ” Load environment
28
  load_dotenv()
@@ -51,7 +40,7 @@ def get_week_range():
51
  end = start + timedelta(days=6)
52
  return start.strftime("%Y-%m-%d"), end.strftime("%Y-%m-%d")
53
 
54
- # 🧾 SQL Builder with optional date range
55
  def build_sql(first_name: str, last_name: str = None, start_date: str = None, end_date: str = None) -> str:
56
  if not start_date or not end_date:
57
  start_date, end_date = get_week_range()
@@ -85,10 +74,6 @@ def build_sql(first_name: str, last_name: str = None, start_date: str = None, en
85
  # πŸ› οΈ LangChain Tool
86
  @tool
87
  def query_weekly_progress(query: str) -> str:
88
- """
89
- Executes a SELECT query to get user progress for the week.
90
- Accepts SQL generated from name and timeframe.
91
- """
92
  try:
93
  print(f"πŸ“₯ SQL: {query}")
94
  if not query.lower().strip().startswith("select"):
@@ -98,7 +83,7 @@ def query_weekly_progress(query: str) -> str:
98
  except Exception as e:
99
  return f"❌ SQL Error: {e}"
100
 
101
- # πŸ€– Weekly report formatter (HTML)
102
  system_prompt = SystemMessagePromptTemplate(
103
  prompt=PromptTemplate(
104
  input_variables=[],
@@ -131,7 +116,7 @@ chat_prompt = ChatPromptTemplate.from_messages([
131
  agent = create_openai_tools_agent(llm=llm, tools=[query_weekly_progress], prompt=chat_prompt)
132
  agent_executor = AgentExecutor(agent=agent, tools=[query_weekly_progress])
133
 
134
- # ✨ Prompt: Extract name and optional date range
135
  name_extractor = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, openai_api_key=OPENAI_API_KEY)
136
  name_prompt = PromptTemplate(
137
  input_variables=["text"],
@@ -152,20 +137,36 @@ Prompt: {text}
152
  """
153
  )
154
 
155
- # πŸ“₯ Request model
156
  class PromptRequest(BaseModel):
157
  prompt: str
158
 
159
- # πŸ” Endpoint
 
 
 
 
 
 
 
 
 
 
 
 
160
  @app.post("/weekly-dpr")
161
  async def get_prompt_based_dpr(request: PromptRequest):
162
  try:
163
  prompt_text = request.prompt.strip()
164
- name_response = name_extractor.invoke(name_prompt.format_prompt(text=prompt_text).to_string())
 
 
 
 
165
 
166
- print("🧠 Extracted JSON string:", name_response.content)
167
 
168
- name_json = safe_json_parse(name_response.content)
169
 
170
  first = name_json.get("first_name")
171
  last = name_json.get("last_name")
@@ -173,7 +174,7 @@ async def get_prompt_based_dpr(request: PromptRequest):
173
  end_date = name_json.get("end_date")
174
 
175
  if not first:
176
- raise ValueError("No valid name extracted.")
177
 
178
  sql = build_sql(first, last, start_date, end_date)
179
  context = f"Generate HTML weekly report for: {first} {last or ''} from {start_date or 'this week'} to {end_date or ''} using this query:\n{sql}"
@@ -184,7 +185,6 @@ async def get_prompt_based_dpr(request: PromptRequest):
184
  except Exception as e:
185
  raise HTTPException(status_code=500, detail=f"DPR Error: {e}")
186
 
187
-
188
  # ▢️ Run the app
189
  if __name__ == "__main__":
190
  uvicorn.run(app, host="0.0.0.0", port=7860)
 
1
  import os
2
+ import json
3
  from datetime import datetime, timedelta
4
  from fastapi import FastAPI, HTTPException
5
  from pydantic import BaseModel
 
12
  from langchain.prompts.chat import ChatPromptTemplate
13
  import pytz
14
  import uvicorn
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  # πŸ” Load environment
17
  load_dotenv()
 
40
  end = start + timedelta(days=6)
41
  return start.strftime("%Y-%m-%d"), end.strftime("%Y-%m-%d")
42
 
43
+ # 🧾 SQL Builder
44
  def build_sql(first_name: str, last_name: str = None, start_date: str = None, end_date: str = None) -> str:
45
  if not start_date or not end_date:
46
  start_date, end_date = get_week_range()
 
74
  # πŸ› οΈ LangChain Tool
75
  @tool
76
  def query_weekly_progress(query: str) -> str:
 
 
 
 
77
  try:
78
  print(f"πŸ“₯ SQL: {query}")
79
  if not query.lower().strip().startswith("select"):
 
83
  except Exception as e:
84
  return f"❌ SQL Error: {e}"
85
 
86
+ # πŸ€– Weekly report formatter
87
  system_prompt = SystemMessagePromptTemplate(
88
  prompt=PromptTemplate(
89
  input_variables=[],
 
116
  agent = create_openai_tools_agent(llm=llm, tools=[query_weekly_progress], prompt=chat_prompt)
117
  agent_executor = AgentExecutor(agent=agent, tools=[query_weekly_progress])
118
 
119
+ # ✨ Name + Date extractor prompt
120
  name_extractor = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, openai_api_key=OPENAI_API_KEY)
121
  name_prompt = PromptTemplate(
122
  input_variables=["text"],
 
137
  """
138
  )
139
 
140
+ # πŸ“₯ Input model
141
  class PromptRequest(BaseModel):
142
  prompt: str
143
 
144
+ # 🧠 Safe JSON parser for LLM responses
145
+ def safe_extract_json(raw_content: str) -> dict:
146
+ try:
147
+ while isinstance(raw_content, str):
148
+ raw_content = raw_content.strip().strip('"').strip("'")
149
+ raw_content = json.loads(raw_content)
150
+ if isinstance(raw_content, dict):
151
+ return raw_content
152
+ raise ValueError("Parsed content is not a dict.")
153
+ except Exception as e:
154
+ raise ValueError(f"Could not extract JSON from model response: {e}")
155
+
156
+ # πŸ” Main endpoint
157
  @app.post("/weekly-dpr")
158
  async def get_prompt_based_dpr(request: PromptRequest):
159
  try:
160
  prompt_text = request.prompt.strip()
161
+ name_response = name_extractor.invoke(
162
+ name_prompt.format_prompt(text=prompt_text).to_string()
163
+ )
164
+
165
+ print("🧠 Raw model response:", repr(name_response.content))
166
 
167
+ name_json = safe_extract_json(name_response.content)
168
 
169
+ print("βœ… Parsed JSON:", name_json)
170
 
171
  first = name_json.get("first_name")
172
  last = name_json.get("last_name")
 
174
  end_date = name_json.get("end_date")
175
 
176
  if not first:
177
+ raise ValueError("No valid first name extracted.")
178
 
179
  sql = build_sql(first, last, start_date, end_date)
180
  context = f"Generate HTML weekly report for: {first} {last or ''} from {start_date or 'this week'} to {end_date or ''} using this query:\n{sql}"
 
185
  except Exception as e:
186
  raise HTTPException(status_code=500, detail=f"DPR Error: {e}")
187
 
 
188
  # ▢️ Run the app
189
  if __name__ == "__main__":
190
  uvicorn.run(app, host="0.0.0.0", port=7860)