diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 03556d0a..e4573f96 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -8,6 +8,7 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; +import { AgentFlowDiagram } from "@/components/AgentFlowDiagram"; export default function HomePage() { return ( @@ -197,6 +198,15 @@ export default function HomePage() { + {/* Agent Flow Diagram Section */} +
+

🔄 分析師協作流程

+

+ 四大分析師代理如何從不同資料來源收集資訊,並產生綜合分析報告 +

+ +
+ {/* LLM Support Section */}

🌍 多模型支援

diff --git a/frontend/components/AgentFlowDiagram.tsx b/frontend/components/AgentFlowDiagram.tsx new file mode 100644 index 00000000..54fd83ae --- /dev/null +++ b/frontend/components/AgentFlowDiagram.tsx @@ -0,0 +1,433 @@ +/** + * Agent Flow Diagram Component + * Visualizes the complete data flow through all 12 agents + */ +"use client"; + +import { Card } from "@/components/ui/card"; +import { + ArrowDown, + Database, + MessageSquare, + Newspaper, + DollarSign, + TrendingUp, + TrendingDown, + Shield, + ShieldAlert, + ShieldCheck, + Users, + Target, + BarChart3 +} from "lucide-react"; + +export function AgentFlowDiagram() { + return ( +
+ {/* Data Sources Layer */} +
+

+ 📥 第一層:資料來源 +

+
+ } + name="yfinance" + description="股價數據" + color="blue" + /> + } + name="Reddit API" + description="社群情緒" + color="orange" + /> + } + name="RSS Feed" + description="新聞資訊" + color="green" + /> + } + name="Alpha Vantage" + description="財務數據" + color="purple" + /> +
+
+ + {/* Arrow */} + + + {/* Analysts Layer - 4 agents */} +
+

+ 🤖 第二層:分析師代理 (4位) +

+
+ } + gradient="from-blue-500 to-cyan-500" + description="技術面分析" + tasks={["RSI 指標", "MACD 動能", "價格走勢"]} + /> + } + gradient="from-orange-500 to-red-500" + description="情緒面分析" + tasks={["NLP 情緒", "討論熱度", "投資者信心"]} + /> + } + gradient="from-green-500 to-emerald-500" + description="新聞面分析" + tasks={["新聞摘要", "事件評估", "影響預測"]} + /> + } + gradient="from-purple-500 to-pink-500" + description="基本面分析" + tasks={["財報分析", "估值指標", "盈利評估"]} + /> +
+
+ + {/* Arrow */} + + + {/* Researchers Layer - 2 agents */} +
+

+ 🔍 第三層:研究員代理 (2位) +

+
+ } + gradient="from-green-500 to-emerald-500" + description="看多觀點研究" + tasks={["正面因素分析", "成長機會評估", "買入理由整理"]} + /> + } + gradient="from-red-500 to-rose-500" + description="看空觀點研究" + tasks={["負面因素分析", "風險評估", "賣出理由整理"]} + /> +
+
+ + {/* Arrow */} + + + {/* Research Manager */} +
+ } + gradient="from-indigo-500 to-purple-500" + description="整合多空研究觀點" + tasks={["平衡雙方論點", "綜合投資建議", "制定初步策略"]} + /> +
+ + {/* Arrow */} + + + {/* Risk Debators Layer - 3 agents */} +
+

+ ⚖️ 第四層:風險辯論者 (3位) +

+
+ } + gradient="from-red-500 to-orange-500" + description="高風險高報酬" + tasks={["積極投資策略", "最大化收益", "承擔計算風險"]} + /> + } + gradient="from-blue-500 to-indigo-500" + description="平衡風險報酬" + tasks={["穩健投資策略", "風險平衡", "理性決策"]} + /> + } + gradient="from-green-500 to-teal-500" + description="低風險低波動" + tasks={["保守投資策略", "資本保護", "降低風險"]} + /> +
+
+ + {/* Arrow */} + + + {/* Risk Manager */} +
+ } + gradient="from-red-500 to-pink-500" + description="整合風險辯論結果" + tasks={["風險等級評定", "止損止盈設定", "最終風險控制"]} + /> +
+ + {/* Arrow */} + + + {/* Trader */} +
+ } + gradient="from-blue-600 via-purple-600 to-pink-600" + description="執行最終交易決策" + outputs={["交易訊號 (BUY/SELL/HOLD)", "目標價位", "交易數量", "風險參數"]} + /> +
+ + {/* Final Arrow */} + + + {/* Output Layer */} +
+

+ 📊 最終輸出:12 份詳細報告 +

+ +
+
+ +
+

完整分析報告集合

+

+ 整合 12 位專業代理的深度分析,提供全方位投資決策支援 +

+
+ +
+ + + +
+
+
+
+ ); +} + +function DataSourceCard({ + icon, + name, + description, + color, +}: { + icon: React.ReactNode; + name: string; + description: string; + color: "blue" | "orange" | "green" | "purple"; +}) { + const colorClasses = { + blue: "from-blue-500 to-cyan-500 border-blue-300 dark:border-blue-700", + orange: "from-orange-500 to-red-500 border-orange-300 dark:border-orange-700", + green: "from-green-500 to-emerald-500 border-green-300 dark:border-green-700", + purple: "from-purple-500 to-pink-500 border-purple-300 dark:border-purple-700", + }; + + return ( + +
+ {icon} +
+

{name}

+

{description}

+
+ ); +} + +function AgentCard({ + name, + icon, + gradient, + description, + tasks, +}: { + name: string; + icon: React.ReactNode; + gradient: string; + description: string; + tasks: string[]; +}) { + return ( + +
+ +
+
+
+ {icon} +
+

{name}

+

{description}

+
+ +
+ {tasks.map((task, index) => ( +
+ + {task} +
+ ))} +
+
+ + ); +} + +function ManagerCard({ + name, + icon, + gradient, + description, + tasks, +}: { + name: string; + icon: React.ReactNode; + gradient: string; + description: string; + tasks: string[]; +}) { + return ( + +
+
+ {icon} +
+

{name}

+

{description}

+
+ +
+ {tasks.map((task, index) => ( +
+ + {task} +
+ ))} +
+
+ ); +} + +function TraderCard({ + name, + icon, + gradient, + description, + outputs, +}: { + name: string; + icon: React.ReactNode; + gradient: string; + description: string; + outputs: string[]; +}) { + return ( + +
+ +
+
+
+ {icon} +
+

{name}

+

{description}

+
+ +
+
最終輸出:
+ {outputs.map((output, index) => ( +
+ + {output} +
+ ))} +
+
+ + ); +} + +function FlowArrow({ label, color }: { label: string; color: string }) { + const colorClasses = { + blue: "text-blue-500 dark:text-blue-400", + purple: "text-purple-500 dark:text-purple-400", + green: "text-green-500 dark:text-green-400", + orange: "text-orange-500 dark:text-orange-400", + red: "text-red-500 dark:text-red-400", + }; + + return ( +
+
+
{label}
+ +
+
+ ); +} + +function ReportSection({ + title, + items, + color, +}: { + title: string; + items: string[]; + color: "blue" | "green" | "red"; +}) { + const colorClasses = { + blue: "bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800", + green: "bg-green-50 dark:bg-green-950/30 border-green-200 dark:border-green-800", + red: "bg-red-50 dark:bg-red-950/30 border-red-200 dark:border-red-800", + }; + + return ( +
+
{title}
+
+ {items.map((item, index) => ( +
+ + {item} +
+ ))} +
+
+ ); +}