Add openai/tencent/hy3:free and google/gemma-4-31B-it:novita to model list

#49
agent/core/model_ids.py CHANGED
@@ -10,6 +10,10 @@ MINIMAX_M3_MODEL_ID = "MiniMaxAI/MiniMax-M3:novita"
10
  GLM_52_MODEL_ID = "zai-org/GLM-5.2:novita"
11
  DEEPSEEK_V4_PRO_MODEL_ID = "deepseek-ai/DeepSeek-V4-Pro:novita"
12
 
 
 
 
 
13
  HOSTED_MODEL_IDS = {
14
  CLAUDE_OPUS_48_MODEL_ID,
15
  GPT_55_MODEL_ID,
@@ -17,6 +21,8 @@ HOSTED_MODEL_IDS = {
17
  MINIMAX_M3_MODEL_ID,
18
  GLM_52_MODEL_ID,
19
  DEEPSEEK_V4_PRO_MODEL_ID,
 
 
20
  }
21
 
22
 
@@ -29,4 +35,4 @@ def strip_huggingface_model_prefix(model_id: str | None) -> str | None:
29
 
30
  def is_known_router_model_id(model_id: str | None) -> bool:
31
  normalized = strip_huggingface_model_prefix(model_id)
32
- return bool(normalized and normalized in HOSTED_MODEL_IDS)
 
10
  GLM_52_MODEL_ID = "zai-org/GLM-5.2:novita"
11
  DEEPSEEK_V4_PRO_MODEL_ID = "deepseek-ai/DeepSeek-V4-Pro:novita"
12
 
13
+ # OpenRouter models (via HF Router)
14
+ HY3_MODEL_ID = "openai/tencent/hy3:free"
15
+ GEMMA_4_31B_MODEL_ID = "google/gemma-4-31B-it:novita"
16
+
17
  HOSTED_MODEL_IDS = {
18
  CLAUDE_OPUS_48_MODEL_ID,
19
  GPT_55_MODEL_ID,
 
21
  MINIMAX_M3_MODEL_ID,
22
  GLM_52_MODEL_ID,
23
  DEEPSEEK_V4_PRO_MODEL_ID,
24
+ HY3_MODEL_ID,
25
+ GEMMA_4_31B_MODEL_ID,
26
  }
27
 
28
 
 
35
 
36
  def is_known_router_model_id(model_id: str | None) -> bool:
37
  normalized = strip_huggingface_model_prefix(model_id)
38
+ return bool(normalized and normalized in HOSTED_MODEL_IDS)
agent/core/model_switcher.py CHANGED
@@ -29,8 +29,10 @@ from agent.core.local_models import (
29
  from agent.core.model_ids import (
30
  CLAUDE_OPUS_48_MODEL_ID,
31
  DEEPSEEK_V4_PRO_MODEL_ID,
 
32
  GLM_52_MODEL_ID,
33
  GPT_55_MODEL_ID,
 
34
  KIMI_K27_CODE_MODEL_ID,
35
  MINIMAX_M3_MODEL_ID,
36
  strip_huggingface_model_prefix,
@@ -42,6 +44,8 @@ from agent.core.model_ids import (
42
  # ":cheapest", ":preferred", or ":<provider>" to override the default routing
43
  # policy (auto = fastest with failover).
44
  SUGGESTED_MODELS = [
 
 
45
  {"id": CLAUDE_OPUS_48_MODEL_ID, "label": "Claude Opus 4.8"},
46
  {"id": GPT_55_MODEL_ID, "label": "GPT-5.5"},
47
  {"id": MINIMAX_M3_MODEL_ID, "label": "MiniMax M3"},
@@ -168,15 +172,6 @@ def print_model_listing(config, console) -> None:
168
  )
169
 
170
 
171
- def print_invalid_id(arg: str, console) -> None:
172
- console.print(f"[bold red]Invalid model id format:[/bold red] {arg}")
173
- console.print(
174
- "[dim]Expected:\n"
175
- " • <org>/<model>[:tag] (HF router — paste from huggingface.co)\n"
176
- " • ollama/<model> | vllm/<model> | lm_studio/<model> | llamacpp/<model>[/dim]"
177
- )
178
-
179
-
180
  async def _probe_local_model(model_id: str) -> None:
181
  params = _resolve_llm_params(model_id)
182
  await asyncio.wait_for(
@@ -287,4 +282,4 @@ def _commit_switch(model_id, config, session, effective, cache: bool) -> None:
287
  else:
288
  session.model_effective_effort.pop(model_id, None)
289
  else:
290
- config.model_name = model_id
 
29
  from agent.core.model_ids import (
30
  CLAUDE_OPUS_48_MODEL_ID,
31
  DEEPSEEK_V4_PRO_MODEL_ID,
32
+ GEMMA_4_31B_MODEL_ID,
33
  GLM_52_MODEL_ID,
34
  GPT_55_MODEL_ID,
35
+ HY3_MODEL_ID,
36
  KIMI_K27_CODE_MODEL_ID,
37
  MINIMAX_M3_MODEL_ID,
38
  strip_huggingface_model_prefix,
 
44
  # ":cheapest", ":preferred", or ":<provider>" to override the default routing
45
  # policy (auto = fastest with failover).
46
  SUGGESTED_MODELS = [
47
+ {"id": HY3_MODEL_ID, "label": "Tencent Hy3 (Free)"},
48
+ {"id": GEMMA_4_31B_MODEL_ID, "label": "Gemma 4 31B"},
49
  {"id": CLAUDE_OPUS_48_MODEL_ID, "label": "Claude Opus 4.8"},
50
  {"id": GPT_55_MODEL_ID, "label": "GPT-5.5"},
51
  {"id": MINIMAX_M3_MODEL_ID, "label": "MiniMax M3"},
 
172
  )
173
 
174
 
 
 
 
 
 
 
 
 
 
175
  async def _probe_local_model(model_id: str) -> None:
176
  params = _resolve_llm_params(model_id)
177
  await asyncio.wait_for(
 
282
  else:
283
  session.model_effective_effort.pop(model_id, None)
284
  else:
285
+ config.model_name = model_id
configs/cli_agent_config.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "model_name": "zai-org/GLM-5.2:novita",
3
  "save_sessions": true,
4
  "session_dataset_repo": "smolagents/ml-intern-sessions",
5
  "share_traces": true,
@@ -19,4 +19,4 @@
19
  "url": "https://huggingface.co/mcp?login"
20
  }
21
  }
22
- }
 
1
  {
2
+ "model_name": "openai/tencent/hy3:free",
3
  "save_sessions": true,
4
  "session_dataset_repo": "smolagents/ml-intern-sessions",
5
  "share_traces": true,
 
19
  "url": "https://huggingface.co/mcp?login"
20
  }
21
  }
22
+ }
configs/frontend_agent_config.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "model_name": "${ML_INTERN_DEFAULT_MODEL_ID:-zai-org/GLM-5.2:novita}",
3
  "save_sessions": true,
4
  "session_dataset_repo": "smolagents/ml-intern-sessions",
5
  "share_traces": true,
@@ -13,4 +13,4 @@
13
  "url": "https://huggingface.co/mcp?login"
14
  }
15
  }
16
- }
 
1
  {
2
+ "model_name": "openai/tencent/hy3:free",
3
  "save_sessions": true,
4
  "session_dataset_repo": "smolagents/ml-intern-sessions",
5
  "share_traces": true,
 
13
  "url": "https://huggingface.co/mcp?login"
14
  }
15
  }
16
+ }