Skip to content

Eve 框架参考与 Zhin.js 借鉴对比

基于 eve.dev 官方文档整理,供 Zhin 维护者作路线图输入。
插件作者面用法见 agent-authoring.md
架构决策ADR 0039(边界与 P0–P3 路线)。


第一章:Eve 核心概念速查

1.1 是什么

Eve 是在 TypeScript 项目里用普通文件构建持久化 Agent 的框架。核心理念是 filesystem-first:能力写在 agent/ 目录下,框架自动发现,无需维护独立注册表。

最小 Agent 只需两个文件:

  • agent/instructions.md — 常驻系统提示(身份、规则)
  • agent/agent.ts — 运行时配置(模型、压缩、限额等)

按需扩展 tools/skills/channels/connections/ 等。

1.2 项目布局(路径即身份)

路径解析为
agent/tools/get_weather.ts工具 get_weather
agent/skills/summarize.md技能 summarize
agent/connections/linear.ts连接 linear
agent/subagents/researcher/agent.ts子代理 researcher

子代理目录不继承根 Agent 的槽位;channels/schedules/ 仅根 Agent 可用。排查发现结果:eve info

1.3 消息与持久化流程

无论消息来自 Web、终端还是 Slack,流程一致:

  1. 通道将平台输入标准化为 user message
  2. 组装 instructions + skills + tools + 会话历史
  3. 模型循环(可调用工具、子代理)
  4. 持久化 session,流式输出 NDJSON 事件
  5. 通道按平台格式回传

持久化基于开源 Workflow SDK:支持跨进程重启、人工审批暂停、OAuth 等待、多日续聊。

三层结构:

  • Session — 整个 durable 会话
  • Turn — 一条用户消息触发的完整工作
  • Step — Turn 内的检查点(一次模型调用 + 其工具调用)

已完成 step 不重跑;中断中的 step 会重跑 → 非幂等副作用需 approval 或幂等设计。

1.4 核心构建块

Instructions — 每轮 prepend 的常驻提示;与 Skills(按需 load_skill 加载)相对。

ToolsdefineTool({ description, inputSchema, execute, approval?, toModelOutput? });在应用运行时执行(非沙箱),可访问 process.envctx 提供 sessiongetSandbox()getSkill()abortSignal 等。

默认 Harness 内置工具(可覆盖/禁用):

工具作用
bash, read/write_file, glob, grep沙箱文件/命令
web_fetch, todo, ask_question, agent, load_skill应用运行时
web_searchProvider 侧
connection_search发现 connection 工具

Sandbox — 单一隔离环境,cwd /workspace;可选 vercel/docker/microsandbox/justbash 等后端;支持 network policy 与凭证注入(密钥不进沙箱进程)。

Connections — MCP 或 OpenAPI 外部服务;模型通过 connection_search 发现,调用名如 linear__list_issues;凭证不进模型上下文。

Subagents — 内置 agent 工具(复制自身、共享沙箱)或 subagents/<name>/ 声明式专家(独立 sandbox/tools/skills)。

Channels — 平台边缘适配:标准化输入、持有 continuationToken、决定如何投递响应。默认 HTTP 通道 eveChannel() 暴露 /eve/v1/session*

HooksdefineHook 订阅流事件,仅观察,不能注入模型上下文。

Schedules — 根 Agent 定时任务;markdown 为 fire-and-forget;run handler 可通过 receive(channel, …) 跨通道投递。

defineDynamic — 按 session/turn/step 事件运行时解析 model、tools、skills、instructions(多租户/按用户差异化)。

defineState — 会话内 typed durable memory,get() / update()

1.5 HTTP 会话契约(双句柄)

句柄用途
continuationToken续聊、发 follow-up(channel 持有)
sessionId订阅事件流
bash
# 创建会话
POST /eve/v1/session  { sessionId, continuationToken }

# 订阅流(NDJSON)
GET /eve/v1/session/:sessionId/stream

# 续聊
POST /eve/v1/session/:sessionId  { continuationToken, message }

关键事件:session.startedturn.startedactions.requested / action.resultmessage.completedsession.waiting / session.completed;另有 input.requested(HITL)、authorization.required(OAuth)、subagent.called 等。

1.6 Human-in-the-loop

  • Approval:工具上 approval: always() | once() | never() 或自定义 policy
  • Questions:内置 ask_question,模型可暂停提问
  • 协议:input.requestedsession.waiting(durable park)→ 用户回答 → 原处恢复

1.7 认证(两套独立系统)

  • Route auth(入站):保护 HTTP session 路由;有序 auth walk,默认 fail-closed
  • Connection auth(出站):调用外部服务时;支持 app/user 凭证、交互式 OAuth

1.8 官方文档索引

主题链接
介绍https://eve.dev/docs/introduction
项目布局https://eve.dev/docs/reference/project-layout
快速开始https://eve.dev/docs/getting-started
agent.tshttps://eve.dev/docs/agent-config
Tools / Skills / Instructionshttps://eve.dev/docs/tools
Connections / Sandbox / Subagentshttps://eve.dev/docs/connections
Channelshttps://eve.dev/docs/channels/overview
Sessions & Streaminghttps://eve.dev/docs/concepts/sessions-runs-and-streaming
Execution & Durabilityhttps://eve.dev/docs/concepts/execution-model-and-durability
Default Harnesshttps://eve.dev/docs/concepts/default-harness
HITLhttps://eve.dev/docs/human-in-the-loop
Dynamic capabilitieshttps://eve.dev/docs/guides/dynamic-capabilities
Authhttps://eve.dev/docs/guides/auth-and-route-protection
Schedules / Deploymenthttps://eve.dev/docs/schedules

待补读:Frontend(useEveAgent)、TypeScript SDK(eve/client)、OpenAPI connections 子页、Security model、Observability、Evals。


第二章:Zhin.js 全栈对比矩阵

说明:

  • 建议优先级标注为「待维护者确认」。
  • 排除项:Vercel Connect、vercel() sandbox、Build Output、Agent Runs 等不要求 API parity,只借鉴可移植概念。
  • Zhin 现状列给出主要代码/文档路径,便于跳转。

2.1 创作面与发现

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
插件/agentagent/ 槽位表;路径即身份已对齐 Eve-style,见 agent-authoring.md;插件工具带前缀如 lottery_synczhin agent info 维护者诊断保留 Zhin 插件前缀命名(多插件共存)
工作区 Agentagents/<name>/examples/test-bot/agents/<name>/ + agent.ts + instructions.md文档化 workspace agent 与插件 agent 命名差异保留
模型配置agent.tsmodel 必填(有文件时)zhin.config.ymlai不搬到 agent.ts;可选在 agent.ts 声明 strategy/identity -only保留 config 集中管理
诊断eve info + .eve/ 编译产物discoverPluginAgentSurface;无统一 CLI info增加维护者向 zhin packages agent-surface 或类似命令借鉴思路P2
Evalsevals/*.eval.ts插件可有 evals/;框架级 eval 分散统一 eval 发现与 CI 入口文档借鉴P2
Harness 禁用disableTool() sentineldefineAgent({ disallowedTools: [disableTool('bash')] })已实现(ADR 0039 P2)借鉴
诊断eve info + .eve/ 编译产物zhin agent info已实现(ADR 0039 P2)借鉴思路

2.2 Tools

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
定义 APIdefineTool + Zod inputSchema@zhin.js/agent/toolsdefineTool + Zod已对齐;补充 outputSchema 文档保留
运行位置应用运行时;沙箱经 ctx.getSandbox()多数工具在 agent 运行时;bash/read 等走 sandbox文档明确「authoring tool vs sandbox tool」边界借鉴表述P1
Approvalper-tool approval: always/once/neverdefineTool({ approval }) + runToolApprovalGate;与 ExecPolicy / Owner confirm 叠加已实现(ADR 0039 P1)保留 ExecPolicy 叠加
模型可见输出toModelOutputdefineTool({ toModelOutput }) + applyToolToModelOutput已实现(ADR 0039 P1)借鉴
Replay 语义完成 step 不重跑;中断 step 重跑Turn 级处理;无 Workflow step 边界文档化幂等要求;长期对齐 step 语义概念借鉴P2
内置工具harness 表(bash/todo/ask_question/…)web_searchask_user;bash/read/edit 等 builtin对照表写入 agent-authoring;缺啥补啥保留 Zhin ExecPolicy 包装P1

2.3 Skills

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
加载模型load_skill 渐进披露discoverload_skill + SKILL_DISCLOSURE_* 规范已实现(ADR 0039 P1)借鉴
标准Agent Skills SKILL.md支持 .md + 遗留 skills/SKILL.md迁移指南已存在;强化 description frontmatter保留 双路径过渡P1
作用域每 agent 独立插件/workspace 分 scope;orchestrator 按 agentId文档化 scope 规则保留 IM 多 agent 路由

2.4 Connections(MCP / 外部服务)

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
发现agent/connections/*.ts插件 agent/connections/ + McpRegistry已对齐文件化保留
工具命名linear__list_issues{connection}__{tool} + McpRegistry.listQualifiedTools()已实现(ADR 0039 P1);legacy mcp_* 仅解析保留
OpenAPIdefineOpenAPIConnection无一等 OpenAPI connection评估是否需要;非 IM 核心可 P3按需P3
Authapp/user、getToken、交互 OAuth + 事件authorization.required/completed + Host POST /zhin/v1/authorization/:id/complete已实现(ADR 0039 P1)概念借鉴
凭证隔离token 不进 history/模型MCP clean env;audit强化文档与 harness 检查保留 并加强P1

2.5 Sandbox

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
抽象多 backend + defaultBackend()security/sandbox.tssandbox-docker.ts文档见 agent-authoring Sandbox 节借鉴
Network policyallow-list / deny-all / transformnetwork-policy.ts对照 Eve 域名级策略与 credential brokering借鉴P2
Workspace seedagent/sandbox/workspace/**无标准 agent 槽位 seed可选 agent/sandbox/workspace/ 约定借鉴P3
作者 APIctx.getSandbox() 统一bash-tool 等分散调用authoring execute 暴露一致 ctx借鉴P2

2.6 Subagents

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
内置复制agent 工具,共享沙箱SubagentSystemspawn_task文档化「复制 vs 专家」两种模式保留 Zhin 协作场景P1
声明式subagents/<name>/ 不继承根槽位agent/subagents/ 已支持强化「不继承」规则与 description 必填已对齐
深度限制maxSubagentDepth配置分散集中到 agent config借鉴P2
子 session 流subagent.called + child stream子 agent 结果回传 IMHost/Console 暴露 child session 订阅借鉴P2

2.7 Hooks 与事件流

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
HooksdefineHook 订阅 NDJSON 事件AgentStreamBus → HookSink + HookRegistryprocess-stream 单次映射 TurnEventP0 ✓ Bus 统一 egress(ADR 0041)借鉴P0 ✓
语义observe-onlyhooks 多种用途文档区分 observe vs 改 prompt借鉴P1
顺序channel → persist → hooks → dynamic分散在 turn pipeline明确 pipeline 阶段图借鉴P1

2.8 Session、流式与持久化

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
持久化Workflow SDK step checkpointDB session + memory;HTTP JSON 快照(ADR 0040)P3 已实现 Host 文件持久化 + step 事件;IM 侧不变长期借鉴
HTTP 契约/eve/v1/session + NDJSONGET/POST /zhin/v1/session* + NDJSON stream(ADR 0039 P0)定义 Zhin 稳定 session/stream API(可不同路径)借鉴P0 ✓
双句柄continuationToken vs sessionIdIM Message 会话;continuation 概念弱Console/SDK 明确两句柄借鉴P0
消息队列非 FIFO;等 session.waitingInboundTurnQueue 合并同会话文档化与 Eve 差异;channel 层可选队列保留 IM 合并策略P1
Compactionharness 默认 0.9 threshold@zhin.js/ai compaction已具备;对齐配置文档保留

2.9 Human-in-the-loop

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
提问ask_questionask_userask-user-tool.ts概念已对齐保留 IM 适配
Approvalper-tool + input.requestedpendingInputs reducer + runToolApprovalGate已实现(ADR 0039 P1)借鉴
Park/resumedurable session.waitingHTTP POST .../input + 文件快照(ADR 0040);IM 仍走 LoginAssist 等P3 已实现(HTTP 路径);跨重启 mid-turn 见 ADR 0040 D5概念借鉴

2.10 Channels vs Adapters

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
抽象Channel 持 continuationTokenAdapter + Endpoint + $reply 发送链不替换 IM 栈;借鉴「通道持 resume 句柄」分离保留 Adapter 架构
HTTP默认 eveChannelHost routerHost 提供等效 session 路由借鉴P0
平台Slack/Discord/… 一等 channelplugins/adapters/* 成熟互鉴卡片/Block Kit 构建方式保留 Zhin adapters
Route authauth walk on channelHost Bearer/CORS文档化 fail-closed 与 helper 列表借鉴P1

2.11 Host / Console / SDK

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
前端useEveAgent@zhin.js/client startAgentSession / subscribeAgentStreamstream reducer 对齐 Eve 事件集子集借鉴P0 ✓
SDKeve/client无对等 npm 包@zhin.js/console-contract 或 thin client借鉴P1
InspectGET /eve/v1/infoGET /zhin/v1/info + zhin agent info已实现(ADR 0039 P2)借鉴

2.12 Schedules

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
定义defineSchedule + cron插件 agent/schedules/已对齐保留
投递receive(channel, { message, target, auth: appAuth })deliverScheduleToAdapter + proactive outbound已实现(ADR 0039 P1)保留 IM 链
Dev 触发POST .../dev/schedules/:id依赖 Cron/手动dev-only 一次性 dispatch 路由借鉴P2

2.13 Dynamic 与 State

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
defineDynamic按 auth/tenant 解析 tools/skills/instructionsagent/dynamic.ts + applyDynamicTurnOverrides已实现(ADR 0039 P2)借鉴
defineState会话内 durable KVagent/state/*.ts + getAgentState / updateAgentState已实现(内存 per session)借鉴

2.14 安全与策略

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
Execsandbox + approvalExecPolicy 5 层 + audit保留 Zhin harness;补 per-tool approval保留 ExecPolicyP1
Filesandbox FSFilePolicy 4 层保留;与 read-before-write 对齐文档保留
网络sandbox networkPolicynetwork-policy.ts借鉴 domain allow-list 表述互补P2

2.15 脚手架与安装分层

层级Eve 做法Zhin 现状借鉴建议保留/替换建议优先级
初始化npx eve initpnpm create zhin-app / zhin setupwizard 增加 agent/ 模板与首工具借鉴 UXP2
安装体积分层单包 eveIM 核心 + 可选 @zhin.js/agent(ADR 0019)不合并;Eve 一体化 vs Zhin 分层是 deliberate保留 ADR 0019

第三章:建议路线图优先级

P0 状态(2026-07-12):已在 @zhin.js/ai@zhin.js/contract@zhin.js/client@zhin.js/agent@zhin.js/host-api 落地。P1 核心项(2026-07-12):approval、toModelOutput、MCP qualified 名、OAuth 事件、schedule 投递、skills 披露、Console reducer 已闭合。P2(2026-07-12)disableToolzhin agent infodefineDynamic/defineState、sandbox 文档、GET /zhin/v1/info 已闭合。P3(2026-07-12):HTTP step checkpoint 文件持久化、session.waiting mid-turn park(reason: parked|idle)、POST .../input 已闭合(见 ADR 0040)。仍待:P1 route auth 文档、hooks 管线图、thin SDK 发布面、P2 dev schedule 路由。

依赖关系简图:

优先级主题理由
P0统一 turn/stream 事件词汇;Host 稳定 session/stream API;Console 消费契约不改持久化引擎也能提升可观测性与 SDK/控制台一致性
P1per-tool approval;connection OAuth 事件toModelOutput;qualified MCP 工具名;schedule→channel 投递作者体验与安全声明式配置;IM 富消息与模型上下文分离
P2disableToolzhin agent info;defineDynamic/defineState;sandbox backend 文档化多租户与运维向能力
P3HTTP step 持久化与 session.waiting park(`reason: parkedidle`)

第四章:Zhin 应保持的差异化(不宜照搬 Eve)

  1. IM-first 发送链Message.$reply / Adapter.sendMessage,不要用 Eve channel 替换 Adapter。
  2. 模型在 zhin.config.yml — 运维/多环境友好,不强制迁入 agent.ts
  3. @zhin.js/agent 可选 peer — 安装体积与 Stable/L4 分档(ADR 0019)。
  4. ExecPolicy / FilePolicy — 比 Eve 更贴 IM 群管/Owner 场景;与 per-tool approval 互补而非替换。
  5. 插件工具前缀 — 多插件共存下的命名空间,优于 Eve 单 app 裸 slug。
  6. Vercel 专有栈 — Connect、vercel sandbox、Build Output 等仅借鉴概念,用 Zhin Host + 自托管 sandbox 实现。

修订记录

  • 2026-07-12:P3 实现闭合 — mid-turn session.waitingreason: parked)、idle 续聊(reason: idle)、ADR 0040 文件持久化。
  • 2026-07-12:P0 实现闭合 — contract agent-stream、agent HTTP session store、/zhin/v1 Host 路由(见 ADR 0039 实现追踪)。
  • 2026-07-12:初版,基于 eve.dev 文档抓取与 Zhin 代码库对照(agent-authoring、orchestrator、host、security)。