@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.cjs CHANGED
@@ -5966,7 +5966,7 @@ function traceToolExecution(runId, call, run) {
5966
5966
  }
5967
5967
  __name(traceToolExecution, "traceToolExecution");
5968
5968
  function toModelMessages(messages) {
5969
- return messages.map((message) => ({
5969
+ return withoutBlankAssistantMessages(messages.map((message) => ({
5970
5970
  role: message.role,
5971
5971
  content: message.content,
5972
5972
  ...message.toolCalls !== void 0 ? {
@@ -5978,9 +5978,17 @@ function toModelMessages(messages) {
5978
5978
  ...message.attachments !== void 0 ? {
5979
5979
  attachments: message.attachments
5980
5980
  } : {}
5981
- }));
5981
+ })));
5982
5982
  }
5983
5983
  __name(toModelMessages, "toModelMessages");
5984
+ function isBlankAssistantMessage(message) {
5985
+ return message.role === "assistant" && message.content.trim().length === 0 && (message.toolCalls?.length ?? 0) === 0 && (message.toolResults?.length ?? 0) === 0;
5986
+ }
5987
+ __name(isBlankAssistantMessage, "isBlankAssistantMessage");
5988
+ function withoutBlankAssistantMessages(messages) {
5989
+ return messages.some(isBlankAssistantMessage) ? messages.filter((message) => !isBlankAssistantMessage(message)) : messages;
5990
+ }
5991
+ __name(withoutBlankAssistantMessages, "withoutBlankAssistantMessages");
5984
5992
  function historyContext(input) {
5985
5993
  return {
5986
5994
  threadId: input.threadId,
@@ -6012,7 +6020,7 @@ async function loadSelectedHistory(deps, input, hooks) {
6012
6020
  });
6013
6021
  return {
6014
6022
  ...recorded,
6015
- messages: settleDanglingToolCalls(recorded.messages)
6023
+ messages: settleDanglingToolCalls(withoutBlankAssistantMessages(recorded.messages))
6016
6024
  };
6017
6025
  }
6018
6026
  __name(loadSelectedHistory, "loadSelectedHistory");
@@ -7780,13 +7788,18 @@ ${block}`;
7780
7788
  runId: hooks.runId,
7781
7789
  step: i,
7782
7790
  count
7783
- }, () => generateFollowUps(deps.model, [
7784
- ...modelMessages,
7785
- {
7786
- role: "assistant",
7787
- content: turn.text
7788
- }
7789
- ], count), (result2) => ({
7791
+ }, () => generateFollowUps(
7792
+ deps.model,
7793
+ // A blank answer is left off: an empty assistant message gets the call refused.
7794
+ turn.text.trim().length > 0 ? [
7795
+ ...modelMessages,
7796
+ {
7797
+ role: "assistant",
7798
+ content: turn.text
7799
+ }
7800
+ ] : modelMessages,
7801
+ count
7802
+ ), (result2) => ({
7790
7803
  followUps: result2.followUps.length,
7791
7804
  inputTokens: result2.usage.inputTokens,
7792
7805
  outputTokens: result2.usage.outputTokens,
@@ -7854,7 +7867,8 @@ ${block}`;
7854
7867
  ...synthetic.map((entry) => entry.call)
7855
7868
  ];
7856
7869
  const syntheticResults = synthetic.map((entry) => entry.result);
7857
- const assistant = await hooks.step(`persist:assistant:${i}`, () => deps.store.appendMessage({
7870
+ 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;
7871
+ const assistant = await hooks.step(`persist:assistant:${i}`, () => blankStep ? Promise.resolve(null) : deps.store.appendMessage({
7858
7872
  threadId: input.threadId,
7859
7873
  role: "assistant",
7860
7874
  content: turn.text,
@@ -7900,6 +7914,23 @@ ${block}`;
7900
7914
  toolResults: syntheticResults
7901
7915
  } : {}
7902
7916
  };
7917
+ const finishFinalStep = /* @__PURE__ */ __name(() => hooks.step(`stream:step-finish:${i}`, async () => {
7918
+ await writer.write(encodeStreamEvent({
7919
+ kind: "step-finish",
7920
+ usage: turn.usage,
7921
+ costUsd,
7922
+ ...turn.reasoningMs !== void 0 ? {
7923
+ reasoningMs: turn.reasoningMs
7924
+ } : {},
7925
+ ...stepModel !== void 0 ? {
7926
+ model: stepModel
7927
+ } : {}
7928
+ }));
7929
+ }), "finishFinalStep");
7930
+ if (assistant === null) {
7931
+ await finishFinalStep();
7932
+ break;
7933
+ }
7903
7934
  modelMessages.push(assistantMessage);
7904
7935
  for (const entry of synthetic) {
7905
7936
  const { call, result: result2 } = entry;
@@ -7933,19 +7964,7 @@ ${block}`;
7933
7964
  });
7934
7965
  }
7935
7966
  if (isFinalTurn) {
7936
- await hooks.step(`stream:step-finish:${i}`, async () => {
7937
- await writer.write(encodeStreamEvent({
7938
- kind: "step-finish",
7939
- usage: turn.usage,
7940
- costUsd,
7941
- ...turn.reasoningMs !== void 0 ? {
7942
- reasoningMs: turn.reasoningMs
7943
- } : {},
7944
- ...stepModel !== void 0 ? {
7945
- model: stepModel
7946
- } : {}
7947
- }));
7948
- });
7967
+ await finishFinalStep();
7949
7968
  break;
7950
7969
  }
7951
7970
  await haltIfCancelled(hooks, cancellable, `cancel:tools:${i}`);
@@ -8056,13 +8075,15 @@ ${toolText}`;
8056
8075
  return;
8057
8076
  }
8058
8077
  const agent = input.agentName ?? "default";
8059
- await deps.store.appendMessage({
8060
- threadId: delivery.threadId,
8061
- role: "assistant",
8062
- content: lastText,
8063
- agentName: agent,
8064
- runId: hooks.runId
8065
- });
8078
+ if (lastText.trim().length > 0) {
8079
+ await deps.store.appendMessage({
8080
+ threadId: delivery.threadId,
8081
+ role: "assistant",
8082
+ content: lastText,
8083
+ agentName: agent,
8084
+ runId: hooks.runId
8085
+ });
8086
+ }
8066
8087
  await deps.store.updateToolCall({
8067
8088
  toolCallId: delivery.toolCallId,
8068
8089
  status: "executed",