@dudousxd/nestjs-agent-core 0.45.1 → 0.45.2

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/index.js CHANGED
@@ -5676,7 +5676,7 @@ function traceToolExecution(runId, call, run) {
5676
5676
  }
5677
5677
  __name(traceToolExecution, "traceToolExecution");
5678
5678
  function toModelMessages(messages) {
5679
- return messages.map((message) => ({
5679
+ return withoutBlankAssistantMessages(messages.map((message) => ({
5680
5680
  role: message.role,
5681
5681
  content: message.content,
5682
5682
  ...message.toolCalls !== void 0 ? {
@@ -5688,9 +5688,17 @@ function toModelMessages(messages) {
5688
5688
  ...message.attachments !== void 0 ? {
5689
5689
  attachments: message.attachments
5690
5690
  } : {}
5691
- }));
5691
+ })));
5692
5692
  }
5693
5693
  __name(toModelMessages, "toModelMessages");
5694
+ function isBlankAssistantMessage(message) {
5695
+ return message.role === "assistant" && message.content.trim().length === 0 && (message.toolCalls?.length ?? 0) === 0 && (message.toolResults?.length ?? 0) === 0;
5696
+ }
5697
+ __name(isBlankAssistantMessage, "isBlankAssistantMessage");
5698
+ function withoutBlankAssistantMessages(messages) {
5699
+ return messages.some(isBlankAssistantMessage) ? messages.filter((message) => !isBlankAssistantMessage(message)) : messages;
5700
+ }
5701
+ __name(withoutBlankAssistantMessages, "withoutBlankAssistantMessages");
5694
5702
  function historyContext(input) {
5695
5703
  return {
5696
5704
  threadId: input.threadId,
@@ -5722,7 +5730,7 @@ async function loadSelectedHistory(deps, input, hooks) {
5722
5730
  });
5723
5731
  return {
5724
5732
  ...recorded,
5725
- messages: settleDanglingToolCalls(recorded.messages)
5733
+ messages: settleDanglingToolCalls(withoutBlankAssistantMessages(recorded.messages))
5726
5734
  };
5727
5735
  }
5728
5736
  __name(loadSelectedHistory, "loadSelectedHistory");
@@ -7490,13 +7498,18 @@ ${block}`;
7490
7498
  runId: hooks.runId,
7491
7499
  step: i,
7492
7500
  count
7493
- }, () => generateFollowUps(deps.model, [
7494
- ...modelMessages,
7495
- {
7496
- role: "assistant",
7497
- content: turn.text
7498
- }
7499
- ], count), (result2) => ({
7501
+ }, () => generateFollowUps(
7502
+ deps.model,
7503
+ // A blank answer is left off: an empty assistant message gets the call refused.
7504
+ turn.text.trim().length > 0 ? [
7505
+ ...modelMessages,
7506
+ {
7507
+ role: "assistant",
7508
+ content: turn.text
7509
+ }
7510
+ ] : modelMessages,
7511
+ count
7512
+ ), (result2) => ({
7500
7513
  followUps: result2.followUps.length,
7501
7514
  inputTokens: result2.usage.inputTokens,
7502
7515
  outputTokens: result2.usage.outputTokens,
@@ -7564,7 +7577,8 @@ ${block}`;
7564
7577
  ...synthetic.map((entry) => entry.call)
7565
7578
  ];
7566
7579
  const syntheticResults = synthetic.map((entry) => entry.result);
7567
- const assistant = await hooks.step(`persist:assistant:${i}`, () => deps.store.appendMessage({
7580
+ const blankStep = turn.text.trim().length === 0 && messageCalls.length === 0 && syntheticResults.length === 0 && (turn.ui === void 0 || turn.ui.length === 0) && turn.reasoning === void 0 && followUps === void 0;
7581
+ const assistant = await hooks.step(`persist:assistant:${i}`, () => blankStep ? Promise.resolve(null) : deps.store.appendMessage({
7568
7582
  threadId: input.threadId,
7569
7583
  role: "assistant",
7570
7584
  content: turn.text,
@@ -7610,6 +7624,23 @@ ${block}`;
7610
7624
  toolResults: syntheticResults
7611
7625
  } : {}
7612
7626
  };
7627
+ const finishFinalStep = /* @__PURE__ */ __name(() => hooks.step(`stream:step-finish:${i}`, async () => {
7628
+ await writer.write(encodeStreamEvent({
7629
+ kind: "step-finish",
7630
+ usage: turn.usage,
7631
+ costUsd,
7632
+ ...turn.reasoningMs !== void 0 ? {
7633
+ reasoningMs: turn.reasoningMs
7634
+ } : {},
7635
+ ...stepModel !== void 0 ? {
7636
+ model: stepModel
7637
+ } : {}
7638
+ }));
7639
+ }), "finishFinalStep");
7640
+ if (assistant === null) {
7641
+ await finishFinalStep();
7642
+ break;
7643
+ }
7613
7644
  modelMessages.push(assistantMessage);
7614
7645
  for (const entry of synthetic) {
7615
7646
  const { call, result: result2 } = entry;
@@ -7643,19 +7674,7 @@ ${block}`;
7643
7674
  });
7644
7675
  }
7645
7676
  if (isFinalTurn) {
7646
- await hooks.step(`stream:step-finish:${i}`, async () => {
7647
- await writer.write(encodeStreamEvent({
7648
- kind: "step-finish",
7649
- usage: turn.usage,
7650
- costUsd,
7651
- ...turn.reasoningMs !== void 0 ? {
7652
- reasoningMs: turn.reasoningMs
7653
- } : {},
7654
- ...stepModel !== void 0 ? {
7655
- model: stepModel
7656
- } : {}
7657
- }));
7658
- });
7677
+ await finishFinalStep();
7659
7678
  break;
7660
7679
  }
7661
7680
  await haltIfCancelled(hooks, cancellable, `cancel:tools:${i}`);
@@ -7766,13 +7785,15 @@ ${toolText}`;
7766
7785
  return;
7767
7786
  }
7768
7787
  const agent = input.agentName ?? "default";
7769
- await deps.store.appendMessage({
7770
- threadId: delivery.threadId,
7771
- role: "assistant",
7772
- content: lastText,
7773
- agentName: agent,
7774
- runId: hooks.runId
7775
- });
7788
+ if (lastText.trim().length > 0) {
7789
+ await deps.store.appendMessage({
7790
+ threadId: delivery.threadId,
7791
+ role: "assistant",
7792
+ content: lastText,
7793
+ agentName: agent,
7794
+ runId: hooks.runId
7795
+ });
7796
+ }
7776
7797
  await deps.store.updateToolCall({
7777
7798
  toolCallId: delivery.toolCallId,
7778
7799
  status: "executed",