AI 幕后 · 讲解页

agent 引擎是什么

模型 API 只会说话。让它动手、记事、转第二圈的那一层叫引擎。写 CLAUDE.md、装 skill、接记忆库,改的都是引擎上面的 harness。

harness规矩与装备 多数人每天改的那层

  • CLAUDE.md、skills、hooks、MCP、RecallNest
  • 它不执行任何东西,只是告诉引擎「该怎么做、不许做什么」

engine引擎 身体:手、脚、记性、看门人

  • 拼上下文 → 调模型 → 执行工具 → 回填结果 → 再调,直到做完
  • Claude Code 本体就是这一层,Anthropic 写的

model API模型 大脑:按次出租

  • 收一段消息,吐一段文字,或一句「我想调这个工具」
  • 不会自己跑工具,不会自己记住,不会自己转第二圈
平时用 Claude Codeharness 是自己的,引擎借 Claude Code
TG bridge / etwin / dsh作者自己的壳。借 CLI 当引擎,自己不写循环
白艾莉自己写了引擎,再套 20 家模型
连接型不写引擎,把 CC、Codex、Pi 三家连起来

先分清三层

常有人问「我自己写的 harness 算不算引擎」。不算。harness 是规矩,引擎是身体。给 Claude Code 写规则、装 skill、接记忆库,全部是在它的引擎上做配置;循环本身没碰过,因为循环在 Claude Code 里面。

白艾莉的不同在于中间那层是他们自己写的,所以能嵌世界模拟、能换模型、能卖给别人。还有第三种:不写引擎,把别人的引擎连起来,卖的是连接。

点下面的「下一步」,看只有 API 时会卡在哪。

只有 API 的时候

拿 deepseek 或 qwen 的 key 直接调接口,问一句闲话没问题。但一旦问「帮我看看目录」,模型只能礼貌地说「我想调用 list_files」,然后停住。那句话是一个 JSON,不是一次执行。

要让它真的动起来,必须有一段代码接住这个 JSON:去跑命令、把结果塞回对话、再问模型一次。这段代码就是引擎的起点。有 key 解决的是「能不能问」,解决不了「谁来做」。

① 拼上下文系统提示 + 记忆 + 工具表 + 历史
② 调模型流式拿回文字 / 工具请求
③ 权限门这个工具现在能跑吗
④ 执行工具真的去读文件、跑命令
⑤ 结果回填写回消息数组
⑥ 还要工具?要 → 再转一圈;不要 → 输出
turn0待机
messages[]

加上循环,它就成了 agent

Anthropic 官方文档对这个循环的定义只有一句:模型评估、请求工具、拿到结果、再评估,直到它给出一个不带工具请求的回复。每转一圈叫一个 turn。循环什么时候停,不是定时也不是字数,是模型自己不再要工具了。

常听人说 Claude Code 就是个 while 循环。这话没错,但循环只占很小一部分:这一镜头先演这一小部分,循环之外的那些留给下一镜头。

环和右边的 messages[] 是本页自带的迷你引擎当场跑出来的:一个只会返回文字或工具请求的假模型,三个工具,一道权限门。

点一张卡,看它坏的时候引擎怎么接住。这些全是白艾莉方法论和 Agent SDK 文档里写明的真实处理,不是编的。翻面后多出来的「现场算」一行,是本页自带的迷你引擎当场跑出来的,不是白艾莉或 Claude Code 的代码。

工具配对断了 API 400

用户中途取消、断线、压缩,让某次工具请求没有对应结果。下次调用,API 直接报错。

点开:看引擎怎么接住 ↻

接住:每次调模型前扫一遍历史,缺结果的请求补一条合成的「已中断」,孤儿结果直接删。补全,不截断。

现场算

再点一下翻回去 ↻

参数类型写错 校验失败

模型把 limit: 10 写成 "10",布尔写成字符串。频率极高。

点开:看引擎怎么接住 ↻

接住:按工具的参数定义自动转类型,再执行。

现场算

再点一下翻回去 ↻

上下文撑爆 context

读了个大文件、跑了条啰嗦命令,几千 token 一下就没了,几十圈后窗口满了。

点开:看引擎怎么接住 ↻

接住:快满时自动压缩旧历史成摘要;大输出先写临时文件,只给模型一个路径。

现场算

再点一下翻回去 ↻

超时与限流 429 / timeout

网络抖、被限流、流式半天没数据。全部重试会重复副作用,全部放弃又丢掉能救的。

点开:看引擎怎么接住 ↻

接住:错误分三类(瞬时 / 永久 / 模糊),退避加抖动重试,所有适配器统一超时守护。

现场算

再点一下翻回去 ↻

危险命令 rm -rf

模型想跑一条会删东西的命令。

点开:看引擎怎么接住 ↻

接住:权限门按规则拦下,把「被拒绝」当作工具结果还给模型;模型通常换一条路,或者告诉你它办不到。

现场算

再点一下翻回去 ↻

凭幻觉改文件 Edit

没读过的文件就想改,改的是它想象中的内容。

点开:看引擎怎么接住 ↻

接住:先读后写硬校验:这个会话里没读过的文件,写入工具直接拒绝执行。在 Claude Code 里经常撞到的那条提示就是它。

现场算

再点一下翻回去 ↻

工具太多选错 80+ tools

几十个工具的完整定义全塞进每次请求,又贵又让模型频繁选错。

点开:看引擎怎么接住 ↻

接住:核心层常驻完整定义,其余只给名字和一句话;模型选中时拦截一次,注入完整定义再让它重调。

现场算

再点一下翻回去 ↻

没有 function calling 小模型 / 本地

模型根本不支持原生工具调用。

点开:看引擎怎么接住 ↻

接住:在提示里教它用 XML 写工具请求,引擎解析 XML 转成标准事件。质量下降,但不崩。

现场算

再点一下翻回去 ↻

循环是 1%,围着它的工程是 99%

每一张卡都是一个曾经让产品崩掉的下午。引擎的难点不在「能转起来」,在「转一千圈不出事」。白艾莉自述十万行代码里,大头就是这些。

六家引擎,骨架一样,差在把复杂度放哪。小红书「风儿轻轻er」10-14 那篇 570 赞的对照(外部自述,没有逐家核源码)概括得很准:

Pi求极简。循环只留几个回调,压缩、重试、路由都挂在外面
oh my pi重纠偏。插话能打断工具,加流内规则和重复调用拦截
Claude Code重外壳。循环很薄,读并行写串行,安全全交给权限模式与 hooks
Codex重沙箱。工具在流式输出里一出现就开跑,审批和升级重试收在编排器
DeepSeek Harness重日志。turn / step / attempt 三层状态机,每个边界写日志
OpenCode重持久化。输入、状态、Git 快照都落库,崩了接着跑

甲 · 借引擎

怎么做
壳调 Claude Code / Codex / agy / kimi 的 CLI,或 Claude Agent SDK
成本
零。作者所有的壳都是这条
限制
模型跟着引擎走;订阅条款面向个人使用,对外服务一般要走 API
etwin、TG bridge、dsh 都在这里。要 etwin 更像白艾莉,不需要换引擎,缺的是下一镜头那个规则层。

乙 · 现成开源引擎 + 自己的 key

怎么做
OpenAI Agents SDK、pi、smolagents 这类,接 deepseek / qwen
成本
一两天接通;以后跟它的升级
限制
那 99% 它替你做了一部分,剩下的仍要自己补
适合「想换模型、想自己掌握循环,但不想从零写」。

丙 · 自己写最小循环

怎么做
deepseek + 三个工具 + 一道权限问询,OpenAI 兼容格式
成本
跑通一个周末;可靠起来月级
限制
那 99% 全是你的
只有一个正当理由:搞懂引擎长什么样。产物当教材,别当产品。

三条路都通,该走哪条看需求

key 不是理由,需求才是。想懂,走丙的最小版,一个周末;想让 etwin 有自己的日子,走甲,加规则层;想对外卖,那是白艾莉的路;按它公开的条款和价目,收入主要来自模型中转和虚拟商品,不在引擎本身。

现在的 etwin

定时醒来launchd tick
模型读最近对话,决定 ping 还是 silentreply via CLI backend
发到 Telegram唯一的硬规则:/quiet 24h

它有「主动性」,但没有「生活」:它今天在哪、吃了什么、上周答应过你什么,全靠模型当场编,下次可能对不上。

加一层「世界状态」之后

模型提请求「今天去杭州,吃了龙井虾仁,买了件外套」
规则闸核验位置 · 余额 · 营业时间 · 交付时间
世界状态更新只有通过的才写进去
表达层只读转述 → 发到 Telegram渠道不变,还是同一个 bot

「有自己的日子」不是让它独立出去

要让 etwin 有自己的日子,是不是得给它单独的登录口?不是。它还挂在 TG 上,TG 只是渠道层,白艾莉的朋友圈、来信、微信桥也都是渠道。「有自己的日子」说的是中间多一块独立于模型的世界状态:它现在在哪、有什么、答应过什么,由规则判定哪些事真的发生了,模型只能提请求、只能转述通过了的事。

这就是「闸门是规则,决策是 LLM,上限是规则」。小红书上有人自己做「AI 版微信」,补上了人格文件、关系记忆、手机身体层和主动轮询,和 etwin 是同一代做法;再往前走一步,要补的就是这块规则层。

左右两栏里的判词、余额和转述,是本页自带的规则闸按左边那句请求当场算出来的。