@nickyzj2023/ai 1.1.2 → 1.1.3
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/dist/cli.mjs +1 -1
- package/dist/index.d.mts +16 -4
- package/dist/index.mjs +1 -1
- package/dist/{src-DzLCCWBV.mjs → src-B0tl6AT5.mjs} +57 -8
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as defineModel, n as get_weather_default, o as runAgent, r as get_time_default } from "./src-
|
|
1
|
+
import { i as defineModel, n as get_weather_default, o as runAgent, r as get_time_default } from "./src-B0tl6AT5.mjs";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { loadEnvFile } from "node:process";
|
|
4
4
|
import readline from "node:readline";
|
package/dist/index.d.mts
CHANGED
|
@@ -150,8 +150,8 @@ declare const _default$1: ToolDefinition;
|
|
|
150
150
|
//#endregion
|
|
151
151
|
//#region src/utils/compact/types.d.ts
|
|
152
152
|
declare namespace Compact {
|
|
153
|
-
type ReplacerOfToolResultContent = (content: Message["content"]) => Message["content"];
|
|
154
|
-
type ReplacerOfMediaContent = (content: Message["content"]) => Message["content"];
|
|
153
|
+
type ReplacerOfToolResultContent = (content: Message["content"], options?: Record<string, any>) => Promise<Message["content"]> | Message["content"];
|
|
154
|
+
type ReplacerOfMediaContent = (content: Message["content"], options?: Record<string, any>) => Promise<Message["content"]> | Message["content"];
|
|
155
155
|
type SummarizeOptions = {
|
|
156
156
|
/** 用什么模型总结 */
|
|
157
157
|
model: Model;
|
|
@@ -180,8 +180,16 @@ declare namespace Compact {
|
|
|
180
180
|
}
|
|
181
181
|
//#endregion
|
|
182
182
|
//#region src/utils/compact/strategy.d.ts
|
|
183
|
-
declare const softDeleteToolResults: (messages: Message[],
|
|
184
|
-
|
|
183
|
+
declare const softDeleteToolResults: (messages: Message[], options: {
|
|
184
|
+
replacer?: Compact.ReplacerOfToolResultContent;
|
|
185
|
+
mark: string;
|
|
186
|
+
model?: Model;
|
|
187
|
+
}) => Promise<Message[]>;
|
|
188
|
+
declare const softDeleteOldMediaMessages: (messages: Message[], options: {
|
|
189
|
+
replacer?: Compact.ReplacerOfMediaContent;
|
|
190
|
+
mark: string;
|
|
191
|
+
model?: Model;
|
|
192
|
+
}) => Promise<Message[]>;
|
|
185
193
|
/**
|
|
186
194
|
* 清理软删除后残留的占位消息(信息在软删除时已丢失,此时删除不损失任何额外信息)
|
|
187
195
|
* @param messages 可压缩区消息数组,直接原地删除
|
|
@@ -229,6 +237,10 @@ declare const compact: ((messages: Message[], model: Model, options?: {
|
|
|
229
237
|
* @default (content) => "(已被丢弃)"
|
|
230
238
|
*/
|
|
231
239
|
replacerOfMediaContent?: Compact.ReplacerOfMediaContent;
|
|
240
|
+
/**
|
|
241
|
+
* 用于标记哪些消息被软删除了
|
|
242
|
+
*/
|
|
243
|
+
softDeletedMessageMark?: string;
|
|
232
244
|
/**
|
|
233
245
|
* 上下文>总上下文*ratio时清理软删除残留的占位消息
|
|
234
246
|
* @default 0.7
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as defineTool, i as defineModel, n as get_weather_default, o as runAgent, r as get_time_default, t as compact } from "./src-
|
|
1
|
+
import { a as defineTool, i as defineModel, n as get_weather_default, o as runAgent, r as get_time_default, t as compact } from "./src-B0tl6AT5.mjs";
|
|
2
2
|
export { compact, defineModel, defineTool, get_time_default as getTime, get_weather_default as getWeather, runAgent };
|
|
@@ -278,16 +278,52 @@ const findToolGroupRange = (messages, toolIndex) => {
|
|
|
278
278
|
};
|
|
279
279
|
//#endregion
|
|
280
280
|
//#region src/utils/compact/strategy.ts
|
|
281
|
-
|
|
281
|
+
/** 默认的软删除多模态消息策略:让大模型精简消息内容 */
|
|
282
|
+
const defaultReplacerOfToolResultContent = async (content, options) => {
|
|
283
|
+
const { mark, model } = options ?? {};
|
|
284
|
+
const messages = [{
|
|
285
|
+
role: "user",
|
|
286
|
+
content
|
|
287
|
+
}, {
|
|
288
|
+
role: "user",
|
|
289
|
+
content: "请用一两句话对上条消息做个“省流”"
|
|
290
|
+
}];
|
|
291
|
+
let simplifiedContent = mark;
|
|
292
|
+
for await (const e of runAgent(model, messages, [])) if (e.type === "content_delta") simplifiedContent += e.delta;
|
|
293
|
+
return simplifiedContent;
|
|
294
|
+
};
|
|
295
|
+
const softDeleteToolResults = async (messages, options) => {
|
|
296
|
+
const { replacer = defaultReplacerOfToolResultContent, mark, model } = options ?? {};
|
|
297
|
+
if (!replacer && !model) return [];
|
|
282
298
|
const softDeleted = [];
|
|
283
|
-
for (const message of messages) if (message?.role === "tool") {
|
|
284
|
-
|
|
299
|
+
for (const message of messages) if (message?.role === "tool" && typeof message.content === "string") {
|
|
300
|
+
if (message.content.startsWith(mark)) continue;
|
|
301
|
+
message.content = await replacer(message.content, {
|
|
302
|
+
mark,
|
|
303
|
+
model
|
|
304
|
+
});
|
|
285
305
|
softDeleted.push(message);
|
|
286
306
|
}
|
|
287
307
|
if (softDeleted.length > 0) logger(`软删除了${softDeleted.length}条工具调用结果消息`);
|
|
288
308
|
return softDeleted;
|
|
289
309
|
};
|
|
290
|
-
|
|
310
|
+
/** 默认的软删除多模态消息策略:让大模型精简消息内容 */
|
|
311
|
+
const defaultReplacerOfMediaContent = async (content, options) => {
|
|
312
|
+
const { mark, model } = options ?? {};
|
|
313
|
+
const messages = [{
|
|
314
|
+
role: "user",
|
|
315
|
+
content
|
|
316
|
+
}, {
|
|
317
|
+
role: "user",
|
|
318
|
+
content: "请用一两句话描述上方的多模态消息"
|
|
319
|
+
}];
|
|
320
|
+
let simplifiedContent = mark;
|
|
321
|
+
for await (const e of runAgent(model, messages, [])) if (e.type === "content_delta") simplifiedContent += e.delta;
|
|
322
|
+
return simplifiedContent;
|
|
323
|
+
};
|
|
324
|
+
const softDeleteOldMediaMessages = async (messages, options) => {
|
|
325
|
+
const { replacer = defaultReplacerOfMediaContent, mark, model } = options ?? {};
|
|
326
|
+
if (!replacer && !model) return [];
|
|
291
327
|
const mediaTypes = [
|
|
292
328
|
"image_url",
|
|
293
329
|
"input_audio",
|
|
@@ -295,7 +331,10 @@ const softDeleteOldMediaMessages = (messages, replacer) => {
|
|
|
295
331
|
];
|
|
296
332
|
const softDeleted = [];
|
|
297
333
|
for (const message of messages) if (message && Array.isArray(message.content) && message.content.some((part) => mediaTypes.includes(part.type))) {
|
|
298
|
-
message.content = replacer(message.content
|
|
334
|
+
message.content = await replacer(message.content, {
|
|
335
|
+
mark,
|
|
336
|
+
model
|
|
337
|
+
});
|
|
299
338
|
softDeleted.push(message);
|
|
300
339
|
}
|
|
301
340
|
if (softDeleted.length > 0) logger(`软删除了${softDeleted.length}条旧图片/音频/视频消息`);
|
|
@@ -393,7 +432,7 @@ const hardDeleteOldMessages = (messages) => {
|
|
|
393
432
|
* 自动优化上下文,类似AI Coding Agent的/compact命令
|
|
394
433
|
*/
|
|
395
434
|
const compact = Object.assign(async (messages, model, options) => {
|
|
396
|
-
const { usage, keepCount = 10, ratioToCompactToolResult = .5, replacerOfToolResultContent
|
|
435
|
+
const { usage, keepCount = 10, ratioToCompactToolResult = .5, replacerOfToolResultContent, ratioToCompactMedia = .6, replacerOfMediaContent, ratioToClearSoftDeletedMessages = .7, softDeletedMessageMark = "[已简化]", ratioToSummarize = .8, summarizeOptions } = options ?? {};
|
|
397
436
|
const context = model?.context ?? 131072;
|
|
398
437
|
const tokens = usage?.total_tokens ?? estimateTokens(messages);
|
|
399
438
|
const result = {
|
|
@@ -413,11 +452,21 @@ const compact = Object.assign(async (messages, model, options) => {
|
|
|
413
452
|
const reserved = messages.slice(endIndex);
|
|
414
453
|
const softDeleted = /* @__PURE__ */ new Set();
|
|
415
454
|
if (tokens > context * ratioToCompactToolResult) {
|
|
416
|
-
|
|
455
|
+
const softDeletedMessages = await softDeleteToolResults(compressible, {
|
|
456
|
+
replacer: replacerOfToolResultContent,
|
|
457
|
+
mark: softDeletedMessageMark,
|
|
458
|
+
model
|
|
459
|
+
});
|
|
460
|
+
for (const message of softDeletedMessages) softDeleted.add(message);
|
|
417
461
|
result.hasCompactedToolResult = true;
|
|
418
462
|
}
|
|
419
463
|
if (tokens > context * ratioToCompactMedia) {
|
|
420
|
-
|
|
464
|
+
const softDeletedMessages = await softDeleteOldMediaMessages(compressible, {
|
|
465
|
+
replacer: replacerOfMediaContent,
|
|
466
|
+
mark: softDeletedMessageMark,
|
|
467
|
+
model
|
|
468
|
+
});
|
|
469
|
+
for (const message of softDeletedMessages) softDeleted.add(message);
|
|
421
470
|
result.hasCompactedMedia = true;
|
|
422
471
|
}
|
|
423
472
|
if (tokens > context * ratioToClearSoftDeletedMessages) {
|