koishi-plugin-chatluna 1.3.32 → 1.3.34

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.
Files changed (57) hide show
  1. package/lib/chains/chain.d.ts +2 -2
  2. package/lib/chains/index.cjs +59 -26
  3. package/lib/chains/index.mjs +59 -26
  4. package/lib/config.d.ts +1 -0
  5. package/lib/index.cjs +138 -42
  6. package/lib/index.mjs +141 -45
  7. package/lib/llm-core/agent/creator.d.ts +19 -4
  8. package/lib/llm-core/agent/executor.d.ts +37 -148
  9. package/lib/llm-core/agent/index.cjs +471 -912
  10. package/lib/llm-core/agent/index.d.ts +0 -1
  11. package/lib/llm-core/agent/index.mjs +476 -908
  12. package/lib/llm-core/agent/openai/index.d.ts +3 -2
  13. package/lib/llm-core/agent/openai/output_parser.d.ts +4 -3
  14. package/lib/llm-core/agent/react/index.d.ts +9 -3
  15. package/lib/llm-core/agent/react/output_parser.d.ts +2 -2
  16. package/lib/llm-core/agent/types.d.ts +51 -60
  17. package/lib/llm-core/chain/base.cjs +1 -1
  18. package/lib/llm-core/chain/base.d.ts +7 -0
  19. package/lib/llm-core/chain/base.mjs +1 -1
  20. package/lib/llm-core/chain/infinite_context_chain.d.ts +6 -2
  21. package/lib/llm-core/chain/plugin_chat_chain.d.ts +7 -5
  22. package/lib/llm-core/chain/prompt.cjs +11 -14
  23. package/lib/llm-core/chain/prompt.d.ts +0 -1
  24. package/lib/llm-core/chain/prompt.mjs +11 -14
  25. package/lib/llm-core/chat/app.cjs +268 -446
  26. package/lib/llm-core/chat/app.d.ts +6 -8
  27. package/lib/llm-core/chat/app.mjs +273 -448
  28. package/lib/llm-core/chat/helper.d.ts +14 -0
  29. package/lib/llm-core/chat/infinite_context.d.ts +9 -9
  30. package/lib/llm-core/memory/message/database_history.d.ts +4 -1
  31. package/lib/llm-core/memory/message/index.cjs +95 -41
  32. package/lib/llm-core/memory/message/index.mjs +95 -41
  33. package/lib/llm-core/platform/api.cjs +0 -6
  34. package/lib/llm-core/platform/api.mjs +0 -6
  35. package/lib/llm-core/platform/model.cjs +109 -89
  36. package/lib/llm-core/platform/model.d.ts +2 -7
  37. package/lib/llm-core/platform/model.mjs +109 -89
  38. package/lib/llm-core/platform/service.cjs +43 -0
  39. package/lib/llm-core/platform/service.d.ts +15 -1
  40. package/lib/llm-core/platform/service.mjs +43 -0
  41. package/lib/llm-core/platform/types.d.ts +14 -6
  42. package/lib/llm-core/prompt/context_manager.d.ts +3 -1
  43. package/lib/llm-core/prompt/index.cjs +7 -0
  44. package/lib/llm-core/prompt/index.mjs +7 -0
  45. package/lib/services/chat.cjs +199 -41
  46. package/lib/services/chat.d.ts +13 -5
  47. package/lib/services/chat.mjs +202 -42
  48. package/lib/services/types.d.ts +8 -2
  49. package/lib/utils/schema.cjs +17 -7
  50. package/lib/utils/schema.d.ts +3 -0
  51. package/lib/utils/schema.mjs +16 -7
  52. package/lib/utils/string.cjs +1 -1
  53. package/lib/utils/string.mjs +1 -1
  54. package/lib/utils/time.d.ts +6 -0
  55. package/package.json +3 -3
  56. package/resources/presets/sydney.yml +1 -10
  57. package/lib/llm-core/agent/agent.d.ts +0 -142
@@ -46,7 +46,7 @@ export declare class ChainMiddleware {
46
46
  constructor(name: string, execute: ChainMiddlewareFunction, graph: ChatChainDependencyGraph);
47
47
  before<T extends keyof ChainMiddlewareName>(name: T): this;
48
48
  after<T extends keyof ChainMiddlewareName>(name: T): this;
49
- run(session: Session, options: ChainMiddlewareContext): Promise<string | ChainMiddlewareRunStatus | h[] | h[][]>;
49
+ run(session: Session, options: ChainMiddlewareContext): Promise<string | h[] | h[][] | ChainMiddlewareRunStatus>;
50
50
  }
51
51
  export interface ChainMiddlewareContext {
52
52
  config: Config;
@@ -64,7 +64,7 @@ export interface ChainMiddlewareContextOptions {
64
64
  export interface ChainMiddlewareName {
65
65
  }
66
66
  export type ChainMiddlewareFunction = (session: Session, context: ChainMiddlewareContext) => Promise<string | h[] | h[][] | ChainMiddlewareRunStatus | null>;
67
- export type ChatChainSender = (session: Session, message: (h[] | h | string)[]) => Promise<void>;
67
+ export type ChatChainSender = (session: Session, message: (h[] | h | string)[], context?: ChainMiddlewareContext) => Promise<void>;
68
68
  export declare enum ChainMiddlewareRunStatus {
69
69
  SKIPPED = 0,
70
70
  STOP = 1,
@@ -65,6 +65,26 @@ var lifecycleNames = [
65
65
  "lifecycle-send"
66
66
  ];
67
67
 
68
+ // src/utils/time.ts
69
+ function formatDuration(ms) {
70
+ if (ms < 1e3) {
71
+ return `${ms}ms`;
72
+ }
73
+ const totalSeconds = Math.floor(ms / 1e3);
74
+ const hours = Math.floor(totalSeconds / 3600);
75
+ const minutes = Math.floor(totalSeconds % 3600 / 60);
76
+ const seconds = totalSeconds % 60;
77
+ if (hours > 0) {
78
+ return `${hours}h ${minutes}m ${seconds}s`;
79
+ }
80
+ if (minutes > 0) {
81
+ return `${minutes}m ${seconds}s`;
82
+ }
83
+ const decimal = (ms / 1e3).toFixed(2);
84
+ return `${decimal}s`;
85
+ }
86
+ __name(formatDuration, "formatDuration");
87
+
68
88
  // src/chains/chain.ts
69
89
  var logger;
70
90
  var ChatChain = class {
@@ -76,7 +96,7 @@ var ChatChain = class {
76
96
  this._senders = [];
77
97
  const defaultChatChainSender = new DefaultChatChainSender(config);
78
98
  this._senders.push(
79
- (session, messages) => defaultChatChainSender.send(session, messages)
99
+ (session, messages, context) => defaultChatChainSender.send(session, messages, context)
80
100
  );
81
101
  }
82
102
  static {
@@ -102,8 +122,10 @@ var ChatChain = class {
102
122
  message: session.content,
103
123
  ctx: ctx ?? this.ctx,
104
124
  session,
105
- options: {},
106
- send: /* @__PURE__ */ __name((message) => this.sendMessage(session, message), "send"),
125
+ options: {
126
+ startedAt: Date.now()
127
+ },
128
+ send: /* @__PURE__ */ __name((message) => this.sendMessage(session, message, context), "send"),
107
129
  recallThinkingMessage: this._createRecallThinkingMessage(
108
130
  {}
109
131
  )
@@ -120,11 +142,14 @@ var ChatChain = class {
120
142
  ctx,
121
143
  session,
122
144
  command,
123
- send: /* @__PURE__ */ __name((message) => this.sendMessage(session, message), "send"),
145
+ send: /* @__PURE__ */ __name((message) => this.sendMessage(session, message, context), "send"),
124
146
  recallThinkingMessage: this._createRecallThinkingMessage(
125
147
  {}
126
148
  ),
127
- options
149
+ options: {
150
+ ...options,
151
+ startedAt: Date.now()
152
+ }
128
153
  };
129
154
  context.recallThinkingMessage = this._createRecallThinkingMessage(context);
130
155
  const result = await this._runMiddleware(session, context);
@@ -184,7 +209,7 @@ var ChatChain = class {
184
209
  logger.debug("-".repeat(40) + "\n");
185
210
  }
186
211
  if (context.message != null && context.message !== originMessage) {
187
- await this.sendMessage(session, context.message);
212
+ await this.sendMessage(session, context.message, context);
188
213
  }
189
214
  return true;
190
215
  }
@@ -253,9 +278,9 @@ var ChatChain = class {
253
278
  const shouldLogTime = !middleware.name.startsWith("lifecycle-") && result !== 0 /* SKIPPED */ && middleware.name !== "allow_reply" && executionTime > 100;
254
279
  if (shouldLogTime) {
255
280
  logger.debug(
256
- `middleware %c executed in %d ms`,
281
+ `middleware %c executed in %s`,
257
282
  middleware.name,
258
- executionTime
283
+ formatDuration(executionTime)
259
284
  );
260
285
  }
261
286
  if (result === 1 /* STOP */) {
@@ -280,15 +305,15 @@ var ChatChain = class {
280
305
  };
281
306
  }
282
307
  }
283
- async sendMessage(session, message) {
308
+ async sendMessage(session, message, context) {
284
309
  const messages = message instanceof Array ? message : [message];
285
310
  for (const sender of this._senders) {
286
- await sender(session, messages);
311
+ await sender(session, messages, context);
287
312
  }
288
313
  }
289
314
  async _handleStopStatus(session, context, originMessage, isOutputLog) {
290
315
  if (context.message != null && context.message !== originMessage) {
291
- await this.sendMessage(session, context.message);
316
+ await this.sendMessage(session, context.message, context);
292
317
  }
293
318
  if (isOutputLog) {
294
319
  logger.debug("-".repeat(40) + "\n");
@@ -297,7 +322,7 @@ var ChatChain = class {
297
322
  async _handleMiddlewareError(session, middlewareName, error) {
298
323
  if (error instanceof import_error.ChatLunaError) {
299
324
  const message = error.errorCode === import_error.ChatLunaErrorCode.ABORTED ? session.text("chatluna.aborted") : error.message;
300
- await this.sendMessage(session, message);
325
+ await this.sendMessage(session, message, void 0);
301
326
  return;
302
327
  }
303
328
  logger.error(`chat-chain: ${middlewareName} error ${error}`);
@@ -309,7 +334,8 @@ var ChatChain = class {
309
334
  session.text("chatluna.middleware_error", [
310
335
  middlewareName,
311
336
  error.message
312
- ])
337
+ ]),
338
+ void 0
313
339
  );
314
340
  }
315
341
  };
@@ -580,7 +606,7 @@ var DefaultChatChainSender = class {
580
606
  return element;
581
607
  });
582
608
  }
583
- async send(session, messages) {
609
+ async send(session, messages, context) {
584
610
  if (!messages?.length) return;
585
611
  if (isElementArray(messages?.[0]) && messages[0][1]?.type === "markdown-qq") {
586
612
  await this.sendAsQQMarkdown(session, messages[0][0]);
@@ -590,18 +616,21 @@ var DefaultChatChainSender = class {
590
616
  await this.sendAsForward(session, messages);
591
617
  return;
592
618
  }
593
- await this.sendAsNormal(session, messages);
619
+ await this.sendAsNormal(session, messages, context);
594
620
  }
595
621
  async sendAsQQMarkdown(session, message) {
596
622
  const { user } = session.event;
597
- await session.bot.internal.sendPrivateMessage(user.id, {
598
- msg_type: 2,
599
- msg_seq: 1,
600
- msg_id: session.messageId,
601
- markdown: {
602
- content: message.attrs["content"]
623
+ await session.bot.internal.sendPrivateMessage(
624
+ user.id,
625
+ {
626
+ msg_type: 2,
627
+ msg_seq: 1,
628
+ msg_id: session.messageId,
629
+ markdown: {
630
+ content: message.attrs["content"]
631
+ }
603
632
  }
604
- });
633
+ );
605
634
  }
606
635
  async sendAsForward(session, messages) {
607
636
  const sendMessages = this.convertToForwardMessages(messages);
@@ -625,19 +654,23 @@ var DefaultChatChainSender = class {
625
654
  }
626
655
  throw new Error(`Unsupported message type: ${typeof firstMsg}`);
627
656
  }
628
- async sendAsNormal(session, messages) {
657
+ async sendAsNormal(session, messages, context) {
629
658
  for (const message of messages) {
630
659
  const messageFragment = await this.buildMessageFragment(
631
660
  session,
632
- message
661
+ message,
662
+ context
633
663
  );
634
664
  if (!messageFragment?.length) continue;
635
665
  const processedFragment = this.processElements(messageFragment);
636
666
  await session.sendQueued(processedFragment);
637
667
  }
638
668
  }
639
- async buildMessageFragment(session, message) {
640
- const shouldAddQuote = this.config.isReplyWithAt && session.isDirect === false && session.messageId;
669
+ async buildMessageFragment(session, message, context) {
670
+ const start = context?.options?.startedAt;
671
+ const elapsed = start ? Date.now() - start : 0;
672
+ const threshold = (this.config.replyQuoteThreshold ?? 0) * 1e3;
673
+ const shouldAddQuote = this.config.isReplyWithAt && session.isDirect === false && session.messageId && elapsed >= threshold;
641
674
  const messageContent = this.convertMessageToArray(message);
642
675
  if (messageContent == null || messageContent.length < 1 || messageContent.length === 1 && messageContent.join().length === 0) {
643
676
  return;
@@ -20,6 +20,26 @@ var lifecycleNames = [
20
20
  "lifecycle-send"
21
21
  ];
22
22
 
23
+ // src/utils/time.ts
24
+ function formatDuration(ms) {
25
+ if (ms < 1e3) {
26
+ return `${ms}ms`;
27
+ }
28
+ const totalSeconds = Math.floor(ms / 1e3);
29
+ const hours = Math.floor(totalSeconds / 3600);
30
+ const minutes = Math.floor(totalSeconds % 3600 / 60);
31
+ const seconds = totalSeconds % 60;
32
+ if (hours > 0) {
33
+ return `${hours}h ${minutes}m ${seconds}s`;
34
+ }
35
+ if (minutes > 0) {
36
+ return `${minutes}m ${seconds}s`;
37
+ }
38
+ const decimal = (ms / 1e3).toFixed(2);
39
+ return `${decimal}s`;
40
+ }
41
+ __name(formatDuration, "formatDuration");
42
+
23
43
  // src/chains/chain.ts
24
44
  var logger;
25
45
  var ChatChain = class {
@@ -31,7 +51,7 @@ var ChatChain = class {
31
51
  this._senders = [];
32
52
  const defaultChatChainSender = new DefaultChatChainSender(config);
33
53
  this._senders.push(
34
- (session, messages) => defaultChatChainSender.send(session, messages)
54
+ (session, messages, context) => defaultChatChainSender.send(session, messages, context)
35
55
  );
36
56
  }
37
57
  static {
@@ -57,8 +77,10 @@ var ChatChain = class {
57
77
  message: session.content,
58
78
  ctx: ctx ?? this.ctx,
59
79
  session,
60
- options: {},
61
- send: /* @__PURE__ */ __name((message) => this.sendMessage(session, message), "send"),
80
+ options: {
81
+ startedAt: Date.now()
82
+ },
83
+ send: /* @__PURE__ */ __name((message) => this.sendMessage(session, message, context), "send"),
62
84
  recallThinkingMessage: this._createRecallThinkingMessage(
63
85
  {}
64
86
  )
@@ -75,11 +97,14 @@ var ChatChain = class {
75
97
  ctx,
76
98
  session,
77
99
  command,
78
- send: /* @__PURE__ */ __name((message) => this.sendMessage(session, message), "send"),
100
+ send: /* @__PURE__ */ __name((message) => this.sendMessage(session, message, context), "send"),
79
101
  recallThinkingMessage: this._createRecallThinkingMessage(
80
102
  {}
81
103
  ),
82
- options
104
+ options: {
105
+ ...options,
106
+ startedAt: Date.now()
107
+ }
83
108
  };
84
109
  context.recallThinkingMessage = this._createRecallThinkingMessage(context);
85
110
  const result = await this._runMiddleware(session, context);
@@ -139,7 +164,7 @@ var ChatChain = class {
139
164
  logger.debug("-".repeat(40) + "\n");
140
165
  }
141
166
  if (context.message != null && context.message !== originMessage) {
142
- await this.sendMessage(session, context.message);
167
+ await this.sendMessage(session, context.message, context);
143
168
  }
144
169
  return true;
145
170
  }
@@ -208,9 +233,9 @@ var ChatChain = class {
208
233
  const shouldLogTime = !middleware.name.startsWith("lifecycle-") && result !== 0 /* SKIPPED */ && middleware.name !== "allow_reply" && executionTime > 100;
209
234
  if (shouldLogTime) {
210
235
  logger.debug(
211
- `middleware %c executed in %d ms`,
236
+ `middleware %c executed in %s`,
212
237
  middleware.name,
213
- executionTime
238
+ formatDuration(executionTime)
214
239
  );
215
240
  }
216
241
  if (result === 1 /* STOP */) {
@@ -235,15 +260,15 @@ var ChatChain = class {
235
260
  };
236
261
  }
237
262
  }
238
- async sendMessage(session, message) {
263
+ async sendMessage(session, message, context) {
239
264
  const messages = message instanceof Array ? message : [message];
240
265
  for (const sender of this._senders) {
241
- await sender(session, messages);
266
+ await sender(session, messages, context);
242
267
  }
243
268
  }
244
269
  async _handleStopStatus(session, context, originMessage, isOutputLog) {
245
270
  if (context.message != null && context.message !== originMessage) {
246
- await this.sendMessage(session, context.message);
271
+ await this.sendMessage(session, context.message, context);
247
272
  }
248
273
  if (isOutputLog) {
249
274
  logger.debug("-".repeat(40) + "\n");
@@ -252,7 +277,7 @@ var ChatChain = class {
252
277
  async _handleMiddlewareError(session, middlewareName, error) {
253
278
  if (error instanceof ChatLunaError) {
254
279
  const message = error.errorCode === ChatLunaErrorCode.ABORTED ? session.text("chatluna.aborted") : error.message;
255
- await this.sendMessage(session, message);
280
+ await this.sendMessage(session, message, void 0);
256
281
  return;
257
282
  }
258
283
  logger.error(`chat-chain: ${middlewareName} error ${error}`);
@@ -264,7 +289,8 @@ var ChatChain = class {
264
289
  session.text("chatluna.middleware_error", [
265
290
  middlewareName,
266
291
  error.message
267
- ])
292
+ ]),
293
+ void 0
268
294
  );
269
295
  }
270
296
  };
@@ -535,7 +561,7 @@ var DefaultChatChainSender = class {
535
561
  return element;
536
562
  });
537
563
  }
538
- async send(session, messages) {
564
+ async send(session, messages, context) {
539
565
  if (!messages?.length) return;
540
566
  if (isElementArray(messages?.[0]) && messages[0][1]?.type === "markdown-qq") {
541
567
  await this.sendAsQQMarkdown(session, messages[0][0]);
@@ -545,18 +571,21 @@ var DefaultChatChainSender = class {
545
571
  await this.sendAsForward(session, messages);
546
572
  return;
547
573
  }
548
- await this.sendAsNormal(session, messages);
574
+ await this.sendAsNormal(session, messages, context);
549
575
  }
550
576
  async sendAsQQMarkdown(session, message) {
551
577
  const { user } = session.event;
552
- await session.bot.internal.sendPrivateMessage(user.id, {
553
- msg_type: 2,
554
- msg_seq: 1,
555
- msg_id: session.messageId,
556
- markdown: {
557
- content: message.attrs["content"]
578
+ await session.bot.internal.sendPrivateMessage(
579
+ user.id,
580
+ {
581
+ msg_type: 2,
582
+ msg_seq: 1,
583
+ msg_id: session.messageId,
584
+ markdown: {
585
+ content: message.attrs["content"]
586
+ }
558
587
  }
559
- });
588
+ );
560
589
  }
561
590
  async sendAsForward(session, messages) {
562
591
  const sendMessages = this.convertToForwardMessages(messages);
@@ -580,19 +609,23 @@ var DefaultChatChainSender = class {
580
609
  }
581
610
  throw new Error(`Unsupported message type: ${typeof firstMsg}`);
582
611
  }
583
- async sendAsNormal(session, messages) {
612
+ async sendAsNormal(session, messages, context) {
584
613
  for (const message of messages) {
585
614
  const messageFragment = await this.buildMessageFragment(
586
615
  session,
587
- message
616
+ message,
617
+ context
588
618
  );
589
619
  if (!messageFragment?.length) continue;
590
620
  const processedFragment = this.processElements(messageFragment);
591
621
  await session.sendQueued(processedFragment);
592
622
  }
593
623
  }
594
- async buildMessageFragment(session, message) {
595
- const shouldAddQuote = this.config.isReplyWithAt && session.isDirect === false && session.messageId;
624
+ async buildMessageFragment(session, message, context) {
625
+ const start = context?.options?.startedAt;
626
+ const elapsed = start ? Date.now() - start : 0;
627
+ const threshold = (this.config.replyQuoteThreshold ?? 0) * 1e3;
628
+ const shouldAddQuote = this.config.isReplyWithAt && session.isDirect === false && session.messageId && elapsed >= threshold;
596
629
  const messageContent = this.convertMessageToArray(message);
597
630
  if (messageContent == null || messageContent.length < 1 || messageContent.length === 1 && messageContent.join().length === 0) {
598
631
  return;
package/lib/config.d.ts CHANGED
@@ -13,6 +13,7 @@ export interface Config {
13
13
  attachForwardMsgIdToContext: boolean;
14
14
  isLog: boolean;
15
15
  isReplyWithAt: boolean;
16
+ replyQuoteThreshold?: number;
16
17
  allowQuoteReply: boolean;
17
18
  proxyAddress: string;
18
19
  isProxy: boolean;