16
README.md
|
|
@ -42,6 +42,21 @@
|
|||
|
||||
TradingAgentsX 支援業界領先的多家 LLM 提供商,並為每個模型配置**獨立的 API Key 和 Base URL**,實現最大靈活性。
|
||||
|
||||
<div align="center">
|
||||
|
||||
### 支援的 LLM 提供商
|
||||
|
||||
<p>
|
||||
<img src="llm_logo/openai.svg" alt="OpenAI" height="50" style="margin: 10px;"/>
|
||||
<img src="llm_logo/claude-color.svg" alt="Anthropic Claude" height="50" style="margin: 10px;"/>
|
||||
<img src="llm_logo/gemini-color.svg" alt="Google Gemini" height="50" style="margin: 10px;"/>
|
||||
<img src="llm_logo/grok.svg" alt="xAI Grok" height="50" style="margin: 10px;"/>
|
||||
<img src="llm_logo/deepseek-color.svg" alt="DeepSeek" height="50" style="margin: 10px;"/>
|
||||
<img src="llm_logo/qwen-color.svg" alt="Alibaba Qwen" height="50" style="margin: 10px;"/>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
### 📋 支援的 LLM 提供商矩陣
|
||||
|
||||
| 提供商 | 支援模型 | Base URL | 是否支援自訂端點 |
|
||||
|
|
@ -54,6 +69,7 @@ TradingAgentsX 支援業界領先的多家 LLM 提供商,並為每個模型配
|
|||
| **Qwen (Alibaba)** | Qwen3-Max, Qwen-Plus, Qwen Flash | `https://dashscope-intl.aliyuncs.com/compatible-mode/v1` | ✅ 是 |
|
||||
| **自訂端點** | 上述列表中的模型 | 使用者自訂 | ✅ 完全支援 |
|
||||
|
||||
|
||||
### 🔧 三層獨立配置
|
||||
|
||||
系統支援**三個獨立的 LLM 配置點**,每個都可使用不同的提供商和 API Key:
|
||||
|
|
|
|||
206
clean_cache.sh
|
|
@ -1,14 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
# ========================================
|
||||
# 清理開發與構建緩存腳本
|
||||
# 此腳本會清理 pnpm 和開發過程中產生的緩存文件
|
||||
# 不會影響項目的源代碼和依賴包
|
||||
# 清理所有緩存腳本(全域版本)
|
||||
# 此腳本會清理整個專案中所有類型的緩存文件
|
||||
# 不限定特定目錄,徹底清理所有緩存
|
||||
# ========================================
|
||||
|
||||
set -e # 遇到錯誤立即停止
|
||||
|
||||
echo "🧹 開始清理緩存..."
|
||||
echo "🧹 開始全域清理所有緩存..."
|
||||
echo "================================"
|
||||
|
||||
# 記錄腳本執行位置
|
||||
|
|
@ -16,121 +16,217 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||
cd "$SCRIPT_DIR"
|
||||
|
||||
# ========================================
|
||||
# 前端緩存清理
|
||||
# Next.js / React 緩存清理
|
||||
# ========================================
|
||||
echo ""
|
||||
echo "📦 清理前端緩存..."
|
||||
echo "⚛️ 清理 Next.js / React 緩存..."
|
||||
|
||||
if [ -d "frontend/.next" ]; then
|
||||
echo " ✓ 刪除 frontend/.next (Next.js 構建輸出)"
|
||||
rm -rf frontend/.next
|
||||
# 清理 .next 目錄(整個專案)
|
||||
NEXT_COUNT=$(find . -type d -name ".next" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$NEXT_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $NEXT_COUNT 個 .next 目錄"
|
||||
find . -type d -name ".next" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - frontend/.next 不存在,跳過"
|
||||
echo " - 沒有 .next 目錄,跳過"
|
||||
fi
|
||||
|
||||
if [ -d "frontend/.turbo" ]; then
|
||||
echo " ✓ 刪除 frontend/.turbo (Turbopack 緩存)"
|
||||
rm -rf frontend/.turbo
|
||||
# 清理 .turbo 目錄
|
||||
TURBO_COUNT=$(find . -type d -name ".turbo" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$TURBO_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $TURBO_COUNT 個 .turbo 目錄"
|
||||
find . -type d -name ".turbo" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - frontend/.turbo 不存在,跳過"
|
||||
echo " - 沒有 .turbo 目錄,跳過"
|
||||
fi
|
||||
|
||||
if [ -d "frontend/out" ]; then
|
||||
echo " ✓ 刪除 frontend/out (靜態導出輸出)"
|
||||
rm -rf frontend/out
|
||||
# 清理 out 目錄
|
||||
OUT_COUNT=$(find . -type d -name "out" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$OUT_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $OUT_COUNT 個 out 目錄"
|
||||
find . -type d -name "out" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - frontend/out 不存在,跳過"
|
||||
echo " - 沒有 out 目錄,跳過"
|
||||
fi
|
||||
|
||||
# 清理 TypeScript 增量編譯緩存
|
||||
if [ -f "frontend/tsconfig.tsbuildinfo" ]; then
|
||||
echo " ✓ 刪除 frontend/tsconfig.tsbuildinfo (TS 增量緩存)"
|
||||
rm -f frontend/tsconfig.tsbuildinfo
|
||||
# 清理 build 目錄
|
||||
BUILD_COUNT=$(find . -type d -name "build" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$BUILD_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $BUILD_COUNT 個 build 目錄"
|
||||
find . -type d -name "build" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - TypeScript 緩存不存在,跳過"
|
||||
echo " - 沒有 build 目錄,跳過"
|
||||
fi
|
||||
|
||||
# 清理 dist 目錄
|
||||
DIST_COUNT=$(find . -type d -name "dist" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$DIST_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $DIST_COUNT 個 dist 目錄"
|
||||
find . -type d -name "dist" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 dist 目錄,跳過"
|
||||
fi
|
||||
|
||||
# ========================================
|
||||
# 後端緩存清理
|
||||
# TypeScript 緩存清理
|
||||
# ========================================
|
||||
echo ""
|
||||
echo "🐍 清理後端緩存..."
|
||||
echo "📘 清理 TypeScript 緩存..."
|
||||
|
||||
# 清理 Python 緩存
|
||||
PYCACHE_COUNT=$(find backend -type d -name "__pycache__" 2>/dev/null | wc -l | tr -d ' ')
|
||||
# 清理 tsconfig.tsbuildinfo
|
||||
TSBUILDINFO_COUNT=$(find . -name "tsconfig.tsbuildinfo" -o -name "*.tsbuildinfo" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$TSBUILDINFO_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $TSBUILDINFO_COUNT 個 TypeScript 緩存文件"
|
||||
find . \( -name "tsconfig.tsbuildinfo" -o -name "*.tsbuildinfo" \) -delete 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 TypeScript 緩存,跳過"
|
||||
fi
|
||||
|
||||
# ========================================
|
||||
# Python 緩存清理
|
||||
# ========================================
|
||||
echo ""
|
||||
echo "🐍 清理 Python 緩存..."
|
||||
|
||||
# 清理 __pycache__
|
||||
PYCACHE_COUNT=$(find . -type d -name "__pycache__" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$PYCACHE_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $PYCACHE_COUNT 個 __pycache__ 目錄"
|
||||
find backend -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
|
||||
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 __pycache__ 目錄,跳過"
|
||||
fi
|
||||
|
||||
# 清理 .pyc 文件
|
||||
PYC_COUNT=$(find backend -type f -name "*.pyc" 2>/dev/null | wc -l | tr -d ' ')
|
||||
PYC_COUNT=$(find . -type f -name "*.pyc" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$PYC_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $PYC_COUNT 個 .pyc 文件"
|
||||
find backend -type f -name "*.pyc" -delete 2>/dev/null || true
|
||||
find . -type f -name "*.pyc" -delete 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 .pyc 文件,跳過"
|
||||
fi
|
||||
|
||||
# 清理 .pyo 文件
|
||||
PYO_COUNT=$(find backend -type f -name "*.pyo" 2>/dev/null | wc -l | tr -d ' ')
|
||||
PYO_COUNT=$(find . -type f -name "*.pyo" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$PYO_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $PYO_COUNT 個 .pyo 文件"
|
||||
find backend -type f -name "*.pyo" -delete 2>/dev/null || true
|
||||
find . -type f -name "*.pyo" -delete 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 .pyo 文件,跳過"
|
||||
fi
|
||||
|
||||
# 清理 pytest 緩存
|
||||
if [ -d "backend/.pytest_cache" ]; then
|
||||
echo " ✓ 刪除 backend/.pytest_cache (Pytest 緩存)"
|
||||
rm -rf backend/.pytest_cache
|
||||
# 清理 .pytest_cache
|
||||
PYTEST_COUNT=$(find . -type d -name ".pytest_cache" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$PYTEST_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $PYTEST_COUNT 個 .pytest_cache 目錄"
|
||||
find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - Pytest 緩存不存在,跳過"
|
||||
echo " - 沒有 .pytest_cache 目錄,跳過"
|
||||
fi
|
||||
|
||||
# 清理 *.egg-info
|
||||
EGGINFO_COUNT=$(find . -type d -name "*.egg-info" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$EGGINFO_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $EGGINFO_COUNT 個 .egg-info 目錄"
|
||||
find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 .egg-info 目錄,跳過"
|
||||
fi
|
||||
|
||||
# ========================================
|
||||
# 通用緩存清理
|
||||
# 通用緩存目錄清理
|
||||
# ========================================
|
||||
echo ""
|
||||
echo "🔧 清理通用緩存..."
|
||||
echo "📦 清理通用緩存目錄..."
|
||||
|
||||
# 清理 macOS 系統文件
|
||||
# 清理 .cache 目錄
|
||||
CACHE_COUNT=$(find . -type d -name ".cache" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$CACHE_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $CACHE_COUNT 個 .cache 目錄"
|
||||
find . -type d -name ".cache" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 .cache 目錄,跳過"
|
||||
fi
|
||||
|
||||
# 清理 .parcel-cache
|
||||
PARCEL_COUNT=$(find . -type d -name ".parcel-cache" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$PARCEL_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $PARCEL_COUNT 個 .parcel-cache 目錄"
|
||||
find . -type d -name ".parcel-cache" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 .parcel-cache 目錄,跳過"
|
||||
fi
|
||||
|
||||
# 清理 .vite 目錄
|
||||
VITE_COUNT=$(find . -type d -name ".vite" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$VITE_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $VITE_COUNT 個 .vite 目錄"
|
||||
find . -type d -name ".vite" -exec rm -rf {} + 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 .vite 目錄,跳過"
|
||||
fi
|
||||
|
||||
# ========================================
|
||||
# 系統緩存清理
|
||||
# ========================================
|
||||
echo ""
|
||||
echo "🔧 清理系統緩存..."
|
||||
|
||||
# 清理 .DS_Store (macOS)
|
||||
DS_STORE_COUNT=$(find . -name ".DS_Store" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$DS_STORE_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $DS_STORE_COUNT 個 .DS_Store 文件 (macOS 緩存)"
|
||||
echo " ✓ 刪除 $DS_STORE_COUNT 個 .DS_Store 文件"
|
||||
find . -name ".DS_Store" -delete 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 .DS_Store 文件,跳過"
|
||||
fi
|
||||
|
||||
# 清理日誌文件
|
||||
if [ -f "npm-debug.log" ]; then
|
||||
echo " ✓ 刪除 npm-debug.log"
|
||||
rm -f npm-debug.log
|
||||
fi
|
||||
|
||||
if [ -f "yarn-error.log" ]; then
|
||||
echo " ✓ 刪除 yarn-error.log"
|
||||
rm -f yarn-error.log
|
||||
# 清理 Thumbs.db (Windows)
|
||||
THUMBS_COUNT=$(find . -name "Thumbs.db" 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$THUMBS_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $THUMBS_COUNT 個 Thumbs.db 文件"
|
||||
find . -name "Thumbs.db" -delete 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有 Thumbs.db 文件,跳過"
|
||||
fi
|
||||
|
||||
# ========================================
|
||||
# 計算清理的空間
|
||||
# 日誌文件清理
|
||||
# ========================================
|
||||
echo ""
|
||||
echo "📝 清理日誌文件..."
|
||||
|
||||
# 清理 npm/yarn 日誌
|
||||
LOG_COUNT=$(find . \( -name "npm-debug.log" -o -name "yarn-error.log" -o -name "yarn-debug.log" -o -name "pnpm-debug.log" \) 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$LOG_COUNT" -gt 0 ]; then
|
||||
echo " ✓ 刪除 $LOG_COUNT 個日誌文件"
|
||||
find . \( -name "npm-debug.log" -o -name "yarn-error.log" -o -name "yarn-debug.log" -o -name "pnpm-debug.log" \) -delete 2>/dev/null || true
|
||||
else
|
||||
echo " - 沒有日誌文件,跳過"
|
||||
fi
|
||||
|
||||
# ========================================
|
||||
# 完成
|
||||
# ========================================
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo "✅ 清理完成!"
|
||||
echo "✅ 全域緩存清理完成!"
|
||||
echo ""
|
||||
echo "📋 保留的重要文件:"
|
||||
echo "📋 保留的重要文件/目錄:"
|
||||
echo " ✓ node_modules (依賴包)"
|
||||
echo " ✓ pnpm-lock.yaml (鎖定文件)"
|
||||
echo " ✓ pnpm-lock.yaml / package-lock.json (鎖定文件)"
|
||||
echo " ✓ package.json (包配置)"
|
||||
echo " ✓ .git (版本控制)"
|
||||
echo " ✓ 所有源代碼文件"
|
||||
echo ""
|
||||
echo "<22>️ 已清理的緩存類型:"
|
||||
echo " • Next.js/React: .next, .turbo, out, build, dist"
|
||||
echo " • TypeScript: *.tsbuildinfo"
|
||||
echo " • Python: __pycache__, *.pyc, *.pyo, .pytest_cache, *.egg-info"
|
||||
echo " • 通用緩存: .cache, .parcel-cache, .vite"
|
||||
echo " • 系統文件: .DS_Store, Thumbs.db"
|
||||
echo " • 日誌文件: npm-debug.log, yarn-error.log 等"
|
||||
echo ""
|
||||
echo "💡 提示:"
|
||||
echo " - 下次運行 'pnpm dev' 時,緩存會自動重新生成"
|
||||
echo " - 下次運行開發服務器時,緩存會自動重新生成"
|
||||
echo " - 如果需要重新安裝依賴,請運行 'pnpm install'"
|
||||
echo ""
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ export default function AnalysisResultsPage() {
|
|||
<div className="container mx-auto px-4 py-12">
|
||||
<div className="max-w-7xl mx-auto space-y-8">
|
||||
{/* Header */}
|
||||
<div className="flex flex-col md:flex-row md:justify-between md:items-center gap-4">
|
||||
<div className="flex flex-col md:flex-row md:justify-between md:items-center gap-4 animate-fade-in">
|
||||
<div>
|
||||
<h1 className="text-4xl font-bold mb-2">
|
||||
{analysisResult.ticker} 詳細分析結果
|
||||
|
|
@ -144,7 +144,7 @@ export default function AnalysisResultsPage() {
|
|||
<Button
|
||||
variant="outline"
|
||||
onClick={() => router.push("/analysis")}
|
||||
className="gap-2"
|
||||
className="gap-2 hover-lift"
|
||||
>
|
||||
<ChevronLeft className="h-4 w-4" />
|
||||
返回分析
|
||||
|
|
@ -152,13 +152,13 @@ export default function AnalysisResultsPage() {
|
|||
</div>
|
||||
|
||||
{/* 分析師選擇 Tabs */}
|
||||
<Tabs value={selectedAnalyst} onValueChange={setSelectedAnalyst} className="w-full">
|
||||
<Tabs value={selectedAnalyst} onValueChange={setSelectedAnalyst} className="w-full animate-slide-up animate-delay-200">
|
||||
<TabsList className="grid w-full grid-cols-2 md:grid-cols-3 lg:grid-cols-4 h-auto gap-2">
|
||||
{ANALYSTS.map(analyst => (
|
||||
<TabsTrigger
|
||||
key={analyst.key}
|
||||
value={analyst.key}
|
||||
className="text-sm md:text-base py-2"
|
||||
className="text-sm md:text-base py-2 transition-all duration-300 hover:scale-105"
|
||||
>
|
||||
{analyst.label}
|
||||
</TabsTrigger>
|
||||
|
|
@ -178,7 +178,7 @@ export default function AnalysisResultsPage() {
|
|||
)}
|
||||
|
||||
{/* 分析師報告 */}
|
||||
<Card>
|
||||
<Card className="animate-scale-up hover-lift">
|
||||
<CardHeader>
|
||||
<CardTitle>{analyst.label} 報告</CardTitle>
|
||||
<CardDescription>
|
||||
|
|
@ -187,7 +187,7 @@ export default function AnalysisResultsPage() {
|
|||
</CardHeader>
|
||||
<CardContent>
|
||||
{currentReport ? (
|
||||
<div className="prose prose-sm max-w-none dark:prose-invert">
|
||||
<div className="prose prose-sm max-w-none dark:prose-invert animate-fade-in">
|
||||
<ReactMarkdown remarkPlugins={[remarkGfm]}>
|
||||
{currentReport}
|
||||
</ReactMarkdown>
|
||||
|
|
|
|||
|
|
@ -120,3 +120,135 @@
|
|||
@apply bg-background text-foreground;
|
||||
}
|
||||
}
|
||||
|
||||
/* Custom animations */
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideInLeft {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(-30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideInRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes scaleUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: scale(0.95);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes shimmer {
|
||||
0% {
|
||||
background-position: -200% center;
|
||||
}
|
||||
100% {
|
||||
background-position: 200% center;
|
||||
}
|
||||
}
|
||||
|
||||
/* Animation utility classes */
|
||||
.animate-fade-in {
|
||||
animation: fadeIn 0.6s ease-out;
|
||||
}
|
||||
|
||||
.animate-slide-up {
|
||||
animation: slideUp 0.6s ease-out;
|
||||
}
|
||||
|
||||
.animate-slide-in-left {
|
||||
animation: slideInLeft 0.6s ease-out;
|
||||
}
|
||||
|
||||
.animate-slide-in-right {
|
||||
animation: slideInRight 0.6s ease-out;
|
||||
}
|
||||
|
||||
.animate-scale-up {
|
||||
animation: scaleUp 0.5s ease-out;
|
||||
}
|
||||
|
||||
/* Stagger delays for sequential animations */
|
||||
.animate-delay-100 {
|
||||
animation-delay: 0.1s;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
.animate-delay-200 {
|
||||
animation-delay: 0.2s;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
.animate-delay-300 {
|
||||
animation-delay: 0.3s;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
.animate-delay-400 {
|
||||
animation-delay: 0.4s;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
.animate-delay-500 {
|
||||
animation-delay: 0.5s;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
.animate-delay-600 {
|
||||
animation-delay: 0.6s;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
/* Enhanced hover effects */
|
||||
.hover-lift {
|
||||
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||||
}
|
||||
|
||||
.hover-lift:hover {
|
||||
transform: translateY(-8px);
|
||||
box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1),
|
||||
0 8px 10px -6px rgb(0 0 0 / 0.1);
|
||||
}
|
||||
|
||||
/* Gradient shimmer effect */
|
||||
.gradient-shimmer {
|
||||
background-size: 200% auto;
|
||||
animation: shimmer 3s linear infinite;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import Link from "next/link";
|
||||
import Image from "next/image";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import {
|
||||
Card,
|
||||
|
|
@ -12,7 +13,7 @@ export default function HomePage() {
|
|||
return (
|
||||
<div className="container mx-auto px-4 py-12">
|
||||
{/* Hero Section */}
|
||||
<div className="text-center mb-16">
|
||||
<div className="text-center mb-16 animate-fade-in">
|
||||
<h1 className="text-5xl font-bold mb-4 bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
|
||||
TradingAgentsX
|
||||
</h1>
|
||||
|
|
@ -28,20 +29,11 @@ export default function HomePage() {
|
|||
開始分析
|
||||
</Button>
|
||||
</Link>
|
||||
<a
|
||||
href="https://github.com/MarkLo127/TradingAgentsX"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<Button size="lg" variant="outline">
|
||||
前往 GitHub
|
||||
</Button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Core Features Section */}
|
||||
<div className="mb-16">
|
||||
<div className="mb-16 animate-slide-up animate-delay-200">
|
||||
<h2 className="text-3xl font-bold text-center mb-4">🎯 核心特色</h2>
|
||||
<p className="text-center text-gray-600 dark:text-gray-400 mb-8 max-w-3xl mx-auto">
|
||||
基於 LangGraph 的智能股票交易分析平台,結合多個 AI 代理進行協作決策
|
||||
|
|
@ -360,7 +352,7 @@ function FeatureCard({
|
|||
icon: string;
|
||||
}) {
|
||||
return (
|
||||
<Card className="hover:shadow-lg transition-shadow">
|
||||
<Card className="hover-lift animate-slide-up">
|
||||
<CardHeader>
|
||||
<div className="text-4xl mb-2">{icon}</div>
|
||||
<CardTitle className="text-lg">{title}</CardTitle>
|
||||
|
|
@ -384,7 +376,7 @@ function AgentCard({
|
|||
responsibilities: string[];
|
||||
}) {
|
||||
return (
|
||||
<Card className="hover:shadow-lg transition-shadow">
|
||||
<Card className="hover-lift animate-scale-up">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-base">{name}</CardTitle>
|
||||
<CardDescription className="text-xs">{role}</CardDescription>
|
||||
|
|
@ -412,11 +404,35 @@ function LLMProviderCard({
|
|||
models: string[];
|
||||
icon: string;
|
||||
}) {
|
||||
// Map provider names to logo filenames
|
||||
const logoMap: Record<string, string> = {
|
||||
"OpenAI": "/logos/openai.svg",
|
||||
"Anthropic": "/logos/claude-color.svg",
|
||||
"Google Gemini": "/logos/gemini-color.svg",
|
||||
"Grok (xAI)": "/logos/grok.svg",
|
||||
"DeepSeek": "/logos/deepseek-color.svg",
|
||||
"Qwen (Alibaba)": "/logos/qwen-color.svg",
|
||||
};
|
||||
|
||||
const logoSrc = logoMap[name];
|
||||
|
||||
return (
|
||||
<Card className="hover:shadow-lg transition-shadow">
|
||||
<Card className="hover-lift animate-slide-up animate-delay-100">
|
||||
<CardHeader>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="text-2xl">{icon}</span>
|
||||
<div className="flex items-center gap-3">
|
||||
{logoSrc ? (
|
||||
<div className="relative w-8 h-8 flex-shrink-0 transition-transform duration-300 hover:scale-110">
|
||||
<Image
|
||||
src={logoSrc}
|
||||
alt={`${name} logo`}
|
||||
width={32}
|
||||
height={32}
|
||||
className="object-contain"
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<span className="text-2xl">{icon}</span>
|
||||
)}
|
||||
<CardTitle className="text-lg">{name}</CardTitle>
|
||||
</div>
|
||||
</CardHeader>
|
||||
|
|
@ -442,7 +458,7 @@ function TechnicalCard({
|
|||
features: string[];
|
||||
}) {
|
||||
return (
|
||||
<Card className="hover:shadow-lg transition-shadow">
|
||||
<Card className="hover-lift animate-slide-up animate-delay-300">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-lg">{title}</CardTitle>
|
||||
</CardHeader>
|
||||
|
|
|
|||
|
|
@ -5,35 +5,9 @@ export function Footer() {
|
|||
return (
|
||||
<footer className="border-t bg-gray-50 dark:bg-gray-900">
|
||||
<div className="container mx-auto px-4 py-6">
|
||||
<div className="flex flex-col md:flex-row items-center justify-between gap-4">
|
||||
<div className="flex items-center justify-center">
|
||||
<div className="text-sm text-gray-600 dark:text-gray-400">
|
||||
© 2025 TradingAgentsX. 技術支援:{" "}
|
||||
<a
|
||||
href="https://github.com/MarkLo127/TradingAgentsX"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-blue-600 hover:underline"
|
||||
>
|
||||
TradingAgentsX
|
||||
</a>
|
||||
</div>
|
||||
<div className="flex gap-4 text-sm">
|
||||
<a
|
||||
href="https://github.com/MarkLo127/TradingAgentsX"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-gray-600 hover:text-blue-600 dark:text-gray-400 dark:hover:text-blue-400"
|
||||
>
|
||||
GitHub
|
||||
</a>
|
||||
<a
|
||||
href="https://arxiv.org/pdf/2412.20138"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-gray-600 hover:text-blue-600 dark:text-gray-400 dark:hover:text-blue-400"
|
||||
>
|
||||
論文
|
||||
</a>
|
||||
© 2025 TradingAgentsX. All rights reserved.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Claude</title><path d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z" fill="#D97757" fill-rule="nonzero"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>DeepSeek</title><path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z" fill="#4D6BFE"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Gemini</title><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="#3186FF"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-0)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-1)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-2)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-0" x1="7" x2="11" y1="15.5" y2="12"><stop stop-color="#08B962"></stop><stop offset="1" stop-color="#08B962" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-1" x1="8" x2="11.5" y1="5.5" y2="11"><stop stop-color="#F94543"></stop><stop offset="1" stop-color="#F94543" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-2" x1="3.5" x2="17.5" y1="13.5" y2="12"><stop stop-color="#FABC12"></stop><stop offset=".46" stop-color="#FABC12" stop-opacity="0"></stop></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Grok</title><path d="M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815"></path></svg>
|
||||
|
After Width: | Height: | Size: 756 B |
|
|
@ -0,0 +1 @@
|
|||
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>OpenAI</title><path d="M21.55 10.004a5.416 5.416 0 00-.478-4.501c-1.217-2.09-3.662-3.166-6.05-2.66A5.59 5.59 0 0010.831 1C8.39.995 6.224 2.546 5.473 4.838A5.553 5.553 0 001.76 7.496a5.487 5.487 0 00.691 6.5 5.416 5.416 0 00.477 4.502c1.217 2.09 3.662 3.165 6.05 2.66A5.586 5.586 0 0013.168 23c2.443.006 4.61-1.546 5.361-3.84a5.553 5.553 0 003.715-2.66 5.488 5.488 0 00-.693-6.497v.001zm-8.381 11.558a4.199 4.199 0 01-2.675-.954c.034-.018.093-.05.132-.074l4.44-2.53a.71.71 0 00.364-.623v-6.176l1.877 1.069c.02.01.033.029.036.05v5.115c-.003 2.274-1.87 4.118-4.174 4.123zM4.192 17.78a4.059 4.059 0 01-.498-2.763c.032.02.09.055.131.078l4.44 2.53c.225.13.504.13.73 0l5.42-3.088v2.138a.068.068 0 01-.027.057L9.9 19.288c-1.999 1.136-4.552.46-5.707-1.51h-.001zM3.023 8.216A4.15 4.15 0 015.198 6.41l-.002.151v5.06a.711.711 0 00.364.624l5.42 3.087-1.876 1.07a.067.067 0 01-.063.005l-4.489-2.559c-1.995-1.14-2.679-3.658-1.53-5.63h.001zm15.417 3.54l-5.42-3.088L14.896 7.6a.067.067 0 01.063-.006l4.489 2.557c1.998 1.14 2.683 3.662 1.529 5.633a4.163 4.163 0 01-2.174 1.807V12.38a.71.71 0 00-.363-.623zm1.867-2.773a6.04 6.04 0 00-.132-.078l-4.44-2.53a.731.731 0 00-.729 0l-5.42 3.088V7.325a.068.068 0 01.027-.057L14.1 4.713c2-1.137 4.555-.46 5.707 1.513.487.833.664 1.809.499 2.757h.001zm-11.741 3.81l-1.877-1.068a.065.065 0 01-.036-.051V6.559c.001-2.277 1.873-4.122 4.181-4.12.976 0 1.92.338 2.671.954-.034.018-.092.05-.131.073l-4.44 2.53a.71.71 0 00-.365.623l-.003 6.173v.002zm1.02-2.168L12 9.25l2.414 1.375v2.75L12 14.75l-2.415-1.375v-2.75z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Qwen</title><path d="M12.604 1.34c.393.69.784 1.382 1.174 2.075a.18.18 0 00.157.091h5.552c.174 0 .322.11.446.327l1.454 2.57c.19.337.24.478.024.837-.26.43-.513.864-.76 1.3l-.367.658c-.106.196-.223.28-.04.512l2.652 4.637c.172.301.111.494-.043.77-.437.785-.882 1.564-1.335 2.34-.159.272-.352.375-.68.37-.777-.016-1.552-.01-2.327.016a.099.099 0 00-.081.05 575.097 575.097 0 01-2.705 4.74c-.169.293-.38.363-.725.364-.997.003-2.002.004-3.017.002a.537.537 0 01-.465-.271l-1.335-2.323a.09.09 0 00-.083-.049H4.982c-.285.03-.553-.001-.805-.092l-1.603-2.77a.543.543 0 01-.002-.54l1.207-2.12a.198.198 0 000-.197 550.951 550.951 0 01-1.875-3.272l-.79-1.395c-.16-.31-.173-.496.095-.965.465-.813.927-1.625 1.387-2.436.132-.234.304-.334.584-.335a338.3 338.3 0 012.589-.001.124.124 0 00.107-.063l2.806-4.895a.488.488 0 01.422-.246c.524-.001 1.053 0 1.583-.006L11.704 1c.341-.003.724.032.9.34zm-3.432.403a.06.06 0 00-.052.03L6.254 6.788a.157.157 0 01-.135.078H3.253c-.056 0-.07.025-.041.074l5.81 10.156c.025.042.013.062-.034.063l-2.795.015a.218.218 0 00-.2.116l-1.32 2.31c-.044.078-.021.118.068.118l5.716.008c.046 0 .08.02.104.061l1.403 2.454c.046.081.092.082.139 0l5.006-8.76.783-1.382a.055.055 0 01.096 0l1.424 2.53a.122.122 0 00.107.062l2.763-.02a.04.04 0 00.035-.02.041.041 0 000-.04l-2.9-5.086a.108.108 0 010-.113l.293-.507 1.12-1.977c.024-.041.012-.062-.035-.062H9.2c-.059 0-.073-.026-.043-.077l1.434-2.505a.107.107 0 000-.114L9.225 1.774a.06.06 0 00-.053-.031zm6.29 8.02c.046 0 .058.02.034.06l-.832 1.465-2.613 4.585a.056.056 0 01-.05.029.058.058 0 01-.05-.029L8.498 9.841c-.02-.034-.01-.052.028-.054l.216-.012 6.722-.012z" fill="url(#lobe-icons-qwen-fill)" fill-rule="nonzero"></path><defs><linearGradient id="lobe-icons-qwen-fill" x1="0%" x2="100%" y1="0%" y2="0%"><stop offset="0%" stop-color="#6336E7" stop-opacity=".84"></stop><stop offset="100%" stop-color="#6F69F7" stop-opacity=".84"></stop></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Claude</title><path d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z" fill="#D97757" fill-rule="nonzero"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>DeepSeek</title><path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z" fill="#4D6BFE"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Gemini</title><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="#3186FF"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-0)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-1)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-fill-2)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-0" x1="7" x2="11" y1="15.5" y2="12"><stop stop-color="#08B962"></stop><stop offset="1" stop-color="#08B962" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-1" x1="8" x2="11.5" y1="5.5" y2="11"><stop stop-color="#F94543"></stop><stop offset="1" stop-color="#F94543" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-fill-2" x1="3.5" x2="17.5" y1="13.5" y2="12"><stop stop-color="#FABC12"></stop><stop offset=".46" stop-color="#FABC12" stop-opacity="0"></stop></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Grok</title><path d="M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815"></path></svg>
|
||||
|
After Width: | Height: | Size: 756 B |
|
|
@ -0,0 +1 @@
|
|||
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>OpenAI</title><path d="M21.55 10.004a5.416 5.416 0 00-.478-4.501c-1.217-2.09-3.662-3.166-6.05-2.66A5.59 5.59 0 0010.831 1C8.39.995 6.224 2.546 5.473 4.838A5.553 5.553 0 001.76 7.496a5.487 5.487 0 00.691 6.5 5.416 5.416 0 00.477 4.502c1.217 2.09 3.662 3.165 6.05 2.66A5.586 5.586 0 0013.168 23c2.443.006 4.61-1.546 5.361-3.84a5.553 5.553 0 003.715-2.66 5.488 5.488 0 00-.693-6.497v.001zm-8.381 11.558a4.199 4.199 0 01-2.675-.954c.034-.018.093-.05.132-.074l4.44-2.53a.71.71 0 00.364-.623v-6.176l1.877 1.069c.02.01.033.029.036.05v5.115c-.003 2.274-1.87 4.118-4.174 4.123zM4.192 17.78a4.059 4.059 0 01-.498-2.763c.032.02.09.055.131.078l4.44 2.53c.225.13.504.13.73 0l5.42-3.088v2.138a.068.068 0 01-.027.057L9.9 19.288c-1.999 1.136-4.552.46-5.707-1.51h-.001zM3.023 8.216A4.15 4.15 0 015.198 6.41l-.002.151v5.06a.711.711 0 00.364.624l5.42 3.087-1.876 1.07a.067.067 0 01-.063.005l-4.489-2.559c-1.995-1.14-2.679-3.658-1.53-5.63h.001zm15.417 3.54l-5.42-3.088L14.896 7.6a.067.067 0 01.063-.006l4.489 2.557c1.998 1.14 2.683 3.662 1.529 5.633a4.163 4.163 0 01-2.174 1.807V12.38a.71.71 0 00-.363-.623zm1.867-2.773a6.04 6.04 0 00-.132-.078l-4.44-2.53a.731.731 0 00-.729 0l-5.42 3.088V7.325a.068.068 0 01.027-.057L14.1 4.713c2-1.137 4.555-.46 5.707 1.513.487.833.664 1.809.499 2.757h.001zm-11.741 3.81l-1.877-1.068a.065.065 0 01-.036-.051V6.559c.001-2.277 1.873-4.122 4.181-4.12.976 0 1.92.338 2.671.954-.034.018-.092.05-.131.073l-4.44 2.53a.71.71 0 00-.365.623l-.003 6.173v.002zm1.02-2.168L12 9.25l2.414 1.375v2.75L12 14.75l-2.415-1.375v-2.75z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Qwen</title><path d="M12.604 1.34c.393.69.784 1.382 1.174 2.075a.18.18 0 00.157.091h5.552c.174 0 .322.11.446.327l1.454 2.57c.19.337.24.478.024.837-.26.43-.513.864-.76 1.3l-.367.658c-.106.196-.223.28-.04.512l2.652 4.637c.172.301.111.494-.043.77-.437.785-.882 1.564-1.335 2.34-.159.272-.352.375-.68.37-.777-.016-1.552-.01-2.327.016a.099.099 0 00-.081.05 575.097 575.097 0 01-2.705 4.74c-.169.293-.38.363-.725.364-.997.003-2.002.004-3.017.002a.537.537 0 01-.465-.271l-1.335-2.323a.09.09 0 00-.083-.049H4.982c-.285.03-.553-.001-.805-.092l-1.603-2.77a.543.543 0 01-.002-.54l1.207-2.12a.198.198 0 000-.197 550.951 550.951 0 01-1.875-3.272l-.79-1.395c-.16-.31-.173-.496.095-.965.465-.813.927-1.625 1.387-2.436.132-.234.304-.334.584-.335a338.3 338.3 0 012.589-.001.124.124 0 00.107-.063l2.806-4.895a.488.488 0 01.422-.246c.524-.001 1.053 0 1.583-.006L11.704 1c.341-.003.724.032.9.34zm-3.432.403a.06.06 0 00-.052.03L6.254 6.788a.157.157 0 01-.135.078H3.253c-.056 0-.07.025-.041.074l5.81 10.156c.025.042.013.062-.034.063l-2.795.015a.218.218 0 00-.2.116l-1.32 2.31c-.044.078-.021.118.068.118l5.716.008c.046 0 .08.02.104.061l1.403 2.454c.046.081.092.082.139 0l5.006-8.76.783-1.382a.055.055 0 01.096 0l1.424 2.53a.122.122 0 00.107.062l2.763-.02a.04.04 0 00.035-.02.041.041 0 000-.04l-2.9-5.086a.108.108 0 010-.113l.293-.507 1.12-1.977c.024-.041.012-.062-.035-.062H9.2c-.059 0-.073-.026-.043-.077l1.434-2.505a.107.107 0 000-.114L9.225 1.774a.06.06 0 00-.053-.031zm6.29 8.02c.046 0 .058.02.034.06l-.832 1.465-2.613 4.585a.056.056 0 01-.05.029.058.058 0 01-.05-.029L8.498 9.841c-.02-.034-.01-.052.028-.054l.216-.012 6.722-.012z" fill="url(#lobe-icons-qwen-fill)" fill-rule="nonzero"></path><defs><linearGradient id="lobe-icons-qwen-fill" x1="0%" x2="100%" y1="0%" y2="0%"><stop offset="0%" stop-color="#6336E7" stop-opacity=".84"></stop><stop offset="100%" stop-color="#6F69F7" stop-opacity=".84"></stop></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |