@aalis/plugin-prompt-budget 0.5.1 → 0.6.0

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 ADDED
@@ -0,0 +1,24 @@
1
+ # @aalis/plugin-prompt-budget
2
+
3
+ 提示词预算:token 计数与上下文裁剪自检
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ pnpm add @aalis/plugin-prompt-budget
9
+ ```
10
+
11
+ ## 提供 / 依赖
12
+
13
+ `definePlugin` 默认导出:
14
+
15
+ - provides:无
16
+ - uses:`events`、`lifecycle`、`logger`;可选 `tools`
17
+
18
+ ## 文档
19
+
20
+ 详见 [docs/plugins/plugin-prompt-budget.md](../../docs/plugins/plugin-prompt-budget.md)。
21
+
22
+ ## 许可
23
+
24
+ 见仓库根目录 LICENSE。
package/dist/index.d.ts CHANGED
@@ -9,9 +9,11 @@
9
9
  * 实现:监听 `token:usage` 事件维护 sessionId → 最新 usage 缓存,注册
10
10
  * `prompt_budget_info` 工具供 AI 查询。零业务逻辑,纯只读 introspection。
11
11
  */
12
- import type { Context } from '@aalis/core';
13
- export declare const name = "@aalis/plugin-prompt-budget";
14
- export declare const displayName = "Prompt \u9884\u7B97\u81EA\u68C0";
15
- export declare const subsystem = "agent";
16
- export declare function apply(ctx: Context): void;
12
+ declare const _default: import("@aalis/core").PluginDefinition<{
13
+ tools: import("@aalis/core/dist/composition/descriptors").OptionalUse<import("@aalis/api-tools").ToolService, import("@aalis/api-tools").BoundTools>;
14
+ events: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Events, import("@aalis/core").Events>;
15
+ lifecycle: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").LifecycleCap, import("@aalis/core").LifecycleCap>;
16
+ logger: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Logger, import("@aalis/core").Logger>;
17
+ }>;
18
+ export default _default;
17
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,eAAO,MAAM,IAAI,gCAAgC,CAAC;AAClD,eAAO,MAAM,WAAW,oCAAgB,CAAC;AACzC,eAAO,MAAM,SAAS,UAAU,CAAC;AAQjC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA8ExC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;;;;;;;AAiBH,wBAQG"}
package/dist/index.js CHANGED
@@ -9,16 +9,24 @@
9
9
  * 实现:监听 `token:usage` 事件维护 sessionId → 最新 usage 缓存,注册
10
10
  * `prompt_budget_info` 工具供 AI 查询。零业务逻辑,纯只读 introspection。
11
11
  */
12
- import { useToolService } from '@aalis/api-tools';
12
+ import { tools } from '@aalis/api-tools';
13
+ import { definePlugin, events, lifecycle, logger, optional } from '@aalis/core';
13
14
  import { createBoundedMap } from '@aalis/util-bounded-map';
14
- export const name = '@aalis/plugin-prompt-budget';
15
- export const displayName = 'Prompt 预算自检';
16
- export const subsystem = 'agent';
17
- export function apply(ctx) {
18
- const tools = useToolService(ctx);
15
+ /** tools 声明为可选:没有工具服务时本插件照常激活,缓存先攒着,工具服务上线即补登记 */
16
+ const uses = { tools: optional(tools), events, lifecycle, logger };
17
+ export default definePlugin({
18
+ name: '@aalis/plugin-prompt-budget',
19
+ displayName: 'Prompt 预算自检',
20
+ subsystem: 'agent',
21
+ uses,
22
+ apply(caps) {
23
+ registerBudgetTool(caps);
24
+ },
25
+ });
26
+ function registerBudgetTool({ tools, events, lifecycle, logger }) {
19
27
  /** sessionId → 最新一次的 token:usage 快照(派生只读,逐出后 AI 重查即重算);有界防长跑泄漏 */
20
28
  const cache = createBoundedMap({ max: 500, ttlMs: 6 * 60 * 60 * 1000 });
21
- ctx.on('token:usage', u => {
29
+ events.on('token:usage', u => {
22
30
  if (!u || typeof u.sessionId !== 'string')
23
31
  return;
24
32
  cache.set(u.sessionId, { ...u, observedAt: Date.now() });
@@ -60,13 +68,19 @@ export function apply(ctx) {
60
68
  }
61
69
  const ageMs = Date.now() - u.observedAt;
62
70
  const tag = u.usageRatio >= 0.85 ? 'CRITICAL' : u.usageRatio >= 0.7 ? 'WARN' : u.usageRatio >= 0.5 ? 'INFO' : 'OK';
63
- // top3 提示哪几个桶最大
64
- const buckets = Object.entries(u.breakdown).sort((a, b) => b[1] - a[1]);
71
+ // top3 提示哪几个桶最大。breakdown 里的 injectors 是 Record 不是 token 数,
72
+ // 混进来会让比较器返回 NaN——排序结果按规范即未定义,故先滤掉非数值项。
73
+ const buckets = Object.entries(u.breakdown)
74
+ .filter((e) => typeof e[1] === 'number')
75
+ .sort((a, b) => b[1] - a[1]);
65
76
  const top3 = buckets.slice(0, 3).map(([k, v]) => ({ name: k, tokens: v }));
77
+ // advice 不写死压缩阈值、也不断言压缩插件在场:阈值是记忆压缩插件自己的配置项,
78
+ // 该插件未装时根本没有自动压缩。对模型只讲它自己能做的事。
79
+ const compressionNote = '历史压缩不由模型发起,由记忆压缩插件按阈值自动触发、WebUI 亦可手动;你能做的是减少后续工具输出体量。';
66
80
  const advice = u.usageRatio >= 0.85
67
- ? '上下文几乎用尽。建议:调用 memory.compress / 清理 toolResults / 缩减 system prompt。'
81
+ ? `上下文几乎用尽。建议:清理 toolResults / 缩减 system prompt。${compressionNote}`
68
82
  : u.usageRatio >= 0.7
69
- ? '上下文压力较高。可考虑主动压缩历史或减少后续工具调用的输出体量。'
83
+ ? `上下文压力较高。${compressionNote}`
70
84
  : '预算健康,无需干预。';
71
85
  return JSON.stringify({
72
86
  sessionId,
@@ -84,7 +98,7 @@ export function apply(ctx) {
84
98
  });
85
99
  },
86
100
  });
87
- ctx.onDispose(() => cache.clear());
88
- ctx.logger.info('prompt_budget_info 工具已注册');
101
+ lifecycle.onDispose(() => cache.clear());
102
+ logger.info('prompt_budget_info 工具已注册');
89
103
  }
90
104
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aalis/plugin-prompt-budget",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,17 +24,29 @@
24
24
  "dist"
25
25
  ],
26
26
  "dependencies": {
27
- "@aalis/api-tools": ">=0.5.1 <1.0.0",
27
+ "@aalis/api-tools": ">=0.9.0 <1.0.0",
28
28
  "@aalis/util-bounded-map": ">=0.5.0 <1.0.0"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^22.0.0",
32
32
  "typescript": "^5.7.0",
33
- "@aalis/api-agent": "0.6.0",
34
- "@aalis/core": "0.10.0"
33
+ "@aalis/core": "0.17.0",
34
+ "@aalis/api-agent": "0.8.0"
35
35
  },
36
36
  "peerDependencies": {
37
- "@aalis/core": ">=0.2.0 <1.0.0"
37
+ "@aalis/core": ">=0.17.0 <1.0.0"
38
+ },
39
+ "aalis": {
40
+ "service": {
41
+ "optional": [
42
+ "tools"
43
+ ],
44
+ "required": [
45
+ "events",
46
+ "lifecycle",
47
+ "logger"
48
+ ]
49
+ }
38
50
  },
39
51
  "scripts": {
40
52
  "build": "tsc",