From 14660d75ae282ea6660c4709e6ce5d9f3a68e340 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Mon, 21 Jul 2025 17:37:37 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=86=95=20feat:=20Enhanced=20Title=20Gener?= =?UTF-8?q?ation=20Config=20Options=20(#8580)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🏗️ refactor: Extract reasoning key logic into separate function * refactor: Ensure `overrideProvider` is always defined in `getProviderConfig` result, and only used in `initializeAgent` if different from `agent.provider` * feat: new title configuration options across services - titlePrompt - titleEndpoint - titlePromptTemplate - new "completion" titleMethod (new default) * chore: update @librechat/agents and conform openai version to prevent SDK errors * chore: add form-data package as a dependency and override to v4.0.4 to address CVE-2025-7783 * feat: add support for 'all' endpoint configuration in AppService and corresponding tests * refactor: replace HttpsProxyAgent with ProxyAgent from undici for improved proxy handling in assistant initialization * chore: update frontend review workflow to limit package paths to data-provider * chore: update backend review workflow to include all package paths --- .github/workflows/backend-review.yml | 2 +- .github/workflows/frontend-review.yml | 2 +- api/package.json | 5 +- api/server/controllers/agents/client.js | 39 +- api/server/controllers/agents/client.test.js | 730 +++++++ api/server/services/AppService.js | 4 + api/server/services/AppService.spec.js | 200 ++ api/server/services/Endpoints/agents/agent.js | 2 +- .../Endpoints/assistants/initalize.js | 7 +- .../Endpoints/assistants/initialize.spec.js | 5 +- .../Endpoints/azureAssistants/initialize.js | 7 +- .../azureAssistants/initialize.spec.js | 5 +- api/server/services/Endpoints/index.js | 6 +- api/server/services/start/assistants.js | 5 + package-lock.json | 1782 +++++++++++++++-- package.json | 1 + packages/api/package.json | 4 +- packages/api/src/agents/run.ts | 38 +- packages/data-provider/package.json | 3 +- packages/data-provider/src/config.ts | 12 +- packages/data-provider/src/types.ts | 3 - 21 files changed, 2666 insertions(+), 196 deletions(-) create mode 100644 api/server/controllers/agents/client.test.js diff --git a/.github/workflows/backend-review.yml b/.github/workflows/backend-review.yml index 7637b8cdc0..4f6fab329b 100644 --- a/.github/workflows/backend-review.yml +++ b/.github/workflows/backend-review.yml @@ -7,7 +7,7 @@ on: - release/* paths: - 'api/**' - - 'packages/api/**' + - 'packages/**' jobs: tests_Backend: name: Run Backend unit tests diff --git a/.github/workflows/frontend-review.yml b/.github/workflows/frontend-review.yml index 0756c6773c..7064c18c13 100644 --- a/.github/workflows/frontend-review.yml +++ b/.github/workflows/frontend-review.yml @@ -8,7 +8,7 @@ on: - release/* paths: - 'client/**' - - 'packages/**' + - 'packages/data-provider/**' jobs: tests_frontend_ubuntu: diff --git a/api/package.json b/api/package.json index 42e9927661..bb9800c450 100644 --- a/api/package.json +++ b/api/package.json @@ -49,7 +49,7 @@ "@langchain/google-vertexai": "^0.2.13", "@langchain/openai": "^0.5.18", "@langchain/textsplitters": "^0.1.0", - "@librechat/agents": "^2.4.63", + "@librechat/agents": "^2.4.67", "@librechat/api": "*", "@librechat/data-schemas": "*", "@node-saml/passport-saml": "^5.0.0", @@ -71,6 +71,7 @@ "express-static-gzip": "^2.2.0", "file-type": "^18.7.0", "firebase": "^11.0.2", + "form-data": "^4.0.4", "googleapis": "^126.0.1", "handlebars": "^4.7.7", "https-proxy-agent": "^7.0.6", @@ -93,7 +94,7 @@ "node-fetch": "^2.7.0", "nodemailer": "^6.9.15", "ollama": "^0.5.0", - "openai": "^4.96.2", + "openai": "^5.10.1", "openai-chat-tokens": "^0.2.8", "openid-client": "^6.5.0", "passport": "^0.6.0", diff --git a/api/server/controllers/agents/client.js b/api/server/controllers/agents/client.js index 8effbe9979..c42df8cf0b 100644 --- a/api/server/controllers/agents/client.js +++ b/api/server/controllers/agents/client.js @@ -15,6 +15,7 @@ const { Callback, Providers, GraphEvents, + TitleMethod, formatMessage, formatAgentMessages, getTokenCountForMessage, @@ -1009,7 +1010,7 @@ class AgentClient extends BaseClient { } const { handleLLMEnd, collected: collectedMetadata } = createMetadataAggregator(); const { req, res, agent } = this.options; - const endpoint = agent.endpoint; + let endpoint = agent.endpoint; /** @type {import('@librechat/agents').ClientOptions} */ let clientOptions = { @@ -1017,17 +1018,32 @@ class AgentClient extends BaseClient { model: agent.model_parameters.model, }; - const { getOptions, overrideProvider, customEndpointConfig } = - await getProviderConfig(endpoint); + let titleProviderConfig = await getProviderConfig(endpoint); /** @type {TEndpoint | undefined} */ - const endpointConfig = req.app.locals[endpoint] ?? customEndpointConfig; + const endpointConfig = + req.app.locals.all ?? req.app.locals[endpoint] ?? titleProviderConfig.customEndpointConfig; if (!endpointConfig) { logger.warn( '[api/server/controllers/agents/client.js #titleConvo] Error getting endpoint config', ); } + if (endpointConfig?.titleEndpoint && endpointConfig.titleEndpoint !== endpoint) { + try { + titleProviderConfig = await getProviderConfig(endpointConfig.titleEndpoint); + endpoint = endpointConfig.titleEndpoint; + } catch (error) { + logger.warn( + `[api/server/controllers/agents/client.js #titleConvo] Error getting title endpoint config for ${endpointConfig.titleEndpoint}, falling back to default`, + error, + ); + // Fall back to original provider config + endpoint = agent.endpoint; + titleProviderConfig = await getProviderConfig(endpoint); + } + } + if ( endpointConfig && endpointConfig.titleModel && @@ -1036,7 +1052,7 @@ class AgentClient extends BaseClient { clientOptions.model = endpointConfig.titleModel; } - const options = await getOptions({ + const options = await titleProviderConfig.getOptions({ req, res, optionsOnly: true, @@ -1045,7 +1061,7 @@ class AgentClient extends BaseClient { endpointOption: { model_parameters: clientOptions }, }); - let provider = options.provider ?? overrideProvider ?? agent.provider; + let provider = options.provider ?? titleProviderConfig.overrideProvider ?? agent.provider; if ( endpoint === EModelEndpoint.azureOpenAI && options.llmConfig?.azureOpenAIApiInstanceName == null @@ -1078,16 +1094,23 @@ class AgentClient extends BaseClient { ), ); - if (provider === Providers.GOOGLE) { + if ( + provider === Providers.GOOGLE && + (endpointConfig?.titleMethod === TitleMethod.FUNCTIONS || + endpointConfig?.titleMethod === TitleMethod.STRUCTURED) + ) { clientOptions.json = true; } try { const titleResult = await this.run.generateTitle({ provider, + clientOptions, inputText: text, contentParts: this.contentParts, - clientOptions, + titleMethod: endpointConfig?.titleMethod, + titlePrompt: endpointConfig?.titlePrompt, + titlePromptTemplate: endpointConfig?.titlePromptTemplate, chainOptions: { signal: abortController.signal, callbacks: [ diff --git a/api/server/controllers/agents/client.test.js b/api/server/controllers/agents/client.test.js new file mode 100644 index 0000000000..aab972fecb --- /dev/null +++ b/api/server/controllers/agents/client.test.js @@ -0,0 +1,730 @@ +const { Providers } = require('@librechat/agents'); +const { Constants, EModelEndpoint } = require('librechat-data-provider'); +const AgentClient = require('./client'); + +jest.mock('@librechat/agents', () => ({ + ...jest.requireActual('@librechat/agents'), + createMetadataAggregator: () => ({ + handleLLMEnd: jest.fn(), + collected: [], + }), +})); + +describe('AgentClient - titleConvo', () => { + let client; + let mockRun; + let mockReq; + let mockRes; + let mockAgent; + let mockOptions; + + beforeEach(() => { + // Reset all mocks + jest.clearAllMocks(); + + // Mock run object + mockRun = { + generateTitle: jest.fn().mockResolvedValue({ + title: 'Generated Title', + }), + }; + + // Mock agent - with both endpoint and provider + mockAgent = { + id: 'agent-123', + endpoint: EModelEndpoint.openAI, // Use a valid provider as endpoint for getProviderConfig + provider: EModelEndpoint.openAI, // Add provider property + model_parameters: { + model: 'gpt-4', + }, + }; + + // Mock request and response + mockReq = { + app: { + locals: { + [EModelEndpoint.openAI]: { + // Match the agent endpoint + titleModel: 'gpt-3.5-turbo', + titlePrompt: 'Custom title prompt', + titleMethod: 'structured', + titlePromptTemplate: 'Template: {{content}}', + }, + }, + }, + user: { + id: 'user-123', + }, + body: { + model: 'gpt-4', + endpoint: EModelEndpoint.openAI, + key: null, + }, + }; + + mockRes = {}; + + // Mock options + mockOptions = { + req: mockReq, + res: mockRes, + agent: mockAgent, + endpointTokenConfig: {}, + }; + + // Create client instance + client = new AgentClient(mockOptions); + client.run = mockRun; + client.responseMessageId = 'response-123'; + client.conversationId = 'convo-123'; + client.contentParts = [{ type: 'text', text: 'Test content' }]; + client.recordCollectedUsage = jest.fn().mockResolvedValue(); // Mock as async function that resolves + }); + + describe('titleConvo method', () => { + it('should throw error if run is not initialized', async () => { + client.run = null; + + await expect( + client.titleConvo({ text: 'Test', abortController: new AbortController() }), + ).rejects.toThrow('Run not initialized'); + }); + + it('should use titlePrompt from endpoint config', async () => { + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + titlePrompt: 'Custom title prompt', + }), + ); + }); + + it('should use titlePromptTemplate from endpoint config', async () => { + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + titlePromptTemplate: 'Template: {{content}}', + }), + ); + }); + + it('should use titleMethod from endpoint config', async () => { + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + provider: Providers.OPENAI, + titleMethod: 'structured', + }), + ); + }); + + it('should use titleModel from endpoint config when provided', async () => { + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Check that generateTitle was called with correct clientOptions + const generateTitleCall = mockRun.generateTitle.mock.calls[0][0]; + expect(generateTitleCall.clientOptions.model).toBe('gpt-3.5-turbo'); + }); + + it('should handle missing endpoint config gracefully', async () => { + // Remove endpoint config + mockReq.app.locals[EModelEndpoint.openAI] = undefined; + + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + titlePrompt: undefined, + titlePromptTemplate: undefined, + titleMethod: undefined, + }), + ); + }); + + it('should use agent model when titleModel is not provided', async () => { + // Remove titleModel from config + delete mockReq.app.locals[EModelEndpoint.openAI].titleModel; + + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + const generateTitleCall = mockRun.generateTitle.mock.calls[0][0]; + expect(generateTitleCall.clientOptions.model).toBe('gpt-4'); // Should use agent's model + }); + + it('should not use titleModel when it equals CURRENT_MODEL constant', async () => { + mockReq.app.locals[EModelEndpoint.openAI].titleModel = Constants.CURRENT_MODEL; + + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + const generateTitleCall = mockRun.generateTitle.mock.calls[0][0]; + expect(generateTitleCall.clientOptions.model).toBe('gpt-4'); // Should use agent's model + }); + + it('should pass all required parameters to generateTitle', async () => { + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + expect(mockRun.generateTitle).toHaveBeenCalledWith({ + provider: expect.any(String), + inputText: text, + contentParts: client.contentParts, + clientOptions: expect.objectContaining({ + model: 'gpt-3.5-turbo', + }), + titlePrompt: 'Custom title prompt', + titlePromptTemplate: 'Template: {{content}}', + titleMethod: 'structured', + chainOptions: expect.objectContaining({ + signal: abortController.signal, + }), + }); + }); + + it('should record collected usage after title generation', async () => { + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + expect(client.recordCollectedUsage).toHaveBeenCalledWith({ + model: 'gpt-3.5-turbo', + context: 'title', + collectedUsage: expect.any(Array), + }); + }); + + it('should return the generated title', async () => { + const text = 'Test conversation text'; + const abortController = new AbortController(); + + const result = await client.titleConvo({ text, abortController }); + + expect(result).toBe('Generated Title'); + }); + + it('should handle errors gracefully and return undefined', async () => { + mockRun.generateTitle.mockRejectedValue(new Error('Title generation failed')); + + const text = 'Test conversation text'; + const abortController = new AbortController(); + + const result = await client.titleConvo({ text, abortController }); + + expect(result).toBeUndefined(); + }); + + it('should pass titleEndpoint configuration to generateTitle', async () => { + // Mock the API key just for this test + const originalApiKey = process.env.ANTHROPIC_API_KEY; + process.env.ANTHROPIC_API_KEY = 'test-api-key'; + + // Add titleEndpoint to the config + mockReq.app.locals[EModelEndpoint.openAI].titleEndpoint = EModelEndpoint.anthropic; + mockReq.app.locals[EModelEndpoint.openAI].titleMethod = 'structured'; + mockReq.app.locals[EModelEndpoint.openAI].titlePrompt = 'Custom title prompt'; + mockReq.app.locals[EModelEndpoint.openAI].titlePromptTemplate = 'Custom template'; + + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify generateTitle was called with the custom configuration + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + titleMethod: 'structured', + provider: Providers.ANTHROPIC, + titlePrompt: 'Custom title prompt', + titlePromptTemplate: 'Custom template', + }), + ); + + // Restore the original API key + if (originalApiKey) { + process.env.ANTHROPIC_API_KEY = originalApiKey; + } else { + delete process.env.ANTHROPIC_API_KEY; + } + }); + + it('should use all config when endpoint config is missing', async () => { + // Remove endpoint-specific config + delete mockReq.app.locals[EModelEndpoint.openAI].titleModel; + delete mockReq.app.locals[EModelEndpoint.openAI].titlePrompt; + delete mockReq.app.locals[EModelEndpoint.openAI].titleMethod; + delete mockReq.app.locals[EModelEndpoint.openAI].titlePromptTemplate; + + // Set 'all' config + mockReq.app.locals.all = { + titleModel: 'gpt-4o-mini', + titlePrompt: 'All config title prompt', + titleMethod: 'completion', + titlePromptTemplate: 'All config template: {{content}}', + }; + + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify generateTitle was called with 'all' config values + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + titleMethod: 'completion', + titlePrompt: 'All config title prompt', + titlePromptTemplate: 'All config template: {{content}}', + }), + ); + + // Check that the model was set from 'all' config + const generateTitleCall = mockRun.generateTitle.mock.calls[0][0]; + expect(generateTitleCall.clientOptions.model).toBe('gpt-4o-mini'); + }); + + it('should prioritize all config over endpoint config for title settings', async () => { + // Set both endpoint and 'all' config + mockReq.app.locals[EModelEndpoint.openAI].titleModel = 'gpt-3.5-turbo'; + mockReq.app.locals[EModelEndpoint.openAI].titlePrompt = 'Endpoint title prompt'; + mockReq.app.locals[EModelEndpoint.openAI].titleMethod = 'structured'; + // Remove titlePromptTemplate from endpoint config to test fallback + delete mockReq.app.locals[EModelEndpoint.openAI].titlePromptTemplate; + + mockReq.app.locals.all = { + titleModel: 'gpt-4o-mini', + titlePrompt: 'All config title prompt', + titleMethod: 'completion', + titlePromptTemplate: 'All config template', + }; + + const text = 'Test conversation text'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify 'all' config takes precedence over endpoint config + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + titleMethod: 'completion', + titlePrompt: 'All config title prompt', + titlePromptTemplate: 'All config template', + }), + ); + + // Check that the model was set from 'all' config + const generateTitleCall = mockRun.generateTitle.mock.calls[0][0]; + expect(generateTitleCall.clientOptions.model).toBe('gpt-4o-mini'); + }); + + it('should use all config with titleEndpoint and verify provider switch', async () => { + // Mock the API key for the titleEndpoint provider + const originalApiKey = process.env.ANTHROPIC_API_KEY; + process.env.ANTHROPIC_API_KEY = 'test-anthropic-key'; + + // Remove endpoint-specific config to test 'all' config + delete mockReq.app.locals[EModelEndpoint.openAI]; + + // Set comprehensive 'all' config with all new title options + mockReq.app.locals.all = { + titleConvo: true, + titleModel: 'claude-3-haiku-20240307', + titleMethod: 'completion', // Testing the new default method + titlePrompt: 'Generate a concise, descriptive title for this conversation', + titlePromptTemplate: 'Conversation summary: {{content}}', + titleEndpoint: EModelEndpoint.anthropic, // Should switch provider to Anthropic + }; + + const text = 'Test conversation about AI and machine learning'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify all config values were used + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + provider: Providers.ANTHROPIC, // Critical: Verify provider switched to Anthropic + titleMethod: 'completion', + titlePrompt: 'Generate a concise, descriptive title for this conversation', + titlePromptTemplate: 'Conversation summary: {{content}}', + inputText: text, + contentParts: client.contentParts, + }), + ); + + // Verify the model was set from 'all' config + const generateTitleCall = mockRun.generateTitle.mock.calls[0][0]; + expect(generateTitleCall.clientOptions.model).toBe('claude-3-haiku-20240307'); + + // Verify other client options are set correctly + expect(generateTitleCall.clientOptions).toMatchObject({ + model: 'claude-3-haiku-20240307', + // Note: Anthropic's getOptions may set its own maxTokens value + }); + + // Restore the original API key + if (originalApiKey) { + process.env.ANTHROPIC_API_KEY = originalApiKey; + } else { + delete process.env.ANTHROPIC_API_KEY; + } + }); + + it('should test all titleMethod options from all config', async () => { + // Test each titleMethod: 'completion', 'functions', 'structured' + const titleMethods = ['completion', 'functions', 'structured']; + + for (const method of titleMethods) { + // Clear previous calls + mockRun.generateTitle.mockClear(); + + // Remove endpoint config + delete mockReq.app.locals[EModelEndpoint.openAI]; + + // Set 'all' config with specific titleMethod + mockReq.app.locals.all = { + titleModel: 'gpt-4o-mini', + titleMethod: method, + titlePrompt: `Testing ${method} method`, + titlePromptTemplate: `Template for ${method}: {{content}}`, + }; + + const text = `Test conversation for ${method} method`; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify the correct titleMethod was used + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + titleMethod: method, + titlePrompt: `Testing ${method} method`, + titlePromptTemplate: `Template for ${method}: {{content}}`, + }), + ); + } + }); + + describe('Azure-specific title generation', () => { + let originalEnv; + + beforeEach(() => { + // Reset mocks + jest.clearAllMocks(); + + // Save original environment variables + originalEnv = { ...process.env }; + + // Mock Azure API keys + process.env.AZURE_OPENAI_API_KEY = 'test-azure-key'; + process.env.AZURE_API_KEY = 'test-azure-key'; + process.env.EASTUS_API_KEY = 'test-eastus-key'; + process.env.EASTUS2_API_KEY = 'test-eastus2-key'; + }); + + afterEach(() => { + // Restore environment variables + process.env = originalEnv; + }); + + it('should use OPENAI provider for Azure serverless endpoints', async () => { + // Set up Azure endpoint with serverless config + mockAgent.endpoint = EModelEndpoint.azureOpenAI; + mockAgent.provider = EModelEndpoint.azureOpenAI; + mockReq.app.locals[EModelEndpoint.azureOpenAI] = { + titleConvo: true, + titleModel: 'grok-3', + titleMethod: 'completion', + titlePrompt: 'Azure serverless title prompt', + streamRate: 35, + modelGroupMap: { + 'grok-3': { + group: 'Azure AI Foundry', + deploymentName: 'grok-3', + }, + }, + groupMap: { + 'Azure AI Foundry': { + apiKey: '${AZURE_API_KEY}', + baseURL: 'https://test.services.ai.azure.com/models', + version: '2024-05-01-preview', + serverless: true, + models: { + 'grok-3': { + deploymentName: 'grok-3', + }, + }, + }, + }, + }; + mockReq.body.endpoint = EModelEndpoint.azureOpenAI; + mockReq.body.model = 'grok-3'; + + const text = 'Test Azure serverless conversation'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify provider was switched to OPENAI for serverless + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + provider: Providers.OPENAI, // Should be OPENAI for serverless + titleMethod: 'completion', + titlePrompt: 'Azure serverless title prompt', + }), + ); + }); + + it('should use AZURE provider for Azure endpoints with instanceName', async () => { + // Set up Azure endpoint + mockAgent.endpoint = EModelEndpoint.azureOpenAI; + mockAgent.provider = EModelEndpoint.azureOpenAI; + mockReq.app.locals[EModelEndpoint.azureOpenAI] = { + titleConvo: true, + titleModel: 'gpt-4o', + titleMethod: 'structured', + titlePrompt: 'Azure instance title prompt', + streamRate: 35, + modelGroupMap: { + 'gpt-4o': { + group: 'eastus', + deploymentName: 'gpt-4o', + }, + }, + groupMap: { + eastus: { + apiKey: '${EASTUS_API_KEY}', + instanceName: 'region-instance', + version: '2024-02-15-preview', + models: { + 'gpt-4o': { + deploymentName: 'gpt-4o', + }, + }, + }, + }, + }; + mockReq.body.endpoint = EModelEndpoint.azureOpenAI; + mockReq.body.model = 'gpt-4o'; + + const text = 'Test Azure instance conversation'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify provider remains AZURE with instanceName + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + provider: Providers.AZURE, + titleMethod: 'structured', + titlePrompt: 'Azure instance title prompt', + }), + ); + }); + + it('should handle Azure titleModel with CURRENT_MODEL constant', async () => { + // Set up Azure endpoint + mockAgent.endpoint = EModelEndpoint.azureOpenAI; + mockAgent.provider = EModelEndpoint.azureOpenAI; + mockAgent.model_parameters.model = 'gpt-4o-latest'; + mockReq.app.locals[EModelEndpoint.azureOpenAI] = { + titleConvo: true, + titleModel: Constants.CURRENT_MODEL, + titleMethod: 'functions', + streamRate: 35, + modelGroupMap: { + 'gpt-4o-latest': { + group: 'region-eastus', + deploymentName: 'gpt-4o-mini', + version: '2024-02-15-preview', + }, + }, + groupMap: { + 'region-eastus': { + apiKey: '${EASTUS2_API_KEY}', + instanceName: 'test-instance', + version: '2024-12-01-preview', + models: { + 'gpt-4o-latest': { + deploymentName: 'gpt-4o-mini', + version: '2024-02-15-preview', + }, + }, + }, + }, + }; + mockReq.body.endpoint = EModelEndpoint.azureOpenAI; + mockReq.body.model = 'gpt-4o-latest'; + + const text = 'Test Azure current model'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify it uses the correct model when titleModel is CURRENT_MODEL + const generateTitleCall = mockRun.generateTitle.mock.calls[0][0]; + // When CURRENT_MODEL is used with Azure, the model gets mapped to the deployment name + // In this case, 'gpt-4o-latest' is mapped to 'gpt-4o-mini' deployment + expect(generateTitleCall.clientOptions.model).toBe('gpt-4o-mini'); + // Also verify that CURRENT_MODEL constant was not passed as the model + expect(generateTitleCall.clientOptions.model).not.toBe(Constants.CURRENT_MODEL); + }); + + it('should handle Azure with multiple model groups', async () => { + // Set up Azure endpoint + mockAgent.endpoint = EModelEndpoint.azureOpenAI; + mockAgent.provider = EModelEndpoint.azureOpenAI; + mockReq.app.locals[EModelEndpoint.azureOpenAI] = { + titleConvo: true, + titleModel: 'o1-mini', + titleMethod: 'completion', + streamRate: 35, + modelGroupMap: { + 'gpt-4o': { + group: 'eastus', + deploymentName: 'gpt-4o', + }, + 'o1-mini': { + group: 'region-eastus', + deploymentName: 'o1-mini', + }, + 'codex-mini': { + group: 'codex-mini', + deploymentName: 'codex-mini', + }, + }, + groupMap: { + eastus: { + apiKey: '${EASTUS_API_KEY}', + instanceName: 'region-eastus', + version: '2024-02-15-preview', + models: { + 'gpt-4o': { + deploymentName: 'gpt-4o', + }, + }, + }, + 'region-eastus': { + apiKey: '${EASTUS2_API_KEY}', + instanceName: 'region-eastus2', + version: '2024-12-01-preview', + models: { + 'o1-mini': { + deploymentName: 'o1-mini', + }, + }, + }, + 'codex-mini': { + apiKey: '${AZURE_API_KEY}', + baseURL: 'https://example.cognitiveservices.azure.com/openai/', + version: '2025-04-01-preview', + serverless: true, + models: { + 'codex-mini': { + deploymentName: 'codex-mini', + }, + }, + }, + }, + }; + mockReq.body.endpoint = EModelEndpoint.azureOpenAI; + mockReq.body.model = 'o1-mini'; + + const text = 'Test Azure multi-group conversation'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify correct model and provider are used + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + provider: Providers.AZURE, + titleMethod: 'completion', + }), + ); + + const generateTitleCall = mockRun.generateTitle.mock.calls[0][0]; + expect(generateTitleCall.clientOptions.model).toBe('o1-mini'); + expect(generateTitleCall.clientOptions.maxTokens).toBeUndefined(); // o1 models shouldn't have maxTokens + }); + + it('should use all config as fallback for Azure endpoints', async () => { + // Set up Azure endpoint with minimal config + mockAgent.endpoint = EModelEndpoint.azureOpenAI; + mockAgent.provider = EModelEndpoint.azureOpenAI; + mockReq.body.endpoint = EModelEndpoint.azureOpenAI; + mockReq.body.model = 'gpt-4'; + + // Remove Azure-specific config + delete mockReq.app.locals[EModelEndpoint.azureOpenAI]; + + // Set 'all' config as fallback with a serverless Azure config + mockReq.app.locals.all = { + titleConvo: true, + titleModel: 'gpt-4', + titleMethod: 'structured', + titlePrompt: 'Fallback title prompt from all config', + titlePromptTemplate: 'Template: {{content}}', + modelGroupMap: { + 'gpt-4': { + group: 'default-group', + deploymentName: 'gpt-4', + }, + }, + groupMap: { + 'default-group': { + apiKey: '${AZURE_API_KEY}', + baseURL: 'https://default.openai.azure.com/', + version: '2024-02-15-preview', + serverless: true, + models: { + 'gpt-4': { + deploymentName: 'gpt-4', + }, + }, + }, + }, + }; + + const text = 'Test Azure with all config fallback'; + const abortController = new AbortController(); + + await client.titleConvo({ text, abortController }); + + // Verify all config is used + expect(mockRun.generateTitle).toHaveBeenCalledWith( + expect.objectContaining({ + provider: Providers.OPENAI, // Should be OPENAI when no instanceName + titleMethod: 'structured', + titlePrompt: 'Fallback title prompt from all config', + titlePromptTemplate: 'Template: {{content}}', + }), + ); + }); + }); + }); +}); diff --git a/api/server/services/AppService.js b/api/server/services/AppService.js index 821dc90b18..8050a1076d 100644 --- a/api/server/services/AppService.js +++ b/api/server/services/AppService.js @@ -157,6 +157,10 @@ const AppService = async (app) => { } }); + if (endpoints?.all) { + endpointLocals.all = endpoints.all; + } + app.locals = { ...defaultLocals, fileConfig: config?.fileConfig, diff --git a/api/server/services/AppService.spec.js b/api/server/services/AppService.spec.js index 678e8a90db..0832732f09 100644 --- a/api/server/services/AppService.spec.js +++ b/api/server/services/AppService.spec.js @@ -543,6 +543,206 @@ describe('AppService', () => { expect(process.env.IMPORT_USER_MAX).toEqual('initialUserMax'); expect(process.env.IMPORT_USER_WINDOW).toEqual('initialUserWindow'); }); + + it('should correctly configure endpoint with titlePrompt, titleMethod, and titlePromptTemplate', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + [EModelEndpoint.openAI]: { + titleConvo: true, + titleModel: 'gpt-3.5-turbo', + titleMethod: 'structured', + titlePrompt: 'Custom title prompt for conversation', + titlePromptTemplate: 'Summarize this conversation: {{conversation}}', + }, + [EModelEndpoint.assistants]: { + titleMethod: 'functions', + titlePrompt: 'Generate a title for this assistant conversation', + titlePromptTemplate: 'Assistant conversation template: {{messages}}', + }, + [EModelEndpoint.azureOpenAI]: { + groups: azureGroups, + titleConvo: true, + titleMethod: 'completion', + titleModel: 'gpt-4', + titlePrompt: 'Azure title prompt', + titlePromptTemplate: 'Azure conversation: {{context}}', + }, + }, + }), + ); + + await AppService(app); + + // Check OpenAI endpoint configuration + expect(app.locals).toHaveProperty(EModelEndpoint.openAI); + expect(app.locals[EModelEndpoint.openAI]).toEqual( + expect.objectContaining({ + titleConvo: true, + titleModel: 'gpt-3.5-turbo', + titleMethod: 'structured', + titlePrompt: 'Custom title prompt for conversation', + titlePromptTemplate: 'Summarize this conversation: {{conversation}}', + }), + ); + + // Check Assistants endpoint configuration + expect(app.locals).toHaveProperty(EModelEndpoint.assistants); + expect(app.locals[EModelEndpoint.assistants]).toMatchObject({ + titleMethod: 'functions', + titlePrompt: 'Generate a title for this assistant conversation', + titlePromptTemplate: 'Assistant conversation template: {{messages}}', + }); + + // Check Azure OpenAI endpoint configuration + expect(app.locals).toHaveProperty(EModelEndpoint.azureOpenAI); + expect(app.locals[EModelEndpoint.azureOpenAI]).toEqual( + expect.objectContaining({ + titleConvo: true, + titleMethod: 'completion', + titleModel: 'gpt-4', + titlePrompt: 'Azure title prompt', + titlePromptTemplate: 'Azure conversation: {{context}}', + }), + ); + }); + + it('should configure Agent endpoint with title generation settings', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + [EModelEndpoint.agents]: { + disableBuilder: false, + titleConvo: true, + titleModel: 'gpt-4', + titleMethod: 'structured', + titlePrompt: 'Generate a descriptive title for this agent conversation', + titlePromptTemplate: 'Agent conversation summary: {{content}}', + recursionLimit: 15, + capabilities: [AgentCapabilities.tools, AgentCapabilities.actions], + }, + }, + }), + ); + + await AppService(app); + + expect(app.locals).toHaveProperty(EModelEndpoint.agents); + expect(app.locals[EModelEndpoint.agents]).toMatchObject({ + disableBuilder: false, + titleConvo: true, + titleModel: 'gpt-4', + titleMethod: 'structured', + titlePrompt: 'Generate a descriptive title for this agent conversation', + titlePromptTemplate: 'Agent conversation summary: {{content}}', + recursionLimit: 15, + capabilities: expect.arrayContaining([AgentCapabilities.tools, AgentCapabilities.actions]), + }); + }); + + it('should handle missing title configuration options with defaults', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + [EModelEndpoint.openAI]: { + titleConvo: true, + // titlePrompt and titlePromptTemplate are not provided + }, + }, + }), + ); + + await AppService(app); + + expect(app.locals).toHaveProperty(EModelEndpoint.openAI); + expect(app.locals[EModelEndpoint.openAI]).toMatchObject({ + titleConvo: true, + }); + // Check that the optional fields are undefined when not provided + expect(app.locals[EModelEndpoint.openAI].titlePrompt).toBeUndefined(); + expect(app.locals[EModelEndpoint.openAI].titlePromptTemplate).toBeUndefined(); + expect(app.locals[EModelEndpoint.openAI].titleMethod).toBeUndefined(); + }); + + it('should correctly configure titleEndpoint when specified', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + [EModelEndpoint.openAI]: { + titleConvo: true, + titleModel: 'gpt-3.5-turbo', + titleEndpoint: EModelEndpoint.anthropic, + titlePrompt: 'Generate a concise title', + }, + [EModelEndpoint.agents]: { + titleEndpoint: 'custom-provider', + titleMethod: 'structured', + }, + }, + }), + ); + + await AppService(app); + + // Check OpenAI endpoint has titleEndpoint + expect(app.locals).toHaveProperty(EModelEndpoint.openAI); + expect(app.locals[EModelEndpoint.openAI]).toMatchObject({ + titleConvo: true, + titleModel: 'gpt-3.5-turbo', + titleEndpoint: EModelEndpoint.anthropic, + titlePrompt: 'Generate a concise title', + }); + + // Check Agents endpoint has titleEndpoint + expect(app.locals).toHaveProperty(EModelEndpoint.agents); + expect(app.locals[EModelEndpoint.agents]).toMatchObject({ + titleEndpoint: 'custom-provider', + titleMethod: 'structured', + }); + }); + + it('should correctly configure all endpoint when specified', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + all: { + titleConvo: true, + titleModel: 'gpt-4o-mini', + titleMethod: 'structured', + titlePrompt: 'Default title prompt for all endpoints', + titlePromptTemplate: 'Default template: {{conversation}}', + titleEndpoint: EModelEndpoint.anthropic, + streamRate: 50, + }, + [EModelEndpoint.openAI]: { + titleConvo: true, + titleModel: 'gpt-3.5-turbo', + }, + }, + }), + ); + + await AppService(app); + + // Check that 'all' endpoint config is loaded + expect(app.locals).toHaveProperty('all'); + expect(app.locals.all).toMatchObject({ + titleConvo: true, + titleModel: 'gpt-4o-mini', + titleMethod: 'structured', + titlePrompt: 'Default title prompt for all endpoints', + titlePromptTemplate: 'Default template: {{conversation}}', + titleEndpoint: EModelEndpoint.anthropic, + streamRate: 50, + }); + + // Check that OpenAI endpoint has its own config + expect(app.locals).toHaveProperty(EModelEndpoint.openAI); + expect(app.locals[EModelEndpoint.openAI]).toMatchObject({ + titleConvo: true, + titleModel: 'gpt-3.5-turbo', + }); + }); }); describe('AppService updating app.locals and issuing warnings', () => { diff --git a/api/server/services/Endpoints/agents/agent.js b/api/server/services/Endpoints/agents/agent.js index b5be8ec913..3af2170d5c 100644 --- a/api/server/services/Endpoints/agents/agent.js +++ b/api/server/services/Endpoints/agents/agent.js @@ -104,7 +104,7 @@ const initializeAgent = async ({ agent.endpoint = provider; const { getOptions, overrideProvider } = await getProviderConfig(provider); - if (overrideProvider) { + if (overrideProvider !== agent.provider) { agent.provider = overrideProvider; } diff --git a/api/server/services/Endpoints/assistants/initalize.js b/api/server/services/Endpoints/assistants/initalize.js index 5dadd54d11..fe37e34108 100644 --- a/api/server/services/Endpoints/assistants/initalize.js +++ b/api/server/services/Endpoints/assistants/initalize.js @@ -1,5 +1,5 @@ const OpenAI = require('openai'); -const { HttpsProxyAgent } = require('https-proxy-agent'); +const { ProxyAgent } = require('undici'); const { ErrorTypes, EModelEndpoint } = require('librechat-data-provider'); const { getUserKeyValues, @@ -59,7 +59,10 @@ const initializeClient = async ({ req, res, endpointOption, version, initAppClie } if (PROXY) { - opts.httpAgent = new HttpsProxyAgent(PROXY); + const proxyAgent = new ProxyAgent(PROXY); + opts.fetchOptions = { + dispatcher: proxyAgent, + }; } if (OPENAI_ORGANIZATION) { diff --git a/api/server/services/Endpoints/assistants/initialize.spec.js b/api/server/services/Endpoints/assistants/initialize.spec.js index 261f37e9d1..3a870dc61d 100644 --- a/api/server/services/Endpoints/assistants/initialize.spec.js +++ b/api/server/services/Endpoints/assistants/initialize.spec.js @@ -1,5 +1,5 @@ // const OpenAI = require('openai'); -const { HttpsProxyAgent } = require('https-proxy-agent'); +const { ProxyAgent } = require('undici'); const { ErrorTypes } = require('librechat-data-provider'); const { getUserKey, getUserKeyExpiry, getUserKeyValues } = require('~/server/services/UserService'); const initializeClient = require('./initalize'); @@ -107,6 +107,7 @@ describe('initializeClient', () => { const res = {}; const { openai } = await initializeClient({ req, res }); - expect(openai.httpAgent).toBeInstanceOf(HttpsProxyAgent); + expect(openai.fetchOptions).toBeDefined(); + expect(openai.fetchOptions.dispatcher).toBeInstanceOf(ProxyAgent); }); }); diff --git a/api/server/services/Endpoints/azureAssistants/initialize.js b/api/server/services/Endpoints/azureAssistants/initialize.js index 132c123e7e..e002da566c 100644 --- a/api/server/services/Endpoints/azureAssistants/initialize.js +++ b/api/server/services/Endpoints/azureAssistants/initialize.js @@ -1,5 +1,5 @@ const OpenAI = require('openai'); -const { HttpsProxyAgent } = require('https-proxy-agent'); +const { ProxyAgent } = require('undici'); const { constructAzureURL, isUserProvided, resolveHeaders } = require('@librechat/api'); const { ErrorTypes, EModelEndpoint, mapModelToAzureConfig } = require('librechat-data-provider'); const { @@ -158,7 +158,10 @@ const initializeClient = async ({ req, res, version, endpointOption, initAppClie } if (PROXY) { - opts.httpAgent = new HttpsProxyAgent(PROXY); + const proxyAgent = new ProxyAgent(PROXY); + opts.fetchOptions = { + dispatcher: proxyAgent, + }; } if (OPENAI_ORGANIZATION) { diff --git a/api/server/services/Endpoints/azureAssistants/initialize.spec.js b/api/server/services/Endpoints/azureAssistants/initialize.spec.js index d0c8a364eb..28e1004c9f 100644 --- a/api/server/services/Endpoints/azureAssistants/initialize.spec.js +++ b/api/server/services/Endpoints/azureAssistants/initialize.spec.js @@ -1,5 +1,5 @@ // const OpenAI = require('openai'); -const { HttpsProxyAgent } = require('https-proxy-agent'); +const { ProxyAgent } = require('undici'); const { ErrorTypes } = require('librechat-data-provider'); const { getUserKey, getUserKeyExpiry, getUserKeyValues } = require('~/server/services/UserService'); const initializeClient = require('./initialize'); @@ -107,6 +107,7 @@ describe('initializeClient', () => { const res = {}; const { openai } = await initializeClient({ req, res }); - expect(openai.httpAgent).toBeInstanceOf(HttpsProxyAgent); + expect(openai.fetchOptions).toBeDefined(); + expect(openai.fetchOptions.dispatcher).toBeInstanceOf(ProxyAgent); }); }); diff --git a/api/server/services/Endpoints/index.js b/api/server/services/Endpoints/index.js index 71d04a1ae2..1847f0ca9c 100644 --- a/api/server/services/Endpoints/index.js +++ b/api/server/services/Endpoints/index.js @@ -34,13 +34,13 @@ const providerConfigMap = { * @param {string} provider - The provider string * @returns {Promise<{ * getOptions: Function, - * overrideProvider?: string, + * overrideProvider: string, * customEndpointConfig?: TEndpoint * }>} */ async function getProviderConfig(provider) { let getOptions = providerConfigMap[provider]; - let overrideProvider; + let overrideProvider = provider; /** @type {TEndpoint | undefined} */ let customEndpointConfig; @@ -56,7 +56,7 @@ async function getProviderConfig(provider) { overrideProvider = Providers.OPENAI; } - if (isKnownCustomProvider(overrideProvider || provider) && !customEndpointConfig) { + if (isKnownCustomProvider(overrideProvider) && !customEndpointConfig) { customEndpointConfig = await getCustomEndpointConfig(provider); if (!customEndpointConfig) { throw new Error(`Provider ${provider} not supported`); diff --git a/api/server/services/start/assistants.js b/api/server/services/start/assistants.js index b46edc676b..0513c63bc0 100644 --- a/api/server/services/start/assistants.js +++ b/api/server/services/start/assistants.js @@ -52,6 +52,11 @@ function assistantsConfigSetup(config, assistantsEndpoint, prevConfig = {}) { privateAssistants: parsedConfig.privateAssistants, timeoutMs: parsedConfig.timeoutMs, streamRate: parsedConfig.streamRate, + titlePrompt: parsedConfig.titlePrompt, + titleMethod: parsedConfig.titleMethod, + titleModel: parsedConfig.titleModel, + titleEndpoint: parsedConfig.titleEndpoint, + titlePromptTemplate: parsedConfig.titlePromptTemplate, }; } diff --git a/package-lock.json b/package-lock.json index c8f0806430..307137c506 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "@langchain/google-vertexai": "^0.2.13", "@langchain/openai": "^0.5.18", "@langchain/textsplitters": "^0.1.0", - "@librechat/agents": "^2.4.63", + "@librechat/agents": "^2.4.67", "@librechat/api": "*", "@librechat/data-schemas": "*", "@node-saml/passport-saml": "^5.0.0", @@ -87,6 +87,7 @@ "express-static-gzip": "^2.2.0", "file-type": "^18.7.0", "firebase": "^11.0.2", + "form-data": "^4.0.4", "googleapis": "^126.0.1", "handlebars": "^4.7.7", "https-proxy-agent": "^7.0.6", @@ -109,7 +110,7 @@ "node-fetch": "^2.7.0", "nodemailer": "^6.9.15", "ollama": "^0.5.0", - "openai": "^4.96.2", + "openai": "^5.10.1", "openai-chat-tokens": "^0.2.8", "openid-client": "^6.5.0", "passport": "^0.6.0", @@ -2557,6 +2558,27 @@ "node": ">= 0.8" } }, + "api/node_modules/openai": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.10.1.tgz", + "integrity": "sha512-fq6xVfv1/gpLbsj8fArEt3b6B9jBxdhAK+VJ+bDvbUvNd+KTLlA3bnDeYZaBsGH9LUhJ1M1yXfp9sEyBLMx6eA==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "api/node_modules/openid-client": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.5.0.tgz", @@ -9085,6 +9107,1197 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/client-sagemaker": { + "version": "3.850.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.850.0.tgz", + "integrity": "sha512-gEIR/QLnmQN3vHmcTB8+fkLxKItpdOlYW+xRQSVPoD5gZn0IeMwDEO9zc8T+J1RL7N5DPEeK0yMp44u3C0wD5g==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/credential-provider-node": "3.848.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "@smithy/util-waiter": "^4.0.6", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz", + "integrity": "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/core": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz", + "integrity": "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/core": "^3.7.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/signature-v4": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz", + "integrity": "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz", + "integrity": "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz", + "integrity": "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/credential-provider-env": "3.846.0", + "@aws-sdk/credential-provider-http": "3.846.0", + "@aws-sdk/credential-provider-process": "3.846.0", + "@aws-sdk/credential-provider-sso": "3.848.0", + "@aws-sdk/credential-provider-web-identity": "3.848.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz", + "integrity": "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.846.0", + "@aws-sdk/credential-provider-http": "3.846.0", + "@aws-sdk/credential-provider-ini": "3.848.0", + "@aws-sdk/credential-provider-process": "3.846.0", + "@aws-sdk/credential-provider-sso": "3.848.0", + "@aws-sdk/credential-provider-web-identity": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz", + "integrity": "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz", + "integrity": "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-sso": "3.848.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/token-providers": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz", + "integrity": "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", + "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-logger": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", + "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", + "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.848.0.tgz", + "integrity": "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@smithy/core": "^3.7.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/nested-clients": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz", + "integrity": "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", + "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/token-providers": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz", + "integrity": "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/types": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", + "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-endpoints": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", + "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-endpoints": "^3.0.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", + "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz", + "integrity": "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/xml-builder": { + "version": "3.821.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", + "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/abort-controller": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", + "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/config-resolver": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", + "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/core": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.1.tgz", + "integrity": "sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/middleware-serde": "^4.0.8", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-stream": "^4.2.3", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", + "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", + "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/hash-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", + "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/invalid-dependency": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", + "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-content-length": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", + "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.16.tgz", + "integrity": "sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/core": "^3.7.1", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-retry": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.17.tgz", + "integrity": "sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/protocol-http": "^5.1.2", + "@smithy/service-error-classification": "^4.0.6", + "@smithy/smithy-client": "^4.4.8", + "@smithy/types": "^4.3.1", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-serde": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", + "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/middleware-stack": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", + "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/node-config-provider": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", + "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/node-http-handler": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", + "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/abort-controller": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/property-provider": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", + "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/protocol-http": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", + "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/querystring-builder": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", + "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/querystring-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", + "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/service-error-classification": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", + "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", + "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/signature-v4": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", + "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/smithy-client": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.8.tgz", + "integrity": "sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/core": "^3.7.1", + "@smithy/middleware-endpoint": "^4.1.16", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/url-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", + "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/querystring-parser": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.24.tgz", + "integrity": "sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.8", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.24.tgz", + "integrity": "sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/config-resolver": "^4.1.4", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.8", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-endpoints": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", + "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-retry": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", + "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/service-error-classification": "^4.0.6", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-stream": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", + "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-sagemaker/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@aws-sdk/client-sso": { "version": "3.623.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.623.0.tgz", @@ -12261,6 +13474,51 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.374.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.374.0.tgz", + "integrity": "sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==", + "deprecated": "This package has moved to @smithy/protocol-http", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/protocol-http": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", + "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/region-config-resolver": { "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", @@ -12667,6 +13925,22 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.374.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.374.0.tgz", + "integrity": "sha512-2xLJvSdzcZZAg0lsDLUAuSQuihzK0dcxIK7WmfuJeF7DGKJFmp9czQmz5f3qiDz6IDQzvgK1M9vtJSVCslJbyQ==", + "deprecated": "This package has moved to @smithy/signature-v4", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/signature-v4": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.758.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.758.0.tgz", @@ -12791,6 +14065,141 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/eventstream-codec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.1.0.tgz", + "integrity": "sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/is-array-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", + "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/signature-v4": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.1.0.tgz", + "integrity": "sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/eventstream-codec": "^1.1.0", + "@smithy/is-array-buffer": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-hex-encoding": "^1.1.0", + "@smithy/util-middleware": "^1.1.0", + "@smithy/util-uri-escape": "^1.1.0", + "@smithy/util-utf8": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", + "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-hex-encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", + "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-middleware": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", + "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-uri-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", + "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4/node_modules/@smithy/util-utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", + "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/token-providers": { "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", @@ -16751,9 +18160,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -16765,10 +18174,20 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -16779,9 +18198,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16840,13 +18259,16 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", + "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { @@ -16860,32 +18282,19 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", - "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.10.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@firebase/analytics": { "version": "0.10.10", "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.10.tgz", @@ -17653,9 +19062,9 @@ "license": "BSD-3-Clause" }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -19762,13 +21171,13 @@ } }, "node_modules/@langchain/langgraph": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.3.10.tgz", - "integrity": "sha512-EVvvnsqmcNLTgKtxdVGDdWt7UxT6a+mVuo42VLDs2U62kejSnT7Jr4y+x1cEcijIRx15xGyyBiMBuWYiAL6drQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.3.11.tgz", + "integrity": "sha512-Lh8oga4ismQyw1NGZKoHPdeGke1g5HMF7V0nBlc5R7GnV8tfC6pdsXjiEH6sYsHsRDInfy8uQeob/BwEmMSSbQ==", "license": "MIT", "dependencies": { "@langchain/langgraph-checkpoint": "~0.0.18", - "@langchain/langgraph-sdk": "~0.0.98", + "@langchain/langgraph-sdk": "~0.0.100", "uuid": "^10.0.0", "zod": "^3.25.32" }, @@ -19814,9 +21223,9 @@ } }, "node_modules/@langchain/langgraph-sdk": { - "version": "0.0.98", - "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.98.tgz", - "integrity": "sha512-6S6mFc9e5V18PNrBQBRrzgl6VXG7pZ5E9axT7nzSQMmlbp7pxZwdOeFez94d76lo/nqSbSB2Ig7a/P4eafVcNw==", + "version": "0.0.100", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.100.tgz", + "integrity": "sha512-mQuj0KgjD31Me+/W658OtdlOACOjgipWp/hF80OY4w4LqWCNIQWJBWMZ3f1/E8jpog/XBCROR37auFc7Fj+4Dw==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.15", @@ -20059,9 +21468,9 @@ } }, "node_modules/@librechat/agents": { - "version": "2.4.63", - "resolved": "https://registry.npmjs.org/@librechat/agents/-/agents-2.4.63.tgz", - "integrity": "sha512-TBSfatSi506pPB3adLk5Vm7gxb3a2Ht5CE5EZJBaQf153RrlN1E5wHez27iUhsLjBZA4AopAdaLEVmyDQgYxww==", + "version": "2.4.67", + "resolved": "https://registry.npmjs.org/@librechat/agents/-/agents-2.4.67.tgz", + "integrity": "sha512-GHGTdRmBTpfI/Ps3/is1h4hTEX0rijFdhj6LIqXQzHx6Nnv2nNIIK8tMW/0oPVHcdKuRGrR6Nt6BLpAJMfckgg==", "license": "MIT", "dependencies": { "@langchain/anthropic": "^0.3.24", @@ -20079,7 +21488,8 @@ "cheerio": "^1.0.0", "dotenv": "^16.4.7", "https-proxy-agent": "^7.0.6", - "nanoid": "^3.3.7" + "nanoid": "^3.3.7", + "openai": "^5.10.1" }, "engines": { "node": ">=14.0.0" @@ -20632,6 +22042,27 @@ "node": ">= 14" } }, + "node_modules/@librechat/agents/node_modules/openai": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.10.1.tgz", + "integrity": "sha512-fq6xVfv1/gpLbsj8fArEt3b6B9jBxdhAK+VJ+bDvbUvNd+KTLlA3bnDeYZaBsGH9LUhJ1M1yXfp9sEyBLMx6eA==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/@librechat/agents/node_modules/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", @@ -25687,13 +27118,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.2.tgz", - "integrity": "sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz", + "integrity": "sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/abort-controller": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -25701,12 +27132,12 @@ } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/abort-controller": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", - "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", + "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -26328,6 +27759,7 @@ "version": "2.6.11", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "peer": true, "dependencies": { "@types/node": "*", "form-data": "^4.0.0" @@ -26981,6 +28413,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -27012,9 +28445,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "devOptional": true, "license": "MIT", "bin": { @@ -27079,6 +28512,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "peer": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -28691,19 +30125,49 @@ } }, "node_modules/cohere-ai": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-7.9.1.tgz", - "integrity": "sha512-shMz0Bs3p6/Nw5Yi+6Wc9tZ7DCGTtEnf1eAcuesnlyeKoFuZ7+bzeiHkt5E8SvTgAHxN1GCP3UkIoW85QhHKTA==", + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/cohere-ai/-/cohere-ai-7.17.1.tgz", + "integrity": "sha512-GI/uWVYYGIN3gdjJRlbjEaLJNJVXsUJyOlPqwBWgAmK18kP4CJoErxKwU0aLe3tHHOBcC2RqXe6PmGO0dz7dpQ==", "optional": true, "peer": true, "dependencies": { - "form-data": "4.0.0", + "@aws-sdk/client-sagemaker": "^3.583.0", + "@aws-sdk/credential-providers": "^3.583.0", + "@aws-sdk/protocol-http": "^3.374.0", + "@aws-sdk/signature-v4": "^3.374.0", + "convict": "^6.2.4", + "form-data": "^4.0.0", + "form-data-encoder": "^4.0.2", + "formdata-node": "^6.0.3", "js-base64": "3.7.2", "node-fetch": "2.7.0", "qs": "6.11.2", + "readable-stream": "^4.5.2", "url-join": "4.0.1" } }, + "node_modules/cohere-ai/node_modules/form-data-encoder": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/cohere-ai/node_modules/formdata-node": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz", + "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 18" + } + }, "node_modules/cohere-ai/node_modules/qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", @@ -28720,6 +30184,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/cohere-ai/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/cohere-ai/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -28937,6 +30430,32 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "node_modules/convict": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.4.tgz", + "integrity": "sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^20.2.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/convict/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -30469,22 +31988,23 @@ } }, "node_modules/eslint": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", - "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", + "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.31.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -30492,9 +32012,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -30966,9 +32486,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -30983,9 +32503,9 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -31017,15 +32537,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -31035,9 +32555,9 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -31138,6 +32658,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "peer": true, "engines": { "node": ">=6" } @@ -31872,12 +33393,15 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -31887,7 +33411,8 @@ "node_modules/form-data-encoder": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "peer": true }, "node_modules/format": { "version": "0.2.2", @@ -31901,6 +33426,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "peer": true, "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" @@ -31913,6 +33439,7 @@ "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "peer": true, "engines": { "node": ">= 14" } @@ -33070,6 +34597,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "peer": true, "dependencies": { "ms": "^2.0.0" } @@ -33131,15 +34659,16 @@ } }, "node_modules/ibm-cloud-sdk-core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.2.0.tgz", - "integrity": "sha512-urz3bArghYe4AgTpxPBm1ohrzyeRRlekBN9kQAeQn39ixjoHo0qhN9zL6iCayvcZITA2zpuk/FnzP2gEiz8PZg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.4.0.tgz", + "integrity": "sha512-c4cwOuUDbMiFROYM/Ti1aC+Umi1v3TdvC2DO5zR7w44FYY/3xrs79+3DVPXt/nRhJeaMHN2L9XwlXsPSoVDHJA==", + "license": "Apache-2.0", "peer": true, "dependencies": { "@types/debug": "^4.1.12", - "@types/node": "^22.13.9", + "@types/node": "^18.19.80", "@types/tough-cookie": "^4.0.0", - "axios": "1.7.9", + "axios": "^1.8.2", "camelcase": "^6.3.0", "debug": "^4.3.4", "dotenv": "^16.4.5", @@ -33157,12 +34686,13 @@ } }, "node_modules/ibm-cloud-sdk-core/node_modules/@types/node": { - "version": "22.13.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz", - "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", + "version": "18.19.120", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", + "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", + "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~5.26.4" } }, "node_modules/ibm-cloud-sdk-core/node_modules/file-type": { @@ -33229,12 +34759,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/ibm-cloud-sdk-core/node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "peer": true - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -38657,6 +40181,7 @@ "resolved": "https://registry.npmjs.org/openai/-/openai-4.96.2.tgz", "integrity": "sha512-R2XnxvMsizkROr7BV3uNp1q/3skwPZ7fmPjO1bXLnfB4Tu5xKxrT1EVwzjhxn0MZKBKAvOaGWS63jTMN6KrIXA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -38694,6 +40219,7 @@ "version": "18.19.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.14.tgz", "integrity": "sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==", + "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -40728,7 +42254,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.6.0" } @@ -47058,7 +48584,7 @@ }, "packages/api": { "name": "@librechat/api", - "version": "1.2.7", + "version": "1.2.8", "license": "ISC", "devDependencies": { "@babel/preset-env": "^7.21.5", @@ -47091,7 +48617,7 @@ }, "peerDependencies": { "@langchain/core": "^0.3.62", - "@librechat/agents": "^2.4.63", + "@librechat/agents": "^2.4.67", "@librechat/data-schemas": "*", "@modelcontextprotocol/sdk": "^1.13.3", "axios": "^1.8.2", @@ -47184,7 +48710,7 @@ }, "packages/data-provider": { "name": "librechat-data-provider", - "version": "0.7.900", + "version": "0.7.901", "license": "ISC", "dependencies": { "axios": "^1.8.2", @@ -47210,7 +48736,6 @@ "@types/winston": "^2.4.4", "jest": "^29.5.0", "jest-junit": "^16.0.0", - "openai": "^4.76.3", "openapi-types": "^12.1.3", "rimraf": "^5.0.1", "rollup": "^4.22.4", @@ -47270,41 +48795,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "packages/data-provider/node_modules/openai": { - "version": "4.76.3", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.76.3.tgz", - "integrity": "sha512-BISkI90m8zT7BAMljK0j00TzOoLvmc7AulPxv6EARa++3+hhIK5G6z4xkITurEaA9bvDhQ09kSNKA3DL+rDMwA==", - "dev": true, - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "packages/data-provider/node_modules/openai/node_modules/@types/node": { - "version": "18.19.68", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz", - "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, "packages/data-provider/node_modules/rimraf": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", diff --git a/package.json b/package.json index 2dda84820f..a1a3f85ad8 100644 --- a/package.json +++ b/package.json @@ -118,6 +118,7 @@ "@langchain/openai": "0.5.18", "axios": "1.8.2", "elliptic": "^6.6.1", + "form-data": "^4.0.4", "mdast-util-gfm-autolink-literal": "2.0.0", "remark-gfm": { "mdast-util-gfm-autolink-literal": "2.0.0" diff --git a/packages/api/package.json b/packages/api/package.json index fb821e9a76..f307634b45 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@librechat/api", - "version": "1.2.7", + "version": "1.2.8", "type": "commonjs", "description": "MCP services for LibreChat", "main": "dist/index.js", @@ -70,7 +70,7 @@ }, "peerDependencies": { "@langchain/core": "^0.3.62", - "@librechat/agents": "^2.4.63", + "@librechat/agents": "^2.4.67", "@librechat/data-schemas": "*", "@modelcontextprotocol/sdk": "^1.13.3", "axios": "^1.8.2", diff --git a/packages/api/src/agents/run.ts b/packages/api/src/agents/run.ts index 195e7f2e08..9936a75a77 100644 --- a/packages/api/src/agents/run.ts +++ b/packages/api/src/agents/run.ts @@ -18,6 +18,28 @@ const customProviders = new Set([ Providers.OPENROUTER, ]); +export function getReasoningKey( + provider: Providers, + llmConfig: t.RunLLMConfig, + agentEndpoint?: string | null, +): 'reasoning_content' | 'reasoning' { + let reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content'; + if (provider === Providers.GOOGLE) { + reasoningKey = 'reasoning'; + } else if ( + llmConfig.configuration?.baseURL?.includes(KnownEndpoints.openrouter) || + (agentEndpoint && agentEndpoint.toLowerCase().includes(KnownEndpoints.openrouter)) + ) { + reasoningKey = 'reasoning'; + } else if ( + (llmConfig as OpenAIClientOptions).useResponsesApi === true && + (provider === Providers.OPENAI || provider === Providers.AZURE) + ) { + reasoningKey = 'reasoning'; + } + return reasoningKey; +} + /** * Creates a new Run instance with custom handlers and configuration. * @@ -69,21 +91,7 @@ export async function createRun({ llmConfig.usage = true; } - let reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content'; - if (provider === Providers.GOOGLE) { - reasoningKey = 'reasoning'; - } else if ( - llmConfig.configuration?.baseURL?.includes(KnownEndpoints.openrouter) || - (agent.endpoint && agent.endpoint.toLowerCase().includes(KnownEndpoints.openrouter)) - ) { - reasoningKey = 'reasoning'; - } else if ( - (llmConfig as OpenAIClientOptions).useResponsesApi === true && - (provider === Providers.OPENAI || provider === Providers.AZURE) - ) { - reasoningKey = 'reasoning'; - } - + const reasoningKey = getReasoningKey(provider, llmConfig, agent.endpoint); const graphConfig: StandardGraphConfig = { signal, llmConfig, diff --git a/packages/data-provider/package.json b/packages/data-provider/package.json index 2bd3aa87aa..523b766033 100644 --- a/packages/data-provider/package.json +++ b/packages/data-provider/package.json @@ -1,6 +1,6 @@ { "name": "librechat-data-provider", - "version": "0.7.900", + "version": "0.7.901", "description": "data services for librechat apps", "main": "dist/index.js", "module": "dist/index.es.js", @@ -62,7 +62,6 @@ "@types/winston": "^2.4.4", "jest": "^29.5.0", "jest-junit": "^16.0.0", - "openai": "^4.76.3", "openapi-types": "^12.1.3", "rimraf": "^5.0.1", "rollup": "^4.22.4", diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts index 5a56b20813..413f47e771 100644 --- a/packages/data-provider/src/config.ts +++ b/packages/data-provider/src/config.ts @@ -185,6 +185,12 @@ export const baseEndpointSchema = z.object({ baseURL: z.string().optional(), titlePrompt: z.string().optional(), titleModel: z.string().optional(), + titleConvo: z.boolean().optional(), + titleMethod: z + .union([z.literal('completion'), z.literal('functions'), z.literal('structured')]) + .optional(), + titleEndpoint: z.string().optional(), + titlePromptTemplate: z.string().optional(), }); export type TBaseEndpoint = z.infer; @@ -225,8 +231,6 @@ export const assistantEndpointSchema = baseEndpointSchema.merge( userIdQuery: z.boolean().optional(), }) .optional(), - titleConvo: z.boolean().optional(), - titleMethod: z.union([z.literal('completion'), z.literal('functions')]).optional(), headers: z.record(z.any()).optional(), }), ); @@ -279,8 +283,6 @@ export const endpointSchema = baseEndpointSchema.merge( fetch: z.boolean().optional(), userIdQuery: z.boolean().optional(), }), - titleConvo: z.boolean().optional(), - titleMethod: z.union([z.literal('completion'), z.literal('functions')]).optional(), summarize: z.boolean().optional(), summaryModel: z.string().optional(), forcePrompt: z.boolean().optional(), @@ -315,6 +317,8 @@ export const azureEndpointSchema = z titleConvo: true, titleMethod: true, titleModel: true, + titlePrompt: true, + titlePromptTemplate: true, summarize: true, summaryModel: true, customOrder: true, diff --git a/packages/data-provider/src/types.ts b/packages/data-provider/src/types.ts index b1fbc42653..5799ca50e8 100644 --- a/packages/data-provider/src/types.ts +++ b/packages/data-provider/src/types.ts @@ -1,4 +1,3 @@ -import type OpenAI from 'openai'; import type { InfiniteData } from '@tanstack/react-query'; import type { TBanner, @@ -14,8 +13,6 @@ import type { SettingDefinition } from './generate'; import type { TMinimalFeedback } from './feedback'; import type { Agent } from './types/assistants'; -export type TOpenAIMessage = OpenAI.Chat.ChatCompletionMessageParam; - export * from './schemas'; export type TMessages = TMessage[];