File size: 5,518 Bytes
6d19910
de5a378
e9e0d7a
 
 
 
f1d70ad
e9e0d7a
6d19910
f1d70ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f2a4625
 
 
 
 
 
 
 
f1d70ad
 
e9e0d7a
de5a378
d988d4d
e9e0d7a
de5a378
 
6d19910
e9e0d7a
 
 
 
 
 
 
 
c1d2b49
ced7c6b
 
de5a378
6d19910
f1d70ad
 
de5a378
6d19910
f1d70ad
 
de5a378
6d19910
f1d70ad
 
de5a378
ced7c6b
f1d70ad
 
 
 
de5a378
6d19910
e9e0d7a
 
 
 
 
 
 
 
6d19910
 
 
 
 
 
 
e9e0d7a
d4b57ad
d988d4d
e9e0d7a
d4b57ad
 
e9e0d7a
 
c74e807
 
e9e0d7a
c74e807
 
d4b57ad
6d19910
 
 
 
 
 
 
f2a4625
 
 
 
 
 
 
d4b57ad
e9e0d7a
 
 
 
 
de5a378
 
 
 
 
 
 
 
 
 
 
 
e9e0d7a
 
 
 
 
 
 
6d19910
e9e0d7a
 
 
de5a378
e9e0d7a
de5a378
 
6d19910
f2a4625
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
"""Patch frontend: Replace DEFAULT_MODEL_OPTIONS with OpenRouter models."""

import re
import sys

FILE = "/source/frontend/src/components/Chat/ChatInput.tsx"
MODEL_FILE = "/source/frontend/src/utils/model.ts"

# === Step 1: Patch model.ts ===
with open(MODEL_FILE, "r") as f:
    model_content = f.read()

model_content = model_content.replace(
    "export const KIMI_K27_CODE_MODEL_PATH = 'moonshotai/Kimi-K2.7-Code:novita';",
    "export const KIMI_K27_CODE_MODEL_PATH = 'deepseek-ai/DeepSeek-V4-Pro';"
)
model_content = model_content.replace(
    "export const MINIMAX_M3_MODEL_PATH = 'MiniMaxAI/MiniMax-M3:novita';",
    "export const MINIMAX_M3_MODEL_PATH = 'deepseek-ai/DeepSeek-V4-Flash';"
)
model_content = model_content.replace(
    "export const GLM_52_MODEL_PATH = 'zai-org/GLM-5.2:novita';",
    "export const GLM_52_MODEL_PATH = 'openai/deepseek/deepseek-v4-flash';"
)
model_content = model_content.replace(
    "export const DEEPSEEK_V4_PRO_MODEL_PATH = 'deepseek-ai/DeepSeek-V4-Pro:novita';",
    "export const DEEPSEEK_V4_PRO_MODEL_PATH = 'nvidia/nemotron-3-super-120b-a12b:free';"
)

# === PATCH: Add Laguna S 2.1 model path ===
if "LAGUNA_S21_MODEL_PATH" not in model_content:
    model_content = model_content.replace(
        "export const LAGUNA_M1_MODEL_PATH",
        "export const LAGUNA_S21_MODEL_PATH = 'openai/poolside/laguna-s-2.1:free';\n\nexport const LAGUNA_M1_MODEL_PATH"
    )
    print("OK: Added LAGUNA_S21_MODEL_PATH")

with open(MODEL_FILE, "w") as f:
    f.write(model_content)
print("OK: model.ts constants updated")

# === Step 2: Patch ChatInput.tsx ===
with open(FILE, "r", encoding="utf-8") as f:
    content = f.read()

# Fix imports
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")

# Remove Owl Alpha references
content = content.replace("'Owl Alpha'", "'Claude Opus 4.8'")
content = content.replace('"Owl Alpha"', '"Claude Opus 4.8"')

# Row 3: Kimi → DeepSeek V4 Pro
content = content.replace("'Kimi K2.7 Code'", "'DeepSeek V4 Pro'")
content = content.replace('"Kimi K2.7 Code"', '"DeepSeek V4 Pro"')

# Row 4: MiniMax → DeepSeek V4 Flash
content = content.replace("'MiniMax M3'", "'DeepSeek V4 Flash'")
content = content.replace('"MiniMax M3"', '"DeepSeek V4 Flash"')

# Row 5: GLM → DeepSeek V4 Flash
content = content.replace("'GLM 5.2'", "'DeepSeek V4 Flash'")
content = content.replace('"GLM 5.2"', '"DeepSeek V4 Flash"')

# Row 6: DeepSeek V4 Pro → Nemotron
content = content.replace(
    "  {\n    id: 'deepseek-v4-pro',\n    name: 'DeepSeek V4 Pro',\n    modelPath: DEEPSEEK_V4_PRO_MODEL_PATH,\n    avatarUrl: getHfAvatarUrl('deepseek-ai/DeepSeek-V4-Pro'),\n  },",
    "  {\n    id: 'nemotron-120b',\n    name: 'nvidia/nemotron-3-super-120b-a12b:free',\n    modelPath: DEEPSEEK_V4_PRO_MODEL_PATH,\n    avatarUrl: 'https://huggingface.co/api/avatars/nvidia',\n  },"
)

# Replace entire DEFAULT_MODEL_OPTIONS array
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)

new_array = """const DEFAULT_MODEL_OPTIONS: ModelOption[] = [
  {
    id: 'tencent-hy3',
    name: 'Tencent HY3:free',
    modelPath: 'openai/tencent/hy3:free',
    avatarUrl: 'https://huggingface.co/api/avatars/tencent',
    recommended: true,
  },
  {
    id: 'gemma-4-31b',
    name: 'Gemma 4 31B:free',
    modelPath: 'openai/google/gemma-4-31b-it:free',
    avatarUrl: 'https://huggingface.co/api/avatars/google',
    recommended: true,
  },
  {
    id: 'llama-3.3-70b',
    name: 'Llama 3.3 70B:free',
    modelPath: 'openai/meta-llama/llama-3.3-70b-instruct:free',
    avatarUrl: 'https://huggingface.co/api/avatars/meta-llama',
    recommended: true,
  },
  {
    id: 'laguna-m1',
    name: 'Laguna M.1:free',
    modelPath: 'openai/poolside/laguna-m.1:free',
    avatarUrl: 'https://huggingface.co/api/avatars/poolside',
    recommended: true,
  },
  {
    id: 'laguna-s21',
    name: 'Laguna S 2.1:free',
    modelPath: 'openai/poolside/laguna-s-2.1:free',
    avatarUrl: 'https://huggingface.co/api/avatars/poolside',
    recommended: true,
  },
  {
    id: 'llama-3.1-8b',
    name: 'Llama 3.1 8B',
    modelPath: 'openai/meta-llama/llama-3.1-8b-instruct',
    avatarUrl: 'https://huggingface.co/api/avatars/meta-llama',
  },
  {
    id: 'qwen3-coder-next',
    name: 'Qwen3 Coder Next',
    modelPath: 'Qwen/Qwen3-Coder-Next',
    avatarUrl: 'https://huggingface.co/api/avatars/Qwen',
  },
  {
    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',
  },
];"""

content = content[:match.start()] + new_array + content[match.end():]

# Update DEFAULT_MODEL_PATH
dm_path = re.search(r'const DEFAULT_MODEL_PATH\s*=.*?;', content)
if dm_path:
    content = content.replace(dm_path.group(0), "const DEFAULT_MODEL_PATH = 'openai/tencent/hy3:free';")
    print("OK: Replaced DEFAULT_MODEL_PATH")
else:
    print("OK: DEFAULT_MODEL_PATH not found")

with open(FILE, "w", encoding="utf-8") as f:
    f.write(content)

print("OK: Frontend patched - Tencent HY3:free DEFAULT")
print("  Models: HY3:free, Gemma 4 31B:free, Llama 3.3 70B:free, Laguna M.1:free, Laguna S 2.1:free, Llama 3.1 8B")