92 lines
5.1 KiB
Python
92 lines
5.1 KiB
Python
|
|
from tradingagents.agents.utils.agent_utils import (
|
|
build_optional_decision_context,
|
|
summarize_structured_signal,
|
|
truncate_prompt_text,
|
|
use_compact_analysis_prompt,
|
|
)
|
|
|
|
|
|
def create_conservative_debator(llm):
|
|
def conservative_node(state) -> dict:
|
|
risk_debate_state = state["risk_debate_state"]
|
|
history = risk_debate_state.get("history", "")
|
|
conservative_history = risk_debate_state.get("conservative_history", "")
|
|
|
|
current_aggressive_response = risk_debate_state.get("current_aggressive_response", "")
|
|
current_neutral_response = risk_debate_state.get("current_neutral_response", "")
|
|
|
|
market_research_report = state["market_report"]
|
|
sentiment_report = state["sentiment_report"]
|
|
news_report = state["news_report"]
|
|
fundamentals_report = state["fundamentals_report"]
|
|
|
|
trader_decision = state["trader_investment_plan"]
|
|
trader_structured = state.get("trader_investment_plan_structured") or {}
|
|
research_structured = state.get("investment_plan_structured") or {}
|
|
decision_context = build_optional_decision_context(
|
|
state.get("portfolio_context", ""),
|
|
state.get("peer_context", ""),
|
|
peer_context_mode=state.get("peer_context_mode", "UNSPECIFIED"),
|
|
max_chars=400,
|
|
)
|
|
|
|
if use_compact_analysis_prompt():
|
|
prompt = f"""You are the Conservative Risk Analyst. Focus on downside protection and capital preservation.
|
|
|
|
Research signal: {summarize_structured_signal(research_structured)}
|
|
Trader signal: {summarize_structured_signal(trader_structured)}
|
|
Trader decision: {truncate_prompt_text(trader_decision, 500)}
|
|
{decision_context}
|
|
Market report: {truncate_prompt_text(market_research_report, 500)}
|
|
Sentiment report: {truncate_prompt_text(sentiment_report, 350)}
|
|
News report: {truncate_prompt_text(news_report, 350)}
|
|
Fundamentals report: {truncate_prompt_text(fundamentals_report, 450)}
|
|
Debate history: {truncate_prompt_text(history, 500)}
|
|
Last aggressive: {truncate_prompt_text(current_aggressive_response, 300)}
|
|
Last neutral: {truncate_prompt_text(current_neutral_response, 300)}
|
|
|
|
Keep it under 180 words and focus on 2-3 main risks."""
|
|
else:
|
|
prompt = f"""As the Conservative Risk Analyst, your primary objective is to protect assets, minimize volatility, and ensure steady, reliable growth. You prioritize stability, security, and risk mitigation, carefully assessing potential losses, economic downturns, and market volatility. When evaluating the trader's decision or plan, critically examine high-risk elements, pointing out where the decision may expose the firm to undue risk and where more cautious alternatives could secure long-term gains. Here is the trader's decision:
|
|
|
|
{trader_decision}
|
|
|
|
Structured research signal: {summarize_structured_signal(research_structured)}
|
|
Structured trader signal: {summarize_structured_signal(trader_structured)}
|
|
{decision_context}
|
|
|
|
Your task is to actively counter the arguments of the Aggressive and Neutral Analysts, highlighting where their views may overlook potential threats or fail to prioritize sustainability. Respond directly to their points, drawing from the following data sources to build a convincing case for a low-risk approach adjustment to the trader's decision:
|
|
|
|
Market Research Report: {market_research_report}
|
|
Social Media Sentiment Report: {sentiment_report}
|
|
Latest World Affairs Report: {news_report}
|
|
Company Fundamentals Report: {fundamentals_report}
|
|
Here is the current conversation history: {history} Here is the last response from the aggressive analyst: {current_aggressive_response} Here is the last response from the neutral analyst: {current_neutral_response}. If there are no responses from the other viewpoints yet, present your own argument based on the available data.
|
|
|
|
Engage by questioning their optimism and emphasizing the potential downsides they may have overlooked. Address each of their counterpoints to showcase why a conservative stance is ultimately the safest path for the firm's assets. Focus on debating and critiquing their arguments to demonstrate the strength of a low-risk strategy over their approaches. Output conversationally as if you are speaking without any special formatting."""
|
|
|
|
response = llm.invoke(prompt)
|
|
|
|
argument = f"Conservative Analyst: {response.content}"
|
|
|
|
new_risk_debate_state = {
|
|
"history": history + "\n" + argument,
|
|
"aggressive_history": risk_debate_state.get("aggressive_history", ""),
|
|
"conservative_history": conservative_history + "\n" + argument,
|
|
"neutral_history": risk_debate_state.get("neutral_history", ""),
|
|
"latest_speaker": "Conservative",
|
|
"current_aggressive_response": risk_debate_state.get(
|
|
"current_aggressive_response", ""
|
|
),
|
|
"current_conservative_response": argument,
|
|
"current_neutral_response": risk_debate_state.get(
|
|
"current_neutral_response", ""
|
|
),
|
|
"count": risk_debate_state["count"] + 1,
|
|
}
|
|
|
|
return {"risk_debate_state": new_risk_debate_state}
|
|
|
|
return conservative_node
|