output_language config now propagates to every user-facing agent. Previously only the four analysts and portfolio manager respected the setting, producing partial-localization reports with English debate text interleaved with non-English analyst sections. Verified live: 7 agents produce Chinese output when config is set to Chinese. #575
66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
"""Trader: turns the Research Manager's investment plan into a concrete transaction proposal."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import functools
|
|
|
|
from langchain_core.messages import AIMessage
|
|
|
|
from tradingagents.agents.schemas import TraderProposal, render_trader_proposal
|
|
from tradingagents.agents.utils.agent_utils import (
|
|
build_instrument_context,
|
|
get_language_instruction,
|
|
)
|
|
from tradingagents.agents.utils.structured import (
|
|
bind_structured,
|
|
invoke_structured_or_freetext,
|
|
)
|
|
|
|
|
|
def create_trader(llm):
|
|
structured_llm = bind_structured(llm, TraderProposal, "Trader")
|
|
|
|
def trader_node(state, name):
|
|
company_name = state["company_of_interest"]
|
|
instrument_context = build_instrument_context(company_name)
|
|
investment_plan = state["investment_plan"]
|
|
|
|
messages = [
|
|
{
|
|
"role": "system",
|
|
"content": (
|
|
"You are a trading agent analyzing market data to make investment decisions. "
|
|
"Based on your analysis, provide a specific recommendation to buy, sell, or hold. "
|
|
"Anchor your reasoning in the analysts' reports and the research plan."
|
|
+ get_language_instruction()
|
|
),
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": (
|
|
f"Based on a comprehensive analysis by a team of analysts, here is an investment "
|
|
f"plan tailored for {company_name}. {instrument_context} This plan incorporates "
|
|
f"insights from current technical market trends, macroeconomic indicators, and "
|
|
f"social media sentiment. Use this plan as a foundation for evaluating your next "
|
|
f"trading decision.\n\nProposed Investment Plan: {investment_plan}\n\n"
|
|
f"Leverage these insights to make an informed and strategic decision."
|
|
),
|
|
},
|
|
]
|
|
|
|
trader_plan = invoke_structured_or_freetext(
|
|
structured_llm,
|
|
llm,
|
|
messages,
|
|
render_trader_proposal,
|
|
"Trader",
|
|
)
|
|
|
|
return {
|
|
"messages": [AIMessage(content=trader_plan)],
|
|
"trader_investment_plan": trader_plan,
|
|
"sender": name,
|
|
}
|
|
|
|
return functools.partial(trader_node, name="Trader")
|