/** * Error Alert Component * Displays user-friendly error messages with special handling for rate limits */ "use client"; import { AlertCircle, Clock, TrendingUp } from "lucide-react"; import { Card } from "@/components/ui/card"; interface ErrorAlertProps { error: string | { error: string; error_type?: string; retry_after?: number; quota_limit?: number; }; } export function ErrorAlert({ error }: ErrorAlertProps) { // Parse error data const isRateLimit = typeof error === "object" && error.error_type === "rate_limit"; const errorMessage = typeof error === "string" ? error : error.error; const retryAfter = typeof error === "object" ? error.retry_after : null; const quotaLimit = typeof error === "object" ? error.quota_limit : null; // Calculate retry time display const getRetryTimeDisplay = (seconds: number | null) => { if (!seconds) return null; const minutes = Math.floor(seconds / 60); const remainingSeconds = seconds % 60; if (minutes > 0) { return `${minutes} 分 ${remainingSeconds} 秒`; } return `${remainingSeconds} 秒`; }; return (
{isRateLimit ? ( ) : ( )}

{isRateLimit ? "API 請求額度已達上限" : "錯誤"}

{errorMessage}

{isRateLimit && (
{/* Retry Information */} {retryAfter && (

建議等待時間

請在 {getRetryTimeDisplay(retryAfter)} 後重試

)} {/* Quota Information */} {quotaLimit && (

每日額度限制

當前計劃:每日 {quotaLimit} 次請求

)} {/* Solutions */}

💡 解決方案:

  • 等待額度重置(通常為每日重置)
  • 升級至付費方案以獲得更高額度
  • 減少分析師數量或研究深度以降低 API 呼叫次數
  • 使用不同的 API 金鑰(如果有多個帳戶)
)}
); }