@ai-zen/cli 1.0.0-alpha.12 → 1.0.0-alpha.14
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/CHANGELOG.md +69 -0
- package/README.md +71 -2
- package/README.zh.md +71 -2
- package/dist/auto-migrate-confirm.d.ts +2 -2
- package/dist/auto-migrate-confirm.d.ts.map +1 -1
- package/dist/auto-migrate-confirm.js +4 -4
- package/dist/auto-migrate-confirm.js.map +1 -1
- package/dist/config-editor.d.ts.map +1 -1
- package/dist/config-editor.js +2 -1
- package/dist/config-editor.js.map +1 -1
- package/dist/conversation-commands/registry.d.ts.map +1 -1
- package/dist/conversation-commands/registry.js +2 -0
- package/dist/conversation-commands/registry.js.map +1 -1
- package/dist/handoff-service.js +3 -3
- package/dist/handoff-service.js.map +1 -1
- package/dist/model-switch.d.ts +59 -0
- package/dist/model-switch.d.ts.map +1 -0
- package/dist/model-switch.js +62 -0
- package/dist/model-switch.js.map +1 -0
- package/dist/reasoning-effort.d.ts +62 -0
- package/dist/reasoning-effort.d.ts.map +1 -0
- package/dist/reasoning-effort.js +88 -0
- package/dist/reasoning-effort.js.map +1 -0
- package/dist/sdk-log.d.ts +48 -0
- package/dist/sdk-log.d.ts.map +1 -0
- package/dist/sdk-log.js +67 -0
- package/dist/sdk-log.js.map +1 -0
- package/dist/stdio-runner.d.ts.map +1 -1
- package/dist/stdio-runner.js +6 -7
- package/dist/stdio-runner.js.map +1 -1
- package/dist/sub-agent-guard-plugin.d.ts +5 -5
- package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
- package/dist/sub-agent-guard-plugin.js +7 -7
- package/dist/sub-agent-guard-plugin.js.map +1 -1
- package/dist/tui/chat-session.d.ts +3 -1
- package/dist/tui/chat-session.d.ts.map +1 -1
- package/dist/tui/chat-session.js +13 -15
- package/dist/tui/chat-session.js.map +1 -1
- package/dist/tui/components.d.ts +3 -1
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +3 -3
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/config-wizard/fields.d.ts.map +1 -1
- package/dist/tui/config-wizard/fields.js +27 -5
- package/dist/tui/config-wizard/fields.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +21 -1
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/input-editing.d.ts +49 -0
- package/dist/tui/input-editing.d.ts.map +1 -0
- package/dist/tui/input-editing.js +87 -0
- package/dist/tui/input-editing.js.map +1 -0
- package/dist/tui/key-debug.d.ts +62 -0
- package/dist/tui/key-debug.d.ts.map +1 -0
- package/dist/tui/key-debug.js +92 -0
- package/dist/tui/key-debug.js.map +1 -0
- package/dist/tui/screens/chat-commands.d.ts +2 -0
- package/dist/tui/screens/chat-commands.d.ts.map +1 -1
- package/dist/tui/screens/chat-commands.js +151 -8
- package/dist/tui/screens/chat-commands.js.map +1 -1
- package/dist/tui/screens/chat.d.ts +2 -0
- package/dist/tui/screens/chat.d.ts.map +1 -1
- package/dist/tui/screens/chat.js +285 -22
- package/dist/tui/screens/chat.js.map +1 -1
- package/dist/tui/screens/handoff-choice.d.ts +37 -0
- package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
- package/dist/tui/screens/handoff-choice.js +41 -0
- package/dist/tui/screens/handoff-choice.js.map +1 -0
- package/dist/tui/screens/index.d.ts +1 -1
- package/dist/tui/screens/index.d.ts.map +1 -1
- package/dist/tui/screens/index.js +1 -1
- package/dist/tui/screens/index.js.map +1 -1
- package/dist/tui/screens/input.d.ts +35 -0
- package/dist/tui/screens/input.d.ts.map +1 -1
- package/dist/tui/screens/input.js +66 -0
- package/dist/tui/screens/input.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模型切换 —— `/model` 的写配置策略(纯逻辑,可单测)
|
|
3
|
+
*
|
|
4
|
+
* 会话用哪个模型,取决于**两处配置的优先级**(见 `tui/index.tsx` 的 `resolveTarget()`):
|
|
5
|
+
* 1. Agent 定义里的 `modelId`(显式绑定)
|
|
6
|
+
* 2. `config.json` 的 `defaultModel`(未绑定时兜底)
|
|
7
|
+
*
|
|
8
|
+
* 所以切换时必须写到「真正生效的那一处」,否则会出现「提示已切换、实际没变」:
|
|
9
|
+
* - Agent 显式绑定过模型 → 改 `agents/<id>.json` 的 `modelId`
|
|
10
|
+
* - Agent 没绑(用默认模型)→ 改 `config.json` 的 `defaultModel`
|
|
11
|
+
*
|
|
12
|
+
* 注意 **Agent 定义的其它字段不可丢**:SDK 初始化时只同步出厂提示词,
|
|
13
|
+
* 其余字段(权限、`custom` 等)以用户文件为准,因此写入是「读 → 改一个字段 → 写回」。
|
|
14
|
+
*/
|
|
15
|
+
import { AgentRepository } from "@ai-zen/agents-sdk";
|
|
16
|
+
import { AGENTS_DIR, saveConfig } from "./config.js";
|
|
17
|
+
/**
|
|
18
|
+
* 由 Agent 定义判定写入目标。
|
|
19
|
+
*
|
|
20
|
+
* 判据是 `modelId` 是否**已存在**,而不是它等不等于某个值:
|
|
21
|
+
* 只有显式绑过模型的 Agent 才该被改定义;没绑的 Agent 走默认模型,
|
|
22
|
+
* 此时改定义等于凭空给它加一条绑定,会掩盖「默认模型」这一层语义。
|
|
23
|
+
*/
|
|
24
|
+
export function resolveModelWriteTarget(definition) {
|
|
25
|
+
return definition?.modelId ? "agent" : "default";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 切换模型并写入配置。
|
|
29
|
+
*
|
|
30
|
+
* 抛错场景:模型不存在、Agent 定义缺失(显式绑定的 Agent 却读不到文件)。
|
|
31
|
+
*/
|
|
32
|
+
export async function switchModel(options) {
|
|
33
|
+
const { config, modelId } = options;
|
|
34
|
+
const agentId = options.agentId || "default";
|
|
35
|
+
const now = options.now ?? new Date();
|
|
36
|
+
const model = (config.models ?? []).find((item) => item.id === modelId);
|
|
37
|
+
if (!model)
|
|
38
|
+
throw new Error(`模型 "${modelId}" 不存在`);
|
|
39
|
+
const readAgent = options.readAgent ?? ((id) => new AgentRepository(AGENTS_DIR).read(id));
|
|
40
|
+
const writeAgent = options.writeAgent ?? ((definition) => new AgentRepository(AGENTS_DIR).write(definition));
|
|
41
|
+
const save = options.saveConfig ?? saveConfig;
|
|
42
|
+
const definition = await readAgent(agentId);
|
|
43
|
+
const target = resolveModelWriteTarget(definition);
|
|
44
|
+
if (target === "agent" && definition) {
|
|
45
|
+
const next = { ...definition, modelId, updatedAt: now.toISOString() };
|
|
46
|
+
await writeAgent(next);
|
|
47
|
+
return {
|
|
48
|
+
target,
|
|
49
|
+
summary: `已切换模型:${model.name}(${model.id})· 已写入 Agent「${agentId}」的绑定模型`,
|
|
50
|
+
config,
|
|
51
|
+
definition: next,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const nextConfig = { ...config, defaultModel: modelId };
|
|
55
|
+
await save(nextConfig);
|
|
56
|
+
return {
|
|
57
|
+
target,
|
|
58
|
+
summary: `已切换模型:${model.name}(${model.id})· 已写入默认模型配置`,
|
|
59
|
+
config: nextConfig,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=model-switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-switch.js","sourceRoot":"","sources":["../src/model-switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKrD;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAoD;IAEpD,OAAO,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAgCD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IAEtC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,OAAO,OAAO,CAAC,CAAC;IAEnD,MAAM,SAAS,GACb,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,UAA2B,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7G,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC;IAE9C,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,MAAM,KAAK,OAAO,IAAI,UAAU,EAAE,CAAC;QACrC,MAAM,IAAI,GAAoB,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACvF,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO;YACL,MAAM;YACN,OAAO,EAAE,SAAS,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,gBAAgB,OAAO,QAAQ;YACvE,MAAM;YACN,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAc,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACnE,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,OAAO;QACL,MAAM;QACN,OAAO,EAAE,SAAS,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,cAAc;QACtD,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 思考强度(reasoning effort)—— CLI 侧读写
|
|
3
|
+
*
|
|
4
|
+
* 分两层,边界很硬:
|
|
5
|
+
* - **能力上限在模型**(`Model.reasoning`,SDK 按厂商官方文档声明):决定菜单里能出现哪几档。
|
|
6
|
+
* 发一个端点不认的值会被直接 400(智谱 GLM-5.3 系原文「其余输入将报错」)。
|
|
7
|
+
* - **档位值存在 Agent**(`AgentDefinition.reasoningEffort`):同一个模型可以给编程 / 小说 /
|
|
8
|
+
* 闲聊三个 Agent 配不同强度,而模型自身的 `defaultParams` 不动。
|
|
9
|
+
*
|
|
10
|
+
* 本模块只做「读能力 → 校验 → 写 Agent 定义」,参数如何落到 `thinking` / `reasoning_effort`
|
|
11
|
+
* 由 SDK 的 `resolveModelParams()` 在 `createModel` 阶段决定。
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentDefinition, AppConfig, Model } from "@ai-zen/agents-sdk";
|
|
14
|
+
/**
|
|
15
|
+
* 档位类型由 `AgentDefinition` 派生。
|
|
16
|
+
*
|
|
17
|
+
* SDK 的 alpha.13 只导出了 `shared/reasoning.ts` 的函数,`ReasoningEffort` /
|
|
18
|
+
* `TokenThresholds` 这两个别名还没进包入口;用类型查询拿到同一个类型,语义完全等价,
|
|
19
|
+
* 等 SDK 下个版本补上导出后可无痛切换成直接 import。
|
|
20
|
+
*/
|
|
21
|
+
export type ReasoningEffort = NonNullable<AgentDefinition["reasoningEffort"]>;
|
|
22
|
+
/** 上下文阈值结构(派生自 `Model`) */
|
|
23
|
+
export type TokenThresholds = Model["tokenThresholds"];
|
|
24
|
+
/** 档位 → 中文标签(状态栏与提示共用) */
|
|
25
|
+
export declare const EFFORT_LABELS: Record<ReasoningEffort, string>;
|
|
26
|
+
/** 一档都用不了的模型(未声明能力,或声明为空数组)*/
|
|
27
|
+
export declare function isAdjustable(model?: Model | null): boolean;
|
|
28
|
+
/** 可选档位(含 `off`,顺序即展示顺序) */
|
|
29
|
+
export declare function effortChoices(model?: Model | null): ReasoningEffort[];
|
|
30
|
+
/**
|
|
31
|
+
* 状态栏文案。
|
|
32
|
+
*
|
|
33
|
+
* - 模型不可调档 → `—`
|
|
34
|
+
* - Agent 显式声明了档位 → 「低」「中」「高」…(`off` 显示「关」)
|
|
35
|
+
* - 可调但没声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂就是「开思考但未指定档位」)
|
|
36
|
+
*/
|
|
37
|
+
export declare function describeEffort(model?: Model | null, definition?: Pick<AgentDefinition, "reasoningEffort"> | null): string;
|
|
38
|
+
export interface SetAgentEffortOptions {
|
|
39
|
+
config: AppConfig;
|
|
40
|
+
/** 目标 Agent(缺省 default) */
|
|
41
|
+
agentId?: string;
|
|
42
|
+
/** 目标档位;`null` 表示清除声明、恢复跟随模型默认 */
|
|
43
|
+
effort: ReasoningEffort | null;
|
|
44
|
+
/** 注入用(测试) */
|
|
45
|
+
readAgent?: (agentId: string) => Promise<AgentDefinition | null>;
|
|
46
|
+
writeAgent?: (definition: AgentDefinition) => Promise<void>;
|
|
47
|
+
now?: Date;
|
|
48
|
+
}
|
|
49
|
+
export interface SetAgentEffortResult {
|
|
50
|
+
definition: AgentDefinition;
|
|
51
|
+
/** 生效模型 */
|
|
52
|
+
model: Model;
|
|
53
|
+
summary: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 设置某 Agent 的思考档位并写入其定义文件。
|
|
57
|
+
*
|
|
58
|
+
* 抛错场景:Agent 不存在、Agent 未绑定可用模型、模型不可调档、档位不在模型能力范围内。
|
|
59
|
+
* 这些都属于「用户明确要求了一件做不到的事」,宁可报错也不要静默降级。
|
|
60
|
+
*/
|
|
61
|
+
export declare function setAgentEffort(options: SetAgentEffortOptions): Promise<SetAgentEffortResult>;
|
|
62
|
+
//# sourceMappingURL=reasoning-effort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG5E;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9E,2BAA2B;AAC3B,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAGvD,0BAA0B;AAC1B,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CASzD,CAAC;AAEF,8BAA8B;AAC9B,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAE1D;AAED,4BAA4B;AAC5B,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,eAAe,EAAE,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,UAAU,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,GAAG,IAAI,GAC3D,MAAM,CAIR;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,cAAc;IACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACjE,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW;IACX,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAwC/B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 思考强度(reasoning effort)—— CLI 侧读写
|
|
3
|
+
*
|
|
4
|
+
* 分两层,边界很硬:
|
|
5
|
+
* - **能力上限在模型**(`Model.reasoning`,SDK 按厂商官方文档声明):决定菜单里能出现哪几档。
|
|
6
|
+
* 发一个端点不认的值会被直接 400(智谱 GLM-5.3 系原文「其余输入将报错」)。
|
|
7
|
+
* - **档位值存在 Agent**(`AgentDefinition.reasoningEffort`):同一个模型可以给编程 / 小说 /
|
|
8
|
+
* 闲聊三个 Agent 配不同强度,而模型自身的 `defaultParams` 不动。
|
|
9
|
+
*
|
|
10
|
+
* 本模块只做「读能力 → 校验 → 写 Agent 定义」,参数如何落到 `thinking` / `reasoning_effort`
|
|
11
|
+
* 由 SDK 的 `resolveModelParams()` 在 `createModel` 阶段决定。
|
|
12
|
+
*/
|
|
13
|
+
import { AgentRepository } from "@ai-zen/agents-sdk";
|
|
14
|
+
import { modelAllowedEfforts, resolveReasoningEffort } from "@ai-zen/agents-sdk";
|
|
15
|
+
import { AGENTS_DIR } from "./config.js";
|
|
16
|
+
/** 档位 → 中文标签(状态栏与提示共用) */
|
|
17
|
+
export const EFFORT_LABELS = {
|
|
18
|
+
off: "关",
|
|
19
|
+
none: "关",
|
|
20
|
+
minimal: "极低",
|
|
21
|
+
low: "低",
|
|
22
|
+
medium: "中",
|
|
23
|
+
high: "高",
|
|
24
|
+
xhigh: "极高",
|
|
25
|
+
max: "最高",
|
|
26
|
+
};
|
|
27
|
+
/** 一档都用不了的模型(未声明能力,或声明为空数组)*/
|
|
28
|
+
export function isAdjustable(model) {
|
|
29
|
+
return modelAllowedEfforts(model).length > 0;
|
|
30
|
+
}
|
|
31
|
+
/** 可选档位(含 `off`,顺序即展示顺序) */
|
|
32
|
+
export function effortChoices(model) {
|
|
33
|
+
return modelAllowedEfforts(model);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 状态栏文案。
|
|
37
|
+
*
|
|
38
|
+
* - 模型不可调档 → `—`
|
|
39
|
+
* - Agent 显式声明了档位 → 「低」「中」「高」…(`off` 显示「关」)
|
|
40
|
+
* - 可调但没声明 → 「默认」(跟随模型 `defaultParams`,如 DeepSeek 出厂就是「开思考但未指定档位」)
|
|
41
|
+
*/
|
|
42
|
+
export function describeEffort(model, definition) {
|
|
43
|
+
if (!isAdjustable(model))
|
|
44
|
+
return "—";
|
|
45
|
+
const effective = resolveReasoningEffort(model, definition);
|
|
46
|
+
return effective ? EFFORT_LABELS[effective] : "默认";
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 设置某 Agent 的思考档位并写入其定义文件。
|
|
50
|
+
*
|
|
51
|
+
* 抛错场景:Agent 不存在、Agent 未绑定可用模型、模型不可调档、档位不在模型能力范围内。
|
|
52
|
+
* 这些都属于「用户明确要求了一件做不到的事」,宁可报错也不要静默降级。
|
|
53
|
+
*/
|
|
54
|
+
export async function setAgentEffort(options) {
|
|
55
|
+
const { config, effort } = options;
|
|
56
|
+
const agentId = options.agentId || "default";
|
|
57
|
+
const now = options.now ?? new Date();
|
|
58
|
+
const readAgent = options.readAgent ?? ((id) => new AgentRepository(AGENTS_DIR).read(id));
|
|
59
|
+
const writeAgent = options.writeAgent ??
|
|
60
|
+
((definition) => new AgentRepository(AGENTS_DIR).write(definition));
|
|
61
|
+
const definition = await readAgent(agentId);
|
|
62
|
+
if (!definition)
|
|
63
|
+
throw new Error(`Agent "${agentId}" 不存在`);
|
|
64
|
+
const modelId = definition.modelId ?? config.defaultModel;
|
|
65
|
+
const model = (config.models ?? []).find((item) => item.id === modelId);
|
|
66
|
+
if (!model)
|
|
67
|
+
throw new Error(`模型 "${modelId}" 不存在,请先用 /model 或 /config 检查`);
|
|
68
|
+
const allowed = effortChoices(model);
|
|
69
|
+
if (allowed.length === 0) {
|
|
70
|
+
throw new Error(`模型 "${model.id}" 未声明可调档位,无法设置思考强度`);
|
|
71
|
+
}
|
|
72
|
+
if (effort !== null && !allowed.includes(effort)) {
|
|
73
|
+
throw new Error(`模型 "${model.id}" 不支持档位 "${effort}"(可选:${allowed.join(" / ")})`);
|
|
74
|
+
}
|
|
75
|
+
const next = { ...definition, updatedAt: now.toISOString() };
|
|
76
|
+
if (effort === null)
|
|
77
|
+
delete next.reasoningEffort;
|
|
78
|
+
else
|
|
79
|
+
next.reasoningEffort = effort;
|
|
80
|
+
await writeAgent(next);
|
|
81
|
+
const label = effort === null ? "跟随模型默认" : `「${EFFORT_LABELS[effort]}」`;
|
|
82
|
+
return {
|
|
83
|
+
definition: next,
|
|
84
|
+
model,
|
|
85
|
+
summary: `思考强度已设为 ${label} · 写入 Agent「${agentId}」(模型 ${model.id})`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=reasoning-effort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK 全局日志接管 —— 关掉库自带的 `console` 兜底。
|
|
3
|
+
*
|
|
4
|
+
* 背景:SDK 的 `getLogger()` 默认实现是 `console.log / console.warn / console.error`
|
|
5
|
+
* (`@ai-zen/agents-sdk` 的 `shared/logger.ts`)。对通用库来说这是合理兜底,对 Ink TUI
|
|
6
|
+
* 却是灾难 —— `console.log` 直接写 stdout,会穿到 Ink 的渲染区外面把界面撕成乱码。
|
|
7
|
+
* 例如 `load_mcp` 有一行 `log.info(JSON.stringify(manifest, null, 2))`,未接管时整份
|
|
8
|
+
* tools / resources 清单会砸在界面上。
|
|
9
|
+
*
|
|
10
|
+
* 所以 TUI 启动第一件事就是接管:
|
|
11
|
+
* - 默认**全部丢弃**(界面上不该出现库的内部日志,用户也读不懂);
|
|
12
|
+
* - 需要排查时用 `AIZ_DEBUG_SDK=1` 落盘,既不污染渲染也不丢信息。
|
|
13
|
+
*
|
|
14
|
+
* 用法:
|
|
15
|
+
* aiz → SDK 日志静默
|
|
16
|
+
* AIZ_DEBUG_SDK=1 aiz → 追加写到 <tmp>/aiz-sdk.log
|
|
17
|
+
* AIZ_DEBUG_SDK=1 AIZ_SDK_LOG_FILE=/path aiz → 写到指定文件
|
|
18
|
+
*
|
|
19
|
+
* 与 `key-debug.ts` 同一套约定(环境变量开关 + tmp 下日志文件),免得排查时记两套。
|
|
20
|
+
*
|
|
21
|
+
* 注意 stdio 模式不需要本模块:`stdio-runner.ts` 已把日志改道 stderr —— 那里 stdout
|
|
22
|
+
* 只留给结果,日志本身是有用的。本模块只服务「界面被占用」的 TUI。
|
|
23
|
+
*/
|
|
24
|
+
import { type Logger } from "@ai-zen/agents-sdk";
|
|
25
|
+
/** 是否把 SDK 日志落盘(默认关闭) */
|
|
26
|
+
export declare const SDK_LOG_ENABLED: boolean;
|
|
27
|
+
/** 日志落盘路径(测试与用户都可能改写,故导出常量) */
|
|
28
|
+
export declare const SDK_LOG_FILE: string;
|
|
29
|
+
/** 单行日志格式:`<ISO 时间> [level] message` */
|
|
30
|
+
export declare function formatSdkLogLine(level: keyof Logger, message: string, at?: Date): string;
|
|
31
|
+
/**
|
|
32
|
+
* 落盘版日志器。
|
|
33
|
+
*
|
|
34
|
+
* 写失败要吞掉:日志是旁路能力,磁盘满 / 权限不足时绝不能把 TUI 拖垮。
|
|
35
|
+
*/
|
|
36
|
+
export declare function createFileLogger(file: string): Logger;
|
|
37
|
+
/** 全静默日志器(TUI 默认) */
|
|
38
|
+
export declare function createSilentLogger(): Logger;
|
|
39
|
+
/**
|
|
40
|
+
* 接管 SDK 全局日志:默认静默,`AIZ_DEBUG_SDK=1` 时改为落盘。
|
|
41
|
+
*
|
|
42
|
+
* 返回实际安装的日志器,便于测试断言 / 上层复用。
|
|
43
|
+
*/
|
|
44
|
+
export declare function installSdkLogger(options?: {
|
|
45
|
+
enabled?: boolean;
|
|
46
|
+
file?: string;
|
|
47
|
+
}): Logger;
|
|
48
|
+
//# sourceMappingURL=sdk-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk-log.d.ts","sourceRoot":"","sources":["../src/sdk-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5D,yBAAyB;AACzB,eAAO,MAAM,eAAe,SAAoC,CAAC;AAEjE,+BAA+B;AAC/B,eAAO,MAAM,YAAY,QAAqD,CAAC;AAE/E,wCAAwC;AACxC,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,EAAE,GAAE,IAAiB,GACpB,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWrD;AAED,qBAAqB;AACrB,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,MAAM,CAMR"}
|
package/dist/sdk-log.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK 全局日志接管 —— 关掉库自带的 `console` 兜底。
|
|
3
|
+
*
|
|
4
|
+
* 背景:SDK 的 `getLogger()` 默认实现是 `console.log / console.warn / console.error`
|
|
5
|
+
* (`@ai-zen/agents-sdk` 的 `shared/logger.ts`)。对通用库来说这是合理兜底,对 Ink TUI
|
|
6
|
+
* 却是灾难 —— `console.log` 直接写 stdout,会穿到 Ink 的渲染区外面把界面撕成乱码。
|
|
7
|
+
* 例如 `load_mcp` 有一行 `log.info(JSON.stringify(manifest, null, 2))`,未接管时整份
|
|
8
|
+
* tools / resources 清单会砸在界面上。
|
|
9
|
+
*
|
|
10
|
+
* 所以 TUI 启动第一件事就是接管:
|
|
11
|
+
* - 默认**全部丢弃**(界面上不该出现库的内部日志,用户也读不懂);
|
|
12
|
+
* - 需要排查时用 `AIZ_DEBUG_SDK=1` 落盘,既不污染渲染也不丢信息。
|
|
13
|
+
*
|
|
14
|
+
* 用法:
|
|
15
|
+
* aiz → SDK 日志静默
|
|
16
|
+
* AIZ_DEBUG_SDK=1 aiz → 追加写到 <tmp>/aiz-sdk.log
|
|
17
|
+
* AIZ_DEBUG_SDK=1 AIZ_SDK_LOG_FILE=/path aiz → 写到指定文件
|
|
18
|
+
*
|
|
19
|
+
* 与 `key-debug.ts` 同一套约定(环境变量开关 + tmp 下日志文件),免得排查时记两套。
|
|
20
|
+
*
|
|
21
|
+
* 注意 stdio 模式不需要本模块:`stdio-runner.ts` 已把日志改道 stderr —— 那里 stdout
|
|
22
|
+
* 只留给结果,日志本身是有用的。本模块只服务「界面被占用」的 TUI。
|
|
23
|
+
*/
|
|
24
|
+
import { appendFileSync } from "node:fs";
|
|
25
|
+
import { setLogger } from "@ai-zen/agents-sdk";
|
|
26
|
+
/** 是否把 SDK 日志落盘(默认关闭) */
|
|
27
|
+
export const SDK_LOG_ENABLED = process.env.AIZ_DEBUG_SDK === "1";
|
|
28
|
+
/** 日志落盘路径(测试与用户都可能改写,故导出常量) */
|
|
29
|
+
export const SDK_LOG_FILE = process.env.AIZ_SDK_LOG_FILE || "/tmp/aiz-sdk.log";
|
|
30
|
+
/** 单行日志格式:`<ISO 时间> [level] message` */
|
|
31
|
+
export function formatSdkLogLine(level, message, at = new Date()) {
|
|
32
|
+
return `${at.toISOString()} [${level}] ${message}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 落盘版日志器。
|
|
36
|
+
*
|
|
37
|
+
* 写失败要吞掉:日志是旁路能力,磁盘满 / 权限不足时绝不能把 TUI 拖垮。
|
|
38
|
+
*/
|
|
39
|
+
export function createFileLogger(file) {
|
|
40
|
+
const write = (level) => (message) => {
|
|
41
|
+
try {
|
|
42
|
+
appendFileSync(file, `${formatSdkLogLine(level, message)}\n`);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* 诊断失败绝不能影响主流程 */
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return { info: write("info"), warn: write("warn"), error: write("error") };
|
|
49
|
+
}
|
|
50
|
+
/** 全静默日志器(TUI 默认) */
|
|
51
|
+
export function createSilentLogger() {
|
|
52
|
+
const noop = () => { };
|
|
53
|
+
return { info: noop, warn: noop, error: noop };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 接管 SDK 全局日志:默认静默,`AIZ_DEBUG_SDK=1` 时改为落盘。
|
|
57
|
+
*
|
|
58
|
+
* 返回实际安装的日志器,便于测试断言 / 上层复用。
|
|
59
|
+
*/
|
|
60
|
+
export function installSdkLogger(options = {}) {
|
|
61
|
+
const enabled = options.enabled ?? SDK_LOG_ENABLED;
|
|
62
|
+
const file = options.file ?? SDK_LOG_FILE;
|
|
63
|
+
const logger = enabled ? createFileLogger(file) : createSilentLogger();
|
|
64
|
+
setLogger(logger);
|
|
65
|
+
return logger;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=sdk-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk-log.js","sourceRoot":"","sources":["../src/sdk-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,SAAS,EAAe,MAAM,oBAAoB,CAAC;AAE5D,yBAAyB;AACzB,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,CAAC;AAEjE,+BAA+B;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,kBAAkB,CAAC;AAE/E,wCAAwC;AACxC,MAAM,UAAU,gBAAgB,CAC9B,KAAmB,EACnB,OAAe,EACf,KAAW,IAAI,IAAI,EAAE;IAErB,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GACT,CAAC,KAAmB,EAAE,EAAE,CACxB,CAAC,OAAe,EAAQ,EAAE;QACxB,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,EAAE,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC,CAAC;IACJ,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;IAC5B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAgD,EAAE;IAElD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACvE,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio-runner.d.ts","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"stdio-runner.d.ts","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAc9C,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAC;CACf;AAOD;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAWjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,MAAM,CAY/E;AAkCD,6BAA6B;AAC7B,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAuExE"}
|
package/dist/stdio-runner.js
CHANGED
|
@@ -88,9 +88,8 @@ async function resolveTarget() {
|
|
|
88
88
|
if (!endpoint.apiKey) {
|
|
89
89
|
throw new Error(`端点 "${endpoint.name}" 的 API Key 未设置,请先运行 \`ai\` 进入交互界面配置`);
|
|
90
90
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return { modelId, agentId: config.defaultAgent ?? "default", maxTokens };
|
|
91
|
+
// 阈值由配置直接给出(旧字段已在 SDK 的 ConfigManager.read() 里迁移过)
|
|
92
|
+
return { modelId, agentId: config.defaultAgent ?? "default", tokenThresholds: model.tokenThresholds };
|
|
94
93
|
}
|
|
95
94
|
/** 运行一次纯 stdio 对话,返回进程退出码 */
|
|
96
95
|
export async function runStdio(options) {
|
|
@@ -107,13 +106,13 @@ export async function runStdio(options) {
|
|
|
107
106
|
const originalLog = console.log;
|
|
108
107
|
console.log = (...args) => logStderr(args.map((a) => String(a)).join(" "));
|
|
109
108
|
try {
|
|
110
|
-
const { modelId, agentId,
|
|
109
|
+
const { modelId, agentId, tokenThresholds } = await resolveTarget();
|
|
111
110
|
const agent = await createAgent({ agentId });
|
|
112
111
|
agent.use(new CwdTrackerPlugin());
|
|
113
112
|
agent.use(new AutoRefreshToolsPlugin());
|
|
114
|
-
if (
|
|
115
|
-
agent.use(new ContextGuardPlugin({
|
|
116
|
-
agent.use(new SubAgentGuardInstallerPlugin({
|
|
113
|
+
if (tokenThresholds) {
|
|
114
|
+
agent.use(new ContextGuardPlugin({ guardTokens: tokenThresholds.guard }));
|
|
115
|
+
agent.use(new SubAgentGuardInstallerPlugin({ guardTokens: tokenThresholds.guard }));
|
|
117
116
|
}
|
|
118
117
|
await agent.init();
|
|
119
118
|
const messages = await agent.send(prompt);
|
package/dist/stdio-runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio-runner.js","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"stdio-runner.js","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
* init)。
|
|
13
13
|
*
|
|
14
14
|
* 约束口径(与主 Agent 一致,仅此一项):把主 Agent 同款的 `ContextGuardPlugin` 装到子 Agent 上
|
|
15
|
-
* ——
|
|
16
|
-
*
|
|
15
|
+
* —— 同一个 `guardTokens`(当前模型的 `tokenThresholds.guard`),使「请求前用量超过硬线即中断」
|
|
16
|
+
* 对子 Agent 同样成立。
|
|
17
17
|
* **不设**轮次上限,**不设**工具调用次数上限。
|
|
18
18
|
*
|
|
19
19
|
* 中断语义:抛错即结束子 Agent 的 run;异常经 `AgentTool` 的 finally(分发 onSubAgentEnd)
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
import type { AgentPlugin } from "@ai-zen/agents-sdk";
|
|
28
28
|
import type { SubAgentContext } from "@ai-zen/agents-core";
|
|
29
29
|
export interface SubAgentGuardOptions {
|
|
30
|
-
/**
|
|
31
|
-
|
|
30
|
+
/** 强行阻断阈值;与主 Agent 同源(当前模型的 `tokenThresholds.guard`) */
|
|
31
|
+
guardTokens: number;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
34
|
* 子 Agent 护栏安装器(装在**宿主 Agent** 上)。
|
|
@@ -38,7 +38,7 @@ export interface SubAgentGuardOptions {
|
|
|
38
38
|
* 由 `ContextGuardPlugin` 按阈值决定。
|
|
39
39
|
*/
|
|
40
40
|
export declare class SubAgentGuardInstallerPlugin implements AgentPlugin {
|
|
41
|
-
private readonly
|
|
41
|
+
private readonly guardTokens;
|
|
42
42
|
constructor(options: SubAgentGuardOptions);
|
|
43
43
|
onSubAgentStart({ subAgent }: SubAgentContext): void;
|
|
44
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-guard-plugin.d.ts","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,
|
|
1
|
+
{"version":3,"file":"sub-agent-guard-plugin.d.ts","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,WAAW;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,oBAAoB;IAIzC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,IAAI;CASrD"}
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
* init)。
|
|
13
13
|
*
|
|
14
14
|
* 约束口径(与主 Agent 一致,仅此一项):把主 Agent 同款的 `ContextGuardPlugin` 装到子 Agent 上
|
|
15
|
-
* ——
|
|
16
|
-
*
|
|
15
|
+
* —— 同一个 `guardTokens`(当前模型的 `tokenThresholds.guard`),使「请求前用量超过硬线即中断」
|
|
16
|
+
* 对子 Agent 同样成立。
|
|
17
17
|
* **不设**轮次上限,**不设**工具调用次数上限。
|
|
18
18
|
*
|
|
19
19
|
* 中断语义:抛错即结束子 Agent 的 run;异常经 `AgentTool` 的 finally(分发 onSubAgentEnd)
|
|
@@ -33,15 +33,15 @@ import { ContextGuardPlugin } from "@ai-zen/agents-sdk";
|
|
|
33
33
|
* 由 `ContextGuardPlugin` 按阈值决定。
|
|
34
34
|
*/
|
|
35
35
|
export class SubAgentGuardInstallerPlugin {
|
|
36
|
-
|
|
36
|
+
guardTokens;
|
|
37
37
|
constructor(options) {
|
|
38
|
-
this.
|
|
38
|
+
this.guardTokens = options.guardTokens;
|
|
39
39
|
}
|
|
40
40
|
onSubAgentStart({ subAgent }) {
|
|
41
|
-
// 与主 Agent
|
|
42
|
-
subAgent.use(new ContextGuardPlugin({
|
|
41
|
+
// 与主 Agent 完全同款:同一个 guardTokens 绝对阈值
|
|
42
|
+
subAgent.use(new ContextGuardPlugin({ guardTokens: this.guardTokens }));
|
|
43
43
|
// 传染到孙级:子 Agent 若再委派,其子 Agent 同样被安插
|
|
44
|
-
subAgent.use(new SubAgentGuardInstallerPlugin({
|
|
44
|
+
subAgent.use(new SubAgentGuardInstallerPlugin({ guardTokens: this.guardTokens }));
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
//# sourceMappingURL=sub-agent-guard-plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-guard-plugin.js","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;;;;GAMG;AACH,MAAM,OAAO,4BAA4B;IACtB,
|
|
1
|
+
{"version":3,"file":"sub-agent-guard-plugin.js","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;;;;GAMG;AACH,MAAM,OAAO,4BAA4B;IACtB,WAAW,CAAS;IAErC,YAAY,OAA6B;QACvC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,EAAE,QAAQ,EAAmB;QAC3C,qCAAqC;QACrC,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAExE,oCAAoC;QACpC,QAAQ,CAAC,GAAG,CACV,IAAI,4BAA4B,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CACpE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { AgentNS } from "@ai-zen/agents-core";
|
|
12
12
|
import { type AutoMigrateTriggerInfo, type HandoffMode } from "@ai-zen/agents-sdk";
|
|
13
|
+
import type { TokenThresholds } from "../reasoning-effort.js";
|
|
13
14
|
import { stripCwdNote } from "./text.js";
|
|
14
15
|
/** 会话 → UI 的对外信号 */
|
|
15
16
|
export interface ChatSessionNotifier {
|
|
@@ -35,7 +36,8 @@ export { stripCwdNote };
|
|
|
35
36
|
export declare class ChatSession {
|
|
36
37
|
readonly modelId: string;
|
|
37
38
|
readonly agentId: string;
|
|
38
|
-
|
|
39
|
+
/** 当前模型的上下文阈值(交接软线 + 阻断硬线),缺省时不装护栏插件 */
|
|
40
|
+
readonly tokenThresholds?: TokenThresholds;
|
|
39
41
|
/**
|
|
40
42
|
* 会话 id / 名称的**唯一真相源是 `ctx`**(`ConversationContext`)。
|
|
41
43
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/tui/chat-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAY,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAGjB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/tui/chat-session.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/chat-session.js
CHANGED
|
@@ -25,7 +25,8 @@ export { stripCwdNote };
|
|
|
25
25
|
export class ChatSession {
|
|
26
26
|
modelId;
|
|
27
27
|
agentId;
|
|
28
|
-
|
|
28
|
+
/** 当前模型的上下文阈值(交接软线 + 阻断硬线),缺省时不装护栏插件 */
|
|
29
|
+
tokenThresholds;
|
|
29
30
|
/**
|
|
30
31
|
* 会话 id / 名称的**唯一真相源是 `ctx`**(`ConversationContext`)。
|
|
31
32
|
*
|
|
@@ -53,12 +54,12 @@ export class ChatSession {
|
|
|
53
54
|
notifier;
|
|
54
55
|
requestMode;
|
|
55
56
|
disposers = [];
|
|
56
|
-
constructor(handoffService, ctx, options,
|
|
57
|
+
constructor(handoffService, ctx, options, tokenThresholds, notifier) {
|
|
57
58
|
this.handoffService = handoffService;
|
|
58
59
|
this.ctx = ctx;
|
|
59
60
|
this.modelId = options.modelId;
|
|
60
61
|
this.agentId = options.agentId || "default";
|
|
61
|
-
this.
|
|
62
|
+
this.tokenThresholds = tokenThresholds;
|
|
62
63
|
this.currentId = ctx.currentId || generateConversationId();
|
|
63
64
|
this.currentName = ctx.currentName;
|
|
64
65
|
this.notifier = notifier;
|
|
@@ -68,8 +69,8 @@ export class ChatSession {
|
|
|
68
69
|
static async create(options, notifier) {
|
|
69
70
|
const config = await readConfig();
|
|
70
71
|
const model = config.models.find((m) => m.id === options.modelId);
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
// 阈值由配置直接给出(旧字段已在 SDK 的 ConfigManager.read() 里迁移过)
|
|
73
|
+
const tokenThresholds = model?.tokenThresholds;
|
|
73
74
|
const agent = await createAgent({ messages: options.messages, agentId: options.agentId });
|
|
74
75
|
const currentId = options.conversationId || generateConversationId();
|
|
75
76
|
const ctx = {
|
|
@@ -86,7 +87,7 @@ export class ChatSession {
|
|
|
86
87
|
log: (text) => notifier.onNotice(text, "info"),
|
|
87
88
|
});
|
|
88
89
|
ctx.handoffService = handoffService;
|
|
89
|
-
const session = new ChatSession(handoffService, ctx, options,
|
|
90
|
+
const session = new ChatSession(handoffService, ctx, options, tokenThresholds, notifier);
|
|
90
91
|
session.agent = agent;
|
|
91
92
|
await session.attach(agent);
|
|
92
93
|
return session;
|
|
@@ -243,22 +244,19 @@ export class ChatSession {
|
|
|
243
244
|
cwd: process.cwd(),
|
|
244
245
|
onError: (text) => this.notifier.onNotice(text, "info"),
|
|
245
246
|
}));
|
|
246
|
-
if (this.
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
// 且交接回合本身还要再发请求,不放宽会被护栏误杀;放宽仍保留熔断
|
|
251
|
-
isSuspended: () => this.handoffService.busy,
|
|
252
|
-
}));
|
|
247
|
+
if (this.tokenThresholds) {
|
|
248
|
+
const { handoff, guard } = this.tokenThresholds;
|
|
249
|
+
// 硬线:请求前用量超过 guard 即中断本轮(绝对值,不再有 ratio/放宽档)
|
|
250
|
+
agent.use(new ContextGuardPlugin({ guardTokens: guard }));
|
|
253
251
|
agent.use(createAutoMigratePlugin({
|
|
254
252
|
service: this.handoffService,
|
|
255
|
-
|
|
253
|
+
handoffTokens: handoff,
|
|
256
254
|
// TUI 下由 Ink 层提供执行者选择器;无选择通道时按默认执行者(原 agent 自交接)迁移
|
|
257
255
|
shouldConfirm: () => Boolean(this.requestMode),
|
|
258
256
|
choose: (info) => this.requestMode(info),
|
|
259
257
|
log: (text) => this.notifier.onNotice(text, "info"),
|
|
260
258
|
}));
|
|
261
|
-
agent.use(new SubAgentGuardInstallerPlugin({
|
|
259
|
+
agent.use(new SubAgentGuardInstallerPlugin({ guardTokens: guard }));
|
|
262
260
|
}
|
|
263
261
|
this.wire(agent);
|
|
264
262
|
await agent.init();
|