@librechat/agents 4.0.1 → 4.0.3

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 (245) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +3 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/decisions/deadline.cjs +52 -0
  4. package/dist/cjs/decisions/deadline.cjs.map +1 -0
  5. package/dist/cjs/decisions/dialect.cjs +88 -0
  6. package/dist/cjs/decisions/dialect.cjs.map +1 -0
  7. package/dist/cjs/decisions/http.cjs +77 -0
  8. package/dist/cjs/decisions/http.cjs.map +1 -0
  9. package/dist/cjs/decisions/index.cjs +7 -0
  10. package/dist/cjs/decisions/presets.cjs +82 -0
  11. package/dist/cjs/decisions/presets.cjs.map +1 -0
  12. package/dist/cjs/decisions/questions.cjs +70 -0
  13. package/dist/cjs/decisions/questions.cjs.map +1 -0
  14. package/dist/cjs/decisions/structuredChat.cjs +172 -0
  15. package/dist/cjs/decisions/structuredChat.cjs.map +1 -0
  16. package/dist/cjs/decisions/structuredOutput.cjs +18 -0
  17. package/dist/cjs/decisions/structuredOutput.cjs.map +1 -0
  18. package/dist/cjs/decisions/traceMarker.cjs +6 -0
  19. package/dist/cjs/decisions/traceMarker.cjs.map +1 -0
  20. package/dist/cjs/decisions/transport.cjs +166 -0
  21. package/dist/cjs/decisions/transport.cjs.map +1 -0
  22. package/dist/cjs/decisions/types.cjs +44 -0
  23. package/dist/cjs/decisions/types.cjs.map +1 -0
  24. package/dist/cjs/graphs/Graph.cjs +28 -9
  25. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  26. package/dist/cjs/langfuseToolOutputTracing.cjs +6 -1
  27. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  28. package/dist/cjs/llm/google/index.cjs +1 -1
  29. package/dist/cjs/llm/invoke.cjs +34 -12
  30. package/dist/cjs/llm/invoke.cjs.map +1 -1
  31. package/dist/cjs/llm/openai/index.cjs +7 -0
  32. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  33. package/dist/cjs/llm/providerTextBoundary.cjs +355 -0
  34. package/dist/cjs/llm/providerTextBoundary.cjs.map +1 -0
  35. package/dist/cjs/llm/providerTextChunk.cjs +14 -0
  36. package/dist/cjs/llm/providerTextChunk.cjs.map +1 -0
  37. package/dist/cjs/llm/providerTextControls.cjs +236 -0
  38. package/dist/cjs/llm/providerTextControls.cjs.map +1 -0
  39. package/dist/cjs/llm/stream/smoother.cjs +2 -1
  40. package/dist/cjs/llm/stream/smoother.cjs.map +1 -1
  41. package/dist/cjs/main.cjs +49 -1
  42. package/dist/cjs/protection/providerText.cjs +224 -0
  43. package/dist/cjs/protection/providerText.cjs.map +1 -0
  44. package/dist/cjs/protection/providerTextInput.cjs +25 -0
  45. package/dist/cjs/protection/providerTextInput.cjs.map +1 -0
  46. package/dist/cjs/rerank/index.cjs +2 -0
  47. package/dist/cjs/rerank/search.cjs +45 -0
  48. package/dist/cjs/rerank/search.cjs.map +1 -0
  49. package/dist/cjs/rerank/systemone.cjs +70 -0
  50. package/dist/cjs/rerank/systemone.cjs.map +1 -0
  51. package/dist/cjs/run.cjs +11 -1
  52. package/dist/cjs/run.cjs.map +1 -1
  53. package/dist/cjs/stream.cjs +42 -14
  54. package/dist/cjs/stream.cjs.map +1 -1
  55. package/dist/cjs/summarization/node.cjs +26 -8
  56. package/dist/cjs/summarization/node.cjs.map +1 -1
  57. package/dist/cjs/tools/SubagentTool.cjs +11 -3
  58. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  59. package/dist/cjs/tools/ToolNode.cjs +6 -5
  60. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  61. package/dist/cjs/tools/search/rerankers.cjs +1 -0
  62. package/dist/cjs/tools/search/search.cjs +3 -3
  63. package/dist/cjs/tools/search/search.cjs.map +1 -1
  64. package/dist/cjs/tools/search/tool.cjs +4 -3
  65. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  66. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +13 -2
  67. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -1
  68. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +149 -26
  69. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  70. package/dist/cjs/tools/subagent/SubagentReplay.cjs +4 -2
  71. package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -1
  72. package/dist/cjs/tools/subagent/childGraphConfig.cjs +3 -1
  73. package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -1
  74. package/dist/cjs/tools/subagent/diagnostics.cjs +88 -2
  75. package/dist/cjs/tools/subagent/diagnostics.cjs.map +1 -1
  76. package/dist/cjs/tools/subagent/hostArgs.cjs +214 -0
  77. package/dist/cjs/tools/subagent/hostArgs.cjs.map +1 -0
  78. package/dist/cjs/tools/subagent/index.cjs +2 -0
  79. package/dist/cjs/tools/toolErrorContent.cjs +1 -1
  80. package/dist/esm/agents/AgentContext.mjs +3 -2
  81. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  82. package/dist/esm/decisions/deadline.mjs +52 -0
  83. package/dist/esm/decisions/deadline.mjs.map +1 -0
  84. package/dist/esm/decisions/dialect.mjs +87 -0
  85. package/dist/esm/decisions/dialect.mjs.map +1 -0
  86. package/dist/esm/decisions/http.mjs +75 -0
  87. package/dist/esm/decisions/http.mjs.map +1 -0
  88. package/dist/esm/decisions/index.mjs +8 -0
  89. package/dist/esm/decisions/presets.mjs +77 -0
  90. package/dist/esm/decisions/presets.mjs.map +1 -0
  91. package/dist/esm/decisions/questions.mjs +67 -0
  92. package/dist/esm/decisions/questions.mjs.map +1 -0
  93. package/dist/esm/decisions/structuredChat.mjs +172 -0
  94. package/dist/esm/decisions/structuredChat.mjs.map +1 -0
  95. package/dist/esm/decisions/structuredOutput.mjs +18 -0
  96. package/dist/esm/decisions/structuredOutput.mjs.map +1 -0
  97. package/dist/esm/decisions/traceMarker.mjs +6 -0
  98. package/dist/esm/decisions/traceMarker.mjs.map +1 -0
  99. package/dist/esm/decisions/transport.mjs +164 -0
  100. package/dist/esm/decisions/transport.mjs.map +1 -0
  101. package/dist/esm/decisions/types.mjs +39 -0
  102. package/dist/esm/decisions/types.mjs.map +1 -0
  103. package/dist/esm/graphs/Graph.mjs +28 -9
  104. package/dist/esm/graphs/Graph.mjs.map +1 -1
  105. package/dist/esm/langfuseToolOutputTracing.mjs +6 -1
  106. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  107. package/dist/esm/llm/google/index.mjs +1 -1
  108. package/dist/esm/llm/invoke.mjs +34 -12
  109. package/dist/esm/llm/invoke.mjs.map +1 -1
  110. package/dist/esm/llm/openai/index.mjs +7 -0
  111. package/dist/esm/llm/openai/index.mjs.map +1 -1
  112. package/dist/esm/llm/providerTextBoundary.mjs +355 -0
  113. package/dist/esm/llm/providerTextBoundary.mjs.map +1 -0
  114. package/dist/esm/llm/providerTextChunk.mjs +13 -0
  115. package/dist/esm/llm/providerTextChunk.mjs.map +1 -0
  116. package/dist/esm/llm/providerTextControls.mjs +230 -0
  117. package/dist/esm/llm/providerTextControls.mjs.map +1 -0
  118. package/dist/esm/llm/stream/smoother.mjs +2 -1
  119. package/dist/esm/llm/stream/smoother.mjs.map +1 -1
  120. package/dist/esm/main.mjs +16 -2
  121. package/dist/esm/protection/providerText.mjs +218 -0
  122. package/dist/esm/protection/providerText.mjs.map +1 -0
  123. package/dist/esm/protection/providerTextInput.mjs +24 -0
  124. package/dist/esm/protection/providerTextInput.mjs.map +1 -0
  125. package/dist/esm/rerank/index.mjs +3 -0
  126. package/dist/esm/rerank/search.mjs +45 -0
  127. package/dist/esm/rerank/search.mjs.map +1 -0
  128. package/dist/esm/rerank/systemone.mjs +70 -0
  129. package/dist/esm/rerank/systemone.mjs.map +1 -0
  130. package/dist/esm/run.mjs +11 -1
  131. package/dist/esm/run.mjs.map +1 -1
  132. package/dist/esm/stream.mjs +42 -14
  133. package/dist/esm/stream.mjs.map +1 -1
  134. package/dist/esm/summarization/node.mjs +26 -8
  135. package/dist/esm/summarization/node.mjs.map +1 -1
  136. package/dist/esm/tools/SubagentTool.mjs +11 -3
  137. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  138. package/dist/esm/tools/ToolNode.mjs +6 -5
  139. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  140. package/dist/esm/tools/search/rerankers.mjs +1 -1
  141. package/dist/esm/tools/search/search.mjs +3 -3
  142. package/dist/esm/tools/search/search.mjs.map +1 -1
  143. package/dist/esm/tools/search/tool.mjs +4 -3
  144. package/dist/esm/tools/search/tool.mjs.map +1 -1
  145. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +13 -2
  146. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -1
  147. package/dist/esm/tools/subagent/SubagentExecutor.mjs +149 -26
  148. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  149. package/dist/esm/tools/subagent/SubagentReplay.mjs +4 -2
  150. package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -1
  151. package/dist/esm/tools/subagent/childGraphConfig.mjs +3 -1
  152. package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -1
  153. package/dist/esm/tools/subagent/diagnostics.mjs +84 -3
  154. package/dist/esm/tools/subagent/diagnostics.mjs.map +1 -1
  155. package/dist/esm/tools/subagent/hostArgs.mjs +207 -0
  156. package/dist/esm/tools/subagent/hostArgs.mjs.map +1 -0
  157. package/dist/esm/tools/subagent/index.mjs +2 -0
  158. package/dist/esm/tools/toolErrorContent.mjs +1 -1
  159. package/dist/types/decisions/deadline.d.ts +3 -0
  160. package/dist/types/decisions/dialect.d.ts +11 -0
  161. package/dist/types/decisions/http.d.ts +22 -0
  162. package/dist/types/decisions/index.d.ts +10 -0
  163. package/dist/types/decisions/presets.d.ts +17 -0
  164. package/dist/types/decisions/questions.d.ts +8 -0
  165. package/dist/types/decisions/structuredChat.d.ts +17 -0
  166. package/dist/types/decisions/structuredOutput.d.ts +4 -0
  167. package/dist/types/decisions/traceMarker.d.ts +2 -0
  168. package/dist/types/decisions/transport.d.ts +29 -0
  169. package/dist/types/decisions/types.d.ts +119 -0
  170. package/dist/types/graphs/Graph.d.ts +7 -3
  171. package/dist/types/index.d.ts +4 -0
  172. package/dist/types/llm/invoke.d.ts +4 -1
  173. package/dist/types/llm/providerTextBoundary.d.ts +4 -0
  174. package/dist/types/llm/providerTextChunk.d.ts +7 -0
  175. package/dist/types/llm/providerTextControls.d.ts +18 -0
  176. package/dist/types/protection/providerText.d.ts +77 -0
  177. package/dist/types/protection/providerTextInput.d.ts +3 -0
  178. package/dist/types/rerank/index.d.ts +4 -0
  179. package/dist/types/rerank/search.d.ts +7 -0
  180. package/dist/types/rerank/systemone.d.ts +13 -0
  181. package/dist/types/rerank/types.d.ts +24 -0
  182. package/dist/types/run.d.ts +2 -0
  183. package/dist/types/tools/BashExecutor.d.ts +4 -0
  184. package/dist/types/tools/CodeExecutor.d.ts +4 -0
  185. package/dist/types/tools/ReadFile.d.ts +4 -0
  186. package/dist/types/tools/SkillTool.d.ts +4 -0
  187. package/dist/types/tools/SubagentTool.d.ts +2 -0
  188. package/dist/types/tools/ToolSearch.d.ts +4 -0
  189. package/dist/types/tools/search/schema.d.ts +4 -0
  190. package/dist/types/tools/search/types.d.ts +3 -1
  191. package/dist/types/tools/subagent/SubagentExecutionRegistry.d.ts +6 -0
  192. package/dist/types/tools/subagent/SubagentExecutor.d.ts +22 -1
  193. package/dist/types/tools/subagent/SubagentReplay.d.ts +3 -1
  194. package/dist/types/tools/subagent/diagnostics.d.ts +56 -8
  195. package/dist/types/tools/subagent/hostArgs.d.ts +57 -0
  196. package/dist/types/tools/subagent/index.d.ts +3 -0
  197. package/dist/types/types/graph.d.ts +39 -0
  198. package/dist/types/types/run.d.ts +6 -2
  199. package/dist/types/types/tools.d.ts +2 -0
  200. package/package.json +4 -4
  201. package/src/agents/AgentContext.ts +3 -2
  202. package/src/decisions/deadline.ts +92 -0
  203. package/src/decisions/dialect.ts +200 -0
  204. package/src/decisions/http.ts +175 -0
  205. package/src/decisions/index.ts +14 -0
  206. package/src/decisions/presets.ts +111 -0
  207. package/src/decisions/questions.ts +128 -0
  208. package/src/decisions/structuredChat.ts +358 -0
  209. package/src/decisions/structuredOutput.ts +25 -0
  210. package/src/decisions/traceMarker.ts +2 -0
  211. package/src/decisions/transport.ts +335 -0
  212. package/src/decisions/types.ts +193 -0
  213. package/src/graphs/Graph.ts +57 -9
  214. package/src/index.ts +9 -0
  215. package/src/langfuseToolOutputTracing.ts +8 -1
  216. package/src/llm/invoke.ts +48 -7
  217. package/src/llm/openai/index.ts +8 -0
  218. package/src/llm/providerTextBoundary.ts +446 -0
  219. package/src/llm/providerTextChunk.ts +15 -0
  220. package/src/llm/providerTextControls.ts +173 -0
  221. package/src/llm/stream/smoother.ts +4 -2
  222. package/src/protection/providerText.ts +325 -0
  223. package/src/protection/providerTextInput.ts +21 -0
  224. package/src/rerank/index.ts +4 -0
  225. package/src/rerank/search.ts +85 -0
  226. package/src/rerank/systemone.ts +140 -0
  227. package/src/rerank/types.ts +28 -0
  228. package/src/run.ts +13 -0
  229. package/src/stream.ts +33 -7
  230. package/src/summarization/node.ts +32 -14
  231. package/src/tools/SubagentTool.ts +14 -3
  232. package/src/tools/ToolNode.ts +7 -3
  233. package/src/tools/search/search.ts +4 -4
  234. package/src/tools/search/tool.ts +27 -25
  235. package/src/tools/search/types.ts +4 -1
  236. package/src/tools/subagent/SubagentExecutionRegistry.ts +27 -2
  237. package/src/tools/subagent/SubagentExecutor.ts +323 -28
  238. package/src/tools/subagent/SubagentReplay.ts +10 -3
  239. package/src/tools/subagent/childGraphConfig.ts +12 -1
  240. package/src/tools/subagent/diagnostics.ts +180 -9
  241. package/src/tools/subagent/hostArgs.ts +413 -0
  242. package/src/tools/subagent/index.ts +20 -0
  243. package/src/types/graph.ts +44 -0
  244. package/src/types/run.ts +6 -2
  245. package/src/types/tools.ts +6 -1
@@ -0,0 +1,355 @@
1
+ import "../common/enum.mjs";
2
+ import "../common/index.mjs";
3
+ import { getChatModelClass } from "./providers.mjs";
4
+ import { getStreamedToolCallAdapter, getStreamedToolCallSeal } from "../tools/streamedToolCallSeals.mjs";
5
+ import { ProviderTextAttempt, ProviderTextProtectionError } from "../protection/providerText.mjs";
6
+ import { GEMINI_SIGNATURES, ResponsesTextProjection, keys, replayPositions, safetyRatings, stringMap } from "./providerTextControls.mjs";
7
+ import { isProviderTextInput } from "../protection/providerTextInput.mjs";
8
+ import { createProviderTextChunk } from "./providerTextChunk.mjs";
9
+ import { RunnableBinding, RunnableSequence } from "@langchain/core/runnables";
10
+ import { AIMessage, AIMessageChunk, mergeContent } from "@langchain/core/messages";
11
+ import { ChatGenerationChunk } from "@langchain/core/outputs";
12
+ import { BaseChatModel } from "@langchain/core/language_models/chat_models";
13
+ //#region src/llm/providerTextBoundary.ts
14
+ const additionalKeys = new Set([
15
+ "tool_calls",
16
+ "function_call",
17
+ "reasoning",
18
+ "reasoning_content",
19
+ "reasoning_details",
20
+ "thinking",
21
+ "signature"
22
+ ]);
23
+ const metadataKeys = new Set([
24
+ "finish_reason",
25
+ "stop_reason",
26
+ "stop_sequence",
27
+ "model_name",
28
+ "model",
29
+ "model_provider",
30
+ "system_fingerprint",
31
+ "service_tier",
32
+ "usage",
33
+ "tokenUsage",
34
+ "input_tokens",
35
+ "output_tokens",
36
+ "total_tokens",
37
+ "index",
38
+ "prompt",
39
+ "completion",
40
+ "output_version"
41
+ ]);
42
+ const additionalControls = {
43
+ id: (value) => typeof value === "string",
44
+ type: (value) => value === "message",
45
+ role: (value) => value === "assistant",
46
+ model: (value) => typeof value === "string",
47
+ stop_reason: (value) => value == null || typeof value === "string",
48
+ stop_sequence: (value) => value == null || typeof value === "string",
49
+ usage: (value) => numericMetadata(value)
50
+ };
51
+ const geminiControls = {
52
+ [GEMINI_SIGNATURES]: stringMap,
53
+ finishReason: (value) => [
54
+ "STOP",
55
+ "MAX_TOKENS",
56
+ "SAFETY",
57
+ "RECITATION",
58
+ "OTHER",
59
+ "MALFORMED_FUNCTION_CALL",
60
+ "FINISH_REASON_UNSPECIFIED"
61
+ ].includes(String(value)),
62
+ safetyRatings,
63
+ avgLogprobs: (value) => typeof value === "number" && Number.isFinite(value),
64
+ index: (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0
65
+ };
66
+ const controlBlocks = new Set([
67
+ "thinking",
68
+ "redacted_thinking",
69
+ "reasoning",
70
+ "reasoning_content",
71
+ "tool_use"
72
+ ]);
73
+ function copyMessage(message, content) {
74
+ const copied = createProviderTextChunk(message, {
75
+ content,
76
+ id: message.id,
77
+ name: message.name,
78
+ additional_kwargs: message.additional_kwargs,
79
+ response_metadata: message.response_metadata,
80
+ tool_calls: message.tool_calls,
81
+ tool_call_chunks: message instanceof AIMessageChunk ? message.tool_call_chunks : void 0,
82
+ invalid_tool_calls: message.invalid_tool_calls,
83
+ usage_metadata: message.usage_metadata
84
+ });
85
+ copied.invalid_tool_calls = message.invalid_tool_calls ?? [];
86
+ copied.lc_kwargs.invalid_tool_calls = copied.invalid_tool_calls;
87
+ return copied;
88
+ }
89
+ function numericMetadata(value, depth = 4) {
90
+ if (value == null) return true;
91
+ if (typeof value === "number") return Number.isFinite(value);
92
+ if (typeof value !== "object" || Array.isArray(value) || depth === 0) return false;
93
+ const values = Object.values(value);
94
+ return values.length <= 64 && values.every((entry) => numericMetadata(entry, depth - 1));
95
+ }
96
+ function hasKeys(value, keys) {
97
+ return value != null && typeof value === "object" && !Array.isArray(value) && Object.keys(value).every((key) => keys.includes(key));
98
+ }
99
+ function validateMetadata(metadata, google = false) {
100
+ for (const key of Object.keys(metadata)) {
101
+ const value = metadata[key];
102
+ let valid;
103
+ if (google && geminiControls[key] != null) valid = geminiControls[key](value);
104
+ else if (additionalControls[key] != null) valid = additionalControls[key](value);
105
+ else if (key === "contentBlockIndex") valid = typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
106
+ else if (key === "lc_streamed_tool_call_adapter") valid = getStreamedToolCallAdapter(metadata) != null;
107
+ else if (key === "lc_streamed_tool_call_seal") valid = hasKeys(value, [
108
+ "kind",
109
+ "id",
110
+ "index"
111
+ ]) && getStreamedToolCallSeal(metadata) != null;
112
+ else if (key === "messageStart") valid = hasKeys(value, ["role"]) && value.role === "assistant";
113
+ else if (key === "messageStop") valid = hasKeys(value, ["stopReason"]) && typeof value.stopReason === "string";
114
+ else if (key === "metadata") valid = hasKeys(value, ["usage", "metrics"]) && numericMetadata(value);
115
+ else if (key === "usage" || key === "tokenUsage" || key === "estimatedTokenUsage") valid = numericMetadata(value);
116
+ else valid = metadataKeys.has(key) && (value == null || typeof value === "string" || typeof value === "number" && Number.isFinite(value));
117
+ if (!valid) throw new ProviderTextProtectionError("unsupported");
118
+ }
119
+ }
120
+ var Candidate = class {
121
+ attempt;
122
+ provider;
123
+ block;
124
+ stringContent = false;
125
+ toolInputIndices = /* @__PURE__ */ new Set();
126
+ responses;
127
+ constructor(attempt, provider) {
128
+ this.attempt = attempt;
129
+ this.provider = provider;
130
+ this.responses = new ResponsesTextProjection(attempt);
131
+ }
132
+ strip(generation) {
133
+ const message = generation.message;
134
+ if (!(message instanceof AIMessageChunk)) throw new ProviderTextProtectionError("unsupported");
135
+ this.attempt.observeChunk();
136
+ for (const key of Object.keys(message.additional_kwargs)) {
137
+ if (additionalKeys.has(key)) continue;
138
+ const validate = (this.provider === "google" ? geminiControls[key] : void 0) ?? (key === "__openai_responses_replay_positions__" ? replayPositions : void 0) ?? (key === "__openai_function_call_ids__" ? stringMap : void 0) ?? additionalControls[key];
139
+ if (validate == null || !validate(message.additional_kwargs[key])) throw new ProviderTextProtectionError("unsupported");
140
+ }
141
+ let content;
142
+ if (typeof message.content === "string") {
143
+ if (message.content && this.block != null) throw new ProviderTextProtectionError("unsupported");
144
+ this.stringContent ||= message.content.length > 0;
145
+ const details = message.additional_kwargs.reasoning_details;
146
+ this.attempt.append(message.content, this.provider === "openrouter" && Array.isArray(details) && details.length > 0);
147
+ content = "";
148
+ } else {
149
+ content = [];
150
+ for (const block of message.content) {
151
+ if (typeof block === "string") throw new ProviderTextProtectionError("unsupported");
152
+ if (block.type !== "text") {
153
+ this.admitControl(block, message);
154
+ content.push(block);
155
+ continue;
156
+ }
157
+ if (typeof block.text !== "string" || this.stringContent || Object.keys(block).some((key) => ![
158
+ "type",
159
+ "text",
160
+ "index",
161
+ "annotations",
162
+ "phase"
163
+ ].includes(key)) || "annotations" in block && (!Array.isArray(block.annotations) || block.annotations.length > 0) || "phase" in block && block.phase != null && !["commentary", "final_answer"].includes(String(block.phase))) throw new ProviderTextProtectionError("unsupported");
164
+ if (this.block != null && this.block.index !== block.index) throw new ProviderTextProtectionError("unsupported");
165
+ this.block ??= {
166
+ ...block,
167
+ text: ""
168
+ };
169
+ this.attempt.append(block.text);
170
+ }
171
+ }
172
+ const metadata = this.responses.strip(message.response_metadata);
173
+ if (!Object.hasOwn(message.response_metadata, "output")) validateMetadata(metadata, this.provider === "google");
174
+ validateMetadata(generation.generationInfo ?? {}, this.provider === "google");
175
+ const stripped = copyMessage(message, content);
176
+ stripped.response_metadata = metadata;
177
+ stripped.lc_kwargs.response_metadata = metadata;
178
+ return new ChatGenerationChunk({
179
+ text: "",
180
+ message: stripped,
181
+ generationInfo: generation.generationInfo
182
+ });
183
+ }
184
+ admitControl(block, message) {
185
+ const { type, index, input, id, name } = block;
186
+ const part = block;
187
+ if (this.provider === "google" && keys(part, ["functionCall", "thoughtSignature"]) && keys(part.functionCall, [
188
+ "name",
189
+ "args",
190
+ "id"
191
+ ])) {
192
+ const call = part.functionCall;
193
+ if (typeof call.name !== "string" || part.thoughtSignature != null && typeof part.thoughtSignature !== "string" || message.tool_calls?.some((tool) => tool.name === call.name && JSON.stringify(tool.args) === JSON.stringify(call.args)) !== true) throw new ProviderTextProtectionError("unsupported");
194
+ return;
195
+ }
196
+ if (!Object.hasOwn(block, "type")) {
197
+ if (!hasKeys(block, ["index", "input"]) || typeof index !== "number" || !Number.isSafeInteger(index) || index < 0 || typeof input !== "string" || !this.toolInputIndices.has(index) || message.tool_call_chunks?.some((call) => call.index === index && call.args === input) !== true) throw new ProviderTextProtectionError("unsupported");
198
+ return;
199
+ }
200
+ if (type == null || !controlBlocks.has(type)) throw new ProviderTextProtectionError("unsupported");
201
+ if (type === "tool_use" && index != null) {
202
+ if (typeof index !== "number" || !Number.isSafeInteger(index) || index < 0 || message.tool_call_chunks?.some((call) => call.index === index && call.id === id && call.name === name) !== true) throw new ProviderTextProtectionError("unsupported");
203
+ if (!this.toolInputIndices.has(index)) {
204
+ this.attempt.observeChunk();
205
+ this.toolInputIndices.add(index);
206
+ }
207
+ }
208
+ }
209
+ async canonical() {
210
+ const content = await this.attempt.release();
211
+ const metadata = this.responses.canonical(content);
212
+ if (!content && metadata == null) return void 0;
213
+ return new ChatGenerationChunk({
214
+ text: content,
215
+ message: new AIMessageChunk({
216
+ content: this.block == null ? content : [{
217
+ ...this.block,
218
+ text: content
219
+ }],
220
+ response_metadata: metadata
221
+ })
222
+ });
223
+ }
224
+ };
225
+ function clone(value) {
226
+ return Object.create(Object.getPrototypeOf(value), Object.getOwnPropertyDescriptors(value));
227
+ }
228
+ function assertBindingShell(model) {
229
+ if (model.constructor !== RunnableBinding || (model.configFactories?.length ?? 0) > 0 || model.invoke !== RunnableBinding.prototype.invoke || model.batch !== RunnableBinding.prototype.batch || model.stream !== RunnableBinding.prototype.stream || model.transform !== RunnableBinding.prototype.transform || model._streamIterator !== RunnableBinding.prototype._streamIterator) throw new ProviderTextProtectionError("unsupported");
230
+ }
231
+ function assertInputStep(input) {
232
+ if (isProviderTextInput(input)) return;
233
+ if (input instanceof RunnableBinding) {
234
+ assertBindingShell(input);
235
+ assertInputStep(input.bound);
236
+ return;
237
+ }
238
+ throw new ProviderTextProtectionError("unsupported");
239
+ }
240
+ function hasStreamingInvocation(model, options) {
241
+ if ("streaming" in model && model.streaming === true) return true;
242
+ const params = model.invocationParams(options);
243
+ if (params == null || typeof params !== "object" || Array.isArray(params)) throw new ProviderTextProtectionError("unsupported");
244
+ return "stream" in params && params.stream != null && params.stream !== false;
245
+ }
246
+ function usesInternalStreaming(model, options) {
247
+ if (hasStreamingInvocation(model, options)) return true;
248
+ for (const key of ["completions", "responses"]) {
249
+ const delegate = Reflect.get(model, key);
250
+ if (delegate instanceof BaseChatModel && hasStreamingInvocation(delegate, options)) return true;
251
+ }
252
+ return false;
253
+ }
254
+ function withProviderTextBoundary(model, policy, provider) {
255
+ const protectedModel = clone(model);
256
+ if (model instanceof RunnableBinding) {
257
+ assertBindingShell(model);
258
+ Object.defineProperty(protectedModel, "bound", { value: withProviderTextBoundary(model.bound, policy, provider) });
259
+ return protectedModel;
260
+ }
261
+ if (model instanceof RunnableSequence) {
262
+ if (model.constructor !== RunnableSequence || model.invoke !== RunnableSequence.prototype.invoke || model.batch !== RunnableSequence.prototype.batch || model.stream !== RunnableSequence.prototype.stream || model.transform !== RunnableSequence.prototype.transform || model._streamIterator !== RunnableSequence.prototype._streamIterator) throw new ProviderTextProtectionError("unsupported");
263
+ const steps = model.steps;
264
+ for (let index = 0; index < steps.length - 1; index++) assertInputStep(steps[index]);
265
+ Object.defineProperty(protectedModel, "last", { value: withProviderTextBoundary(steps[steps.length - 1], policy, provider) });
266
+ return protectedModel;
267
+ }
268
+ if (!(model instanceof BaseChatModel) || model.cache != null) throw new ProviderTextProtectionError("unsupported");
269
+ if (model.transform !== BaseChatModel.prototype.transform || model._streamIterator !== BaseChatModel.prototype._streamIterator || model.generate !== BaseChatModel.prototype.generate || model.generatePrompt !== BaseChatModel.prototype.generatePrompt || model._generateUncached !== BaseChatModel.prototype._generateUncached) throw new ProviderTextProtectionError("unsupported");
270
+ if (model.stream !== BaseChatModel.prototype.stream || model.invoke !== BaseChatModel.prototype.invoke) {
271
+ const openAI = getChatModelClass("openAI");
272
+ if (model.stream !== openAI.prototype.stream || model.invoke !== openAI.prototype.invoke) throw new ProviderTextProtectionError("unsupported");
273
+ }
274
+ if (model.disableStreaming && usesInternalStreaming(model)) throw new ProviderTextProtectionError("unsupported");
275
+ const protectedChat = clone(model);
276
+ protectedChat._streamResponseChunks = async function* (messages, options, runManager) {
277
+ const attempt = new ProviderTextAttempt(policy, options.signal);
278
+ const candidate = new Candidate(attempt, provider);
279
+ let source;
280
+ try {
281
+ source = model._streamResponseChunks(messages, {
282
+ ...options,
283
+ signal: attempt.signal
284
+ }, void 0);
285
+ for (;;) {
286
+ const next = await attempt.wait(source.next());
287
+ attempt.check();
288
+ if (next.done === true) break;
289
+ const chunk = candidate.strip(next.value);
290
+ yield chunk;
291
+ await runManager?.handleLLMNewToken("", void 0, void 0, void 0, void 0, { chunk });
292
+ }
293
+ const canonical = await candidate.canonical();
294
+ attempt.check();
295
+ if (canonical != null) {
296
+ yield canonical;
297
+ attempt.check();
298
+ await runManager?.handleLLMNewToken(canonical.text, void 0, void 0, void 0, void 0, { chunk: canonical });
299
+ }
300
+ } finally {
301
+ try {
302
+ if (source != null) attempt.wait(source.return(void 0)).catch(() => {});
303
+ } finally {
304
+ attempt.finish();
305
+ }
306
+ }
307
+ };
308
+ protectedChat._streamChatModelEvents = BaseChatModel.prototype._streamChatModelEvents;
309
+ protectedChat._generate = async function(messages, options) {
310
+ if (usesInternalStreaming(model, options)) throw new ProviderTextProtectionError("unsupported");
311
+ const attempt = new ProviderTextAttempt(policy, options.signal);
312
+ try {
313
+ const result = await attempt.wait(model._generate(messages, {
314
+ ...options,
315
+ signal: attempt.signal
316
+ }, void 0));
317
+ attempt.check();
318
+ if (result.llmOutput != null) validateMetadata(result.llmOutput, provider === "google");
319
+ if (result.generations.length !== 1) throw new ProviderTextProtectionError("unsupported");
320
+ const generation = result.generations[0];
321
+ if (!(generation.message instanceof AIMessage)) throw new ProviderTextProtectionError("unsupported");
322
+ const message = generation.message instanceof AIMessageChunk ? generation.message : copyMessage(generation.message, generation.message.content);
323
+ const candidate = new Candidate(attempt, provider);
324
+ const stripped = candidate.strip(new ChatGenerationChunk({
325
+ ...generation,
326
+ message
327
+ }));
328
+ const canonical = await candidate.canonical();
329
+ attempt.check();
330
+ const released = canonical == null ? stripped : new ChatGenerationChunk({
331
+ text: canonical.text,
332
+ message: copyMessage(stripped.message, mergeContent(stripped.message.content, canonical.message.content)),
333
+ generationInfo: stripped.generationInfo
334
+ });
335
+ if (canonical != null) {
336
+ released.message.response_metadata = {
337
+ ...released.message.response_metadata,
338
+ ...canonical.message.response_metadata
339
+ };
340
+ released.message.lc_kwargs.response_metadata = released.message.response_metadata;
341
+ }
342
+ return {
343
+ ...result,
344
+ generations: [released]
345
+ };
346
+ } finally {
347
+ attempt.finish();
348
+ }
349
+ };
350
+ return protectedChat;
351
+ }
352
+ //#endregion
353
+ export { withProviderTextBoundary };
354
+
355
+ //# sourceMappingURL=providerTextBoundary.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerTextBoundary.mjs","names":["control"],"sources":["../../../src/llm/providerTextBoundary.ts"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { AIMessageChunk } from "@langchain/core/messages";
2
+ //#region src/llm/providerTextChunk.ts
3
+ const constructors = /* @__PURE__ */ new WeakMap();
4
+ function registerProviderTextChunkConstructor(constructor) {
5
+ constructors.set(constructor.prototype, constructor);
6
+ }
7
+ function createProviderTextChunk(source, fields) {
8
+ return new ((constructors.get(Object.getPrototypeOf(source))) ?? AIMessageChunk)(fields);
9
+ }
10
+ //#endregion
11
+ export { createProviderTextChunk, registerProviderTextChunkConstructor };
12
+
13
+ //# sourceMappingURL=providerTextChunk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerTextChunk.mjs","names":[],"sources":["../../../src/llm/providerTextChunk.ts"],"mappings":";;AAIA,MAAM,+BAAe,IAAI,QAAkC;AAG3D,SAAgB,qCAAqC,aAAqC;CACxF,aAAa,IAAI,YAAY,WAAW,WAAW;AACrD;AAEA,SAAgB,wBAAwB,QAAgB,QAA8C;CAEpG,OAAO,MADa,aAAa,IAAI,OAAO,eAAe,MAAM,CAAC,MAAK,gBAChD,MAAM;AAC/B"}
@@ -0,0 +1,230 @@
1
+ import { ProviderTextProtectionError } from "../protection/providerText.mjs";
2
+ //#region src/llm/providerTextControls.ts
3
+ const GEMINI_SIGNATURES = "__gemini_function_call_thought_signatures__";
4
+ const RESPONSES_POSITIONS = "__openai_responses_replay_positions__";
5
+ function keys(value, allowed) {
6
+ return value != null && typeof value === "object" && !Array.isArray(value) && Object.keys(value).every((key) => allowed.includes(key));
7
+ }
8
+ function stringMap(value) {
9
+ return value != null && typeof value === "object" && !Array.isArray(value) && Object.entries(value).length <= 128 && Object.values(value).every((entry) => typeof entry === "string");
10
+ }
11
+ function safetyRatings(value) {
12
+ return Array.isArray(value) && value.length <= 16 && value.every((entry) => keys(entry, [
13
+ "category",
14
+ "probability",
15
+ "blocked"
16
+ ]) && typeof entry.category === "string" && /^HARM_CATEGORY_[A-Z_]+$/.test(entry.category) && [
17
+ "NEGLIGIBLE",
18
+ "LOW",
19
+ "MEDIUM",
20
+ "HIGH",
21
+ "HARM_PROBABILITY_UNSPECIFIED"
22
+ ].includes(String(entry.probability)) && (entry.blocked == null || typeof entry.blocked === "boolean"));
23
+ }
24
+ function replayPositions(value) {
25
+ return Array.isArray(value) && value.length <= 128 && value.every((entry) => keys(entry, [
26
+ "itemId",
27
+ "kind",
28
+ "outputIndex",
29
+ "contentIndex"
30
+ ]) && typeof entry.itemId === "string" && [
31
+ "message",
32
+ "text",
33
+ "reasoning",
34
+ "output"
35
+ ].includes(String(entry.kind)) && typeof entry.outputIndex === "number" && Number.isSafeInteger(entry.outputIndex) && entry.outputIndex >= 0 && (entry.contentIndex == null || typeof entry.contentIndex === "number" && Number.isSafeInteger(entry.contentIndex) && entry.contentIndex >= 0));
36
+ }
37
+ const scalarKeys = new Set([
38
+ "id",
39
+ "model",
40
+ "model_name",
41
+ "model_provider",
42
+ "created_at",
43
+ "object",
44
+ "status",
45
+ "user",
46
+ "service_tier",
47
+ "max_output_tokens",
48
+ "max_tool_calls",
49
+ "parallel_tool_calls",
50
+ "temperature",
51
+ "top_p",
52
+ "truncation",
53
+ "store",
54
+ "background",
55
+ "previous_response_id",
56
+ "prompt_cache_key",
57
+ "prompt_cache_retention",
58
+ "safety_identifier",
59
+ "completed_at"
60
+ ]);
61
+ function messageOutput(value) {
62
+ if (!keys(value, [
63
+ "id",
64
+ "type",
65
+ "role",
66
+ "status",
67
+ "phase",
68
+ "content"
69
+ ]) || value.type !== "message" || typeof value.id !== "string" || value.role !== "assistant" || !["completed", "incomplete"].includes(String(value.status)) || value.phase != null && !["commentary", "final_answer"].includes(String(value.phase)) || !Array.isArray(value.content) || value.content.length !== 1) return false;
70
+ const part = value.content[0];
71
+ return keys(part, [
72
+ "type",
73
+ "text",
74
+ "annotations",
75
+ "logprobs"
76
+ ]) && part.type === "output_text" && typeof part.text === "string" && Array.isArray(part.annotations) && part.annotations.length === 0 && (part.logprobs === void 0 || Array.isArray(part.logprobs) && part.logprobs.length === 0);
77
+ }
78
+ var ResponsesTextProjection = class {
79
+ attempt;
80
+ metadata;
81
+ hasOutputAlias = false;
82
+ output;
83
+ constructor(attempt) {
84
+ this.attempt = attempt;
85
+ }
86
+ strip(metadata) {
87
+ if (!Object.hasOwn(metadata, "output")) return metadata;
88
+ if (this.metadata != null || metadata.model_provider !== "openai" || metadata.object !== "response" || !Array.isArray(metadata.output) || metadata.output.length > 32) throw new ProviderTextProtectionError("unsupported");
89
+ let messageCount = 0;
90
+ const output = metadata.output.map((item) => {
91
+ if (messageOutput(item)) {
92
+ if (++messageCount > 1 || !this.attempt.matchesText(item.content[0].text)) throw new ProviderTextProtectionError("unsupported");
93
+ return {
94
+ ...item,
95
+ content: [{
96
+ ...item.content[0],
97
+ text: ""
98
+ }]
99
+ };
100
+ }
101
+ if (!responseOutputControl(item)) throw new ProviderTextProtectionError("unsupported");
102
+ return item;
103
+ });
104
+ if (messageCount === 0 && !this.attempt.matchesText("") || metadata.output_text != null && (typeof metadata.output_text !== "string" || !this.attempt.matchesText(metadata.output_text))) throw new ProviderTextProtectionError("unsupported");
105
+ for (const [key, value] of Object.entries(metadata)) {
106
+ let valid;
107
+ if (key === "output" || key === "output_text") continue;
108
+ if (key === "top_logprobs") valid = value == null || value === 0;
109
+ else if (key === "usage") valid = numericTree(value);
110
+ else if (key === "text") valid = keys(value, ["format", "verbosity"]) && keys(value.format, ["type"]) && value.format.type === "text" && (value.verbosity == null || [
111
+ "low",
112
+ "medium",
113
+ "high"
114
+ ].includes(String(value.verbosity)));
115
+ else if (key === "tools") valid = Array.isArray(value) && value.length <= 32 && value.every(responseTool);
116
+ else if (key === "tool_choice") valid = value === "auto" || value === "none" || value === "required" || keys(value, ["type", "name"]) && value.type === "function" && typeof value.name === "string";
117
+ else if (key === "reasoning") valid = value == null || keys(value, ["effort", "summary"]) && (value.effort == null || [
118
+ "none",
119
+ "minimal",
120
+ "low",
121
+ "medium",
122
+ "high",
123
+ "xhigh"
124
+ ].includes(String(value.effort))) && (value.summary == null || [
125
+ "auto",
126
+ "concise",
127
+ "detailed"
128
+ ].includes(String(value.summary)));
129
+ else if (key === "metadata") valid = keys(value, []) || value == null;
130
+ else if (key === "instructions" || key === "error") valid = value == null;
131
+ else if (key === "incomplete_details") valid = value == null || keys(value, ["reason"]) && ["max_output_tokens", "content_filter"].includes(String(value.reason));
132
+ else valid = scalarKeys.has(key) && (value == null || typeof value === "string" || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value));
133
+ if (!valid) throw new ProviderTextProtectionError("unsupported");
134
+ }
135
+ retainTree(metadata, this.attempt);
136
+ this.output = output;
137
+ this.hasOutputAlias = Object.hasOwn(metadata, "output_text");
138
+ const { output: _output, output_text: _alias, ...controls } = metadata;
139
+ this.metadata = controls;
140
+ return controls;
141
+ }
142
+ canonical(content) {
143
+ if (this.metadata == null || this.output == null) return void 0;
144
+ return {
145
+ output: this.output.map((item) => messageOutput(item) ? {
146
+ ...item,
147
+ content: [{
148
+ ...item.content[0],
149
+ text: content
150
+ }]
151
+ } : item),
152
+ ...this.hasOutputAlias ? { output_text: content } : {}
153
+ };
154
+ }
155
+ };
156
+ function numericTree(value, depth = 4) {
157
+ if (value == null) return true;
158
+ if (typeof value === "number") return Number.isFinite(value);
159
+ if (typeof value !== "object" || Array.isArray(value) || depth === 0) return false;
160
+ const entries = Object.values(value);
161
+ return entries.length <= 64 && entries.every((entry) => numericTree(entry, depth - 1));
162
+ }
163
+ function responseOutputControl(value) {
164
+ if (!keys(value, [
165
+ "id",
166
+ "type",
167
+ "status",
168
+ "call_id",
169
+ "name",
170
+ "arguments",
171
+ "summary",
172
+ "encrypted_content"
173
+ ])) return false;
174
+ if (typeof value.id !== "string" || value.status != null && ![
175
+ "completed",
176
+ "incomplete",
177
+ "in_progress"
178
+ ].includes(String(value.status))) return false;
179
+ if (value.type === "function_call") return keys(value, [
180
+ "id",
181
+ "type",
182
+ "status",
183
+ "call_id",
184
+ "name",
185
+ "arguments"
186
+ ]) && typeof value.call_id === "string" && typeof value.name === "string" && typeof value.arguments === "string";
187
+ if (value.type !== "reasoning" || !keys(value, [
188
+ "id",
189
+ "type",
190
+ "status",
191
+ "summary",
192
+ "encrypted_content"
193
+ ])) return false;
194
+ return (value.encrypted_content == null || typeof value.encrypted_content === "string") && Array.isArray(value.summary) && value.summary.length <= 32 && value.summary.every((entry) => keys(entry, ["type", "text"]) && entry.type === "summary_text" && typeof entry.text === "string");
195
+ }
196
+ function responseTool(value) {
197
+ return keys(value, [
198
+ "type",
199
+ "name",
200
+ "description",
201
+ "strict",
202
+ "parameters"
203
+ ]) && value.type === "function" && typeof value.name === "string" && (value.description == null || typeof value.description === "string") && (value.strict == null || typeof value.strict === "boolean") && jsonControl(value.parameters);
204
+ }
205
+ function jsonControl(value, depth = 6) {
206
+ if (value == null || typeof value === "string" || typeof value === "boolean") return true;
207
+ if (typeof value === "number") return Number.isFinite(value);
208
+ if (typeof value !== "object" || depth === 0) return false;
209
+ const entries = Object.values(value);
210
+ return entries.length <= 64 && entries.every((entry) => jsonControl(entry, depth - 1));
211
+ }
212
+ function retainTree(value, attempt, depth = 8) {
213
+ if (typeof value === "string") {
214
+ attempt.retain(value.length * 2 + 32);
215
+ return;
216
+ }
217
+ attempt.retain(64);
218
+ if (value == null || typeof value !== "object") return;
219
+ if (depth === 0) throw new ProviderTextProtectionError("unsupported");
220
+ const entries = Object.entries(value);
221
+ if (entries.length > 128) throw new ProviderTextProtectionError("unsupported");
222
+ for (const [key, entry] of entries) {
223
+ attempt.retain(key.length * 2 + 32);
224
+ retainTree(entry, attempt, depth - 1);
225
+ }
226
+ }
227
+ //#endregion
228
+ export { GEMINI_SIGNATURES, RESPONSES_POSITIONS, ResponsesTextProjection, keys, replayPositions, safetyRatings, stringMap };
229
+
230
+ //# sourceMappingURL=providerTextControls.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerTextControls.mjs","names":[],"sources":["../../../src/llm/providerTextControls.ts"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { isProtectedProviderTextSignal } from "../../protection/providerText.mjs";
1
2
  //#region src/llm/stream/smoother.ts
2
3
  const DEFAULT_STREAM_DELAY = 25;
3
4
  const MAX_SMOOTH_ITEM_SEGMENT_CHARS = 4096;
@@ -52,7 +53,7 @@ async function waitForStreamDelay(delay, signal) {
52
53
  });
53
54
  }
54
55
  async function* smoothStream({ source, delayMs, signal, abortUpstream }) {
55
- if (!(delayMs > 0)) {
56
+ if (!(delayMs > 0) || isProtectedProviderTextSignal(signal)) {
56
57
  for await (const item of source) {
57
58
  if (isSignalAborted(signal)) {
58
59
  abortUpstream?.();