@librechat/agents 3.2.61 → 3.2.62
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/common/enum.cjs +2 -0
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +32 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs +6 -0
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs +12 -0
- package/dist/cjs/hooks/index.cjs.map +1 -0
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +62 -1
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +266 -43
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +274 -7
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/streamMetadata.cjs +69 -0
- package/dist/cjs/llm/openai/streamMetadata.cjs.map +1 -0
- package/dist/cjs/llm/openrouter/index.cjs +5 -6
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +6 -1
- package/dist/cjs/messages/format.cjs +61 -0
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +31 -19
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/stream.cjs +13 -3
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +75 -10
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +111 -0
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/esm/common/enum.mjs +2 -0
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +32 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs +6 -0
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/index.mjs +12 -1
- package/dist/esm/hooks/index.mjs.map +1 -0
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +62 -1
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +266 -43
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +274 -7
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/streamMetadata.mjs +69 -0
- package/dist/esm/llm/openai/streamMetadata.mjs.map +1 -0
- package/dist/esm/llm/openrouter/index.mjs +5 -6
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/main.mjs +3 -3
- package/dist/esm/messages/format.mjs +61 -0
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +31 -19
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/stream.mjs +13 -3
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +75 -10
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +108 -1
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/types/common/enum.d.ts +3 -1
- package/dist/types/hooks/HookRegistry.d.ts +10 -0
- package/dist/types/hooks/index.d.ts +7 -0
- package/dist/types/hooks/types.d.ts +18 -1
- package/dist/types/llm/bedrock/index.d.ts +5 -0
- package/dist/types/llm/openai/index.d.ts +19 -0
- package/dist/types/llm/openai/streamMetadata.d.ts +16 -0
- package/dist/types/messages/prune.d.ts +4 -3
- package/dist/types/tools/ToolNode.d.ts +1 -0
- package/dist/types/types/llm.d.ts +12 -2
- package/dist/types/types/tools.d.ts +1 -1
- package/dist/types/utils/tokens.d.ts +30 -0
- package/package.json +6 -6
- package/src/__tests__/stream.eagerEventExecution.test.ts +100 -2
- package/src/common/enum.ts +2 -0
- package/src/hooks/HookRegistry.ts +45 -0
- package/src/hooks/__tests__/HookRegistry.test.ts +48 -0
- package/src/hooks/__tests__/executeHooks.test.ts +85 -2
- package/src/hooks/executeHooks.ts +15 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/types.ts +18 -1
- package/src/langfuse.ts +134 -1
- package/src/llm/bedrock/index.ts +434 -83
- package/src/llm/bedrock/streamSealDispatch.test.ts +97 -0
- package/src/llm/custom-chat-models.smoke.test.ts +7 -0
- package/src/llm/openai/index.ts +604 -6
- package/src/llm/openai/managedRequests.test.ts +182 -0
- package/src/llm/openai/streamMetadata.spec.ts +86 -0
- package/src/llm/openai/streamMetadata.ts +95 -0
- package/src/llm/openai/streamMetadataDedup.spec.ts +166 -0
- package/src/llm/openrouter/index.ts +9 -5
- package/src/messages/format.ts +96 -3
- package/src/messages/formatAgentMessages.steer.test.ts +326 -0
- package/src/messages/labelContentByAgent.test.ts +75 -0
- package/src/messages/prune.ts +56 -30
- package/src/specs/anthropic.simple.test.ts +4 -2
- package/src/specs/cache.simple.test.ts +17 -4
- package/src/specs/langfuse-callbacks.test.ts +61 -0
- package/src/specs/openai.simple.test.ts +4 -2
- package/src/specs/spec.utils.ts +12 -0
- package/src/specs/summarization.test.ts +9 -13
- package/src/specs/token-accounting-pipeline.test.ts +130 -4
- package/src/specs/tokens.test.ts +214 -0
- package/src/stream.ts +22 -3
- package/src/tools/ToolNode.ts +107 -12
- package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +554 -0
- package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +49 -2
- package/src/tools/__tests__/hitl.test.ts +112 -0
- package/src/tools/subagent/SubagentExecutor.ts +2 -0
- package/src/types/llm.ts +12 -2
- package/src/types/tools.ts +1 -1
- package/src/utils/tokens.ts +181 -3
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const require_streamedToolCallSeals = require("../../tools/streamedToolCallSeals.cjs");
|
|
2
2
|
const require_index = require("./utils/index.cjs");
|
|
3
|
+
const require_streamMetadata = require("./streamMetadata.cjs");
|
|
3
4
|
let _langchain_core_messages = require("@langchain/core/messages");
|
|
4
5
|
let _langchain_openai = require("@langchain/openai");
|
|
5
6
|
let openai = require("openai");
|
|
@@ -35,6 +36,166 @@ function normalizeHeaders(headers) {
|
|
|
35
36
|
});
|
|
36
37
|
return Object.fromEntries(output.entries());
|
|
37
38
|
}
|
|
39
|
+
const CACHE_WRITE_METADATA_KEY = "__librechat_cache_write_tokens";
|
|
40
|
+
function applyManagedRequestParams(params, fields) {
|
|
41
|
+
return {
|
|
42
|
+
...params,
|
|
43
|
+
...fields.promptCacheExplicit === true && { prompt_cache_options: {
|
|
44
|
+
mode: "explicit",
|
|
45
|
+
ttl: "30m"
|
|
46
|
+
} },
|
|
47
|
+
...fields.safetyIdentifier != null && { safety_identifier: fields.safetyIdentifier }
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function isCacheableChatPart(part) {
|
|
51
|
+
if (typeof part !== "object" || part == null || !("type" in part)) return false;
|
|
52
|
+
return part.type === "text" || part.type === "image_url" || part.type === "input_audio" || part.type === "file" || part.type === "refusal";
|
|
53
|
+
}
|
|
54
|
+
function canAddChatBreakpoint(message) {
|
|
55
|
+
if (message.role !== "system" && message.role !== "developer" && message.role !== "user" && message.role !== "assistant" && message.role !== "tool") return false;
|
|
56
|
+
if (typeof message.content === "string") return message.content.length > 0;
|
|
57
|
+
return Array.isArray(message.content) && message.content.some((part) => isCacheableChatPart(part));
|
|
58
|
+
}
|
|
59
|
+
function addChatBreakpoint(message) {
|
|
60
|
+
if (!canAddChatBreakpoint(message)) return message;
|
|
61
|
+
if (typeof message.content === "string") return {
|
|
62
|
+
...message,
|
|
63
|
+
content: [{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: message.content,
|
|
66
|
+
prompt_cache_breakpoint: { mode: "explicit" }
|
|
67
|
+
}]
|
|
68
|
+
};
|
|
69
|
+
if (!Array.isArray(message.content) || message.content.length === 0) return message;
|
|
70
|
+
const content = [...message.content];
|
|
71
|
+
let index = content.length - 1;
|
|
72
|
+
while (index >= 0 && !isCacheableChatPart(content[index])) index--;
|
|
73
|
+
if (index < 0) return message;
|
|
74
|
+
content[index] = {
|
|
75
|
+
...content[index],
|
|
76
|
+
prompt_cache_breakpoint: { mode: "explicit" }
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
...message,
|
|
80
|
+
content
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function selectCacheBreakpointIndexes(roles, cacheable) {
|
|
84
|
+
let instructionIndex = -1;
|
|
85
|
+
let latestUserIndex = -1;
|
|
86
|
+
for (let index = 0; index < roles.length; index++) {
|
|
87
|
+
const role = roles[index];
|
|
88
|
+
if ((role === "system" || role === "developer") && cacheable[index]) instructionIndex = index;
|
|
89
|
+
if (role === "user") latestUserIndex = index;
|
|
90
|
+
}
|
|
91
|
+
const indexes = /* @__PURE__ */ new Set();
|
|
92
|
+
if (instructionIndex >= 0) indexes.add(instructionIndex);
|
|
93
|
+
for (let index = latestUserIndex - 1; index >= 0; index--) if (cacheable[index]) {
|
|
94
|
+
indexes.add(index);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
return [...indexes];
|
|
98
|
+
}
|
|
99
|
+
/** @internal */
|
|
100
|
+
function addChatCacheBreakpoints(messages) {
|
|
101
|
+
const indexes = new Set(selectCacheBreakpointIndexes(messages.map((message) => message.role), messages.map((message) => canAddChatBreakpoint(message))));
|
|
102
|
+
return messages.map((message, index) => indexes.has(index) ? addChatBreakpoint(message) : message);
|
|
103
|
+
}
|
|
104
|
+
function isResponseMessage(item) {
|
|
105
|
+
return item.type === "message";
|
|
106
|
+
}
|
|
107
|
+
/** Only `input_text`/`input_image`/`input_file` accept a Responses breakpoint;
|
|
108
|
+
* `output_text`/`refusal` (replayed assistant blocks) are rejected with a 400. */
|
|
109
|
+
function isCacheableResponsePart(part) {
|
|
110
|
+
if (typeof part !== "object" || part == null || !("type" in part)) return false;
|
|
111
|
+
return part.type === "input_text" || part.type === "input_image" || part.type === "input_file";
|
|
112
|
+
}
|
|
113
|
+
function addResponseBreakpoint(item) {
|
|
114
|
+
if (!isResponseMessage(item)) return item;
|
|
115
|
+
const rawContent = item.content;
|
|
116
|
+
if (typeof rawContent === "string") {
|
|
117
|
+
if (rawContent.length === 0) return item;
|
|
118
|
+
return {
|
|
119
|
+
...item,
|
|
120
|
+
content: [{
|
|
121
|
+
type: "input_text",
|
|
122
|
+
text: rawContent,
|
|
123
|
+
prompt_cache_breakpoint: { mode: "explicit" }
|
|
124
|
+
}]
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (!Array.isArray(rawContent) || rawContent.length === 0) return item;
|
|
128
|
+
const content = [...rawContent];
|
|
129
|
+
let index = content.length - 1;
|
|
130
|
+
while (index >= 0 && !isCacheableResponsePart(content[index])) index--;
|
|
131
|
+
if (index < 0) return item;
|
|
132
|
+
content[index] = {
|
|
133
|
+
...content[index],
|
|
134
|
+
prompt_cache_breakpoint: { mode: "explicit" }
|
|
135
|
+
};
|
|
136
|
+
return {
|
|
137
|
+
...item,
|
|
138
|
+
content
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** @internal */
|
|
142
|
+
function addResponseCacheBreakpoints(input) {
|
|
143
|
+
if (!Array.isArray(input)) return input;
|
|
144
|
+
const indexes = new Set(selectCacheBreakpointIndexes(input.map((item) => isResponseMessage(item) ? item.role : void 0), input.map((item) => {
|
|
145
|
+
if (!isResponseMessage(item)) return false;
|
|
146
|
+
/** Only input roles take a Responses breakpoint. Assistant/tool turns
|
|
147
|
+
* carry output content (string or output_text) that the API rejects
|
|
148
|
+
* under an input marker, so they're never eligible. */
|
|
149
|
+
if (item.role !== "system" && item.role !== "developer" && item.role !== "user") return false;
|
|
150
|
+
const content = item.content;
|
|
151
|
+
return typeof content === "string" ? content.length > 0 : Array.isArray(content) && content.some((part) => isCacheableResponsePart(part));
|
|
152
|
+
})));
|
|
153
|
+
return input.map((item, index) => indexes.has(index) ? addResponseBreakpoint(item) : item);
|
|
154
|
+
}
|
|
155
|
+
/** @internal */
|
|
156
|
+
function shouldIncludeEncryptedReasoning(model, params) {
|
|
157
|
+
const reasoningContext = params.reasoning?.context;
|
|
158
|
+
return /^gpt-5\.6(?:-|$)/i.test(model) && (params.store === false || reasoningContext !== "current_turn");
|
|
159
|
+
}
|
|
160
|
+
function getCacheWriteTokens(message) {
|
|
161
|
+
const responseMetadata = message.response_metadata;
|
|
162
|
+
const reported = responseMetadata.usage?.input_tokens_details.cache_write_tokens;
|
|
163
|
+
if (reported != null) return reported;
|
|
164
|
+
const serialized = responseMetadata.metadata?.[CACHE_WRITE_METADATA_KEY];
|
|
165
|
+
if (serialized == null) return;
|
|
166
|
+
const parsed = Number(serialized);
|
|
167
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
168
|
+
}
|
|
169
|
+
function attachCacheWriteUsage(message) {
|
|
170
|
+
const cacheWriteTokens = getCacheWriteTokens(message);
|
|
171
|
+
if (cacheWriteTokens == null || !(0, _langchain_core_messages.isAIMessage)(message) || message.usage_metadata == null) return;
|
|
172
|
+
message.usage_metadata.input_token_details = {
|
|
173
|
+
...message.usage_metadata.input_token_details,
|
|
174
|
+
cache_creation: cacheWriteTokens
|
|
175
|
+
};
|
|
176
|
+
const responseMetadata = message.response_metadata;
|
|
177
|
+
if (responseMetadata.metadata?.[CACHE_WRITE_METADATA_KEY] == null) return;
|
|
178
|
+
const metadata = { ...responseMetadata.metadata };
|
|
179
|
+
delete metadata[CACHE_WRITE_METADATA_KEY];
|
|
180
|
+
message.response_metadata = {
|
|
181
|
+
...message.response_metadata,
|
|
182
|
+
metadata
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function attachCacheWriteMetadata(response) {
|
|
186
|
+
const cacheWriteTokens = response.usage?.input_tokens_details.cache_write_tokens;
|
|
187
|
+
if (cacheWriteTokens == null) return response;
|
|
188
|
+
return {
|
|
189
|
+
...response,
|
|
190
|
+
metadata: {
|
|
191
|
+
...response.metadata ?? {},
|
|
192
|
+
[CACHE_WRITE_METADATA_KEY]: String(cacheWriteTokens)
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function isResponsesStream(result) {
|
|
197
|
+
return Symbol.asyncIterator in result;
|
|
198
|
+
}
|
|
38
199
|
function createUsageMetadata(usage) {
|
|
39
200
|
const usageMetadata = {
|
|
40
201
|
input_tokens: usage?.prompt_tokens ?? 0,
|
|
@@ -207,7 +368,7 @@ function getStreamChunkTokenIndices(chunk) {
|
|
|
207
368
|
completion
|
|
208
369
|
};
|
|
209
370
|
}
|
|
210
|
-
async function* delayStreamChunks(chunks, delay, signal, runManager) {
|
|
371
|
+
async function* delayStreamChunks(chunks, delay, signal, runManager, seenScalarMetadata) {
|
|
211
372
|
let lastYieldedAt;
|
|
212
373
|
for await (const chunk of chunks) {
|
|
213
374
|
const outputChunks = delay != null && delay > 0 ? splitTextGenerationChunk(chunk) : [chunk];
|
|
@@ -220,6 +381,7 @@ async function* delayStreamChunks(chunks, delay, signal, runManager) {
|
|
|
220
381
|
}
|
|
221
382
|
signal?.throwIfAborted();
|
|
222
383
|
lastYieldedAt = Date.now();
|
|
384
|
+
if (seenScalarMetadata != null) require_streamMetadata.dropRepeatedScalarMetadata(outputChunk, seenScalarMetadata);
|
|
223
385
|
await emitStreamChunkCallback(outputChunk, runManager);
|
|
224
386
|
signal?.throwIfAborted();
|
|
225
387
|
yield outputChunk;
|
|
@@ -342,11 +504,21 @@ var LibreChatOpenAICompletions = class extends _langchain_openai.ChatOpenAICompl
|
|
|
342
504
|
includeReasoningContent;
|
|
343
505
|
includeReasoningDetails;
|
|
344
506
|
convertReasoningDetailsToContent;
|
|
507
|
+
promptCacheExplicit;
|
|
508
|
+
safetyIdentifier;
|
|
345
509
|
constructor(fields) {
|
|
346
510
|
super(fields);
|
|
347
511
|
this.includeReasoningContent = fields?.includeReasoningContent;
|
|
348
512
|
this.includeReasoningDetails = fields?.includeReasoningDetails;
|
|
349
513
|
this.convertReasoningDetailsToContent = fields?.convertReasoningDetailsToContent;
|
|
514
|
+
this.promptCacheExplicit = fields?.promptCacheExplicit;
|
|
515
|
+
this.safetyIdentifier = fields?.safety_identifier;
|
|
516
|
+
}
|
|
517
|
+
invocationParams(options, extra) {
|
|
518
|
+
return applyManagedRequestParams(super.invocationParams(options, extra), {
|
|
519
|
+
promptCacheExplicit: this.promptCacheExplicit,
|
|
520
|
+
safetyIdentifier: this.safetyIdentifier
|
|
521
|
+
});
|
|
350
522
|
}
|
|
351
523
|
_getReasoningParams(options) {
|
|
352
524
|
return getReasoningParams(this.reasoning, options);
|
|
@@ -355,7 +527,10 @@ var LibreChatOpenAICompletions = class extends _langchain_openai.ChatOpenAICompl
|
|
|
355
527
|
return getCustomOpenAIClientOptions(this, options);
|
|
356
528
|
}
|
|
357
529
|
async completionWithRetry(request, requestOptions) {
|
|
358
|
-
return completionWithFilteredOpenAIStream(
|
|
530
|
+
return completionWithFilteredOpenAIStream(this.promptCacheExplicit === true ? {
|
|
531
|
+
...request,
|
|
532
|
+
messages: addChatCacheBreakpoints(request.messages)
|
|
533
|
+
} : request, requestOptions, super.completionWithRetry.bind(this));
|
|
359
534
|
}
|
|
360
535
|
_convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole) {
|
|
361
536
|
const message = attachLibreChatDeltaFields(super._convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole), delta);
|
|
@@ -535,6 +710,40 @@ var LibreChatOpenAICompletions = class extends _langchain_openai.ChatOpenAICompl
|
|
|
535
710
|
}
|
|
536
711
|
};
|
|
537
712
|
var LibreChatOpenAIResponses = class extends _langchain_openai.ChatOpenAIResponses {
|
|
713
|
+
promptCacheExplicit;
|
|
714
|
+
safetyIdentifier;
|
|
715
|
+
constructor(fields) {
|
|
716
|
+
super(fields);
|
|
717
|
+
this.promptCacheExplicit = fields?.promptCacheExplicit;
|
|
718
|
+
this.safetyIdentifier = fields?.safety_identifier;
|
|
719
|
+
}
|
|
720
|
+
invocationParams(options) {
|
|
721
|
+
const params = applyManagedRequestParams(super.invocationParams(options), {
|
|
722
|
+
promptCacheExplicit: this.promptCacheExplicit,
|
|
723
|
+
safetyIdentifier: this.safetyIdentifier
|
|
724
|
+
});
|
|
725
|
+
if (shouldIncludeEncryptedReasoning(this.model, params)) params.include = [...new Set([...params.include ?? [], "reasoning.encrypted_content"])];
|
|
726
|
+
return params;
|
|
727
|
+
}
|
|
728
|
+
async completionWithRetry(request, requestOptions) {
|
|
729
|
+
const managedRequest = {
|
|
730
|
+
...request,
|
|
731
|
+
input: this.promptCacheExplicit === true ? addResponseCacheBreakpoints(request.input) : request.input
|
|
732
|
+
};
|
|
733
|
+
const result = await super.completionWithRetry(managedRequest, requestOptions);
|
|
734
|
+
return isResponsesStream(result) ? result : attachCacheWriteMetadata(result);
|
|
735
|
+
}
|
|
736
|
+
async _generate(messages, options, runManager) {
|
|
737
|
+
const result = await super._generate(messages, options, runManager);
|
|
738
|
+
for (const generation of result.generations) attachCacheWriteUsage(generation.message);
|
|
739
|
+
return result;
|
|
740
|
+
}
|
|
741
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
742
|
+
for await (const chunk of super._streamResponseChunks(messages, options, runManager)) {
|
|
743
|
+
attachCacheWriteUsage(chunk.message);
|
|
744
|
+
yield chunk;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
538
747
|
_getReasoningParams(options) {
|
|
539
748
|
return getReasoningParams(this.reasoning, options);
|
|
540
749
|
}
|
|
@@ -543,6 +752,19 @@ var LibreChatOpenAIResponses = class extends _langchain_openai.ChatOpenAIRespons
|
|
|
543
752
|
}
|
|
544
753
|
};
|
|
545
754
|
var LibreChatAzureOpenAICompletions = class extends _langchain_openai.AzureChatOpenAICompletions {
|
|
755
|
+
promptCacheExplicit;
|
|
756
|
+
safetyIdentifier;
|
|
757
|
+
constructor(fields) {
|
|
758
|
+
super(fields);
|
|
759
|
+
this.promptCacheExplicit = fields?.promptCacheExplicit;
|
|
760
|
+
this.safetyIdentifier = fields?.safety_identifier;
|
|
761
|
+
}
|
|
762
|
+
invocationParams(options, extra) {
|
|
763
|
+
return applyManagedRequestParams(super.invocationParams(options, extra), {
|
|
764
|
+
promptCacheExplicit: this.promptCacheExplicit,
|
|
765
|
+
safetyIdentifier: this.safetyIdentifier
|
|
766
|
+
});
|
|
767
|
+
}
|
|
546
768
|
_getReasoningParams(options) {
|
|
547
769
|
return getGatedReasoningParams(this.model, this.reasoning, options);
|
|
548
770
|
}
|
|
@@ -601,10 +823,47 @@ var LibreChatAzureOpenAICompletions = class extends _langchain_openai.AzureChatO
|
|
|
601
823
|
return requestOptions;
|
|
602
824
|
}
|
|
603
825
|
async completionWithRetry(request, requestOptions) {
|
|
604
|
-
return completionWithFilteredOpenAIStream(
|
|
826
|
+
return completionWithFilteredOpenAIStream(this.promptCacheExplicit === true ? {
|
|
827
|
+
...request,
|
|
828
|
+
messages: addChatCacheBreakpoints(request.messages)
|
|
829
|
+
} : request, requestOptions, super.completionWithRetry.bind(this));
|
|
605
830
|
}
|
|
606
831
|
};
|
|
607
832
|
var LibreChatAzureOpenAIResponses = class extends _langchain_openai.AzureChatOpenAIResponses {
|
|
833
|
+
promptCacheExplicit;
|
|
834
|
+
safetyIdentifier;
|
|
835
|
+
constructor(fields) {
|
|
836
|
+
super(fields);
|
|
837
|
+
this.promptCacheExplicit = fields?.promptCacheExplicit;
|
|
838
|
+
this.safetyIdentifier = fields?.safety_identifier;
|
|
839
|
+
}
|
|
840
|
+
invocationParams(options) {
|
|
841
|
+
const params = applyManagedRequestParams(super.invocationParams(options), {
|
|
842
|
+
promptCacheExplicit: this.promptCacheExplicit,
|
|
843
|
+
safetyIdentifier: this.safetyIdentifier
|
|
844
|
+
});
|
|
845
|
+
if (shouldIncludeEncryptedReasoning(this.model, params)) params.include = [...new Set([...params.include ?? [], "reasoning.encrypted_content"])];
|
|
846
|
+
return params;
|
|
847
|
+
}
|
|
848
|
+
async completionWithRetry(request, requestOptions) {
|
|
849
|
+
const managedRequest = {
|
|
850
|
+
...request,
|
|
851
|
+
input: this.promptCacheExplicit === true ? addResponseCacheBreakpoints(request.input) : request.input
|
|
852
|
+
};
|
|
853
|
+
const result = await super.completionWithRetry(managedRequest, requestOptions);
|
|
854
|
+
return isResponsesStream(result) ? result : attachCacheWriteMetadata(result);
|
|
855
|
+
}
|
|
856
|
+
async _generate(messages, options, runManager) {
|
|
857
|
+
const result = await super._generate(messages, options, runManager);
|
|
858
|
+
for (const generation of result.generations) attachCacheWriteUsage(generation.message);
|
|
859
|
+
return result;
|
|
860
|
+
}
|
|
861
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
862
|
+
for await (const chunk of super._streamResponseChunks(messages, options, runManager)) {
|
|
863
|
+
attachCacheWriteUsage(chunk.message);
|
|
864
|
+
yield chunk;
|
|
865
|
+
}
|
|
866
|
+
}
|
|
608
867
|
_getReasoningParams(options) {
|
|
609
868
|
return getGatedReasoningParams(this.model, this.reasoning, options);
|
|
610
869
|
}
|
|
@@ -703,7 +962,15 @@ var ChatOpenAI = class extends _langchain_openai.ChatOpenAI {
|
|
|
703
962
|
return this.getReasoningParams(options);
|
|
704
963
|
}
|
|
705
964
|
async *_streamResponseChunks(messages, options, runManager) {
|
|
706
|
-
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
965
|
+
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager, /* @__PURE__ */ new Map());
|
|
966
|
+
}
|
|
967
|
+
/**
|
|
968
|
+
* Raw variant that skips scalar-metadata de-duplication. Used by subclasses
|
|
969
|
+
* (e.g. `ChatOpenRouter`) that read `finish_reason` as a control signal and
|
|
970
|
+
* must de-duplicate only after their own finalization.
|
|
971
|
+
*/
|
|
972
|
+
_streamRawResponseChunks(messages, options, runManager) {
|
|
973
|
+
return delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
707
974
|
}
|
|
708
975
|
};
|
|
709
976
|
var AzureChatOpenAI = class extends _langchain_openai.AzureChatOpenAI {
|
|
@@ -777,7 +1044,7 @@ var AzureChatOpenAI = class extends _langchain_openai.AzureChatOpenAI {
|
|
|
777
1044
|
return requestOptions;
|
|
778
1045
|
}
|
|
779
1046
|
async *_streamResponseChunks(messages, options, runManager) {
|
|
780
|
-
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
1047
|
+
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager, /* @__PURE__ */ new Map());
|
|
781
1048
|
}
|
|
782
1049
|
};
|
|
783
1050
|
var ChatDeepSeek = class extends _langchain_deepseek.ChatDeepSeek {
|
|
@@ -848,7 +1115,7 @@ var ChatDeepSeek = class extends _langchain_deepseek.ChatDeepSeek {
|
|
|
848
1115
|
};
|
|
849
1116
|
}
|
|
850
1117
|
async *_streamResponseChunks(messages, options, runManager) {
|
|
851
|
-
yield* delayStreamChunks(this._streamResponseChunksWithReasoning(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
1118
|
+
yield* delayStreamChunks(this._streamResponseChunksWithReasoning(messages, options, void 0), this._lc_stream_delay, options.signal, runManager, /* @__PURE__ */ new Map());
|
|
852
1119
|
}
|
|
853
1120
|
/** Parses raw `<think>` fallback tags across chunks and emits sanitized DeepSeek stream chunks. */
|
|
854
1121
|
async *_streamResponseChunksWithReasoning(messages, options, runManager) {
|
|
@@ -1081,7 +1348,7 @@ var ChatXAI = class extends _langchain_xai.ChatXAI {
|
|
|
1081
1348
|
};
|
|
1082
1349
|
}
|
|
1083
1350
|
async *_streamResponseChunks(messages, options, runManager) {
|
|
1084
|
-
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
1351
|
+
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager, /* @__PURE__ */ new Map());
|
|
1085
1352
|
}
|
|
1086
1353
|
};
|
|
1087
1354
|
//#endregion
|