librechat-data-provider 0.8.508 → 0.8.521

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 (42) hide show
  1. package/dist/{data-service-DN-HeTC-.js → data-service-DOIF4BkW.js} +1211 -92
  2. package/dist/data-service-DOIF4BkW.js.map +1 -0
  3. package/dist/{data-service-DgNwjhBS.mjs → data-service-pwrlWjJs.mjs} +1062 -93
  4. package/dist/data-service-pwrlWjJs.mjs.map +1 -0
  5. package/dist/index.js +472 -57
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +440 -58
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/react-query/index.js +1 -1
  10. package/dist/react-query/index.js.map +1 -1
  11. package/dist/react-query/index.mjs +1 -1
  12. package/dist/react-query/index.mjs.map +1 -1
  13. package/dist/types/actions.d.ts +1 -1
  14. package/dist/types/api-endpoints.d.ts +11 -2
  15. package/dist/types/bedrock.d.ts +57 -0
  16. package/dist/types/config.d.ts +4230 -183
  17. package/dist/types/data-service.d.ts +28 -14
  18. package/dist/types/feedback.d.ts +9 -1
  19. package/dist/types/file-config.d.ts +41 -5
  20. package/dist/types/generate.d.ts +8 -0
  21. package/dist/types/keys.d.ts +7 -2
  22. package/dist/types/mcp.d.ts +45 -24
  23. package/dist/types/messages.d.ts +8 -0
  24. package/dist/types/models.d.ts +120 -0
  25. package/dist/types/parameterSettings.d.ts +2 -2
  26. package/dist/types/parsers.d.ts +3 -1
  27. package/dist/types/react-query/react-query-service.d.ts +2 -7
  28. package/dist/types/request.d.ts +3 -1
  29. package/dist/types/schemas.d.ts +211 -11
  30. package/dist/types/types/agents.d.ts +211 -1
  31. package/dist/types/types/assistants.d.ts +77 -5
  32. package/dist/types/types/files.d.ts +18 -7
  33. package/dist/types/types/mcpServers.d.ts +25 -0
  34. package/dist/types/types/mutations.d.ts +1 -0
  35. package/dist/types/types/queries.d.ts +17 -3
  36. package/dist/types/types/runs.d.ts +114 -25
  37. package/dist/types/types/skills.d.ts +25 -6
  38. package/dist/types/types.d.ts +117 -2
  39. package/dist/types/upload.d.ts +2 -0
  40. package/package.json +4 -4
  41. package/dist/data-service-DN-HeTC-.js.map +0 -1
  42. package/dist/data-service-DgNwjhBS.mjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_data_service = require("./data-service-DN-HeTC-.js");
2
+ const require_data_service = require("./data-service-DOIF4BkW.js");
3
3
  let zod = require("zod");
4
4
  let dayjs = require("dayjs");
5
5
  dayjs = require_data_service.__toESM(dayjs);
@@ -14,10 +14,13 @@ let crypto = require("crypto");
14
14
  crypto = require_data_service.__toESM(crypto);
15
15
  let js_yaml = require("js-yaml");
16
16
  //#region src/bedrock.ts
17
- const DEFAULT_ENABLED_MAX_TOKENS = 8192;
18
17
  const DEFAULT_THINKING_BUDGET = 2e3;
18
+ const BEDROCK_CLAUDE_SONNET_4_6_MAX_OUTPUT = 64e3;
19
19
  const BEDROCK_OUTPUT_128K_BETA = "output-128k-2025-02-19";
20
20
  const BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA = "fine-grained-tool-streaming-2025-05-14";
21
+ /** Betas LibreChat injects itself, safe to strip from persisted AMRF when a
22
+ * model no longer supports them; anything else in `anthropic_beta` is a user opt-in. */
23
+ const GENERATED_BEDROCK_BETAS = new Set([BEDROCK_OUTPUT_128K_BETA, BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA]);
21
24
  const bedrockReasoningConfigValues = new Set(Object.values(require_data_service.BedrockReasoningConfig));
22
25
  /**
23
26
  * Resolves the final `thinking.display` value for an adaptive-thinking request.
@@ -62,14 +65,14 @@ function parseOpusVersion(model) {
62
65
  return null;
63
66
  }
64
67
  /** Extracts sonnet major/minor version from both naming formats.
65
- * Uses single-digit minor capture to avoid matching date suffixes (e.g., -20250514). */
68
+ * Uses bounded minor capture to avoid matching date suffixes (e.g., -20250514). */
66
69
  function parseSonnetVersion(model) {
67
- const nameFirst = model.match(/claude-sonnet[-.]?(\d+)(?:[-.](\d)(?!\d))?/);
70
+ const nameFirst = model.match(/claude-sonnet[-.]?(\d+)(?:[-.](\d{1,2})(?!\d))?/);
68
71
  if (nameFirst) return {
69
72
  major: parseInt(nameFirst[1], 10),
70
73
  minor: nameFirst[2] != null ? parseInt(nameFirst[2], 10) : 0
71
74
  };
72
- const numFirst = model.match(/claude-(\d+)(?:[-.](\d)(?!\d))?-sonnet/);
75
+ const numFirst = model.match(/claude-(\d+)(?:[-.](\d{1,2})(?!\d))?-sonnet/);
73
76
  if (numFirst) return {
74
77
  major: parseInt(numFirst[1], 10),
75
78
  minor: numFirst[2] != null ? parseInt(numFirst[2], 10) : 0
@@ -103,15 +106,80 @@ function supportsAdaptiveThinking(model) {
103
106
  function omitsThinkingByDefault(model) {
104
107
  const opus = parseOpusVersion(model);
105
108
  if (opus && (opus.major > 4 || opus.major === 4 && opus.minor >= 7)) return true;
109
+ const sonnet = parseSonnetVersion(model);
110
+ if (sonnet != null && sonnet.major >= 5) return true;
106
111
  if (require_data_service.isMythosClassModel(model)) return true;
107
112
  return false;
108
113
  }
109
114
  function omitsSamplingParameters(model) {
110
115
  const opus = parseOpusVersion(model);
111
116
  if (opus && (opus.major > 4 || opus.major === 4 && opus.minor >= 7)) return true;
117
+ const sonnet = parseSonnetVersion(model);
118
+ if (sonnet != null && sonnet.major >= 5) return true;
112
119
  if (require_data_service.isMythosClassModel(model)) return true;
113
120
  return false;
114
121
  }
122
+ /**
123
+ * Whether disabling thinking requires sending an explicit `{ type: 'disabled' }`
124
+ * config rather than simply omitting the `thinking` field.
125
+ *
126
+ * Sonnet 5 and Opus 5 treat an omitted `thinking` field as adaptive thinking ON
127
+ * by default, so honoring a user who turns thinking off means sending the
128
+ * disabled config explicitly. Opus 4.7/4.8 run without thinking when the field
129
+ * is omitted, and Fable/Mythos reject an explicit disabled config (400,
130
+ * thinking always on), so both are excluded.
131
+ *
132
+ * See https://platform.claude.com/docs/en/about-claude/models/migration-guide#migrating-to-claude-sonnet-5
133
+ */
134
+ function requiresExplicitThinkingDisabled(model) {
135
+ const sonnet = parseSonnetVersion(model);
136
+ if (sonnet != null && sonnet.major >= 5) return true;
137
+ const opus = parseOpusVersion(model);
138
+ return opus != null && opus.major >= 5;
139
+ }
140
+ /** Effort levels Opus 5 rejects while thinking is explicitly disabled. */
141
+ const EFFORTS_REJECTED_WHEN_THINKING_DISABLED = new Set(["xhigh", "max"]);
142
+ /**
143
+ * Whether the model caps `output_config.effort` while thinking is disabled.
144
+ *
145
+ * Opus 5 rejects `xhigh`/`max` in that combination with a 400: "output_config
146
+ * .effort 'xhigh' is not supported when thinking is disabled on this model. Use
147
+ * effort 'high' or below, or enable thinking." Opus 4.7/4.8, Sonnet 5, and
148
+ * Sonnet 4.6 accept every effort level they otherwise support with thinking
149
+ * off, so the cap is Opus 5+ only.
150
+ */
151
+ function capsEffortWhenThinkingDisabled(model) {
152
+ const opus = parseOpusVersion(model);
153
+ return opus != null && opus.major >= 5;
154
+ }
155
+ /**
156
+ * Lowers an effort level the model would reject while thinking is disabled to
157
+ * the highest accepted value (`high`, which is also the API default). Returns
158
+ * the effort unchanged when the combination is valid.
159
+ */
160
+ function clampEffortForDisabledThinking(model, effort) {
161
+ if (capsEffortWhenThinkingDisabled(model) && EFFORTS_REJECTED_WHEN_THINKING_DISABLED.has(effort)) return "high";
162
+ return effort;
163
+ }
164
+ /** An `output_config` container carrying a usable effort level. */
165
+ function hasStringEffort(value) {
166
+ if (typeof value !== "object" || value === null || !("effort" in value)) return false;
167
+ return typeof value.effort === "string";
168
+ }
169
+ /**
170
+ * Clamps an `output_config.effort` in place when the model would reject it
171
+ * while thinking is disabled. No-op when the container carries no string
172
+ * effort, so callers can pass a possibly-absent config directly.
173
+ */
174
+ function clampOutputConfigEffort(model, outputConfig) {
175
+ if (!hasStringEffort(outputConfig)) return;
176
+ outputConfig.effort = clampEffortForDisabledThinking(model, outputConfig.effort);
177
+ }
178
+ /** Whether a resolved thinking config is an explicit `{ type: 'disabled' }`. */
179
+ function isThinkingDisabled(thinking) {
180
+ if (typeof thinking !== "object" || thinking === null || !("type" in thinking)) return false;
181
+ return thinking.type === "disabled";
182
+ }
115
183
  /** Checks if a model has a 1M context window (Sonnet 4.6+, Opus 4.6+, Opus 5+, Fable/Mythos) */
116
184
  function supportsContext1m(model) {
117
185
  const sonnet = parseSonnetVersion(model);
@@ -122,6 +190,19 @@ function supportsContext1m(model) {
122
190
  return false;
123
191
  }
124
192
  /**
193
+ * A Bedrock Claude model ID may be prefixed (`anthropic.claude-*`,
194
+ * `us.anthropic.claude-*`, `global.anthropic.claude-*`) or bare (`claude-*`,
195
+ * used when the LibreChat model ID maps to an application inference profile).
196
+ * Match on the `claude` family token so every form is recognized — requiring
197
+ * the literal `anthropic.` prefix silently dropped thinking config, beta
198
+ * headers, and sampling handling for inference-profile deployments.
199
+ */
200
+ const BEDROCK_CLAUDE_4PLUS_THINKING = /claude-(?:[4-9](?:\.\d+)?(?:-\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/;
201
+ /** Whether a Bedrock model ID is an Anthropic Claude model (prefixed or bare). */
202
+ function isBedrockClaudeModel(model) {
203
+ return model.includes("claude");
204
+ }
205
+ /**
125
206
  * Gets the appropriate anthropic_beta headers for Bedrock Anthropic models.
126
207
  * Bedrock uses `anthropic_beta` (with underscore) in additionalModelRequestFields.
127
208
  *
@@ -132,19 +213,33 @@ function getBedrockAnthropicBetaHeaders(model) {
132
213
  const betaHeaders = [];
133
214
  /** Mythos-class (Fable/Mythos) is intentionally not matched: these betas are built-in/no-op for the
134
215
  * 4.7+ generation (Fable has native 128K output), so omitting them on Bedrock is lossless. */
135
- const isClaude4PlusModel = /anthropic\.claude-(?:[4-9](?:\.\d+)?(?:-\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/.test(model);
136
- if (model.includes("anthropic.claude-3-7-sonnet") || isClaude4PlusModel) betaHeaders.push(BEDROCK_OUTPUT_128K_BETA);
216
+ const isClaude4PlusModel = BEDROCK_CLAUDE_4PLUS_THINKING.test(model);
217
+ if (model.includes("claude-3-7-sonnet") || isClaude4PlusModel) betaHeaders.push(BEDROCK_OUTPUT_128K_BETA);
137
218
  if (isClaude4PlusModel) betaHeaders.push(BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA);
138
219
  return betaHeaders;
139
220
  }
221
+ /** Flatten an anthropic_beta value (array, single string, or comma-delimited
222
+ * string) into trimmed, non-empty header tokens. */
223
+ function normalizeBetaHeaders(value) {
224
+ let values = [];
225
+ if (Array.isArray(value)) values = value;
226
+ else if (typeof value === "string") values = [value];
227
+ const headers = [];
228
+ values.forEach((entry) => {
229
+ if (typeof entry !== "string") return;
230
+ entry.split(",").map((header) => header.trim()).filter(Boolean).forEach((header) => headers.push(header));
231
+ });
232
+ return headers;
233
+ }
140
234
  function mergeBedrockAnthropicBetaHeaders(existing, generated) {
141
- let existingValues = [];
142
- if (Array.isArray(existing)) existingValues = existing;
143
- else if (typeof existing === "string") existingValues = [existing];
235
+ const generatedSet = new Set(generated);
144
236
  const betaHeaders = /* @__PURE__ */ new Set();
145
- [...existingValues, ...generated].forEach((value) => {
146
- if (typeof value !== "string") return;
147
- value.split(",").map((header) => header.trim()).filter(Boolean).forEach((header) => betaHeaders.add(header));
237
+ [...normalizeBetaHeaders(existing), ...generated].forEach((header) => {
238
+ /** Drop a generated beta carried over from a prior model that the current
239
+ * model does not generate (e.g. fine-grained-tool-streaming on a 3.7
240
+ * profile); user opt-ins are always preserved. */
241
+ if (GENERATED_BEDROCK_BETAS.has(header) && !generatedSet.has(header)) return;
242
+ betaHeaders.add(header);
148
243
  });
149
244
  return Array.from(betaHeaders);
150
245
  }
@@ -178,7 +273,7 @@ const bedrockInputSchema = require_data_service.tConversationSchema.pick({
178
273
  }).transform((obj) => {
179
274
  if (obj.additionalModelRequestFields?.thinking != null) {
180
275
  const thinking = obj.additionalModelRequestFields.thinking;
181
- obj.thinking = !!thinking;
276
+ obj.thinking = typeof thinking === "object" && thinking !== null && thinking.type === "disabled" ? false : !!thinking;
182
277
  obj.thinkingBudget = typeof thinking === "object" && "budget_tokens" in thinking ? thinking.budget_tokens : void 0;
183
278
  if (obj.thinkingDisplay == null) {
184
279
  const persistedDisplay = extractPersistedDisplay({ thinking });
@@ -245,16 +340,49 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
245
340
  delete typedData[key];
246
341
  }
247
342
  });
248
- /** Configure thinking for Bedrock Anthropic models: 3.7 Sonnet, Claude 4+ (opus/sonnet/haiku), and Mythos-class (Fable/Mythos). */
249
- if (typeof typedData.model === "string" && (typedData.model.includes("anthropic.claude-3-7-sonnet") || /anthropic\.claude-(?:[4-9](?:\.\d+)?(?:-\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/.test(typedData.model) || require_data_service.isMythosClassModel(typedData.model))) {
343
+ /**
344
+ * Persisted `model_parameters` can carry a prior "thinking off" only inside
345
+ * `additionalModelRequestFields.thinking = { type: 'disabled' }` (a known
346
+ * key that isn't spread into `additionalFields`). `initializeBedrock` feeds
347
+ * those params straight through this parser, so surface that as
348
+ * `thinking: false` — otherwise the disabled branch is skipped and the
349
+ * config rebuilds adaptive, flipping a user's Sonnet 5 setting back on.
350
+ */
351
+ const persistedThinking = typedData.additionalModelRequestFields?.thinking;
352
+ if (additionalFields.thinking === void 0 && typeof persistedThinking === "object" && persistedThinking !== null && persistedThinking.type === "disabled") additionalFields.thinking = false;
353
+ /** Bedrock thinking-capable Claude models: 3.7 Sonnet, Claude 4+ (opus/sonnet/haiku), and Mythos-class (Fable/Mythos). */
354
+ const isThinkingModel = typeof typedData.model === "string" && (typedData.model.includes("claude-3-7-sonnet") || BEDROCK_CLAUDE_4PLUS_THINKING.test(typedData.model) || require_data_service.isMythosClassModel(typedData.model));
355
+ if (isThinkingModel) {
250
356
  if (supportsAdaptiveThinking(typedData.model)) {
357
+ /** Persisted AMRF is spread into the final request, so clearing only
358
+ * `additionalFields` leaves a stale value from a prior selection. */
359
+ const persistedAmrf = typedData.additionalModelRequestFields;
360
+ const thinkingDisabled = additionalFields.thinking === false;
251
361
  const effort = additionalFields.effort;
252
- if (effort && typeof effort === "string" && effort !== "") additionalFields.output_config = { effort };
362
+ if (typeof effort === "string" && effort !== "") additionalFields.output_config = { effort };
363
+ else if (effort !== void 0 && persistedAmrf)
364
+ /** Explicit unset ('' or null) clears the persisted effort. An absent
365
+ * effort (agent resume, where the prior llmConfig persisted
366
+ * `output_config` but no top-level `effort`) preserves it. */
367
+ delete persistedAmrf.output_config;
253
368
  delete additionalFields.effort;
369
+ /**
370
+ * Opus 5 rejects `xhigh`/`max` effort while thinking is disabled, so
371
+ * clamp both the effort derived above and any effort still carried in
372
+ * persisted AMRF (agent resume sends `output_config` with no top-level
373
+ * `effort`, so the branch above leaves it untouched).
374
+ */
375
+ if (thinkingDisabled) [additionalFields, persistedAmrf].forEach((target) => clampOutputConfigEffort(typedData.model, target?.output_config));
254
376
  if (additionalFields.thinking === false) {
255
- delete additionalFields.thinking;
256
377
  delete additionalFields.thinkingBudget;
257
378
  delete additionalFields.thinkingDisplay;
379
+ if (requiresExplicitThinkingDisabled(typedData.model)) additionalFields.thinking = { type: "disabled" };
380
+ else {
381
+ delete additionalFields.thinking;
382
+ /** Disable-by-omission models (Opus 4.7+): drop the persisted
383
+ * adaptive config so turning thinking off actually disables it. */
384
+ if (persistedAmrf) delete persistedAmrf.thinking;
385
+ }
258
386
  } else {
259
387
  /**
260
388
  * Persisted agent `model_parameters` round-trip back through this
@@ -282,10 +410,18 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
282
410
  if (additionalFields.thinking === true && additionalFields.thinkingBudget === void 0) additionalFields.thinkingBudget = DEFAULT_THINKING_BUDGET;
283
411
  delete additionalFields.effort;
284
412
  delete additionalFields.thinkingDisplay;
413
+ /** A bare non-adaptive thinking profile (e.g. `claude-3-7-sonnet`) must
414
+ * not inherit an adaptive/disabled thinking object or `output_config`
415
+ * persisted from another model; this branch's own fields are authoritative. */
416
+ const persistedAmrf = typedData.additionalModelRequestFields;
417
+ if (persistedAmrf) {
418
+ delete persistedAmrf.thinking;
419
+ delete persistedAmrf.output_config;
420
+ }
285
421
  }
286
422
  /** Anthropic uses 'effort' via output_config, not reasoning_config */
287
423
  delete additionalFields.reasoning_effort;
288
- if (typedData.model.includes("anthropic.")) {
424
+ if (isBedrockClaudeModel(typedData.model)) {
289
425
  const betaHeaders = getBedrockAnthropicBetaHeaders(typedData.model);
290
426
  if (betaHeaders.length > 0) {
291
427
  const existingBetaHeaders = typedData.additionalModelRequestFields?.anthropic_beta;
@@ -303,7 +439,7 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
303
439
  delete additionalFields.reasoning_effort;
304
440
  if (typeof reasoningEffort === "string" && bedrockReasoningConfigValues.has(reasoningEffort)) additionalFields.reasoning_config = reasoningEffort;
305
441
  }
306
- const isAnthropicModel = typeof typedData.model === "string" && typedData.model.includes("anthropic.");
442
+ const isAnthropicModel = typeof typedData.model === "string" && isBedrockClaudeModel(typedData.model);
307
443
  /** Strip stale fields from previously-persisted additionalModelRequestFields */
308
444
  if (typeof typedData.additionalModelRequestFields === "object" && typedData.additionalModelRequestFields != null) {
309
445
  const amrf = typedData.additionalModelRequestFields;
@@ -317,6 +453,22 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
317
453
  } else {
318
454
  delete amrf.reasoning_config;
319
455
  delete amrf.reasoning_effort;
456
+ /** A Claude model that does not support Bedrock thinking (e.g. a bare
457
+ * `claude-3-5-sonnet` inference profile) must not carry stale thinking
458
+ * fields from a previously-selected thinking model. Drop only the
459
+ * LibreChat-generated betas (output-128k, fine-grained tool streaming);
460
+ * user opt-ins in `anthropic_beta` are preserved. */
461
+ if (!isThinkingModel) {
462
+ delete amrf.thinking;
463
+ delete amrf.thinkingBudget;
464
+ delete amrf.effort;
465
+ delete amrf.output_config;
466
+ if (amrf.anthropic_beta !== void 0) {
467
+ const kept = normalizeBetaHeaders(amrf.anthropic_beta).filter((header) => !GENERATED_BEDROCK_BETAS.has(header));
468
+ if (kept.length > 0) amrf.anthropic_beta = kept;
469
+ else delete amrf.anthropic_beta;
470
+ }
471
+ }
320
472
  }
321
473
  if (shouldOmitSamplingParameters) {
322
474
  delete amrf.temperature;
@@ -359,11 +511,37 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
359
511
  * @param data - The parsed Bedrock request options object
360
512
  * @returns The object with thinking configured appropriately
361
513
  */
514
+ /**
515
+ * `anthropicSettings.maxOutputTokens.reset` only matches the canonical
516
+ * family-first id (`claude-sonnet-5`); Bedrock also accepts number-first
517
+ * aliases (`claude-5-sonnet`, `claude-4-7-sonnet`) that this file gates as
518
+ * thinking models. Canonicalize to family-first so those aliases resolve to the
519
+ * real ceiling instead of the 8192 fallback.
520
+ */
521
+ function toFamilyFirstClaudeId(model) {
522
+ return model.replace(/claude-(\d+(?:[-.]\d+)?)-(sonnet|opus|haiku)/, "claude-$2-$1");
523
+ }
524
+ function isBedrockClaudeSonnet46(model) {
525
+ return /claude-sonnet[-.]?4[-.]?6(?=$|[^0-9])/.test(toFamilyFirstClaudeId(model));
526
+ }
527
+ /**
528
+ * Thinking tokens share the `maxTokens` output budget with tool-call arguments
529
+ * (e.g. a `create_file` `content`), so a low default truncates large authored
530
+ * files mid-argument. Mirror the direct-Anthropic path and default to the
531
+ * model's full max output when the request does not set one explicitly.
532
+ */
533
+ function resolveThinkingMaxTokens(data) {
534
+ const explicit = data.maxTokens ?? data.maxOutputTokens;
535
+ if (typeof explicit === "number" && explicit > 0) return explicit;
536
+ const model = typeof data.model === "string" ? data.model : "";
537
+ if (isBedrockClaudeSonnet46(model)) return BEDROCK_CLAUDE_SONNET_4_6_MAX_OUTPUT;
538
+ return require_data_service.anthropicSettings.maxOutputTokens.reset(toFamilyFirstClaudeId(model));
539
+ }
362
540
  function configureThinking(data) {
363
541
  const updatedData = { ...data };
364
542
  const thinking = updatedData.additionalModelRequestFields?.thinking;
365
543
  if (thinking === true) {
366
- updatedData.maxTokens = updatedData.maxTokens ?? updatedData.maxOutputTokens ?? DEFAULT_ENABLED_MAX_TOKENS;
544
+ updatedData.maxTokens = resolveThinkingMaxTokens(updatedData);
367
545
  delete updatedData.maxOutputTokens;
368
546
  const thinkingConfig = {
369
547
  type: "enabled",
@@ -373,12 +551,30 @@ function configureThinking(data) {
373
551
  updatedData.additionalModelRequestFields.thinking = thinkingConfig;
374
552
  delete updatedData.additionalModelRequestFields.thinkingBudget;
375
553
  } else if (typeof thinking === "object" && thinking != null && thinking.type === "adaptive") {
376
- if (updatedData.maxTokens == null && updatedData.maxOutputTokens != null) updatedData.maxTokens = updatedData.maxOutputTokens;
554
+ updatedData.maxTokens = resolveThinkingMaxTokens(updatedData);
377
555
  delete updatedData.maxOutputTokens;
378
556
  delete updatedData.additionalModelRequestFields.thinkingBudget;
379
557
  }
380
558
  return updatedData;
381
559
  }
560
+ /** Top-level Converse request fields (issue #14029: `system` from a preset).
561
+ * The input parser's catch-all routes unknown keys into
562
+ * additionalModelRequestFields, and Bedrock rejects any that collide with a
563
+ * field the request already sends (`messages`/`modelId` always,
564
+ * `inferenceConfig` whenever maxTokens is set, `toolConfig` for agents). */
565
+ const RESERVED_CONVERSE_FIELDS = [
566
+ "system",
567
+ "messages",
568
+ "modelId",
569
+ "toolConfig",
570
+ "inferenceConfig",
571
+ "guardrailConfig",
572
+ "promptVariables",
573
+ "requestMetadata",
574
+ "performanceConfig",
575
+ "additionalModelRequestFields",
576
+ "additionalModelResponseFieldPaths"
577
+ ];
382
578
  const bedrockOutputParser = (data) => {
383
579
  const knownKeys = [
384
580
  ...Object.keys(require_data_service.tConversationSchema.shape),
@@ -397,7 +593,15 @@ const bedrockOutputParser = (data) => {
397
593
  if (result.maxTokens !== void 0 && result.maxOutputTokens === void 0) result.maxOutputTokens = result.maxTokens;
398
594
  else if (result.maxOutputTokens !== void 0 && result.maxTokens === void 0) result.maxTokens = result.maxOutputTokens;
399
595
  result = configureThinking(result);
400
- const amrf = result.additionalModelRequestFields;
596
+ let amrf = result.additionalModelRequestFields;
597
+ if (amrf && typeof amrf === "object") {
598
+ const reserved = RESERVED_CONVERSE_FIELDS.filter((key) => key in (amrf ?? {}));
599
+ if (reserved.length > 0) {
600
+ amrf = { ...amrf };
601
+ for (const key of reserved) delete amrf[key];
602
+ result.additionalModelRequestFields = amrf;
603
+ }
604
+ }
401
605
  if (!amrf || Object.keys(amrf).length === 0) delete result.additionalModelRequestFields;
402
606
  return result;
403
607
  };
@@ -414,6 +618,8 @@ let ContentTypes = /* @__PURE__ */ function(ContentTypes) {
414
618
  ContentTypes["INPUT_AUDIO"] = "input_audio";
415
619
  ContentTypes["AGENT_UPDATE"] = "agent_update";
416
620
  ContentTypes["SUMMARY"] = "summary";
621
+ ContentTypes["ACTIVITY_LABEL"] = "activity_label";
622
+ ContentTypes["STEER"] = "steer";
417
623
  ContentTypes["ERROR"] = "error";
418
624
  return ContentTypes;
419
625
  }({});
@@ -442,6 +648,7 @@ let StepEvents = /* @__PURE__ */ function(StepEvents) {
442
648
  StepEvents["ON_SUMMARIZE_DELTA"] = "on_summarize_delta";
443
649
  StepEvents["ON_SUMMARIZE_COMPLETE"] = "on_summarize_complete";
444
650
  StepEvents["ON_SUBAGENT_UPDATE"] = "on_subagent_update";
651
+ StepEvents["ON_SANDBOX_STARTING"] = "on_sandbox_starting";
445
652
  return StepEvents;
446
653
  }({});
447
654
  /** Token-tracking event names streamed to the client (separate from StepEvents dispatch). */
@@ -451,6 +658,38 @@ let UsageEvents = /* @__PURE__ */ function(UsageEvents) {
451
658
  return UsageEvents;
452
659
  }({});
453
660
  /**
661
+ * Human-in-the-loop event names. Streamed to live clients when a run pauses for
662
+ * tool approval (or an ask-user question). Reconnecting clients instead read the
663
+ * same record from `resumeState.pendingAction` on the sync event / status route.
664
+ */
665
+ let ApprovalEvents = /* @__PURE__ */ function(ApprovalEvents) {
666
+ ApprovalEvents["ON_PENDING_ACTION"] = "on_pending_action";
667
+ return ApprovalEvents;
668
+ }({});
669
+ /**
670
+ * Steering event names. `on_steer_applied` streams to live clients when a
671
+ * queued steer message is injected at a tool-batch boundary; reconnecting
672
+ * clients recover injected steers from `aggregatedContent` and still-queued
673
+ * ones from `resumeState.pendingSteers`. Steers that never reach a boundary
674
+ * ride the final/abort events as `pendingSteers`.
675
+ */
676
+ let SteerEvents = /* @__PURE__ */ function(SteerEvents) {
677
+ SteerEvents["ON_STEER_APPLIED"] = "on_steer_applied";
678
+ /** Durable capability correction for queued steers after HITL handover. */
679
+ SteerEvents["ON_STEER_UPDATED"] = "on_steer_updated";
680
+ return SteerEvents;
681
+ }({});
682
+ /**
683
+ * Activity-label event names. `on_activity_label` streams to live clients
684
+ * when a tool-batch or parent-phase label part is claimed and again when the
685
+ * fast-model label resolves; reconnecting clients recover applied labels
686
+ * from `aggregatedContent` like any other content part.
687
+ */
688
+ let ActivityLabelEvents = /* @__PURE__ */ function(ActivityLabelEvents) {
689
+ ActivityLabelEvents["ON_ACTIVITY_LABEL"] = "on_activity_label";
690
+ return ActivityLabelEvents;
691
+ }({});
692
+ /**
454
693
  * Full prompt token count for one completed model call — the EXACT context the
455
694
  * model saw, provider-aware: additive providers (Bedrock) report `input_tokens`
456
695
  * excluding cache, so cache reads/writes are added back; subset providers
@@ -657,19 +896,21 @@ const parseCompactConvo = ({ endpoint, endpointType, conversation, possibleValue
657
896
  if (models && convo) convo.model = getFirstDefinedValue(models) ?? convo.model;
658
897
  return convo;
659
898
  };
660
- function parseTextParts(contentParts, skipReasoning = false) {
899
+ function parseTextParts(contentParts, skipReasoning = false, options) {
661
900
  let result = "";
901
+ const append = (textValue) => {
902
+ if (result.length > 0 && textValue.length > 0 && result[result.length - 1] !== " " && textValue[0] !== " ") result += " ";
903
+ result += textValue;
904
+ };
662
905
  for (const part of contentParts) {
663
906
  if (!part?.type) continue;
664
- if (part.type === "text") {
665
- const textValue = (typeof part.text === "string" ? part.text : part.text?.value) || "";
666
- if (result.length > 0 && textValue.length > 0 && result[result.length - 1] !== " " && textValue[0] !== " ") result += " ";
667
- result += textValue;
668
- } else if (part.type === "think" && !skipReasoning) {
669
- const textValue = typeof part.think === "string" ? part.think : "";
670
- if (result.length > 0 && textValue.length > 0 && result[result.length - 1] !== " " && textValue[0] !== " ") result += " ";
671
- result += textValue;
672
- }
907
+ if (part.type === "text") append((typeof part.text === "string" ? part.text : part.text?.value) || "");
908
+ else if (part.type === "steer" && options?.includeSteer === true)
909
+ /** Mid-run user speech: excluded by default so generic extraction (TTS
910
+ * reading assistant output) never speaks the user's own words — the
911
+ * full-record surfaces (search indexing, persisted abort text) opt in. */
912
+ append(typeof part.steer === "string" ? part.steer : "");
913
+ else if (part.type === "think" && !skipReasoning) append(typeof part.think === "string" ? part.think : "");
673
914
  }
674
915
  return result;
675
916
  }
@@ -1015,14 +1256,27 @@ function mapGroupToAzureConfig({ groupName, groupMap }) {
1015
1256
  }
1016
1257
  //#endregion
1017
1258
  //#region src/messages.ts
1259
+ /**
1260
+ * Builds the render tree from the flat messages array. Order-robust: live
1261
+ * stream/steer/preempt cache writes can momentarily place a child before its
1262
+ * parent, and a single-pass link would hoist such rows into phantom root
1263
+ * branches — folding the visible thread to one dangling branch until a
1264
+ * refetch restores creation order. Linking happens only after every message
1265
+ * is indexed, so array order never changes the tree shape.
1266
+ */
1018
1267
  function buildTree({ messages, fileMap }) {
1019
1268
  if (messages === null) return null;
1020
1269
  const messageMap = {};
1270
+ const orderedMessages = [];
1021
1271
  const rootMessages = [];
1022
1272
  const childrenCount = {};
1023
- messages.forEach((message) => {
1024
- if (!message) return;
1025
- const parentId = message.parentMessageId ?? "";
1273
+ for (const message of messages) {
1274
+ if (!message) continue;
1275
+ /** A self-parented row can never link under itself (it becomes a root),
1276
+ * so count it with the parentless group — charging its own id would
1277
+ * inflate the sibling indices of its real children past
1278
+ * `children.length`. */
1279
+ const parentId = message.parentMessageId === message.messageId ? "" : message.parentMessageId ?? "";
1026
1280
  childrenCount[parentId] = (childrenCount[parentId] || 0) + 1;
1027
1281
  const extendedMessage = {
1028
1282
  ...message,
@@ -1032,12 +1286,39 @@ function buildTree({ messages, fileMap }) {
1032
1286
  };
1033
1287
  if (message.files && fileMap) extendedMessage.files = message.files.map((file) => fileMap[file.file_id ?? ""] ?? file);
1034
1288
  messageMap[message.messageId] = extendedMessage;
1035
- const parentMessage = messageMap[parentId];
1036
- if (parentMessage) {
1037
- parentMessage.children.push(extendedMessage);
1038
- extendedMessage.depth = parentMessage.depth + 1;
1039
- } else rootMessages.push(extendedMessage);
1040
- });
1289
+ orderedMessages.push(extendedMessage);
1290
+ }
1291
+ for (const extendedMessage of orderedMessages) {
1292
+ const parentMessage = messageMap[extendedMessage.parentMessageId ?? ""];
1293
+ if (parentMessage && parentMessage !== extendedMessage) parentMessage.children.push(extendedMessage);
1294
+ else rootMessages.push(extendedMessage);
1295
+ }
1296
+ /** Depth comes from a roots-down walk (a child linked before its parent
1297
+ * can't inherit depth at link time). The `visited` set doubles as the
1298
+ * cycle guard: nodes on a corrupt parent cycle are unreachable from any
1299
+ * root, so they resurface as roots instead of disappearing. */
1300
+ const visited = /* @__PURE__ */ new Set();
1301
+ const assignDepths = (root) => {
1302
+ visited.add(root);
1303
+ const stack = [root];
1304
+ while (stack.length > 0) {
1305
+ const node = stack.pop();
1306
+ /** Every node has one parent, so this walk reaches each node once — an
1307
+ * already-visited child is a cycle back-edge. Sever it (not just skip
1308
+ * it) so consumers that recurse `children` terminate. */
1309
+ if (node.children.some((child) => visited.has(child))) node.children = node.children.filter((child) => !visited.has(child));
1310
+ for (const child of node.children) {
1311
+ child.depth = node.depth + 1;
1312
+ visited.add(child);
1313
+ stack.push(child);
1314
+ }
1315
+ }
1316
+ };
1317
+ for (const root of rootMessages) assignDepths(root);
1318
+ for (const extendedMessage of orderedMessages) if (!visited.has(extendedMessage)) {
1319
+ rootMessages.push(extendedMessage);
1320
+ assignDepths(extendedMessage);
1321
+ }
1041
1322
  return rootMessages;
1042
1323
  }
1043
1324
  //#endregion
@@ -4946,6 +5227,27 @@ function extractDomainFromUrl(url$2) {
4946
5227
  throw new Error(`Invalid URL format: ${url$2}`);
4947
5228
  }
4948
5229
  }
5230
+ function getExplicitPort(value) {
5231
+ const normalizedValue = value.trim();
5232
+ const protocolSeparatorIndex = normalizedValue.indexOf("://");
5233
+ const hasProtocol = protocolSeparatorIndex !== -1;
5234
+ const authorityAndPath = hasProtocol ? normalizedValue.slice(protocolSeparatorIndex + 3) : normalizedValue;
5235
+ let port;
5236
+ try {
5237
+ const parsedUrl = new url.URL(hasProtocol ? normalizedValue : `https://${normalizedValue}`);
5238
+ port = parsedUrl.port;
5239
+ if (!port && (parsedUrl.protocol === "http:" || parsedUrl.protocol === "https:")) port = new url.URL(`${parsedUrl.protocol === "http:" ? "https:" : "http:"}//${authorityAndPath}`).port;
5240
+ } catch {
5241
+ return null;
5242
+ }
5243
+ if (!port) return null;
5244
+ const parsedPort = Number(port);
5245
+ if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65535) throw new Error(`Invalid port in domain: ${value}`);
5246
+ return String(parsedPort);
5247
+ }
5248
+ function getDefaultActionPort(protocol) {
5249
+ return protocol === "https:" ? "443" : "80";
5250
+ }
4949
5251
  /**
4950
5252
  * Validates client domain matches OpenAPI spec server URL domain (SSRF prevention).
4951
5253
  * @param clientProvidedDomain - Domain from client (with/without protocol)
@@ -4966,6 +5268,7 @@ function validateActionDomain(clientProvidedDomain, specServerUrl) {
4966
5268
  /** Extract hostname from client domain if it's a full URL */
4967
5269
  let clientHostname = clientProvidedDomain;
4968
5270
  let clientHasProtocol = false;
5271
+ const clientExplicitPort = getExplicitPort(clientProvidedDomain);
4969
5272
  if (clientProvidedDomain.includes("://")) {
4970
5273
  if (!clientProvidedDomain.startsWith("http://") && !clientProvidedDomain.startsWith("https://")) return {
4971
5274
  isValid: false,
@@ -4977,7 +5280,7 @@ function validateActionDomain(clientProvidedDomain, specServerUrl) {
4977
5280
  } catch {
4978
5281
  clientHasProtocol = false;
4979
5282
  }
4980
- }
5283
+ } else if (clientExplicitPort !== null) clientHostname = new url.URL(`https://${clientProvidedDomain}`).hostname;
4981
5284
  /** Normalize IPv6 addresses by removing brackets for comparison */
4982
5285
  const normalizedClientHostname = clientHostname.replace(/^\[(.+)\]$/, "$1");
4983
5286
  const normalizedSpecHostname = specHostname.replace(/^\[(.+)\]$/, "$1");
@@ -4990,14 +5293,23 @@ function validateActionDomain(clientProvidedDomain, specServerUrl) {
4990
5293
  const hostname = isIP(normalizedClientHostname) === 6 && !clientHostname.startsWith("[") ? `[${normalizedClientHostname}]` : clientHostname;
4991
5294
  normalizedClientDomain = `${specUrl.protocol}//${hostname}`;
4992
5295
  } else normalizedClientDomain = `https://${clientHostname}`;
4993
- if (normalizedSpecDomain === normalizedClientDomain || !clientHasProtocol && isIPAddress && normalizedClientHostname === normalizedSpecHostname) return {
4994
- isValid: true,
5296
+ if (!(normalizedSpecDomain === normalizedClientDomain || !clientHasProtocol && isIPAddress && normalizedClientHostname === normalizedSpecHostname)) return {
5297
+ isValid: false,
5298
+ message: `Domain mismatch: Client provided '${clientProvidedDomain}', but spec uses '${specHostname}'`,
4995
5299
  normalizedSpecDomain,
4996
5300
  normalizedClientDomain
4997
5301
  };
5302
+ if (clientExplicitPort !== null) {
5303
+ const specEffectivePort = specUrl.port || getDefaultActionPort(specUrl.protocol);
5304
+ if (clientExplicitPort !== specEffectivePort) return {
5305
+ isValid: false,
5306
+ message: `Port mismatch: Client provided '${clientProvidedDomain}', but spec uses effective port '${specEffectivePort}'`,
5307
+ normalizedSpecDomain,
5308
+ normalizedClientDomain
5309
+ };
5310
+ }
4998
5311
  return {
4999
- isValid: false,
5000
- message: `Domain mismatch: Client provided '${clientProvidedDomain}', but spec uses '${specHostname}'`,
5312
+ isValid: true,
5001
5313
  normalizedSpecDomain,
5002
5314
  normalizedClientDomain
5003
5315
  };
@@ -5072,7 +5384,7 @@ function getUserTimezone() {
5072
5384
  }
5073
5385
  }
5074
5386
  function createPayload(submission) {
5075
- const { isEdited, addedConvo, userMessage, isContinued, isTemporary, isRegenerate, conversation, editedContent, ephemeralAgent, endpointOption, manualSkills } = submission;
5387
+ const { isEdited, addedConvo, userMessage, isContinued, isTemporary, isRegenerate, conversation, editedContent, ephemeralAgent, endpointOption, manualSkills, clientRequestId, recoverySteerId, expectedPredecessorCreatedAt } = submission;
5076
5388
  const { conversationId } = require_data_service.tConvoUpdateSchema.parse(conversation);
5077
5389
  const { endpoint: _e, endpointType } = endpointOption;
5078
5390
  const endpoint = _e;
@@ -5090,7 +5402,10 @@ function createPayload(submission) {
5090
5402
  isContinued: !!(isEdited && isContinued),
5091
5403
  ephemeralAgent: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : ephemeralAgent,
5092
5404
  manualSkills: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : manualSkills,
5093
- timezone: getUserTimezone()
5405
+ timezone: getUserTimezone(),
5406
+ clientRequestId,
5407
+ recoverySteerId,
5408
+ expectedPredecessorCreatedAt
5094
5409
  };
5095
5410
  return {
5096
5411
  server,
@@ -5197,7 +5512,7 @@ const librechat = {
5197
5512
  labelCode: true,
5198
5513
  type: "number",
5199
5514
  component: "input",
5200
- placeholder: "com_nav_theme_system",
5515
+ placeholder: "com_endpoint_default",
5201
5516
  placeholderCode: true,
5202
5517
  description: "com_endpoint_context_info",
5203
5518
  descriptionCode: true,
@@ -5234,7 +5549,7 @@ const librechat = {
5234
5549
  labelCode: true,
5235
5550
  description: "com_ui_file_token_limit_desc",
5236
5551
  descriptionCode: true,
5237
- placeholder: "com_nav_theme_system",
5552
+ placeholder: "com_endpoint_default",
5238
5553
  placeholderCode: true,
5239
5554
  type: "number",
5240
5555
  component: "input",
@@ -5306,7 +5621,7 @@ const openAIParams = {
5306
5621
  component: "input",
5307
5622
  description: "com_endpoint_openai_max_tokens",
5308
5623
  descriptionCode: true,
5309
- placeholder: "com_nav_theme_system",
5624
+ placeholder: "com_endpoint_default",
5310
5625
  placeholderCode: true,
5311
5626
  optionType: "model",
5312
5627
  columnSpan: 2
@@ -5327,7 +5642,8 @@ const openAIParams = {
5327
5642
  "low",
5328
5643
  "medium",
5329
5644
  "high",
5330
- "xhigh"
5645
+ "xhigh",
5646
+ "max"
5331
5647
  ],
5332
5648
  enumMappings: {
5333
5649
  [""]: "com_ui_auto",
@@ -5336,7 +5652,8 @@ const openAIParams = {
5336
5652
  ["low"]: "com_ui_low",
5337
5653
  ["medium"]: "com_ui_medium",
5338
5654
  ["high"]: "com_ui_high",
5339
- ["xhigh"]: "com_ui_xhigh"
5655
+ ["xhigh"]: "com_ui_xhigh",
5656
+ ["max"]: "com_ui_max"
5340
5657
  },
5341
5658
  optionType: "model",
5342
5659
  columnSpan: 4
@@ -5391,6 +5708,52 @@ const openAIParams = {
5391
5708
  optionType: "model",
5392
5709
  columnSpan: 4
5393
5710
  },
5711
+ reasoning_mode: {
5712
+ key: "reasoning_mode",
5713
+ label: "com_endpoint_reasoning_mode",
5714
+ labelCode: true,
5715
+ description: "com_endpoint_openai_reasoning_mode",
5716
+ descriptionCode: true,
5717
+ type: "enum",
5718
+ default: "",
5719
+ component: "slider",
5720
+ options: [
5721
+ "",
5722
+ "standard",
5723
+ "pro"
5724
+ ],
5725
+ enumMappings: {
5726
+ [""]: "com_ui_unset",
5727
+ ["standard"]: "com_ui_standard",
5728
+ ["pro"]: "com_ui_pro"
5729
+ },
5730
+ optionType: "model",
5731
+ columnSpan: 4
5732
+ },
5733
+ reasoning_context: {
5734
+ key: "reasoning_context",
5735
+ label: "com_endpoint_reasoning_context",
5736
+ labelCode: true,
5737
+ description: "com_endpoint_openai_reasoning_context",
5738
+ descriptionCode: true,
5739
+ type: "enum",
5740
+ default: "",
5741
+ component: "slider",
5742
+ options: [
5743
+ "",
5744
+ "auto",
5745
+ "current_turn",
5746
+ "all_turns"
5747
+ ],
5748
+ enumMappings: {
5749
+ [""]: "com_ui_unset",
5750
+ ["auto"]: "com_ui_auto",
5751
+ ["current_turn"]: "com_ui_current_turn",
5752
+ ["all_turns"]: "com_ui_all_turns"
5753
+ },
5754
+ optionType: "model",
5755
+ columnSpan: 4
5756
+ },
5394
5757
  verbosity: {
5395
5758
  key: "verbosity",
5396
5759
  label: "com_endpoint_verbosity",
@@ -5438,7 +5801,7 @@ const anthropic = {
5438
5801
  component: "input",
5439
5802
  description: "com_endpoint_anthropic_maxoutputtokens",
5440
5803
  descriptionCode: true,
5441
- placeholder: "com_nav_theme_system",
5804
+ placeholder: "com_endpoint_default",
5442
5805
  placeholderCode: true,
5443
5806
  range: {
5444
5807
  min: require_data_service.anthropicSettings.maxOutputTokens.min,
@@ -5626,7 +5989,7 @@ const bedrock = {
5626
5989
  component: "input",
5627
5990
  description: "com_endpoint_anthropic_maxoutputtokens",
5628
5991
  descriptionCode: true,
5629
- placeholder: "com_nav_theme_system",
5992
+ placeholder: "com_endpoint_default",
5630
5993
  placeholderCode: true,
5631
5994
  optionType: "model",
5632
5995
  columnSpan: 2
@@ -5799,7 +6162,7 @@ const google = {
5799
6162
  component: "input",
5800
6163
  description: "com_endpoint_google_maxoutputtokens",
5801
6164
  descriptionCode: true,
5802
- placeholder: "com_nav_theme_system",
6165
+ placeholder: "com_endpoint_default",
5803
6166
  placeholderCode: true,
5804
6167
  default: require_data_service.googleSettings.maxOutputTokens.default,
5805
6168
  range: {
@@ -5879,6 +6242,19 @@ const google = {
5879
6242
  optionType: "model",
5880
6243
  showDefault: false,
5881
6244
  columnSpan: 2
6245
+ },
6246
+ url_context: {
6247
+ key: "url_context",
6248
+ label: "com_endpoint_use_url_context",
6249
+ labelCode: true,
6250
+ description: "com_endpoint_google_use_url_context",
6251
+ descriptionCode: true,
6252
+ type: "boolean",
6253
+ default: false,
6254
+ component: "switch",
6255
+ optionType: "model",
6256
+ showDefault: false,
6257
+ columnSpan: 2
5882
6258
  }
5883
6259
  };
5884
6260
  const googleConfig = [
@@ -5894,6 +6270,7 @@ const googleConfig = [
5894
6270
  google.thinkingBudget,
5895
6271
  google.thinkingLevel,
5896
6272
  google.web_search,
6273
+ google.url_context,
5897
6274
  librechat.fileTokenLimit
5898
6275
  ];
5899
6276
  const googleCol1 = [
@@ -5912,6 +6289,7 @@ const googleCol2 = [
5912
6289
  google.thinkingBudget,
5913
6290
  google.thinkingLevel,
5914
6291
  google.web_search,
6292
+ google.url_context,
5915
6293
  librechat.fileTokenLimit
5916
6294
  ];
5917
6295
  const openAI = [
@@ -5930,6 +6308,8 @@ const openAI = [
5930
6308
  openAIParams.reasoning_effort,
5931
6309
  openAIParams.useResponsesApi,
5932
6310
  openAIParams.reasoning_summary,
6311
+ openAIParams.reasoning_mode,
6312
+ openAIParams.reasoning_context,
5933
6313
  openAIParams.verbosity,
5934
6314
  openAIParams.disableStreaming,
5935
6315
  librechat.fileTokenLimit
@@ -5956,6 +6336,8 @@ const openAICol2 = [
5956
6336
  baseDefinitions.imageDetail,
5957
6337
  openAIParams.reasoning_effort,
5958
6338
  openAIParams.reasoning_summary,
6339
+ openAIParams.reasoning_mode,
6340
+ openAIParams.reasoning_context,
5959
6341
  openAIParams.verbosity,
5960
6342
  openAIParams.useResponsesApi,
5961
6343
  openAIParams.web_search,
@@ -6292,11 +6674,14 @@ const CODE_ENV_KINDS = [
6292
6674
  "user"
6293
6675
  ];
6294
6676
  //#endregion
6677
+ exports.AUTH_USER_DOC_BY_ID_PREFIX = require_data_service.AUTH_USER_DOC_BY_ID_PREFIX;
6295
6678
  exports.AccessRoleIds = require_data_service.AccessRoleIds;
6296
6679
  exports.ActionRequest = ActionRequest;
6680
+ exports.ActivityLabelEvents = ActivityLabelEvents;
6297
6681
  exports.AgentCapabilities = require_data_service.AgentCapabilities;
6298
6682
  exports.AnnotationTypes = require_data_service.AnnotationTypes;
6299
6683
  exports.AnthropicEffort = require_data_service.AnthropicEffort;
6684
+ exports.ApprovalEvents = ApprovalEvents;
6300
6685
  exports.ArtifactModes = ArtifactModes;
6301
6686
  exports.AssistantStreamEvents = require_data_service.AssistantStreamEvents;
6302
6687
  exports.AuthKeys = require_data_service.AuthKeys;
@@ -6304,6 +6689,7 @@ exports.AuthType = require_data_service.AuthType;
6304
6689
  exports.AuthTypeEnum = require_data_service.AuthTypeEnum;
6305
6690
  exports.AuthorizationTypeEnum = require_data_service.AuthorizationTypeEnum;
6306
6691
  exports.BASE_ONLY_CONFIG_SECTIONS = require_data_service.BASE_ONLY_CONFIG_SECTIONS;
6692
+ exports.BASE_PRINCIPAL_CONFIG_SECTIONS = require_data_service.BASE_PRINCIPAL_CONFIG_SECTIONS;
6307
6693
  exports.BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA = BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA;
6308
6694
  exports.BEDROCK_OUTPUT_128K_BETA = BEDROCK_OUTPUT_128K_BETA;
6309
6695
  exports.BedrockProviders = require_data_service.BedrockProviders;
@@ -6349,6 +6735,7 @@ exports.MCPServerUserInputSchema = require_data_service.MCPServerUserInputSchema
6349
6735
  exports.MCPServersSchema = require_data_service.MCPServersSchema;
6350
6736
  exports.MCP_USER_INPUT_FIELDS = require_data_service.MCP_USER_INPUT_FIELDS;
6351
6737
  exports.MYTHOS_CLASS_FAMILIES = require_data_service.MYTHOS_CLASS_FAMILIES;
6738
+ exports.MemoryScope = require_data_service.MemoryScope;
6352
6739
  exports.MessageContentTypes = require_data_service.MessageContentTypes;
6353
6740
  exports.MutationKeys = require_data_service.MutationKeys;
6354
6741
  exports.OCRStrategy = require_data_service.OCRStrategy;
@@ -6364,7 +6751,9 @@ exports.Providers = require_data_service.Providers;
6364
6751
  exports.QueryKeys = require_data_service.QueryKeys;
6365
6752
  exports.REFILL_INTERVAL_UNITS = require_data_service.REFILL_INTERVAL_UNITS;
6366
6753
  exports.RateLimitPrefix = require_data_service.RateLimitPrefix;
6754
+ exports.ReasoningContext = require_data_service.ReasoningContext;
6367
6755
  exports.ReasoningEffort = require_data_service.ReasoningEffort;
6756
+ exports.ReasoningMode = require_data_service.ReasoningMode;
6368
6757
  exports.ReasoningParameterFormat = require_data_service.ReasoningParameterFormat;
6369
6758
  exports.ReasoningResponseKey = require_data_service.ReasoningResponseKey;
6370
6759
  exports.ReasoningSummary = require_data_service.ReasoningSummary;
@@ -6393,6 +6782,7 @@ exports.SettingTypes = require_data_service.SettingTypes;
6393
6782
  exports.SettingsTabValues = require_data_service.SettingsTabValues;
6394
6783
  exports.SettingsViews = require_data_service.SettingsViews;
6395
6784
  exports.StdioOptionsSchema = require_data_service.StdioOptionsSchema;
6785
+ exports.SteerEvents = SteerEvents;
6396
6786
  exports.StepEvents = StepEvents;
6397
6787
  exports.StepStatus = require_data_service.StepStatus;
6398
6788
  exports.StepTypes = StepTypes;
@@ -6448,6 +6838,7 @@ exports.balanceSchema = require_data_service.balanceSchema;
6448
6838
  exports.baseEndpointSchema = require_data_service.baseEndpointSchema;
6449
6839
  exports.bedrockDocumentExtensions = require_data_service.bedrockDocumentExtensions;
6450
6840
  exports.bedrockDocumentFormats = require_data_service.bedrockDocumentFormats;
6841
+ exports.bedrockDocumentMimeTypes = require_data_service.bedrockDocumentMimeTypes;
6451
6842
  exports.bedrockEndpointSchema = require_data_service.bedrockEndpointSchema;
6452
6843
  exports.bedrockGuardrailConfigSchema = require_data_service.bedrockGuardrailConfigSchema;
6453
6844
  exports.bedrockInputParser = bedrockInputParser;
@@ -6457,14 +6848,20 @@ exports.bedrockOutputParser = bedrockOutputParser;
6457
6848
  exports.bookmarkPermissionsSchema = bookmarkPermissionsSchema;
6458
6849
  exports.breadcrumb = breadcrumb;
6459
6850
  exports.buildLoginRedirectUrl = require_data_service.buildLoginRedirectUrl;
6851
+ exports.buildServerNameAliases = require_data_service.buildServerNameAliases;
6460
6852
  exports.buildTree = buildTree;
6461
6853
  exports.button = button;
6462
6854
  exports.cacheSubsetProviders = require_data_service.cacheSubsetProviders;
6463
6855
  exports.calendar = calendar;
6856
+ exports.capsEffortWhenThinkingDisabled = capsEffortWhenThinkingDisabled;
6464
6857
  exports.card = card;
6465
6858
  exports.carousel = carousel;
6466
6859
  exports.checkOpenAIStorage = require_data_service.checkOpenAIStorage;
6467
6860
  exports.checkbox = checkbox;
6861
+ exports.checkpointerSchema = require_data_service.checkpointerSchema;
6862
+ exports.checkpointerTypeSchema = require_data_service.checkpointerTypeSchema;
6863
+ exports.clampEffortForDisabledThinking = clampEffortForDisabledThinking;
6864
+ exports.clampOutputConfigEffort = clampOutputConfigEffort;
6468
6865
  exports.cloudfrontConfigSchema = require_data_service.cloudfrontConfigSchema;
6469
6866
  exports.codeInterpreterMimeTypes = require_data_service.codeInterpreterMimeTypes;
6470
6867
  exports.codeInterpreterMimeTypesList = require_data_service.codeInterpreterMimeTypesList;
@@ -6506,7 +6903,9 @@ exports.dropdownMenu = dropdownMenu;
6506
6903
  exports.eAnthropicEffortSchema = require_data_service.eAnthropicEffortSchema;
6507
6904
  exports.eImageDetailSchema = require_data_service.eImageDetailSchema;
6508
6905
  exports.eModelEndpointSchema = require_data_service.eModelEndpointSchema;
6906
+ exports.eReasoningContextSchema = require_data_service.eReasoningContextSchema;
6509
6907
  exports.eReasoningEffortSchema = require_data_service.eReasoningEffortSchema;
6908
+ exports.eReasoningModeSchema = require_data_service.eReasoningModeSchema;
6510
6909
  exports.eReasoningParameterFormatSchema = require_data_service.eReasoningParameterFormatSchema;
6511
6910
  exports.eReasoningResponseKeySchema = require_data_service.eReasoningResponseKeySchema;
6512
6911
  exports.eReasoningSummarySchema = require_data_service.eReasoningSummarySchema;
@@ -6544,6 +6943,7 @@ exports.generateDynamicSchema = require_data_service.generateDynamicSchema;
6544
6943
  exports.generateGoogleSchema = require_data_service.generateGoogleSchema;
6545
6944
  exports.generateOpenAISchema = require_data_service.generateOpenAISchema;
6546
6945
  exports.getConfigDefaults = require_data_service.getConfigDefaults;
6946
+ exports.getConfiguredMimeAccept = require_data_service.getConfiguredMimeAccept;
6547
6947
  exports.getDefaultParamsEndpoint = require_data_service.getDefaultParamsEndpoint;
6548
6948
  exports.getEnabledEndpoints = getEnabledEndpoints;
6549
6949
  exports.getEndpointField = require_data_service.getEndpointField;
@@ -6580,6 +6980,8 @@ exports.inputTokensIncludesCache = require_data_service.inputTokensIncludesCache
6580
6980
  exports.interfaceSchema = require_data_service.interfaceSchema;
6581
6981
  exports.isActionTool = require_data_service.isActionTool;
6582
6982
  exports.isAgentsEndpoint = require_data_service.isAgentsEndpoint;
6983
+ exports.isAnthropicDocumentType = require_data_service.isAnthropicDocumentType;
6984
+ exports.isAnthropicTextDocumentType = require_data_service.isAnthropicTextDocumentType;
6583
6985
  exports.isAssistantsEndpoint = require_data_service.isAssistantsEndpoint;
6584
6986
  exports.isBedrockDocumentType = require_data_service.isBedrockDocumentType;
6585
6987
  exports.isDocumentSupportedProvider = require_data_service.isDocumentSupportedProvider;
@@ -6592,8 +6994,10 @@ exports.isPermissiveMimeConfig = require_data_service.isPermissiveMimeConfig;
6592
6994
  exports.isRemoteOidcUrlAllowed = require_data_service.isRemoteOidcUrlAllowed;
6593
6995
  exports.isSensitiveEnvVar = require_data_service.isSensitiveEnvVar;
6594
6996
  exports.isSystemRoleName = isSystemRoleName;
6997
+ exports.isThinkingDisabled = isThinkingDisabled;
6595
6998
  exports.isUUID = require_data_service.isUUID;
6596
6999
  exports.label = label;
7000
+ exports.langfuseConfigSchema = require_data_service.langfuseConfigSchema;
6597
7001
  exports.librechat = librechat;
6598
7002
  exports.loginPage = require_data_service.loginPage;
6599
7003
  exports.mapGroupToAzureConfig = mapGroupToAzureConfig;
@@ -6615,6 +7019,8 @@ exports.modularEndpoints = require_data_service.modularEndpoints;
6615
7019
  exports.multiConvoPermissionsSchema = multiConvoPermissionsSchema;
6616
7020
  exports.navigationMenu = navigationMenu;
6617
7021
  exports.normalizeEndpointName = require_data_service.normalizeEndpointName;
7022
+ exports.normalizeMCPToolKey = require_data_service.normalizeMCPToolKey;
7023
+ exports.normalizeServerName = require_data_service.normalizeServerName;
6618
7024
  exports.ocrSchema = require_data_service.ocrSchema;
6619
7025
  exports.omitsSamplingParameters = omitsSamplingParameters;
6620
7026
  exports.omitsThinkingByDefault = omitsThinkingByDefault;
@@ -6651,10 +7057,12 @@ exports.remoteAgentsPermissionsSchema = remoteAgentsPermissionsSchema;
6651
7057
  exports.removeNullishValues = require_data_service.removeNullishValues;
6652
7058
  exports.replaceSpecialVars = replaceSpecialVars;
6653
7059
  exports.request = require_data_service.request_default;
7060
+ exports.requiresExplicitThinkingDisabled = requiresExplicitThinkingDisabled;
6654
7061
  exports.resolveEndpointType = require_data_service.resolveEndpointType;
6655
7062
  exports.resolveRef = resolveRef;
6656
7063
  exports.resolveThinkingDisplay = resolveThinkingDisplay;
6657
7064
  exports.resourcePermissionsResponseSchema = require_data_service.resourcePermissionsResponseSchema;
7065
+ exports.retainRecentConfigSchema = require_data_service.retainRecentConfigSchema;
6658
7066
  exports.retrievalMimeTypes = require_data_service.retrievalMimeTypes;
6659
7067
  exports.retrievalMimeTypesList = require_data_service.retrievalMimeTypesList;
6660
7068
  exports.roleDefaults = roleDefaults;
@@ -6663,6 +7071,8 @@ exports.runCodePermissionsSchema = runCodePermissionsSchema;
6663
7071
  exports.select = select;
6664
7072
  exports.separator = separator;
6665
7073
  exports.setAcceptLanguageHeader = require_data_service.setAcceptLanguageHeader;
7074
+ exports.setFileConfigRegexCompiler = require_data_service.setFileConfigRegexCompiler;
7075
+ exports.setMessageFilterRegexValidator = require_data_service.setMessageFilterRegexValidator;
6666
7076
  exports.setTokenHeader = require_data_service.setTokenHeader;
6667
7077
  exports.sha1 = sha1;
6668
7078
  exports.shadcnComponents = shadcnComponents;
@@ -6675,6 +7085,8 @@ exports.skillSyncGitHubSourceSchema = require_data_service.skillSyncGitHubSource
6675
7085
  exports.slider = slider;
6676
7086
  exports.specialVariables = require_data_service.specialVariables;
6677
7087
  exports.specsConfigSchema = require_data_service.specsConfigSchema;
7088
+ exports.splitMCPToolKey = require_data_service.splitMCPToolKey;
7089
+ exports.splitToolCallName = require_data_service.splitToolCallName;
6678
7090
  exports.stripAgentIdSuffix = stripAgentIdSuffix;
6679
7091
  exports.summarizationConfigSchema = require_data_service.summarizationConfigSchema;
6680
7092
  exports.summarizationTriggerSchema = require_data_service.summarizationTriggerSchema;
@@ -6707,6 +7119,9 @@ exports.toast = toast;
6707
7119
  exports.toaster = toaster;
6708
7120
  exports.toggle = toggle;
6709
7121
  exports.toggleGroup = toggleGroup;
7122
+ exports.toolApprovalHookConfigSchema = require_data_service.toolApprovalHookConfigSchema;
7123
+ exports.toolApprovalModeSchema = require_data_service.toolApprovalModeSchema;
7124
+ exports.toolApprovalPolicySchema = require_data_service.toolApprovalPolicySchema;
6710
7125
  exports.tooltip = tooltip;
6711
7126
  exports.transactionsSchema = require_data_service.transactionsSchema;
6712
7127
  exports.turnstileOptionsSchema = require_data_service.turnstileOptionsSchema;