From 2d41b661296b92ff28927fa5483764bcaf8998cf Mon Sep 17 00:00:00 2001 From: Tom Frenken Date: Mon, 16 Sep 2024 17:53:39 +0200 Subject: [PATCH] bump version and other suggestions --- packages/langchain/package.json | 4 +- packages/langchain/src/index.ts | 5 +- packages/langchain/src/openai/chat.ts | 6 +- packages/langchain/src/openai/embedding.ts | 6 +- packages/langchain/src/openai/util.ts | 39 +++++----- pnpm-lock.yaml | 84 ++++++++++++++++------ sample-code/package.json | 2 +- sample-code/src/langchain-openai.ts | 6 +- sample-code/src/server.ts | 4 +- 9 files changed, 100 insertions(+), 56 deletions(-) diff --git a/packages/langchain/package.json b/packages/langchain/package.json index 4ba85204..4b00cf5e 100644 --- a/packages/langchain/package.json +++ b/packages/langchain/package.json @@ -29,12 +29,12 @@ "dependencies": { "@sap-ai-sdk/ai-api": "workspace:^", "@sap-ai-sdk/foundation-models": "workspace:^", - "@langchain/core": "^0.2.30", + "@langchain/core": "0.3.1", "zod-to-json-schema": "^3.23.2", "@sap-cloud-sdk/util": "^3.20.0" }, "peerDependencies": { - "@langchain/openai": "^0.2.8" + "@langchain/openai": "^0.3.0" }, "peerDependenciesMeta": { "@langchain/openai": { diff --git a/packages/langchain/src/index.ts b/packages/langchain/src/index.ts index 75d19020..8cde1861 100644 --- a/packages/langchain/src/index.ts +++ b/packages/langchain/src/index.ts @@ -1,4 +1,7 @@ -export { AzureOpenAiChatClient, AzureOpenAiEmbeddingClient } from './openai/index.js'; +export { + AzureOpenAiChatClient, + AzureOpenAiEmbeddingClient +} from './openai/index.js'; export type { OpenAiChatModelInput, OpenAiEmbeddingInput, diff --git a/packages/langchain/src/openai/chat.ts b/packages/langchain/src/openai/chat.ts index 4546f337..14eea5bb 100644 --- a/packages/langchain/src/openai/chat.ts +++ b/packages/langchain/src/openai/chat.ts @@ -3,7 +3,11 @@ import { BaseMessage } from '@langchain/core/messages'; import type { ChatResult } from '@langchain/core/outputs'; import { AzureChatOpenAI, AzureOpenAI } from '@langchain/openai'; import { OpenAiChatClient as OpenAiChatClientBase } from '@sap-ai-sdk/foundation-models'; -import { mapLangchainToAiClient, mapResponseToChatResult, toArrayOrUndefined } from './util.js'; +import { + mapLangchainToAiClient, + mapResponseToChatResult, + toArrayOrUndefined +} from './util.js'; import type { OpenAiChatModelInput, OpenAiChatCallOptions } from './types.js'; /** diff --git a/packages/langchain/src/openai/embedding.ts b/packages/langchain/src/openai/embedding.ts index ffc5610f..6fa7be80 100644 --- a/packages/langchain/src/openai/embedding.ts +++ b/packages/langchain/src/openai/embedding.ts @@ -11,13 +11,13 @@ import { OpenAiEmbeddingInput } from './types.js'; * OpenAI GPT Language Model Wrapper to embed texts. */ export class AzureOpenAiEmbeddingClient extends AzureOpenAIEmbeddings { - private btpOpenAIClient: OpenAiEmbeddingClientBase; + private btpOpenAiClient: OpenAiEmbeddingClientBase; constructor(fields: OpenAiEmbeddingInput) { // overrides the apikey value as it is not applicable in BTP super({ ...fields, apiKey: 'dummy', azureOpenAIApiKey: undefined }); - this.btpOpenAIClient = new OpenAiEmbeddingClientBase({ ...fields }); + this.btpOpenAiClient = new OpenAiEmbeddingClientBase({ ...fields }); } override async embedDocuments(documents: string[]): Promise { @@ -46,7 +46,7 @@ export class AzureOpenAiEmbeddingClient extends AzureOpenAIEmbeddings { query: OpenAiEmbeddingParameters ): Promise { return this.caller.callWithOptions({}, () => - this.btpOpenAIClient.run(query) + this.btpOpenAiClient.run(query) ); } } diff --git a/packages/langchain/src/openai/util.ts b/packages/langchain/src/openai/util.ts index 2a30ec57..ab7b767f 100644 --- a/packages/langchain/src/openai/util.ts +++ b/packages/langchain/src/openai/util.ts @@ -20,8 +20,8 @@ import { OpenAiChatCallOptions } from './types.js'; /** * Maps a LangChain {@link StructuredTool} to {@link OpenAiChatCompletionFunction}. - * @param tool - Base class for Tools that accept input of any shape defined by a Zod schema. - * @returns The OpenAI Chat Completion Function. + * @param tool - Base class for tools that accept input of any shape defined by a Zod schema. + * @returns The OpenAI chat completion function. * @internal */ export function mapToolToOpenAiFunction( @@ -36,8 +36,8 @@ export function mapToolToOpenAiFunction( /** * Maps a LangChain {@link StructuredTool} to {@link OpenAiChatCompletionTool}. - * @param tool - Base class for Tools that accept input of any shape defined by a Zod schema. - * @returns The OpenAI Chat Completion Tool. + * @param tool - Base class for tools that accept input of any shape defined by a Zod schema. + * @returns The OpenAI chat completion tool. * @internal */ export function mapToolToOpenAiTool( @@ -45,18 +45,14 @@ export function mapToolToOpenAiTool( ): OpenAiChatCompletionTool { return { type: 'function', - function: { - name: tool.name, - description: tool.description, - parameters: zodToJsonSchema(tool.schema) - } + function: mapToolToOpenAiFunction(tool) }; } /** - * Maps a {@link BaseMessage} to OpenAI's Message Role. + * Maps a {@link BaseMessage} to OpenAI's message role. * @param message - The message to map. - * @returns The OpenAI Message Role. + * @returns The OpenAI meessage Role. * @internal */ export function mapBaseMessageToRole( @@ -82,8 +78,8 @@ export function mapBaseMessageToRole( /** * Maps OpenAI messages to LangChain's {@link ChatResult}. - * @param res - The OpenAI Chat Completion Output. - * @returns The LangChain Chat Result. + * @param res - The OpenAI chat completion output. + * @returns The LangChain chat result. * @internal */ export function mapResponseToChatResult( @@ -124,9 +120,9 @@ export function mapResponseToChatResult( } /** - * Maps {@link BaseMessage} to OpenAI Messages. + * Maps {@link BaseMessage} to OpenAI messages. * @param message - The message to map. - * @returns The OpenAI Chat Message. + * @returns The OpenAI chat Message. * @internal */ export function mapBaseMessageToOpenAiChatMessage( @@ -149,7 +145,7 @@ export function mapBaseMessageToOpenAiChatMessage( * @returns The value as an array, undefined if the input is falsy, or the original array if input is already an array. */ export function toArrayOrUndefined(value?: T | T[]): T[] | undefined { - if(value === undefined) { + if (value === undefined) { return undefined; } return Array.isArray(value) ? value : [value]; @@ -164,16 +160,15 @@ export function toArrayOrUndefined(value?: T | T[]): T[] | undefined { export function isStructuredToolArray( tools?: unknown[] ): tools is StructuredTool[] { - return ( - tools !== undefined && - tools.every(tool => Array.isArray((tool as StructuredTool).lc_namespace)) + return !!tools?.every(tool => + Array.isArray((tool as StructuredTool).lc_namespace) ); } /** - * Maps Langchain's input interface to our own client's input interface - * @param client The Langchain OpenAI client - * @param options The Langchain call options + * Maps LangChain's input interface to our own client's input interface + * @param client The LangChain OpenAI client + * @param options The LangChain call options * @param messages The messages to be send * @returns An AI SDK compatibile request * @internal diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fe401a9..60332669 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -155,11 +155,11 @@ importers: packages/langchain: dependencies: '@langchain/core': - specifier: ^0.2.30 - version: 0.2.30(openai@4.56.1(zod@3.23.8)) + specifier: 0.3.1 + version: 0.3.1(openai@4.61.1(zod@3.23.8)) '@langchain/openai': - specifier: ^0.2.8 - version: 0.2.8 + specifier: ^0.3.0 + version: 0.3.0(@langchain/core@0.3.1(openai@4.61.1(zod@3.23.8))) '@sap-ai-sdk/ai-api': specifier: workspace:^ version: link:../ai-api @@ -211,8 +211,8 @@ importers: sample-code: dependencies: '@langchain/core': - specifier: ^0.2.30 - version: 0.2.30(openai@4.56.1(zod@3.23.8)) + specifier: 0.3.1 + version: 0.3.1(openai@4.61.1(zod@3.23.8)) '@sap-ai-sdk/ai-api': specifier: workspace:^ version: link:../packages/ai-api @@ -283,7 +283,7 @@ importers: devDependencies: '@langchain/core': specifier: ^0.2.30 - version: 0.2.30(openai@4.56.1(zod@3.23.8)) + version: 0.2.30(openai@4.61.1(zod@3.23.8)) '@sap-ai-sdk/core': specifier: workspace:^ version: link:../../packages/core @@ -766,10 +766,16 @@ packages: resolution: {integrity: sha512-jeLmLTxnEq9zSq0J/fMlBCMT5Ix8tbZriqNYTm3oS7CPM2uHBcRQhV3fpsh4G8FnE7Pxa4sWfrFzc2jykhlk7A==} engines: {node: '>=18'} - '@langchain/openai@0.2.8': - resolution: {integrity: sha512-p5fxEAKuR8UV9jWIxkZ6AY/vAPSYxJI0Pf/UM4T3FKk/dn99G/mAEDLhfI4pBf7B8o8TudSVyBW2hRjZqlQu7g==} + '@langchain/core@0.3.1': + resolution: {integrity: sha512-xYdTAgS9hYPt+h0/OwpyRcMB5HKR40LXutbSr2jw3hMVIOwD1DnvhnUEnWgBK4lumulVW2jrosNPyBKMhRZAZg==} engines: {node: '>=18'} + '@langchain/openai@0.3.0': + resolution: {integrity: sha512-yXrz5Qn3t9nq3NQAH2l4zZOI4ev2CFdLC5kvmi5SdW4bggRuM40SXTUAY3VRld4I5eocYfk82VbrlA+6dvN5EA==} + engines: {node: '>=18'} + peerDependencies: + '@langchain/core': '>=0.2.26 <0.4.0' + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -2528,6 +2534,14 @@ packages: openai: optional: true + langsmith@0.1.56-rc.1: + resolution: {integrity: sha512-XsOxlhBAlTCGR9hNEL2VSREmiz8v6czNuX3CIwec9fH9T0WbNPle8Q/7Jy/h9UCbS9vuzTjfgc4qO5Dc9cu5Ig==} + peerDependencies: + openai: '*' + peerDependenciesMeta: + openai: + optional: true + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -2825,8 +2839,8 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - openai@4.56.1: - resolution: {integrity: sha512-XMsxdjrWBYgbP6EsDIwbhkQEgeyL2C41te/QrJm8kdfho22exhTUJ/cFJSmCTToam/RSOC1BlOylHvD6i/bmsA==} + openai@4.61.1: + resolution: {integrity: sha512-jZ2WRn+f4QWZkYnrUS+xzEUIBllsGN75dUCaXmMIHcv2W9yn7O8amaReTbGHCNEYkL43vuDOcxPUWfNPUmoD3Q==} hasBin: true peerDependencies: zod: ^3.23.8 @@ -4415,13 +4429,13 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@langchain/core@0.2.30(openai@4.56.1(zod@3.23.8))': + '@langchain/core@0.2.30(openai@4.61.1(zod@3.23.8))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.14 - langsmith: 0.1.48(@langchain/core@0.2.30(openai@4.56.1(zod@3.23.8)))(openai@4.56.1(zod@3.23.8)) + langsmith: 0.1.48(@langchain/core@0.2.30(openai@4.61.1(zod@3.23.8)))(openai@4.61.1(zod@3.23.8)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -4432,16 +4446,31 @@ snapshots: - langchain - openai - '@langchain/openai@0.2.8': + '@langchain/core@0.3.1(openai@4.61.1(zod@3.23.8))': dependencies: - '@langchain/core': 0.2.30(openai@4.56.1(zod@3.23.8)) + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 js-tiktoken: 1.0.14 - openai: 4.56.1(zod@3.23.8) + langsmith: 0.1.56-rc.1(openai@4.61.1(zod@3.23.8)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.2(zod@3.23.8) + transitivePeerDependencies: + - openai + + '@langchain/openai@0.3.0(@langchain/core@0.3.1(openai@4.61.1(zod@3.23.8)))': + dependencies: + '@langchain/core': 0.3.1(openai@4.61.1(zod@3.23.8)) + js-tiktoken: 1.0.14 + openai: 4.61.1(zod@3.23.8) zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - encoding - - langchain '@manypkg/find-root@1.1.0': dependencies: @@ -6707,7 +6736,19 @@ snapshots: kuler@2.0.0: {} - langsmith@0.1.48(@langchain/core@0.2.30(openai@4.56.1(zod@3.23.8)))(openai@4.56.1(zod@3.23.8)): + langsmith@0.1.48(@langchain/core@0.2.30(openai@4.61.1(zod@3.23.8)))(openai@4.61.1(zod@3.23.8)): + dependencies: + '@types/uuid': 10.0.0 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.6.3 + uuid: 10.0.0 + optionalDependencies: + '@langchain/core': 0.2.30(openai@4.61.1(zod@3.23.8)) + openai: 4.61.1(zod@3.23.8) + + langsmith@0.1.56-rc.1(openai@4.61.1(zod@3.23.8)): dependencies: '@types/uuid': 10.0.0 commander: 10.0.1 @@ -6716,8 +6757,7 @@ snapshots: semver: 7.6.3 uuid: 10.0.0 optionalDependencies: - '@langchain/core': 0.2.30(openai@4.56.1(zod@3.23.8)) - openai: 4.56.1(zod@3.23.8) + openai: 4.61.1(zod@3.23.8) leven@3.1.0: {} @@ -7012,15 +7052,17 @@ snapshots: dependencies: mimic-fn: 2.1.0 - openai@4.56.1(zod@3.23.8): + openai@4.61.1(zod@3.23.8): dependencies: '@types/node': 18.19.47 '@types/node-fetch': 2.6.11 + '@types/qs': 6.9.15 abort-controller: 3.0.0 agentkeepalive: 4.5.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 node-fetch: 2.7.0 + qs: 6.13.0 optionalDependencies: zod: 3.23.8 transitivePeerDependencies: diff --git a/sample-code/package.json b/sample-code/package.json index 315a3b3a..b4961547 100644 --- a/sample-code/package.json +++ b/sample-code/package.json @@ -27,7 +27,7 @@ "@sap-ai-sdk/foundation-models": "workspace:^", "@sap-ai-sdk/orchestration": "workspace:^", "@sap-ai-sdk/langchain": "workspace:^", - "@langchain/core": "^0.2.30", + "@langchain/core": "0.3.1", "@types/express": "^4.17.21", "express": "^4.21.0" } diff --git a/sample-code/src/langchain-openai.ts b/sample-code/src/langchain-openai.ts index 7500bf9c..44a21c9c 100644 --- a/sample-code/src/langchain-openai.ts +++ b/sample-code/src/langchain-openai.ts @@ -1,12 +1,12 @@ import { HumanMessage } from '@langchain/core/messages'; -import { OpenAiChatClient, OpenAiEmbeddingClient } from '@sap-ai-sdk/langchain'; +import { AzureOpenAiChatClient, AzureOpenAiEmbeddingClient } from '@sap-ai-sdk/langchain'; /** * Ask GPT about the capital of France. * @returns The answer from GPT. */ export async function generate(): Promise { - const client = new OpenAiChatClient({ modelName: 'gpt-35-turbo' }); + const client = new AzureOpenAiChatClient({ modelName: 'gpt-35-turbo' }); const response = await client.generate([ [new HumanMessage('What is the capital of France?')] ]); @@ -18,7 +18,7 @@ export async function generate(): Promise { * @returns An embedding vector. */ export async function embedQuery(): Promise { - const client = new OpenAiEmbeddingClient({ + const client = new AzureOpenAiEmbeddingClient({ modelName: 'text-embedding-ada-002' }); return client.embedQuery('Hello, world!'); diff --git a/sample-code/src/server.ts b/sample-code/src/server.ts index 714d247c..4c86eb84 100644 --- a/sample-code/src/server.ts +++ b/sample-code/src/server.ts @@ -29,7 +29,7 @@ app.get('/llm', async (req, res) => { app.get('/embedding', async (req, res) => { try { const result = await computeEmbedding(); - if (result.length === 0) { + if (!result.length) { throw new Error('No embedding vector returned'); } res.send('Number crunching success, got a nice vector.'); @@ -77,7 +77,7 @@ app.get('/langchain/chat', async (req, res) => { app.get('/langchain/embedding', async (req, res) => { try { const result = await embedQuery(); - if (result.length === 0) { + if (!result.length) { throw new Error('No embedding vector returned'); } res.send('Number crunching success, got a nice vector.');