@gt-fe/eap-sdk 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +378 -370
- package/dist/discovery/resolve-agent-project.d.ts.map +1 -1
- package/dist/discovery/resolve-agent-project.js +2 -3
- package/dist/discovery/resolve-agent-project.js.map +1 -1
- package/dist/lockfile/read-lockfile.js +2 -2
- package/dist/lockfile/read-lockfile.js.map +1 -1
- package/dist/lockfile/resolve-dependencies.js +11 -11
- package/dist/lockfile/resolve-dependencies.js.map +1 -1
- package/dist/packaging/package-agent-project.d.ts.map +1 -1
- package/dist/packaging/package-agent-project.js +10 -2
- package/dist/packaging/package-agent-project.js.map +1 -1
- package/dist/platform/client.d.ts +7 -0
- package/dist/platform/client.d.ts.map +1 -1
- package/dist/platform/client.js +16 -2
- package/dist/platform/client.js.map +1 -1
- package/dist/project/agent-project.js +1 -1
- package/dist/project/agent-project.js.map +1 -1
- package/dist/resources/extract-resource-package.js +7 -6
- package/dist/resources/extract-resource-package.js.map +1 -1
- package/dist/resources/index.d.ts +1 -0
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +1 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/install-agent-resource.d.ts.map +1 -1
- package/dist/resources/install-agent-resource.js +35 -3
- package/dist/resources/install-agent-resource.js.map +1 -1
- package/dist/resources/install-local-agent-resource.d.ts.map +1 -1
- package/dist/resources/install-local-agent-resource.js +20 -3
- package/dist/resources/install-local-agent-resource.js.map +1 -1
- package/dist/resources/skill-tool-dependencies.d.ts +46 -0
- package/dist/resources/skill-tool-dependencies.d.ts.map +1 -0
- package/dist/resources/skill-tool-dependencies.js +231 -0
- package/dist/resources/skill-tool-dependencies.js.map +1 -0
- package/dist/resources/uninstall-agent-resource.d.ts.map +1 -1
- package/dist/resources/uninstall-agent-resource.js +10 -0
- package/dist/resources/uninstall-agent-resource.js.map +1 -1
- package/dist/schema/agent/manifest.js +1 -1
- package/dist/schema/agent/manifest.js.map +1 -1
- package/dist/schema/agent/models.js +4 -4
- package/dist/schema/agent/models.js.map +1 -1
- package/dist/schema/common.d.ts.map +1 -1
- package/dist/schema/common.js +7 -5
- package/dist/schema/common.js.map +1 -1
- package/dist/schema/dependencies-lock.js +1 -1
- package/dist/schema/dependencies-lock.js.map +1 -1
- package/dist/schema/package-manifest.js +2 -2
- package/dist/schema/package-manifest.js.map +1 -1
- package/dist/schema/project-config.d.ts +7 -7
- package/dist/schema/project-config.js +4 -4
- package/dist/schema/project-config.js.map +1 -1
- package/dist/schema/skill/manifest.js +2 -2
- package/dist/schema/skill/manifest.js.map +1 -1
- package/dist/schema/tool/manifest.d.ts +14 -14
- package/dist/schema/tool/manifest.js +8 -8
- package/dist/schema/tool/manifest.js.map +1 -1
- package/dist/schema/zod-error-map.d.ts +3 -0
- package/dist/schema/zod-error-map.d.ts.map +1 -0
- package/dist/schema/zod-error-map.js +91 -0
- package/dist/schema/zod-error-map.js.map +1 -0
- package/dist/validation/validate-agent-directory.js +4 -4
- package/dist/validation/validate-agent-directory.js.map +1 -1
- package/dist/validation/validate-agent-project.js +4 -4
- package/dist/validation/validate-agent-project.js.map +1 -1
- package/dist/validation/validate-graph.d.ts.map +1 -1
- package/dist/validation/validate-graph.js +53 -15
- package/dist/validation/validate-graph.js.map +1 -1
- package/dist/validation/validate-local-llm.js +2 -2
- package/dist/validation/validate-local-llm.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,370 +1,378 @@
|
|
|
1
|
-
# @gt-fe/eap-sdk
|
|
2
|
-
|
|
3
|
-
`@gt-fe/eap-sdk` 是 EAP 单 Agent 项目的开发期 SDK,负责项目发现与校验、用户会话、平台 API、Tool/Skill 依赖安装、Runtime 目录物化、本地 Agent Service 以及确定性打包。
|
|
4
|
-
|
|
5
|
-
Agent 的实际执行仍由 `@gt-fe/eap-runtime` 负责。SDK 不重新实现 Graph 编译、节点执行、Tool 路由或 Runtime 事件协议。
|
|
6
|
-
|
|
7
|
-
## 安装
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install @gt-fe/eap-sdk
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
本包为纯 ESM:
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
import { createAgentService } from '@gt-fe/eap-sdk';
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## 项目模型
|
|
20
|
-
|
|
21
|
-
一个项目只开发一个 Agent,开发者维护的源文件位于项目根目录:
|
|
22
|
-
|
|
23
|
-
```text
|
|
24
|
-
<project>/
|
|
25
|
-
├── agent.manifest.json
|
|
26
|
-
├── graph.json
|
|
27
|
-
├── eap.config.json
|
|
28
|
-
├── eap.lock.yaml
|
|
29
|
-
├── tools/<code>/...
|
|
30
|
-
├── skills/<code>/...
|
|
31
|
-
└── .eap/
|
|
32
|
-
├── remote/ # Registry 资源缓存
|
|
33
|
-
├── runtime/ # 开发态 EAP_PREINSTALL_ROOT
|
|
34
|
-
│ └── agents/<agentCode>/<version>/preinstall|users/
|
|
35
|
-
├── sessions/ # 可选的本地会话数据
|
|
36
|
-
├── package-staging/ # 打包临时目录
|
|
37
|
-
└── package/ # 默认包输出目录
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
`agent.manifest.json`、`graph.json`、`eap.config.json`、`eap.lock.yaml` 以及本地 `tools/`、`skills/` 是项目输入;`.eap/` 是 SDK 生成的可删除状态。
|
|
41
|
-
|
|
42
|
-
项目 `eap.config.json.version` 必须严格等于当前安装的 `@gt-fe/eap-sdk` package version;字段级配置和部署交付说明见 [dev-tools 文档入口](../../docs/README.md)。
|
|
43
|
-
|
|
44
|
-
`findAgentRoot()` 和 `resolveAgentProject()` 只发现源项目,不使用 `EAP_PREINSTALL_ROOT`。选择器只支持 `root` 和 `startDir`,不存在 Agent code、版本或目录歧义选择。
|
|
45
|
-
|
|
46
|
-
```ts
|
|
47
|
-
import {
|
|
48
|
-
resolveAgentProject,
|
|
49
|
-
validateAgentProject,
|
|
50
|
-
type AgentProjectSelector,
|
|
51
|
-
} from '@gt-fe/eap-sdk';
|
|
52
|
-
|
|
53
|
-
const selector: AgentProjectSelector = { root: process.cwd() };
|
|
54
|
-
const project = resolveAgentProject(selector);
|
|
55
|
-
const validation = validateAgentProject(project.root);
|
|
56
|
-
|
|
57
|
-
if (!validation.valid) {
|
|
58
|
-
console.error(validation.issues);
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## 核心能力
|
|
63
|
-
|
|
64
|
-
| 能力 | 主要 API | 说明 |
|
|
65
|
-
|---|---|---|
|
|
66
|
-
| 项目发现 | `findAgentRoot()`、`resolveAgentProject()` | 查找根级单 Agent 项目 |
|
|
67
|
-
| 项目校验 | `validateAgentProject()`、`validateGraph()` | 校验 Manifest、Graph、`eap.lock.yaml` 和资源路径 |
|
|
68
|
-
| 用户会话 | `getCurrentUserSession()`、`saveCurrentUserSession()` | 管理当前登录用户和平台 Token;本地可用 `EAP_CHAT_USER` / `EAP_DEBUG_USER` |
|
|
69
|
-
| 平台 API | `createPlatformClient()` | 访问 Portal、Foundation 和平台认证 |
|
|
70
|
-
| 依赖安装 | `installAgentResource()`、`installAgentDependencies()` | 下载或恢复 Tool/Skill ZIP 制品,并维护 `eap.lock.yaml` |
|
|
71
|
-
| Runtime 物化 | `prepareAgentRuntime()` | 生成 Runtime 可直接读取的预装目录 |
|
|
72
|
-
| 本地服务 | `createAgentService()` | 物化后创建 Runtime-backed Agent Service |
|
|
73
|
-
| Standalone 服务 | `packageStandaloneAgentProject()`、`createEmbeddedAgentService()` | 将同一套物化 Runtime 输出到 `dist/runtime`,启动时不读取源项目 |
|
|
74
|
-
| 打包与验包 | `packageAgentProject()`、`readAgentPackage()` | 生成并校验单 Agent Runtime 部署包 |
|
|
75
|
-
| Schema | `AgentManifestSchema`、`GraphSchema`、`ToolManifestSchema` 等 | SDK 所有项目文件的 Zod Schema |
|
|
76
|
-
|
|
77
|
-
所有公共 API 均从包根导出,不需要导入内部路径。
|
|
78
|
-
|
|
79
|
-
## 平台 API
|
|
80
|
-
|
|
81
|
-
`createPlatformClient()` 是 Portal 与 Foundation HTTP 调用的统一入口。端点由调用方显式提供,客户端会使用当前用户会话 Token;也可通过 `token` 覆盖,便于服务端或测试宿主注入凭证。
|
|
82
|
-
|
|
83
|
-
```ts
|
|
84
|
-
import { createPlatformClient } from '@gt-fe/eap-sdk';
|
|
85
|
-
|
|
86
|
-
const platform = createPlatformClient({
|
|
87
|
-
portalEndpoint: 'https://portal.example',
|
|
88
|
-
foundationEndpoint: 'https://foundation.example',
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
const agents = await platform.portalFetch('/api/v1/agents');
|
|
92
|
-
const deployment = await platform.foundationFetch('/api/v1/deployments', {
|
|
93
|
-
method: 'POST',
|
|
94
|
-
body: JSON.stringify({ agentCode: 'report-agent', version: '1.0.0' }),
|
|
95
|
-
});
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
客户端同时提供 `checkPortalHealth()`、`checkFoundationHealth()`、`uploadPortalFile()`,以及会保存统一用户会话的 `loginWithCas()`、`validateAndSaveToken()`,和吊销 Token 的 `revokeToken()`。Registry Tool/Skill 安装也使用此客户端,不再维护独立 HTTP 实现。
|
|
99
|
-
|
|
100
|
-
## 当前用户会话
|
|
101
|
-
|
|
102
|
-
SDK 将当前用户资料和平台凭证统一保存在 `~/.eap/config.json`;可通过 `EAP_CONFIG_DIR` 修改目录。
|
|
103
|
-
|
|
104
|
-
```ts
|
|
105
|
-
import {
|
|
106
|
-
clearCurrentUserSession,
|
|
107
|
-
getCurrentUserSession,
|
|
108
|
-
getCurrentUserToken,
|
|
109
|
-
saveCurrentUserSession,
|
|
110
|
-
} from '@gt-fe/eap-sdk';
|
|
111
|
-
|
|
112
|
-
saveCurrentUserSession({
|
|
113
|
-
userId: 'U001',
|
|
114
|
-
username: 'alice',
|
|
115
|
-
roles: ['developer'],
|
|
116
|
-
permissions: [],
|
|
117
|
-
token: '<platform-token>',
|
|
118
|
-
authMethod: 'token',
|
|
119
|
-
platformUrl: 'https://foundation.example',
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
const user = getCurrentUserSession();
|
|
123
|
-
const token = getCurrentUserToken();
|
|
124
|
-
clearCurrentUserSession();
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
规则如下:
|
|
128
|
-
|
|
129
|
-
- 同一时刻只有一个当前用户,不随 CLI profile 或 Runtime storage profile 切换。
|
|
130
|
-
- `getCurrentUserSession()` 始终返回用户资料;没有已保存会话时返回 `default-user`。
|
|
131
|
-
- `getCurrentUserToken()` 优先读取 `EAP_TOKEN`,否则读取已保存 Token;默认用户不提供 Token。
|
|
132
|
-
- Runtime 环境准备会把当前 Token 映射为 `EAP_DELEGATION_TOKEN`。
|
|
133
|
-
- 用户资料在进程内缓存;测试或特殊宿主可调用 `clearUserSessionCache()` 清除缓存。
|
|
134
|
-
|
|
135
|
-
## 版本锁定文件与资源安装
|
|
136
|
-
|
|
137
|
-
开发态版本锁定文件是 `eap.lock.yaml`(规格称 `eap.lock`)。只供 dev-tools 在安装、校验、Runtime 准备和打包时使用。Runtime 与生产 Hosting 都不读它;发布包目标态是 `dependencies.lock`。
|
|
138
|
-
|
|
139
|
-
```yaml
|
|
140
|
-
lockfileVersion: 2
|
|
141
|
-
resources:
|
|
142
|
-
tools:
|
|
143
|
-
- code: search-tool
|
|
144
|
-
version: 1.2.0
|
|
145
|
-
source: registry
|
|
146
|
-
path: .eap/remote/tools/search-tool/1.2.0
|
|
147
|
-
digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
|
|
148
|
-
skills: []
|
|
149
|
-
subagents: []
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
每条 Tool/Skill 记录包含:
|
|
153
|
-
|
|
154
|
-
- `code`:Agent Manifest 中声明的资源编码。
|
|
155
|
-
- `version`:确定的语义化版本。
|
|
156
|
-
- `source`:`registry` 或 `local`。
|
|
157
|
-
- `path`:相对于项目根的可移植目录路径。
|
|
158
|
-
- `digest`:对应 Manifest 文件字节的 SHA-256,用于开发态缓存完整性校验。
|
|
159
|
-
|
|
160
|
-
Registry 资源存放在 `.eap/remote`;工程内资源在 `tools/<code>` 或 `skills/<code>`。`eap.lock.yaml` 中 `source: local` 的 digest 优先按 `toolset.manifest.json` 计算,没有该文件再回退 `tool.manifest.json`。`source: registry` 也可以是 toolset;SDK 把它及同目录制品作为整体复制,不展开或校验其 `tools[]` 子工具。绝对路径、`..` 穿越、符号链接、缺失目录、缺失 Manifest 和本地/Registry 同名冲突都会被拒绝。
|
|
161
|
-
|
|
162
|
-
安装单个远程资源:
|
|
163
|
-
|
|
164
|
-
```ts
|
|
165
|
-
import { installAgentResource } from '@gt-fe/eap-sdk';
|
|
166
|
-
|
|
167
|
-
await installAgentResource({
|
|
168
|
-
root: process.cwd(),
|
|
169
|
-
kind: 'tool',
|
|
170
|
-
code: 'search-tool',
|
|
171
|
-
version: '1.2.0',
|
|
172
|
-
token: process.env.EAP_TOKEN,
|
|
173
|
-
});
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
按名称和精确版本安装当前项目中的本地资源:
|
|
177
|
-
|
|
178
|
-
```ts
|
|
179
|
-
import { installLocalAgentResource } from '@gt-fe/eap-sdk';
|
|
180
|
-
|
|
181
|
-
await installLocalAgentResource({
|
|
182
|
-
root: process.cwd(),
|
|
183
|
-
kind: 'tool',
|
|
184
|
-
code: 'echo-tool',
|
|
185
|
-
version: '1.0.0',
|
|
186
|
-
});
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
按名称卸载当前项目中的本地或 Registry 资源:
|
|
190
|
-
|
|
191
|
-
```ts
|
|
192
|
-
import { uninstallAgentResource } from '@gt-fe/eap-sdk';
|
|
193
|
-
|
|
194
|
-
await uninstallAgentResource({
|
|
195
|
-
root: process.cwd(),
|
|
196
|
-
code: 'echo-tool',
|
|
197
|
-
});
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
恢复全部锁定资源并刷新本地资源记录:
|
|
201
|
-
|
|
202
|
-
```ts
|
|
203
|
-
import { installAgentDependencies } from '@gt-fe/eap-sdk';
|
|
204
|
-
|
|
205
|
-
const result = await installAgentDependencies({ root: process.cwd() });
|
|
206
|
-
console.log(result.restoredRegistryResources, result.refreshedLocalResources);
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
只有安装 API 会访问平台。服务启动和打包默认离线;远程缓存缺失时应先执行安装,而不是在 Runtime 启动后动态拉取。
|
|
210
|
-
|
|
211
|
-
Registry Tool/Skill 安装会按 code 和 version 查询 Portal 资源详情,并通过其中的 `source_url` 下载 ZIP 制品。制品会解压到 `.eap/remote/tools/<code>/<version>/` 或 `.eap/remote/skills/<code>/<version>/`;锁文件中的 `digest` 是解压后根 Manifest 文件字节的 SHA-256,用于离线完整性校验。
|
|
212
|
-
|
|
213
|
-
`agent.manifest.json` 只使用 `toolRefs`、`skillRefs` 和 `subagentRefs` 声明依赖;其中 `subagentRefs` 使用 `{ code, version }`,不会触发 Tool/Skill ZIP 下载。
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
await
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
`
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
.
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
1
|
+
# @gt-fe/eap-sdk
|
|
2
|
+
|
|
3
|
+
`@gt-fe/eap-sdk` 是 EAP 单 Agent 项目的开发期 SDK,负责项目发现与校验、用户会话、平台 API、Tool/Skill 依赖安装、Runtime 目录物化、本地 Agent Service 以及确定性打包。
|
|
4
|
+
|
|
5
|
+
Agent 的实际执行仍由 `@gt-fe/eap-runtime` 负责。SDK 不重新实现 Graph 编译、节点执行、Tool 路由或 Runtime 事件协议。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @gt-fe/eap-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
本包为纯 ESM:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { createAgentService } from '@gt-fe/eap-sdk';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 项目模型
|
|
20
|
+
|
|
21
|
+
一个项目只开发一个 Agent,开发者维护的源文件位于项目根目录:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
<project>/
|
|
25
|
+
├── agent.manifest.json
|
|
26
|
+
├── graph.json
|
|
27
|
+
├── eap.config.json
|
|
28
|
+
├── eap.lock.yaml
|
|
29
|
+
├── tools/<code>/...
|
|
30
|
+
├── skills/<code>/...
|
|
31
|
+
└── .eap/
|
|
32
|
+
├── remote/ # Registry 资源缓存
|
|
33
|
+
├── runtime/ # 开发态 EAP_PREINSTALL_ROOT
|
|
34
|
+
│ └── agents/<agentCode>/<version>/preinstall|users/
|
|
35
|
+
├── sessions/ # 可选的本地会话数据
|
|
36
|
+
├── package-staging/ # 打包临时目录
|
|
37
|
+
└── package/ # 默认包输出目录
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`agent.manifest.json`、`graph.json`、`eap.config.json`、`eap.lock.yaml` 以及本地 `tools/`、`skills/` 是项目输入;`.eap/` 是 SDK 生成的可删除状态。
|
|
41
|
+
|
|
42
|
+
项目 `eap.config.json.version` 必须严格等于当前安装的 `@gt-fe/eap-sdk` package version;字段级配置和部署交付说明见 [dev-tools 文档入口](../../docs/README.md)。
|
|
43
|
+
|
|
44
|
+
`findAgentRoot()` 和 `resolveAgentProject()` 只发现源项目,不使用 `EAP_PREINSTALL_ROOT`。选择器只支持 `root` 和 `startDir`,不存在 Agent code、版本或目录歧义选择。
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import {
|
|
48
|
+
resolveAgentProject,
|
|
49
|
+
validateAgentProject,
|
|
50
|
+
type AgentProjectSelector,
|
|
51
|
+
} from '@gt-fe/eap-sdk';
|
|
52
|
+
|
|
53
|
+
const selector: AgentProjectSelector = { root: process.cwd() };
|
|
54
|
+
const project = resolveAgentProject(selector);
|
|
55
|
+
const validation = validateAgentProject(project.root);
|
|
56
|
+
|
|
57
|
+
if (!validation.valid) {
|
|
58
|
+
console.error(validation.issues);
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 核心能力
|
|
63
|
+
|
|
64
|
+
| 能力 | 主要 API | 说明 |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| 项目发现 | `findAgentRoot()`、`resolveAgentProject()` | 查找根级单 Agent 项目 |
|
|
67
|
+
| 项目校验 | `validateAgentProject()`、`validateGraph()` | 校验 Manifest、Graph、`eap.lock.yaml` 和资源路径 |
|
|
68
|
+
| 用户会话 | `getCurrentUserSession()`、`saveCurrentUserSession()` | 管理当前登录用户和平台 Token;本地可用 `EAP_CHAT_USER` / `EAP_DEBUG_USER` |
|
|
69
|
+
| 平台 API | `createPlatformClient()` | 访问 Portal、Foundation 和平台认证 |
|
|
70
|
+
| 依赖安装 | `installAgentResource()`、`installAgentDependencies()` | 下载或恢复 Tool/Skill ZIP 制品,并维护 `eap.lock.yaml` |
|
|
71
|
+
| Runtime 物化 | `prepareAgentRuntime()` | 生成 Runtime 可直接读取的预装目录 |
|
|
72
|
+
| 本地服务 | `createAgentService()` | 物化后创建 Runtime-backed Agent Service |
|
|
73
|
+
| Standalone 服务 | `packageStandaloneAgentProject()`、`createEmbeddedAgentService()` | 将同一套物化 Runtime 输出到 `dist/runtime`,启动时不读取源项目 |
|
|
74
|
+
| 打包与验包 | `packageAgentProject()`、`readAgentPackage()` | 生成并校验单 Agent Runtime 部署包 |
|
|
75
|
+
| Schema | `AgentManifestSchema`、`GraphSchema`、`ToolManifestSchema` 等 | SDK 所有项目文件的 Zod Schema |
|
|
76
|
+
|
|
77
|
+
所有公共 API 均从包根导出,不需要导入内部路径。
|
|
78
|
+
|
|
79
|
+
## 平台 API
|
|
80
|
+
|
|
81
|
+
`createPlatformClient()` 是 Portal 与 Foundation HTTP 调用的统一入口。端点由调用方显式提供,客户端会使用当前用户会话 Token;也可通过 `token` 覆盖,便于服务端或测试宿主注入凭证。
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
import { createPlatformClient } from '@gt-fe/eap-sdk';
|
|
85
|
+
|
|
86
|
+
const platform = createPlatformClient({
|
|
87
|
+
portalEndpoint: 'https://portal.example',
|
|
88
|
+
foundationEndpoint: 'https://foundation.example',
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const agents = await platform.portalFetch('/api/v1/agents');
|
|
92
|
+
const deployment = await platform.foundationFetch('/api/v1/deployments', {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
body: JSON.stringify({ agentCode: 'report-agent', version: '1.0.0' }),
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
客户端同时提供 `checkPortalHealth()`、`checkFoundationHealth()`、`uploadPortalFile()`,以及会保存统一用户会话的 `loginWithCas()`、`validateAndSaveToken()`,和吊销 Token 的 `revokeToken()`。Registry Tool/Skill 安装也使用此客户端,不再维护独立 HTTP 实现。
|
|
99
|
+
|
|
100
|
+
## 当前用户会话
|
|
101
|
+
|
|
102
|
+
SDK 将当前用户资料和平台凭证统一保存在 `~/.eap/config.json`;可通过 `EAP_CONFIG_DIR` 修改目录。
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
import {
|
|
106
|
+
clearCurrentUserSession,
|
|
107
|
+
getCurrentUserSession,
|
|
108
|
+
getCurrentUserToken,
|
|
109
|
+
saveCurrentUserSession,
|
|
110
|
+
} from '@gt-fe/eap-sdk';
|
|
111
|
+
|
|
112
|
+
saveCurrentUserSession({
|
|
113
|
+
userId: 'U001',
|
|
114
|
+
username: 'alice',
|
|
115
|
+
roles: ['developer'],
|
|
116
|
+
permissions: [],
|
|
117
|
+
token: '<platform-token>',
|
|
118
|
+
authMethod: 'token',
|
|
119
|
+
platformUrl: 'https://foundation.example',
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const user = getCurrentUserSession();
|
|
123
|
+
const token = getCurrentUserToken();
|
|
124
|
+
clearCurrentUserSession();
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
规则如下:
|
|
128
|
+
|
|
129
|
+
- 同一时刻只有一个当前用户,不随 CLI profile 或 Runtime storage profile 切换。
|
|
130
|
+
- `getCurrentUserSession()` 始终返回用户资料;没有已保存会话时返回 `default-user`。
|
|
131
|
+
- `getCurrentUserToken()` 优先读取 `EAP_TOKEN`,否则读取已保存 Token;默认用户不提供 Token。
|
|
132
|
+
- Runtime 环境准备会把当前 Token 映射为 `EAP_DELEGATION_TOKEN`。
|
|
133
|
+
- 用户资料在进程内缓存;测试或特殊宿主可调用 `clearUserSessionCache()` 清除缓存。
|
|
134
|
+
|
|
135
|
+
## 版本锁定文件与资源安装
|
|
136
|
+
|
|
137
|
+
开发态版本锁定文件是 `eap.lock.yaml`(规格称 `eap.lock`)。只供 dev-tools 在安装、校验、Runtime 准备和打包时使用。Runtime 与生产 Hosting 都不读它;发布包目标态是 `dependencies.lock`。
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
lockfileVersion: 2
|
|
141
|
+
resources:
|
|
142
|
+
tools:
|
|
143
|
+
- code: search-tool
|
|
144
|
+
version: 1.2.0
|
|
145
|
+
source: registry
|
|
146
|
+
path: .eap/remote/tools/search-tool/1.2.0
|
|
147
|
+
digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
|
|
148
|
+
skills: []
|
|
149
|
+
subagents: []
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
每条 Tool/Skill 记录包含:
|
|
153
|
+
|
|
154
|
+
- `code`:Agent Manifest 中声明的资源编码。
|
|
155
|
+
- `version`:确定的语义化版本。
|
|
156
|
+
- `source`:`registry` 或 `local`。
|
|
157
|
+
- `path`:相对于项目根的可移植目录路径。
|
|
158
|
+
- `digest`:对应 Manifest 文件字节的 SHA-256,用于开发态缓存完整性校验。
|
|
159
|
+
|
|
160
|
+
Registry 资源存放在 `.eap/remote`;工程内资源在 `tools/<code>` 或 `skills/<code>`。`eap.lock.yaml` 中 `source: local` 的 digest 优先按 `toolset.manifest.json` 计算,没有该文件再回退 `tool.manifest.json`。`source: registry` 也可以是 toolset;SDK 把它及同目录制品作为整体复制,不展开或校验其 `tools[]` 子工具。绝对路径、`..` 穿越、符号链接、缺失目录、缺失 Manifest 和本地/Registry 同名冲突都会被拒绝。
|
|
161
|
+
|
|
162
|
+
安装单个远程资源:
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
import { installAgentResource } from '@gt-fe/eap-sdk';
|
|
166
|
+
|
|
167
|
+
await installAgentResource({
|
|
168
|
+
root: process.cwd(),
|
|
169
|
+
kind: 'tool',
|
|
170
|
+
code: 'search-tool',
|
|
171
|
+
version: '1.2.0',
|
|
172
|
+
token: process.env.EAP_TOKEN,
|
|
173
|
+
});
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
按名称和精确版本安装当前项目中的本地资源:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
import { installLocalAgentResource } from '@gt-fe/eap-sdk';
|
|
180
|
+
|
|
181
|
+
await installLocalAgentResource({
|
|
182
|
+
root: process.cwd(),
|
|
183
|
+
kind: 'tool',
|
|
184
|
+
code: 'echo-tool',
|
|
185
|
+
version: '1.0.0',
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
按名称卸载当前项目中的本地或 Registry 资源:
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
import { uninstallAgentResource } from '@gt-fe/eap-sdk';
|
|
193
|
+
|
|
194
|
+
await uninstallAgentResource({
|
|
195
|
+
root: process.cwd(),
|
|
196
|
+
code: 'echo-tool',
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
恢复全部锁定资源并刷新本地资源记录:
|
|
201
|
+
|
|
202
|
+
```ts
|
|
203
|
+
import { installAgentDependencies } from '@gt-fe/eap-sdk';
|
|
204
|
+
|
|
205
|
+
const result = await installAgentDependencies({ root: process.cwd() });
|
|
206
|
+
console.log(result.restoredRegistryResources, result.refreshedLocalResources);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
只有安装 API 会访问平台。服务启动和打包默认离线;远程缓存缺失时应先执行安装,而不是在 Runtime 启动后动态拉取。
|
|
210
|
+
|
|
211
|
+
Registry Tool/Skill 安装会按 code 和 version 查询 Portal 资源详情,并通过其中的 `source_url` 下载 ZIP 制品。制品会解压到 `.eap/remote/tools/<code>/<version>/` 或 `.eap/remote/skills/<code>/<version>/`;锁文件中的 `digest` 是解压后根 Manifest 文件字节的 SHA-256,用于离线完整性校验。
|
|
212
|
+
|
|
213
|
+
`agent.manifest.json` 只使用 `toolRefs`、`skillRefs` 和 `subagentRefs` 声明依赖;其中 `subagentRefs` 使用 `{ code, version }`,不会触发 Tool/Skill ZIP 下载。
|
|
214
|
+
|
|
215
|
+
Skill 包的 `skill.manifest.json` 可以通过 `toolsets`(或旧版 `toolRefs` 中的 `{ code, version }` 对象)声明 Toolset 依赖。安装 Skill 时,这些依赖会合并到 Agent 的 `toolRefs` 和 `eap.lock.yaml`:
|
|
216
|
+
|
|
217
|
+
- Agent 已有同名 Toolset 时,以 Agent 的版本为准,Skill 不会覆盖它。
|
|
218
|
+
- Agent 没有同名 Toolset 时,Registry Skill 会按 Skill 声明的版本安装 Registry Tool;本地 Skill 会复用并锁定当前项目的本地 Tool,缺失时提示先执行 `eap install`。
|
|
219
|
+
- Skill 中仅有字符串工具名或 `{ toolId, name }` 的引用属于 Runtime 的工具筛选信息,不会被误当成可下载的 Toolset。
|
|
220
|
+
|
|
221
|
+
卸载 Tool 前 SDK 会检查当前 Agent 已声明的 Skill 依赖。仍被 Skill 引用时会拒绝卸载,并列出 Skill 版本;请先更新 Skill 或在平台重新配置依赖,再重新安装 Skill 后卸载 Tool。
|
|
222
|
+
|
|
223
|
+
## Runtime 目录物化
|
|
224
|
+
|
|
225
|
+
`prepareAgentRuntime()` 根据 Agent Manifest 和 `eap.lock.yaml` 生成一棵完整、干净的 Runtime 目录:
|
|
226
|
+
|
|
227
|
+
```ts
|
|
228
|
+
import { prepareAgentRuntime } from '@gt-fe/eap-sdk';
|
|
229
|
+
|
|
230
|
+
const prepared = await prepareAgentRuntime({ root: process.cwd() });
|
|
231
|
+
console.log(prepared.runtimeRoot);
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
资源映射规则:
|
|
235
|
+
|
|
236
|
+
| 来源 | Runtime 目标目录 |
|
|
237
|
+
|---|---|
|
|
238
|
+
| Registry Toolset | `agents/<agentCode>/<version>/preinstall/tools/<toolsetCode>/` |
|
|
239
|
+
| Registry Skill | `agents/<agentCode>/<version>/preinstall/skills/<skillCode>/` |
|
|
240
|
+
| 本地 Tool | `agents/<agentCode>/<version>/users/<developerUserId>/tools/<toolCode>/` |
|
|
241
|
+
| 本地 Skill | `agents/<agentCode>/<version>/users/<developerUserId>/skills/<skillCode>/` |
|
|
242
|
+
|
|
243
|
+
物化器还会:
|
|
244
|
+
|
|
245
|
+
- 复制根级 Agent Manifest 与 Graph。
|
|
246
|
+
- 校验本地资源的根 Manifest 摘要和 Registry 解压缓存中的根 Manifest 摘要;锁文件不记录 Registry ZIP 摘要。
|
|
247
|
+
- 生成 `dependencies.lock`、`snapshot.json` 和 `.ready`。
|
|
248
|
+
- 把 Registry Toolset/Skill 复制到该 Agent 的 `preinstall/`,把本地 Tool/Skill 复制到 `users/<developerUserId>/`;不再生成 `shared/`。
|
|
249
|
+
- 排除 `.git`、`.eap`、`node_modules`、`.env*`、coverage 和临时文件。
|
|
250
|
+
- 拒绝符号链接和越界路径。
|
|
251
|
+
- 通过临时目录加原子替换,避免 Runtime 看到半成品。
|
|
252
|
+
|
|
253
|
+
物化器不创建 Runtime、不启动 HTTP 服务、不访问平台,也不负责压缩包。
|
|
254
|
+
|
|
255
|
+
摘要字段的输入和格式见 [dev-tools SHA-256 摘要约定](../../docs/README.md#sha-256-摘要约定)。
|
|
256
|
+
|
|
257
|
+
## Agent 服务
|
|
258
|
+
|
|
259
|
+
`createAgentService()` 是异步工厂,因为必须先完成校验和目录物化,再构造 Runtime:
|
|
260
|
+
|
|
261
|
+
```ts
|
|
262
|
+
import { createAgentService } from '@gt-fe/eap-sdk';
|
|
263
|
+
|
|
264
|
+
const service = await createAgentService({
|
|
265
|
+
root: process.cwd(),
|
|
266
|
+
messages: [{ role: 'system', content: '你是一个数据分析助手。' }],
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
const result = await service.invoke('汇总这份报告');
|
|
270
|
+
|
|
271
|
+
for await (const event of service.stream('列出支撑数据')) {
|
|
272
|
+
console.log(event.type, event.data);
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
启动本地 HTTP 服务:
|
|
277
|
+
|
|
278
|
+
```ts
|
|
279
|
+
await service.start({ host: '127.0.0.1', port: 3000 });
|
|
280
|
+
// 使用结束后
|
|
281
|
+
await service.stop();
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
默认行为:
|
|
285
|
+
|
|
286
|
+
- `EAP_PREINSTALL_ROOT` 指向准备好的 `.eap/runtime`,不是项目源目录。
|
|
287
|
+
- Runtime 只从准备好的 `.eap/runtime` 读取 Tool/Skill 定义;本地资源必须先锁定并物化。
|
|
288
|
+
- `eap chat` / `eap dev` 传入 `sessionPersistence: true`,使用 Runtime `dev` profile,会话与消息写入 `.eap/sessions`。
|
|
289
|
+
- Runtime `test` profile 为 Redis+PostgreSQL,不再表示内存。`createAgentService()` 在未开启 `sessionPersistence` 时仍设置 `EAP_RUNTIME_STORAGE_PROFILE=test`,本地嵌入须显式 `sessionPersistence: true` 或 `dev`。
|
|
290
|
+
|
|
291
|
+
需要注入自定义 Runtime 时,使用 `runtimeFactory(prepared, environment)`。不要传入已经构造完成、并绑定了其他 GraphLoader 根目录的 Runtime。
|
|
292
|
+
|
|
293
|
+
### Standalone Runtime 服务
|
|
294
|
+
|
|
295
|
+
使用现有 `eap package` 命令生成独立服务需要的 Runtime 目录:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
eap package --target standalone --output ./dist/runtime
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
该模式复用项目校验、资源解析、Runtime 物化和摘要校验,但不生成 TAR.GZ,也不复制项目的
|
|
302
|
+
`package.json`、`eap.config.json` 或 `eap.lock.yaml`。输出目录结构为
|
|
303
|
+
`dist/runtime/agents/<code>/<version>/`。
|
|
304
|
+
|
|
305
|
+
已由构建工具打包的服务入口可以直接消费该目录:
|
|
306
|
+
|
|
307
|
+
```ts
|
|
308
|
+
import { createEmbeddedAgentService } from '@gt-fe/eap-sdk';
|
|
309
|
+
import { dirname, join } from 'node:path';
|
|
310
|
+
import { fileURLToPath } from 'node:url';
|
|
311
|
+
|
|
312
|
+
const service = await createEmbeddedAgentService({
|
|
313
|
+
runtimeRoot: join(dirname(fileURLToPath(import.meta.url)), 'runtime'),
|
|
314
|
+
});
|
|
315
|
+
await service.start({ host: '0.0.0.0', port: 3000 });
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
`createEmbeddedAgentService()` 只校验并读取已物化 Runtime,不会重新发现源项目或执行物化。
|
|
319
|
+
默认的 `eap package` 行为不变,仍然生成可交付的 TAR.GZ 部署包。
|
|
320
|
+
|
|
321
|
+
## 打包与验包
|
|
322
|
+
|
|
323
|
+
`packageAgentProject()` 会独立生成 package staging Runtime 树,不复用开发态 `.eap/runtime`:
|
|
324
|
+
|
|
325
|
+
```ts
|
|
326
|
+
import { packageAgentProject, readAgentPackage } from '@gt-fe/eap-sdk';
|
|
327
|
+
|
|
328
|
+
const artifact = await packageAgentProject({
|
|
329
|
+
root: process.cwd(),
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
const verified = readAgentPackage(artifact.archivePath);
|
|
333
|
+
console.log(verified.manifest.agents[0], verified.digest);
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
默认输出:
|
|
337
|
+
|
|
338
|
+
```text
|
|
339
|
+
.eap/package/eap-agent-project.tar.gz
|
|
340
|
+
.eap/package/eap-agent-project.tar.gz.sha256
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
部署包只包含:
|
|
344
|
+
|
|
345
|
+
- 物化后的 Agent 版本目录内容,直接展开到包根目录(例如 `agent.manifest.json`、`graph.json`、`preinstall/`、`users/`)。
|
|
346
|
+
- 根目录的包文件索引 `eap-package.json`。
|
|
347
|
+
|
|
348
|
+
部署包不会包含 `eap.lock.yaml`、`.eap/remote`、会话、checkpoint、staging 名称或其他开发缓存。`readAgentPackage()` 会校验 `eap-package.json` 的所有文件大小和摘要,并要求包内恰好有一个 Agent。
|
|
349
|
+
|
|
350
|
+
## 项目配置映射
|
|
351
|
+
|
|
352
|
+
`eap.config.json` 由 `EapProjectConfigSchema` 校验。SDK 在 Runtime 构造前完成以下主要映射:
|
|
353
|
+
|
|
354
|
+
顶层 `version` 是 SDK package version;配置版本不匹配时项目校验、服务创建和打包都会失败。
|
|
355
|
+
|
|
356
|
+
| 项目配置或输入 | Runtime 环境变量 |
|
|
357
|
+
|---|---|
|
|
358
|
+
| `platform.portalUrl` | `EAP_PLATFORM_ENDPOINT` |
|
|
359
|
+
| `platform.foundationServiceUrl` | `FOUNDATION_SERVICE_URL` |
|
|
360
|
+
| `runtime.deploymentContext` | `EAP_DEPLOYMENT_CONTEXT` |
|
|
361
|
+
| `runtime.governance.enabled` | `GOVERNANCE_DISABLED` |
|
|
362
|
+
| `runtime.storage` | `EAP_RUNTIME_STORAGE_PROFILE`、`EAP_CHECKPOINT_DIR` |
|
|
363
|
+
| `runtime.tools` | `EAP_TOOL_EXECUTION_MODE`、`EAP_TOOL_GATEWAY_TRANSPORT` |
|
|
364
|
+
| 准备好的 Runtime 目录 | `EAP_PREINSTALL_ROOT` |
|
|
365
|
+
| 当前用户 Token | `EAP_DELEGATION_TOKEN` |
|
|
366
|
+
|
|
367
|
+
显式环境变量优先于大多数项目配置;`EAP_PREINSTALL_ROOT` 始终使用本次物化得到的目录。
|
|
368
|
+
|
|
369
|
+
## 内置模板
|
|
370
|
+
|
|
371
|
+
SDK 与 CLI 使用同一套根级单 Agent 项目约定。内置模板包括:
|
|
372
|
+
|
|
373
|
+
- `simple-flow`:固定顺序工作流。
|
|
374
|
+
- `single-agent-with-tools`:单 Agent + ReAct Tool 调用。
|
|
375
|
+
- `plan-and-execute`:规划、Tool 执行、总结。
|
|
376
|
+
- `dag-workflow`:条件分支与任务聚合。
|
|
377
|
+
|
|
378
|
+
工作流语义由 `graph.json` 表达,`agent.manifest.json` 只保存身份和依赖。包含 Tool 的模板自带本地、已锁定的 `echo-tool`,校验和打包不依赖 Registry 缓存。
|