f43312a858
Signed-off-by: TIANHE <TIANHE@GMAIL.COM>
207 lines
7.1 KiB
Python
207 lines
7.1 KiB
Python
"""
|
|
Risk debate agents.
|
|
Includes: aggressive / neutral / conservative risk analysts.
|
|
"""
|
|
import json
|
|
from typing import Dict, Any
|
|
from .base_agent import BaseAgent
|
|
from app.services.llm import LLMService
|
|
|
|
logger = __import__('app.utils.logger', fromlist=['get_logger']).get_logger(__name__)
|
|
|
|
|
|
class RiskyAnalyst(BaseAgent):
|
|
"""Aggressive risk analyst."""
|
|
|
|
def __init__(self, memory=None):
|
|
super().__init__("RiskyAnalyst", memory)
|
|
self.llm_service = LLMService()
|
|
|
|
def analyze(self, context: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Analyze risk from an aggressive perspective."""
|
|
market = context.get('market')
|
|
symbol = context.get('symbol')
|
|
language = context.get('language', 'zh-CN')
|
|
model = context.get('model')
|
|
trader_plan = context.get('trader_plan', {})
|
|
|
|
lang_instruction = self._get_language_instruction(language)
|
|
system_prompt = f"""You are an Aggressive Risk Analyst. You tend to:
|
|
{lang_instruction}
|
|
1. Emphasize high return potential, even with higher risks.
|
|
2. Believe current risks are controllable and worth taking.
|
|
3. Support aggressive trading strategies.
|
|
|
|
Please return in JSON format as follows:
|
|
{{
|
|
"argument": "Aggressive risk analysis argument...",
|
|
"risk_assessment": "Risk controllable, high return potential",
|
|
"recommendation": "Support trading plan"
|
|
}}"""
|
|
|
|
user_prompt = f"""Perform aggressive risk analysis for {symbol} in {market} market.
|
|
|
|
**Trading Plan:**
|
|
{json.dumps(trader_plan, ensure_ascii=False, indent=2) if trader_plan else 'No Data'}
|
|
|
|
Please analyze risk from an aggressive perspective, emphasizing return potential."""
|
|
|
|
result = self.llm_service.safe_call_llm(
|
|
system_prompt,
|
|
user_prompt,
|
|
{"argument": "", "risk_assessment": "", "recommendation": ""},
|
|
model=model
|
|
)
|
|
|
|
return {
|
|
"type": "risky",
|
|
"data": result
|
|
}
|
|
|
|
def _get_language_instruction(self, language: str) -> str:
|
|
language_map = {
|
|
'zh-CN': 'Answer in Simplified Chinese.',
|
|
'zh-TW': 'Answer in Traditional Chinese.',
|
|
'en-US': 'Answer in English.',
|
|
'ja-JP': 'Answer in Japanese.',
|
|
'ko-KR': 'Answer in Korean.',
|
|
'vi-VN': 'Answer in Vietnamese.',
|
|
'th-TH': 'Answer in Thai.',
|
|
'ar-SA': 'Answer in Arabic.',
|
|
'fr-FR': 'Answer in French.',
|
|
'de-DE': 'Answer in German.'
|
|
}
|
|
return language_map.get(language, 'Answer in English.')
|
|
|
|
|
|
class NeutralAnalyst(BaseAgent):
|
|
"""Neutral risk analyst."""
|
|
|
|
def __init__(self, memory=None):
|
|
super().__init__("NeutralAnalyst", memory)
|
|
self.llm_service = LLMService()
|
|
|
|
def analyze(self, context: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Analyze risk from a neutral perspective."""
|
|
market = context.get('market')
|
|
symbol = context.get('symbol')
|
|
language = context.get('language', 'zh-CN')
|
|
model = context.get('model')
|
|
trader_plan = context.get('trader_plan', {})
|
|
|
|
lang_instruction = self._get_language_instruction(language)
|
|
system_prompt = f"""You are a Neutral Risk Analyst. You tend to:
|
|
{lang_instruction}
|
|
1. Balance risk and return.
|
|
2. Objectively evaluate various possibilities.
|
|
3. Provide neutral risk advice.
|
|
|
|
Please return in JSON format as follows:
|
|
{{
|
|
"argument": "Neutral risk analysis argument...",
|
|
"risk_assessment": "Balance between risk and return",
|
|
"recommendation": "Cautiously execute trading plan"
|
|
}}"""
|
|
|
|
user_prompt = f"""Perform neutral risk analysis for {symbol} in {market} market.
|
|
|
|
**Trading Plan:**
|
|
{json.dumps(trader_plan, ensure_ascii=False, indent=2) if trader_plan else 'No Data'}
|
|
|
|
Please analyze risk from a neutral perspective, balancing risk and return."""
|
|
|
|
result = self.llm_service.safe_call_llm(
|
|
system_prompt,
|
|
user_prompt,
|
|
{"argument": "", "risk_assessment": "", "recommendation": ""},
|
|
model=model
|
|
)
|
|
|
|
return {
|
|
"type": "neutral",
|
|
"data": result
|
|
}
|
|
|
|
def _get_language_instruction(self, language: str) -> str:
|
|
language_map = {
|
|
'zh-CN': 'Answer in Simplified Chinese.',
|
|
'zh-TW': 'Answer in Traditional Chinese.',
|
|
'en-US': 'Answer in English.',
|
|
'ja-JP': 'Answer in Japanese.',
|
|
'ko-KR': 'Answer in Korean.',
|
|
'vi-VN': 'Answer in Vietnamese.',
|
|
'th-TH': 'Answer in Thai.',
|
|
'ar-SA': 'Answer in Arabic.',
|
|
'fr-FR': 'Answer in French.',
|
|
'de-DE': 'Answer in German.'
|
|
}
|
|
return language_map.get(language, 'Answer in English.')
|
|
|
|
|
|
class SafeAnalyst(BaseAgent):
|
|
"""Conservative risk analyst."""
|
|
|
|
def __init__(self, memory=None):
|
|
super().__init__("SafeAnalyst", memory)
|
|
self.llm_service = LLMService()
|
|
|
|
def analyze(self, context: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""Analyze risk from a conservative perspective."""
|
|
market = context.get('market')
|
|
symbol = context.get('symbol')
|
|
language = context.get('language', 'zh-CN')
|
|
model = context.get('model')
|
|
trader_plan = context.get('trader_plan', {})
|
|
risk_report = context.get('risk_report', {})
|
|
|
|
lang_instruction = self._get_language_instruction(language)
|
|
system_prompt = f"""You are a Conservative Risk Analyst. You tend to:
|
|
{lang_instruction}
|
|
1. Emphasize risk control, prioritizing capital protection.
|
|
2. Identify potential risk points.
|
|
3. Suggest cautious or conservative trading strategies.
|
|
|
|
Please return in JSON format as follows:
|
|
{{
|
|
"argument": "Conservative risk analysis argument...",
|
|
"risk_assessment": "High risk exists, suggest caution",
|
|
"recommendation": "Suggest reducing position or suspending trading"
|
|
}}"""
|
|
|
|
user_prompt = f"""Perform conservative risk analysis for {symbol} in {market} market.
|
|
|
|
**Trading Plan:**
|
|
{json.dumps(trader_plan, ensure_ascii=False, indent=2) if trader_plan else 'No Data'}
|
|
|
|
**Risk Analysis Report:**
|
|
{json.dumps(risk_report.get('data', {}), ensure_ascii=False, indent=2) if risk_report else 'No Data'}
|
|
|
|
Please analyze risk from a conservative perspective, emphasizing risk control."""
|
|
|
|
result = self.llm_service.safe_call_llm(
|
|
system_prompt,
|
|
user_prompt,
|
|
{"argument": "", "risk_assessment": "", "recommendation": ""},
|
|
model=model
|
|
)
|
|
|
|
return {
|
|
"type": "safe",
|
|
"data": result
|
|
}
|
|
|
|
def _get_language_instruction(self, language: str) -> str:
|
|
language_map = {
|
|
'zh-CN': 'Answer in Simplified Chinese.',
|
|
'zh-TW': 'Answer in Traditional Chinese.',
|
|
'en-US': 'Answer in English.',
|
|
'ja-JP': 'Answer in Japanese.',
|
|
'ko-KR': 'Answer in Korean.',
|
|
'vi-VN': 'Answer in Vietnamese.',
|
|
'th-TH': 'Answer in Thai.',
|
|
'ar-SA': 'Answer in Arabic.',
|
|
'fr-FR': 'Answer in French.',
|
|
'de-DE': 'Answer in German.'
|
|
}
|
|
return language_map.get(language, 'Answer in English.')
|