feat(Anthropic Chat Model Node): Fetch models dynamically & support thinking (#13543)

This commit is contained in:
oleg 2025-02-27 15:40:58 +01:00 committed by GitHub
parent 615a42afd5
commit 461df371f7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 316 additions and 30 deletions

View file

@ -14,6 +14,7 @@ import {
import { getConnectionHintNoticeField } from '@utils/sharedFields'; import { getConnectionHintNoticeField } from '@utils/sharedFields';
import { searchModels } from './methods/searchModels';
import { makeN8nLlmFailedAttemptHandler } from '../n8nLlmFailedAttemptHandler'; import { makeN8nLlmFailedAttemptHandler } from '../n8nLlmFailedAttemptHandler';
import { N8nLlmTracing } from '../N8nLlmTracing'; import { N8nLlmTracing } from '../N8nLlmTracing';
@ -69,15 +70,23 @@ const modelField: INodeProperties = {
default: 'claude-2', default: 'claude-2',
}; };
const MIN_THINKING_BUDGET = 1024;
const DEFAULT_MAX_TOKENS = 4096;
export class LmChatAnthropic implements INodeType { export class LmChatAnthropic implements INodeType {
methods = {
listSearch: {
searchModels,
},
};
description: INodeTypeDescription = { description: INodeTypeDescription = {
displayName: 'Anthropic Chat Model', displayName: 'Anthropic Chat Model',
// eslint-disable-next-line n8n-nodes-base/node-class-description-name-miscased // eslint-disable-next-line n8n-nodes-base/node-class-description-name-miscased
name: 'lmChatAnthropic', name: 'lmChatAnthropic',
icon: 'file:anthropic.svg', icon: 'file:anthropic.svg',
group: ['transform'], group: ['transform'],
version: [1, 1.1, 1.2], version: [1, 1.1, 1.2, 1.3],
defaultVersion: 1.2, defaultVersion: 1.3,
description: 'Language Model Anthropic', description: 'Language Model Anthropic',
defaults: { defaults: {
name: 'Anthropic Chat Model', name: 'Anthropic Chat Model',
@ -135,7 +144,43 @@ export class LmChatAnthropic implements INodeType {
), ),
displayOptions: { displayOptions: {
show: { show: {
'@version': [{ _cnd: { gte: 1.2 } }], '@version': [{ _cnd: { lte: 1.2 } }],
},
},
},
{
displayName: 'Model',
name: 'model',
type: 'resourceLocator',
default: {
mode: 'list',
value: 'claude-3-7-sonnet-20250219',
cachedResultName: 'Claude 3.7 Sonnet',
},
required: true,
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select a model...',
typeOptions: {
searchListMethod: 'searchModels',
searchable: true,
},
},
{
displayName: 'ID',
name: 'id',
type: 'string',
placeholder: 'Claude Sonnet',
},
],
description:
'The model. Choose from the list, or specify an ID. <a href="https://docs.anthropic.com/claude/docs/models-overview">Learn more</a>.',
displayOptions: {
show: {
'@version': [{ _cnd: { gte: 1.3 } }],
}, },
}, },
}, },
@ -150,7 +195,7 @@ export class LmChatAnthropic implements INodeType {
{ {
displayName: 'Maximum Number of Tokens', displayName: 'Maximum Number of Tokens',
name: 'maxTokensToSample', name: 'maxTokensToSample',
default: 4096, default: DEFAULT_MAX_TOKENS,
description: 'The maximum number of tokens to generate in the completion', description: 'The maximum number of tokens to generate in the completion',
type: 'number', type: 'number',
}, },
@ -162,6 +207,11 @@ export class LmChatAnthropic implements INodeType {
description: description:
'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.', 'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.',
type: 'number', type: 'number',
displayOptions: {
hide: {
thinking: [true],
},
},
}, },
{ {
displayName: 'Top K', displayName: 'Top K',
@ -171,6 +221,11 @@ export class LmChatAnthropic implements INodeType {
description: description:
'Used to remove "long tail" low probability responses. Defaults to -1, which disables it.', 'Used to remove "long tail" low probability responses. Defaults to -1, which disables it.',
type: 'number', type: 'number',
displayOptions: {
hide: {
thinking: [true],
},
},
}, },
{ {
displayName: 'Top P', displayName: 'Top P',
@ -180,6 +235,30 @@ export class LmChatAnthropic implements INodeType {
description: description:
'Controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered. We generally recommend altering this or temperature but not both.', 'Controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered. We generally recommend altering this or temperature but not both.',
type: 'number', type: 'number',
displayOptions: {
hide: {
thinking: [true],
},
},
},
{
displayName: 'Enable Thinking',
name: 'thinking',
type: 'boolean',
default: false,
description: 'Whether to enable thinking mode for the model',
},
{
displayName: 'Thinking Budget (Tokens)',
name: 'thinkingBudget',
type: 'number',
default: MIN_THINKING_BUDGET,
description: 'The maximum number of tokens to use for thinking',
displayOptions: {
show: {
thinking: [true],
},
},
}, },
], ],
}, },
@ -189,13 +268,21 @@ export class LmChatAnthropic implements INodeType {
async supplyData(this: ISupplyDataFunctions, itemIndex: number): Promise<SupplyData> { async supplyData(this: ISupplyDataFunctions, itemIndex: number): Promise<SupplyData> {
const credentials = await this.getCredentials('anthropicApi'); const credentials = await this.getCredentials('anthropicApi');
const modelName = this.getNodeParameter('model', itemIndex) as string; const version = this.getNode().typeVersion;
const modelName =
version >= 1.3
? (this.getNodeParameter('model.value', itemIndex) as string)
: (this.getNodeParameter('model', itemIndex) as string);
const options = this.getNodeParameter('options', itemIndex, {}) as { const options = this.getNodeParameter('options', itemIndex, {}) as {
maxTokensToSample?: number; maxTokensToSample?: number;
temperature: number; temperature: number;
topK: number; topK?: number;
topP: number; topP?: number;
thinking?: boolean;
thinkingBudget?: number;
}; };
let invocationKwargs = {};
const tokensUsageParser = (llmOutput: LLMResult['llmOutput']) => { const tokensUsageParser = (llmOutput: LLMResult['llmOutput']) => {
const usage = (llmOutput?.usage as { input_tokens: number; output_tokens: number }) ?? { const usage = (llmOutput?.usage as { input_tokens: number; output_tokens: number }) ?? {
@ -208,6 +295,27 @@ export class LmChatAnthropic implements INodeType {
totalTokens: usage.input_tokens + usage.output_tokens, totalTokens: usage.input_tokens + usage.output_tokens,
}; };
}; };
if (options.thinking) {
invocationKwargs = {
thinking: {
type: 'enabled',
// If thinking is enabled, we need to set a budget.
// We fallback to 1024 as that is the minimum
budget_tokens: options.thinkingBudget ?? MIN_THINKING_BUDGET,
},
// The default Langchain max_tokens is -1 (no limit) but Anthropic requires a number
// higher than budget_tokens
max_tokens: options.maxTokensToSample ?? DEFAULT_MAX_TOKENS,
// These need to be unset when thinking is enabled.
// Because the invocationKwargs will override the model options
// we can pass options to the model and then override them here
top_k: undefined,
top_p: undefined,
temperature: undefined,
};
}
const model = new ChatAnthropic({ const model = new ChatAnthropic({
anthropicApiKey: credentials.apiKey as string, anthropicApiKey: credentials.apiKey as string,
modelName, modelName,
@ -217,6 +325,7 @@ export class LmChatAnthropic implements INodeType {
topP: options.topP, topP: options.topP,
callbacks: [new N8nLlmTracing(this, { tokensUsageParser })], callbacks: [new N8nLlmTracing(this, { tokensUsageParser })],
onFailedAttempt: makeN8nLlmFailedAttemptHandler(this), onFailedAttempt: makeN8nLlmFailedAttemptHandler(this),
invocationKwargs,
}); });
return { return {

View file

@ -0,0 +1,105 @@
import type { ILoadOptionsFunctions } from 'n8n-workflow';
import { searchModels, type AnthropicModel } from '../searchModels';
describe('searchModels', () => {
let mockContext: jest.Mocked<ILoadOptionsFunctions>;
const mockModels: AnthropicModel[] = [
{
id: 'claude-3-opus-20240229',
display_name: 'Claude 3 Opus',
type: 'model',
created_at: '2024-02-29T00:00:00Z',
},
{
id: 'claude-3-sonnet-20240229',
display_name: 'Claude 3 Sonnet',
type: 'model',
created_at: '2024-02-29T00:00:00Z',
},
{
id: 'claude-3-haiku-20240307',
display_name: 'Claude 3 Haiku',
type: 'model',
created_at: '2024-03-07T00:00:00Z',
},
{
id: 'claude-2.1',
display_name: 'Claude 2.1',
type: 'model',
created_at: '2023-11-21T00:00:00Z',
},
{
id: 'claude-2.0',
display_name: 'Claude 2.0',
type: 'model',
created_at: '2023-07-11T00:00:00Z',
},
];
beforeEach(() => {
mockContext = {
helpers: {
httpRequestWithAuthentication: jest.fn().mockResolvedValue({
data: mockModels,
}),
},
} as unknown as jest.Mocked<ILoadOptionsFunctions>;
});
afterEach(() => {
jest.clearAllMocks();
});
it('should fetch models from Anthropic API', async () => {
const result = await searchModels.call(mockContext);
expect(mockContext.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith('anthropicApi', {
url: 'https://api.anthropic.com/v1/models',
headers: {
'anthropic-version': '2023-06-01',
},
});
expect(result.results).toHaveLength(5);
});
it('should sort models by created_at date, most recent first', async () => {
const result = await searchModels.call(mockContext);
const sortedResults = result.results;
expect(sortedResults[0].value).toBe('claude-3-haiku-20240307');
expect(sortedResults[1].value).toBe('claude-3-opus-20240229');
expect(sortedResults[2].value).toBe('claude-3-sonnet-20240229');
expect(sortedResults[3].value).toBe('claude-2.1');
expect(sortedResults[4].value).toBe('claude-2.0');
});
it('should filter models based on search term', async () => {
const result = await searchModels.call(mockContext, 'claude-3');
expect(result.results).toHaveLength(3);
expect(result.results).toEqual([
{ name: 'Claude 3 Haiku', value: 'claude-3-haiku-20240307' },
{ name: 'Claude 3 Opus', value: 'claude-3-opus-20240229' },
{ name: 'Claude 3 Sonnet', value: 'claude-3-sonnet-20240229' },
]);
});
it('should handle case-insensitive search', async () => {
const result = await searchModels.call(mockContext, 'CLAUDE-3');
expect(result.results).toHaveLength(3);
expect(result.results).toEqual([
{ name: 'Claude 3 Haiku', value: 'claude-3-haiku-20240307' },
{ name: 'Claude 3 Opus', value: 'claude-3-opus-20240229' },
{ name: 'Claude 3 Sonnet', value: 'claude-3-sonnet-20240229' },
]);
});
it('should handle when no models match the filter', async () => {
const result = await searchModels.call(mockContext, 'nonexistent-model');
expect(result.results).toHaveLength(0);
});
});

View file

@ -0,0 +1,60 @@
import type {
ILoadOptionsFunctions,
INodeListSearchItems,
INodeListSearchResult,
} from 'n8n-workflow';
export interface AnthropicModel {
id: string;
display_name: string;
type: string;
created_at: string;
}
export async function searchModels(
this: ILoadOptionsFunctions,
filter?: string,
): Promise<INodeListSearchResult> {
const response = (await this.helpers.httpRequestWithAuthentication.call(this, 'anthropicApi', {
url: 'https://api.anthropic.com/v1/models',
headers: {
'anthropic-version': '2023-06-01',
},
})) as { data: AnthropicModel[] };
const models = response.data || [];
let results: INodeListSearchItems[] = [];
if (filter) {
for (const model of models) {
if (model.id.toLowerCase().includes(filter.toLowerCase())) {
results.push({
name: model.display_name,
value: model.id,
});
}
}
} else {
results = models.map((model) => ({
name: model.display_name,
value: model.id,
}));
}
// Sort models with more recent ones first (claude-3 before claude-2)
results = results.sort((a, b) => {
const modelA = models.find((m) => m.id === a.value);
const modelB = models.find((m) => m.id === b.value);
if (!modelA || !modelB) return 0;
// Sort by created_at date, most recent first
const dateA = new Date(modelA.created_at);
const dateB = new Date(modelB.created_at);
return dateB.getTime() - dateA.getTime();
});
return {
results,
};
}

View file

@ -140,7 +140,7 @@
"@google-cloud/resource-manager": "5.3.0", "@google-cloud/resource-manager": "5.3.0",
"@google/generative-ai": "0.21.0", "@google/generative-ai": "0.21.0",
"@huggingface/inference": "2.8.0", "@huggingface/inference": "2.8.0",
"@langchain/anthropic": "0.3.11", "@langchain/anthropic": "0.3.14",
"@langchain/aws": "0.1.3", "@langchain/aws": "0.1.3",
"@langchain/cohere": "0.3.2", "@langchain/cohere": "0.3.2",
"@langchain/community": "0.3.24", "@langchain/community": "0.3.24",

View file

@ -493,7 +493,7 @@ importers:
version: 3.666.0(@aws-sdk/client-sts@3.666.0) version: 3.666.0(@aws-sdk/client-sts@3.666.0)
'@getzep/zep-cloud': '@getzep/zep-cloud':
specifier: 1.0.12 specifier: 1.0.12
version: 1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(d2c70e6e899e44bb5377ca6198a97c6c)) version: 1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(c10b80e38f5a8711ccad1e2174de91e6))
'@getzep/zep-js': '@getzep/zep-js':
specifier: 0.9.0 specifier: 0.9.0
version: 0.9.0 version: 0.9.0
@ -510,8 +510,8 @@ importers:
specifier: 2.8.0 specifier: 2.8.0
version: 2.8.0 version: 2.8.0
'@langchain/anthropic': '@langchain/anthropic':
specifier: 0.3.11 specifier: 0.3.14
version: 0.3.11(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) version: 0.3.14(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)
'@langchain/aws': '@langchain/aws':
specifier: 0.1.3 specifier: 0.1.3
version: 0.1.3(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@aws-sdk/client-sts@3.666.0)(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))) version: 0.1.3(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@aws-sdk/client-sts@3.666.0)(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))
@ -520,7 +520,7 @@ importers:
version: 0.3.2(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) version: 0.3.2(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)
'@langchain/community': '@langchain/community':
specifier: 0.3.24 specifier: 0.3.24
version: 0.3.24(8549324d4d39cb6e91ae9ff5fc6970d3) version: 0.3.24(1ea346ff95b1be1e3f1f4333b25e2811)
'@langchain/core': '@langchain/core':
specifier: 'catalog:' specifier: 'catalog:'
version: 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) version: 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))
@ -610,7 +610,7 @@ importers:
version: 23.0.1 version: 23.0.1
langchain: langchain:
specifier: 0.3.11 specifier: 0.3.11
version: 0.3.11(d2c70e6e899e44bb5377ca6198a97c6c) version: 0.3.11(c10b80e38f5a8711ccad1e2174de91e6)
lodash: lodash:
specifier: 'catalog:' specifier: 'catalog:'
version: 4.17.21 version: 4.17.21
@ -2295,8 +2295,8 @@ packages:
'@anthropic-ai/sdk@0.27.3': '@anthropic-ai/sdk@0.27.3':
resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==} resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==}
'@anthropic-ai/sdk@0.32.1': '@anthropic-ai/sdk@0.37.0':
resolution: {integrity: sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==} resolution: {integrity: sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw==}
'@apidevtools/json-schema-ref-parser@11.7.0': '@apidevtools/json-schema-ref-parser@11.7.0':
resolution: {integrity: sha512-pRrmXMCwnmrkS3MLgAIW5dXRzeTv6GLjkjb4HmxNnvAKXN1Nfzp4KmGADBQvlVUcqi+a5D+hfGDLLnd5NnYxog==} resolution: {integrity: sha512-pRrmXMCwnmrkS3MLgAIW5dXRzeTv6GLjkjb4HmxNnvAKXN1Nfzp4KmGADBQvlVUcqi+a5D+hfGDLLnd5NnYxog==}
@ -4006,8 +4006,8 @@ packages:
'@kwsites/promise-deferred@1.1.1': '@kwsites/promise-deferred@1.1.1':
resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==}
'@langchain/anthropic@0.3.11': '@langchain/anthropic@0.3.14':
resolution: {integrity: sha512-rYjDZjMwVQ+cYeJd9IoSESdkkG8fc0m3siGRYKNy6qgYMnqCz8sUPKBanXwbZAs6wvspPCGgNK9WONfaCeX97A==} resolution: {integrity: sha512-zfix+qo/coIkgjTYpadp71IAWGXriIfImYLwMr1HnFsit4/RN9DU+aEOdm0nTwycbaneUpwWs5yfje8IKWHfsA==}
engines: {node: '>=18'} engines: {node: '>=18'}
peerDependencies: peerDependencies:
'@langchain/core': '>=0.2.21 <0.4.0' '@langchain/core': '>=0.2.21 <0.4.0'
@ -13879,7 +13879,7 @@ snapshots:
- encoding - encoding
- supports-color - supports-color
'@anthropic-ai/sdk@0.32.1(encoding@0.1.13)': '@anthropic-ai/sdk@0.37.0(encoding@0.1.13)':
dependencies: dependencies:
'@types/node': 18.16.16 '@types/node': 18.16.16
'@types/node-fetch': 2.6.4 '@types/node-fetch': 2.6.4
@ -16125,7 +16125,7 @@ snapshots:
'@gar/promisify@1.1.3': '@gar/promisify@1.1.3':
optional: true optional: true
'@getzep/zep-cloud@1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(d2c70e6e899e44bb5377ca6198a97c6c))': '@getzep/zep-cloud@1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(c10b80e38f5a8711ccad1e2174de91e6))':
dependencies: dependencies:
form-data: 4.0.0 form-data: 4.0.0
node-fetch: 2.7.0(encoding@0.1.13) node-fetch: 2.7.0(encoding@0.1.13)
@ -16134,7 +16134,7 @@ snapshots:
zod: 3.24.1 zod: 3.24.1
optionalDependencies: optionalDependencies:
'@langchain/core': 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) '@langchain/core': 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))
langchain: 0.3.11(d2c70e6e899e44bb5377ca6198a97c6c) langchain: 0.3.11(c10b80e38f5a8711ccad1e2174de91e6)
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
@ -16616,9 +16616,9 @@ snapshots:
'@kwsites/promise-deferred@1.1.1': {} '@kwsites/promise-deferred@1.1.1': {}
'@langchain/anthropic@0.3.11(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)': '@langchain/anthropic@0.3.14(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)':
dependencies: dependencies:
'@anthropic-ai/sdk': 0.32.1(encoding@0.1.13) '@anthropic-ai/sdk': 0.37.0(encoding@0.1.13)
'@langchain/core': 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) '@langchain/core': 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))
fast-xml-parser: 4.4.1 fast-xml-parser: 4.4.1
zod: 3.24.1 zod: 3.24.1
@ -16653,7 +16653,7 @@ snapshots:
- aws-crt - aws-crt
- encoding - encoding
'@langchain/community@0.3.24(8549324d4d39cb6e91ae9ff5fc6970d3)': '@langchain/community@0.3.24(1ea346ff95b1be1e3f1f4333b25e2811)':
dependencies: dependencies:
'@browserbasehq/stagehand': 1.9.0(@playwright/test@1.49.1)(deepmerge@4.3.1)(dotenv@16.4.5)(encoding@0.1.13)(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))(zod@3.24.1) '@browserbasehq/stagehand': 1.9.0(@playwright/test@1.49.1)(deepmerge@4.3.1)(dotenv@16.4.5)(encoding@0.1.13)(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))(zod@3.24.1)
'@ibm-cloud/watsonx-ai': 1.1.2 '@ibm-cloud/watsonx-ai': 1.1.2
@ -16664,7 +16664,7 @@ snapshots:
flat: 5.0.2 flat: 5.0.2
ibm-cloud-sdk-core: 5.1.0 ibm-cloud-sdk-core: 5.1.0
js-yaml: 4.1.0 js-yaml: 4.1.0
langchain: 0.3.11(d2c70e6e899e44bb5377ca6198a97c6c) langchain: 0.3.11(c10b80e38f5a8711ccad1e2174de91e6)
langsmith: 0.2.15(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) langsmith: 0.2.15(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))
openai: 4.78.1(encoding@0.1.13)(zod@3.24.1) openai: 4.78.1(encoding@0.1.13)(zod@3.24.1)
uuid: 10.0.0 uuid: 10.0.0
@ -16679,7 +16679,7 @@ snapshots:
'@aws-sdk/credential-provider-node': 3.666.0(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@aws-sdk/client-sts@3.666.0) '@aws-sdk/credential-provider-node': 3.666.0(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@aws-sdk/client-sts@3.666.0)
'@azure/storage-blob': 12.18.0(encoding@0.1.13) '@azure/storage-blob': 12.18.0(encoding@0.1.13)
'@browserbasehq/sdk': 2.0.0(encoding@0.1.13) '@browserbasehq/sdk': 2.0.0(encoding@0.1.13)
'@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(d2c70e6e899e44bb5377ca6198a97c6c)) '@getzep/zep-cloud': 1.0.12(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)(langchain@0.3.11(c10b80e38f5a8711ccad1e2174de91e6))
'@getzep/zep-js': 0.9.0 '@getzep/zep-js': 0.9.0
'@google-ai/generativelanguage': 2.6.0(encoding@0.1.13) '@google-ai/generativelanguage': 2.6.0(encoding@0.1.13)
'@google-cloud/storage': 7.12.1(encoding@0.1.13) '@google-cloud/storage': 7.12.1(encoding@0.1.13)
@ -19998,6 +19998,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- debug - debug
axios@1.7.4(debug@4.4.0):
dependencies:
follow-redirects: 1.15.6(debug@4.4.0)
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
axios@1.7.7: axios@1.7.7:
dependencies: dependencies:
follow-redirects: 1.15.6(debug@4.3.6) follow-redirects: 1.15.6(debug@4.3.6)
@ -22218,6 +22226,10 @@ snapshots:
optionalDependencies: optionalDependencies:
debug: 4.3.7 debug: 4.3.7
follow-redirects@1.15.6(debug@4.4.0):
optionalDependencies:
debug: 4.4.0
for-each@0.3.3: for-each@0.3.3:
dependencies: dependencies:
is-callable: 1.2.7 is-callable: 1.2.7
@ -22809,7 +22821,7 @@ snapshots:
'@types/debug': 4.1.12 '@types/debug': 4.1.12
'@types/node': 18.16.16 '@types/node': 18.16.16
'@types/tough-cookie': 4.0.2 '@types/tough-cookie': 4.0.2
axios: 1.7.4 axios: 1.7.4(debug@4.4.0)
camelcase: 6.3.0 camelcase: 6.3.0
debug: 4.4.0 debug: 4.4.0
dotenv: 16.4.5 dotenv: 16.4.5
@ -22819,7 +22831,7 @@ snapshots:
isstream: 0.1.2 isstream: 0.1.2
jsonwebtoken: 9.0.2 jsonwebtoken: 9.0.2
mime-types: 2.1.35 mime-types: 2.1.35
retry-axios: 2.6.0(axios@1.7.4(debug@4.4.0)) retry-axios: 2.6.0(axios@1.7.4)
tough-cookie: 4.1.3 tough-cookie: 4.1.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -23808,7 +23820,7 @@ snapshots:
kuler@2.0.0: {} kuler@2.0.0: {}
langchain@0.3.11(d2c70e6e899e44bb5377ca6198a97c6c): langchain@0.3.11(c10b80e38f5a8711ccad1e2174de91e6):
dependencies: dependencies:
'@langchain/core': 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)) '@langchain/core': 0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))
'@langchain/openai': 0.3.17(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) '@langchain/openai': 0.3.17(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)
@ -23824,7 +23836,7 @@ snapshots:
zod: 3.24.1 zod: 3.24.1
zod-to-json-schema: 3.23.3(zod@3.24.1) zod-to-json-schema: 3.23.3(zod@3.24.1)
optionalDependencies: optionalDependencies:
'@langchain/anthropic': 0.3.11(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) '@langchain/anthropic': 0.3.14(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)
'@langchain/aws': 0.1.3(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@aws-sdk/client-sts@3.666.0)(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1))) '@langchain/aws': 0.1.3(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@aws-sdk/client-sts@3.666.0)(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))
'@langchain/cohere': 0.3.2(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13) '@langchain/cohere': 0.3.2(@aws-sdk/client-sso-oidc@3.666.0(@aws-sdk/client-sts@3.666.0))(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(encoding@0.1.13)
'@langchain/google-genai': 0.1.6(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(zod@3.24.1) '@langchain/google-genai': 0.1.6(@langchain/core@0.3.30(openai@4.78.1(encoding@0.1.13)(zod@3.24.1)))(zod@3.24.1)
@ -26192,7 +26204,7 @@ snapshots:
ret@0.1.15: {} ret@0.1.15: {}
retry-axios@2.6.0(axios@1.7.4(debug@4.4.0)): retry-axios@2.6.0(axios@1.7.4):
dependencies: dependencies:
axios: 1.7.4 axios: 1.7.4