@migor/agentia 0.2.0 → 0.2.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/LICENSE +21 -0
- package/README.en.md +144 -0
- package/README.md +202 -76
- package/dist/AGENTS.md +811 -0
- package/dist/container/container.d.ts +10 -2
- package/dist/container/container.js +27 -3
- package/dist/container/container.js.map +1 -1
- package/dist/core/abort.d.ts +10 -0
- package/dist/core/abort.js +28 -0
- package/dist/core/abort.js.map +1 -0
- package/dist/core/blackboard.d.ts +37 -0
- package/dist/core/blackboard.js +2 -0
- package/dist/core/blackboard.js.map +1 -0
- package/dist/core/json.d.ts +2 -0
- package/dist/core/json.js +4 -0
- package/dist/core/json.js.map +1 -1
- package/dist/core/run.d.ts +18 -0
- package/dist/core/run.js +2 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/schema.js +2 -2
- package/dist/core/schema.js.map +1 -1
- package/dist/core/tool.d.ts +62 -7
- package/dist/core/trace.d.ts +20 -4
- package/dist/engine/budget.d.ts +49 -0
- package/dist/engine/budget.js +30 -0
- package/dist/engine/budget.js.map +1 -0
- package/dist/engine/concurrency.d.ts +43 -0
- package/dist/engine/concurrency.js +95 -0
- package/dist/engine/concurrency.js.map +1 -0
- package/dist/engine/errors.d.ts +2 -0
- package/dist/engine/errors.js +7 -0
- package/dist/engine/errors.js.map +1 -1
- package/dist/engine/loop.d.ts +35 -10
- package/dist/engine/loop.js +336 -66
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/policy.d.ts +9 -1
- package/dist/engine/policy.js +8 -5
- package/dist/engine/policy.js.map +1 -1
- package/dist/engine/replay.d.ts +10 -4
- package/dist/engine/replay.js +57 -27
- package/dist/engine/replay.js.map +1 -1
- package/dist/engine/retry.d.ts +47 -0
- package/dist/engine/retry.js +51 -0
- package/dist/engine/retry.js.map +1 -0
- package/dist/engine/spec.d.ts +61 -0
- package/dist/{run → engine}/spec.js +4 -1
- package/dist/engine/spec.js.map +1 -0
- package/dist/engine/tracer.d.ts +9 -0
- package/dist/engine/tracer.js +57 -1
- package/dist/engine/tracer.js.map +1 -1
- package/dist/engine/{context.d.ts → trimming.d.ts} +19 -20
- package/dist/engine/trimming.js +238 -0
- package/dist/engine/trimming.js.map +1 -0
- package/dist/engine/types.d.ts +109 -13
- package/dist/engine/types.js +9 -1
- package/dist/engine/types.js.map +1 -1
- package/dist/engine/usage.d.ts +28 -2
- package/dist/engine/usage.js +39 -6
- package/dist/engine/usage.js.map +1 -1
- package/dist/eval/defineEval.d.ts +73 -0
- package/dist/eval/defineEval.js +44 -0
- package/dist/eval/defineEval.js.map +1 -0
- package/dist/eval/scripted.d.ts +26 -0
- package/dist/eval/scripted.js +43 -0
- package/dist/eval/scripted.js.map +1 -0
- package/dist/index.d.ts +60 -35
- package/dist/index.js +38 -20
- package/dist/index.js.map +1 -1
- package/dist/integrations/anthropic.d.ts +53 -0
- package/dist/integrations/anthropic.js +24 -0
- package/dist/integrations/anthropic.js.map +1 -0
- package/dist/integrations/mcp.d.ts +79 -0
- package/dist/integrations/mcp.js +108 -0
- package/dist/integrations/mcp.js.map +1 -0
- package/dist/integrations/metrics.d.ts +131 -0
- package/dist/integrations/metrics.js +488 -0
- package/dist/integrations/metrics.js.map +1 -0
- package/dist/{run → integrations}/openai.d.ts +12 -5
- package/dist/integrations/openai.js +386 -0
- package/dist/integrations/openai.js.map +1 -0
- package/dist/integrations/otlp.js.map +1 -0
- package/dist/integrations/report.d.ts +78 -0
- package/dist/integrations/report.js +257 -0
- package/dist/integrations/report.js.map +1 -0
- package/dist/runtime/context.d.ts +25 -0
- package/dist/{run → runtime}/context.js +8 -1
- package/dist/runtime/context.js.map +1 -0
- package/dist/{run → runtime}/memory.d.ts +1 -1
- package/dist/{run → runtime}/memory.js +3 -1
- package/dist/runtime/memory.js.map +1 -0
- package/dist/{run → runtime}/run.d.ts +22 -5
- package/dist/runtime/run.js +218 -0
- package/dist/runtime/run.js.map +1 -0
- package/dist/runtime/session.d.ts +27 -0
- package/dist/runtime/session.js +16 -0
- package/dist/runtime/session.js.map +1 -0
- package/dist/{run → runtime}/spec.d.ts +16 -2
- package/dist/runtime/spec.js +28 -0
- package/dist/runtime/spec.js.map +1 -0
- package/dist/{run → runtime}/systemPrompt.d.ts +12 -0
- package/dist/{run → runtime}/systemPrompt.js +16 -3
- package/dist/runtime/systemPrompt.js.map +1 -0
- package/dist/{run → runtime}/types.js.map +1 -1
- package/dist/{run → store}/fsStore.d.ts +15 -0
- package/dist/{run → store}/fsStore.js +43 -1
- package/dist/store/fsStore.js.map +1 -0
- package/dist/{run → store}/redisStore.d.ts +23 -1
- package/dist/{run → store}/redisStore.js +33 -6
- package/dist/store/redisStore.js.map +1 -0
- package/dist/{run → store}/sqliteStore.js +22 -1
- package/dist/store/sqliteStore.js.map +1 -0
- package/dist/{run → store}/store.d.ts +25 -3
- package/dist/store/store.js +63 -0
- package/dist/store/store.js.map +1 -0
- package/dist/toolkit/asset.d.ts +7 -6
- package/dist/toolkit/asset.js +7 -6
- package/dist/toolkit/asset.js.map +1 -1
- package/dist/toolkit/collect.d.ts +20 -7
- package/dist/toolkit/collect.js +21 -7
- package/dist/toolkit/collect.js.map +1 -1
- package/dist/toolkit/discover.d.ts +21 -1
- package/dist/toolkit/discover.js +59 -12
- package/dist/toolkit/discover.js.map +1 -1
- package/dist/toolkit/middleware.d.ts +10 -10
- package/dist/toolkit/middleware.js +17 -4
- package/dist/toolkit/middleware.js.map +1 -1
- package/dist/toolkit/module.d.ts +100 -34
- package/dist/toolkit/module.js +112 -36
- package/dist/toolkit/module.js.map +1 -1
- package/dist/toolkit/prompt.d.ts +4 -6
- package/dist/toolkit/prompt.js +11 -10
- package/dist/toolkit/prompt.js.map +1 -1
- package/dist/toolkit/skill.d.ts +14 -16
- package/dist/toolkit/skill.js +32 -25
- package/dist/toolkit/skill.js.map +1 -1
- package/dist/toolkit/subagent.d.ts +10 -12
- package/dist/toolkit/subagent.js +23 -21
- package/dist/toolkit/subagent.js.map +1 -1
- package/dist/toolkit/tool.d.ts +19 -11
- package/dist/toolkit/tool.js +11 -8
- package/dist/toolkit/tool.js.map +1 -1
- package/dist/toolkit/zod.d.ts +4 -3
- package/dist/toolkit/zod.js +2 -1
- package/dist/toolkit/zod.js.map +1 -1
- package/dist/transport/async.d.ts +133 -0
- package/dist/transport/async.js +415 -0
- package/dist/transport/async.js.map +1 -0
- package/dist/transport/http.d.ts +146 -0
- package/dist/transport/http.js +387 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/{run → transport}/scheduler.d.ts +9 -1
- package/dist/transport/scheduler.js +133 -0
- package/dist/transport/scheduler.js.map +1 -0
- package/dist/transport/sse.d.ts +43 -0
- package/dist/transport/sse.js +51 -0
- package/dist/transport/sse.js.map +1 -0
- package/dist/{run → transport}/transport.d.ts +1 -1
- package/dist/{run → transport}/transport.js +1 -1
- package/dist/transport/transport.js.map +1 -0
- package/package.json +24 -9
- package/dist/engine/context.js +0 -146
- package/dist/engine/context.js.map +0 -1
- package/dist/run/async.d.ts +0 -59
- package/dist/run/async.js +0 -185
- package/dist/run/async.js.map +0 -1
- package/dist/run/context.d.ts +0 -16
- package/dist/run/context.js.map +0 -1
- package/dist/run/fsStore.js.map +0 -1
- package/dist/run/http.d.ts +0 -47
- package/dist/run/http.js +0 -119
- package/dist/run/http.js.map +0 -1
- package/dist/run/memory.js.map +0 -1
- package/dist/run/openai.js +0 -181
- package/dist/run/openai.js.map +0 -1
- package/dist/run/otlp.js.map +0 -1
- package/dist/run/redisStore.js.map +0 -1
- package/dist/run/run.js +0 -129
- package/dist/run/run.js.map +0 -1
- package/dist/run/scheduler.js +0 -85
- package/dist/run/scheduler.js.map +0 -1
- package/dist/run/spec.js.map +0 -1
- package/dist/run/sqliteStore.js.map +0 -1
- package/dist/run/store.js +0 -28
- package/dist/run/store.js.map +0 -1
- package/dist/run/systemPrompt.js.map +0 -1
- package/dist/run/transport.js.map +0 -1
- /package/dist/{run → integrations}/otlp.d.ts +0 -0
- /package/dist/{run → integrations}/otlp.js +0 -0
- /package/dist/{run → runtime}/types.d.ts +0 -0
- /package/dist/{run → runtime}/types.js +0 -0
- /package/dist/{run → store}/sqliteStore.d.ts +0 -0
package/dist/toolkit/asset.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agentia —— 文本资产加载(
|
|
2
|
+
* Agentia —— 文本资产加载(capabilities/<name>/ 目录约定的配套 helper)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* .md
|
|
4
|
+
* 一能力一文件夹时,长文本(prompt 模板、子 agent 的 system)放在能力目录里的
|
|
5
|
+
* .md 文件,能力代码里 `asset(import.meta.url, './system.md')` 直读:
|
|
6
6
|
*
|
|
7
7
|
* ```ts
|
|
8
|
-
* //
|
|
8
|
+
* // capabilities/reviewer/index.ts
|
|
9
9
|
* import { SubAgent, asset } from 'agentia';
|
|
10
10
|
* export default class Reviewer {
|
|
11
11
|
* @SubAgent({ description: '…', schema: {...}, system: asset(import.meta.url, './system.md') })
|
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
* }
|
|
14
14
|
* ```
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* 读取时机:本函数在**调用处**读文件。把 `asset(...)` 直接当装饰器 spec 值(下面的例子)
|
|
17
|
+
* 是**模块加载期读一次**并固化;要「每次调用重算」(@Prompt 的 volatile 语义),应把
|
|
18
|
+
* `asset(...)` 写在方法体内返回。文本文件读取开销可忽略。
|
|
18
19
|
*
|
|
19
20
|
* @param base 调用方模块的 import.meta.url(相对它解析 rel)
|
|
20
21
|
* @param rel 相对资产路径('./system.md')
|
package/dist/toolkit/asset.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
/**
|
|
3
|
-
* Agentia —— 文本资产加载(
|
|
3
|
+
* Agentia —— 文本资产加载(capabilities/<name>/ 目录约定的配套 helper)。
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* .md
|
|
5
|
+
* 一能力一文件夹时,长文本(prompt 模板、子 agent 的 system)放在能力目录里的
|
|
6
|
+
* .md 文件,能力代码里 `asset(import.meta.url, './system.md')` 直读:
|
|
7
7
|
*
|
|
8
8
|
* ```ts
|
|
9
|
-
* //
|
|
9
|
+
* // capabilities/reviewer/index.ts
|
|
10
10
|
* import { SubAgent, asset } from 'agentia';
|
|
11
11
|
* export default class Reviewer {
|
|
12
12
|
* @SubAgent({ description: '…', schema: {...}, system: asset(import.meta.url, './system.md') })
|
|
@@ -14,8 +14,9 @@ import { readFileSync } from 'node:fs';
|
|
|
14
14
|
* }
|
|
15
15
|
* ```
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* 读取时机:本函数在**调用处**读文件。把 `asset(...)` 直接当装饰器 spec 值(下面的例子)
|
|
18
|
+
* 是**模块加载期读一次**并固化;要「每次调用重算」(@Prompt 的 volatile 语义),应把
|
|
19
|
+
* `asset(...)` 写在方法体内返回。文本文件读取开销可忽略。
|
|
19
20
|
*
|
|
20
21
|
* @param base 调用方模块的 import.meta.url(相对它解析 rel)
|
|
21
22
|
* @param rel 相对资产路径('./system.md')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/toolkit/asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC
|
|
1
|
+
{"version":3,"file":"asset.js","sourceRoot":"","sources":["../../src/toolkit/asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,KAAK,CAAC,IAAkB,EAAE,GAAW;IACnD,OAAO,YAAY,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agentia ——
|
|
2
|
+
* Agentia —— 能力收集器共用内核。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 四类能力(tool/skill/subagent/prompt)的装饰器都只把「方法函数 → spec」登记进
|
|
5
5
|
* 各自的 WeakMap;收集器在容器实例解析后沿原型链扫描出被装饰的方法。
|
|
6
|
-
* 本模块是这一扫描的唯一实现,四个 collect*
|
|
6
|
+
* 本模块是这一扫描的唯一实现,四个 collect* 只做各自能力形态的组装。
|
|
7
7
|
*/
|
|
8
|
-
/** 一次扫描命中:方法 key
|
|
8
|
+
/** 一次扫描命中:方法 key、登记的 spec。 */
|
|
9
9
|
export interface DecoratedMethod<S> {
|
|
10
10
|
key: string | symbol;
|
|
11
|
-
fn: Function;
|
|
12
11
|
spec: S;
|
|
13
12
|
}
|
|
14
13
|
/**
|
|
@@ -17,7 +16,21 @@ export interface DecoratedMethod<S> {
|
|
|
17
16
|
* 父类的 spec(spec 沿原型链继承,调用仍走实例上的子类实现)。
|
|
18
17
|
*/
|
|
19
18
|
export declare function scanDecoratedMethods<S>(instance: object, registry: WeakMap<Function, S>): DecoratedMethod<S>[];
|
|
20
|
-
/**
|
|
21
|
-
export
|
|
19
|
+
/** 装饰器收到的标准 context 子集(本框架只用到这三个字段) */
|
|
20
|
+
export interface CapabilityDecoratorContext {
|
|
21
|
+
kind: string;
|
|
22
|
+
name: string | symbol;
|
|
23
|
+
/** 标准装饰器 context 的私有方法标记(`#method` 的 kind 同样是 'method') */
|
|
24
|
+
private?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 四类能力装饰器共用的目标守卫:只接类方法,且**拒绝私有方法**。
|
|
28
|
+
*
|
|
29
|
+
* 收集走 `Reflect.ownKeys`,私有名(#method)在其中不可见 —— 不拦的话能力会
|
|
30
|
+
* 静默从菜单里消失,作者只能靠「模型说没有这个工具」反推。
|
|
31
|
+
*/
|
|
32
|
+
export declare function assertMethodTarget(context: CapabilityDecoratorContext, kind: string): void;
|
|
33
|
+
/** 能力名解析:spec.name 缺省取方法名;私有符号方法名必须显式给 name。 */
|
|
34
|
+
export declare function capabilityName(spec: {
|
|
22
35
|
name?: string;
|
|
23
36
|
}, key: string | symbol, kind: string): string;
|
package/dist/toolkit/collect.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agentia ——
|
|
2
|
+
* Agentia —— 能力收集器共用内核。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 四类能力(tool/skill/subagent/prompt)的装饰器都只把「方法函数 → spec」登记进
|
|
5
5
|
* 各自的 WeakMap;收集器在容器实例解析后沿原型链扫描出被装饰的方法。
|
|
6
|
-
* 本模块是这一扫描的唯一实现,四个 collect*
|
|
6
|
+
* 本模块是这一扫描的唯一实现,四个 collect* 只做各自能力形态的组装。
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
9
|
* 沿实例原型链扫描被装饰的方法(子类 → 父类)。
|
|
@@ -16,7 +16,7 @@ export function scanDecoratedMethods(instance, registry) {
|
|
|
16
16
|
let proto = Object.getPrototypeOf(instance);
|
|
17
17
|
while (proto && proto !== Object.prototype) {
|
|
18
18
|
// Reflect.ownKeys 含 symbol key:symbol 命名的装饰方法也会被找到,
|
|
19
|
-
// 无显式 name 时由
|
|
19
|
+
// 无显式 name 时由 capabilityName 抛出提示(而非静默忽略)
|
|
20
20
|
for (const key of Reflect.ownKeys(proto)) {
|
|
21
21
|
if (seen.has(key))
|
|
22
22
|
continue;
|
|
@@ -27,14 +27,28 @@ export function scanDecoratedMethods(instance, registry) {
|
|
|
27
27
|
if (!spec)
|
|
28
28
|
continue; // 未装饰的 override 不标 seen,父类 spec 继续生效
|
|
29
29
|
seen.add(key);
|
|
30
|
-
found.push({ key,
|
|
30
|
+
found.push({ key, spec });
|
|
31
31
|
}
|
|
32
32
|
proto = Object.getPrototypeOf(proto);
|
|
33
33
|
}
|
|
34
34
|
return found;
|
|
35
35
|
}
|
|
36
|
-
/**
|
|
37
|
-
|
|
36
|
+
/**
|
|
37
|
+
* 四类能力装饰器共用的目标守卫:只接类方法,且**拒绝私有方法**。
|
|
38
|
+
*
|
|
39
|
+
* 收集走 `Reflect.ownKeys`,私有名(#method)在其中不可见 —— 不拦的话能力会
|
|
40
|
+
* 静默从菜单里消失,作者只能靠「模型说没有这个工具」反推。
|
|
41
|
+
*/
|
|
42
|
+
export function assertMethodTarget(context, kind) {
|
|
43
|
+
if (context.kind !== 'method') {
|
|
44
|
+
throw new Error(`${kind} 只能修饰类方法,收到 kind=${String(context.kind)}`);
|
|
45
|
+
}
|
|
46
|
+
if (context.private) {
|
|
47
|
+
throw new Error(`${kind} 不支持私有方法(#method):收集用 Reflect.ownKeys,私有名不可见`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** 能力名解析:spec.name 缺省取方法名;私有符号方法名必须显式给 name。 */
|
|
51
|
+
export function capabilityName(spec, key, kind) {
|
|
38
52
|
if (typeof spec.name === 'string')
|
|
39
53
|
return spec.name;
|
|
40
54
|
if (typeof key !== 'string') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/toolkit/collect.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/toolkit/collect.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,QAA8B;IAE9B,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IAExC,IAAI,KAAK,GAAkB,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3D,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3C,oDAAoD;QACpD,0CAA0C;QAC1C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU;gBAAE,SAAS;YACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAiB,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI;gBAAE,SAAS,CAAC,qCAAqC;YAC1D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAUD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAmC,EAAE,IAAY;IAClF,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,8CAA8C,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,cAAc,CAC5B,IAAuB,EACvB,GAAoB,EACpB,IAAY;IAEZ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uBAAuB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,2 +1,22 @@
|
|
|
1
1
|
import type { Provider } from '../container/container.js';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Agentia —— 能力目录发现(`<目录>/<name>/index.ts` 约定,spec §7 静态校验仍由装配层统一做)。
|
|
4
|
+
*
|
|
5
|
+
* 入参给**一个目录**或**一组目录**:数组拼成一条搜索路径,**顺序即装配顺序**
|
|
6
|
+
* (典型布局是四分类目录 `src/tools` / `src/skills` / `src/prompts` / `src/subagents`)。
|
|
7
|
+
*
|
|
8
|
+
* 约定(对每个目录各自成立):
|
|
9
|
+
* - 每个子目录 = 一个能力文件夹,入口为 index.ts / index.mts / index.js / index.mjs(按序取先存在者);
|
|
10
|
+
* - 入口 default export 支持三种形态:
|
|
11
|
+
* 1. 类 → { provide: <文件夹名>, useClass: 该类 }
|
|
12
|
+
* 2. Provider 对象 → 原样使用(可用 useFactory/useValue 自定义 token)
|
|
13
|
+
* 3. Provider 数组 → 展开(一个文件夹暴露多个 provider)
|
|
14
|
+
* - DI token 缺省 = 文件夹名(kebab-case 文件夹即 kebab-case token,能力引用照写)。
|
|
15
|
+
*
|
|
16
|
+
* 与手动 providers 可混用:createApp({ providers, discover }) 合并注册,
|
|
17
|
+
* 重名/引用校验在装配期统一进行(AgentApp 构造函数)。
|
|
18
|
+
*
|
|
19
|
+
* 动态 import 决定本函数是异步的 —— createApp 带 discover 时同样返回 Promise。
|
|
20
|
+
*/
|
|
21
|
+
export declare const ENTRY_CANDIDATES: string[];
|
|
22
|
+
export declare function discoverProviders(dir: string | string[]): Promise<Provider[]>;
|
package/dist/toolkit/discover.js
CHANGED
|
@@ -1,50 +1,97 @@
|
|
|
1
|
-
import { existsSync, readdirSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
2
2
|
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
4
|
import { isProvider } from '../container/container.js';
|
|
5
5
|
/**
|
|
6
|
-
* Agentia ——
|
|
6
|
+
* Agentia —— 能力目录发现(`<目录>/<name>/index.ts` 约定,spec §7 静态校验仍由装配层统一做)。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* 入参给**一个目录**或**一组目录**:数组拼成一条搜索路径,**顺序即装配顺序**
|
|
9
|
+
* (典型布局是四分类目录 `src/tools` / `src/skills` / `src/prompts` / `src/subagents`)。
|
|
10
|
+
*
|
|
11
|
+
* 约定(对每个目录各自成立):
|
|
12
|
+
* - 每个子目录 = 一个能力文件夹,入口为 index.ts / index.mts / index.js / index.mjs(按序取先存在者);
|
|
10
13
|
* - 入口 default export 支持三种形态:
|
|
11
14
|
* 1. 类 → { provide: <文件夹名>, useClass: 该类 }
|
|
12
15
|
* 2. Provider 对象 → 原样使用(可用 useFactory/useValue 自定义 token)
|
|
13
16
|
* 3. Provider 数组 → 展开(一个文件夹暴露多个 provider)
|
|
14
|
-
* - DI token 缺省 = 文件夹名(kebab-case 文件夹即 kebab-case token
|
|
17
|
+
* - DI token 缺省 = 文件夹名(kebab-case 文件夹即 kebab-case token,能力引用照写)。
|
|
15
18
|
*
|
|
16
19
|
* 与手动 providers 可混用:createApp({ providers, discover }) 合并注册,
|
|
17
20
|
* 重名/引用校验在装配期统一进行(AgentApp 构造函数)。
|
|
18
21
|
*
|
|
19
22
|
* 动态 import 决定本函数是异步的 —— createApp 带 discover 时同样返回 Promise。
|
|
20
23
|
*/
|
|
21
|
-
const ENTRY_CANDIDATES = ['index.ts', 'index.mts', 'index.js', 'index.mjs'];
|
|
24
|
+
export const ENTRY_CANDIDATES = ['index.ts', 'index.mts', 'index.js', 'index.mjs'];
|
|
22
25
|
export async function discoverProviders(dir) {
|
|
26
|
+
const dirs = Array.isArray(dir) ? dir : [dir];
|
|
27
|
+
const providers = [];
|
|
28
|
+
/** 跨目录的重名 token 记账:四个分类目录下同名文件夹会撞 token,装配期后者静默覆盖 —— 留痕 */
|
|
29
|
+
const seen = new Map();
|
|
30
|
+
for (const d of dirs) {
|
|
31
|
+
for (const p of await discoverOne(d)) {
|
|
32
|
+
const token = String(p.provide);
|
|
33
|
+
const prev = seen.get(token);
|
|
34
|
+
if (prev !== undefined && prev !== d) {
|
|
35
|
+
console.warn(`[agentia:discover] 重名能力 ${token}:先在 ${prev},后在 ${d} —— 装配期后者覆盖前者,菜单里只剩一个`);
|
|
36
|
+
}
|
|
37
|
+
seen.set(token, d);
|
|
38
|
+
providers.push(p);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return providers;
|
|
42
|
+
}
|
|
43
|
+
/** 扫描单个目录(缺目录即报错:显式给出的搜索路径不该静默落空) */
|
|
44
|
+
async function discoverOne(dir) {
|
|
23
45
|
const root = isAbsolute(dir) ? dir : resolve(process.cwd(), dir);
|
|
24
46
|
if (!existsSync(root)) {
|
|
25
|
-
throw new Error(
|
|
47
|
+
throw new Error(`能力目录不存在: ${root}(先创建或用 CLI: agentia g <type> <name>)`);
|
|
48
|
+
}
|
|
49
|
+
if (!statSync(root).isDirectory()) {
|
|
50
|
+
// 存在但是普通文件:readdirSync 会抛原始 ENOTDIR,信息量低且不像配置错误
|
|
51
|
+
throw new Error(`能力目录不是文件夹: ${root}`);
|
|
26
52
|
}
|
|
27
53
|
const providers = [];
|
|
28
54
|
const entries = readdirSync(root, { withFileTypes: true })
|
|
29
|
-
.filter((e) => e.
|
|
55
|
+
.filter((e) => isDirLike(join(root, e.name), e))
|
|
30
56
|
.map((e) => e.name)
|
|
31
57
|
.sort(); // 排序保证装配顺序稳定(菜单顺序 = 目录名序,可复现)
|
|
32
58
|
for (const name of entries) {
|
|
33
59
|
const entry = ENTRY_CANDIDATES.map((f) => join(root, name, f)).find(existsSync);
|
|
34
|
-
if (!entry)
|
|
35
|
-
|
|
60
|
+
if (!entry) {
|
|
61
|
+
// 静默跳过过一次(无入口的目录视为非能力目录,如 assets/):
|
|
62
|
+
// 但「菜单莫名少一个能力」需要留痕,否则只能靠猜
|
|
63
|
+
console.warn(`[agentia:discover] 跳过 ${name}/:无 ${ENTRY_CANDIDATES.join(' / ')} 入口`);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
36
66
|
let mod;
|
|
37
67
|
try {
|
|
38
68
|
mod = await import(pathToFileURL(entry).href);
|
|
39
69
|
}
|
|
40
70
|
catch (e) {
|
|
41
|
-
throw new Error(
|
|
71
|
+
throw new Error(`能力 ${name} 入口加载失败(${entry}): ${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
42
72
|
}
|
|
43
73
|
const exported = mod.default;
|
|
44
74
|
providers.push(...normalizeExport(name, exported, entry));
|
|
45
75
|
}
|
|
46
76
|
return providers;
|
|
47
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* 目录判定:**软链目录**(pnpm store / monorepo 里 `src/tools/foo` 常是软链)的
|
|
80
|
+
* `isDirectory()` 为 false,直接用会把真能力目录静默漏掉、菜单空着却不报错 ——
|
|
81
|
+
* 软链要 stat 解引用后再判。悬空软链按非目录处理。
|
|
82
|
+
*/
|
|
83
|
+
function isDirLike(full, e) {
|
|
84
|
+
if (e.isDirectory())
|
|
85
|
+
return true;
|
|
86
|
+
if (!e.isSymbolicLink())
|
|
87
|
+
return false;
|
|
88
|
+
try {
|
|
89
|
+
return statSync(full).isDirectory();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
48
95
|
function normalizeExport(name, exported, entry) {
|
|
49
96
|
if (typeof exported === 'function') {
|
|
50
97
|
return [{ provide: name, useClass: exported }];
|
|
@@ -55,7 +102,7 @@ function normalizeExport(name, exported, entry) {
|
|
|
55
102
|
if (Array.isArray(exported) && exported.every(isProvider)) {
|
|
56
103
|
return exported;
|
|
57
104
|
}
|
|
58
|
-
throw new Error(
|
|
105
|
+
throw new Error(`能力入口 ${entry} 的 default export 形态非法:应为「类 / Provider / Provider[]」,实际 ${describe(exported)}`);
|
|
59
106
|
}
|
|
60
107
|
function describe(x) {
|
|
61
108
|
if (x === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/toolkit/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/toolkit/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import type { AgentTool, ToolRunContext } from '../core/tool.js';
|
|
2
2
|
/**
|
|
3
|
-
* Agentia ——
|
|
3
|
+
* Agentia —— 能力调用中间件(拦截器链,roadmap R1)。
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* 挂在每一次能力(tool/skill/subagent/prompt)调用的前后:鉴权、限流、结果缓存、
|
|
6
|
+
* 审计日志、超时包装等横切关注点都走这里,不进业务能力。
|
|
7
7
|
*
|
|
8
8
|
* 语义:
|
|
9
9
|
* - 链序 = 注册顺序(洋葱模型:先注册的最外层);
|
|
10
10
|
* - `next()` 放行(可用 `next(newInput)` 改写入参);不调 next 即短路(结果缓存等);
|
|
11
|
-
* -
|
|
11
|
+
* - 抛错按能力失败处理(engine 包成 is_error 回给模型,不中断 run)。
|
|
12
12
|
*
|
|
13
13
|
* 装配期包裹(AgentApp 构造函数),对 engine 零侵入。
|
|
14
14
|
*/
|
|
15
|
-
export interface
|
|
16
|
-
/**
|
|
17
|
-
readonly
|
|
15
|
+
export interface CapabilityCall {
|
|
16
|
+
/** 被调用的能力(name/description/inputSchema 可读) */
|
|
17
|
+
readonly capability: AgentTool;
|
|
18
18
|
/** 模型给出的结构化入参(schema 校验已过) */
|
|
19
19
|
readonly input: unknown;
|
|
20
20
|
/** engine 注入的执行上下文(recorder/parentSpanId/client),同步宿主下可用 */
|
|
21
21
|
readonly ctx?: ToolRunContext;
|
|
22
22
|
}
|
|
23
23
|
/** 放行到下一层;`next(newInput)` 可改写入参,缺省沿用当前 input */
|
|
24
|
-
export type
|
|
25
|
-
export type
|
|
24
|
+
export type CapabilityNext = (input?: unknown) => unknown;
|
|
25
|
+
export type CapabilityMiddleware = (call: CapabilityCall, next: CapabilityNext) => unknown;
|
|
26
26
|
/** 用中间件链包裹工具菜单(链为空时原样返回,零开销)。 */
|
|
27
|
-
export declare function applyMiddleware(tools: AgentTool[], middleware:
|
|
27
|
+
export declare function applyMiddleware(tools: AgentTool[], middleware: CapabilityMiddleware[]): AgentTool[];
|
|
@@ -5,10 +5,23 @@ export function applyMiddleware(tools, middleware) {
|
|
|
5
5
|
return tools.map((tool) => ({
|
|
6
6
|
...tool,
|
|
7
7
|
run: (input, ctx) => {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const step = (i, inp) => {
|
|
9
|
+
if (i >= middleware.length)
|
|
10
|
+
return tool.run(inp, ctx);
|
|
11
|
+
let passed = false;
|
|
12
|
+
return middleware[i]({ capability: tool, input: inp, ctx },
|
|
13
|
+
// rest 形参而非默认值:`next(undefined)` 是「把入参改写成 undefined」,
|
|
14
|
+
// 与 `next()`(沿用当前入参)语义不同,默认值写法分不开这两者。
|
|
15
|
+
// 连调两次会让能力体跑两遍(有副作用的能力尤其危险)——直接报错。
|
|
16
|
+
(...a) => {
|
|
17
|
+
if (passed) {
|
|
18
|
+
throw new Error(`中间件链上 next() 被重复调用(能力 ${tool.name}):一次调用只能放行一次`);
|
|
19
|
+
}
|
|
20
|
+
passed = true;
|
|
21
|
+
return step(i + 1, a.length > 0 ? a[0] : inp);
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
return step(0, input);
|
|
12
25
|
},
|
|
13
26
|
}));
|
|
14
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/toolkit/middleware.ts"],"names":[],"mappings":"AA6BA,iCAAiC;AACjC,MAAM,UAAU,eAAe,
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/toolkit/middleware.ts"],"names":[],"mappings":"AA6BA,iCAAiC;AACjC,MAAM,UAAU,eAAe,CAC7B,KAAkB,EAClB,UAAkC;IAElC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,GAAG,IAAI;QACP,GAAG,EAAE,CAAC,KAAc,EAAE,GAAoB,EAAE,EAAE;YAC5C,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,GAAY,EAAW,EAAE;gBAChD,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACtD,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,OAAO,UAAU,CAAC,CAAC,CAAC,CAClB,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE;gBACrC,sDAAsD;gBACtD,sCAAsC;gBACtC,mCAAmC;gBACnC,CAAC,GAAG,CAAY,EAAE,EAAE;oBAClB,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,CAAC,IAAI,cAAc,CACjD,CAAC;oBACJ,CAAC;oBACD,MAAM,GAAG,IAAI,CAAC;oBACd,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAChD,CAAC,CACF,CAAC;YACJ,CAAC,CAAC;YACF,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/toolkit/module.d.ts
CHANGED
|
@@ -1,36 +1,31 @@
|
|
|
1
1
|
import type Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import type { AgentTool } from '../core/tool.js';
|
|
2
|
+
import type { AgentTool, JsonSchema, ModelPricing, SchemaType } from '../core/tool.js';
|
|
3
3
|
import type { SystemParam } from '../engine/types.js';
|
|
4
|
-
import { SystemPrompt } from '../
|
|
5
|
-
import type { RunInvocationOptions } from '../
|
|
4
|
+
import { SystemPrompt } from '../runtime/systemPrompt.js';
|
|
5
|
+
import type { RunInvocationOptions } from '../engine/spec.js';
|
|
6
|
+
import type { SessionStore } from '../runtime/session.js';
|
|
6
7
|
import type { AgentRunResult } from '../engine/types.js';
|
|
8
|
+
import type { TraceSink } from '../core/trace.js';
|
|
7
9
|
import { Container } from '../container/container.js';
|
|
8
10
|
import type { Provider, Token } from '../container/container.js';
|
|
9
|
-
import type {
|
|
11
|
+
import type { CapabilityMiddleware } from './middleware.js';
|
|
10
12
|
import type { ContextPolicy } from '../engine/types.js';
|
|
13
|
+
import type { RetryOptions } from '../engine/retry.js';
|
|
11
14
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* createApp 组装:DI 容器注册 providers(手动和/或 discover 目录发现)→
|
|
15
|
-
* 从容器实例自动扫描 @Tool / @SubAgent / @Skill / @Prompt 收集成本 app 的工具菜单
|
|
16
|
-
* → agent.run(messages) 带着菜单走 executeRun。装配期统一静态校验(§7):
|
|
17
|
-
* 菜单查重、tools 引用存在性、toolSources 指向。
|
|
18
|
-
* 主 agent 的 system 可由 SystemPrompt 实例给出(内部 build({cache:true})
|
|
19
|
-
* 打稳定前缀 breakpoint),也接受已拼好的 SystemParam 原样透传。
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* 能力包(roadmap R5):第三方包把「单元 providers + 中间件」打包成 AgentModule 分发,
|
|
15
|
+
* 能力包(roadmap R5):第三方包把「能力 providers + 中间件」打包成 AgentModule 分发,
|
|
23
16
|
* 应用侧经 AppOptions.modules 一次性装配。模块的 providers 先于应用级 providers 注册
|
|
24
17
|
*(同 token 应用级覆盖模块级);中间件拼接顺序同样模块在前。
|
|
25
18
|
*/
|
|
26
19
|
export interface AgentModule {
|
|
27
|
-
/** 模块携带的 DI providers
|
|
20
|
+
/** 模块携带的 DI providers(能力类 / 值 / 工厂) */
|
|
28
21
|
providers: Provider[];
|
|
29
|
-
/**
|
|
30
|
-
middleware?:
|
|
22
|
+
/** 模块级能力调用中间件(拼在应用级 middleware 之前,即更外层) */
|
|
23
|
+
middleware?: CapabilityMiddleware[];
|
|
31
24
|
}
|
|
32
25
|
/** 定义能力包:identity 函数,仅给第三方包一个类型锚点与导出约定 */
|
|
33
26
|
export declare function defineModule(m: AgentModule): AgentModule;
|
|
27
|
+
/** 注册全局默认 trace sink(观测 / dev 工具用)。createApp 构造期快照合并,已建应用不受后续注册影响。 */
|
|
28
|
+
export declare function registerDefaultTraceSink(sink: TraceSink): void;
|
|
34
29
|
export interface AppOptions {
|
|
35
30
|
/** 应用名;同时作为 run 名写入 trace */
|
|
36
31
|
name?: string;
|
|
@@ -39,11 +34,12 @@ export interface AppOptions {
|
|
|
39
34
|
/** 能力包:providers 并入(在 providers 之前注册)、middleware 拼接(在 middleware 之前) */
|
|
40
35
|
modules?: AgentModule[];
|
|
41
36
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
37
|
+
* 能力目录发现:`<目录>/<name>/index.ts` 约定(一能力一文件夹)。
|
|
38
|
+
* 给**一个目录**或**一组目录**(数组顺序即装配顺序)——典型布局是四分类目录
|
|
39
|
+
* `src/tools` / `src/skills` / `src/prompts` / `src/subagents`。
|
|
40
|
+
* 启动期扫描装配;因动态 import,带 discover 的 createApp 返回 Promise<AgentApp>。
|
|
45
41
|
*/
|
|
46
|
-
discover?: string;
|
|
42
|
+
discover?: string | string[];
|
|
47
43
|
/** 主 agent system:SystemPrompt 实例(自动打缓存)或拼好的 SystemParam */
|
|
48
44
|
system: SystemPrompt | SystemParam;
|
|
49
45
|
/** 缺省模型;不给则走 engine 默认(claude-opus-5) */
|
|
@@ -54,39 +50,109 @@ export interface AppOptions {
|
|
|
54
50
|
maxIterations?: number;
|
|
55
51
|
/** 缺省上下文预算策略(compaction / context editing) */
|
|
56
52
|
contextPolicy?: ContextPolicy;
|
|
53
|
+
/** 缺省模型请求重试策略(可被单次 run 覆盖);见 RunAgentOptions.retry */
|
|
54
|
+
retry?: RetryOptions | false;
|
|
55
|
+
/** 缺省成本硬管控:整条 run 累计 token 上限(可被单次 run 覆盖) */
|
|
56
|
+
maxTotalTokens?: number;
|
|
57
|
+
/** 缺省成本硬管控:累计成本(美元)上限(可被单次 run 覆盖) */
|
|
58
|
+
maxCostUsd?: number;
|
|
59
|
+
/**
|
|
60
|
+
* 价格表覆盖/追加($/1M tokens,可被单次 run 覆盖);见 `RunAgentOptions.priceOverrides`。
|
|
61
|
+
* 给非 Anthropic 端点(DeepSeek / 自建)定价,否则 `maxCostUsd` 会静默不生效。
|
|
62
|
+
*/
|
|
63
|
+
priceOverrides?: Record<string, ModelPricing>;
|
|
64
|
+
/** 未定价模型回调(可被单次 run 覆盖);见 `RunAgentOptions.onUnpricedModel` */
|
|
65
|
+
onUnpricedModel?: (info: {
|
|
66
|
+
model: string;
|
|
67
|
+
spanId: string;
|
|
68
|
+
}) => void;
|
|
69
|
+
/** 缺省单个工具执行超时(毫秒,可被单次 run 覆盖);0/不设 = 不限 */
|
|
70
|
+
toolTimeoutMs?: number;
|
|
71
|
+
/** 缺省同回合并行工具上限(可被单次 run 覆盖);不设 = 不限 */
|
|
72
|
+
maxToolConcurrency?: number;
|
|
57
73
|
/** 只扫这些 token 的 provider 上的 @Tool;缺省扫全部 providers */
|
|
58
74
|
toolSources?: Token[];
|
|
59
|
-
/**
|
|
60
|
-
|
|
75
|
+
/**
|
|
76
|
+
* 直接追加到主菜单的**裸工具**(`AgentTool[]`)—— 给「构造期才知道有哪些工具」的场景
|
|
77
|
+
* (典型:MCP 桥 `mcpTools()` 的返回值,见 integrations/mcp.ts)。
|
|
78
|
+
*
|
|
79
|
+
* 与装饰器收集来的能力**完全同等**:同样过中间件链、同样进重名查重、同样受
|
|
80
|
+
* `toolSources` 之外的一切装配规则约束(不受 `toolSources` 收窄影响 —— 这是显式追加)。
|
|
81
|
+
* 不经装饰器、不进 DI 容器(它没有 provider token,也不是任何能力的 tools 引用目标)。
|
|
82
|
+
*/
|
|
83
|
+
tools?: AgentTool[];
|
|
84
|
+
/** 能力调用中间件(洋葱模型,链序 = 注册顺序);装配期包裹整个菜单 */
|
|
85
|
+
middleware?: CapabilityMiddleware[];
|
|
86
|
+
/** trace 出口(观测):每次 run 收尾投递;与全局默认 sink 合并(本字段在前) */
|
|
87
|
+
sinks?: TraceSink[];
|
|
61
88
|
}
|
|
62
89
|
/** 单次调用参数 = 通用调用参数 + 单次可覆盖 system(spec.ts 的 RunInvocationOptions 为单源) */
|
|
63
|
-
export interface RunAppOptions extends RunInvocationOptions {
|
|
90
|
+
export interface RunAppOptions<S extends JsonSchema = JsonSchema> extends RunInvocationOptions {
|
|
64
91
|
/** 单次覆盖 system(volatile 段建议每 run 重建以拾取最新值) */
|
|
65
92
|
system?: SystemPrompt | SystemParam;
|
|
93
|
+
/**
|
|
94
|
+
* 结构化结果 schema(R2):语义同 `RunAgentOptions.resultSchema`(engine 追加隐藏
|
|
95
|
+
* submit_result 工具,校验通过的结果写入 `result.typed`)。
|
|
96
|
+
* 传 `fromZod<T>(...)` 时 `app.run` 的返回类型自动带上 `typed: T | undefined`。
|
|
97
|
+
*/
|
|
98
|
+
resultSchema?: S;
|
|
99
|
+
/**
|
|
100
|
+
* 会话持久化(C4):语义同 `ExecuteRunOptions.session` —— run 开始把历史拼在传入
|
|
101
|
+
* messages 之前,成功收尾把本轮消息 + 回复追加回去。与 `blackboard`(键值黑板)正交。
|
|
102
|
+
*
|
|
103
|
+
* 只在程序内直接 `app.run` 时可用(store 实例不可序列化,因此**不在**
|
|
104
|
+
* transport 的 `RunInvocationOptions` 里 —— 异步宿主不会替你传它)。
|
|
105
|
+
*/
|
|
106
|
+
session?: {
|
|
107
|
+
store: SessionStore;
|
|
108
|
+
id: string;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* 未定价模型回调(单次覆盖应用级);见 `RunAgentOptions.onUnpricedModel`。
|
|
112
|
+
* 是函数,因此**不在** transport 的 `RunInvocationOptions` 里(异步宿主不替你传)。
|
|
113
|
+
*/
|
|
114
|
+
onUnpricedModel?: (info: {
|
|
115
|
+
model: string;
|
|
116
|
+
spanId: string;
|
|
117
|
+
}) => void;
|
|
66
118
|
}
|
|
67
|
-
export interface AgentRunOutput {
|
|
68
|
-
run: import('../
|
|
69
|
-
result: AgentRunResult
|
|
119
|
+
export interface AgentRunOutput<T = unknown> {
|
|
120
|
+
run: import('../runtime/run.js').Run;
|
|
121
|
+
result: AgentRunResult<T>;
|
|
70
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Agentia —— 应用装配(spec §4/§6:主 agent + 可调工具菜单)。
|
|
125
|
+
*
|
|
126
|
+
* createApp 组装:DI 容器注册 providers(手动和/或 discover 目录发现)→
|
|
127
|
+
* 从容器实例自动扫描 @Tool / @SubAgent / @Skill / @Prompt 收集成本 app 的工具菜单
|
|
128
|
+
* → agent.run(messages) 带着菜单走 executeRun。装配期统一静态校验(§7):
|
|
129
|
+
* 菜单查重、tools 引用存在性、toolSources 指向。
|
|
130
|
+
* 主 agent 的 system 可由 SystemPrompt 实例给出(内部 build({cache:true})
|
|
131
|
+
* 打稳定前缀 breakpoint),也接受已拼好的 SystemParam 原样透传。
|
|
132
|
+
*/
|
|
71
133
|
export declare class AgentApp {
|
|
72
134
|
readonly name: string;
|
|
73
135
|
private readonly di;
|
|
74
136
|
private readonly system;
|
|
75
137
|
private readonly base;
|
|
76
|
-
private _tools
|
|
138
|
+
private _tools;
|
|
139
|
+
private readonly sinks;
|
|
77
140
|
constructor(opts: AppOptions);
|
|
78
141
|
/** app 已装配好的工具菜单(构建期即从容器解析,静态稳定) */
|
|
79
142
|
get tools(): AgentTool[];
|
|
80
|
-
/**
|
|
143
|
+
/** 容器访问点 */
|
|
81
144
|
get container(): Container;
|
|
82
|
-
/**
|
|
83
|
-
|
|
145
|
+
/**
|
|
146
|
+
* 执行一次主 agent run。system 每 run 从 SystemPrompt 重建,保证 volatile 新鲜。
|
|
147
|
+
* 传 `resultSchema: fromZod<T>(...)` 时返回值 `result.typed` 为 `T | undefined`。
|
|
148
|
+
*/
|
|
149
|
+
run<S extends JsonSchema = JsonSchema>(messages: Anthropic.MessageParam[], opts?: RunAppOptions<S>): Promise<AgentRunOutput<SchemaType<S>>>;
|
|
84
150
|
}
|
|
85
151
|
/**
|
|
86
|
-
* 装配应用。不带 discover 时同步返回 AgentApp;带 discover
|
|
152
|
+
* 装配应用。不带 discover 时同步返回 AgentApp;带 discover(能力目录路径,一个或一组)时
|
|
87
153
|
* 先扫描装配,返回 Promise<AgentApp>(动态 import 决定)。
|
|
88
154
|
*/
|
|
89
155
|
export declare function createApp(opts: AppOptions & {
|
|
90
|
-
discover: string;
|
|
156
|
+
discover: string | string[];
|
|
91
157
|
}): Promise<AgentApp>;
|
|
92
158
|
export declare function createApp(opts: AppOptions): AgentApp;
|