@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 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-DzLCCWBV.mjs";
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[], replacer: Compact.ReplacerOfToolResultContent) => Message[];
184
- declare const softDeleteOldMediaMessages: (messages: Message[], replacer: Compact.ReplacerOfMediaContent) => Message[];
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-DzLCCWBV.mjs";
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
- const softDeleteToolResults = (messages, replacer) => {
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
- message.content = replacer(message.content);
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
- const softDeleteOldMediaMessages = (messages, replacer) => {
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 = () => "(工具结果已消费)", ratioToCompactMedia = .6, replacerOfMediaContent = () => "(消息已过期)", ratioToClearSoftDeletedMessages = .7, ratioToSummarize = .8, summarizeOptions } = options ?? {};
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
- for (const message of softDeleteToolResults(compressible, replacerOfToolResultContent)) softDeleted.add(message);
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
- for (const message of softDeleteOldMediaMessages(compressible, replacerOfMediaContent)) softDeleted.add(message);
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nickyzj2023/ai",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "我的“pi”,参考了pi-from-scratch",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",