mirror of
https://github.com/TauricResearch/TradingAgents.git
synced 2026-06-17 05:16:14 +03:00
Agents had no ground-truth ticker→company mapping, so the market analyst could pattern-match a price chart to the wrong company (e.g. TOTDY read as "TotalEnergies"), and every downstream agent inherited the bad framing. Resolve identity once at run start via a cached, fail-open yfinance lookup and inject company/sector/exchange into the shared instrument context that all twelve agents consume, with an explicit do-not-substitute instruction. Resolution runs on both the propagate() and CLI entry points. Also replaces the bare "Continue" message-clear placeholder, which some OpenAI-compatible providers interpreted as the user task, with a context-anchored placeholder carrying the resolved identity and date. #814 #888
66 lines
2.4 KiB
Python
66 lines
2.4 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 (
|
|
get_instrument_context_from_state,
|
|
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 = get_instrument_context_from_state(state)
|
|
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")
|