@everme/代理服务器
这个 createToolEventBuffer 工具池保存完整的序列化输入
输出字段, 包括空字符串; 它不应用普通消息
8000-特征预算. 它现有的文件总大小政策没有改变. 主机
在附加事件之前,必须验证其本地工具合同.
每个 EverMe AI 代理插件的共享核心 . 主机不可知论 - 与EverMe网关进行会谈/api/v1/mem/* +前标 + S3多段)而无别. Per-host关注(MCP框架,OpenClaw生命周期,克洛德代码钩子. )生活在自己的包中并依赖于这个SDK.
为什么会这样
EverMe每个AI代理主机一个插件,这样每个插件就可以独立地进行:
| 软件包 | 东道主 | 格式 |
|---|---|---|
@everme/memory-mcp | 光标 / Cline / 通用 MCP 主机 | MCP 服务器( stdio / JSON- RPC) |
@everme/openclaw | 打开Claw | 环境引擎插件( 在进程模块) |
@everme/claude-code | 克劳德代码 | 本地插件( 呼克 + 命令 + 技能 + MCP) |
如果没有一个共享的 SDK 插件,每个插件将会重新执行 EverMe 有线协议——复制编辑、搜索/文本塑造、代理-记忆书写,以及每个插件中不可避免的错误。 SDK是"如何与EverMe网关交谈"的单一真理来源,而每个主机插件都是上方的薄适配器.
出口
import {
// HTTP layer
createClient, EvermeError, redactError,
// Agent-memory realtime writes
saveAgentMemory, AGENT_MEMORY_ROLES, AGENT_MEMORY_TOOL_CALL_TYPES,
// Search / context
searchMemory, getContext,
// Config (env + host-config merge)
resolveConfig, assertConfigUsable, TIMEOUT_MS, UPLOAD_TIMEOUT_MS,
// Prompt helpers
buildMemoryPrompt, MEMORY_TYPES, MEMORY_TYPE_LABELS,
// Message helpers
extractText, toText, stripChannelMetadata, isSessionResetPrompt,
} from "@everme/agent-sdk";
电线合同
POST /api/v1/mem/search → {items, profiles, rawMessages, agentMemory}
POST /api/v1/mem/context → {profile, cachedAt, generatedAt} // body: { forceRefresh?: bool }
POST /api/v1/mem/agent-memory → {status, messageCount, flushed}
认证 : Authorization: Bearer <emk_*|evt_*>。 。 。 .
每个终点的信封如下:
{ error, requestId, status, result } // status === 0 → success, return result
写入同步合同 : /mem/agent-memory 接受 flush (同步添加于
每批+取出冲)和 sync (仅同步添加,无冲出).
saveAgentMemory 套装 sync: true 提出多项要求的主要请求
上传其冲出最后的要求,所以早期的批次保留
同步添加保证. 钩子运行时间也设定 sync: true 每页
排队,所以检查站和后来的地盘/地盘冲出完成
增加而不是仅仅是一项被接受的同步工作。 直接 SDK 呼叫器可以
选择此选项 sync: true; 平面 flush: false 电话保持同步.
此命令保证需要一个网关支持现有的 sync
字段; 忽略它不能提供保证的旧服务器. flushed 打开
结果意味着冲出.. status 编号 : extracted 这是
实现信号,以及 status: "no_extraction" 是指上游地区
排入会话时尚未取出 .
上传超过 500 个信件按源顺序分割, 倾向于完成 转动,然后是完整的工具调用/结果组,然后是硬信息限制. 工具结果文本不会被共享作者限制为8000个字符; 主机侧剖析/重排仍然适用。 普通用户/助理文本和 个人记忆文本保留其现有的预算。 服务器请求大小限制 工具结果必须保持一个信息,而不是若干信息 相同识别结果碎片.
用户和助理文本保留文字协议实例、元数据引用和时间戳;
共享写入器不将这些字符串当作用户频道信封.
这既适用于代理记忆,也适用于个人记忆。 主机适配器
继续负责排除使用本地控制记录的实际控制记录
源结构. 现有的空地正常化和文本预算依然存在.
extractText 提供纯文本提取,而不包含信封高压
主机写入适配器 . toText 财务报告和审定财务报表 stripChannelMetadata 保留现有的
查询- 规范化行为; 它们不能重新分类本地对话文本 .
当用户/ 新建时, 助理信件才会关闭转折 turnId, (中文(简体) ),
或适配器供应时 turnComplete: true,而且没有待拨电话.
明确 turnComplete: false 标记评论或执行记录
防止这些记录被用作收尾.
仅用完投入并不能证明完成. turnId 仍为地方.
明显的布尔 turnComplete 助理信件也发送到
EverMe网关使得其以字节为基础的批量可以使用同源证据.
网关会消耗此可选字段而不转发到 EverOS.
年长的客户忽略它并保持他们现有的行为;年长的网关忽略
因此,它不会得到这一字节的改进。 强制分割
保存实际信息而不产生缺失结果或结尾.
请求代号合同: createClient 每个请求生成一个UUID并发送
作为 requestId 页眉; 网关重新使用有效的输入值, 所以插件
stderr, EverMe ELK,和云平台的日志搜索都在一个ID上加入.
client.requestWithMeta(...) 决定: { result, requestId }; 包装
帮助者( e)searchMemory 编号 : getContext 编号 : saveAgentMemory 编号 :
savePersonalMemory在结果上显示同样的标识,以及 EvermeError
带着它err.requestId由 err.describe() 编号 :
describeError(err)) (中文(简体) ).
工具结果内容被转换为带有前导/后导白空间的文本 已修剪, 但频道元数据模式没有被删除: 工具输出可以 包含字面协议示例、日志时间戳或信件ID。 一样 文字内容规则适用于上述用户和助理信息.
适配器转弯边界
写入的适配器 readStoreBatches 必须说一个钩子
引用是一个合乎逻辑的转折:
export const myAdapter = { platform: "my-host", turnBoundary: "stop", /* ... */ };
与 turnBoundary: "stop" sDK索赔 channel: "hook" 每个批次
a 停止并宣布 turns: 1 最后一批(早期批次携带) turns: 0, (中文(简体) ),
这使得主机的写作在 L1-2 捕捉完成
分母 。 在会话尾端上传的整会话主机保留它 :
他们不运行每个回合的交货标记,不能报告掉落的转弯,并且不能
输入他们永远无法触及的损失分母。 简单
readLastTurn 路径总是要求通道;它通过建造而倒转.
信封文件优先级
共享钩子运行时间合并主机 everme.env 输入进程内。 文件值从不覆盖在 shell 中已经设置的变量 - 除外 EVERME_AGENT_TOKEN 财务报告和审定财务报表 EVERME_AGENT_ID,文件获胜的地方。 这种不对称是故意的: evercli 通过重写旋转每台机器 evt 令牌 everme.env,且在外壳中导出的一个 steal sorder 绝不能阴影旋转的证书.
设备路径( 本地内存)
EverMe 桌面写入 ~/.everme/memory/route.json 当用户打开本地内存( w)$EVERME_MEMORY_HOME/route.json 当它被设定的时候。 虽然它说 local, (中文(简体) ), createClient 将每个请求发送到它的回回网关,不管什么 apiBase 编号 : EVERME_API_BASE 说 文件每个请求都会被读取,所以长寿的主机(OpenClaw,MCP服务器)跟随一个切换而无需重启. 它失败关闭: 无法读取、 腐败或关闭的路由仍然意味着默认网关(http://127.0.0.1:18790) (中文(简体) ). 一个已停止的网关以提示失败请求打开 EverMe 桌面;客户端永远不会倒入云中.
货币/安全合同
- 重试数字 :
execWithRetry重复一次运输故障——但仅限于GET/HEAD. POST写道(/mem/agent-memory)表面显示传输错误,以便呼叫者可以决定;在中空投放后重试一个POST可以重复写作. - 编辑数字 :
redactError洗涤器evt_*, (中文(简体) ),emk_*, (中文(简体) ),X-Amz-Signature/Credential/Security-Token,并且 AWS 访问密钥标识 。 在传递到主机 stderr / 模型上下文之前, 应用到每个错误槽 . - 超时数字 :
EvermeError{type:"timeout"}被抛出,所以呼叫者可以在其上分取(例如被降解为倒回),而不是重新试验,仿佛它是一个运输机。 读出身体的超时性也会被抓住——被卡住的身体不再沉默地描述为:null。 。 。 .
测试
npm test
封面为 HTTP 信封, 重试 Gating, 配置优先级, 消息正常化, 代理- 记忆塑造 .
许可证
阿帕奇 - 2.0
任务意识批量
saveAgentMemory 接受可选 syncScope 为原生片段的进步.
范围写入检查 /mem/agent-memory/state 在发送任何批次前: 钩
写入需要 hookSyncScopeSupported: true,导入写入需要
syncScopeSupported: true。所有批次都保留范围;旧服务器失败
不写。 未瞄准的呼叫和单独的会话冲出保留其原始
协议。 这个字段不会改变上游对话的特性和
无法与 deduplication。 。 。 .
saveAgentMemory ưμ㼯a deduplication: "client-native-id"
每批装有后端保护的钩子上
QuenWork, OpenClaw, Pi and ZeroClaw). 维基文库中相关的原始文献: 维基语录链接:名人名言 - 文学作品 - 谚语 - 谚语 - 谚语 - 谚语 - 谚语 它需要一个支持服务器,
channel: "hook",没有 offline。写作也可以携带 baseTurn 改为
锚起转水印. 服务器拒绝其他值和组合. 这个
默认保留位置 。 本地ID 选择为客户端所有; 服务器绕过位置
水印而不是存储每个消息的身份。 它不能保证
交叉通道分解或完全重复 POST 重试。 记名检查站
commit(stateId, uploadedCount, { nativeMessageIds }) 持续本地可选
身份密钥仅在成功上传后;仅计数的调用者不变.
saveAgentMemory 接受可选 taskBatching: true; 接钩适配器选择使用
拥有同样的财产。 目前只有Codex允许. 其他打电话者保留
现有的分批路径。 这是本地的SDK选项,从来不是电线场.
战略规划用户任务,保留匹配原始结果,压缩 仅用 KiB UTF-8 工具结果预算进行字节超标的任务,然后拆分 其余为文本/空白/硬边界优先权。 它用64个KB软 目标,280 KiB消息预算 和500个消息封顶。 它保存消息计数, 命令和源元数据,所以 BaseTurn/turns 和 main-batch slush 行为停止 上传路径。 硬倒置并不能保证关闭的任务.