Skip to main content
Harness 服务是一个独立的 VeADK 智能体运行时,通过 veadk harness 命令行进行创建、配置和部署。部署后,Harness 服务以 AgentKit Runtime 的形式运行,提供对话接口、会话管理和运行时配置覆盖能力,适合需要独立托管智能体并通过 HTTP API 调用的场景。

何时使用

前置条件

  • Python 3.10–3.13,并安装 veadk-python[harness];该 extra 提供 Headroom 压缩支持
  • 已配置火山引擎 VOLCENGINE_ACCESS_KEY 与 VOLCENGINE_SECRET_KEY,具备目标地域中构建镜像、访问 TOS、创建 Runtime 和配置 IAM 角色的权限
  • 模型或端点已开通,Runtime 的 IAM 角色可访问对应模型;知识库、数据库和工具有各自的连接与访问权限
本文的 veadk harness deploy 使用火山引擎部署流程,未提供 BytePlus 参数。BytePlus 无代码部署应使用独立 AgentKit CLI 的 Harness 流程。两组命令及配置不能直接互换 生成的 Dockerfile 默认从 VeADK main 构建服务;要复现指定发布版本,可在构建前将 Dockerfile 的 VEADK_REF 设置为目标 tag。本文命令按 VeADK 1.1.13 核验

命令总览

veadk harness 提供以下子命令: create、add 和 show 操作本地文件;deploy 使用云资源;invoke 调用已部署服务并可能消耗模型额度

创建项目

目标目录非空时,确认后会覆盖同名项目文件。需要保留原配置时先备份,或使用一个新目录
该命令在 my-harness 目录中生成以下文件: 目录非空时会要求确认覆盖;先保留其中需要的文件。create 只生成项目,不会部署云资源 进入项目后将 .env.example 复制为 .env,填写部署 AK/SK,并将 .env、harness.json 和含真实密钥的配置排除出版本控制。调用元数据中的 API Key 也是凭据

配置智能体

使用 veadk harness add 将参数写入 harness.yaml。将 your-model-name 替换为可调用的模型或端点 ID;以下知识库示例还要求相应项目和地域中已有可用的 VikingDB 资源,不使用知识库时省略这三个知识库选项:

配置参数

add 只更新显式提供的字段;下表默认值描述省略选项时的行为,不是服务的初始默认值。--path 默认当前目录,所有子命令均支持 --help 先设置组件的后端类型,再填写该后端需要的连接参数。连接选项均接收文本,例如 --knowledgebase-use-ssl true;它与独立 AgentKit CLI 的布尔开关不同。密码和 API Key 会写入本地 harness.yaml,不要提交包含真实凭据的文件
当前版本虽然在帮助中列出 --builtin-tools、--mcp-router-id、--selected-skills、--mcp 与 --registry,但 add 不会保存这些值。结构化资源请按下文直接编辑 YAML;OIDC 选项属于 deploy,不属于 add
连接字段被 CLI 接受不代表所有后端都会使用。Redis 用户名在知识库中可用,在长期记忆中不生效;OpenSearch 的 secret_token 不用于当前知识库或长期记忆连接。详见 Redis 长期记忆和 OpenSearch 知识库

harness.yaml 配置结构

harness.yaml 按模型、工具、技能、知识库和记忆组织配置。部署时会将配置传入 Runtime;每个组件先用 type 选择后端,再配置其连接参数。初始会话后端为 local,单次运行最多调用模型 10 次
harness.yaml
智能体字段也支持 harness: 包装分节,嵌套字段优先于同名顶层字段。部署名称 harness_name 和网关 auth 保留在顶层;add 修改顶层字段,因此不要同时保留同名嵌套配置。该命令不展开 YAML 中的 ${VAR},不要套用独立 AgentKit CLI 的配置插值规则

结构化资源配置

除 veadk harness add 写入的基础字段外,harness.yaml 还支持以下结构化字段,用于配置 AgentKit 控制面下发的资源。这些字段在部署时转换为对应的 JSON 环境变量: 结构化资源配置示例:
harness.yaml

执行增强配置

在 harness.yaml 中配置 harness_enhance,可为服务启用上下文准备、工具结果压缩与回答校验。以下配置使用内置压缩,不要求 Headroom
harness.yaml
HTTP 调用可通过请求体顶层的 harness_enhance 临时覆盖这些设置,其中 components 使用逗号分隔的字符串。压缩可能损失细节,回答校验也不保证事实正确;组件行为和限制见 Harness 扩展

查看配置

该命令输出 harness.yaml 中已配置的参数,以及可通过 veadk harness invoke 在调用时覆盖的参数列表。
知识库、长期记忆和采样参数使用 HTTP API 覆盖。--registry 等结构化选项虽然出现在命令帮助中,但 CLI 只传递文本,不解析 JSON 对象;使用 HTTP 请求体中的对应字段
show 输出为配置原文,不会自动隐藏其中的密码或 API Key;分享输出前应删除敏感值

部署

部署会构建镜像并创建或更新云端运行资源,可能产生费用。先核对地域、Runtime 名称、模型访问权限和将写入 Runtime 的环境配置。更改线上服务前保留当前配置;失败时先查看已经创建的资源,再决定是否重试
该命令读取 harness.yaml,将其转换为运行时环境变量,执行 AgentKit 云端构建和 Runtime 创建。部署完成后,Runtime 端点、Runtime ID 和 API Key 会记录到 harness.json 中。 harness.json 只在返回可用端点时写入。API Key 模式记录密钥;OAuth 模式记录发现地址和客户端,不保存用户 JWT。默认本地会话随进程结束而丢失,需要持久化时配置 MySQL 或 PostgreSQL

认证方式

默认使用 API Key 认证(key_auth)。在 harness.yaml 中添加 auth 分节或通过 --discovery-url 和 --allowed-id 启用 OAuth2/JWT 认证(custom_jwt):
harness.yaml
使用 OAuth2/JWT 认证时,调用需在请求头中携带 Authorization: Bearer <用户池 JWT>,CLI 不会生成该令牌。

调用 Harness 服务

--name 指定 Harness 名称,其 URL 和 API Key 从 harness.json 中读取。也可以通过 --url 和 --key 直接指定。

调用参数

覆盖项只作用于当前请求,不修改 harness.yaml。独立对话应设置不同的 --session-id;默认的 cli-user 与 cli-session 会复用同一组会话标识 收到非空回答后,再确认工具、知识库和记忆符合预期。若 CLI 输出为空,使用 HTTP 接口检查响应中的 error;HTTP 200 本身不等于智能体执行成功

HTTP API

部署后的 Harness 服务提供以下 HTTP 接口。

对话接口

会话与配置接口

运行时配置覆盖

Harness 服务支持在每次请求中覆盖已部署智能体的配置。覆盖通过请求体中的 harness 字段传入,仅对本次调用生效。 /harness/invoke 请求体结构:
请求体

harness_merge 行为

harness_merge 控制请求配置与默认配置的合并方式:

可覆盖字段

以下字段可通过 harness 在请求级覆盖:
知识库和长期记忆的请求级覆盖通过 AgentKit 控制面资源 ID 解析为运行时配置。传入 id 时,Harness 服务会从 AgentKit 控制面获取对应资源的连接信息。
HTTP 示例使用已部署端点和实际 Bearer 凭据。API Key 模式从本地 harness.json 读取密钥;OAuth 模式使用用户池颁发的有效 JWT

创建会话

请求体可包含以下字段:

查询默认配置

返回当前 Harness 的默认配置,包含模型名称、运行时后端、最大 LLM 调用次数等信息。支持 camelCase 查询参数(appName、userId、sessionId),也支持 POST 方式提交请求体。

环境变量

Harness 服务通过环境变量配置运行时行为。harness.yaml 在部署时自动转换为对应的环境变量,也可以直接在运行时环境中设置。 CLI 调用还支持 HARNESS_URL、HARNESS_KEY 和 HARNESS_TIMEOUT;超时默认 600 秒。前两者分别作为 --url 和 --key 的回退值,不会自动写入部署配置

模型与工具

资源配置

会话与记忆后端

max_llm_calls 的默认值为 10。未显式设置时,单次运行最多调用 LLM 10 次。可在 harness.yaml 中或通过请求级覆盖调整。
最后修改于 2026年9月19日