WaysAhead Global commited on
Update main.py
Browse files
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
|
| 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
|
| 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 |
-
# β¨
|
| 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 |
-
# π₯
|
| 156 |
class PromptRequest(BaseModel):
|
| 157 |
prompt: str
|
| 158 |
|
| 159 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
|
| 166 |
-
|
| 167 |
|
| 168 |
-
|
| 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)
|