@librechat/agents 3.2.68 → 3.3.1
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/cjs/agents/AgentContext.cjs +117 -3
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +4 -0
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +243 -49
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +103 -28
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +4 -0
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +11 -2
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/contextOverflowRecovery.cjs +132 -0
- package/dist/cjs/llm/contextOverflowRecovery.cjs.map +1 -0
- package/dist/cjs/llm/google/index.cjs +1 -1
- package/dist/cjs/llm/invoke.cjs +60 -3
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +1 -1
- package/dist/cjs/main.cjs +21 -7
- package/dist/cjs/messages/format.cjs +136 -4
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +16 -5
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/recency.cjs +2 -0
- package/dist/cjs/messages/recency.cjs.map +1 -1
- package/dist/cjs/prompts/activityLabel.cjs +101 -0
- package/dist/cjs/prompts/activityLabel.cjs.map +1 -0
- package/dist/cjs/run.cjs +177 -3
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/stream.cjs +205 -49
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +55 -7
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +2 -2
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +2 -2
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +69 -8
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +19 -15
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +32 -3
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -1
- package/dist/cjs/utils/errors.cjs +317 -52
- package/dist/cjs/utils/errors.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +118 -4
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +4 -0
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +242 -48
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +103 -28
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +4 -1
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +11 -2
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/contextOverflowRecovery.mjs +130 -0
- package/dist/esm/llm/contextOverflowRecovery.mjs.map +1 -0
- package/dist/esm/llm/google/index.mjs +1 -1
- package/dist/esm/llm/invoke.mjs +59 -4
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +1 -1
- package/dist/esm/main.mjs +10 -10
- package/dist/esm/messages/format.mjs +136 -5
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +14 -6
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/recency.mjs +2 -1
- package/dist/esm/messages/recency.mjs.map +1 -1
- package/dist/esm/prompts/activityLabel.mjs +100 -0
- package/dist/esm/prompts/activityLabel.mjs.map +1 -0
- package/dist/esm/run.mjs +178 -4
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/stream.mjs +205 -49
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +55 -7
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +3 -3
- package/dist/esm/tools/BashExecutor.mjs.map +1 -1
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +3 -3
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +62 -9
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +20 -16
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +32 -3
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -1
- package/dist/esm/utils/errors.mjs +317 -53
- package/dist/esm/utils/errors.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +62 -3
- package/dist/types/common/enum.d.ts +5 -1
- package/dist/types/graphs/Graph.d.ts +16 -2
- package/dist/types/graphs/MultiAgentGraph.d.ts +1 -0
- package/dist/types/langfuseToolOutputTracing.d.ts +4 -0
- package/dist/types/llm/contextOverflowRecovery.d.ts +85 -0
- package/dist/types/llm/invoke.d.ts +35 -6
- package/dist/types/messages/format.d.ts +22 -0
- package/dist/types/messages/prune.d.ts +10 -2
- package/dist/types/messages/recency.d.ts +1 -0
- package/dist/types/prompts/activityLabel.d.ts +31 -0
- package/dist/types/run.d.ts +16 -0
- package/dist/types/tools/CodeExecutor.d.ts +14 -1
- package/dist/types/types/activityLabel.d.ts +53 -0
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/llm.d.ts +7 -4
- package/dist/types/types/stream.d.ts +7 -4
- package/dist/types/types/summarize.d.ts +22 -0
- package/dist/types/utils/__tests__/fixtures/contextOverflowSignatures.d.ts +40 -0
- package/dist/types/utils/errors.d.ts +65 -16
- package/dist/types/utils/redactSecrets.d.ts +3 -0
- package/package.json +7 -8
- package/src/agents/AgentContext.ts +188 -7
- package/src/agents/__tests__/AgentContext.overflow.test.ts +205 -0
- package/src/common/enum.ts +4 -0
- package/src/graphs/Graph.ts +409 -58
- package/src/graphs/MultiAgentGraph.ts +184 -46
- package/src/graphs/__tests__/Graph.contextOverflow.test.ts +631 -0
- package/src/langfuseToolOutputTracing.ts +4 -1
- package/src/llm/__tests__/contextOverflowRecovery.test.ts +401 -0
- package/src/llm/__tests__/fallbackOverflow.test.ts +287 -0
- package/src/llm/bedrock/index.ts +25 -12
- package/src/llm/contextOverflowRecovery.ts +292 -0
- package/src/llm/invoke.ts +119 -4
- package/src/messages/foldToollessToolBlocks.test.ts +438 -0
- package/src/messages/format.ts +233 -5
- package/src/messages/prune.ts +24 -11
- package/src/messages/recency.ts +3 -1
- package/src/prompts/activityLabel.ts +177 -0
- package/src/run.ts +322 -3
- package/src/scripts/context-overflow-probe.ts +997 -0
- package/src/specs/activity-label-prompt.test.ts +128 -0
- package/src/specs/activity-label-trace-seed.test.ts +47 -0
- package/src/specs/agent-handoffs.test.ts +903 -1
- package/src/specs/bedrock-toolless.live.test.ts +123 -0
- package/src/specs/context-overflow-recovery.live.test.ts +213 -0
- package/src/splitStream.test.ts +882 -0
- package/src/stream.ts +315 -51
- package/src/summarization/__tests__/aggregator.test.ts +83 -0
- package/src/summarization/__tests__/node.test.ts +139 -0
- package/src/summarization/node.ts +99 -14
- package/src/tools/BashExecutor.ts +4 -2
- package/src/tools/BashProgrammaticToolCalling.ts +4 -7
- package/src/tools/CodeExecutor.ts +119 -8
- package/src/tools/ProgrammaticToolCalling.ts +29 -27
- package/src/tools/ToolNode.ts +50 -8
- package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +297 -3
- package/src/types/activityLabel.ts +55 -0
- package/src/types/index.ts +1 -0
- package/src/types/llm.ts +8 -1
- package/src/types/stream.ts +7 -4
- package/src/types/summarize.ts +22 -0
- package/src/utils/__tests__/errors.test.ts +270 -0
- package/src/utils/__tests__/fixtures/contextOverflowSignatures.ts +336 -0
- package/src/utils/__tests__/redactSecrets.test.ts +56 -0
- package/src/utils/errors.ts +484 -66
- package/src/utils/redactSecrets.ts +61 -0
package/dist/esm/stream.mjs
CHANGED
|
@@ -781,12 +781,98 @@ hasToolCallChunks: ${hasToolCallChunks}
|
|
|
781
781
|
function createContentAggregator() {
|
|
782
782
|
const contentParts = [];
|
|
783
783
|
const stepMap = /* @__PURE__ */ new Map();
|
|
784
|
-
const
|
|
784
|
+
const toolCallContentIndexMap = /* @__PURE__ */ new Map();
|
|
785
|
+
const sourceContentIndexMap = /* @__PURE__ */ new Map();
|
|
786
|
+
const toolStepContentMap = /* @__PURE__ */ new Map();
|
|
787
|
+
let indexedContentLength = 0;
|
|
788
|
+
/** Physical append cursor; event/chunk indices are correlation keys, not array offsets. */
|
|
789
|
+
let nextContentIndex = 0;
|
|
785
790
|
const contentMetaMap = /* @__PURE__ */ new Map();
|
|
786
791
|
const getFirstContentPart = (content) => {
|
|
787
792
|
if (content == null) return;
|
|
788
793
|
return Array.isArray(content) ? content[0] : content;
|
|
789
794
|
};
|
|
795
|
+
const indexContentPart = (index, contentPart) => {
|
|
796
|
+
if (contentPart == null) return;
|
|
797
|
+
if (contentPart.type === "tool_call") {
|
|
798
|
+
const toolCallId = contentPart.tool_call.id;
|
|
799
|
+
if (toolCallId != null && toolCallId !== "") toolCallContentIndexMap.set(toolCallId, index);
|
|
800
|
+
}
|
|
801
|
+
const hasAgentId = contentPart.agentId != null && contentPart.agentId !== "";
|
|
802
|
+
const hasGroupId = contentPart.groupId != null;
|
|
803
|
+
if (hasAgentId || hasGroupId) {
|
|
804
|
+
const existingMeta = contentMetaMap.get(index) ?? {};
|
|
805
|
+
if (hasAgentId) existingMeta.agentId = contentPart.agentId;
|
|
806
|
+
if (hasGroupId) existingMeta.groupId = contentPart.groupId;
|
|
807
|
+
contentMetaMap.set(index, existingMeta);
|
|
808
|
+
}
|
|
809
|
+
};
|
|
810
|
+
const syncSeededContent = () => {
|
|
811
|
+
/** Hosts can seed pre-pause content after creating the aggregator. */
|
|
812
|
+
for (let index = indexedContentLength; index < contentParts.length; index++) indexContentPart(index, contentParts[index]);
|
|
813
|
+
indexedContentLength = contentParts.length;
|
|
814
|
+
nextContentIndex = Math.max(nextContentIndex, contentParts.length);
|
|
815
|
+
};
|
|
816
|
+
const getToolCallContentIndex = (toolCallId) => {
|
|
817
|
+
if (toolCallId == null || toolCallId === "") return;
|
|
818
|
+
syncSeededContent();
|
|
819
|
+
return toolCallContentIndexMap.get(toolCallId);
|
|
820
|
+
};
|
|
821
|
+
const allocateContentIndex = (minimumIndex = 0) => {
|
|
822
|
+
syncSeededContent();
|
|
823
|
+
const contentIndex = Math.max(nextContentIndex, minimumIndex);
|
|
824
|
+
nextContentIndex = contentIndex + 1;
|
|
825
|
+
return contentIndex;
|
|
826
|
+
};
|
|
827
|
+
const resolveSourceContentIndex = (sourceIndex) => {
|
|
828
|
+
const existingIndex = sourceContentIndexMap.get(sourceIndex);
|
|
829
|
+
if (existingIndex != null) return existingIndex;
|
|
830
|
+
const contentIndex = allocateContentIndex(sourceIndex);
|
|
831
|
+
sourceContentIndexMap.set(sourceIndex, contentIndex);
|
|
832
|
+
return contentIndex;
|
|
833
|
+
};
|
|
834
|
+
const createToolStepContentState = (contentIndex) => ({
|
|
835
|
+
indices: new Set([contentIndex]),
|
|
836
|
+
chunkIndices: /* @__PURE__ */ new Map(),
|
|
837
|
+
unclaimedIndices: new Set([contentIndex]),
|
|
838
|
+
unboundIndices: new Set([contentIndex]),
|
|
839
|
+
callIdsByIndex: /* @__PURE__ */ new Map()
|
|
840
|
+
});
|
|
841
|
+
const registerToolContentIndex = (state, contentIndex, toolCallId) => {
|
|
842
|
+
if (!state.indices.has(contentIndex)) {
|
|
843
|
+
state.indices.add(contentIndex);
|
|
844
|
+
state.unclaimedIndices.add(contentIndex);
|
|
845
|
+
state.unboundIndices.add(contentIndex);
|
|
846
|
+
}
|
|
847
|
+
if (toolCallId != null && toolCallId !== "") {
|
|
848
|
+
const existingToolCallId = state.callIdsByIndex.get(contentIndex);
|
|
849
|
+
if (existingToolCallId != null && existingToolCallId !== toolCallId && toolCallContentIndexMap.get(existingToolCallId) === contentIndex) toolCallContentIndexMap.delete(existingToolCallId);
|
|
850
|
+
toolCallContentIndexMap.set(toolCallId, contentIndex);
|
|
851
|
+
state.callIdsByIndex.set(contentIndex, toolCallId);
|
|
852
|
+
state.unboundIndices.delete(contentIndex);
|
|
853
|
+
}
|
|
854
|
+
};
|
|
855
|
+
const takeFirstIndex = (indices) => {
|
|
856
|
+
const contentIndex = indices.values().next().value;
|
|
857
|
+
if (contentIndex != null) indices.delete(contentIndex);
|
|
858
|
+
return contentIndex;
|
|
859
|
+
};
|
|
860
|
+
const setContentMeta = (index, runStep) => {
|
|
861
|
+
const hasAgentId = runStep.agentId != null && runStep.agentId !== "";
|
|
862
|
+
const hasGroupId = runStep.groupId != null;
|
|
863
|
+
if (!hasAgentId && !hasGroupId) return;
|
|
864
|
+
const existingMeta = contentMetaMap.get(index) ?? {};
|
|
865
|
+
if (hasAgentId) existingMeta.agentId = runStep.agentId;
|
|
866
|
+
if (hasGroupId) existingMeta.groupId = runStep.groupId;
|
|
867
|
+
contentMetaMap.set(index, existingMeta);
|
|
868
|
+
};
|
|
869
|
+
const applyContentMetadata = (index) => {
|
|
870
|
+
const contentPart = contentParts[index];
|
|
871
|
+
if (contentPart == null) return;
|
|
872
|
+
const meta = contentMetaMap.get(index);
|
|
873
|
+
if (meta?.agentId != null) contentPart.agentId = meta.agentId;
|
|
874
|
+
if (meta?.groupId != null) contentPart.groupId = meta.groupId;
|
|
875
|
+
};
|
|
790
876
|
const updateContent = (index, contentPart, finalUpdate = false) => {
|
|
791
877
|
if (!contentPart) {
|
|
792
878
|
console.warn("No content part found in 'updateContent'");
|
|
@@ -836,9 +922,13 @@ function createContentAggregator() {
|
|
|
836
922
|
/** When args are a valid object, they are likely already invoked */
|
|
837
923
|
let args = finalUpdate || typeof existingContent?.tool_call?.args === "object" || typeof toolCallArgs === "object" ? contentPart.tool_call.args : (existingContent?.tool_call?.args ?? "") + (toolCallArgs ?? "");
|
|
838
924
|
if (finalUpdate && args == null && existingContent?.tool_call?.args != null) args = existingContent.tool_call.args;
|
|
925
|
+
const id = getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? "";
|
|
926
|
+
const name = getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ?? "";
|
|
927
|
+
const existingToolCallId = existingContent?.tool_call?.id;
|
|
928
|
+
if (existingToolCallId != null && existingToolCallId !== "" && existingToolCallId !== id && toolCallContentIndexMap.get(existingToolCallId) === index) toolCallContentIndexMap.delete(existingToolCallId);
|
|
839
929
|
const newToolCall = {
|
|
840
|
-
id
|
|
841
|
-
name
|
|
930
|
+
id,
|
|
931
|
+
name,
|
|
842
932
|
args,
|
|
843
933
|
type: "tool_call"
|
|
844
934
|
};
|
|
@@ -856,10 +946,10 @@ function createContentAggregator() {
|
|
|
856
946
|
type: "tool_call",
|
|
857
947
|
tool_call: newToolCall
|
|
858
948
|
};
|
|
949
|
+
indexContentPart(index, contentParts[index]);
|
|
950
|
+
indexedContentLength = Math.max(indexedContentLength, index + 1);
|
|
859
951
|
}
|
|
860
|
-
|
|
861
|
-
if (meta?.agentId != null) contentParts[index].agentId = meta.agentId;
|
|
862
|
-
if (meta?.groupId != null) contentParts[index].groupId = meta.groupId;
|
|
952
|
+
applyContentMetadata(index);
|
|
863
953
|
};
|
|
864
954
|
const aggregateContent = ({ event, data }) => {
|
|
865
955
|
if (event === "on_summarize_delta") {
|
|
@@ -878,33 +968,52 @@ function createContentAggregator() {
|
|
|
878
968
|
const runStep = stepMap.get(summary.boundary.messageId);
|
|
879
969
|
if (!runStep) return;
|
|
880
970
|
contentParts[runStep.index] = summary;
|
|
971
|
+
applyContentMetadata(runStep.index);
|
|
881
972
|
return;
|
|
882
973
|
}
|
|
883
974
|
if (event === "on_run_step") {
|
|
884
|
-
const
|
|
975
|
+
const incomingRunStep = data;
|
|
976
|
+
const toolCalls = incomingRunStep.stepDetails.type === "tool_calls" ? incomingRunStep.stepDetails.tool_calls : void 0;
|
|
977
|
+
syncSeededContent();
|
|
978
|
+
let runStepIndex;
|
|
979
|
+
const toolCallIndices = [];
|
|
980
|
+
if (toolCalls && toolCalls.length > 0) {
|
|
981
|
+
for (let index = 0; index < toolCalls.length; index++) {
|
|
982
|
+
const toolCallId = toolCalls[index].id;
|
|
983
|
+
let contentIndex = getToolCallContentIndex(toolCallId);
|
|
984
|
+
if (contentIndex == null) contentIndex = index === 0 ? resolveSourceContentIndex(incomingRunStep.index) : allocateContentIndex();
|
|
985
|
+
else if (index === 0) sourceContentIndexMap.set(incomingRunStep.index, contentIndex);
|
|
986
|
+
toolCallIndices.push(contentIndex);
|
|
987
|
+
}
|
|
988
|
+
runStepIndex = toolCallIndices[0];
|
|
989
|
+
} else runStepIndex = resolveSourceContentIndex(incomingRunStep.index);
|
|
990
|
+
const runStep = runStepIndex !== incomingRunStep.index ? {
|
|
991
|
+
...incomingRunStep,
|
|
992
|
+
index: runStepIndex
|
|
993
|
+
} : incomingRunStep;
|
|
885
994
|
stepMap.set(runStep.id, runStep);
|
|
886
|
-
|
|
887
|
-
const hasGroupId = runStep.groupId != null;
|
|
888
|
-
if (hasAgentId || hasGroupId) {
|
|
889
|
-
const existingMeta = contentMetaMap.get(runStep.index) ?? {};
|
|
890
|
-
if (hasAgentId) existingMeta.agentId = runStep.agentId;
|
|
891
|
-
if (hasGroupId) existingMeta.groupId = runStep.groupId;
|
|
892
|
-
contentMetaMap.set(runStep.index, existingMeta);
|
|
893
|
-
}
|
|
995
|
+
setContentMeta(runStep.index, runStep);
|
|
894
996
|
if (runStep.summary != null) updateContent(runStep.index, runStep.summary);
|
|
895
|
-
if (runStep.stepDetails.type === "tool_calls"
|
|
896
|
-
const
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
997
|
+
if (runStep.stepDetails.type === "tool_calls") {
|
|
998
|
+
const toolStepContent = toolStepContentMap.get(runStep.id) ?? createToolStepContentState(runStep.index);
|
|
999
|
+
registerToolContentIndex(toolStepContent, runStep.index);
|
|
1000
|
+
runStep.stepDetails.tool_calls?.forEach((toolCall, toolCallIndex) => {
|
|
1001
|
+
const contentIndex = toolCallIndices[toolCallIndex] ?? runStep.index;
|
|
1002
|
+
const toolCallId = toolCall.id ?? "";
|
|
1003
|
+
registerToolContentIndex(toolStepContent, contentIndex, toolCallId);
|
|
1004
|
+
const contentPart = {
|
|
1005
|
+
type: "tool_call",
|
|
1006
|
+
tool_call: {
|
|
1007
|
+
args: toolCall.args,
|
|
1008
|
+
name: toolCall.name,
|
|
1009
|
+
id: toolCallId
|
|
1010
|
+
}
|
|
1011
|
+
};
|
|
1012
|
+
setContentMeta(contentIndex, runStep);
|
|
1013
|
+
updateContent(contentIndex, contentPart);
|
|
1014
|
+
});
|
|
1015
|
+
toolStepContentMap.set(runStep.id, toolStepContent);
|
|
1016
|
+
}
|
|
908
1017
|
} else if (event === "on_message_delta") {
|
|
909
1018
|
const messageDelta = data;
|
|
910
1019
|
const runStep = stepMap.get(messageDelta.id);
|
|
@@ -917,7 +1026,14 @@ function createContentAggregator() {
|
|
|
917
1026
|
} else if (event === "on_agent_update" && data?.agent_update) {
|
|
918
1027
|
const contentPart = data;
|
|
919
1028
|
if (!contentPart) return;
|
|
920
|
-
|
|
1029
|
+
const contentIndex = resolveSourceContentIndex(contentPart.agent_update.index);
|
|
1030
|
+
updateContent(contentIndex, {
|
|
1031
|
+
...contentPart,
|
|
1032
|
+
agent_update: {
|
|
1033
|
+
...contentPart.agent_update,
|
|
1034
|
+
index: contentIndex
|
|
1035
|
+
}
|
|
1036
|
+
});
|
|
921
1037
|
} else if (event === "on_reasoning_delta") {
|
|
922
1038
|
const reasoningDelta = data;
|
|
923
1039
|
const runStep = stepMap.get(reasoningDelta.id);
|
|
@@ -934,35 +1050,75 @@ function createContentAggregator() {
|
|
|
934
1050
|
console.warn("No run step or runId found for run step delta event");
|
|
935
1051
|
return;
|
|
936
1052
|
}
|
|
937
|
-
if (runStepDelta.delta.type === "tool_calls" && runStepDelta.delta.tool_calls)
|
|
938
|
-
const
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
1053
|
+
if (runStepDelta.delta.type === "tool_calls" && runStepDelta.delta.tool_calls) {
|
|
1054
|
+
const toolStepContent = toolStepContentMap.get(runStepDelta.id) ?? createToolStepContentState(runStep.index);
|
|
1055
|
+
runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {
|
|
1056
|
+
const chunkIndex = typeof toolCallDelta.index === "number" ? toolCallDelta.index : void 0;
|
|
1057
|
+
const explicitToolCallId = toolCallDelta.id != null && toolCallDelta.id !== "" ? toolCallDelta.id : void 0;
|
|
1058
|
+
let contentIndex = getToolCallContentIndex(explicitToolCallId);
|
|
1059
|
+
if (contentIndex == null && chunkIndex != null) contentIndex = toolStepContent.chunkIndices.get(chunkIndex);
|
|
1060
|
+
const soleContentIndex = toolStepContent.indices.size === 1 ? toolStepContent.indices.values().next().value : void 0;
|
|
1061
|
+
if (contentIndex == null && explicitToolCallId == null && soleContentIndex != null && (chunkIndex == null || toolStepContent.callIdsByIndex.has(soleContentIndex) || toolStepContent.unclaimedIndices.has(soleContentIndex))) contentIndex = soleContentIndex;
|
|
1062
|
+
if (contentIndex == null) {
|
|
1063
|
+
if (chunkIndex == null && explicitToolCallId == null) {
|
|
1064
|
+
console.warn("No tool call id or chunk index found for run step delta event");
|
|
1065
|
+
return;
|
|
1066
|
+
}
|
|
1067
|
+
contentIndex = explicitToolCallId == null ? takeFirstIndex(toolStepContent.unclaimedIndices) : takeFirstIndex(toolStepContent.unboundIndices);
|
|
1068
|
+
contentIndex ??= allocateContentIndex();
|
|
947
1069
|
}
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
1070
|
+
registerToolContentIndex(toolStepContent, contentIndex, explicitToolCallId);
|
|
1071
|
+
if (chunkIndex != null) {
|
|
1072
|
+
toolStepContent.chunkIndices.set(chunkIndex, contentIndex);
|
|
1073
|
+
toolStepContent.unclaimedIndices.delete(contentIndex);
|
|
1074
|
+
toolStepContent.unboundIndices.delete(contentIndex);
|
|
1075
|
+
}
|
|
1076
|
+
const toolCallId = explicitToolCallId ?? toolStepContent.callIdsByIndex.get(contentIndex);
|
|
1077
|
+
const contentPart = {
|
|
1078
|
+
type: "tool_call",
|
|
1079
|
+
tool_call: {
|
|
1080
|
+
args: toolCallDelta.args ?? "",
|
|
1081
|
+
name: toolCallDelta.name,
|
|
1082
|
+
id: toolCallId,
|
|
1083
|
+
auth: runStepDelta.delta.auth,
|
|
1084
|
+
expires_at: runStepDelta.delta.expires_at
|
|
1085
|
+
}
|
|
1086
|
+
};
|
|
1087
|
+
setContentMeta(contentIndex, runStep);
|
|
1088
|
+
updateContent(contentIndex, contentPart);
|
|
1089
|
+
});
|
|
1090
|
+
toolStepContentMap.set(runStepDelta.id, toolStepContent);
|
|
1091
|
+
}
|
|
951
1092
|
} else if (event === "on_run_step_completed") {
|
|
952
1093
|
const { result } = data;
|
|
953
1094
|
const { id: stepId } = result;
|
|
954
1095
|
const runStep = stepMap.get(stepId);
|
|
955
|
-
if (
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
1096
|
+
if (result.type === "summary" && "summary" in result) {
|
|
1097
|
+
if (!runStep) {
|
|
1098
|
+
console.warn("No run step or runId found for completed step event");
|
|
1099
|
+
return;
|
|
1100
|
+
}
|
|
1101
|
+
contentParts[runStep.index] = result.summary;
|
|
1102
|
+
applyContentMetadata(runStep.index);
|
|
1103
|
+
} else if ("tool_call" in result) {
|
|
1104
|
+
let contentIndex = getToolCallContentIndex(result.tool_call.id);
|
|
1105
|
+
if (contentIndex == null && runStep != null) {
|
|
1106
|
+
const toolStepContent = toolStepContentMap.get(runStep.id);
|
|
1107
|
+
if (toolStepContent?.indices.size === 1) contentIndex = toolStepContent.indices.values().next().value;
|
|
1108
|
+
else if (toolStepContent == null) {
|
|
1109
|
+
if (((runStep.stepDetails.type === "tool_calls" ? runStep.stepDetails.tool_calls : void 0)?.length ?? 0) <= 1) contentIndex = runStep.index;
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
if (contentIndex == null) {
|
|
1113
|
+
console.warn("No run step or tool call found for completed step event");
|
|
1114
|
+
return;
|
|
1115
|
+
}
|
|
1116
|
+
if (runStep != null) setContentMeta(contentIndex, runStep);
|
|
961
1117
|
const contentPart = {
|
|
962
1118
|
type: "tool_call",
|
|
963
1119
|
tool_call: result.tool_call
|
|
964
1120
|
};
|
|
965
|
-
updateContent(
|
|
1121
|
+
updateContent(contentIndex, contentPart, true);
|
|
966
1122
|
}
|
|
967
1123
|
}
|
|
968
1124
|
};
|