Space-Mutiverse-Control / patch_frontend.py
bep40's picture
Fix patch_frontend.py for current upstream (6 constants, updated model ids)
88da86f verified
Raw
History Blame
5.01 kB
"""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")