@librechat/agents 3.1.74 → 3.1.75-dev.0

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 (137) hide show
  1. package/README.md +66 -0
  2. package/dist/cjs/agents/AgentContext.cjs +84 -37
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/graphs/Graph.cjs +13 -3
  5. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  6. package/dist/cjs/llm/anthropic/index.cjs +145 -52
  7. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  8. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  9. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +25 -15
  10. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  11. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +84 -70
  12. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  13. package/dist/cjs/llm/bedrock/index.cjs +1 -1
  14. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  15. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +213 -3
  16. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  17. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +2 -1
  18. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  19. package/dist/cjs/llm/google/utils/common.cjs +5 -4
  20. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  21. package/dist/cjs/llm/openai/index.cjs +468 -647
  22. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  23. package/dist/cjs/llm/openai/utils/index.cjs +1 -448
  24. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  25. package/dist/cjs/llm/openrouter/index.cjs +57 -175
  26. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  27. package/dist/cjs/llm/vertexai/index.cjs +5 -3
  28. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  29. package/dist/cjs/messages/cache.cjs +39 -4
  30. package/dist/cjs/messages/cache.cjs.map +1 -1
  31. package/dist/cjs/messages/core.cjs +7 -6
  32. package/dist/cjs/messages/core.cjs.map +1 -1
  33. package/dist/cjs/messages/format.cjs +7 -6
  34. package/dist/cjs/messages/format.cjs.map +1 -1
  35. package/dist/cjs/messages/langchain.cjs +26 -0
  36. package/dist/cjs/messages/langchain.cjs.map +1 -0
  37. package/dist/cjs/messages/prune.cjs +7 -6
  38. package/dist/cjs/messages/prune.cjs.map +1 -1
  39. package/dist/cjs/tools/ToolNode.cjs +5 -1
  40. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  41. package/dist/esm/agents/AgentContext.mjs +85 -38
  42. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  43. package/dist/esm/graphs/Graph.mjs +13 -3
  44. package/dist/esm/graphs/Graph.mjs.map +1 -1
  45. package/dist/esm/llm/anthropic/index.mjs +146 -54
  46. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  47. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  48. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +25 -15
  49. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  50. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +84 -71
  51. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  52. package/dist/esm/llm/bedrock/index.mjs +1 -1
  53. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  54. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +214 -4
  55. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  56. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +2 -1
  57. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  58. package/dist/esm/llm/google/utils/common.mjs +5 -4
  59. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  60. package/dist/esm/llm/openai/index.mjs +469 -648
  61. package/dist/esm/llm/openai/index.mjs.map +1 -1
  62. package/dist/esm/llm/openai/utils/index.mjs +4 -449
  63. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  64. package/dist/esm/llm/openrouter/index.mjs +57 -175
  65. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  66. package/dist/esm/llm/vertexai/index.mjs +5 -3
  67. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  68. package/dist/esm/messages/cache.mjs +39 -4
  69. package/dist/esm/messages/cache.mjs.map +1 -1
  70. package/dist/esm/messages/core.mjs +7 -6
  71. package/dist/esm/messages/core.mjs.map +1 -1
  72. package/dist/esm/messages/format.mjs +7 -6
  73. package/dist/esm/messages/format.mjs.map +1 -1
  74. package/dist/esm/messages/langchain.mjs +23 -0
  75. package/dist/esm/messages/langchain.mjs.map +1 -0
  76. package/dist/esm/messages/prune.mjs +7 -6
  77. package/dist/esm/messages/prune.mjs.map +1 -1
  78. package/dist/esm/tools/ToolNode.mjs +5 -1
  79. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  80. package/dist/types/agents/AgentContext.d.ts +14 -4
  81. package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +46 -0
  82. package/dist/types/llm/anthropic/index.d.ts +22 -9
  83. package/dist/types/llm/anthropic/types.d.ts +5 -1
  84. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +13 -6
  85. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +1 -1
  86. package/dist/types/llm/openai/index.d.ts +21 -24
  87. package/dist/types/llm/openrouter/index.d.ts +11 -9
  88. package/dist/types/llm/vertexai/index.d.ts +1 -0
  89. package/dist/types/messages/cache.d.ts +4 -1
  90. package/dist/types/messages/langchain.d.ts +27 -0
  91. package/dist/types/types/graph.d.ts +26 -38
  92. package/dist/types/types/llm.d.ts +3 -3
  93. package/dist/types/types/run.d.ts +2 -0
  94. package/dist/types/types/stream.d.ts +1 -1
  95. package/package.json +17 -16
  96. package/src/agents/AgentContext.ts +123 -44
  97. package/src/agents/__tests__/AgentContext.anthropic.live.test.ts +116 -0
  98. package/src/agents/__tests__/AgentContext.bedrock.live.test.ts +149 -0
  99. package/src/agents/__tests__/AgentContext.test.ts +155 -2
  100. package/src/agents/__tests__/promptCacheLiveHelpers.ts +165 -0
  101. package/src/graphs/Graph.ts +24 -4
  102. package/src/graphs/__tests__/composition.smoke.test.ts +188 -0
  103. package/src/llm/anthropic/index.ts +252 -84
  104. package/src/llm/anthropic/llm.spec.ts +751 -102
  105. package/src/llm/anthropic/types.ts +9 -1
  106. package/src/llm/anthropic/utils/message_inputs.ts +43 -20
  107. package/src/llm/anthropic/utils/message_outputs.ts +119 -101
  108. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +77 -0
  109. package/src/llm/bedrock/index.ts +2 -2
  110. package/src/llm/bedrock/llm.spec.ts +341 -0
  111. package/src/llm/bedrock/utils/message_inputs.ts +303 -4
  112. package/src/llm/bedrock/utils/message_outputs.ts +2 -1
  113. package/src/llm/custom-chat-models.smoke.test.ts +662 -0
  114. package/src/llm/google/llm.spec.ts +339 -57
  115. package/src/llm/google/utils/common.ts +53 -48
  116. package/src/llm/openai/contentBlocks.test.ts +346 -0
  117. package/src/llm/openai/index.ts +736 -837
  118. package/src/llm/openai/utils/index.ts +84 -64
  119. package/src/llm/openrouter/index.ts +124 -247
  120. package/src/llm/openrouter/reasoning.test.ts +8 -1
  121. package/src/llm/vertexai/index.ts +11 -5
  122. package/src/llm/vertexai/llm.spec.ts +28 -1
  123. package/src/messages/cache.test.ts +106 -4
  124. package/src/messages/cache.ts +57 -5
  125. package/src/messages/core.ts +16 -9
  126. package/src/messages/format.ts +9 -6
  127. package/src/messages/langchain.ts +39 -0
  128. package/src/messages/prune.ts +12 -8
  129. package/src/scripts/caching.ts +2 -3
  130. package/src/specs/anthropic.simple.test.ts +61 -0
  131. package/src/specs/summarization.test.ts +58 -61
  132. package/src/tools/ToolNode.ts +5 -1
  133. package/src/types/graph.ts +35 -88
  134. package/src/types/llm.ts +3 -3
  135. package/src/types/run.ts +2 -0
  136. package/src/types/stream.ts +1 -1
  137. package/src/utils/llmConfig.ts +1 -6
@@ -16,7 +16,7 @@ import {
16
16
  isAIMessage,
17
17
  type UsageMetadata,
18
18
  type BaseMessageFields,
19
- type MessageContent,
19
+ type MessageContentComplex,
20
20
  type InvalidToolCall,
21
21
  type MessageContentImageUrl,
22
22
  StandardContentBlockConverter,
@@ -37,6 +37,7 @@ import type {
37
37
  OpenAIChatInput,
38
38
  ChatOpenAIReasoningSummary,
39
39
  } from '@langchain/openai';
40
+ import { toLangChainContent } from '@/messages/langchain';
40
41
 
41
42
  export type { OpenAICallOptions, OpenAIChatInput };
42
43
 
@@ -521,6 +522,9 @@ export function _convertMessagesToOpenAIResponsesParams(
521
522
  type?: string;
522
523
  refusal?: string;
523
524
  };
525
+ const responseMetadata = lcMsg.response_metadata as {
526
+ output?: ResponsesInputItem[];
527
+ };
524
528
 
525
529
  let role = messageToOpenAIRole(lcMsg);
526
530
  if (role === 'system' && isReasoningModel(model)) role = 'developer';
@@ -589,12 +593,12 @@ export function _convertMessagesToOpenAIResponsesParams(
589
593
  // if we have the original response items, just reuse them
590
594
  if (
591
595
  !zdrEnabled &&
592
- lcMsg.response_metadata.output != null &&
593
- Array.isArray(lcMsg.response_metadata.output) &&
594
- lcMsg.response_metadata.output.length > 0 &&
595
- lcMsg.response_metadata.output.every((item) => 'type' in item)
596
+ responseMetadata.output != null &&
597
+ Array.isArray(responseMetadata.output) &&
598
+ responseMetadata.output.length > 0 &&
599
+ responseMetadata.output.every((item) => 'type' in item)
596
600
  ) {
597
- return lcMsg.response_metadata.output;
601
+ return responseMetadata.output;
598
602
  }
599
603
 
600
604
  // otherwise, try to reconstruct the response from what we have
@@ -610,7 +614,13 @@ export function _convertMessagesToOpenAIResponsesParams(
610
614
  }
611
615
 
612
616
  // ai content
613
- let { content } = lcMsg;
617
+ let content = lcMsg.content as
618
+ | string
619
+ | Array<
620
+ | MessageContentComplex
621
+ | OpenAIClient.Responses.ResponseOutputText
622
+ | OpenAIClient.Responses.ResponseOutputRefusal
623
+ >;
614
624
  if (additional_kwargs.refusal) {
615
625
  if (typeof content === 'string') {
616
626
  content = [{ type: 'output_text', text: content, annotations: [] }];
@@ -632,11 +642,13 @@ export function _convertMessagesToOpenAIResponsesParams(
632
642
  ? content
633
643
  : content.flatMap((item) => {
634
644
  if (item.type === 'text') {
645
+ const textItem = item as MessageContentComplex & {
646
+ annotations?: unknown[];
647
+ };
635
648
  return {
636
649
  type: 'output_text',
637
650
  text: item.text,
638
- // @ts-expect-error TODO: add types for `annotations`
639
- annotations: item.annotations ?? [],
651
+ annotations: textItem.annotations ?? [],
640
652
  };
641
653
  }
642
654
 
@@ -646,7 +658,7 @@ export function _convertMessagesToOpenAIResponsesParams(
646
658
 
647
659
  return [];
648
660
  }),
649
- });
661
+ } as ResponsesInputItem);
650
662
 
651
663
  const functionCallIds = additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY];
652
664
 
@@ -677,12 +689,9 @@ export function _convertMessagesToOpenAIResponsesParams(
677
689
  }
678
690
 
679
691
  const toolOutputs =
680
- ((
681
- lcMsg.response_metadata.output as
682
- | Array<ResponsesInputItem>
683
- | undefined
684
- )?.length ?? 0) > 0
685
- ? lcMsg.response_metadata.output
692
+ ((responseMetadata.output as Array<ResponsesInputItem> | undefined)
693
+ ?.length ?? 0) > 0
694
+ ? responseMetadata.output
686
695
  : additional_kwargs.tool_outputs;
687
696
 
688
697
  const fallthroughCallTypes: ResponsesInputItem['type'][] = [
@@ -712,52 +721,63 @@ export function _convertMessagesToOpenAIResponsesParams(
712
721
  }
713
722
 
714
723
  const messages: ResponsesInputItem[] = [];
715
- const content = lcMsg.content.flatMap((item) => {
716
- if (item.type === 'mcp_approval_response') {
717
- messages.push({
718
- // @ts-ignore
719
- type: 'mcp_approval_response',
720
- approval_request_id: item.approval_request_id,
721
- approve: item.approve,
722
- });
723
- }
724
- if (isDataContentBlock(item)) {
725
- return convertToProviderContentBlock(
726
- item,
727
- completionsApiContentBlockConverter
728
- );
729
- }
730
- if (item.type === 'text') {
731
- return {
732
- type: 'input_text',
733
- text: item.text,
734
- };
735
- }
736
- if (item.type === 'image_url') {
737
- return {
738
- type: 'input_image',
739
- image_url:
740
- typeof item.image_url === 'string'
741
- ? item.image_url
742
- : item.image_url.url,
743
- detail:
744
- typeof item.image_url === 'string'
745
- ? 'auto'
746
- : item.image_url.detail,
747
- };
748
- }
749
- if (
750
- item.type === 'input_text' ||
751
- item.type === 'input_image' ||
752
- item.type === 'input_file'
753
- ) {
754
- return item;
724
+ const content = (lcMsg.content as MessageContentComplex[]).flatMap(
725
+ (item) => {
726
+ if (item.type === 'mcp_approval_response') {
727
+ const approvalResponse = item as MessageContentComplex & {
728
+ approval_request_id: string;
729
+ approve: boolean;
730
+ };
731
+ messages.push({
732
+ // @ts-ignore
733
+ type: 'mcp_approval_response',
734
+ approval_request_id: approvalResponse.approval_request_id,
735
+ approve: approvalResponse.approve,
736
+ });
737
+ }
738
+ if (isDataContentBlock(item)) {
739
+ return convertToProviderContentBlock(
740
+ item,
741
+ completionsApiContentBlockConverter
742
+ );
743
+ }
744
+ if (item.type === 'text') {
745
+ return {
746
+ type: 'input_text',
747
+ text: item.text,
748
+ };
749
+ }
750
+ if (item.type === 'image_url') {
751
+ const imageItem = item as MessageContentImageUrl;
752
+ return {
753
+ type: 'input_image',
754
+ image_url:
755
+ typeof imageItem.image_url === 'string'
756
+ ? imageItem.image_url
757
+ : imageItem.image_url.url,
758
+ detail:
759
+ typeof imageItem.image_url === 'string'
760
+ ? 'auto'
761
+ : imageItem.image_url.detail,
762
+ };
763
+ }
764
+ if (
765
+ item.type === 'input_text' ||
766
+ item.type === 'input_image' ||
767
+ item.type === 'input_file'
768
+ ) {
769
+ return item;
770
+ }
771
+ return [];
755
772
  }
756
- return [];
757
- });
773
+ );
758
774
 
759
775
  if (content.length > 0) {
760
- messages.push({ type: 'message', role, content });
776
+ messages.push({
777
+ type: 'message',
778
+ role,
779
+ content,
780
+ } as ResponsesInputItem);
761
781
  }
762
782
  return messages;
763
783
  }
@@ -785,7 +805,7 @@ function _convertOpenAIResponsesMessageToBaseMessage(
785
805
  }
786
806
 
787
807
  let messageId: string | undefined;
788
- const content: MessageContent = [];
808
+ const content: MessageContentComplex[] = [];
789
809
  const tool_calls: ToolCall[] = [];
790
810
  const invalid_tool_calls: InvalidToolCall[] = [];
791
811
  const response_metadata: Record<string, unknown> = {
@@ -871,7 +891,7 @@ function _convertOpenAIResponsesMessageToBaseMessage(
871
891
 
872
892
  return new AIMessage({
873
893
  id: messageId,
874
- content,
894
+ content: toLangChainContent(content),
875
895
  tool_calls,
876
896
  invalid_tool_calls,
877
897
  usage_metadata: response.usage,
@@ -883,7 +903,7 @@ function _convertOpenAIResponsesMessageToBaseMessage(
883
903
  export function _convertOpenAIResponsesDeltaToBaseMessageChunk(
884
904
  chunk: ResponseReturnStreamEvents
885
905
  ) {
886
- const content: Record<string, unknown>[] = [];
906
+ const content: MessageContentComplex[] = [];
887
907
  let generationInfo: Record<string, unknown> = {};
888
908
  let usage_metadata: UsageMetadata | undefined;
889
909
  const tool_call_chunks: ToolCallChunk[] = [];
@@ -1021,10 +1041,10 @@ export function _convertOpenAIResponsesDeltaToBaseMessageChunk(
1021
1041
 
1022
1042
  return new ChatGenerationChunk({
1023
1043
  // Legacy reasons, `onLLMNewToken` should pulls this out
1024
- text: content.map((part) => part.text).join(''),
1044
+ text: content.map((part) => ('text' in part ? part.text : '')).join(''),
1025
1045
  message: new AIMessageChunk({
1026
1046
  id,
1027
- content,
1047
+ content: toLangChainContent(content),
1028
1048
  tool_call_chunks,
1029
1049
  usage_metadata,
1030
1050
  additional_kwargs,