|
|
|
import os
|
|
import requests
|
|
from config import SWARMS_API_KEY, SWARMS_BASE_URL
|
|
from models.analysis import SwarmAnalysisResponse
|
|
|
|
|
|
API_KEY = SWARMS_API_KEY
|
|
BASE_URL = SWARMS_BASE_URL
|
|
|
|
headers = {
|
|
"x-api-key": API_KEY,
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
def create_indian_market_swarm(market_data: str, company_name: str) -> SwarmAnalysisResponse:
|
|
"""Create swarm for Indian market analysis using Swarms API"""
|
|
|
|
INDIAN_MARKET_CONTROLLER_PROMPT = f"""
|
|
You are an Indian market financial controller with expertise in NSE, BSE, and Indian economic conditions.
|
|
Analyze the provided data considering:
|
|
- RBI monetary policy and repo rates
|
|
- Indian sectoral performance
|
|
- Monsoon and seasonal factors
|
|
- Government policy impacts
|
|
- FII/DII flows
|
|
Provide analysis in Indian Rupees and local market context.
|
|
Company: {company_name}
|
|
"""
|
|
|
|
INDIAN_REVENUE_ANALYST_PROMPT = """
|
|
You are an Indian revenue analyst specializing in Indian companies.
|
|
Focus on:
|
|
- Quarterly vs Annual revenue patterns (Indian financial year: Apr-Mar)
|
|
- Domestic vs Export revenue mix
|
|
- GST impact analysis
|
|
- Rural vs Urban market performance
|
|
- Impact of Indian festivals and seasons
|
|
"""
|
|
|
|
INDIAN_RATIO_ANALYST_PROMPT = """
|
|
You are an Indian financial ratio analyst.
|
|
Compare ratios with:
|
|
- Nifty 50 averages
|
|
- Sector-specific Indian benchmarks
|
|
- Historical Indian market multiples
|
|
- Consider Indian accounting standards (Ind AS)
|
|
"""
|
|
|
|
swarm_config = {
|
|
"name": "Indian Market Analysis Swarm",
|
|
"description": "AI swarm specialized for Indian equity market analysis",
|
|
"agents": [
|
|
{
|
|
"agent_name": "Indian Market Controller",
|
|
"system_prompt": INDIAN_MARKET_CONTROLLER_PROMPT,
|
|
"model_name": "gpt-4o",
|
|
"role": "worker",
|
|
"max_loops": 1,
|
|
"max_tokens": 4096,
|
|
"temperature": 0.3,
|
|
},
|
|
{
|
|
"agent_name": "Indian Revenue Analyst",
|
|
"system_prompt": INDIAN_REVENUE_ANALYST_PROMPT,
|
|
"model_name": "gpt-4o",
|
|
"role": "worker",
|
|
"max_loops": 1,
|
|
"max_tokens": 4096,
|
|
"temperature": 0.3,
|
|
},
|
|
{
|
|
"agent_name": "Indian Ratio Analyst",
|
|
"system_prompt": INDIAN_RATIO_ANALYST_PROMPT,
|
|
"model_name": "gpt-4o",
|
|
"role": "worker",
|
|
"max_loops": 1,
|
|
"max_tokens": 4096,
|
|
"temperature": 0.3,
|
|
}
|
|
],
|
|
"max_loops": 1,
|
|
"swarm_type": "SequentialWorkflow",
|
|
"task": f"Analyze the following Indian market data for {company_name}:\n\n{market_data}"
|
|
}
|
|
|
|
try:
|
|
response = requests.post(
|
|
f"{BASE_URL}/v1/swarm/completions",
|
|
headers=headers,
|
|
json=swarm_config,
|
|
timeout=120
|
|
)
|
|
response.raise_for_status()
|
|
|
|
result_data = response.json()
|
|
|
|
|
|
if result_data.get("status") == "success":
|
|
|
|
raw_outputs = result_data.get("output", [])
|
|
processed_outputs = [
|
|
{"role": out.get("role", f"Agent {i+1}"), "content": out.get("content", "")}
|
|
for i, out in enumerate(raw_outputs) if isinstance(out, dict)
|
|
]
|
|
return SwarmAnalysisResponse(status="success", output=processed_outputs)
|
|
else:
|
|
return SwarmAnalysisResponse(status="error", error=result_data.get("error", "Unknown error from swarm service"))
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
return SwarmAnalysisResponse(status="error", error=f"Network error calling swarm service: {str(e)}")
|
|
except Exception as e:
|
|
return SwarmAnalysisResponse(status="error", error=f"Swarm analysis failed: {str(e)}")
|
|
|