OpenClaw Issue: isolated session 模型切换死循环
问题描述
创建 isolated cron 任务时,无论使用什么模型都会触发 LiveSessionModelSwitchError:
- 百炼模型(qwen3.5-plus/kimi-k2.5)看到 Runtime 中的
model=anthropic/claude-opus-4-6 → 尝试切换到 Opus → 被拦截 → fallback → 也失败
- Opus 模型(claude-opus-4-6)看到 Runtime 中的
model=anthropic/claude-opus-4-6 → 尝试切换(自己切自己)→ 死循环
复现步骤
- 创建 isolated cron 任务:
{
"name": "test-cron",
"schedule": {"kind": "cron", "expr": "0 10 * * *"},
"sessionTarget": "isolated",
"payload": {
"kind": "agentTurn",
"model": "bailian/qwen3.5-plus",
"message": "测试任务"
}
}
- 执行任务:
openclaw cron run --jobId <id>
- 错误输出:
LiveSessionModelSwitchError: Live session model switch requested: anthropic/claude-opus-4-6
根因分析
isolated session 的 Runtime 行使用主 agent 的 primary model,而不是 payload.model:
isolated session 启动
↓
OpenClaw 注入 system prompt,包含:
Runtime: model=anthropic/claude-opus-4-6 ← 来自主 agent 配置
+ 加载 AGENTS.md/TOOLS.md/MEMORY.md
↓
模型看到 Runtime 中的模型名称
↓
触发模型切换逻辑:"检测到可用模型 X,请求切换"
↓
死循环/失败
核心问题:
- isolated session 的 Runtime 行应该匹配
payload.model,而不是主 agent 的 primary
lightContext: true 没有过滤 Runtime 行中的 model 信息
- 模型切换逻辑是"看到就切换",不是"不同才切换"
影响范围
- ❌ 所有 isolated cron 任务无法使用百炼模型(成本增加)
- ❌ 无法在 isolated session 中使用 Opus(死循环)
- ❌ 自动任务(早报、巡检、备份)全部失败
建议修复
方案一:Runtime 行匹配 payload.model(推荐)
修改位置:isolated session 创建逻辑
当前行为:
runtimeInfo.model = agentConfig.primaryModel; // 主 agent 的 primary
期望行为:
runtimeInfo.model = payload.model || agentConfig.primaryModel; // 优先使用 payload.model
方案二:lightContext 过滤 Runtime 行
修改位置:lightContext 处理逻辑
期望行为:
if (lightContext) {
systemPrompt = systemPrompt.replace(/Runtime:.*\n/, '');
// 或至少过滤 model 字段
}
方案三:模型切换逻辑优化
修改位置:模型切换判断逻辑
当前行为:
if (availableModels.includes(requestedModel)) {
switchModel(requestedModel); // 看到就切换
}
期望行为:
if (availableModels.includes(requestedModel) && currentModel !== requestedModel) {
switchModel(requestedModel); // 不同才切换
}
临时解决方案(已验证)
将主 agent 的 primary model 改为百炼模型:
{
"agents": {
"defaults": {"model": {"primary": "bailian/qwen3.5-plus"}},
"list": [{"id": "main", "model": {"primary": "bailian/qwen3.5-plus"}}]
}
}
代价:
- 主会话默认使用百炼模型
- 需要 Opus 时手动指定(
/model opus)
收益:
- ✅ cron 任务恢复正常
- ✅ 日常消耗大幅降低(百炼免费)
环境信息
- OpenClaw 版本:2026.3.28
- Node.js: v22.20.0
- OS: Darwin 24.4.0
- 配置路径:
~/.openclaw/openclaw.json
优先级
🔴 高优先级 - 影响所有自动任务的正常运行
标签
bug cron isolated-session model-switching
OpenClaw Issue: isolated session 模型切换死循环
问题描述
创建 isolated cron 任务时,无论使用什么模型都会触发
LiveSessionModelSwitchError:model=anthropic/claude-opus-4-6→ 尝试切换到 Opus → 被拦截 → fallback → 也失败model=anthropic/claude-opus-4-6→ 尝试切换(自己切自己)→ 死循环复现步骤
{ "name": "test-cron", "schedule": {"kind": "cron", "expr": "0 10 * * *"}, "sessionTarget": "isolated", "payload": { "kind": "agentTurn", "model": "bailian/qwen3.5-plus", "message": "测试任务" } }根因分析
isolated session 的 Runtime 行使用主 agent 的 primary model,而不是
payload.model:核心问题:
payload.model,而不是主 agent 的 primarylightContext: true没有过滤 Runtime 行中的 model 信息影响范围
建议修复
方案一:Runtime 行匹配 payload.model(推荐)
修改位置:isolated session 创建逻辑
当前行为:
期望行为:
方案二:lightContext 过滤 Runtime 行
修改位置:lightContext 处理逻辑
期望行为:
方案三:模型切换逻辑优化
修改位置:模型切换判断逻辑
当前行为:
期望行为:
临时解决方案(已验证)
将主 agent 的 primary model 改为百炼模型:
{ "agents": { "defaults": {"model": {"primary": "bailian/qwen3.5-plus"}}, "list": [{"id": "main", "model": {"primary": "bailian/qwen3.5-plus"}}] } }代价:
/model opus)收益:
环境信息
~/.openclaw/openclaw.json优先级
🔴 高优先级 - 影响所有自动任务的正常运行
标签
bugcronisolated-sessionmodel-switching