@zackbart / connecta-eve
将Eve代理连接到Connecta代理池并加载其端点指令
每回合一次。助手运行在《Eve》应用中;Connecta服务器
单独运行。否 @zackbart/connecta 依赖项由这个包安装。
需要 节点24 + 和 夏娃1.0.0-rc.1。开发和消费者 检查使用确切的发布候选版本。在RC期间对端保持固定状态 期;以后的候选版本和稳定版1.0需要进行兼容性检查。助手 版本共享Connecta的版本和标签;选择helper版本匹配 您的服务器版本。
安装并添加两个文件
npm install @zackbart/connecta-eve [email protected]
服务器必须声明您的代理,将其承认到指定池并发出其 代理牌。看到Connecta 代理令牌设置.
在Eve应用的环境中设置这些:
CONNECTA_URL=https://connecta.example.com
CONNECTA_ACCESS_TOKEN=cta_your_agent_token
创建 agent/connections/connecta.ts:
import { connectaConnection } from "@zackbart/connecta-eve";
export default connectaConnection({
pool: "assistant",
description: "Shared CRM and tickets for the assistant.",
});
创建 agent/instructions/connecta.ts:
import { connectaInstructions } from "@zackbart/connecta-eve";
export default connectaInstructions({ pool: "assistant" });
两家工厂都接受 url 覆盖 CONNECTA_URL. 与 pool, URL为
<url>/agent/<pool>; 没有 pool,提供完整的端点URL。池
名称必须匹配 [a-z0-9_-]+. connectaEndpoint({ url, pool }) 返回相同的值
其他客户端的URL。保持两个文件指向相同的端点和令牌
源。
Auth是应用程序所有的。默认令牌来自 CONNECTA_ACCESS_TOKEN,读
同样针对每个请求,因此旋转不需要重新启动进程。一个 getToken
Callback可以返回一个字符串或一个promise;它凌驾于环境之上。
不转发用户的身份信息。
在运行时选择池
当池依赖于聊天器时,将相同的选择器传递给两个工厂。
例如,一个应用程序设置信任 direct 通道元数据可以保留其
选择固定为一个回合:
import type { DynamicContext } from "eve/connections";
export const selectPool = (ctx: DynamicContext) =>
ctx.memo(["connecta-pool", ctx.turn?.id ?? null], () =>
ctx.channel.metadata.direct === true && ctx.session.auth.current?.principalId === "alice"
? "notes_alice"
: "assistant",
);
使用 pool: selectPool 在这两个 connectaConnection 和 connectaInstructions.
Eve在每次模型调用之前评估动态连接;所选
游泳池是它的。 instanceKey,因此暂停的呼叫不能对已更改的呼叫进行重放
池。字符串仍然创建相同的静态连接。
两个工厂都独立调用选择器。帮助者从不记住它
结果。记忆选择器I/O ctx.memo 对你的保单终生有效
连接和说明一致,重复评估避免重复
查找。每个定义都有一个作用域备忘录,因此两个工厂各自执行
它们的第一次查找。转向键固定了该回合的每个选择;省略备忘录
每次评估都要重新选择。确保两个查找都使用一致的
应用程序拥有的策略数据。
每个选定的名称必须匹配 [a-z0-9_-]+。抛出选择器或无效选择器
即使在缓存指南时,Name也会失败。处理查找失败
您的选择器,如果它应该返回到最低特权池。
升级到Eve 1.0 RC
更新应用程序到 [email protected] 并重新安装以刷新其锁定文件。
helper的连接、动态池、指令和审批api都使用Eve的api
稳定的入口点,并且不需要对这个RC进行创作更改。夏娃的
1.0稳定性策略
不包括 experimental 字段或内部模块。
从0.90开始,回顾介入
发布说明:
session.clear() 现在取消运行的回合和任务,以及对象形式的连接
现在在运行时保留批准。RC.1也要求 @vercel/connect
^2.7.0 当安装了可选集成时;旧版本的Connect
拒绝预发布的Eve peer。
对于旧的应用程序,请遵循Eve的 升级到1.0 事件消费者指南、保存的历史记录、扩展和客户端api。 在部署应用程序之前构建并测试它。helper不迁移这些 app-owned表面。
从Eve 0.86升级
Eve 0.88.1和之后的版本pin undici 8.12.3,所以应用程序不再需要自己的undici
覆盖。删除 "eve": { "undici": "8.12.3" } 从一个NPM应用的 overrides,或者
"[email protected]>undici": "8.12.3" 从一个PNPM应用的 pnpm-workspace.yaml,然后
重新安装,提交锁文件并审计应用程序。服务器的可选undici
6.29.1 peer是一个单独的依赖,并保持其确切的pin。
《Eve》0.87到0.90也改变了助手不拥有的应用代码。审查每一个 中间释放 Eve 0.90.0的更新日志; 《星战前夜》0.84或0.85版本的应用也必须审查这些版本。显著的变化:
- 构建拒绝非Eve自己的工厂创建的连接定义,并且
defineDynamic()值是不透明的(0.87)。connectaConnection()和connectaInstructions()已经返回由夏娃的工厂制造的值。 - 几个客户端、工作流和通道api发生了变化(0.87)。
- Grant-bearing
vercelOidc身份验证就eveVercelOidc, auth回调那个 返回allowToolStubs成为EveAuthFn,/info访问受限 (0.90)。Identity-onlyvercelOidc()调用不需要重命名。
在部署应用之前,在新的Eve上构建和测试应用。
批准和写作
默认策略是Eve的 never():授权写无人值守。使用一个
read-only连接池时,代理必须永远不写。对于交互式的
剂,添加 gateWrites: true 要在连接前请求用户批准
任何工具 readOnlyHint 不是 true,包括可写的 execute_code.
gateConnectaWrites 导出该策略以进行组合。明确的夏娃
approval策略或审批配置优先于
gateWrites.
gate使用主机缓存的注释。如果读变成写之前 调度时,Connecta采用当前的分类;可写池可以 在没有新的批准的情况下执行写入。只读池拒绝。
端点指令
说明使用 server/discover (MCP 2026-07-28),退回到传统
initialize 当发现返回没有指导的响应时,包括
非ok状态或不支持的方法响应。网络错误和超时
永远不要触发初始化。JSON和SSE回复都可以接受。每个请求
有5秒的暂停时间。每次成功的引导被缓存10分钟
每个解析器中的端点; ttlMs 覆盖该持续时间。夏娃评估
每次模型调用前的说明;帮助器为每个端点保留一个结果
然后提交Eve的备忘录,最多刷新一次端点
备忘录被保留。交换池选择端点的指导,而不是
前池的。刷新失败将保留该端点的最后一个副本或添加
如果没有成功,则不执行任何操作,并等待30秒后重试。其他
端点保留自己的TTL和后退。Eve只保留了玩家使用的备忘键
最新的评估;如果缓存过期,返回到池可以再次刷新。
当Eve取消一次求值时,helper会重新抛出取消的消息,而不是
将其视为失败:没有为该回合保留任何内容,也没有等待开始。
工具仍然可用。指令不授予访问权限。
集 clientName 在 connectaInstructions 在服务器中识别其请求
日志;默认值为 connecta-eve-instructions.
Vercel OIDC令牌源
这种变体需要 connecta0.35.0或更高版本 使用Vercel进行部署 为此代理配置的工作负载准入。添加了工作量准入 # 975 并且从0.35.0开始可用。 早期版本需要代理令牌。 配置后,使用Vercel的令牌解析器 两个 文件:
import { getVercelOidcToken } from "@vercel/oidc";
import { connectaConnection } from "@zackbart/connecta-eve";
export default connectaConnection({
pool: "assistant",
description: "Shared CRM and tickets for the assistant.",
getToken: getVercelOidcToken,
});
import { getVercelOidcToken } from "@vercel/oidc";
import { connectaInstructions } from "@zackbart/connecta-eve";
export default connectaInstructions({ pool: "assistant", getToken: getVercelOidcToken });
安装 @vercel/oidc 在《星战前夜》应用中使用这种变体时。帮手没有
依赖于它,并且永远不会自动切换凭证类型。
使用默认的工作负载受众:Connecta拒绝为a交换令牌
即使维塞尔签下了他们。
贡献者的验证
在安装了依赖项并构建了两个包的源代码签出中,运行
pnpm --filter @zackbart/connecta-eve run probe:catalog --output /absolute/path/outside/checkout
在节点24上。这启动真正的Eve 1.0.0-rc。1 .用一个打包好的,安装好的助手对抗
的40、100、250、500和1000个下游工具的种子本地目录
元、本机和本机加代码界面。本地列表包括三个
连接超出下游数量的工具。必须有一个包含1001个工具的本地目录
拒绝清单。 --counts 40,1000 选择一个较小的矩阵。
该探针使用带有确定性局部的Eve的公共语言模型接口 运输,没有型号证书或付费电话。它测量建筑, 冷发现和热发现、模式和结果字节、调用计数、并发调用 隔离、有界结果分页和进程内存。新子进程 分离每个基质细胞;Eve启动与回合延迟是分开的。报告 保留实际的Eve事件和传输输入。令牌使用和模型任务 质量仍然无法衡量;这些结果建立了局部运行时契约, 不是实时Vercel工作负载准入或生产模型性能。
对于一次性工作负载检查,请使用 贡献者夹具配方 从一个来源 结账。它的准备命令打包并安装当前的核心/助手, 检查本地签名控件和取消,并且不创建活动资源。 实时执行需要单独的所有者对具体账户进行授权, 项目、界限、成本上限和清理。把证据放在收银台外。