This commit is contained in:
MarkLo127 2026-03-10 18:35:55 +08:00
parent 83e8068e8d
commit 2061fa27dd
1 changed files with 46 additions and 27 deletions

View File

@ -46,38 +46,58 @@ Below are the baseline reports for this conversation:
========================================="""
def _flatten_reports(reports: Dict[str, Any]) -> str:
def _flatten_reports(reports: Dict[str, Any], language: str = "zh-TW") -> str:
"""Flatten all reports into a single text block for context."""
sections = []
REPORT_LABELS = {
"market_report": "Market Analyst Report",
"sentiment_report": "Social Media Analyst Report",
"news_report": "News Analyst Report",
"fundamentals_report": "Fundamentals Analyst Report",
"trader_investment_plan": "Trader Investment Plan",
}
if language == "zh-TW":
REPORT_LABELS = {
"market_report": "市場分析師 (Market Analyst)",
"sentiment_report": "社群情緒分析師 (Social Media Analyst)",
"news_report": "新聞分析師 (News Analyst)",
"fundamentals_report": "基本面分析師 (Fundamentals Analyst)",
"trader_investment_plan": "交易員 (Trader)",
}
debate_keys = {
"investment_debate_state": {
"bull_history": "看漲研究員 (Bull Researcher)",
"bear_history": "看跌研究員 (Bear Researcher)",
"judge_decision": "研究經理 (Research Manager)",
},
"risk_debate_state": {
"risky_history": "激進分析師 (Aggressive Analyst)",
"safe_history": "保守分析師 (Conservative Analyst)",
"neutral_history": "中立分析師 (Neutral Analyst)",
"judge_decision": "風險經理 (Risk Manager)",
},
}
else:
REPORT_LABELS = {
"market_report": "Market Analyst",
"sentiment_report": "Social Media Analyst",
"news_report": "News Analyst",
"fundamentals_report": "Fundamentals Analyst",
"trader_investment_plan": "Trader",
}
debate_keys = {
"investment_debate_state": {
"bull_history": "Bull Researcher",
"bear_history": "Bear Researcher",
"judge_decision": "Research Manager",
},
"risk_debate_state": {
"risky_history": "Aggressive Analyst",
"safe_history": "Conservative Analyst",
"neutral_history": "Neutral Analyst",
"judge_decision": "Risk Manager",
},
}
for key, label in REPORT_LABELS.items():
content = reports.get(key)
if content and isinstance(content, str):
sections.append(f"## {label}\n{content}")
# Handle nested debate states
debate_keys = {
"investment_debate_state": {
"bull_history": "Bull Researcher",
"bear_history": "Bear Researcher",
"judge_decision": "Research Manager Decision",
},
"risk_debate_state": {
"risky_history": "Aggressive Analyst",
"safe_history": "Conservative Analyst",
"neutral_history": "Neutral Analyst",
"judge_decision": "Risk Manager Decision",
},
}
for state_key, sub_keys in debate_keys.items():
state = reports.get(state_key)
if isinstance(state, dict):
@ -117,11 +137,10 @@ async def chat_with_reports(
Returns:
Assistant's reply string
"""
reports_text = _flatten_reports(reports)
reports_text = _flatten_reports(reports, language=language)
# Truncate reports to avoid exceeding token limits
# ~4 chars per token, target max ~8000 tokens for context
MAX_REPORT_CHARS = 32000
# Increase truncation limit significantly to support 12 full analyst reports natively
MAX_REPORT_CHARS = 100000
if len(reports_text) > MAX_REPORT_CHARS:
reports_text = reports_text[:MAX_REPORT_CHARS] + "\n\n...(報告內容已截斷以符合模型限制)..."
logger.info(f"Reports truncated from {len(reports_text)} to {MAX_REPORT_CHARS} chars")