Update app.py
Browse files
app.py
CHANGED
@@ -7,12 +7,14 @@ import aiohttp
|
|
7 |
from typing import Optional
|
8 |
from fpdf import FPDF
|
9 |
|
10 |
-
#
|
11 |
MODAL_BASE_URL = "https://devsam2898--personal-investment-strategist-fixed-web.modal.run"
|
12 |
-
|
|
|
13 |
HEALTH_URL = f"{MODAL_BASE_URL}/health"
|
14 |
-
MARKET_DATA_URL = f"{MODAL_BASE_URL}/market_data"
|
15 |
-
COUNTRY_ANALYSIS_URL = f"{MODAL_BASE_URL}/country_analysis"
|
|
|
16 |
|
17 |
async def get_investment_strategy_async(age_group, income, expenses, current_assets, current_liabilities, risk_profile, goal, timeframe, country):
|
18 |
"""Updated async function for new Modal backend structure"""
|
@@ -45,17 +47,19 @@ async def get_investment_strategy_async(age_group, income, expenses, current_ass
|
|
45 |
# Clean country name (remove emoji flags if present)
|
46 |
clean_country = country.split(' ', 1)[-1] if 'πΊπΈ' in country or 'π¨π¦' in country else country
|
47 |
|
48 |
-
# Updated payload structure to match
|
49 |
payload = {
|
50 |
-
"
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
|
|
|
|
59 |
}
|
60 |
|
61 |
try:
|
@@ -168,7 +172,7 @@ async def test_service_async():
|
|
168 |
except Exception as e:
|
169 |
health_status = f"β Health check failed: {str(e)}"
|
170 |
|
171 |
-
# Test market data endpoint
|
172 |
try:
|
173 |
async with session.get(MARKET_DATA_URL) as response:
|
174 |
if response.status == 200:
|
@@ -180,24 +184,20 @@ async def test_service_async():
|
|
180 |
else:
|
181 |
market_status = f"β οΈ Market data endpoint returned status {response.status}"
|
182 |
except Exception as e:
|
183 |
-
market_status = f"
|
184 |
|
185 |
-
# Test
|
186 |
try:
|
187 |
-
|
188 |
-
"country": "United States",
|
189 |
-
"include_tax_calc": False
|
190 |
-
}
|
191 |
-
async with session.post(COUNTRY_ANALYSIS_URL, json=test_payload) as response:
|
192 |
if response.status == 200:
|
193 |
-
|
194 |
-
country_status = f"""β
**
|
195 |
-
-
|
196 |
-
- Features:
|
197 |
else:
|
198 |
-
country_status = f"β οΈ
|
199 |
except Exception as e:
|
200 |
-
country_status = f"β
|
201 |
|
202 |
return f"""## π Enhanced Service Status Check
|
203 |
|
@@ -207,7 +207,7 @@ async def test_service_async():
|
|
207 |
**Market Data Service:**
|
208 |
{market_status}
|
209 |
|
210 |
-
**
|
211 |
{country_status}
|
212 |
|
213 |
**Service Features:**
|
@@ -246,37 +246,24 @@ def test_service():
|
|
246 |
return f"β **Test Error**: {str(e)}"
|
247 |
|
248 |
async def get_market_preview_async():
|
249 |
-
"""Get current market data preview"""
|
250 |
try:
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
change_emoji = "π" if data.get('change_percent', 0) > 0 else "π"
|
266 |
-
preview += f"β’ {change_emoji} {index}: {data.get('current_price', 'N/A'):.2f} ({data.get('change_percent', 0):+.2f}%)\n"
|
267 |
-
|
268 |
-
# Bullish sectors
|
269 |
-
if market_data.get("bullish_sectors", {}).get("bullish_sectors"):
|
270 |
-
preview += "\n**π Top Performing Sectors:**\n"
|
271 |
-
for sector in market_data["bullish_sectors"]["bullish_sectors"][:3]:
|
272 |
-
preview += f"β’ {sector['sector']}: {sector['performance']}\n"
|
273 |
-
|
274 |
-
preview += f"\n*Updated: {market_data.get('timestamp', 'Unknown')}*"
|
275 |
-
return preview
|
276 |
-
else:
|
277 |
-
return "π **Market data temporarily unavailable**\n\nClick 'Generate Strategy' for comprehensive analysis including current market conditions."
|
278 |
except Exception as e:
|
279 |
-
return "π **Market
|
280 |
|
281 |
def get_market_preview():
|
282 |
"""Sync wrapper for market preview"""
|
@@ -632,14 +619,7 @@ with gr.Blocks(
|
|
632 |
)
|
633 |
with gr.Column(scale=1):
|
634 |
test_btn = gr.Button(
|
635 |
-
"π Test
|
636 |
-
variant="secondary",
|
637 |
-
size="lg",
|
638 |
-
elem_classes="secondary-btn"
|
639 |
-
)
|
640 |
-
with gr.Column(scale=1):
|
641 |
-
market_btn = gr.Button(
|
642 |
-
"π Refresh Market Data",
|
643 |
variant="secondary",
|
644 |
size="lg",
|
645 |
elem_classes="secondary-btn"
|
@@ -703,12 +683,6 @@ with gr.Blocks(
|
|
703 |
outputs=output,
|
704 |
show_progress=True
|
705 |
)
|
706 |
-
|
707 |
-
market_btn.click(
|
708 |
-
fn=get_market_preview,
|
709 |
-
outputs=market_preview,
|
710 |
-
show_progress=True
|
711 |
-
)
|
712 |
|
713 |
download_btn.click(
|
714 |
fn=download_strategy,
|
|
|
7 |
from typing import Optional
|
8 |
from fpdf import FPDF
|
9 |
|
10 |
+
# Updated URLs to match your actual Modal deployment
|
11 |
MODAL_BASE_URL = "https://devsam2898--personal-investment-strategist-fixed-web.modal.run"
|
12 |
+
# Based on your original code, these might be the correct endpoints:
|
13 |
+
STRATEGY_URL = f"{MODAL_BASE_URL}/strategy" # Original endpoint name
|
14 |
HEALTH_URL = f"{MODAL_BASE_URL}/health"
|
15 |
+
MARKET_DATA_URL = f"{MODAL_BASE_URL}/market_data" # May not exist yet
|
16 |
+
COUNTRY_ANALYSIS_URL = f"{MODAL_BASE_URL}/country_analysis" # May not exist yet
|
17 |
+
TEST_URL = f"{MODAL_BASE_URL}/test" # Original test endpoint
|
18 |
|
19 |
async def get_investment_strategy_async(age_group, income, expenses, current_assets, current_liabilities, risk_profile, goal, timeframe, country):
|
20 |
"""Updated async function for new Modal backend structure"""
|
|
|
47 |
# Clean country name (remove emoji flags if present)
|
48 |
clean_country = country.split(' ', 1)[-1] if 'πΊπΈ' in country or 'π¨π¦' in country else country
|
49 |
|
50 |
+
# Updated payload structure to match original Modal backend
|
51 |
payload = {
|
52 |
+
"profile": {
|
53 |
+
"age_group": age_group,
|
54 |
+
"income": income_val,
|
55 |
+
"expenses": expenses_val,
|
56 |
+
"current_assets": assets_val,
|
57 |
+
"current_liabilities": liabilities_val,
|
58 |
+
"risk_profile": risk_profile,
|
59 |
+
"goal": goal,
|
60 |
+
"timeframe": timeframe,
|
61 |
+
"country": clean_country
|
62 |
+
}
|
63 |
}
|
64 |
|
65 |
try:
|
|
|
172 |
except Exception as e:
|
173 |
health_status = f"β Health check failed: {str(e)}"
|
174 |
|
175 |
+
# Test market data endpoint (may not be available)
|
176 |
try:
|
177 |
async with session.get(MARKET_DATA_URL) as response:
|
178 |
if response.status == 200:
|
|
|
184 |
else:
|
185 |
market_status = f"β οΈ Market data endpoint returned status {response.status}"
|
186 |
except Exception as e:
|
187 |
+
market_status = f"βΉοΈ Market data endpoint not available (integrated into strategy generation)"
|
188 |
|
189 |
+
# Test strategy endpoint with sample data (using original test endpoint)
|
190 |
try:
|
191 |
+
async with session.get(TEST_URL) as response:
|
|
|
|
|
|
|
|
|
192 |
if response.status == 200:
|
193 |
+
test_data = await response.json()
|
194 |
+
country_status = f"""β
**Strategy endpoint working**
|
195 |
+
- Result: {test_data.get('test_result', 'Test passed')}
|
196 |
+
- Features: Investment strategy generation"""
|
197 |
else:
|
198 |
+
country_status = f"β οΈ Test endpoint returned status {response.status}"
|
199 |
except Exception as e:
|
200 |
+
country_status = f"β Strategy test failed: {str(e)}"
|
201 |
|
202 |
return f"""## π Enhanced Service Status Check
|
203 |
|
|
|
207 |
**Market Data Service:**
|
208 |
{market_status}
|
209 |
|
210 |
+
**Strategy Service:**
|
211 |
{country_status}
|
212 |
|
213 |
**Service Features:**
|
|
|
246 |
return f"β **Test Error**: {str(e)}"
|
247 |
|
248 |
async def get_market_preview_async():
|
249 |
+
"""Get current market data preview - simplified for original backend"""
|
250 |
try:
|
251 |
+
# Since market data might be integrated into the main strategy endpoint,
|
252 |
+
# we'll provide a static preview and note that full data is in strategy generation
|
253 |
+
return """## π Market Analysis Available
|
254 |
+
|
255 |
+
**Real-Time Data Integration:**
|
256 |
+
β’ Market indices (S&P 500, NASDAQ, Dow Jones, etc.)
|
257 |
+
β’ Sector performance analysis
|
258 |
+
β’ Bullish stock identification
|
259 |
+
β’ Economic indicators by country
|
260 |
+
|
261 |
+
**π Full market analysis included in your personalized strategy generation**
|
262 |
+
|
263 |
+
*Click 'Generate Strategy' for comprehensive market data and analysis*"""
|
264 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
265 |
except Exception as e:
|
266 |
+
return "π **Market analysis integrated into strategy generation**\n\nFull market data will be included in your personalized strategy."
|
267 |
|
268 |
def get_market_preview():
|
269 |
"""Sync wrapper for market preview"""
|
|
|
619 |
)
|
620 |
with gr.Column(scale=1):
|
621 |
test_btn = gr.Button(
|
622 |
+
"π Test Service",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
623 |
variant="secondary",
|
624 |
size="lg",
|
625 |
elem_classes="secondary-btn"
|
|
|
683 |
outputs=output,
|
684 |
show_progress=True
|
685 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
686 |
|
687 |
download_btn.click(
|
688 |
fn=download_strategy,
|