@agentium/harness

中文文档
4.11.0发布于 2026/10/24MITTypeScriptESM + CJS近 30 天下载 1859

Agentium 工具、上下文、中件和预设的可编译的带子开发工具包

中文使用文档
文档目录19 节
  1. 建设和使用
  2. 代理所有权和配置
  3. 从Agent.deep的明显迁移
  4. 定义自定义能力
  5. 编写、检查和替换
  6. 文本和文件上下文
  7. 便携式清单
  8. 核查和限制
  9. 执行司机和运行把手(H2)
  10. 工作流程、团队和定制司机
  11. 会话所有权和便携式运行时间参考
  12. 预算思考和摘要
  13. 持久表
  14. 核准的多边协商进程资源
  15. 自定义驱动程序和控制器遥测
  16. 资源预算和完成工作
  17. 居民历史和东道国档案
  18. 公共输入预验证
  19. 执行图

@ 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不会自动开始检查或提供持久图回放. 没有每个节点恢复,记录回放,或者在远程效应发生后完全恢复.

版本与发布记录

@agentium/harness 共发布 12 个版本,首次发布于 2026/10/04;过去 12 个月发布了 12 个版本。

版本发布日期距今
4.11.0latest2026/10/2415 天前
4.10.02026/10/2415 天前
4.9.02026/10/1326 天前
4.8.32026/10/1226 天前
4.8.22026/10/1029 天前
4.8.12026/10/1029 天前

关于 @agentium/harness 的常见问题

@agentium/harness 是什么?

Agentium 工具、上下文、中件和预设的可编译的带子开发工具包

如何安装 @agentium/harness?

在项目目录运行 npm install @agentium/harness,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@agentium/core(^4.11.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@agentium/harness 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@agentium/harness 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@agentium/harness 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^22.18.0 || ^24.11.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@agentium/harness 可以商用吗?

@agentium/harness 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@agentium/harness 的下载量有多少?

根据 npm 官方下载统计,@agentium/harness 在 2026/10/05 – 2026/11/03 这 30 天内被下载 1,859 次,日均约 62 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@agentium/harness 还在维护吗?

最新版本 4.11.0 发布于 2026/10/24(15 天前);至今共发布 12 个版本,其中过去 12 个月发布了 12 个;首次发布于 2026/10/04。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。