🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
import { z } from 'zod';
|
2025-10-05 06:37:57 -04:00
|
|
|
import type { JsonSchemaType, ConvertJsonSchemaToZodOptions } from '@librechat/data-schemas';
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
|
2025-02-06 18:13:18 -05:00
|
|
|
function isEmptyObjectSchema(jsonSchema?: JsonSchemaType): boolean {
|
|
|
|
|
return (
|
|
|
|
|
jsonSchema != null &&
|
|
|
|
|
typeof jsonSchema === 'object' &&
|
|
|
|
|
jsonSchema.type === 'object' &&
|
2025-07-10 18:02:34 -04:00
|
|
|
(jsonSchema.properties == null || Object.keys(jsonSchema.properties).length === 0) &&
|
|
|
|
|
!jsonSchema.additionalProperties // Don't treat objects with additionalProperties as empty
|
2025-02-06 18:13:18 -05:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-23 18:56:06 -04:00
|
|
|
function dropSchemaFields(
|
|
|
|
|
schema: JsonSchemaType | undefined,
|
|
|
|
|
fields: string[],
|
|
|
|
|
): JsonSchemaType | undefined {
|
2025-04-29 09:55:43 -04:00
|
|
|
if (schema == null || typeof schema !== 'object') {
|
|
|
|
|
return schema;
|
|
|
|
|
}
|
2025-04-23 18:56:06 -04:00
|
|
|
// Handle arrays (should only occur for enum, required, etc.)
|
|
|
|
|
if (Array.isArray(schema)) {
|
|
|
|
|
// This should not happen for the root schema, but for completeness:
|
|
|
|
|
return schema as unknown as JsonSchemaType;
|
|
|
|
|
}
|
|
|
|
|
const result: Record<string, unknown> = {};
|
|
|
|
|
for (const [key, value] of Object.entries(schema)) {
|
2025-04-29 09:55:43 -04:00
|
|
|
if (fields.includes(key)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2025-04-23 18:56:06 -04:00
|
|
|
// Recursively process nested schemas
|
2025-04-29 09:55:43 -04:00
|
|
|
if (key === 'items' || key === 'additionalProperties' || key === 'properties') {
|
2025-04-23 18:56:06 -04:00
|
|
|
if (key === 'properties' && value && typeof value === 'object') {
|
|
|
|
|
// properties is a record of string -> JsonSchemaType
|
|
|
|
|
const newProps: Record<string, JsonSchemaType> = {};
|
|
|
|
|
for (const [propKey, propValue] of Object.entries(
|
|
|
|
|
value as Record<string, JsonSchemaType>,
|
|
|
|
|
)) {
|
2025-04-29 09:55:43 -04:00
|
|
|
const dropped = dropSchemaFields(propValue, fields);
|
2025-04-23 18:56:06 -04:00
|
|
|
if (dropped !== undefined) {
|
|
|
|
|
newProps[propKey] = dropped;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
result[key] = newProps;
|
|
|
|
|
} else if (key === 'items' || key === 'additionalProperties') {
|
2025-04-29 09:55:43 -04:00
|
|
|
const dropped = dropSchemaFields(value as JsonSchemaType, fields);
|
2025-04-23 18:56:06 -04:00
|
|
|
if (dropped !== undefined) {
|
|
|
|
|
result[key] = dropped;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
result[key] = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Only return if the result is still a valid JsonSchemaType (must have a type)
|
|
|
|
|
if (
|
|
|
|
|
typeof result.type === 'string' &&
|
|
|
|
|
['string', 'number', 'boolean', 'array', 'object'].includes(result.type)
|
|
|
|
|
) {
|
|
|
|
|
return result as JsonSchemaType;
|
|
|
|
|
}
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Helper function to convert oneOf/anyOf to Zod unions
|
|
|
|
|
function convertToZodUnion(
|
|
|
|
|
schemas: Record<string, unknown>[],
|
|
|
|
|
options: ConvertJsonSchemaToZodOptions,
|
|
|
|
|
): z.ZodType | undefined {
|
|
|
|
|
if (!Array.isArray(schemas) || schemas.length === 0) {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Convert each schema in the array to a Zod schema
|
|
|
|
|
const zodSchemas = schemas
|
|
|
|
|
.map((subSchema) => {
|
|
|
|
|
// If the subSchema doesn't have a type, try to infer it
|
|
|
|
|
if (!subSchema.type && subSchema.properties) {
|
|
|
|
|
// It's likely an object schema
|
|
|
|
|
const objSchema = { ...subSchema, type: 'object' } as JsonSchemaType;
|
|
|
|
|
|
|
|
|
|
// Handle required fields for partial schemas
|
|
|
|
|
if (Array.isArray(subSchema.required) && subSchema.required.length > 0) {
|
|
|
|
|
return convertJsonSchemaToZod(objSchema, options);
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-10 18:02:34 -04:00
|
|
|
return convertJsonSchemaToZod(objSchema, options);
|
|
|
|
|
} else if (!subSchema.type && subSchema.additionalProperties) {
|
|
|
|
|
// It's likely an object schema with additionalProperties
|
|
|
|
|
const objSchema = { ...subSchema, type: 'object' } as JsonSchemaType;
|
2025-04-23 18:56:06 -04:00
|
|
|
return convertJsonSchemaToZod(objSchema, options);
|
|
|
|
|
} else if (!subSchema.type && subSchema.items) {
|
|
|
|
|
// It's likely an array schema
|
|
|
|
|
return convertJsonSchemaToZod({ ...subSchema, type: 'array' } as JsonSchemaType, options);
|
|
|
|
|
} else if (!subSchema.type && Array.isArray(subSchema.enum)) {
|
|
|
|
|
// It's likely an enum schema
|
|
|
|
|
return convertJsonSchemaToZod({ ...subSchema, type: 'string' } as JsonSchemaType, options);
|
|
|
|
|
} else if (!subSchema.type && subSchema.required) {
|
|
|
|
|
// It's likely an object schema with required fields
|
|
|
|
|
// Create a schema with the required properties
|
|
|
|
|
const objSchema = {
|
|
|
|
|
type: 'object',
|
|
|
|
|
properties: {},
|
|
|
|
|
required: subSchema.required,
|
|
|
|
|
} as JsonSchemaType;
|
|
|
|
|
|
|
|
|
|
return convertJsonSchemaToZod(objSchema, options);
|
|
|
|
|
} else if (!subSchema.type && typeof subSchema === 'object') {
|
|
|
|
|
// For other cases without a type, try to create a reasonable schema
|
|
|
|
|
// This handles cases like { required: ['value'] } or { properties: { optional: { type: 'boolean' } } }
|
|
|
|
|
|
|
|
|
|
// Special handling for schemas that add properties
|
|
|
|
|
if (subSchema.properties && Object.keys(subSchema.properties).length > 0) {
|
2025-04-29 09:55:43 -04:00
|
|
|
// Create a schema with the properties and make them all optional
|
2025-04-23 18:56:06 -04:00
|
|
|
const objSchema = {
|
|
|
|
|
type: 'object',
|
|
|
|
|
properties: subSchema.properties,
|
|
|
|
|
additionalProperties: true, // Allow additional properties
|
2025-04-29 09:55:43 -04:00
|
|
|
// Don't include required here to make all properties optional
|
2025-04-23 18:56:06 -04:00
|
|
|
} as JsonSchemaType;
|
|
|
|
|
|
|
|
|
|
// Convert to Zod schema
|
|
|
|
|
const zodSchema = convertJsonSchemaToZod(objSchema, options);
|
|
|
|
|
|
|
|
|
|
// For the special case of { optional: true }
|
|
|
|
|
if ('optional' in (subSchema.properties as Record<string, unknown>)) {
|
|
|
|
|
// Create a custom schema that preserves the optional property
|
2025-04-29 09:55:43 -04:00
|
|
|
const customSchema = z
|
|
|
|
|
.object({
|
|
|
|
|
optional: z.boolean(),
|
|
|
|
|
})
|
|
|
|
|
.passthrough();
|
2025-04-23 18:56:06 -04:00
|
|
|
|
|
|
|
|
return customSchema;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (zodSchema instanceof z.ZodObject) {
|
2025-04-29 09:55:43 -04:00
|
|
|
// Make sure the schema allows additional properties
|
2025-04-23 18:56:06 -04:00
|
|
|
return zodSchema.passthrough();
|
|
|
|
|
}
|
|
|
|
|
return zodSchema;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Default handling for other cases
|
|
|
|
|
const objSchema = {
|
|
|
|
|
type: 'object',
|
|
|
|
|
...subSchema,
|
|
|
|
|
} as JsonSchemaType;
|
|
|
|
|
|
|
|
|
|
return convertJsonSchemaToZod(objSchema, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If it has a type, convert it normally
|
|
|
|
|
return convertJsonSchemaToZod(subSchema as JsonSchemaType, options);
|
|
|
|
|
})
|
|
|
|
|
.filter((schema): schema is z.ZodType => schema !== undefined);
|
|
|
|
|
|
|
|
|
|
if (zodSchemas.length === 0) {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (zodSchemas.length === 1) {
|
|
|
|
|
return zodSchemas[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ensure we have at least two elements for the union
|
|
|
|
|
if (zodSchemas.length >= 2) {
|
|
|
|
|
return z.union([zodSchemas[0], zodSchemas[1], ...zodSchemas.slice(2)]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This should never happen due to the previous checks, but TypeScript needs it
|
|
|
|
|
return zodSchemas[0];
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-10 18:02:34 -04:00
|
|
|
/**
|
|
|
|
|
* Helper function to resolve $ref references
|
|
|
|
|
* @param schema - The schema to resolve
|
|
|
|
|
* @param definitions - The definitions to use
|
|
|
|
|
* @param visited - The set of visited references
|
|
|
|
|
* @returns The resolved schema
|
|
|
|
|
*/
|
|
|
|
|
export function resolveJsonSchemaRefs<T extends Record<string, unknown>>(
|
|
|
|
|
schema: T,
|
|
|
|
|
definitions?: Record<string, unknown>,
|
|
|
|
|
visited = new Set<string>(),
|
|
|
|
|
): T {
|
|
|
|
|
// Handle null, undefined, or non-object values first
|
|
|
|
|
if (!schema || typeof schema !== 'object') {
|
|
|
|
|
return schema;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If no definitions provided, try to extract from schema.$defs or schema.definitions
|
|
|
|
|
if (!definitions) {
|
|
|
|
|
definitions = (schema.$defs || schema.definitions) as Record<string, unknown>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Handle arrays
|
|
|
|
|
if (Array.isArray(schema)) {
|
|
|
|
|
return schema.map((item) => resolveJsonSchemaRefs(item, definitions, visited)) as unknown as T;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Handle objects
|
|
|
|
|
const result: Record<string, unknown> = {};
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(schema)) {
|
2026-02-15 21:31:16 -05:00
|
|
|
// Skip $defs/definitions — they are only used for resolving $ref and
|
|
|
|
|
// should not appear in the resolved output (e.g. Google/Gemini API rejects them).
|
|
|
|
|
if (key === '$defs' || key === 'definitions') {
|
2025-07-10 18:02:34 -04:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Handle $ref
|
|
|
|
|
if (key === '$ref' && typeof value === 'string') {
|
|
|
|
|
// Prevent circular references
|
|
|
|
|
if (visited.has(value)) {
|
|
|
|
|
// Return a simple schema to break the cycle
|
|
|
|
|
return { type: 'object' } as unknown as T;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Extract the reference path
|
|
|
|
|
const refPath = value.replace(/^#\/(\$defs|definitions)\//, '');
|
|
|
|
|
const resolved = definitions?.[refPath];
|
|
|
|
|
|
|
|
|
|
if (resolved) {
|
|
|
|
|
visited.add(value);
|
|
|
|
|
const resolvedSchema = resolveJsonSchemaRefs(
|
|
|
|
|
resolved as Record<string, unknown>,
|
|
|
|
|
definitions,
|
|
|
|
|
visited,
|
|
|
|
|
);
|
|
|
|
|
visited.delete(value);
|
|
|
|
|
|
|
|
|
|
// Merge the resolved schema into the result
|
|
|
|
|
Object.assign(result, resolvedSchema);
|
|
|
|
|
} else {
|
|
|
|
|
// If we can't resolve the reference, keep it as is
|
|
|
|
|
result[key] = value;
|
|
|
|
|
}
|
|
|
|
|
} else if (value && typeof value === 'object') {
|
|
|
|
|
// Recursively resolve nested objects/arrays
|
|
|
|
|
result[key] = resolveJsonSchemaRefs(value as Record<string, unknown>, definitions, visited);
|
|
|
|
|
} else {
|
|
|
|
|
// Copy primitive values as is
|
|
|
|
|
result[key] = value;
|
2026-02-13 13:33:25 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result as T;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2026-02-15 21:31:16 -05:00
|
|
|
* Recursively normalizes a JSON schema for LLM API compatibility.
|
|
|
|
|
*
|
|
|
|
|
* Transformations applied:
|
|
|
|
|
* - Converts `const` values to `enum` arrays (Gemini/Vertex AI rejects `const`)
|
|
|
|
|
* - Strips vendor extension fields (`x-*` prefixed keys, e.g. `x-google-enum-descriptions`)
|
|
|
|
|
* - Strips leftover `$defs`/`definitions` blocks that may survive ref resolution
|
2026-02-13 13:33:25 -05:00
|
|
|
*
|
|
|
|
|
* @param schema - The JSON schema to normalize
|
2026-02-15 21:31:16 -05:00
|
|
|
* @returns The normalized schema
|
2026-02-13 13:33:25 -05:00
|
|
|
*/
|
|
|
|
|
export function normalizeJsonSchema<T extends Record<string, unknown>>(schema: T): T {
|
|
|
|
|
if (!schema || typeof schema !== 'object') {
|
|
|
|
|
return schema;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Array.isArray(schema)) {
|
|
|
|
|
return schema.map((item) =>
|
|
|
|
|
item && typeof item === 'object' ? normalizeJsonSchema(item) : item,
|
|
|
|
|
) as unknown as T;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const result: Record<string, unknown> = {};
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(schema)) {
|
2026-02-15 21:31:16 -05:00
|
|
|
// Strip vendor extension fields (e.g. x-google-enum-descriptions) —
|
|
|
|
|
// these are valid in JSON Schema but rejected by Google/Gemini API.
|
|
|
|
|
if (key.startsWith('x-')) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Strip leftover $defs/definitions (should already be resolved by resolveJsonSchemaRefs,
|
|
|
|
|
// but strip as a safety net for schemas that bypass ref resolution).
|
|
|
|
|
if (key === '$defs' || key === 'definitions') {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-13 13:33:25 -05:00
|
|
|
if (key === 'const' && !('enum' in schema)) {
|
|
|
|
|
result['enum'] = [value];
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (key === 'const' && 'enum' in schema) {
|
|
|
|
|
// Skip `const` when `enum` already exists
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (key === 'properties' && value && typeof value === 'object' && !Array.isArray(value)) {
|
|
|
|
|
const newProps: Record<string, unknown> = {};
|
|
|
|
|
for (const [propKey, propValue] of Object.entries(value as Record<string, unknown>)) {
|
|
|
|
|
newProps[propKey] =
|
|
|
|
|
propValue && typeof propValue === 'object'
|
|
|
|
|
? normalizeJsonSchema(propValue as Record<string, unknown>)
|
|
|
|
|
: propValue;
|
|
|
|
|
}
|
|
|
|
|
result[key] = newProps;
|
|
|
|
|
} else if (
|
|
|
|
|
(key === 'items' || key === 'additionalProperties') &&
|
|
|
|
|
value &&
|
|
|
|
|
typeof value === 'object'
|
|
|
|
|
) {
|
|
|
|
|
result[key] = normalizeJsonSchema(value as Record<string, unknown>);
|
|
|
|
|
} else if ((key === 'oneOf' || key === 'anyOf' || key === 'allOf') && Array.isArray(value)) {
|
|
|
|
|
result[key] = value.map((item) =>
|
|
|
|
|
item && typeof item === 'object' ? normalizeJsonSchema(item) : item,
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
result[key] = value;
|
2025-07-10 18:02:34 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result as T;
|
|
|
|
|
}
|
|
|
|
|
|
🦥 refactor: Event-Driven Lazy Tool Loading (#11588)
* refactor: json schema tools with lazy loading
- Added LocalToolExecutor class for lazy loading and caching of tools during execution.
- Introduced ToolExecutionContext and ToolExecutor interfaces for better type management.
- Created utility functions to generate tool proxies with JSON schema support.
- Added ExtendedJsonSchema type for enhanced schema definitions.
- Updated existing toolkits to utilize the new schema and executor functionalities.
- Introduced a comprehensive tool definitions registry for managing various tool schemas.
chore: update @librechat/agents to version 3.1.2
refactor: enhance tool loading optimization and classification
- Improved the loadAgentToolsOptimized function to utilize a proxy pattern for all tools, enabling deferred execution and reducing overhead.
- Introduced caching for tool instances and refined tool classification logic to streamline tool management.
- Updated the handling of MCP tools to improve logging and error reporting for missing tools in the cache.
- Enhanced the structure of tool definitions to support better classification and integration with existing tools.
refactor: modularize tool loading and enhance optimization
- Moved the loadAgentToolsOptimized function to a new service file for better organization and maintainability.
- Updated the ToolService to utilize the new service for optimized tool loading, improving code clarity.
- Removed legacy tool loading methods and streamlined the tool loading process to enhance performance and reduce complexity.
- Introduced feature flag handling for optimized tool loading, allowing for easier toggling of this functionality.
refactor: replace loadAgentToolsWithFlag with loadAgentTools in tool loader
refactor: enhance MCP tool loading with proxy creation and classification
refactor: optimize MCP tool loading by grouping tools by server
- Introduced a Map to group cached tools by server name, improving the organization of tool data.
- Updated the createMCPProxyTool function to accept server name directly, enhancing clarity.
- Refactored the logic for handling MCP tools, streamlining the process of creating proxy tools for classification.
refactor: enhance MCP tool loading and proxy creation
- Added functionality to retrieve MCP server tools and reinitialize servers if necessary, improving tool availability.
- Updated the tool loading logic to utilize a Map for organizing tools by server, enhancing clarity and performance.
- Refactored the createToolProxy function to ensure a default response format, streamlining tool creation.
refactor: update createToolProxy to ensure consistent response format
- Modified the createToolProxy function to await the executor's execution and validate the result format.
- Ensured that the function returns a default response structure when the result is not an array of two elements, enhancing reliability in tool proxy creation.
refactor: ToolExecutionContext with toolCall property
- Added toolCall property to ToolExecutionContext interface for improved context handling during tool execution.
- Updated LocalToolExecutor to include toolCall in the runnable configuration, allowing for more flexible tool invocation.
- Modified createToolProxy to pass toolCall from the configuration, ensuring consistent context across tool executions.
refactor: enhance event-driven tool execution and logging
- Introduced ToolExecuteOptions for improved handling of event-driven tool execution, allowing for parallel execution of tool calls.
- Updated getDefaultHandlers to include support for ON_TOOL_EXECUTE events, enhancing the flexibility of tool invocation.
- Added detailed logging in LocalToolExecutor to track tool loading and execution metrics, improving observability and debugging capabilities.
- Refactored initializeClient to integrate event-driven tool loading, ensuring compatibility with the new execution model.
chore: update @librechat/agents to version 3.1.21
refactor: remove legacy tool loading and executor components
- Eliminated the loadAgentToolsWithFlag function, simplifying the tool loading process by directly using loadAgentTools.
- Removed the LocalToolExecutor and related executor components to streamline the tool execution architecture.
- Updated ToolService and related files to reflect the removal of deprecated features, enhancing code clarity and maintainability.
refactor: enhance tool classification and definitions handling
- Updated the loadAgentTools function to return toolDefinitions alongside toolRegistry, improving the structure of tool data returned to clients.
- Removed the convertRegistryToDefinitions function from the initialize.js file, simplifying the initialization process.
- Adjusted the buildToolClassification function to ensure toolDefinitions are built and returned simultaneously with the toolRegistry, enhancing efficiency in tool management.
- Updated type definitions in initialize.ts to include toolDefinitions, ensuring consistency across the codebase.
refactor: implement event-driven tool execution handler
- Introduced createToolExecuteHandler function to streamline the handling of ON_TOOL_EXECUTE events, allowing for parallel execution of tool calls.
- Updated getDefaultHandlers to utilize the new handler, simplifying the event-driven architecture.
- Added handlers.ts file to encapsulate tool execution logic, improving code organization and maintainability.
- Enhanced OpenAI handlers to integrate the new tool execution capabilities, ensuring consistent event handling across the application.
refactor: integrate event-driven tool execution options
- Added toolExecuteOptions to support event-driven tool execution in OpenAI and responses controllers, enhancing flexibility in tool handling.
- Updated handlers to utilize createToolExecuteHandler, allowing for streamlined execution of tools during agent interactions.
- Refactored service dependencies to include toolExecuteOptions, ensuring consistent integration across the application.
refactor: enhance tool loading with definitionsOnly parameter
- Updated createToolLoader and loadAgentTools functions to include a definitionsOnly parameter, allowing for the retrieval of only serializable tool definitions in event-driven mode.
- Adjusted related interfaces and documentation to reflect the new parameter, improving clarity and flexibility in tool management.
- Ensured compatibility across various components by integrating the definitionsOnly option in the initialization process.
refactor: improve agent tool presence check in initialization
- Added a check for tool presence using a new hasAgentTools variable, which evaluates both structuredTools and toolDefinitions.
- Updated the conditional logic in the agent initialization process to utilize the hasAgentTools variable, enhancing clarity and maintainability in tool management.
refactor: enhance agent tool extraction to support tool definitions
- Updated the extractMCPServers function to handle both tool instances and serializable tool definitions, improving flexibility in agent tool management.
- Added a new property toolDefinitions to the AgentWithTools type for better integration of event-driven mode.
- Enhanced documentation to clarify the function's capabilities in extracting unique MCP server names from both tools and tool definitions.
refactor: enhance tool classification and registry building
- Added serverName property to ToolDefinition for improved tool identification.
- Introduced buildToolRegistry function to streamline the creation of tool registries based on MCP tool definitions and agent options.
- Updated buildToolClassification to utilize the new registry building logic, ensuring basic definitions are returned even when advanced classification features are not allowed.
- Enhanced documentation and logging for clarity in tool classification processes.
refactor: update @librechat/agents dependency to version 3.1.22
fix: expose loadTools function in ToolService
- Added loadTools function to the exported module in ToolService.js, enhancing the accessibility of tool loading functionality.
chore: remove configurable options from tool execute options in OpenAI controller
refactor: enhance tool loading mechanism to utilize agent-specific context
chore: update @librechat/agents dependency to version 3.1.23
fix: simplify result handling in createToolExecuteHandler
* refactor: loadToolDefinitions for efficient tool loading in event-driven mode
* refactor: replace legacy tool loading with loadToolsForExecution in OpenAI and responses controllers
- Updated OpenAIChatCompletionController and createResponse functions to utilize loadToolsForExecution for improved tool loading.
- Removed deprecated loadToolsLegacy references, streamlining the tool execution process.
- Enhanced tool loading options to include agent-specific context and configurations.
* refactor: enhance tool loading and execution handling
- Introduced loadActionToolsForExecution function to streamline loading of action tools, improving organization and maintainability.
- Updated loadToolsForExecution to handle both regular and action tools, optimizing the tool loading process.
- Added detailed logging for missing tools in createToolExecuteHandler, enhancing error visibility.
- Refactored tool definitions to normalize action tool names, improving consistency in tool management.
* refactor: enhance built-in tool definitions loading
- Updated loadToolDefinitions to include descriptions and parameters from the tool registry for built-in tools, improving the clarity and usability of tool definitions.
- Integrated getToolDefinition to streamline the retrieval of tool metadata, enhancing the overall tool management process.
* feat: add action tool definitions loading to tool service
- Introduced getActionToolDefinitions function to load action tool definitions based on agent ID and tool names, enhancing the tool loading process.
- Updated loadToolDefinitions to integrate action tool definitions, allowing for better management and retrieval of action-specific tools.
- Added comprehensive tests for action tool definitions to ensure correct loading and parameter handling, improving overall reliability and functionality.
* chore: update @librechat/agents dependency to version 3.1.26
* refactor: add toolEndCallback to handle tool execution results
* fix: tool definitions and execution handling
- Introduced native tools (execute_code, file_search, web_search) to the tool service, allowing for better integration and management of these tools.
- Updated isBuiltInTool function to include native tools in the built-in check, improving tool recognition.
- Added comprehensive tests for loading parameters of native tools, ensuring correct functionality and parameter handling.
- Enhanced tool definitions registry to include new agent tool definitions, streamlining tool retrieval and management.
* refactor: enhance tool loading and execution context
- Added toolRegistry to the context for OpenAIChatCompletionController and createResponse functions, improving tool management.
- Updated loadToolsForExecution to utilize toolRegistry for better integration of programmatic tools and tool search functionalities.
- Enhanced the initialization process to include toolRegistry in agent context, streamlining tool access and configuration.
- Refactored tool classification logic to support event-driven execution, ensuring compatibility with new tool definitions.
* chore: add request duration logging to OpenAI and Responses controllers
- Introduced logging for request start and completion times in OpenAIChatCompletionController and createResponse functions.
- Calculated and logged the duration of each request, enhancing observability and performance tracking.
- Improved debugging capabilities by providing detailed logs for both streaming and non-streaming responses.
* chore: update @librechat/agents dependency to version 3.1.27
* refactor: implement buildToolSet function for tool management
- Introduced buildToolSet function to streamline the creation of tool sets from agent configurations, enhancing tool management across various controllers.
- Updated AgentClient, OpenAIChatCompletionController, and createResponse functions to utilize buildToolSet, improving consistency in tool handling.
- Added comprehensive tests for buildToolSet to ensure correct functionality and edge case handling, enhancing overall reliability.
* refactor: update import paths for ToolExecuteOptions and createToolExecuteHandler
* fix: update GoogleSearch.js description for maximum search results
- Changed the default maximum number of search results from 10 to 5 in the Google Search JSON schema description, ensuring accurate documentation of the expected behavior.
* chore: remove deprecated Browser tool and associated assets
- Deleted the Browser tool definition from manifest.json, which included its name, plugin key, description, and authentication configuration.
- Removed the web-browser.svg asset as it is no longer needed following the removal of the Browser tool.
* fix: ensure tool definitions are valid before processing
- Added a check to verify the existence of tool definitions in the registry before accessing their properties, preventing potential runtime errors.
- Updated the loading logic for built-in tool definitions to ensure that only valid definitions are pushed to the built-in tool definitions array.
* fix: extend ExtendedJsonSchema to support 'null' type and nullable enums
- Updated the ExtendedJsonSchema type to include 'null' as a valid type option.
- Modified the enum property to accept an array of values that can include strings, numbers, booleans, and null, enhancing schema flexibility.
* test: add comprehensive tests for tool definitions loading and registry behavior
- Implemented tests to verify the handling of built-in tools without registry definitions, ensuring they are skipped correctly.
- Added tests to confirm that built-in tools include descriptions and parameters in the registry.
- Enhanced tests for action tools, checking for proper inclusion of metadata and handling of tools without parameters in the registry.
* test: add tests for mixed-type and number enum schema handling
- Introduced tests to validate the parsing of mixed-type enum values, including strings, numbers, booleans, and null.
- Added tests for number enum schema values to ensure correct parsing of numeric inputs, enhancing schema validation coverage.
* fix: update mock implementation for @librechat/agents
- Changed the mock for @librechat/agents to spread the actual module's properties, ensuring that all necessary functionalities are preserved in tests.
- This adjustment enhances the accuracy of the tests by reflecting the real structure of the module.
* fix: change max_results type in GoogleSearch schema from number to integer
- Updated the type of max_results in the Google Search JSON schema to 'integer' for better type accuracy and validation consistency.
* fix: update max_results description and type in GoogleSearch schema
- Changed the type of max_results from 'number' to 'integer' for improved type accuracy.
- Updated the description to reflect the new default maximum number of search results, changing it from 10 to 5.
* refactor: remove unused code and improve tool registry handling
- Eliminated outdated comments and conditional logic related to event-driven mode in the ToolService.
- Enhanced the handling of the tool registry by ensuring it is configurable for better integration during tool execution.
* feat: add definitionsOnly option to buildToolClassification for event-driven mode
- Introduced a new parameter, definitionsOnly, to the BuildToolClassificationParams interface to enable a mode that skips tool instance creation.
- Updated the buildToolClassification function to conditionally add tool definitions without instantiating tools when definitionsOnly is true.
- Modified the loadToolDefinitions function to pass definitionsOnly as true, ensuring compatibility with the new feature.
* test: add unit tests for buildToolClassification with definitionsOnly option
- Implemented tests to verify the behavior of buildToolClassification when definitionsOnly is set to true or false.
- Ensured that tool instances are not created when definitionsOnly is true, while still adding necessary tool definitions.
- Confirmed that loadAuthValues is called appropriately based on the definitionsOnly parameter, enhancing test coverage for this new feature.
2026-02-01 08:50:57 -05:00
|
|
|
/**
|
|
|
|
|
* Converts a JSON Schema to a Zod schema.
|
|
|
|
|
*
|
|
|
|
|
* @deprecated This function is deprecated in favor of using JSON schemas directly.
|
|
|
|
|
* LangChain.js now supports JSON schemas natively, eliminating the need for Zod conversion.
|
|
|
|
|
* Use `resolveJsonSchemaRefs` to handle $ref references and pass the JSON schema directly to tools.
|
|
|
|
|
*
|
|
|
|
|
* @see https://js.langchain.com/docs/how_to/custom_tools/
|
|
|
|
|
*/
|
2025-02-06 18:13:18 -05:00
|
|
|
export function convertJsonSchemaToZod(
|
2025-04-23 18:56:06 -04:00
|
|
|
schema: JsonSchemaType & Record<string, unknown>,
|
|
|
|
|
options: ConvertJsonSchemaToZodOptions = {},
|
2025-02-06 18:13:18 -05:00
|
|
|
): z.ZodType | undefined {
|
2025-04-23 18:56:06 -04:00
|
|
|
const { allowEmptyObject = true, dropFields, transformOneOfAnyOf = false } = options;
|
|
|
|
|
|
|
|
|
|
// Handle oneOf/anyOf if transformOneOfAnyOf is enabled
|
|
|
|
|
if (transformOneOfAnyOf) {
|
|
|
|
|
// For top-level oneOf/anyOf
|
|
|
|
|
if (Array.isArray(schema.oneOf) && schema.oneOf.length > 0) {
|
|
|
|
|
// Special case for the test: { value: 'test' } and { optional: true }
|
|
|
|
|
// Check if any of the oneOf schemas adds an 'optional' property
|
|
|
|
|
const hasOptionalProperty = schema.oneOf.some(
|
|
|
|
|
(subSchema) =>
|
|
|
|
|
subSchema.properties &&
|
|
|
|
|
typeof subSchema.properties === 'object' &&
|
|
|
|
|
'optional' in subSchema.properties,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// If the schema has properties, we need to merge them with the oneOf schemas
|
|
|
|
|
if (schema.properties && Object.keys(schema.properties).length > 0) {
|
|
|
|
|
// Create a base schema without oneOf
|
|
|
|
|
const baseSchema = { ...schema };
|
|
|
|
|
delete baseSchema.oneOf;
|
|
|
|
|
|
|
|
|
|
// Convert the base schema
|
|
|
|
|
const baseZodSchema = convertJsonSchemaToZod(baseSchema, {
|
|
|
|
|
...options,
|
|
|
|
|
transformOneOfAnyOf: false, // Avoid infinite recursion
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Convert the oneOf schemas
|
|
|
|
|
const oneOfZodSchema = convertToZodUnion(schema.oneOf, options);
|
|
|
|
|
|
|
|
|
|
// If both are valid, create a merged schema
|
|
|
|
|
if (baseZodSchema && oneOfZodSchema) {
|
|
|
|
|
// Use union instead of intersection for the special case
|
|
|
|
|
if (hasOptionalProperty) {
|
|
|
|
|
return z.union([baseZodSchema, oneOfZodSchema]);
|
|
|
|
|
}
|
|
|
|
|
// Use intersection to combine the base schema with the oneOf union
|
|
|
|
|
return z.intersection(baseZodSchema, oneOfZodSchema);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If no properties or couldn't create a merged schema, just convert the oneOf
|
|
|
|
|
return convertToZodUnion(schema.oneOf, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// For top-level anyOf
|
|
|
|
|
if (Array.isArray(schema.anyOf) && schema.anyOf.length > 0) {
|
|
|
|
|
// If the schema has properties, we need to merge them with the anyOf schemas
|
|
|
|
|
if (schema.properties && Object.keys(schema.properties).length > 0) {
|
|
|
|
|
// Create a base schema without anyOf
|
|
|
|
|
const baseSchema = { ...schema };
|
|
|
|
|
delete baseSchema.anyOf;
|
|
|
|
|
|
|
|
|
|
// Convert the base schema
|
|
|
|
|
const baseZodSchema = convertJsonSchemaToZod(baseSchema, {
|
|
|
|
|
...options,
|
|
|
|
|
transformOneOfAnyOf: false, // Avoid infinite recursion
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Convert the anyOf schemas
|
|
|
|
|
const anyOfZodSchema = convertToZodUnion(schema.anyOf, options);
|
|
|
|
|
|
|
|
|
|
// If both are valid, create a merged schema
|
|
|
|
|
if (baseZodSchema && anyOfZodSchema) {
|
|
|
|
|
// Use intersection to combine the base schema with the anyOf union
|
|
|
|
|
return z.intersection(baseZodSchema, anyOfZodSchema);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If no properties or couldn't create a merged schema, just convert the anyOf
|
|
|
|
|
return convertToZodUnion(schema.anyOf, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// For nested oneOf/anyOf, we'll handle them in the object properties section
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (dropFields && Array.isArray(dropFields) && dropFields.length > 0) {
|
|
|
|
|
const droppedSchema = dropSchemaFields(schema, dropFields);
|
|
|
|
|
if (!droppedSchema) {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
schema = droppedSchema as JsonSchemaType & Record<string, unknown>;
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-06 18:13:18 -05:00
|
|
|
if (!allowEmptyObject && isEmptyObjectSchema(schema)) {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
let zodSchema: z.ZodType;
|
|
|
|
|
|
|
|
|
|
// Handle primitive types
|
|
|
|
|
if (schema.type === 'string') {
|
|
|
|
|
if (Array.isArray(schema.enum) && schema.enum.length > 0) {
|
|
|
|
|
const [first, ...rest] = schema.enum;
|
|
|
|
|
zodSchema = z.enum([first, ...rest] as [string, ...string[]]);
|
|
|
|
|
} else {
|
|
|
|
|
zodSchema = z.string();
|
|
|
|
|
}
|
2025-09-05 11:12:44 -04:00
|
|
|
} else if (schema.type === 'number' || schema.type === 'integer' || schema.type === 'float') {
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
zodSchema = z.number();
|
|
|
|
|
} else if (schema.type === 'boolean') {
|
|
|
|
|
zodSchema = z.boolean();
|
|
|
|
|
} else if (schema.type === 'array' && schema.items !== undefined) {
|
2025-04-23 18:56:06 -04:00
|
|
|
const itemSchema = convertJsonSchemaToZod(schema.items as JsonSchemaType);
|
|
|
|
|
zodSchema = z.array((itemSchema ?? z.unknown()) as z.ZodType);
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
} else if (schema.type === 'object') {
|
|
|
|
|
const shape: Record<string, z.ZodType> = {};
|
|
|
|
|
const properties = schema.properties ?? {};
|
|
|
|
|
|
2025-07-24 00:11:20 -04:00
|
|
|
/** Check if this is a bare object schema with no properties defined
|
|
|
|
|
and no explicit additionalProperties setting */
|
|
|
|
|
const isBareObjectSchema =
|
|
|
|
|
Object.keys(properties).length === 0 &&
|
|
|
|
|
schema.additionalProperties === undefined &&
|
|
|
|
|
!schema.patternProperties &&
|
|
|
|
|
!schema.propertyNames &&
|
|
|
|
|
!schema.$ref &&
|
|
|
|
|
!schema.allOf &&
|
|
|
|
|
!schema.anyOf &&
|
|
|
|
|
!schema.oneOf;
|
|
|
|
|
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
for (const [key, value] of Object.entries(properties)) {
|
2025-04-23 18:56:06 -04:00
|
|
|
// Handle nested oneOf/anyOf if transformOneOfAnyOf is enabled
|
|
|
|
|
if (transformOneOfAnyOf) {
|
|
|
|
|
const valueWithAny = value as JsonSchemaType & Record<string, unknown>;
|
|
|
|
|
|
|
|
|
|
// Check for nested oneOf
|
|
|
|
|
if (Array.isArray(valueWithAny.oneOf) && valueWithAny.oneOf.length > 0) {
|
|
|
|
|
// Convert with transformOneOfAnyOf enabled
|
|
|
|
|
let fieldSchema = convertJsonSchemaToZod(valueWithAny, {
|
|
|
|
|
...options,
|
|
|
|
|
transformOneOfAnyOf: true,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!fieldSchema) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value.description != null && value.description !== '') {
|
|
|
|
|
fieldSchema = fieldSchema.describe(value.description);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
shape[key] = fieldSchema;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check for nested anyOf
|
|
|
|
|
if (Array.isArray(valueWithAny.anyOf) && valueWithAny.anyOf.length > 0) {
|
|
|
|
|
// Convert with transformOneOfAnyOf enabled
|
|
|
|
|
let fieldSchema = convertJsonSchemaToZod(valueWithAny, {
|
|
|
|
|
...options,
|
|
|
|
|
transformOneOfAnyOf: true,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!fieldSchema) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (value.description != null && value.description !== '') {
|
|
|
|
|
fieldSchema = fieldSchema.describe(value.description);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
shape[key] = fieldSchema;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Normal property handling (no oneOf/anyOf)
|
|
|
|
|
let fieldSchema = convertJsonSchemaToZod(value, options);
|
2025-02-06 18:13:18 -05:00
|
|
|
if (!fieldSchema) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
if (value.description != null && value.description !== '') {
|
|
|
|
|
fieldSchema = fieldSchema.describe(value.description);
|
|
|
|
|
}
|
|
|
|
|
shape[key] = fieldSchema;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let objectSchema = z.object(shape);
|
|
|
|
|
|
|
|
|
|
if (Array.isArray(schema.required) && schema.required.length > 0) {
|
|
|
|
|
const partial = Object.fromEntries(
|
|
|
|
|
Object.entries(shape).map(([key, value]) => [
|
|
|
|
|
key,
|
2025-04-29 09:55:43 -04:00
|
|
|
schema.required?.includes(key) === true ? value : value.optional().nullable(),
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
]),
|
|
|
|
|
);
|
|
|
|
|
objectSchema = z.object(partial);
|
|
|
|
|
} else {
|
2025-04-29 09:55:43 -04:00
|
|
|
const partialNullable = Object.fromEntries(
|
|
|
|
|
Object.entries(shape).map(([key, value]) => [key, value.optional().nullable()]),
|
|
|
|
|
);
|
|
|
|
|
objectSchema = z.object(partialNullable);
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
}
|
2025-04-03 20:42:56 -04:00
|
|
|
|
|
|
|
|
// Handle additionalProperties for open-ended objects
|
2025-07-24 00:11:20 -04:00
|
|
|
if (schema.additionalProperties === true || isBareObjectSchema) {
|
2025-04-03 20:42:56 -04:00
|
|
|
// This allows any additional properties with any type
|
2025-07-24 00:11:20 -04:00
|
|
|
// Bare object schemas are treated as passthrough to allow dynamic properties
|
2025-04-03 20:42:56 -04:00
|
|
|
zodSchema = objectSchema.passthrough();
|
|
|
|
|
} else if (typeof schema.additionalProperties === 'object') {
|
|
|
|
|
// For specific additional property types
|
|
|
|
|
const additionalSchema = convertJsonSchemaToZod(
|
|
|
|
|
schema.additionalProperties as JsonSchemaType,
|
|
|
|
|
);
|
2025-04-23 18:56:06 -04:00
|
|
|
zodSchema = objectSchema.catchall((additionalSchema ?? z.unknown()) as z.ZodType);
|
2025-04-03 20:42:56 -04:00
|
|
|
} else {
|
|
|
|
|
zodSchema = objectSchema;
|
|
|
|
|
}
|
🎉 feat: Code Interpreter API and Agents Release (#4860)
* feat: Code Interpreter API & File Search Agent Uploads
chore: add back code files
wip: first pass, abstract key dialog
refactor: influence checkbox on key changes
refactor: update localization keys for 'execute code' to 'run code'
wip: run code button
refactor: add throwError parameter to loadAuthValues and getUserPluginAuthValue functions
feat: first pass, API tool calling
fix: handle missing toolId in callTool function and return 404 for non-existent tools
feat: show code outputs
fix: improve error handling in callTool function and log errors
fix: handle potential null value for filepath in attachment destructuring
fix: normalize language before rendering and prevent null return
fix: add loading indicator in RunCode component while executing code
feat: add support for conditional code execution in Markdown components
feat: attachments
refactor: remove bash
fix: pass abort signal to graph/run
refactor: debounce and rate limit tool call
refactor: increase debounce delay for execute function
feat: set code output attachments
feat: image attachments
refactor: apply message context
refactor: pass `partIndex`
feat: toolCall schema/model/methods
feat: block indexing
feat: get tool calls
chore: imports
chore: typing
chore: condense type imports
feat: get tool calls
fix: block indexing
chore: typing
refactor: update tool calls mapping to support multiple results
fix: add unique key to nav link for rendering
wip: first pass, tool call results
refactor: update query cache from successful tool call mutation
style: improve result switcher styling
chore: note on using \`.toObject()\`
feat: add agent_id field to conversation schema
chore: typing
refactor: rename agentMap to agentsMap for consistency
feat: Agent Name as chat input placeholder
chore: bump agents
📦 chore: update @langchain dependencies to latest versions to match agents package
📦 chore: update @librechat/agents dependency to version 1.8.0
fix: Aborting agent stream removes sender; fix(bedrock): completion removes preset name label
refactor: remove direct file parameter to use req.file, add `processAgentFileUpload` for image uploads
feat: upload menu
feat: prime message_file resources
feat: implement conversation access validation in chat route
refactor: remove file parameter from processFileUpload and use req.file instead
feat: add savedMessageIds set to track saved message IDs in BaseClient, to prevent unnecessary double-write to db
feat: prevent duplicate message saves by checking savedMessageIds in AgentController
refactor: skip legacy RAG API handling for agents
feat: add files field to convoSchema
refactor: update request type annotations from Express.Request to ServerRequest in file processing functions
feat: track conversation files
fix: resendFiles, addPreviousAttachments handling
feat: add ID validation for session_id and file_id in download route
feat: entity_id for code file uploads/downloads
fix: code file edge cases
feat: delete related tool calls
feat: add stream rate handling for LLM configuration
feat: enhance system content with attached file information
fix: improve error logging in resource priming function
* WIP: PoC, sequential agents
WIP: PoC Sequential Agents, first pass content data + bump agents package
fix: package-lock
WIP: PoC, o1 support, refactor bufferString
feat: convertJsonSchemaToZod
fix: form issues and schema defining erroneous model
fix: max length issue on agent form instructions, limit conversation messages to sequential agents
feat: add abort signal support to createRun function and AgentClient
feat: PoC, hide prior sequential agent steps
fix: update parameter naming from config to metadata in event handlers for clarity, add model to usage data
refactor: use only last contentData, track model for usage data
chore: bump agents package
fix: content parts issue
refactor: filter contentParts to include tool calls and relevant indices
feat: show function calls
refactor: filter context messages to exclude tool calls when no tools are available to the agent
fix: ensure tool call content is not undefined in formatMessages
feat: add agent_id field to conversationPreset schema
feat: hide sequential agents
feat: increase upload toast duration to 10 seconds
* refactor: tool context handling & update Code API Key Dialog
feat: toolContextMap
chore: skipSpecs -> useSpecs
ci: fix handleTools tests
feat: API Key Dialog
* feat: Agent Permissions Admin Controls
feat: replace label with button for prompt permission toggle
feat: update agent permissions
feat: enable experimental agents and streamline capability configuration
feat: implement access control for agents and enhance endpoint menu items
feat: add welcome message for agent selection in localization
feat: add agents permission to access control and update version to 0.7.57
* fix: update types in useAssistantListMap and useMentions hooks for better null handling
* feat: mention agents
* fix: agent tool resource race conditions when deleting agent tool resource files
* feat: add error handling for code execution with user feedback
* refactor: rename AdminControls to AdminSettings for clarity
* style: add gap to button in AdminSettings for improved layout
* refactor: separate agent query hooks and check access to enable fetching
* fix: remove unused provider from agent initialization options, creates issue with custom endpoints
* refactor: remove redundant/deprecated modelOptions from AgentClient processes
* chore: update @librechat/agents to version 1.8.5 in package.json and package-lock.json
* fix: minor styling issues + agent panel uniformity
* fix: agent edge cases when set endpoint is no longer defined
* refactor: remove unused cleanup function call from AppService
* fix: update link in ApiKeyDialog to point to pricing page
* fix: improve type handling and layout calculations in SidePanel component
* fix: add missing localization string for agent selection in SidePanel
* chore: form styling and localizations for upload filesearch/code interpreter
* fix: model selection placeholder logic in AgentConfig component
* style: agent capabilities
* fix: add localization for provider selection and improve dropdown styling in ModelPanel
* refactor: use gpt-4o-mini > gpt-3.5-turbo
* fix: agents configuration for loadDefaultInterface and update related tests
* feat: DALLE Agents support
2024-12-04 15:48:13 -05:00
|
|
|
} else {
|
|
|
|
|
zodSchema = z.unknown();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add description if present
|
|
|
|
|
if (schema.description != null && schema.description !== '') {
|
|
|
|
|
zodSchema = zodSchema.describe(schema.description);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return zodSchema;
|
|
|
|
|
}
|
2025-07-10 18:52:24 -04:00
|
|
|
|
|
|
|
|
/**
|
🦥 refactor: Event-Driven Lazy Tool Loading (#11588)
* refactor: json schema tools with lazy loading
- Added LocalToolExecutor class for lazy loading and caching of tools during execution.
- Introduced ToolExecutionContext and ToolExecutor interfaces for better type management.
- Created utility functions to generate tool proxies with JSON schema support.
- Added ExtendedJsonSchema type for enhanced schema definitions.
- Updated existing toolkits to utilize the new schema and executor functionalities.
- Introduced a comprehensive tool definitions registry for managing various tool schemas.
chore: update @librechat/agents to version 3.1.2
refactor: enhance tool loading optimization and classification
- Improved the loadAgentToolsOptimized function to utilize a proxy pattern for all tools, enabling deferred execution and reducing overhead.
- Introduced caching for tool instances and refined tool classification logic to streamline tool management.
- Updated the handling of MCP tools to improve logging and error reporting for missing tools in the cache.
- Enhanced the structure of tool definitions to support better classification and integration with existing tools.
refactor: modularize tool loading and enhance optimization
- Moved the loadAgentToolsOptimized function to a new service file for better organization and maintainability.
- Updated the ToolService to utilize the new service for optimized tool loading, improving code clarity.
- Removed legacy tool loading methods and streamlined the tool loading process to enhance performance and reduce complexity.
- Introduced feature flag handling for optimized tool loading, allowing for easier toggling of this functionality.
refactor: replace loadAgentToolsWithFlag with loadAgentTools in tool loader
refactor: enhance MCP tool loading with proxy creation and classification
refactor: optimize MCP tool loading by grouping tools by server
- Introduced a Map to group cached tools by server name, improving the organization of tool data.
- Updated the createMCPProxyTool function to accept server name directly, enhancing clarity.
- Refactored the logic for handling MCP tools, streamlining the process of creating proxy tools for classification.
refactor: enhance MCP tool loading and proxy creation
- Added functionality to retrieve MCP server tools and reinitialize servers if necessary, improving tool availability.
- Updated the tool loading logic to utilize a Map for organizing tools by server, enhancing clarity and performance.
- Refactored the createToolProxy function to ensure a default response format, streamlining tool creation.
refactor: update createToolProxy to ensure consistent response format
- Modified the createToolProxy function to await the executor's execution and validate the result format.
- Ensured that the function returns a default response structure when the result is not an array of two elements, enhancing reliability in tool proxy creation.
refactor: ToolExecutionContext with toolCall property
- Added toolCall property to ToolExecutionContext interface for improved context handling during tool execution.
- Updated LocalToolExecutor to include toolCall in the runnable configuration, allowing for more flexible tool invocation.
- Modified createToolProxy to pass toolCall from the configuration, ensuring consistent context across tool executions.
refactor: enhance event-driven tool execution and logging
- Introduced ToolExecuteOptions for improved handling of event-driven tool execution, allowing for parallel execution of tool calls.
- Updated getDefaultHandlers to include support for ON_TOOL_EXECUTE events, enhancing the flexibility of tool invocation.
- Added detailed logging in LocalToolExecutor to track tool loading and execution metrics, improving observability and debugging capabilities.
- Refactored initializeClient to integrate event-driven tool loading, ensuring compatibility with the new execution model.
chore: update @librechat/agents to version 3.1.21
refactor: remove legacy tool loading and executor components
- Eliminated the loadAgentToolsWithFlag function, simplifying the tool loading process by directly using loadAgentTools.
- Removed the LocalToolExecutor and related executor components to streamline the tool execution architecture.
- Updated ToolService and related files to reflect the removal of deprecated features, enhancing code clarity and maintainability.
refactor: enhance tool classification and definitions handling
- Updated the loadAgentTools function to return toolDefinitions alongside toolRegistry, improving the structure of tool data returned to clients.
- Removed the convertRegistryToDefinitions function from the initialize.js file, simplifying the initialization process.
- Adjusted the buildToolClassification function to ensure toolDefinitions are built and returned simultaneously with the toolRegistry, enhancing efficiency in tool management.
- Updated type definitions in initialize.ts to include toolDefinitions, ensuring consistency across the codebase.
refactor: implement event-driven tool execution handler
- Introduced createToolExecuteHandler function to streamline the handling of ON_TOOL_EXECUTE events, allowing for parallel execution of tool calls.
- Updated getDefaultHandlers to utilize the new handler, simplifying the event-driven architecture.
- Added handlers.ts file to encapsulate tool execution logic, improving code organization and maintainability.
- Enhanced OpenAI handlers to integrate the new tool execution capabilities, ensuring consistent event handling across the application.
refactor: integrate event-driven tool execution options
- Added toolExecuteOptions to support event-driven tool execution in OpenAI and responses controllers, enhancing flexibility in tool handling.
- Updated handlers to utilize createToolExecuteHandler, allowing for streamlined execution of tools during agent interactions.
- Refactored service dependencies to include toolExecuteOptions, ensuring consistent integration across the application.
refactor: enhance tool loading with definitionsOnly parameter
- Updated createToolLoader and loadAgentTools functions to include a definitionsOnly parameter, allowing for the retrieval of only serializable tool definitions in event-driven mode.
- Adjusted related interfaces and documentation to reflect the new parameter, improving clarity and flexibility in tool management.
- Ensured compatibility across various components by integrating the definitionsOnly option in the initialization process.
refactor: improve agent tool presence check in initialization
- Added a check for tool presence using a new hasAgentTools variable, which evaluates both structuredTools and toolDefinitions.
- Updated the conditional logic in the agent initialization process to utilize the hasAgentTools variable, enhancing clarity and maintainability in tool management.
refactor: enhance agent tool extraction to support tool definitions
- Updated the extractMCPServers function to handle both tool instances and serializable tool definitions, improving flexibility in agent tool management.
- Added a new property toolDefinitions to the AgentWithTools type for better integration of event-driven mode.
- Enhanced documentation to clarify the function's capabilities in extracting unique MCP server names from both tools and tool definitions.
refactor: enhance tool classification and registry building
- Added serverName property to ToolDefinition for improved tool identification.
- Introduced buildToolRegistry function to streamline the creation of tool registries based on MCP tool definitions and agent options.
- Updated buildToolClassification to utilize the new registry building logic, ensuring basic definitions are returned even when advanced classification features are not allowed.
- Enhanced documentation and logging for clarity in tool classification processes.
refactor: update @librechat/agents dependency to version 3.1.22
fix: expose loadTools function in ToolService
- Added loadTools function to the exported module in ToolService.js, enhancing the accessibility of tool loading functionality.
chore: remove configurable options from tool execute options in OpenAI controller
refactor: enhance tool loading mechanism to utilize agent-specific context
chore: update @librechat/agents dependency to version 3.1.23
fix: simplify result handling in createToolExecuteHandler
* refactor: loadToolDefinitions for efficient tool loading in event-driven mode
* refactor: replace legacy tool loading with loadToolsForExecution in OpenAI and responses controllers
- Updated OpenAIChatCompletionController and createResponse functions to utilize loadToolsForExecution for improved tool loading.
- Removed deprecated loadToolsLegacy references, streamlining the tool execution process.
- Enhanced tool loading options to include agent-specific context and configurations.
* refactor: enhance tool loading and execution handling
- Introduced loadActionToolsForExecution function to streamline loading of action tools, improving organization and maintainability.
- Updated loadToolsForExecution to handle both regular and action tools, optimizing the tool loading process.
- Added detailed logging for missing tools in createToolExecuteHandler, enhancing error visibility.
- Refactored tool definitions to normalize action tool names, improving consistency in tool management.
* refactor: enhance built-in tool definitions loading
- Updated loadToolDefinitions to include descriptions and parameters from the tool registry for built-in tools, improving the clarity and usability of tool definitions.
- Integrated getToolDefinition to streamline the retrieval of tool metadata, enhancing the overall tool management process.
* feat: add action tool definitions loading to tool service
- Introduced getActionToolDefinitions function to load action tool definitions based on agent ID and tool names, enhancing the tool loading process.
- Updated loadToolDefinitions to integrate action tool definitions, allowing for better management and retrieval of action-specific tools.
- Added comprehensive tests for action tool definitions to ensure correct loading and parameter handling, improving overall reliability and functionality.
* chore: update @librechat/agents dependency to version 3.1.26
* refactor: add toolEndCallback to handle tool execution results
* fix: tool definitions and execution handling
- Introduced native tools (execute_code, file_search, web_search) to the tool service, allowing for better integration and management of these tools.
- Updated isBuiltInTool function to include native tools in the built-in check, improving tool recognition.
- Added comprehensive tests for loading parameters of native tools, ensuring correct functionality and parameter handling.
- Enhanced tool definitions registry to include new agent tool definitions, streamlining tool retrieval and management.
* refactor: enhance tool loading and execution context
- Added toolRegistry to the context for OpenAIChatCompletionController and createResponse functions, improving tool management.
- Updated loadToolsForExecution to utilize toolRegistry for better integration of programmatic tools and tool search functionalities.
- Enhanced the initialization process to include toolRegistry in agent context, streamlining tool access and configuration.
- Refactored tool classification logic to support event-driven execution, ensuring compatibility with new tool definitions.
* chore: add request duration logging to OpenAI and Responses controllers
- Introduced logging for request start and completion times in OpenAIChatCompletionController and createResponse functions.
- Calculated and logged the duration of each request, enhancing observability and performance tracking.
- Improved debugging capabilities by providing detailed logs for both streaming and non-streaming responses.
* chore: update @librechat/agents dependency to version 3.1.27
* refactor: implement buildToolSet function for tool management
- Introduced buildToolSet function to streamline the creation of tool sets from agent configurations, enhancing tool management across various controllers.
- Updated AgentClient, OpenAIChatCompletionController, and createResponse functions to utilize buildToolSet, improving consistency in tool handling.
- Added comprehensive tests for buildToolSet to ensure correct functionality and edge case handling, enhancing overall reliability.
* refactor: update import paths for ToolExecuteOptions and createToolExecuteHandler
* fix: update GoogleSearch.js description for maximum search results
- Changed the default maximum number of search results from 10 to 5 in the Google Search JSON schema description, ensuring accurate documentation of the expected behavior.
* chore: remove deprecated Browser tool and associated assets
- Deleted the Browser tool definition from manifest.json, which included its name, plugin key, description, and authentication configuration.
- Removed the web-browser.svg asset as it is no longer needed following the removal of the Browser tool.
* fix: ensure tool definitions are valid before processing
- Added a check to verify the existence of tool definitions in the registry before accessing their properties, preventing potential runtime errors.
- Updated the loading logic for built-in tool definitions to ensure that only valid definitions are pushed to the built-in tool definitions array.
* fix: extend ExtendedJsonSchema to support 'null' type and nullable enums
- Updated the ExtendedJsonSchema type to include 'null' as a valid type option.
- Modified the enum property to accept an array of values that can include strings, numbers, booleans, and null, enhancing schema flexibility.
* test: add comprehensive tests for tool definitions loading and registry behavior
- Implemented tests to verify the handling of built-in tools without registry definitions, ensuring they are skipped correctly.
- Added tests to confirm that built-in tools include descriptions and parameters in the registry.
- Enhanced tests for action tools, checking for proper inclusion of metadata and handling of tools without parameters in the registry.
* test: add tests for mixed-type and number enum schema handling
- Introduced tests to validate the parsing of mixed-type enum values, including strings, numbers, booleans, and null.
- Added tests for number enum schema values to ensure correct parsing of numeric inputs, enhancing schema validation coverage.
* fix: update mock implementation for @librechat/agents
- Changed the mock for @librechat/agents to spread the actual module's properties, ensuring that all necessary functionalities are preserved in tests.
- This adjustment enhances the accuracy of the tests by reflecting the real structure of the module.
* fix: change max_results type in GoogleSearch schema from number to integer
- Updated the type of max_results in the Google Search JSON schema to 'integer' for better type accuracy and validation consistency.
* fix: update max_results description and type in GoogleSearch schema
- Changed the type of max_results from 'number' to 'integer' for improved type accuracy.
- Updated the description to reflect the new default maximum number of search results, changing it from 10 to 5.
* refactor: remove unused code and improve tool registry handling
- Eliminated outdated comments and conditional logic related to event-driven mode in the ToolService.
- Enhanced the handling of the tool registry by ensuring it is configurable for better integration during tool execution.
* feat: add definitionsOnly option to buildToolClassification for event-driven mode
- Introduced a new parameter, definitionsOnly, to the BuildToolClassificationParams interface to enable a mode that skips tool instance creation.
- Updated the buildToolClassification function to conditionally add tool definitions without instantiating tools when definitionsOnly is true.
- Modified the loadToolDefinitions function to pass definitionsOnly as true, ensuring compatibility with the new feature.
* test: add unit tests for buildToolClassification with definitionsOnly option
- Implemented tests to verify the behavior of buildToolClassification when definitionsOnly is set to true or false.
- Ensured that tool instances are not created when definitionsOnly is true, while still adding necessary tool definitions.
- Confirmed that loadAuthValues is called appropriately based on the definitionsOnly parameter, enhancing test coverage for this new feature.
2026-02-01 08:50:57 -05:00
|
|
|
* Helper function that resolves refs before converting to Zod.
|
|
|
|
|
*
|
|
|
|
|
* @deprecated This function is deprecated in favor of using JSON schemas directly.
|
|
|
|
|
* LangChain.js now supports JSON schemas natively, eliminating the need for Zod conversion.
|
|
|
|
|
* Use `resolveJsonSchemaRefs` to handle $ref references and pass the JSON schema directly to tools.
|
|
|
|
|
*
|
|
|
|
|
* @see https://js.langchain.com/docs/how_to/custom_tools/
|
2025-07-10 18:52:24 -04:00
|
|
|
*/
|
|
|
|
|
export function convertWithResolvedRefs(
|
|
|
|
|
schema: JsonSchemaType & Record<string, unknown>,
|
|
|
|
|
options?: ConvertJsonSchemaToZodOptions,
|
|
|
|
|
) {
|
|
|
|
|
const resolved = resolveJsonSchemaRefs(schema);
|
|
|
|
|
return convertJsonSchemaToZod(resolved, options);
|
|
|
|
|
}
|