From 6197002a1e501d6a00477603ea836b28650ccf98 Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:50:48 +0800 Subject: [PATCH 1/4] feat: split agent configurations --- .../agent_cards/aswath_damodaran_agent.json | 18 ++ .../configs/agent_cards/ben_graham_agent.json | 18 ++ .../agent_cards/bill_ackman_agent.json | 18 ++ .../agent_cards/cathie_wood_agent.json | 18 ++ .../agent_cards/charlie_munger_agent.json | 18 ++ .../fundamentals_analyst_agent.json | 18 ++ .../configs/agent_cards/hedge_fund_agent.json | 168 ------------------ .../agent_cards/michael_burry_agent.json | 18 ++ .../agent_cards/mohnish_pabrai_agent.json | 18 ++ .../agent_cards/peter_lynch_agent.json | 18 ++ .../agent_cards/phil_fisher_agent.json | 18 ++ .../rakesh_jhunjhunwala_agent.json | 18 ++ .../agent_cards/sentiment_analyst_agent.json | 18 ++ .../stanley_druckenmiller_agent.json | 18 ++ .../agent_cards/technical_analyst_agent.json | 18 ++ .../agent_cards/valuation_analyst_agent.json | 18 ++ .../agent_cards/warren_buffett_agent.json | 18 ++ 17 files changed, 288 insertions(+), 168 deletions(-) create mode 100644 python/configs/agent_cards/aswath_damodaran_agent.json create mode 100644 python/configs/agent_cards/ben_graham_agent.json create mode 100644 python/configs/agent_cards/bill_ackman_agent.json create mode 100644 python/configs/agent_cards/cathie_wood_agent.json create mode 100644 python/configs/agent_cards/charlie_munger_agent.json create mode 100644 python/configs/agent_cards/fundamentals_analyst_agent.json delete mode 100644 python/configs/agent_cards/hedge_fund_agent.json create mode 100644 python/configs/agent_cards/michael_burry_agent.json create mode 100644 python/configs/agent_cards/mohnish_pabrai_agent.json create mode 100644 python/configs/agent_cards/peter_lynch_agent.json create mode 100644 python/configs/agent_cards/phil_fisher_agent.json create mode 100644 python/configs/agent_cards/rakesh_jhunjhunwala_agent.json create mode 100644 python/configs/agent_cards/sentiment_analyst_agent.json create mode 100644 python/configs/agent_cards/stanley_druckenmiller_agent.json create mode 100644 python/configs/agent_cards/technical_analyst_agent.json create mode 100644 python/configs/agent_cards/valuation_analyst_agent.json create mode 100644 python/configs/agent_cards/warren_buffett_agent.json diff --git a/python/configs/agent_cards/aswath_damodaran_agent.json b/python/configs/agent_cards/aswath_damodaran_agent.json new file mode 100644 index 000000000..b5d28a931 --- /dev/null +++ b/python/configs/agent_cards/aswath_damodaran_agent.json @@ -0,0 +1,18 @@ +{ + "name": "AswathDamodaranAgent", + "url": "http://localhost:10010/", + "description": "Valuation-focused analysis using robust discounted cash flow and intrinsic value methods. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "aswath_damodaran_agent", + "name": "Aswath Damodaran", + "description": "Valuation-focused analysis using robust discounted cash flow and intrinsic value methods.", + "examples": [ + "Value Tesla using a DCF with scenario analysis", + "What's the intrinsic value range for Nvidia based on conservative growth assumptions?" + ], + "tags": ["valuation", "DCF", "intrinsic value"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/ben_graham_agent.json b/python/configs/agent_cards/ben_graham_agent.json new file mode 100644 index 000000000..85ff7adfe --- /dev/null +++ b/python/configs/agent_cards/ben_graham_agent.json @@ -0,0 +1,18 @@ +{ + "name": "BenGrahamAgent", + "url": "http://localhost:10011/", + "description": "Margin-of-safety and value-investing oriented screens and stock selection. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "ben_graham_agent", + "name": "Ben Graham", + "description": "Margin-of-safety and value-investing oriented screens and stock selection.", + "examples": [ + "Find stocks trading below intrinsic value with strong balance sheets", + "Screen for deep value opportunities in the small-cap universe" + ], + "tags": ["value investing", "margin of safety"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/bill_ackman_agent.json b/python/configs/agent_cards/bill_ackman_agent.json new file mode 100644 index 000000000..3d39be94d --- /dev/null +++ b/python/configs/agent_cards/bill_ackman_agent.json @@ -0,0 +1,18 @@ +{ + "name": "BillAckmanAgent", + "url": "http://localhost:10012/", + "description": "Event-driven and activist-investor style analysis focused on catalysts and corporate structure improvements. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "bill_ackman_agent", + "name": "Bill Ackman", + "description": "Event-driven and activist-investor style analysis focused on catalysts and corporate structure improvements.", + "examples": [ + "Identify potential activist targets with undervalued assets", + "What catalysts could unlock value at Company X?" + ], + "tags": ["activist", "event-driven", "catalyst"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/cathie_wood_agent.json b/python/configs/agent_cards/cathie_wood_agent.json new file mode 100644 index 000000000..129dc1417 --- /dev/null +++ b/python/configs/agent_cards/cathie_wood_agent.json @@ -0,0 +1,18 @@ +{ + "name": "CathieWoodAgent", + "url": "http://localhost:10013/", + "description": "High-conviction growth and disruptive-innovation oriented analysis with long-term thematic views. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "cathie_wood_agent", + "name": "Cathie Wood", + "description": "High-conviction growth and disruptive-innovation oriented analysis with long-term thematic views.", + "examples": [ + "Assess the long-term growth thesis for ARK-style thematic investments", + "How might disruptive technology revenues evolve over the next 5 years?" + ], + "tags": ["growth", "disruption", "thematic"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/charlie_munger_agent.json b/python/configs/agent_cards/charlie_munger_agent.json new file mode 100644 index 000000000..2e66b8fec --- /dev/null +++ b/python/configs/agent_cards/charlie_munger_agent.json @@ -0,0 +1,18 @@ +{ + "name": "CharlieMungerAgent", + "url": "http://localhost:10014/", + "description": "Broad multidisciplinary perspective, focus on high-quality businesses with durable competitive advantages. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "charlie_munger_agent", + "name": "Charlie Munger", + "description": "Broad multidisciplinary perspective, focus on high-quality businesses with durable competitive advantages.", + "examples": [ + "Identify companies with long-term competitive moats", + "Evaluate management quality and capital allocation decisions" + ], + "tags": ["quality investing", "moat", "capital allocation"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/fundamentals_analyst_agent.json b/python/configs/agent_cards/fundamentals_analyst_agent.json new file mode 100644 index 000000000..0f8485654 --- /dev/null +++ b/python/configs/agent_cards/fundamentals_analyst_agent.json @@ -0,0 +1,18 @@ +{ + "name": "FundamentalsAnalystAgent", + "url": "http://localhost:10023/", + "description": "Financial-statement-driven analysis covering profitability, cash flows, and balance sheet strength. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "fundamentals_analyst_agent", + "name": "Fundamentals Analyst", + "description": "Financial-statement-driven analysis covering profitability, cash flows, and balance sheet strength.", + "examples": [ + "Analyze revenue and margin trends for Microsoft", + "Assess liquidity and leverage for Boeing" + ], + "tags": ["fundamentals", "financial statements", "metrics"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/hedge_fund_agent.json b/python/configs/agent_cards/hedge_fund_agent.json deleted file mode 100644 index d3fcb8172..000000000 --- a/python/configs/agent_cards/hedge_fund_agent.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "name": "AIHedgeFundAgent", - "url": "http://localhost:10001/", - "description": "AI Hedge Fund Agent provides multi-strategy analysis and investment insights. It can act like various famous analysts and specialists (valuation, technical, sentiment) to analyze stocks, portfolios, and market trends. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", - "skills": [ - { - "id": "aswath_damodaran_agent", - "name": "Aswath Damodaran", - "description": "Valuation-focused analysis using robust discounted cash flow and intrinsic value methods.", - "examples": [ - "Value Tesla using a DCF with scenario analysis", - "What's the intrinsic value range for Nvidia based on conservative growth assumptions?" - ], - "tags": ["valuation", "DCF", "intrinsic value"] - }, - { - "id": "ben_graham_agent", - "name": "Ben Graham", - "description": "Margin-of-safety and value-investing oriented screens and stock selection.", - "examples": [ - "Find stocks trading below intrinsic value with strong balance sheets", - "Screen for deep value opportunities in the small-cap universe" - ], - "tags": ["value investing", "margin of safety"] - }, - { - "id": "bill_ackman_agent", - "name": "Bill Ackman", - "description": "Event-driven and activist-investor style analysis focused on catalysts and corporate structure improvements.", - "examples": [ - "Identify potential activist targets with undervalued assets", - "What catalysts could unlock value at Company X?" - ], - "tags": ["activist", "event-driven", "catalyst"] - }, - { - "id": "cathie_wood_agent", - "name": "Cathie Wood", - "description": "High-conviction growth and disruptive-innovation oriented analysis with long-term thematic views.", - "examples": [ - "Assess the long-term growth thesis for ARK-style thematic investments", - "How might disruptive technology revenues evolve over the next 5 years?" - ], - "tags": ["growth", "disruption", "thematic"] - }, - { - "id": "charlie_munger_agent", - "name": "Charlie Munger", - "description": "Broad multidisciplinary perspective, focus on high-quality businesses with durable competitive advantages.", - "examples": [ - "Identify companies with long-term competitive moats", - "Evaluate management quality and capital allocation decisions" - ], - "tags": ["quality investing", "moat", "capital allocation"] - }, - { - "id": "michael_burry_agent", - "name": "Michael Burry", - "description": "Contrarian, deep-research driven value and special-situation analysis.", - "examples": [ - "Find contrarian opportunities overlooked by the market", - "Analyze distressed or deeply undervalued securities" - ], - "tags": ["contrarian", "deep value", "special situations"] - }, - { - "id": "mohnish_pabrai_agent", - "name": "Mohnish Pabrai", - "description": "Concentrated, low-risk value investing with a focus on high-upside asymmetric bets.", - "examples": [ - "Build a concentrated portfolio of high-conviction value ideas", - "Where are asymmetric risk-reward opportunities today?" - ], - "tags": ["concentrated", "value", "asymmetric"] - }, - { - "id": "peter_lynch_agent", - "name": "Peter Lynch", - "description": "Bottom-up, growth-at-a-reasonable-price (GARP) style stock picking and idea generation.", - "examples": [ - "Spot consumer-facing growth stories with reasonable valuations", - "Which small-cap growth companies show durable revenue expansion?" - ], - "tags": ["GARP", "bottom-up", "growth"] - }, - { - "id": "phil_fisher_agent", - "name": "Phil Fisher", - "description": "Qualitative growth investing focused on management, R&D, and long-term industry positioning.", - "examples": [ - "Assess a company's management and research capabilities", - "What are the long-term secular growth drivers for Company Y?" - ], - "tags": ["qualitative", "management", "R&D"] - }, - { - "id": "rakesh_jhunjhunwala_agent", - "name": "Rakesh Jhunjhunwala", - "description": "Concentrated, conviction-driven investing with an emphasis on high-growth emerging opportunities.", - "examples": [ - "Identify high-growth opportunities in emerging markets", - "Which mid-cap names have the potential to scale rapidly?" - ], - "tags": ["emerging markets", "conviction", "growth"] - }, - { - "id": "stanley_druckenmiller_agent", - "name": "Stanley Druckenmiller", - "description": "Macro-driven allocation and tactical trading insights combining top-down macro views with security selection.", - "examples": [ - "Develop a macro-informed allocation between equities and bonds", - "What macro catalysts are likely to affect tech stocks this quarter?" - ], - "tags": ["macro", "allocation", "tactical"] - }, - { - "id": "warren_buffett_agent", - "name": "Warren Buffett", - "description": "Long-term value investing with emphasis on durable businesses, simple economics, and shareholder-friendly management.", - "examples": [ - "Evaluate a company's long-term competitive advantage and free cash flow generation", - "Which businesses should be held for decades?" - ], - "tags": ["long-term", "value", "moat"] - }, - { - "id": "technical_analyst_agent", - "name": "Technical Analyst", - "description": "Chart-based technical analysis for entries, exits, trend identification and momentum signals.", - "examples": [ - "Provide support/resistance levels for AAPL", - "Identify bullish or bearish chart patterns for TSLA" - ], - "tags": ["technical", "charts", "momentum"] - }, - { - "id": "fundamentals_analyst_agent", - "name": "Fundamentals Analyst", - "description": "Financial-statement-driven analysis covering profitability, cash flows, and balance sheet strength.", - "examples": [ - "Analyze revenue and margin trends for Microsoft", - "Assess liquidity and leverage for Boeing" - ], - "tags": ["fundamentals", "financial statements", "metrics"] - }, - { - "id": "sentiment_analyst_agent", - "name": "Sentiment Analyst", - "description": "Market sentiment and positioning analysis using newsflow, social signals, and positioning data.", - "examples": [ - "Gauge retail sentiment around meme stocks", - "Summarize recent news sentiment for Amazon" - ], - "tags": ["sentiment", "news", "social"] - }, - { - "id": "valuation_analyst_agent", - "name": "Valuation Analyst", - "description": "Multi-method valuation using DCF, comparables, and precedent transactions to derive price targets.", - "examples": [ - "Produce a 12-month price target using DCF and comps", - "Compare valuation multiples across peers" - ], - "tags": ["valuation", "comparables", "DCF"] - } - ], - "enabled": true -} \ No newline at end of file diff --git a/python/configs/agent_cards/michael_burry_agent.json b/python/configs/agent_cards/michael_burry_agent.json new file mode 100644 index 000000000..35ea1d46e --- /dev/null +++ b/python/configs/agent_cards/michael_burry_agent.json @@ -0,0 +1,18 @@ +{ + "name": "MichaelBurryAgent", + "url": "http://localhost:10015/", + "description": "Contrarian, deep-research driven value and special-situation analysis. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "michael_burry_agent", + "name": "Michael Burry", + "description": "Contrarian, deep-research driven value and special-situation analysis.", + "examples": [ + "Find contrarian opportunities overlooked by the market", + "Analyze distressed or deeply undervalued securities" + ], + "tags": ["contrarian", "deep value", "special situations"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/mohnish_pabrai_agent.json b/python/configs/agent_cards/mohnish_pabrai_agent.json new file mode 100644 index 000000000..11ae4c70f --- /dev/null +++ b/python/configs/agent_cards/mohnish_pabrai_agent.json @@ -0,0 +1,18 @@ +{ + "name": "MohnishPabraiAgent", + "url": "http://localhost:10016/", + "description": "Concentrated, low-risk value investing with a focus on high-upside asymmetric bets. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "mohnish_pabrai_agent", + "name": "Mohnish Pabrai", + "description": "Concentrated, low-risk value investing with a focus on high-upside asymmetric bets.", + "examples": [ + "Build a concentrated portfolio of high-conviction value ideas", + "Where are asymmetric risk-reward opportunities today?" + ], + "tags": ["concentrated", "value", "asymmetric"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/peter_lynch_agent.json b/python/configs/agent_cards/peter_lynch_agent.json new file mode 100644 index 000000000..c9a70459d --- /dev/null +++ b/python/configs/agent_cards/peter_lynch_agent.json @@ -0,0 +1,18 @@ +{ + "name": "PeterLynchAgent", + "url": "http://localhost:10017/", + "description": "Bottom-up, growth-at-a-reasonable-price (GARP) style stock picking and idea generation. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "peter_lynch_agent", + "name": "Peter Lynch", + "description": "Bottom-up, growth-at-a-reasonable-price (GARP) style stock picking and idea generation.", + "examples": [ + "Spot consumer-facing growth stories with reasonable valuations", + "Which small-cap growth companies show durable revenue expansion?" + ], + "tags": ["GARP", "bottom-up", "growth"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/phil_fisher_agent.json b/python/configs/agent_cards/phil_fisher_agent.json new file mode 100644 index 000000000..fa0eb5153 --- /dev/null +++ b/python/configs/agent_cards/phil_fisher_agent.json @@ -0,0 +1,18 @@ +{ + "name": "PhilFisherAgent", + "url": "http://localhost:10018/", + "description": "Qualitative growth investing focused on management, R&D, and long-term industry positioning. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "phil_fisher_agent", + "name": "Phil Fisher", + "description": "Qualitative growth investing focused on management, R&D, and long-term industry positioning.", + "examples": [ + "Assess a company's management and research capabilities", + "What are the long-term secular growth drivers for Company Y?" + ], + "tags": ["qualitative", "management", "R&D"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/rakesh_jhunjhunwala_agent.json b/python/configs/agent_cards/rakesh_jhunjhunwala_agent.json new file mode 100644 index 000000000..02c66092d --- /dev/null +++ b/python/configs/agent_cards/rakesh_jhunjhunwala_agent.json @@ -0,0 +1,18 @@ +{ + "name": "RakeshJhunjhunwalaAgent", + "url": "http://localhost:10019/", + "description": "Concentrated, conviction-driven investing with an emphasis on high-growth emerging opportunities. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "rakesh_jhunjhunwala_agent", + "name": "Rakesh Jhunjhunwala", + "description": "Concentrated, conviction-driven investing with an emphasis on high-growth emerging opportunities.", + "examples": [ + "Identify high-growth opportunities in emerging markets", + "Which mid-cap names have the potential to scale rapidly?" + ], + "tags": ["emerging markets", "conviction", "growth"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/sentiment_analyst_agent.json b/python/configs/agent_cards/sentiment_analyst_agent.json new file mode 100644 index 000000000..fcff4aeb6 --- /dev/null +++ b/python/configs/agent_cards/sentiment_analyst_agent.json @@ -0,0 +1,18 @@ +{ + "name": "SentimentAnalystAgent", + "url": "http://localhost:10024/", + "description": "Market sentiment and positioning analysis using newsflow, social signals, and positioning data. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "sentiment_analyst_agent", + "name": "Sentiment Analyst", + "description": "Market sentiment and positioning analysis using newsflow, social signals, and positioning data.", + "examples": [ + "Gauge retail sentiment around meme stocks", + "Summarize recent news sentiment for Amazon" + ], + "tags": ["sentiment", "news", "social"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/stanley_druckenmiller_agent.json b/python/configs/agent_cards/stanley_druckenmiller_agent.json new file mode 100644 index 000000000..cd1073a0d --- /dev/null +++ b/python/configs/agent_cards/stanley_druckenmiller_agent.json @@ -0,0 +1,18 @@ +{ + "name": "StanleyDruckenmillerAgent", + "url": "http://localhost:10020/", + "description": "Macro-driven allocation and tactical trading insights combining top-down macro views with security selection. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "stanley_druckenmiller_agent", + "name": "Stanley Druckenmiller", + "description": "Macro-driven allocation and tactical trading insights combining top-down macro views with security selection.", + "examples": [ + "Develop a macro-informed allocation between equities and bonds", + "What macro catalysts are likely to affect tech stocks this quarter?" + ], + "tags": ["macro", "allocation", "tactical"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/technical_analyst_agent.json b/python/configs/agent_cards/technical_analyst_agent.json new file mode 100644 index 000000000..a23db4bf8 --- /dev/null +++ b/python/configs/agent_cards/technical_analyst_agent.json @@ -0,0 +1,18 @@ +{ + "name": "TechnicalAnalystAgent", + "url": "http://localhost:10022/", + "description": "Chart-based technical analysis for entries, exits, trend identification and momentum signals. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "technical_analyst_agent", + "name": "Technical Analyst", + "description": "Chart-based technical analysis for entries, exits, trend identification and momentum signals.", + "examples": [ + "Provide support/resistance levels for AAPL", + "Identify bullish or bearish chart patterns for TSLA" + ], + "tags": ["technical", "charts", "momentum"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/valuation_analyst_agent.json b/python/configs/agent_cards/valuation_analyst_agent.json new file mode 100644 index 000000000..6aa3227eb --- /dev/null +++ b/python/configs/agent_cards/valuation_analyst_agent.json @@ -0,0 +1,18 @@ +{ + "name": "ValuationAnalystAgent", + "url": "http://localhost:10025/", + "description": "Multi-method valuation using DCF, comparables, and precedent transactions to derive price targets. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "valuation_analyst_agent", + "name": "Valuation Analyst", + "description": "Multi-method valuation using DCF, comparables, and precedent transactions to derive price targets.", + "examples": [ + "Produce a 12-month price target using DCF and comps", + "Compare valuation multiples across peers" + ], + "tags": ["valuation", "comparables", "DCF"] + } + ], + "enabled": true +} diff --git a/python/configs/agent_cards/warren_buffett_agent.json b/python/configs/agent_cards/warren_buffett_agent.json new file mode 100644 index 000000000..48eb1bbe4 --- /dev/null +++ b/python/configs/agent_cards/warren_buffett_agent.json @@ -0,0 +1,18 @@ +{ + "name": "WarrenBuffettAgent", + "url": "http://localhost:10021/", + "description": "Long-term value investing with emphasis on durable businesses, simple economics, and shareholder-friendly management. **CAUTION**: Only stock symbols in {AAPL, GOOGL, MSFT, NVDA, TSLA} is/are supported and the agent will refuse to answer for other symbols. The input should contain one or more stock symbol(s) from this list. ", + "skills": [ + { + "id": "warren_buffett_agent", + "name": "Warren Buffett", + "description": "Long-term value investing with emphasis on durable businesses, simple economics, and shareholder-friendly management.", + "examples": [ + "Evaluate a company's long-term competitive advantage and free cash flow generation", + "Which businesses should be held for decades?" + ], + "tags": ["long-term", "value", "moat"] + } + ], + "enabled": true +} From da1ccf35d8c2f1af5985179dc1b6716a107ff53b Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:50:48 +0800 Subject: [PATCH 2/4] refactor: remove selected_analysts from HedgeFundRequest and update AIHedgeFundAgent initialization --- .../ai-hedge-fund/adapter/__main__.py | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/python/third_party/ai-hedge-fund/adapter/__main__.py b/python/third_party/ai-hedge-fund/adapter/__main__.py index cfbb72466..c2dfe82a1 100644 --- a/python/third_party/ai-hedge-fund/adapter/__main__.py +++ b/python/third_party/ai-hedge-fund/adapter/__main__.py @@ -29,10 +29,6 @@ class HedgeFundRequest(BaseModel): ..., description=f"List of stock tickers to analyze. Must be from: {allowed_tickers}. Otherwise, empty.", ) - selected_analysts: List[str] = Field( - default=[], - description=f"List of analysts to use for analysis. If empty, all analysts will be used. Must be from {allowed_analysts}", - ) @field_validator("tickers") @classmethod @@ -46,20 +42,9 @@ def validate_tickers(cls, v): ) return v - @field_validator("selected_analysts") - @classmethod - def validate_analysts(cls, v): - if v: # Only validate if not empty - invalid_analysts = set(v) - allowed_analysts - if invalid_analysts: - raise ValueError( - f"Invalid analysts: {invalid_analysts}. Allowed: {allowed_analysts}" - ) - return v - class AIHedgeFundAgent(BaseAgent): - def __init__(self): + def __init__(self, analyst: str): super().__init__() self.agno_agent = Agent( model=OpenRouter( @@ -68,6 +53,7 @@ def __init__(self): response_model=HedgeFundRequest, markdown=True, ) + self.analyst = analyst async def stream( self, query, session_id, task_id @@ -121,7 +107,7 @@ async def stream( portfolio=portfolio, model_name="openai/gpt-4o-mini", model_provider="OpenRouter", - selected_analysts=hedge_fund_request.selected_analysts, + selected_analysts=self.analyst, ): if not isinstance(chunk, str): continue From e159edd6dd1cd4402c0a81025d81f7b684a40bfb Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Tue, 23 Sep 2025 13:41:10 +0800 Subject: [PATCH 3/4] feat: add CLI argument for selecting analyst in AI Hedge Fund Agent --- .../ai-hedge-fund/adapter/__main__.py | 56 +++++++++++++++++-- .../ai-hedge-fund/launch_adapter.sh | 2 +- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/python/third_party/ai-hedge-fund/adapter/__main__.py b/python/third_party/ai-hedge-fund/adapter/__main__.py index c2dfe82a1..91663ad92 100644 --- a/python/third_party/ai-hedge-fund/adapter/__main__.py +++ b/python/third_party/ai-hedge-fund/adapter/__main__.py @@ -2,7 +2,8 @@ import logging import os from datetime import datetime -from typing import AsyncGenerator, List +from typing import AsyncGenerator, List, Optional +import argparse from agno.agent import Agent from agno.models.openrouter import OpenRouter @@ -44,7 +45,7 @@ def validate_tickers(cls, v): class AIHedgeFundAgent(BaseAgent): - def __init__(self, analyst: str): + def __init__(self, analyst: Optional[List[str]] = None): super().__init__() self.agno_agent = Agent( model=OpenRouter( @@ -100,7 +101,7 @@ async def stream( } logger.info(f"Start analyzing. Task ID: {task_id}, Session ID: {session_id}") - for stream_type, chunk in run_hedge_fund_stream( + for _, chunk in run_hedge_fund_stream( tickers=hedge_fund_request.tickers, start_date=start_date, end_date=end_date, @@ -120,7 +121,7 @@ def run_hedge_fund_stream( start_date: str, end_date: str, portfolio: dict, - selected_analysts: list[str], + selected_analysts: Optional[List[str]], show_reasoning: bool = False, model_name: str = "gpt-4.1", model_provider: str = "OpenAI", @@ -159,5 +160,50 @@ def run_hedge_fund_stream( if __name__ == "__main__": - agent = create_wrapped_agent(AIHedgeFundAgent) + # Parse CLI arguments to determine selected analyst + parser = argparse.ArgumentParser( + description="Serve AI Hedge Fund Agent with an optional selected analyst" + ) + parser.add_argument( + "--analyst", + type=str, + choices=sorted(allowed_analysts), + help=( + "Single analyst key. Allowed: " + + ", ".join(sorted(allowed_analysts)) + + ". If omitted, all analysts are used." + ), + ) + args = parser.parse_args() + + selected: Optional[List[str]] = None + if args.analyst: + selected = [args.analyst.strip()] + + if selected is not None: + invalid = set(selected) - allowed_analysts + if invalid: + allowed_str = ", ".join(sorted(allowed_analysts)) + raise SystemExit( + f"Invalid analyst key(s): {sorted(invalid)}. Allowed: {allowed_str}" + ) + + # Determine agent class to wrap (to match agent card and port) + AgentClass = AIHedgeFundAgent + agent_name_override = None + + def _to_pascal_agent_name(analyst_key: str) -> str: + return "".join(part.capitalize() for part in analyst_key.split("_")) + "Agent" + + if selected and len(selected) == 1: + # Infer agent name from single analyst key + agent_name_override = _to_pascal_agent_name(selected[0]) + + if agent_name_override: + # Dynamically create a subclass with the desired class name so create_wrapped_agent finds the right agent card + AgentClass = type(agent_name_override, (AIHedgeFundAgent,), {}) + + # Create wrapped agent and inject selected analysts before serving + agent = create_wrapped_agent(AgentClass) + agent.analyst = selected # Use None for all analysts asyncio.run(agent.serve()) diff --git a/python/third_party/ai-hedge-fund/launch_adapter.sh b/python/third_party/ai-hedge-fund/launch_adapter.sh index 4c3395bdd..6ad166572 100644 --- a/python/third_party/ai-hedge-fund/launch_adapter.sh +++ b/python/third_party/ai-hedge-fund/launch_adapter.sh @@ -3,4 +3,4 @@ echo "Python Environment Overview:" echo "uv: $(which uv)" echo "python: $(which python)" -python -m adapter +python -m adapter --analyst warren_buffett From 2c599daf538285af3998c6ef2338b624f0cada97 Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Tue, 23 Sep 2025 13:41:21 +0800 Subject: [PATCH 4/4] fix: ensure default values for input modes and version in agent card parsing --- python/valuecell/core/agent/card.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/python/valuecell/core/agent/card.py b/python/valuecell/core/agent/card.py index 38cb296c1..11ead50af 100644 --- a/python/valuecell/core/agent/card.py +++ b/python/valuecell/core/agent/card.py @@ -19,7 +19,12 @@ def parse_local_agent_card_dict(agent_card_dict: dict) -> Optional[AgentCard]: agent_card_dict["capabilities"] = AgentCapabilities( streaming=True, push_notifications=False ).model_dump() - + if "default_input_modes" not in agent_card_dict: + agent_card_dict["default_input_modes"] = [] + if "default_output_modes" not in agent_card_dict: + agent_card_dict["default_output_modes"] = [] + if "version" not in agent_card_dict: + agent_card_dict["version"] = "" agent_card = AgentCard.model_validate(agent_card_dict) return agent_card