@ agentium/ 痛苦
从明确的能力、政策和驱动力建立代理执行环境的开发者工具包. HarnessRuntime 拥有组成,范围资源,犬话谈话状态,总预算,事件和清理. 核心 Agent 拥有普通模型/工具执行并消耗中性 ExecutionServices 端口;它不构造一个吊带或依赖于此套件.
定义可以贡献出工具,源上下文,即时碎片和订购的中间软件. 定义、扩展和检查是同步的,没有进行文件系统扫描、提供者呼叫或客户端初始化。 装订和执行从运行时间开始.
这个 可靠性指南 显示三种完整的路径:普通代理、在使用赠款/预算下相同的配置,以及经核实的完成和评价的可选证据连续性。 它还确定了资源所有权、来源信任、不完全结果、储存迁移和回收限度.
这个 执行图表指南 包括有栅栏的图恢复、共享根输入、经核准的工具DAG规划以及仅待流修订.
建设和使用
安装匹配版本 @agentium/core 财务报告和审定财务报表 @agentium/harness,加上你选择的供应商SDK。 此软件包没有需要的浏览器,队列或提供者SDK依赖性. 无害环境管理和共同JS出口暴露出相同的API。 在这个工作区:
npm run build:core
npm run build:harness
使用驱动程序和明确的主机赠款定义:
import { agentDriver, HarnessRuntime, research } from "@agentium/harness";
// model is the application's existing ModelProvider.
const definition = research({
text: {
id: "project-notes",
entries: [{ id: "scope", text: "The project investigates shipping delays.", uri: "notes:project" }],
},
});
const runtime = new HarnessRuntime({
definition,
driver: agentDriver({
name: "research-assistant", model,
instructions: "Answer questions using the supplied sources and cite them.",
}),
grants: { toolIds: [], modelRoles: ["main"] },
budgets: { maxModelCalls: 4, maxToolCalls: 0, maxTokens: 8000 },
});
const result = await runtime.run("What is this project investigating?", {
identity: { tenantId: verifiedTenant, userId: verifiedActor },
sessionId: "research-42",
});
research 不进行隐含的网络搜索。 文本和文件被标记为源数据. 搜索和商务工具来自主机,在模型使用之前必须授予它们的名字. 身份来源于信任的应用程序认证,从不模式输入.
代理所有权和配置
agentDriver(config) 创建一个运行中的代理,在核心之外应用定义默认,并在该运行中在整个后续和完成修改中重复使用该实例。 不同的运行得到不同的代理。 运行时间关闭自有代理在自有工作后结算一次;清理故障为诊断性故障,不取而代之为主故障. 提供主机的后援商店仍被借入,不由该司机关闭.
agentDriver(existingAgent) 借用已经配置的代理 。 宿主所闭. 对被借用的 Agent 有代理默认或限制的定义被拒绝:选择一个配置所有者. 如果借款人的定义没有违约或限制,则借款人仍可获得债务、定期赠款、预算和政策.
明确的代理配置超越定义默认值,包括 false 以禁用一个特性。 定义限制上限配置代理工具回合和子深度; 运行时间 budgets 各代表之间独立捆绑的汇总模型/工具/托盘使用和修订. projectRoot 被运行时间所抓住并解决相对的工作空间和技能路径。 可移动的显示路径仍然相对散列.
Canonical的谈话属于运行时间的会话商店. Agent适配器通过中性执行服务端口提供历史,并使用ephemeral Agent会话语义,避免重复会话持久性或自动内存提取. 明确的内存工具和常备笔记是独立的能力. 运行中的租户/用户身份不会自动给任意主机存储客户端取名:提供租户/演员范围商店和客户端,并与主机保持关闭状态.
从Agent.deep的明显迁移
Agent.deep(), (中文(简体) ), AgentConfig.harness, (中文(简体) ), harnessOptions,探员 replaceTools,则 legacyDeep 预设被删除。 没有隐藏替换预设 。 旧的选择可以写成一个普通的定义,然后单独调整或删除:
import { InMemoryStorage } from "@agentium/core";
import { agentDriver, defineHarness, HarnessRuntime } from "@agentium/harness";
// One approved tenant/actor's backing storage. InMemoryStorage is not durable.
// For persistence, supply your host-owned storage scoped to that tenant/actor.
const tenantStorage = new InMemoryStorage();
const definition = defineHarness({
id: "project-agent",
defaults: {
workspace: { path: ".", mode: "write" }, // Explicit host-disk write access.
skillDirs: ["skills"],
contextFiles: true,
filesystem: true, // Virtual files, not the host disk.
subagents: true,
fileMemory: true,
searchPastSessions: true,
},
limits: { toolRoundtrips: 10, maxChildDepth: 2 },
});
const runtime = new HarnessRuntime({
definition,
projectRoot: "/srv/approved-project",
driver: agentDriver({
name: "project-agent", model,
// Standing notes and virtual files reuse this explicit backing store.
// Automatic Agent session storage/extraction is disabled during controlled runs.
memory: { storage: tenantStorage, summaries: false },
}),
grants: {
toolIds: [
"fs_read_file", "fs_list_directory", "fs_file_info", "fs_write_file",
"list_skills", "get_skill_instructions", "get_skill_reference",
"agent_fs_write", "agent_fs_read", "agent_fs_list", "agent_fs_search",
"memory", "task", "search_past_sessions",
],
modelRoles: ["main"],
},
budgets: { maxModelCalls: 12, maxToolCalls: 20, maxTokens: 16000 },
executionPolicy: hostPolicy,
});
await runtime.run("Inspect the project", {
identity: { tenantId: verifiedTenant, userId: verifiedActor },
sessionId: "project-session",
});
// Close tenantStorage only when its host scope has finished using it.
给 model, (中文(简体) ), hostPolicy 并且核实的身份是应用程序的依赖性。 定义复制了前一个特性选项, 而非隐含权限: 删除 fs_write_file 赠款或使用 mode: "read" 当写作是不必要的。 Core 拒绝字符串工作空间 。 主机-文件封禁检查静态路径出逃;对敌对并发的文件系统突变使用OS隔离.
没有明确共享存储,配置的 Agent 虚拟文件系统和文件内存每跑都新鲜. 由于上述范围存储,常备笔记和虚拟文件在随后运行的Agent实例中幸存. search_past_sessions 搜索 Agent 配置的后置存储器中的会话; 它不搜索 habel 会话存储 。 哈尼斯犬科历史保持独立. 默认吊带存储和 InMemoryStorage 过程是局部的和不可延长的.
儿童得到相同的控制下处决界限、政策、身份和取消,并有新鲜儿童谈话/状态。 他们没有重新定义或隐含地获得所有母代理默认。 授权仍受分摊总预算的约束. 深层移民. test.ts 使用真正的代理执行和假的提供者来行使明确的选择权,包括根深蒂固的技能/项目背景、书面拒绝、授权预算、持续说明和成功/失败清理.
定义自定义能力
import { agentDriver, defineAbility, defineHarness, HarnessRuntime } from "@agentium/harness";
interface NotesService { read(query: string, userId?: string): Promise<string> }
const notes = defineAbility({
type: "example/notes",
validate: (options: { service: NotesService }) => ({ service: options.service }),
describe: () => ({ toolNames: [], requirements: ["notes:read"], runtimeDependent: true }),
bind: async ({ service }) => ({
tools: [],
contextSources: [{
id: "notes",
fetch: async (query, run, budget) => {
run.signal?.throwIfAborted();
const text = await service.read(query, run.userId);
return [{ id: "result", text, trust: "source", byteLength: Buffer.byteLength(text) }];
},
}],
middleware: [{
id: "notes-observer",
afterModel: async (_response, run) => { run.signal?.throwIfAborted(); },
}],
// Dispose resources created by this binding only; service is host-owned.
}),
});
const runtime = new HarnessRuntime({
definition: defineHarness({ id: "support", abilities: [notes({ service: notesService })] }),
driver: agentDriver({ name: "support", model }),
requirements: ["notes:read"],
grants: { toolIds: [], modelRoles: ["main"] },
});
选项仍按静态输入,包括回调和服务. validate 必须是纯洁的。 平面物体/阵列被描绘成不可改变的配置;提供新的容器来装订/描述。 函数和类例仍然是调用人拥有的参考文献。 代表对身份敏感的 SDK 客户端作为类例. 信任的工厂不是沙箱.
装订每次运行时按顺序初始化一次并按倒序处理一次,包括部分初始化失败. 重用一个定义会产生单独的运行约束;运行中的儿童执行共享所提供的服务. 不关闭在 dispose。 。 。 .
源获取器接收条目/字节/token/死线边框和取消信号;运行时检索应用了源的中央限制. 源估计不是权威,检索数据不能成为主机指令. 中间软件ID必须独一无二; 稳定 before编号 :after 命令拒绝未知的引用和循环。 模型转换保存了主机指令和提供/工具续作组. 观察员得到孤立的、结构化的、可实现的反应/结果。 Middleware不能取代强制工具执行.
编写、检查和替换
import { defineHarness, extendHarness, describeHarness, textContext } from "@agentium/harness";
const original = defineHarness({
id: "product",
abilities: [textContext({ id: "notes", entries: [] }, { instanceId: "notes" })],
});
const extended = extendHarness(original, {
id: "product-specialized", disable: ["notes"],
abilities: [customAbility({ service })],
});
console.log(describeHarness(extended));
检查报告申报和诊断没有约束力,发现证书或串行可执行选项。 使用明确的能力实例ID来重新使用定义.
- 默认的继承;
false禁用 。 技能-指令缺省;false清除他们. disable删除整个能力的工具,上下文和中间软件.replaceAbilities明确替换已有实例ID.- 复制工具/文本/中件/即时ID失败 。 执行前替换能力或主机工具集; Agent 没有成分替换选项 .
- 所需经费是明确的运行时间东道方赠款,而不是依赖性安装。 运行时间赠款/政策/身份不能通过定义或模式产出加以扩大.
文本和文件上下文
textContext({ id, entries }, { instanceId }) 即刻取出UTF-8源条目,并拥有被批准的便携式工厂. fileContext({ id, root, files }, { instanceId }) 仅读取一个明确的绝对根下的固定主机选择路径。 获取时会读取; canonical path, UTF-8 和大小检查应用. 它不提供全工作空间的工具.
const runtime = new HarnessRuntime({
definition: research({ files: { id: "project-files", root: "/srv/project", files: ["README.md"] } }),
driver: agentDriver({ name: "research", model }),
projectRoot: "/srv/project",
requirements: ["filesystem:read"],
grants: { toolIds: [], modelRoles: ["main"] },
});
research 禁用自动工作空间工具,上下文文件发现,文件内存和子代理. suppliedTools({ tools, requirements? }) 在不执行或冻结的情况下包裹信任的工具Defs. base({ id?, abilities?, defaults? }) 提供一个组成壳.
便携式清单
import { defineHarness, exportManifest, hashManifest, loadManifest, textContext } from "@agentium/harness";
const definition = defineHarness({
id: "portable-notes",
abilities: [textContext({ id: "notes", entries: [{ id: "one", text: "Source text" }] }, { instanceId: "notes" })],
});
const manifest = exportManifest(definition);
const hash = hashManifest(manifest);
const loaded = loadManifest(JSON.parse(JSON.stringify(manifest)), [textContext.factory!]);
装入需要经过批准的工厂登记;JSON从不包含可执行工厂. 未知的密钥,不兼容的版本,缺失的工厂和非JSON选项失败. 出口需要明确的驾驭/便携式能力识别和绘图。 本地回调,客户端,文件能力和工具都留在本地,除非其作者提供经批准的等效映射. 证书从不属于清单.
自定义 defineAbility 绘图使用情况 portable: { validateOptions, toOptions, toJSON } 并揭露 factory. Hashes 覆盖经验证的 Canonic 显示的 JSON , 而非函数文本, 活客户端或解析的绝对路径 。 导出代理配置和带子分别显示; 核心代理序列化中没有带子运行时间定义 .
核查和限制
npm run build:core
npm run build:harness
npx vitest run packages/harness/src
AGENTIUM_TEST_PACKAGES=1 npx vitest run packages/harness/src/__tests__/package-consumption.test.ts
选入包测试将本地的柏油球安装到一个孤立的离线消费者身上,并验证ESM/CJS和公共TypeScript的用法,没有可选的提供者/浏览器/排队SDK. 首先构建如此陈旧的输出, 无法进行源码验证 .
本地运行时间不提供持久恢复,分布式所有权,远程政策截取,技能沙箱,浏览器/媒体传输或视觉编辑器. 这些要求有明确的合并或回收合同。 主机能力是信任的代码,而不是JavaScript安全边界.
执行司机和运行把手(H2)
HarnessRuntime 拥有范围限定的会话租赁、总召集预算、强制性
执行政策、事件历史、完成检查和清理。 驱动控件
进展情况 start(request, services). 提供服务的模式
通过所使用的同一批准和执行边界的呼叫和发送效果
以 Agent. 驱动程序执行和主机装订是可信赖的应用程序代码;
此接口不包含沙盒 JavaScript 或截取任意的网络呼叫 .
import { Agent, defineTool } from "@agentium/core";
import { HarnessRuntime, agentDriver } from "@agentium/harness";
import { z } from "zod";
// model is the application's existing ModelProvider.
const lookup = defineTool({
name: "lookup", description: "Read an approved record",
parameters: z.object({ id: z.string() }),
execute: async ({ id }) => records.read(id), // host-owned record service
});
const agent = new Agent({ name: "assistant", model, tools: [lookup] });
const runtime = new HarnessRuntime({
driver: agentDriver(agent, { stream: true }),
grants: { toolIds: ["lookup"], modelRoles: ["main"] },
budgets: { maxModelCalls: 8, maxToolCalls: 6, maxTokens: 8000 },
executionPolicy: {
decide: () => ({ action: "allow" }),
resolveEffect: () => "read",
},
});
const handle = runtime.start("Read record 42", {
identity: { tenantId: verifiedTenant, userId: verifiedActor },
sessionId: "conversation-42",
});
for await (const event of handle.events()) render(event);
const result = await handle.result();
// runtime.run(input, options) returns that same terminal result.
A 类 RunHandle 报告一个最终结果: completed, (中文(简体) ), failed, (中文(简体) ),
cancelled, (中文(简体) ), stopped,或 awaiting_input。终端事件包含同样的
结果和最后光标. cancel() 记录意图并传播信号;
和解和资源释放等自有工作开始。 提供者或
忽略取消的自定义驱动程序可以延迟和解。 开始于外部
效果永远不会回滚。 关闭一个活动 显示器只关闭该查看器.
同时代的传记员被命令阅读. 默认事件历史保留 256
事件; 与 events({ after: cursor })。接收的旧光标
HarnessEventGapError大型终端产出成为标出范围的文物参考;
找回来 runtime.getArtifact(identity, sessionId, artifactId)。 。 。 .
内置驱动程序支持已队列 follow_up 输入。 内置代理驱动器也
支持 steer 在完整的工具回合边界。 自定义驱动程序可以声明
steer 用它来消耗 services.takeInput()。用于现场提问
requestInputTool() 或者说 await services.requestInput(),然后回答
handle.reply(requestId, input)。 。 。 . handle.state === "awaiting_input" 非绝对性质;
result() 预算得到保留。 返回旧终点站
awaiting_input 状态是遗留下来的,而不是活的中止.
见 对话运行 为时钟,输入事件,
公共信息、提供者能力、流畅相容性和紧凑性.
不支持的控件抛出 HarnessUnsupportedError中断和替换,
远程政策覆盖面和持久复苏仍然得不到支持。 记忆
活动、文物、会议和待决问题显然不可持久.
东道方赠款是上限。 主计长只选择核准的工具/模式角色; 删除所需的工具或选择未支持的模型选项失败 . 示范产出限额被限制在剩余的象征性津贴和保留地 防止同时发出的呼吁分担该津贴。 报告的使用情况包括: 输入和提供者推理符号,所以提供者的实际核算可能超过 输出估计值; 运行时区块在耗尽时会随后调用。 型号 调用/工具尝试限制是独立执行的。 背景策略返回一个 不可改变的请求投影和出处;犬科历史保持不变. 不透明提供者的延续不能在模式角色之间迁移.
const completionPolicy = {
id: "require-evidence",
evaluate: async ({ text, revision }) => text.includes("Evidence:")
? { action: "accept", reason: "Evidence included" }
: { action: "revise", reason: "Missing evidence", instruction: "Include Evidence: and its source." },
};
// Supply completionPolicy and budgets: { maxRevisions: 1 } to HarnessRuntime.
// Revisions cannot execute tool effects unless allowRevisionEffects is explicitly true.
工作流程、团队和定制司机
workflowDriver(workflow) 接受 JSON 对象输入补丁并保存
工作流构造器的另一个初始状态. 每个函数步骤都作为
workflow:<stepName> 政策、核准和预算
检查。 确定性核准工作流程只能提供 workflow:submit设置
executionPolicy.decide 改为 ask,并输入主机 ApprovalManager。 。
尚待处理的请求包括经核实的租户和行动者。 已拒绝的步骤返回 a
终端结果失败, 不执行回调 。 受控函数
步骤不会自动重试效果.
teamDriver(team) 使用现有的团队算法。 代理人收到
同一身份、取消、政策和总模式/工具预算。 远程团队
成员显然失败了,因为这一运行时间无法拦截其影响.
根历史和每个授权代理的完整工具/提供者对话
在会话快照中单独保留 history 财务报告和审定财务报表 conversations。 。 。 .
失败/流产的部分笔录保留在 replayable: false。 。 。 .
import type { ExecutionDriver } from "@agentium/harness";
import { testDriverContract } from "@agentium/harness/testing";
const deterministic: ExecutionDriver = {
id: "example/deterministic", version: 1,
capabilities: { controls: [], durable: false, policyCoverage: "local", controlledExecution: true },
async start(request, services) {
services.append([{ role: "user", content: request.input }]);
const result = await services.dispatch({ id: "read-1", name: "lookup", arguments: { id: "42" } });
const text = result.error ?? String(result.result);
services.append([{ role: "assistant", content: text }]);
return { text };
},
};
await testDriverContract(deterministic, {
tools: [lookup], grants: { toolIds: ["lookup"], modelRoles: [] },
});
明确的测试子路径没有维特依赖性,并检查终端/结果 协议、命令身份、最后光标和定居结果的不可更改性。 这个 执行呼叫器提供的固定设备;应用程序必须额外测试自己的设备 驱动程序的效果、取消合作以及控制边界.
会话所有权和便携式运行时间参考
默认商店拒绝向同一个租户/演员/会议提供第二个写作员
HarnessSessionConflict其宣布的担保是程序-当地单写
安全,没有比对和擦擦, 没有耐久性。 不同的租户仍然孤立.
通过 services.resource(id, "session", initialize)
被重用直到 runtime.resources.closeSession(identity, sessionId) 毕竟
租赁释放。 运行一次逆向收购时关闭的资源;主机拥有
客户从不处理。 清理诊断不能取代主要结果.
应用程序拥有保留会话/艺术库和明确会话清理.
配置运行时间的定义 。 核心特工没有带状成分
选项。 运行时间绑定应用工具,提示,
上下文源,以及用于自定义驱动模型/效果服务的中间软件.
代理适配器使用 history 加号 ephemeral: true 语义学, 离开峡谷
持续保存并避免重复代理会话记录.
在绳子外, agent.run 财务报告和审定财务报表 agent.stream 接受 ephemeral: true 用于
外部拥有的历史没有自动会话/记忆的持久性.
当地 defineHarness({ runtime: { driver, controller, contextPolicy, completionPolicy } }) 接受信任的直接执行。 便携式清单
仅包含 runtime 登记处参考资料 { id, version },加上角色对主机
约束性偏好。 对导出, 提供匹配 runtimeReferences 财务报告和审定财务报表
runtimeRegistry 测绘. loadManifest(manifest, abilityFactories, runtimeRegistry) 仅解决明确核准的执行问题,但未能完成
缺少或模糊的参考文献。 没有导出映射的可执行引用
失败的精确 runtime.<field> 路径。 全权证书和客户仍留在当地.
Agent是因为 checkpointing 选项现在记录工具回合记录/状态
抓图并曝光配置 checkpointManager。这些快照支持
检查; 删除后期快照不会取消效果或恢复运行 。 持久性
第004号计划要求单独签订回收/操作领导合同.
控制下执行拒绝普通Agent反射,模型后置压缩/工具-结果汇总,
工作开始前以例外方式交接 使用 completionPolicy, (中文(简体) ),
contextPolicy团队/司机代表团,因此,每个模式
调试和修订仍须遵守运行时间的预算和效果政策.
纯上下文修饰仍然可用。 保留普通代理配置
他们现在的行为 授权 RunOpts.executionPolicy 是额外的
强制性限制,不能放松代理政策或运行时间补助.
预算思考和摘要
使用 reflectionPolicy 财务报告和审定财务报表 summaryContextPolicy 模型支持的完成和
h2 中的上下文处理 它们的辅助模型是明确的主机绑定:
import { reflectionPolicy, summaryContextPolicy } from "@agentium/harness";
const runtime = new HarnessRuntime({
driver: agentDriver(agent),
grants: { toolIds: [], modelRoles: ["main", "critic", "summary"] },
models: {
critic: { provider: criticModel, options: ["maxTokens"] },
summary: { provider: summaryModel, options: ["maxTokens"] },
},
budgets: { maxModelCalls: 12, maxTokens: 16000, maxRevisions: 1 },
completionPolicy: reflectionPolicy({
modelRole: "critic", criteria: "Support factual claims with supplied evidence.",
maxTokens: 512,
}),
contextPolicy: summaryContextPolicy({
modelRole: "summary", maxContextTokens: 6000, keepRecentTurns: 2,
summaryMaxTokens: 1000,
}),
});
批评者必须返回一个严格的JSON完成决定. 错误的决定,
截断的响应和出乎意料的工具请求都未能关闭 。 订正份额
运行时间的总预算,并且不能引入效果,除非主机
启用 allowRevisionEffects政策本身从未执行工具.
摘要只替换模型请求中较旧的完整转折. 东道主
指示和最近选定的整个转弯保持完整,包括不透明
提供者的延续和工具/成果组。 摘要被标注为不信任
历史数据;舟山历史未变. 帮助者拒绝
近代不可分割的转折、超大源或超大摘要而不是默默
截取取来. maxInputBytes 默认为65536. 吻合是一种估计;
供应商背景核算可能有所不同。 已绑定的请求不作摘要
电话 新的超大投影可能会引起另一次有限度的即时呼叫.
自定义驱动程序可以使用 services.controlModel(role, messages, options)具体利用政策可以缩小其中立性 ctx.executionServices 改为 HarnessExecutionServices 以访问扩展.
这需要明确授予和约束的角色,并有允许的选项密钥.
呼叫共享模式/账户预算、取消、事件核算和自有工作
和解。 它们没有工具或提供者的延续,也不改变
任务中的积极作用/工具。 它们跳过任务控制器,上下文预测和能力
防止政策再起的中间软件;其权威来自明确
主办角色奖. 遗留物代理反射/压缩配置仍被看守
明确选择这些政策端口.
自定义驱动程序可以通过此程序登记额外的同步授权工作
services.runOwned(operation); 运行时间等待工作后释放
会期租赁和资源。 内建代理工具执行使用此所有权
路径。 团队广播和协作等待每个开始的成员,包括装订清理,在失败时解决.
合规帮助者还处理其固定会话中创造的资源,
包括验证失败时,同时保留主失败.
持久表
DurableWatch, (中文(简体) ), defineWatch,以及 gmailWatchSource 明确启用,
授权监督核心持久任务/行动合同。 东道方用品
恒定存储器,调度器,认证的Gmail客户端和触发验证器,
和一个范围化的通知连接器。 盲从 光标/潜水 安静
小时数、发送上限和模棱两可的效果调节都包括在内。 见
监视指南 设置、事故恢复保障和
其余为Gmail/Pub/Sub送货门.
核准的多边协商进程资源
mcpResources 通过主机认证的 MCP 客户端添加文本文档作为受约束上下文. 它在结构上接受客户,包括MCP SDK世代; Agentium 不自动安装资源 SDK .
import { defineHarness, mcpResources } from '@agentium/harness';
const definition = defineHarness({ abilities: [mcpResources({
id: 'approved-documents',
resources: [{ uri: 'docs://policies/shipping', mimeTypes: ['text/markdown'] }],
authorize: (grant, ctx) => host.canRead(ctx.tenantId, ctx.userId, grant.uri),
connect: async (ctx) => {
const client = await host.connectMCP(ctx); // authenticates this principal; respects ctx.signal
return { client, dispose: () => client.close() };
},
})] });
host 代表应用程序自主认证,授权和连接代码. Grant URIs和MIME类型是准确的. 可选主机 select(query, ctx) 能够选择这些赠款的子集;没有全服务器的发现可以扩展访问。 设置默认为五秒期限( E)connectTimeoutMs),并处理延迟连接。 资源读取符合共享上下文条目/字节/死线预算并运行取消 。 在读取和返回内容之前重新检查授权 。 SDK资源缓存被绕过;v1客户端忽略了该额外选项,不执行v2响应缓存. 检查每个返回的URI/MIME 。 文本被标记为源数据,带有出处,从未作为系统指令被插入. 二进制文档需要明确的主机解码器. 仅包含从核定格式/ URI 中解码的文本; 此能力本身不会执行或获取资源 URIs .
自定义驱动程序和控制器遥测
import { EventBus } from '@agentium/core';
import { HarnessRuntime } from '@agentium/harness';
import { instrumentBus } from '@agentium/observability';
const telemetry = new EventBus();
const observation = instrumentBus(telemetry, { exporters: ['console'] });
const runtime = new HarnessRuntime({ ...runtimeConfig, telemetry });
await runtime.run('task', { identity, sessionId });
await observation.shutdown();
运行时间输出一个运行周期, 唯一识别的模型引用 services.model, (中文(简体) ), streamModel 财务报告和审定财务报表 controlModel,并且控制器跨度为 prepareRun, (中文(简体) ), prepareStep 和完成评价。 决定包括动作,所选择的模范角色和活性工具计数. 成功、失败和取消都结束了 观察失败不能控制执行. 在这些事件中省略了提示、输出文本、控制器解释和工具参数.
使用这辆公交车与自己的采集器在观察吊带时使用. 不将相同的追踪器或度量衡采集器附加到带子总线和包裹的Agent总线上:这些层共享执行ID并描述重叠的工作. 绕行执行服务的直接提供者呼叫也绕过运行时间预算和遥测;自定义驱动器应当使用服务. 现有公共汽车上仍然有运输/工具包专用追踪工具.
资源预算和完成工作
HarnessRuntime 在提交每个模型之前保留预测投入和产出
电话 输入包括预测的信息、工具图和不透明提供者
继续。 一个同步 estimateInputTokens({ provider, messages, tools })
选项可以提供特定供应商的保守约束; 默认估计器
是一种建议。 产出上限为预测投入后的现有余额.
同时任务,控制,和完成操作 共享允许。 调用空档
在控制器/文本投影之前保留,并在准备时发布
失败而不消耗一个逻辑的呼叫.
const runtime = new HarnessRuntime({
driver,
grants: { toolIds: [], modelRoles: ["main", "finisher"] },
models: { finisher: { provider: model, options: ["maxTokens"] } },
budgets: {
maxModelCalls: 12,
maxTokens: 80_000,
finishingModelCalls: 1,
finishingTokens: 6_000,
},
completionPolicy,
});
const handle = runtime.start("task", { identity, sessionId });
console.log(handle.budget.tokens); // limit, used, reserved, remaining,
// finishingReserved, ordinaryRemaining
快照可从 handle.budget, (中文(简体) ), services.budget,以及
result.budget. 伯爵使用逻辑模型调用, 策略允许的工具尝试,
和总输入 + 输出符号. null 限制/保留指无限.
remaining = max(0, limit - used - reserved)· ; finishingReserved 是受保护的
未承付的余额在该总数之内 ordinaryRemaining 把它排除在外.
已知惯例取代了预定的象征性保留,包括逾期使用
取消 。 保留总是被解除。 已经开始但无
全部使用量以保守和递增方式消耗其预测
unknownUsageCalls报告 result.usage 实际收到的证据;
它可能不同于保守的充电 result.budget.tokens.used。 。 。 .
信任的驱动程序或完成控制器可以调用
services.finishModel("finisher", messages, { maxTokens: 2_000 })明确
使用完成能力(加上现有的普通能力),需要给予,
明确约束角色,只接受完整的无工具响应. 正在返回
驾驶员的考生还在申请 completionPolicy; 补全
不绕过证据验证或授权工具/效果。 普通工作和
重复拒绝预算不能消耗期末储备金。 无额外津贴
在配置的总数上添加.
这些是按业务预测的资源预算,与核心的存储支持分开 货币预定。 记录实际供应商超支情况并减少未来 承认; 估计数不能保证硬体的上限。 未知的 SDK 这里看不到重试消耗 。 对于严格的宿主,供应保守 输入估计、 限制输出、 禁用内部重试、 并选择明确 主机重试/会计政策。 无最大值的无限符号预算 无法保守约束未知输出使用.
居民历史和东道国档案
请求上下文投影仍保留着条子记录 选择到
residentHistory: { maxMessages, maxBytes?, archive, canEvict? } 移动旧的关闭
从驻地记忆变成主机拥有的档案. archive.write(scope, reference, messages) 在解决之前必须确认存储;
archive.read(scope, reference) 返回原始记录。 无存储后端
被捆绑。 参考文献包括对话的ID、计数和SHA-256摘要和
持续为: HarnessSessionSnapshot.archivedHistory。 。 。 .
限制在模式/会话边界上适用。 整个用户回合是
原子,包括每一个并行的工具调用/结果和不透明回放项目. 东道主
指令和最近的转折停留在居民中;超大小的不可分割转折
失败 HistoryRetentionError. 存档失败使本地记录完好无损.
失败快照即使不符合要求的限度,仍保留证据.
支持封闭的OpenAI回放/Anthropic回放组. 未知的不透明
有效载荷需要明确 canEvict 主机证明或提供者
capabilities.historyEviction: "closed_turns"; 明示 "unsupported" 拒绝
驱逐。 永远不要宣布支持需要被逐出房屋的供应商.
services.history 是本地重放窗口; services.archivedHistory 列表
存档引用 。 使用 services.retrieveHistory(id) 内
活动运行或 runtime.retrieveHistory(identity, sessionId, id) 运行之间.
检索核实计数/ digest 和工具结构;不自动插入
检索到信任的模型上下文中的记录 。 主机可以显示已检索
通过上下文政策将数据记录为源数据。 内置代理循环发布
被拆迁的初始/文本副本。 自定义司机拥有其额外副本,以及
平行的活跃儿童对话有独立的居住限制。 已完成
儿童笔录在成功开庭时全部存档。 存档参考
许多届会的元数据、主机存储保留和汇总限制仍然存在
东道方责任。 没有这种选择,现有的完整历史行为依然存在.
公共输入预验证
导入 parseRunInput, (中文(简体) ), validateRunInput, (中文(简体) ), RUN_INPUT_LIMITS,以及
HarnessInputError 从 @agentium/harness。 。 。 . parseRunInput(encodedJSON) 边框
在解析和验证 JSON 编码前的 UTF-8 字节 信件内容值, (中文(简体) ),
不是一个完整的回复信封. validateRunInput(unknownValue) 返回已验证的
复制时精确使用 start, (中文(简体) ), send,以及 reply。 。 。 .
冻结的限制暴露了 maxEncodedBytes编号 :maxNormalizedBytes (65 536个),
maxQuestionBytes (32 768美元)和 maxChoices (100) (英语). 字节包括 JSON 引文和
逃出; 编码后的限制也算作空白 。 验证允许为空
字符串,但需要由严格形状的内容部分组成的非空阵列。 媒体
对有效载荷进行外形检查;针对供应商的媒体支持仍然是稍后的检查.
驳回请求不要求等待处理。 运行状态,请求关联,
已解答的回复、取消和超时将在
reply(requestId, value) 消耗它.
会话快照持续对话/状态;不会恢复活运行. 持久恢复需要改编的执行检查站、待投入状态和 效果的安全延续。 这项工作被推迟,如网页技术参考 检索:当前的内置技能工具仍然读取整个文件. 未来的呼唤 合同应包括稳定的抵消/修改和真实的遗漏标记.
执行图
使用核心 Workflow 图表/重复现有步骤 workflowDriver。不需要图数据库、额外的驱动程序或第二个代理环路。 完整 工作流程指南 定义数据/控制边缘、连接、范围化身份、修复界限和检查站限制.
import { Workflow } from "@agentium/core";
import { HarnessRuntime, workflowDriver } from "@agentium/harness";
const workflow = new Workflow({
name: "graph-example", register: false,
initialState: { left: 0, right: 0, total: 0 },
steps: [{
name: "calculate", maxConcurrency: 2,
graph: [
{ id: "left", step: { name: "read", run: async () => ({ left: 2 }) } },
{ id: "right", step: { name: "read", run: async () => ({ right: 3 }) } },
{ id: "sum", inputsFrom: ["left", "right"],
step: { name: "sum", run: async (state) => ({ total: state.left + state.right }) } },
],
}],
});
const runtime = new HarnessRuntime({
driver: workflowDriver(workflow),
grants: {
toolIds: ["workflow:calculate/left/read", "workflow:calculate/right/read", "workflow:calculate/sum/sum"],
modelRoles: [],
},
budgets: { maxToolCalls: 3, maxModelCalls: 0 },
});
const result = await runtime.run("{}", {
identity: { tenantId: "verified-tenant", userId: "verified-user" }, sessionId: "calculation-1",
});
// result.structured.total = 5; trusted functions use the existing controlled effect port.
图表节点功能和代理工具保留东道方的赠款、核准政策、取消和总预算。 巢道节点工作可以超过外道节点同位素,而主机拥有外道资源锁定/同位素. WorkflowDriver返回最终状态和集合原因;直接Workflow结果包含节点诊断. workflow_iteration_limit 在驾驶员/电子结构中存活。 默认图会加入拒绝不可比较的写作;现有的串行/并行调用者会保持他们的行为.
持久性仍然是明确的核心边界延续。 WorkflowDriver不会自动开始检查或提供持久图回放. 没有每个节点恢复,记录回放,或者在远程效应发生后完全恢复.