fix(gateway): pass model to temporary AIAgent instances
Memory flush, /compress, and session hygiene create AIAgent without model=, falling back to the hardcoded default "anthropic/claude-opus-4.6". This fails with a 400 error when the active provider is openai-codex (Codex only accepts its own model names like gpt-5.1-codex-mini). Add _resolve_gateway_model() that mirrors the env/config resolution already used by _run_agent_sync, and wire it into all three temporary agent creation sites. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d905e612aa
commit
66c0b719de
1 changed files with 35 additions and 0 deletions
|
|
@ -187,6 +187,30 @@ def _resolve_runtime_agent_kwargs() -> dict:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _resolve_gateway_model() -> str:
|
||||||
|
"""Read model from env/config — mirrors the resolution in _run_agent_sync.
|
||||||
|
|
||||||
|
Without this, temporary AIAgent instances (memory flush, /compress) fall
|
||||||
|
back to the hardcoded default ("anthropic/claude-opus-4.6") which fails
|
||||||
|
when the active provider is openai-codex.
|
||||||
|
"""
|
||||||
|
model = os.getenv("HERMES_MODEL") or os.getenv("LLM_MODEL") or "anthropic/claude-opus-4.6"
|
||||||
|
try:
|
||||||
|
import yaml as _y
|
||||||
|
_cfg_path = _hermes_home / "config.yaml"
|
||||||
|
if _cfg_path.exists():
|
||||||
|
with open(_cfg_path, encoding="utf-8") as _f:
|
||||||
|
_cfg = _y.safe_load(_f) or {}
|
||||||
|
_model_cfg = _cfg.get("model", {})
|
||||||
|
if isinstance(_model_cfg, str):
|
||||||
|
model = _model_cfg
|
||||||
|
elif isinstance(_model_cfg, dict):
|
||||||
|
model = _model_cfg.get("default", model)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return model
|
||||||
|
|
||||||
|
|
||||||
class GatewayRunner:
|
class GatewayRunner:
|
||||||
"""
|
"""
|
||||||
Main gateway controller.
|
Main gateway controller.
|
||||||
|
|
@ -258,8 +282,14 @@ class GatewayRunner:
|
||||||
if not runtime_kwargs.get("api_key"):
|
if not runtime_kwargs.get("api_key"):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Resolve model from config — AIAgent's default is OpenRouter-
|
||||||
|
# formatted ("anthropic/claude-opus-4.6") which fails when the
|
||||||
|
# active provider is openai-codex.
|
||||||
|
model = _resolve_gateway_model()
|
||||||
|
|
||||||
tmp_agent = AIAgent(
|
tmp_agent = AIAgent(
|
||||||
**runtime_kwargs,
|
**runtime_kwargs,
|
||||||
|
model=model,
|
||||||
max_iterations=8,
|
max_iterations=8,
|
||||||
quiet_mode=True,
|
quiet_mode=True,
|
||||||
enabled_toolsets=["memory", "skills"],
|
enabled_toolsets=["memory", "skills"],
|
||||||
|
|
@ -1106,6 +1136,7 @@ class GatewayRunner:
|
||||||
if len(_hyg_msgs) >= 4:
|
if len(_hyg_msgs) >= 4:
|
||||||
_hyg_agent = AIAgent(
|
_hyg_agent = AIAgent(
|
||||||
**_hyg_runtime,
|
**_hyg_runtime,
|
||||||
|
model=_hyg_model,
|
||||||
max_iterations=4,
|
max_iterations=4,
|
||||||
quiet_mode=True,
|
quiet_mode=True,
|
||||||
enabled_toolsets=["memory"],
|
enabled_toolsets=["memory"],
|
||||||
|
|
@ -2169,6 +2200,9 @@ class GatewayRunner:
|
||||||
if not runtime_kwargs.get("api_key"):
|
if not runtime_kwargs.get("api_key"):
|
||||||
return "No provider configured -- cannot compress."
|
return "No provider configured -- cannot compress."
|
||||||
|
|
||||||
|
# Resolve model from config (same reason as memory flush above).
|
||||||
|
model = _resolve_gateway_model()
|
||||||
|
|
||||||
msgs = [
|
msgs = [
|
||||||
{"role": m.get("role"), "content": m.get("content")}
|
{"role": m.get("role"), "content": m.get("content")}
|
||||||
for m in history
|
for m in history
|
||||||
|
|
@ -2179,6 +2213,7 @@ class GatewayRunner:
|
||||||
|
|
||||||
tmp_agent = AIAgent(
|
tmp_agent = AIAgent(
|
||||||
**runtime_kwargs,
|
**runtime_kwargs,
|
||||||
|
model=model,
|
||||||
max_iterations=4,
|
max_iterations=4,
|
||||||
quiet_mode=True,
|
quiet_mode=True,
|
||||||
enabled_toolsets=["memory"],
|
enabled_toolsets=["memory"],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue