"""Patch frontend ChatInput.tsx: Add all models to dropdown with descriptions.""" FILE = "/source/frontend/src/components/Chat/ChatInput.tsx" with open(FILE, "r") as f: content = f.read() # Find end of DEFAULT_MODEL_OPTIONS array idx_deepseek = content.find("'deepseek-v4-pro'") if idx_deepseek == -1: idx_deepseek = content.find("deepseek-ai/DeepSeek-V4") if idx_deepseek == -1: print("❌ Cannot find DeepSeek entry!") import sys; sys.exit(1) idx_end = content.find("];", idx_deepseek) if idx_end == -1: print("❌ Cannot find end of array!") import sys; sys.exit(1) new_models = """ { id: 'grok-4.3', name: 'Grok 4.3', description: 'Tốt nhất giá rẻ · $2/$10 · 1M context', modelPath: 'openai/x-ai/grok-4.3', avatarUrl: 'https://huggingface.co/api/avatars/xai-org', recommended: true, }, { id: 'deepseek-v4-pro-or', name: 'DeepSeek V4 Pro', description: 'Rẻ nhất · $0.5/$2.18 · code quality cực tốt', modelPath: 'openai/deepseek/deepseek-v4-pro', avatarUrl: 'https://huggingface.co/api/avatars/deepseek-ai', recommended: true, }, { id: 'qwen3.7-max', name: 'Qwen 3.7 Max', description: 'Cân bằng · $1/$4 · quality khá', modelPath: 'openai/qwen/qwen3.7-max', avatarUrl: 'https://huggingface.co/api/avatars/Qwen', }, { id: 'qwen3-235b-hf', name: 'Qwen3 235B (HF Free)', description: 'Miễn phí qua HF Inference', modelPath: 'Qwen/Qwen3-235B-A22B', avatarUrl: 'https://huggingface.co/api/avatars/Qwen', }, { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', description: 'Rẻ · $0.15/$0.60 · nhanh', modelPath: 'openai/google/gemini-2.0-flash-001', avatarUrl: 'https://huggingface.co/api/avatars/google', }, """ content = content[:idx_end] + new_models + content[idx_end:] with open(FILE, "w") as f: f.write(content) assert "grok-4.3" in content assert "deepseek-v4-pro" in content assert "qwen3.7-max" in content assert "Qwen3-235B-A22B" in content assert "gemini-2.0-flash" in content print("✅ Frontend patched: Grok 4.3, DeepSeek V4 Pro, Qwen 3.7 Max, Qwen3 HF, Gemini Flash added")