关键词:LLM 调度|API Key 轮询|上下文压缩|Token 监控|弹性推理
在 OpenClaw 的智能体系中,src/agents/run.ts 是真正的“心脏”——它负责将用户请求转化为一次完整的 AI 推理过程。这个看似简单的函数,实则承载了高可用、自适应、安全可控三大工业级要求。
本文聚焦 run.ts 的三大核心机制:
它们共同确保:即使某个模型宕机、某个账号限流、某次对话过长,系统仍能优雅降级并完成任务。
runAgentInference() 函数run.ts 的主函数签名如下:
async function runAgentInference(
session: PiSession,
request: AgentRunRequest,
options: RunOptions
): Promise<AgentRunResult>session:当前会话上下文(含历史消息)request:用户输入 + 工具调用历史options:超时、重试次数、允许的模型列表等该函数不直接调用 LLM,而是进入一个多阶段调度循环。
OpenClaw 允许为每个智能体配置多个候选模型,按优先级排序:
# agents/dev-assistant/config.yaml
models:
- id: "claude-3-5-sonnet"
provider: "anthropic"
- id: "gpt-4o"
provider: "openai"
- id: "gemini-1.5-pro"
provider: "google"这使得用户无感知地享受“模型冗余”带来的高可用性。

一个模型可能绑定多个 API Key(例如多个 OpenAI 组织账号)。OpenClaw 通过 认证档案(Auth Profile)管理这些凭证。
markAuthProfileFailure(profileId) markAuthProfileGood(profileId) const authProfiles = {
"openai-team-a": { key: "...", cooldownUntil: 0, successCount: 12 },
"openai-team-b": { key: "...", cooldownUntil: 1710234567, successCount: 3 }
}轮询不是随机,而是基于健康状态的智能选择。
LLM 的上下文长度有限(如 Claude 200K,GPT-4o 128K)。当会话过长,必须主动干预。
在每次调用前,估算当前会话的 Token 数:
const tokenUsage = estimateTokens(session.messages)若超过 HARD_MIN_THRESHOLD(如 90% 上下文),触发自动压缩
compactEmbeddedPiSessionDirect()保留关键信息:
丢弃中间思考过程(如 /think ... 块)
生成压缩摘要:
[系统摘要] 此前对话已压缩。用户要求部署服务,AI 已执行:1) 拉取代码 2) 构建镜像 3) 推送仓库。maxContextTokens: 120000
hardMinThreshold: 0.9 # 超过 90% 触发压缩压缩不是截断,而是语义提炼——确保 AI 仍能理解任务上下文。
考虑以下场景:
用户连续发送 50 条消息,Claude 返回 “context length exceeded”
处理流程:
run.ts 检测到 ContextOverflow 错误compactEmbeddedPiSessionDirect()
层层递进,最大限度保留原始意图。

这些机制让 OpenClaw 从“能用”走向“可靠”,真正满足企业级 SLA 要求。
run.ts 的设计哲学是:不要相信任何外部依赖。模型可能慢,账号可能封,上下文可能溢出——但系统必须继续工作。
这种“防御性编程”思维,正是工业级 AI 系统与玩具项目的本质区别。
在下一篇中,我们将继续深入
run.ts的下半部分:故障转移策略、重试逻辑与结果封装机制。
下一篇预告:
第 6 篇:run.ts 下篇 —— 故障转移、重试策略与结果封装