Spaces:
Running
Running
| """Patch frontend ChatInput.tsx: Replace DEFAULT_MODEL_OPTIONS array + fix imports.""" | |
| import re | |
| import sys | |
| FILE = "/source/frontend/src/components/Chat/ChatInput.tsx" | |
| with open(FILE, "r", encoding="utf-8") as f: | |
| content = f.read() | |
| # === Step 1: Fix imports — replace 6-constant block with just isClaudePath === | |
| import_pattern = re.compile( | |
| r'import\s*\{[^}]+\}\s*from\s*[\'"]@/utils/model[\'"];' | |
| ) | |
| match = import_pattern.search(content) | |
| if match: | |
| content = content.replace(match.group(0), "import { isClaudePath } from '@/utils/model';") | |
| print("OK: Replaced imports with just isClaudePath") | |
| else: | |
| print("OK: Imports already clean or not found") | |
| # === Step 2: Replace DEFAULT_MODEL_OPTIONS array using regex === | |
| pattern = r'const DEFAULT_MODEL_OPTIONS: ModelOption\[\] = \[.*?\];' | |
| match = re.search(pattern, content, re.DOTALL) | |
| if not match: | |
| print("FAIL: Could not find DEFAULT_MODEL_OPTIONS array!") | |
| sys.exit(1) | |
| print(f"OK: Found array at pos {match.start()}-{match.end()}") | |
| new_array = """const DEFAULT_MODEL_OPTIONS: ModelOption[] = [ | |
| { | |
| id: 'owl-alpha', | |
| name: 'Owl Alpha', | |
| modelPath: 'openai/openrouter/owl-alpha', | |
| avatarUrl: 'https://huggingface.co/api/avatars/openrouter', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'deepseek-v4-pro', | |
| name: 'DeepSeek V4 Pro', | |
| modelPath: 'deepseek-ai/DeepSeek-V4-Pro', | |
| avatarUrl: 'https://huggingface.co/api/avatars/deepseek-ai', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'deepseek-v4-flash', | |
| name: 'DeepSeek V4 Flash', | |
| modelPath: 'deepseek-ai/DeepSeek-V4-Flash', | |
| avatarUrl: 'https://huggingface.co/api/avatars/deepseek-ai', | |
| }, | |
| { | |
| id: 'gpt-oss-120b', | |
| name: 'gpt-oss-120b', | |
| modelPath: 'openai/gpt-oss-120b', | |
| avatarUrl: 'https://huggingface.co/api/avatars/openai', | |
| }, | |
| { | |
| id: 'qwen3-coder-next', | |
| name: 'Qwen3 Coder Next', | |
| modelPath: 'Qwen/Qwen3-Coder-Next', | |
| avatarUrl: 'https://huggingface.co/api/avatars/Qwen', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'gemma-3-1b', | |
| name: 'Gemma 3 1B', | |
| modelPath: 'google/gemma-3-1b-it', | |
| avatarUrl: 'https://huggingface.co/api/avatars/google', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'gemini-2.0-flash', | |
| name: 'Gemini 2.0 Flash', | |
| modelPath: 'openai/google/gemini-2.0-flash-001', | |
| avatarUrl: 'https://huggingface.co/api/avatars/google', | |
| }, | |
| { | |
| id: 'deepseek-v4-flash-or', | |
| name: 'DeepSeek V4 Flash (OR)', | |
| modelPath: 'openai/deepseek/deepseek-v4-flash', | |
| avatarUrl: 'https://huggingface.co/api/avatars/deepseek-ai', | |
| }, | |
| { | |
| id: 'gemma-4-9b', | |
| name: 'Gemma 4 9B', | |
| modelPath: 'openai/google/gemma-4-9b-it:free', | |
| avatarUrl: 'https://huggingface.co/api/avatars/google', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'gemma-4-31b', | |
| name: 'Gemma 4 31B', | |
| modelPath: 'openai/google/gemma-4-31b-it:free', | |
| avatarUrl: 'https://huggingface.co/api/avatars/google', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'hy3-preview', | |
| name: 'Hy3 Preview', | |
| modelPath: 'openai/tencent/hy3-preview', | |
| avatarUrl: 'https://huggingface.co/api/avatars/tencent', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'north-mini-code', | |
| name: 'north-mini-code:free', | |
| modelPath: 'openai/cohere/north-mini-code:free', | |
| avatarUrl: 'https://huggingface.co/api/avatars/cohere', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'nemotron-120b', | |
| name: 'Nemotron 3 Super 120B', | |
| modelPath: 'openai/nvidia/nemotron-3-super-120b-a12b:free', | |
| avatarUrl: 'https://huggingface.co/api/avatars/nvidia', | |
| }, | |
| { | |
| id: 'nemotron-3-ultra', | |
| name: 'Nemotron 3 Ultra 550B', | |
| modelPath: 'openai/nvidia/nemotron-3-ultra-550b-a55b:free', | |
| avatarUrl: 'https://huggingface.co/api/avatars/nvidia', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'laguna-m', | |
| name: 'Laguna M.1', | |
| modelPath: 'openai/poolside/laguna-m.1:free', | |
| avatarUrl: 'https://huggingface.co/api/avatars/poolside', | |
| recommended: true, | |
| }, | |
| { | |
| id: 'laguna-xs', | |
| name: 'Laguna XS.2', | |
| modelPath: 'openai/poolside/laguna-xs.2:free', | |
| avatarUrl: 'https://huggingface.co/api/avatars/poolside', | |
| }, | |
| ];""" | |
| content = content[:match.start()] + new_array + content[match.end():] | |
| # === Step 3: Replace DEFAULT_MODEL_PATH = first recommended model === | |
| old_default_path = "const DEFAULT_MODEL_PATH = GLM_52_MODEL_PATH;" | |
| new_default_path = "const DEFAULT_MODEL_PATH = 'deepseek-ai/DeepSeek-V4-Pro';" | |
| if old_default_path in content: | |
| content = content.replace(old_default_path, new_default_path) | |
| print("OK: Replaced DEFAULT_MODEL_PATH") | |
| else: | |
| # Try regex for any DEFAULT_MODEL_PATH assignment | |
| dm_path = re.search(r'const DEFAULT_MODEL_PATH\s*=.*?;', content) | |
| if dm_path: | |
| content = content.replace(dm_path.group(0), new_default_path) | |
| print("OK: Replaced DEFAULT_MODEL_PATH via regex") | |
| else: | |
| print("OK: DEFAULT_MODEL_PATH not found, might be fine") | |
| with open(FILE, "w", encoding="utf-8") as f: | |
| f.write(content) | |
| print("OK: Frontend patched - 16 models, deepseek-ai/DeepSeek-V4-Pro default") |