diff --git a/.github/workflows/unit-tests-integrations.yml b/.github/workflows/unit-tests-integrations.yml index c3cbc5e2e292..5e77222654cb 100644 --- a/.github/workflows/unit-tests-integrations.yml +++ b/.github/workflows/unit-tests-integrations.yml @@ -45,7 +45,7 @@ jobs: needs: get-changed-files runs-on: ubuntu-latest env: - PACKAGES: "anthropic,azure-openai,cloudflare,cohere,core,community,exa,google-common,google-gauth,google-genai,google-vertexai,google-vertexai-web,google-webauth,groq,mistralai,mongo,nomic,openai,pinecone,qdrant,redis,textsplitters,weaviate,yandex" + PACKAGES: "anthropic,azure-openai,cloudflare,cohere,core,community,exa,google-common,google-gauth,google-genai,google-vertexai,google-vertexai-web,google-webauth,groq,mistralai,mongo,nomic,openai,pinecone,qdrant,redis,textsplitters,weaviate,yandex,baidu-qianfan" outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: @@ -95,4 +95,4 @@ jobs: - name: Install dependencies run: yarn install --immutable - name: Test '@langchain/${{ matrix.package }}' package - run: yarn test:unit:ci --filter=@langchain/${{ matrix.package }} + run: yarn test:unit:ci --filter=@langchain/${{ matrix.package }} \ No newline at end of file diff --git a/docs/core_docs/docs/integrations/chat/baidu_qianfan.mdx b/docs/core_docs/docs/integrations/chat/baidu_qianfan.mdx new file mode 100644 index 000000000000..246bb9db1a01 --- /dev/null +++ b/docs/core_docs/docs/integrations/chat/baidu_qianfan.mdx @@ -0,0 +1,37 @@ +--- +sidebar_label: Baidu Qianfan +--- + +import CodeBlock from "@theme/CodeBlock"; + +# ChatBaiduQianfan + +## Setup + +You'll first need to install the [`@langchain/baidu-qianfan`](https://www.npmjs.com/package/@langchain/baidu-qianfan) package: + +import IntegrationInstallTooltip from "@mdx_components/integration_install_tooltip.mdx"; + + + +```bash npm2yarn +npm install @langchain/baidu-qianfan +``` + +Available models: `ERNIE-Bot`,`ERNIE-Bot-turbo`,`ERNIE-Bot-4`,`ERNIE-Speed-8K`,`ERNIE-Speed-128K`,`ERNIE-4.0-8K`, +`ERNIE-4.0-8K-Preview`,`ERNIE-3.5-8K`,`ERNIE-3.5-8K-Preview`,`ERNIE-Lite-8K`,`ERNIE-Tiny-8K`,`ERNIE-Character-8K`, +`ERNIE Speed-AppBuilder` + +## Usage + +import ChatBaiduQianfanExample from "@examples/models/chat/chat_baidu_qianfan.ts"; + +{ChatBaiduQianfanExample} + +## Streaming + +Qianfan's API also supports streaming token responses. The example below demonstrates how to use this feature. + +import ChatBaiduQianfanStreamExample from "@examples/models/chat/chat_stream_baidu_qianfan.ts"; + +{ChatBaiduQianfanStreamExample} diff --git a/docs/core_docs/docs/integrations/chat/baidu_wenxin.mdx b/docs/core_docs/docs/integrations/chat/baidu_wenxin.mdx index 7b5b92d3d455..08148d8ac1bc 100644 --- a/docs/core_docs/docs/integrations/chat/baidu_wenxin.mdx +++ b/docs/core_docs/docs/integrations/chat/baidu_wenxin.mdx @@ -1,11 +1,18 @@ --- sidebar_label: Baidu Wenxin +sidebar_class_name: hidden --- import CodeBlock from "@theme/CodeBlock"; # ChatBaiduWenxin +:::warning +This class has been deprecated. + +Use the [`@langchain/baidu-qianfan`](/docs/integrations/chat/baidu_qianfan/) package instead. +::: + LangChain.js supports Baidu's ERNIE-bot family of models. Here's an example: import IntegrationInstallTooltip from "@mdx_components/integration_install_tooltip.mdx"; diff --git a/docs/core_docs/docs/integrations/text_embedding/baidu_qianfan.mdx b/docs/core_docs/docs/integrations/text_embedding/baidu_qianfan.mdx index 341310c6d9f5..116e75d20239 100644 --- a/docs/core_docs/docs/integrations/text_embedding/baidu_qianfan.mdx +++ b/docs/core_docs/docs/integrations/text_embedding/baidu_qianfan.mdx @@ -1,27 +1,21 @@ ---- -sidebar_class_name: node-only ---- - # Baidu Qianfan The `BaiduQianfanEmbeddings` class uses the Baidu Qianfan API to generate embeddings for a given text. ## Setup -Official Website: https://cloud.baidu.com/doc/WENXINWORKSHOP/s/alj562vvu - An API key is required to use this embedding model. You can get one by registering at https://cloud.baidu.com/doc/WENXINWORKSHOP/s/alj562vvu. Please set the acquired API key as an environment variable named BAIDU_API_KEY, and set your secret key as an environment variable named BAIDU_SECRET_KEY. -Then, you'll need to install the [`@langchain/community`](https://www.npmjs.com/package/@langchain/community) package: +Then, you'll need to install the [`@langchain/baidu-qianfan`](https://www.npmjs.com/package/@langchain/baidu-qianfan) package: import IntegrationInstallTooltip from "@mdx_components/integration_install_tooltip.mdx"; ```bash npm2yarn -npm install @langchain/community +npm install @langchain/baidu-qianfan ``` ## Usage diff --git a/examples/package.json b/examples/package.json index eebdfe237c67..597bfd475cde 100644 --- a/examples/package.json +++ b/examples/package.json @@ -37,6 +37,7 @@ "@langchain/aws": "workspace:*", "@langchain/azure-dynamic-sessions": "workspace:^", "@langchain/azure-openai": "workspace:*", + "@langchain/baidu-qianfan": "workspace:*", "@langchain/cloudflare": "workspace:*", "@langchain/cohere": "workspace:*", "@langchain/community": "workspace:*", diff --git a/examples/src/embeddings/baidu_qianfan.ts b/examples/src/embeddings/baidu_qianfan.ts index 9a85ddc6d7b4..c0e76c04a71d 100644 --- a/examples/src/embeddings/baidu_qianfan.ts +++ b/examples/src/embeddings/baidu_qianfan.ts @@ -1,4 +1,4 @@ -import { BaiduQianfanEmbeddings } from "@langchain/community/embeddings/baidu_qianfan"; +import { BaiduQianfanEmbeddings } from "@langchain/baidu-qianfan"; const embeddings = new BaiduQianfanEmbeddings(); const res = await embeddings.embedQuery( diff --git a/examples/src/models/chat/chat_baidu_qianfan.ts b/examples/src/models/chat/chat_baidu_qianfan.ts new file mode 100644 index 000000000000..9163d1a5bbde --- /dev/null +++ b/examples/src/models/chat/chat_baidu_qianfan.ts @@ -0,0 +1,37 @@ +import { ChatBaiduQianfan } from "@langchain/baidu-qianfan"; +import { HumanMessage } from "@langchain/core/messages"; + +const chat = new ChatBaiduQianfan({ + qianfanAccessKey: process.env.QIANFAN_ACCESS_KEY, + qianfanSecretKey: process.env.QIANFAN_SECRET_KEY, + model: "ERNIE-Bot-turbo", +}); + +const message = new HumanMessage("北京天气"); +const res = await chat.invoke([message]); +console.log({ res }); +/** + { + res: AIMessage { + lc_serializable: true, + lc_kwargs: { + content: '北京天气**多云,气温13~24°C**,微风,空气质量良,预报无持续降水^[2]^。\n' + + '\n' + + '近期天气情况来说,白天最高气温多在30度左右,而夜晚最低气温仅有几度,早晚较凉,需要做好保暖,昼夜温差较大。由于现在正处于雨水节气,此时天气阴沉、多变,时而下起冰雹,时而下起大雨,天色昏暗。冰雹时间不会持续太长,通常都是下冰雹一小段时间后就会停止,天气就会逐渐恢复晴好^[1]^。', + tool_calls: [], + invalid_tool_calls: [], + additional_kwargs: {}, + response_metadata: {} + }, + lc_namespace: [ 'langchain_core', 'messages' ], + content: '北京天气**多云,气温13~24°C**,微风,空气质量良,预报无持续降水^[2]^。\n' + + '\n' + + '近期天气情况来说,白天最高气温多在30度左右,而夜晚最低气温仅有几度,早晚较凉,需要做好保暖,昼夜温差较大。由于现在正处于雨水节气,此时天气阴沉、多变,时而下起冰雹,时而下起大雨,天色昏暗。冰雹时间不会持续太长,通常都是下冰雹一小段时间后就会停止,天气就会逐渐恢复晴好^[1]^。', + name: undefined, + additional_kwargs: {}, + response_metadata: { tokenUsage: [Object] }, + tool_calls: [], + invalid_tool_calls: [] + } + } + */ diff --git a/examples/src/models/chat/chat_stream_baidu_qianfan.ts b/examples/src/models/chat/chat_stream_baidu_qianfan.ts new file mode 100644 index 000000000000..bac05472eda3 --- /dev/null +++ b/examples/src/models/chat/chat_stream_baidu_qianfan.ts @@ -0,0 +1,47 @@ +import { ChatBaiduQianfan } from "@langchain/baidu-qianfan"; +import { HumanMessage } from "@langchain/core/messages"; + +const chat = new ChatBaiduQianfan({ + qianfanAccessKey: process.env.QIANFAN_ACCESS_KEY, + qianfanSecretKey: process.env.QIANFAN_SECRET_KEY, + model: "ERNIE-Bot-turbo", + streaming: true, +}); + +const message = new HumanMessage("等额本金和等额本息有什么区别?"); +const res = await chat.invoke([message]); +console.log({ res }); + +/** + { + res: AIMessage { + lc_serializable: true, + lc_kwargs: { + content: 'undefined等额本金和等额本息是两种常见的贷款还款方式,它们之间的主要区别在于计息方式、每月还款额和利息支出等方面。\n' + + '\n' + + '1. 计息方式:等额本金是一种按月递减的计息方式,每月偿还相同数额的本金和剩余贷款在该月产生的利息。而等额本息则是每月偿还相同金额的利息,根据贷款金额和贷款期限计算月供,本金和利息在每月还款中占的比例逐月变化。\n' + + '2. 每月还款额:由于等额本息每月偿还的利息占每月还款总额的比例逐渐减少,导致每月还款额逐渐增加,而等额本金每月偿还的本金相同,因此每月还款额逐渐减少。\n' + + '3. 利息支出:在贷款期限相同的情况下,等额本金的利息支出相对较少,因为随着本金的减少,剩余贷款产生的利息也相应减少。而等额本息的利息支出则相对较高,因为每月偿还的利息逐渐减少,导致总利息支出相对较高。\n' + + '\n' + + '总之,等额本金和等额本息在贷款期限相同的情况下,等额本金由于利息支出相对较少,更适合于资金充裕、有提前还款打算的借款人;而等额本息每月还款额固定,更适合于每月收入较高的借款人。', + tool_calls: [], + invalid_tool_calls: [], + additional_kwargs: {}, + response_metadata: {} + }, + lc_namespace: [ 'langchain_core', 'messages' ], + content: 'undefined等额本金和等额本息是两种常见的贷款还款方式,它们之间的主要区别在于计息方式、每月还款额和利息支出等方面。\n' + + '\n' + + '1. 计息方式:等额本金是一种按月递减的计息方式,每月偿还相同数额的本金和剩余贷款在该月产生的利息。而等额本息则是每月偿还相同金额的利息,根据贷款金额和贷款期限计算月供,本金和利息在每月还款中占的比例逐月变化。\n' + + '2. 每月还款额:由于等额本息每月偿还的利息占每月还款总额的比例逐渐减少,导致每月还款额逐渐增加,而等额本金每月偿还的本金相同,因此每月还款额逐渐减少。\n' + + '3. 利息支出:在贷款期限相同的情况下,等额本金的利息支出相对较少,因为随着本金的减少,剩余贷款产生的利息也相应减少。而等额本息的利息支出则相对较高,因为每月偿还的利息逐渐减少,导致总利息支出相对较高。\n' + + '\n' + + '总之,等额本金和等额本息在贷款期限相同的情况下,等额本金由于利息支出相对较少,更适合于资金充裕、有提前还款打算的借款人;而等额本息每月还款额固定,更适合于每月收入较高的借款人。', + name: undefined, + additional_kwargs: {}, + response_metadata: { tokenUsage: [Object] }, + tool_calls: [], + invalid_tool_calls: [] + } + } + */ diff --git a/examples/src/models/chat/integration_qianfan.ts b/examples/src/models/chat/integration_qianfan.ts new file mode 100644 index 000000000000..51600c2a6d61 --- /dev/null +++ b/examples/src/models/chat/integration_qianfan.ts @@ -0,0 +1,38 @@ +import { ChatBaiduWenxin } from "@langchain/community/chat_models/baiduwenxin"; +import { HumanMessage } from "@langchain/core/messages"; + +// Default model is ERNIE-Bot-turbo +const ernieTurbo = new ChatBaiduWenxin({ + baiduApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.BAIDU_API_KEY + baiduSecretKey: "YOUR-SECRET-KEY", // In Node.js defaults to process.env.BAIDU_SECRET_KEY +}); + +// Use ERNIE-Bot +const ernie = new ChatBaiduWenxin({ + model: "ERNIE-Bot", // Available models are shown above + temperature: 1, + baiduApiKey: "YOUR-API-KEY", // In Node.js defaults to process.env.BAIDU_API_KEY + baiduSecretKey: "YOUR-SECRET-KEY", // In Node.js defaults to process.env.BAIDU_SECRET_KEY +}); + +const messages = [new HumanMessage("Hello")]; + +let res = await ernieTurbo.invoke(messages); +/* +AIChatMessage { + text: 'Hello! How may I assist you today?', + name: undefined, + additional_kwargs: {} + } +} +*/ + +res = await ernie.invoke(messages); +/* +AIChatMessage { + text: 'Hello! How may I assist you today?', + name: undefined, + additional_kwargs: {} + } +} +*/ diff --git a/libs/langchain-baidu-qianfan/.eslintrc.cjs b/libs/langchain-baidu-qianfan/.eslintrc.cjs new file mode 100644 index 000000000000..42618f39198e --- /dev/null +++ b/libs/langchain-baidu-qianfan/.eslintrc.cjs @@ -0,0 +1,75 @@ +module.exports = { + extends: [ + "airbnb-base", + "eslint:recommended", + "prettier", + "plugin:@typescript-eslint/recommended", + ], + parserOptions: { + ecmaVersion: 12, + parser: "@typescript-eslint/parser", + project: "./tsconfig.json", + sourceType: "module", + }, + plugins: ["@typescript-eslint", "no-instanceof"], + ignorePatterns: [ + ".eslintrc.cjs", + "scripts", + "node_modules", + "dist", + "dist-cjs", + "*.js", + "*.cjs", + "*.d.ts", + ], + rules: { + "no-process-env": 2, + "no-instanceof/no-instanceof": 2, + "@typescript-eslint/explicit-module-boundary-types": 0, + "@typescript-eslint/no-empty-function": 0, + "@typescript-eslint/no-shadow": 0, + "@typescript-eslint/no-empty-interface": 0, + "@typescript-eslint/no-use-before-define": ["error", "nofunc"], + "@typescript-eslint/no-unused-vars": ["warn", { args: "none" }], + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-misused-promises": "error", + "arrow-body-style": 0, + camelcase: 0, + "class-methods-use-this": 0, + "import/extensions": [2, "ignorePackages"], + "import/no-extraneous-dependencies": [ + "error", + { devDependencies: ["**/*.test.ts"] }, + ], + "import/no-unresolved": 0, + "import/prefer-default-export": 0, + "keyword-spacing": "error", + "max-classes-per-file": 0, + "max-len": 0, + "no-await-in-loop": 0, + "no-bitwise": 0, + "no-console": 0, + "no-restricted-syntax": 0, + "no-shadow": 0, + "no-continue": 0, + "no-void": 0, + "no-underscore-dangle": 0, + "no-use-before-define": 0, + "no-useless-constructor": 0, + "no-return-await": 0, + "consistent-return": 0, + "no-else-return": 0, + "func-names": 0, + "no-lonely-if": 0, + "prefer-rest-params": 0, + "new-cap": ["error", { properties: false, capIsNew: false }], + }, + overrides: [ + { + files: ['**/*.test.ts'], + rules: { + '@typescript-eslint/no-unused-vars': 'off' + } + } + ] +}; diff --git a/libs/langchain-baidu-qianfan/.gitignore b/libs/langchain-baidu-qianfan/.gitignore new file mode 100644 index 000000000000..c10034e2f1be --- /dev/null +++ b/libs/langchain-baidu-qianfan/.gitignore @@ -0,0 +1,7 @@ +index.cjs +index.js +index.d.ts +index.d.cts +node_modules +dist +.yarn diff --git a/libs/langchain-baidu-qianfan/.prettierrc b/libs/langchain-baidu-qianfan/.prettierrc new file mode 100644 index 000000000000..ba08ff04f677 --- /dev/null +++ b/libs/langchain-baidu-qianfan/.prettierrc @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": false, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "trailingComma": "es5", + "bracketSpacing": true, + "arrowParens": "always", + "requirePragma": false, + "insertPragma": false, + "proseWrap": "preserve", + "htmlWhitespaceSensitivity": "css", + "vueIndentScriptAndStyle": false, + "endOfLine": "lf" +} diff --git a/libs/langchain-baidu-qianfan/.release-it.json b/libs/langchain-baidu-qianfan/.release-it.json new file mode 100644 index 000000000000..06850ca85be1 --- /dev/null +++ b/libs/langchain-baidu-qianfan/.release-it.json @@ -0,0 +1,12 @@ +{ + "github": { + "release": true, + "autoGenerate": true, + "tokenRef": "GITHUB_TOKEN_RELEASE" + }, + "npm": { + "versionArgs": [ + "--workspaces-update=false" + ] + } +} diff --git a/libs/langchain-baidu-qianfan/LICENSE b/libs/langchain-baidu-qianfan/LICENSE new file mode 100644 index 000000000000..8cd8f501eb49 --- /dev/null +++ b/libs/langchain-baidu-qianfan/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2023 LangChain + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/libs/langchain-baidu-qianfan/README.md b/libs/langchain-baidu-qianfan/README.md new file mode 100644 index 000000000000..681c1d9fbdc0 --- /dev/null +++ b/libs/langchain-baidu-qianfan/README.md @@ -0,0 +1,42 @@ +# @langchain/baidu-qianfan + +This package contains the LangChain.js integrations for Baidu Qianfan via the qianfan/sdk package. + + +## Installation + +```bash npm2yarn +npm install @langchain/baidu-qianfan +``` + +## Chat models + +This package adds support for Qianfan chat model inference. + +Set the necessary environment variable (or pass it in via the constructor): + +```bash +export QIANFAN_AK="" +export QIANFAN_SK="" +export QIANFAN_ACCESS_KEY="" +export QIANFAN_SECRET_KEY="" +``` + +```typescript +import { ChatBaiduQianfan } from "@langchain/baidu-qianfan"; +import { HumanMessage } from "@langchain/core/messages"; + +const chat = new ChatBaiduQianfan({ + model: 'ERNIE-Bot-turbo' +}); +const message = new HumanMessage("北京天气"); + +const res = await chat.invoke([message]); +``` + +```typescript +import { BaiduQianfanEmbeddings } from "@langchain/baidu-qianfan"; + +const embeddings = new BaiduQianfanEmbeddings(); +const res = await embeddings.embedQuery("Introduce the city Beijing"); +``` diff --git a/libs/langchain-baidu-qianfan/example.env b/libs/langchain-baidu-qianfan/example.env new file mode 100644 index 000000000000..22c17f8aa34f --- /dev/null +++ b/libs/langchain-baidu-qianfan/example.env @@ -0,0 +1,14 @@ +# 鉴权相关 +## AK 与 SK 分别对应于千帆平台上 **应用** 的 API Key 与 Secret Key +## 主要用于模型相关 API 鉴权 +## 获取位置:https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application +# QIANFAN_AK="" +# QIANFAN_SK="" + +## Access Key 与 Secret Key 对应于 [百度智能云控制台-安全认证] +## 中的 Access Key 与 Secret Key +## 获取位置:https://console.bce.baidu.com/iam/#/iam/accesslist +## 主要用于非模型相关的、管控类的 API 鉴权 +## 注意与 AK 与 SK 的使用范围进行区分,详细参见文档 +# QIANFAN_ACCESS_KEY="" +# QIANFAN_SECRET_KEY="" \ No newline at end of file diff --git a/libs/langchain-baidu-qianfan/jest.config.cjs b/libs/langchain-baidu-qianfan/jest.config.cjs new file mode 100644 index 000000000000..a06cb3338861 --- /dev/null +++ b/libs/langchain-baidu-qianfan/jest.config.cjs @@ -0,0 +1,20 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: "ts-jest/presets/default-esm", + testEnvironment: "./jest.env.cjs", + modulePathIgnorePatterns: ["dist/", "docs/"], + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, + transform: { + "^.+\\.tsx?$": ["@swc/jest"], + }, + transformIgnorePatterns: [ + "/node_modules/", + "\\.pnp\\.[^\\/]+$", + "./scripts/jest-setup-after-env.js", + ], + setupFiles: ["dotenv/config"], + testTimeout: 20_000, + passWithNoTests: true, +}; diff --git a/libs/langchain-baidu-qianfan/jest.env.cjs b/libs/langchain-baidu-qianfan/jest.env.cjs new file mode 100644 index 000000000000..2ccedccb8672 --- /dev/null +++ b/libs/langchain-baidu-qianfan/jest.env.cjs @@ -0,0 +1,12 @@ +const { TestEnvironment } = require("jest-environment-node"); + +class AdjustedTestEnvironmentToSupportFloat32Array extends TestEnvironment { + constructor(config, context) { + // Make `instanceof Float32Array` return true in tests + // to avoid https://github.com/xenova/transformers.js/issues/57 and https://github.com/jestjs/jest/issues/2549 + super(config, context); + this.global.Float32Array = Float32Array; + } +} + +module.exports = AdjustedTestEnvironmentToSupportFloat32Array; diff --git a/libs/langchain-baidu-qianfan/langchain.config.js b/libs/langchain-baidu-qianfan/langchain.config.js new file mode 100644 index 000000000000..19512b23d29b --- /dev/null +++ b/libs/langchain-baidu-qianfan/langchain.config.js @@ -0,0 +1,21 @@ +import { resolve, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; + +/** + * @param {string} relativePath + * @returns {string} + */ +function abs(relativePath) { + return resolve(dirname(fileURLToPath(import.meta.url)), relativePath); +} + +export const config = { + internals: [/node\:/, /@langchain\/core\//], + entrypoints: { + index: "index", + }, + tsConfigPath: resolve("./tsconfig.json"), + cjsSource: "./dist-cjs", + cjsDestination: "./dist", + abs, +} \ No newline at end of file diff --git a/libs/langchain-baidu-qianfan/package.json b/libs/langchain-baidu-qianfan/package.json new file mode 100644 index 000000000000..6b3bf46efc28 --- /dev/null +++ b/libs/langchain-baidu-qianfan/package.json @@ -0,0 +1,89 @@ +{ + "name": "@langchain/baidu-qianfan", + "version": "0.0.1", + "description": "Baidu Qianfan integration for LangChain.js", + "type": "module", + "engines": { + "node": ">=18" + }, + "main": "./index.js", + "types": "./index.d.ts", + "repository": { + "type": "git", + "url": "git@github.com:langchain-ai/langchainjs.git" + }, + "homepage": "https://github.com/langchain-ai/langchainjs/tree/main/libs/langchain-baidu-qianfan/", + "scripts": { + "build": "yarn turbo:command build:internal --filter=@langchain/baidu-qianfan", + "build:internal": "yarn lc-build:v2 --create-entrypoints --pre --tree-shaking", + "lint:eslint": "NODE_OPTIONS=--max-old-space-size=4096 eslint --cache --ext .ts,.js src/", + "lint:dpdm": "dpdm --exit-code circular:1 --no-warning --no-tree src/*.ts src/**/*.ts", + "lint": "yarn lint:eslint && yarn lint:dpdm", + "lint:fix": "yarn lint:eslint --fix && yarn lint:dpdm", + "clean": "rm -rf .turbo dist/", + "prepack": "yarn build", + "test": "NODE_OPTIONS=--experimental-vm-modules jest --testPathIgnorePatterns=\\.int\\.test.ts --testTimeout 30000 --maxWorkers=50%", + "test:int": "NODE_OPTIONS=--experimental-vm-modules jest --testPathPattern=\\.int\\.test.ts --testTimeout 100000 --maxWorkers=50%", + "test:embeddings": "NODE_OPTIONS=--experimental-vm-modules jest --testPathPattern=\\.embeddings\\.test.ts --testTimeout 100000 --maxWorkers=50%", + "format": "prettier --config .prettierrc --write \"src\"", + "format:check": "prettier --config .prettierrc --check \"src\"" + }, + "author": "LangChain", + "license": "MIT", + "dependencies": { + "@baiducloud/qianfan": "0.1.0", + "@langchain/core": ">0.1.56 <0.3.0", + "@langchain/openai": "~0.1.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.5" + }, + "devDependencies": { + "@jest/globals": "^29.5.0", + "@langchain/openai": "~0.1.0", + "@langchain/scripts": "~0.0.14", + "@swc/core": "^1.3.90", + "@swc/jest": "^0.2.29", + "@tsconfig/recommended": "^1.0.3", + "@types/uuid": "^9", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "dotenv": "^16.3.1", + "dpdm": "^3.12.0", + "eslint": "^8.33.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-no-instanceof": "^1.0.1", + "eslint-plugin-prettier": "^4.2.1", + "jest": "^29.5.0", + "jest-environment-node": "^29.6.4", + "langchain": "0.2.5", + "prettier": "^2.8.3", + "release-it": "^15.10.1", + "rollup": "^4.5.2", + "ts-jest": "^29.1.0", + "typescript": "<5.2.0" + }, + "publishConfig": { + "access": "public" + }, + "exports": { + ".": { + "types": { + "import": "./index.d.ts", + "require": "./index.d.cts", + "default": "./index.d.ts" + }, + "import": "./index.js", + "require": "./index.cjs" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist/", + "index.cjs", + "index.js", + "index.d.ts", + "index.d.cts" + ] +} diff --git a/libs/langchain-baidu-qianfan/scripts/jest-setup-after-env.js b/libs/langchain-baidu-qianfan/scripts/jest-setup-after-env.js new file mode 100644 index 000000000000..778cf7437a20 --- /dev/null +++ b/libs/langchain-baidu-qianfan/scripts/jest-setup-after-env.js @@ -0,0 +1,3 @@ +import { awaitAllCallbacks } from "@langchain/core/callbacks/promises"; + +afterAll(awaitAllCallbacks); diff --git a/libs/langchain-baidu-qianfan/src/chat_models.ts b/libs/langchain-baidu-qianfan/src/chat_models.ts new file mode 100644 index 000000000000..022535ed28e9 --- /dev/null +++ b/libs/langchain-baidu-qianfan/src/chat_models.ts @@ -0,0 +1,526 @@ +import { + BaseChatModel, + type BaseChatModelParams, +} from "@langchain/core/language_models/chat_models"; +import { + AIMessage, + AIMessageChunk, + BaseMessage, + ChatMessage, +} from "@langchain/core/messages"; +import { + ChatGeneration, + ChatGenerationChunk, + ChatResult, +} from "@langchain/core/outputs"; +import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager"; +import { getEnvironmentVariable } from "@langchain/core/utils/env"; +import { convertEventStreamToIterableReadableDataStream } from "@langchain/core/utils/event_source_parse"; +import { ChatCompletion } from "@baiducloud/qianfan"; + +import { isValidModel } from "./utils.js"; + +/** + * Type representing the role of a message in the Qianfan chat model. + */ +export type QianfanRole = "assistant" | "user"; + +/** + * Interface representing a message in the Qianfan chat model. + */ +interface Qianfan { + role: QianfanRole; + content: string; +} + +/** + * Interface representing the usage of tokens in a chat completion. + */ +interface TokenUsage { + completionTokens?: number; + promptTokens?: number; + totalTokens?: number; +} + +/** + * Interface representing a request for a chat completion. + */ +interface ChatCompletionRequest { + messages: Qianfan[]; + stream?: boolean; + user_id?: string; + temperature?: number; + top_p?: number; + penalty_score?: number; + system?: string; +} + +/** + * Interface representing a response from a chat completion. + */ +interface ChatCompletionResponse { + id: string; + object: string; + created: number; + result: string; + need_clear_history: boolean; + usage: TokenUsage; +} + +/** + * Interface defining the input to the ChatBaiduQianfan class. + */ +declare interface BaiduQianfanChatInput { + /** + * Model name to use. Available options are: ERNIE-Bot, ERNIE-Bot-turbo, ERNIE-Bot-4 + * Alias for `model` + * @default "ERNIE-Bot-turbo" + */ + modelName: string; + /** Model name to use. Available options are: ERNIE-Bot, ERNIE-Bot-turbo, ERNIE-Bot-4 + * @default "ERNIE-Bot-turbo" + */ + model: string; + + /** Whether to stream the results or not. Defaults to false. */ + streaming?: boolean; + + /** Messages to pass as a prefix to the prompt */ + prefixMessages?: Qianfan[]; + + /** + * ID of the end-user who made requests. + */ + userId?: string; + + /** + * Access key to use when making requests by Qianfan SDK. Defaults to the value of + * `QIANFAN_KEY` environment variable. + */ + qianfanAK?: string; + + /** + * Secret key to use when making requests by Qianfan SDK. Defaults to the value of + * `QIANFAN_KEY` environment variable. + */ + qianfanSK?: string; + + /** + * Access key to use when making requests by Qianfan SDK with auth. Defaults to the value of + * `QIANFAN_ACCESS_KEY` environment variable. + */ + qianfanAccessKey?: string; + + /** + * Secret key to use when making requests by Qianfan SDK with auth. Defaults to the value of + * `QIANFAN_SECRET_KEY` environment variable. + */ + qianfanSecretKey?: string; + + /** Amount of randomness injected into the response. Ranges + * from 0 to 1 (0 is not included). Use temp closer to 0 for analytical / + * multiple choice, and temp closer to 1 for creative + * and generative tasks. Defaults to 0.95. + */ + temperature?: number; + + /** Total probability mass of tokens to consider at each step. Range + * from 0 to 1.0. Defaults to 0.8. + */ + topP?: number; + + /** Penalizes repeated tokens according to frequency. Range + * from 1.0 to 2.0. Defaults to 1.0. + */ + penaltyScore?: number; +} + +/** + * Function that extracts the custom role of a generic chat message. + * @param message Chat message from which to extract the custom role. + * @returns The custom role of the chat message. + */ +function extractGenericMessageCustomRole(message: ChatMessage) { + if (message.role !== "assistant" && message.role !== "user") { + console.warn(`Unknown message role: ${message.role}`); + } + + return message.role as QianfanRole; +} + +/** + * Function that converts a base message to a Qianfan message role. + * @param message Base message to convert. + * @returns The Qianfan message role. + */ +function messageToQianfanRole(message: BaseMessage): QianfanRole { + const type = message._getType(); + switch (type) { + case "ai": + return "assistant"; + case "human": + return "user"; + case "system": + throw new Error("System messages should not be here"); + case "function": + throw new Error("Function messages not supported"); + case "generic": { + if (!ChatMessage.isInstance(message)) + throw new Error("Invalid generic chat message"); + return extractGenericMessageCustomRole(message); + } + default: + throw new Error(`Unknown message type: ${type}`); + } +} + +/** + * Wrapper around Baidu ERNIE large language models that use the Chat endpoint. + * + * To use you should have the `QIANFAN_AK` and `QIANFAN_SK` + * environment variable set. + * + * @augments BaseLLM + * @augments BaiduERNIEInput + * ``` + */ +export class ChatBaiduQianfan + extends BaseChatModel + implements BaiduQianfanChatInput +{ + static lc_name() { + return "ChatBaiduQianfan"; + } + + get callKeys(): string[] { + return ["stop", "signal", "options"]; + } + + get lc_secrets(): { [key: string]: string } | undefined { + return { + qianfanAK: "QIANFAN_AK", + qianfanSK: "QIANFAN_SK", + qianfanAccessKey: "QIANFAN_ACCESS_KEY", + qianfanSecretKey: "QIANFAN_SECRET_KEY", + }; + } + + get lc_aliases(): { [key: string]: string } | undefined { + return undefined; + } + + lc_serializable = true; + + streaming = false; + + prefixMessages?: Qianfan[]; + + userId?: string; + + modelName = "ERNIE-Bot-turbo"; + + model = "ERNIE-Bot-turbo"; + + temperature?: number | undefined; + + topP?: number | undefined; + + penaltyScore?: number | undefined; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + client?: any; + + qianfanAK?: string; + + qianfanSK?: string; + + qianfanAccessKey?: string; + + qianfanSecretKey?: string; + + constructor(fields?: Partial & BaseChatModelParams) { + super(fields ?? {}); + + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; + + if (!isValidModel(this.model)) { + throw new Error(`Invalid model name: ${this.model}`); + } + + this.qianfanAK = fields?.qianfanAK ?? getEnvironmentVariable("QIANFAN_AK"); + + this.qianfanSK = fields?.qianfanSK ?? getEnvironmentVariable("QIANFAN_SK"); + + this.qianfanAccessKey = + fields?.qianfanAccessKey ?? getEnvironmentVariable("QIANFAN_ACCESS_KEY"); + + this.qianfanSecretKey = + fields?.qianfanSecretKey ?? getEnvironmentVariable("QIANFAN_SECRET_KEY"); + + // 优先使用安全认证AK/SK鉴权 + if (this.qianfanAccessKey && this.qianfanSecretKey) { + this.client = new ChatCompletion({ + QIANFAN_ACCESS_KEY: this.qianfanAccessKey, + QIANFAN_SECRET_KEY: this.qianfanSecretKey, + }); + } else if (this.qianfanAK && this.qianfanSK) { + this.client = new ChatCompletion({ + QIANFAN_AK: this.qianfanAK, + QIANFAN_SK: this.qianfanSK, + }); + } else { + throw new Error("Please provide AK/SK"); + } + + this.streaming = fields?.streaming ?? this.streaming; + this.prefixMessages = fields?.prefixMessages ?? this.prefixMessages; + this.userId = fields?.userId ?? this.userId; + this.temperature = fields?.temperature ?? this.temperature; + this.topP = fields?.topP ?? this.topP; + this.penaltyScore = fields?.penaltyScore ?? this.penaltyScore; + } + + /** + * Get the parameters used to invoke the model + */ + invocationParams(): Omit { + return { + stream: this.streaming, + user_id: this.userId, + temperature: this.temperature, + top_p: this.topP, + penalty_score: this.penaltyScore, + }; + } + + /** + * Get the identifying parameters for the model + */ + identifyingParams() { + return { + model_name: this.model, + ...this.invocationParams(), + }; + } + + private _ensureMessages(messages: BaseMessage[]): Qianfan[] { + return messages.map((message) => ({ + role: messageToQianfanRole(message), + content: message.text, + })); + } + + /** @ignore */ + async _generate( + messages: BaseMessage[], + _options?: this["ParsedCallOptions"], + runManager?: CallbackManagerForLLMRun + ): Promise { + const tokenUsage: TokenUsage = {}; + + const params = this.invocationParams(); + + // Qianfan requires the system message to be put in the params, not messages array + const systemMessage = messages.find( + (message) => message._getType() === "system" + ); + if (systemMessage) { + // eslint-disable-next-line no-param-reassign + messages = messages.filter((message) => message !== systemMessage); + params.system = systemMessage.text; + } + const messagesMapped = this._ensureMessages(messages); + + const data = params.stream + ? await new Promise((resolve, reject) => { + let rejected = false; + this.completionWithRetry( + { + ...params, + messages: messagesMapped, + }, + true, + (event) => { + resolve(event.data); + // eslint-disable-next-line no-void + void runManager?.handleLLMNewToken(event.data ?? ""); + } + ).catch((error) => { + if (!rejected) { + rejected = true; + reject(error); + } + }); + }) + : await this.completionWithRetry( + { + ...params, + messages: messagesMapped, + }, + false + ).then((data) => { + if (data?.error_code) { + throw new Error(data?.error_msg); + } + return data; + }); + + const { + completion_tokens: completionTokens, + prompt_tokens: promptTokens, + total_tokens: totalTokens, + } = data.usage ?? {}; + + if (completionTokens) { + tokenUsage.completionTokens = + (tokenUsage.completionTokens ?? 0) + completionTokens; + } + + if (promptTokens) { + tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens; + } + + if (totalTokens) { + tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens; + } + + const generations: ChatGeneration[] = []; + const text = data.result ?? ""; + generations.push({ + text, + message: new AIMessage(text), + }); + return { + generations, + llmOutput: { tokenUsage }, + }; + } + + /** @ignore */ + async completionWithRetry( + request: ChatCompletionRequest, + stream: boolean, + onmessage?: (event: MessageEvent) => void + ) { + const makeCompletionRequest = async () => { + console.log(request); + const response = await this.client.chat( + { + messages: request.messages, + stream, + }, + this.model + ); + + if (!stream) { + return response; + } else { + let streamResponse = {} as { + id: string; + object: string; + created: number; + sentence_id?: number; + result: string; + need_clear_history: boolean; + usage: TokenUsage; + }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + for await (const message of response as AsyncIterableIterator) { + // 返回结果 + if (!streamResponse) { + streamResponse = { + id: message.id, + object: message.object, + created: message.created, + result: message.result, + need_clear_history: message.need_clear_history, + usage: message.usage, + }; + } else { + streamResponse.result += message.result; + streamResponse.created = message.created; + streamResponse.need_clear_history = message.need_clear_history; + streamResponse.usage = message.usage; + } + } + const event = new MessageEvent("message", { + data: streamResponse, + }); + onmessage?.(event); + } + }; + + return this.caller.call(makeCompletionRequest); + } + + private async createStream(request: ChatCompletionRequest) { + const response = await this.client.chat( + { + messages: request.messages, + stream: true, + }, + this.model + ); + + return convertEventStreamToIterableReadableDataStream(response); + } + + private _deserialize(json: string) { + try { + return JSON.parse(json); + } catch (e) { + console.warn(`Received a non-JSON parseable chunk: ${json}`); + } + } + + async *_streamResponseChunks( + messages: BaseMessage[], + _options?: this["ParsedCallOptions"], + runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + const parameters = { + ...this.invocationParams(), + stream: true, + }; + + // Qianfan requires the system message to be put in the params, not messages array + const systemMessage = messages.find( + (message) => message._getType() === "system" + ); + if (systemMessage) { + // eslint-disable-next-line no-param-reassign + messages = messages.filter((message) => message !== systemMessage); + parameters.system = systemMessage.text; + } + const messagesMapped = this._ensureMessages(messages); + + const stream = await this.caller.call(async () => + this.createStream({ + ...parameters, + messages: messagesMapped, + }) + ); + + for await (const chunk of stream) { + const deserializedChunk = this._deserialize(chunk); + const { result, is_end, id } = deserializedChunk; + yield new ChatGenerationChunk({ + text: result, + message: new AIMessageChunk({ content: result }), + generationInfo: is_end + ? { + is_end, + request_id: id, + usage: chunk.usage, + } + : undefined, + }); + await runManager?.handleLLMNewToken(result); + } + } + + _llmType() { + return "baiduqianfan"; + } +} diff --git a/libs/langchain-baidu-qianfan/src/embeddings.ts b/libs/langchain-baidu-qianfan/src/embeddings.ts new file mode 100644 index 000000000000..fa87c1472cb6 --- /dev/null +++ b/libs/langchain-baidu-qianfan/src/embeddings.ts @@ -0,0 +1,216 @@ +import { Embeddings, type EmbeddingsParams } from "@langchain/core/embeddings"; +import { chunkArray } from "@langchain/core/utils/chunk_array"; +import { getEnvironmentVariable } from "@langchain/core/utils/env"; +import { Embedding } from "@baiducloud/qianfan"; + +export interface BaiduQianfanEmbeddingsParams extends EmbeddingsParams { + /** Model name to use */ + modelName: "Embedding-V1" | "bge-large-zh" | "bge-large-en" | "tao-8k"; + + /** + * Timeout to use when making requests to BaiduQianfan. + */ + timeout?: number; + + /** + * The maximum number of characters allowed for embedding in a single request varies by model: + * - Embedding-V1 model: up to 1000 characters + * - bge-large-zh model: up to 2000 characters + * - bge-large-en model: up to 2000 characters + * - tao-8k model: up to 28000 characters + * + * Note: These limits are model-specific and should be adhered to for optimal performance. + */ + batchSize?: number; + + /** + * Whether to strip new lines from the input text. + */ + stripNewLines?: boolean; +} + +interface EmbeddingCreateParams { + input: string[]; +} + +interface EmbeddingResponse { + data: { object: "embedding"; index: number; embedding: number[] }[]; + + usage: { + prompt_tokens: number; + total_tokens: number; + }; + + id: string; +} + +interface EmbeddingErrorResponse { + error_code: number | string; + error_msg: string; +} + +export class BaiduQianfanEmbeddings + extends Embeddings + implements BaiduQianfanEmbeddingsParams +{ + modelName: BaiduQianfanEmbeddingsParams["modelName"] = "Embedding-V1"; + + batchSize = 16; + + stripNewLines = true; + + qianfanAK: string | undefined; + + qianfanSK: string | undefined; + + qianfanAccessKey: string | undefined; + + qianfanSecretKey: string | undefined; + + accessToken: string; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + embeddings: any; + + constructor( + fields?: Partial & { + verbose?: boolean; + qianfanAK?: string; + qianfanSK?: string; + qianfanAccessKey?: string; + qianfanSecretKey?: string; + } + ) { + const fieldsWithDefaults = { maxConcurrency: 2, ...fields }; + super(fieldsWithDefaults); + + this.qianfanAK = + fieldsWithDefaults?.qianfanAK ?? getEnvironmentVariable("QIANFAN_AK"); + + this.qianfanSK = + fieldsWithDefaults?.qianfanSK ?? getEnvironmentVariable("QIANFAN_SK"); + + this.qianfanAccessKey = + fieldsWithDefaults?.qianfanAccessKey ?? + getEnvironmentVariable("QIANFAN_ACCESS_KEY"); + + this.qianfanSecretKey = + fieldsWithDefaults?.qianfanSecretKey ?? + getEnvironmentVariable("QIANFAN_SECRET_KEY"); + + // 优先使用安全认证AK/SK鉴权 + if (this.qianfanAccessKey && this.qianfanSecretKey) { + this.embeddings = new Embedding({ + QIANFAN_ACCESS_KEY: this.qianfanAccessKey, + QIANFAN_SECRET_KEY: this.qianfanSecretKey, + }); + } else if (this.qianfanAK && this.qianfanSK) { + this.embeddings = new Embedding({ + QIANFAN_AK: this.qianfanAK, + QIANFAN_SK: this.qianfanSK, + }); + } else { + throw new Error("Please provide AK/SK"); + } + + this.modelName = fieldsWithDefaults?.modelName ?? this.modelName; + + if (this.modelName === "tao-8k") { + if (fieldsWithDefaults?.batchSize && fieldsWithDefaults.batchSize !== 1) { + throw new Error( + "tao-8k model supports only a batchSize of 1. Please adjust your batchSize accordingly" + ); + } + this.batchSize = 1; + } else { + this.batchSize = fieldsWithDefaults?.batchSize ?? this.batchSize; + } + + this.stripNewLines = + fieldsWithDefaults?.stripNewLines ?? this.stripNewLines; + } + + /** + * Method to generate embeddings for an array of documents. Splits the + * documents into batches and makes requests to the BaiduQianFan API to generate + * embeddings. + * @param texts Array of documents to generate embeddings for. + * @returns Promise that resolves to a 2D array of embeddings for each document. + */ + async embedDocuments(texts: string[]): Promise { + const batches = chunkArray( + this.stripNewLines ? texts.map((t) => t.replace(/\n/g, " ")) : texts, + this.batchSize + ); + + const batchRequests = batches.map((batch) => { + const params = this.getParams(batch); + + return this.embeddingWithRetry(params); + }); + + const batchResponses = await Promise.all(batchRequests); + + const embeddings: number[][] = []; + + for (let i = 0; i < batchResponses.length; i += 1) { + const batch = batches[i]; + const batchResponse = batchResponses[i] || []; + for (let j = 0; j < batch.length; j += 1) { + embeddings.push(batchResponse[j]); + } + } + + return embeddings; + } + + /** + * Method to generate an embedding for a single document. Calls the + * embeddingWithRetry method with the document as the input. + * @param text Document to generate an embedding for. + * @returns Promise that resolves to an embedding for the document. + */ + async embedQuery(text: string): Promise { + const params = this.getParams([ + this.stripNewLines ? text.replace(/\n/g, " ") : text, + ]); + + const embeddings = (await this.embeddingWithRetry(params)) || [[]]; + return embeddings[0]; + } + + /** + * Method to generate an embedding params. + * @param texts Array of documents to generate embeddings for. + * @returns an embedding params. + */ + private getParams( + texts: EmbeddingCreateParams["input"] + ): EmbeddingCreateParams { + return { + input: texts, + }; + } + + /** + * Private method to make a request to the BaiduAI API to generate + * embeddings. Handles the retry logic and returns the response from the + * API. + * @param request Request to send to the BaiduAI API. + * @returns Promise that resolves to the response from the API. + */ + private async embeddingWithRetry(body: EmbeddingCreateParams) { + const embeddingData: EmbeddingResponse | EmbeddingErrorResponse = + await this.embeddings.embedding(body, this.modelName); + + if ("error_code" in embeddingData && embeddingData.error_code) { + throw new Error( + `${embeddingData.error_code}: ${embeddingData.error_msg}` + ); + } + + return (embeddingData as EmbeddingResponse).data.map( + ({ embedding }) => embedding + ); + } +} diff --git a/libs/langchain-baidu-qianfan/src/index.ts b/libs/langchain-baidu-qianfan/src/index.ts new file mode 100644 index 000000000000..e080d1245956 --- /dev/null +++ b/libs/langchain-baidu-qianfan/src/index.ts @@ -0,0 +1,2 @@ +export * from "./chat_models.js"; +export * from "./embeddings.js"; diff --git a/libs/langchain-baidu-qianfan/src/tests/chat_models.int.test.ts b/libs/langchain-baidu-qianfan/src/tests/chat_models.int.test.ts new file mode 100644 index 000000000000..863e1a33afb3 --- /dev/null +++ b/libs/langchain-baidu-qianfan/src/tests/chat_models.int.test.ts @@ -0,0 +1,25 @@ +import { test } from "@jest/globals"; + +import { HumanMessage } from "@langchain/core/messages"; +import { ChatBaiduQianfan } from "../chat_models.js"; + +test("invoke", async () => { + const chat = new ChatBaiduQianfan({ + model: "ERNIE-Bot-turbo", + }); + const message = new HumanMessage("北京天气"); + const res = await chat.invoke([message]); + console.log({ res }); + expect(res.content.length).toBeGreaterThan(10); +}); + +test("invokeWithStream", async () => { + const chat = new ChatBaiduQianfan({ + model: "ERNIE-Bot-turbo", + streaming: true, + }); + const message = new HumanMessage("等额本金和等额本息有什么区别?"); + const res = await chat.invoke([message]); + console.log({ res }); + expect(res.content.length).toBeGreaterThan(10); +}); diff --git a/libs/langchain-baidu-qianfan/src/tests/embeddings.int.test.ts b/libs/langchain-baidu-qianfan/src/tests/embeddings.int.test.ts new file mode 100644 index 000000000000..8ee42f508521 --- /dev/null +++ b/libs/langchain-baidu-qianfan/src/tests/embeddings.int.test.ts @@ -0,0 +1,16 @@ +import { test } from "@jest/globals"; +import { BaiduQianfanEmbeddings } from "../embeddings.js"; + +test("embedQuery", async () => { + const embeddings = new BaiduQianfanEmbeddings(); + const res = await embeddings.embedQuery("Introduce the city Beijing"); + console.log({ res }); + expect(res.length).toBeGreaterThan(10); +}); + +test("embedDocuments", async () => { + const embeddings = new BaiduQianfanEmbeddings(); + const res = await embeddings.embedDocuments(["Hello world", "Bye bye"]); + console.log({ res }); + expect(res.length).toBe(2); +}); diff --git a/libs/langchain-baidu-qianfan/src/utils.ts b/libs/langchain-baidu-qianfan/src/utils.ts new file mode 100644 index 000000000000..494ef12c75d7 --- /dev/null +++ b/libs/langchain-baidu-qianfan/src/utils.ts @@ -0,0 +1,73 @@ +/** + * 对话请求公共服务模型列表 + */ +export type ChatModel = + | "ERNIE-4.0-8K" + | "ERNIE-3.5-8K" + | "ERNIE-3.5-8K-0205" + | "ERNIE-3.5-8K-1222" + | "ERNIE-3.5-4K-0205" + | "ERNIE-Speed-128K" + | "ERNIE-Lite-8K-0922" + | "ERNIE-Lite-8K-0308" + | "ERNIE Speed-AppBuilder" + | "Gemma-7B-it" + | "Mixtral-8x7B-Instruct" + | "ERNIE-Bot-turbo" + | "ERNIE-Bot" + | "ERNIE-Bot-4" + | "ERNIE-Bot-8k" + | "ERNIE-Speed" + | "EB-turbo-AppBuilder" + | "BLOOMZ-7B" + | "Llama-2-7b-chat" + | "Llama-2-13b-chat" + | "Llama-2-70b-chat" + | "Qianfan-BLOOMZ-7B-compressed" + | "Qianfan-Chinese-Llama-2-7B" + | "ChatGLM2-6B-32K" + | "AquilaChat-7B" + | "XuanYuan-70B-Chat-4bit" + | "Qianfan-Chinese-Llama-2-13B" + | "ChatLaw" + | "SQLCoder-7B" + | "CodeLlama-7b-Instruct" + | "Yi-34B-Chat"; + +export const CHAT_MODEL = [ + "ERNIE-4.0-8K", + "ERNIE-3.5-8K", + "ERNIE-3.5-8K-0205", + "ERNIE-3.5-8K-1222", + "ERNIE-3.5-4K-0205", + "ERNIE-Speed-128K", + "ERNIE-Lite-8K-0922", + "ERNIE-Lite-8K-0308", + "ERNIE Speed-AppBuilder", + "Gemma-7B-it", + "Mixtral-8x7B-Instruct", + "ERNIE-Bot-turbo", + "ERNIE-Bot", + "ERNIE-Bot-4", + "ERNIE-Bot-8k", + "ERNIE-Speed", + "EB-turbo-AppBuilder", + "BLOOMZ-7B", + "Llama-2-7b-chat", + "Llama-2-13b-chat", + "Llama-2-70b-chat", + "Qianfan-BLOOMZ-7B-compressed", + "Qianfan-Chinese-Llama-2-7B", + "ChatGLM2-6B-32K", + "AquilaChat-7B", + "XuanYuan-70B-Chat-4bit", + "Qianfan-Chinese-Llama-2-13B", + "ChatLaw", + "SQLCoder-7B", + "CodeLlama-7b-Instruct", + "Yi-34B-Chat", +]; + +export const isValidModel = (modelName: string): boolean => { + return CHAT_MODEL.includes(modelName); +}; diff --git a/libs/langchain-baidu-qianfan/tsconfig.cjs.json b/libs/langchain-baidu-qianfan/tsconfig.cjs.json new file mode 100644 index 000000000000..3b7026ea406c --- /dev/null +++ b/libs/langchain-baidu-qianfan/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "declaration": false + }, + "exclude": ["node_modules", "dist", "docs", "**/tests"] +} diff --git a/libs/langchain-baidu-qianfan/tsconfig.json b/libs/langchain-baidu-qianfan/tsconfig.json new file mode 100644 index 000000000000..bc85d83b6229 --- /dev/null +++ b/libs/langchain-baidu-qianfan/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "@tsconfig/recommended", + "compilerOptions": { + "outDir": "../dist", + "rootDir": "./src", + "target": "ES2021", + "lib": ["ES2021", "ES2022.Object", "DOM"], + "module": "ES2020", + "moduleResolution": "nodenext", + "esModuleInterop": true, + "declaration": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "useDefineForClassFields": true, + "strictPropertyInitialization": false, + "allowJs": true, + "strict": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "docs"] +} diff --git a/libs/langchain-baidu-qianfan/turbo.json b/libs/langchain-baidu-qianfan/turbo.json new file mode 100644 index 000000000000..d024cee15c81 --- /dev/null +++ b/libs/langchain-baidu-qianfan/turbo.json @@ -0,0 +1,11 @@ +{ + "extends": ["//"], + "pipeline": { + "build": { + "outputs": ["**/dist/**"] + }, + "build:internal": { + "dependsOn": ["^build:internal"] + } + } +} diff --git a/libs/langchain-community/src/chat_models/baiduwenxin.ts b/libs/langchain-community/src/chat_models/baiduwenxin.ts index 70924000401d..9cac9fe24c7f 100644 --- a/libs/langchain-community/src/chat_models/baiduwenxin.ts +++ b/libs/langchain-community/src/chat_models/baiduwenxin.ts @@ -173,6 +173,7 @@ function messageToWenxinRole(message: BaseMessage): WenxinMessageRole { } /** + * @deprecated Install and import from @langchain/baidu-qianfan instead. * Wrapper around Baidu ERNIE large language models that use the Chat endpoint. * * To use you should have the `BAIDU_API_KEY` and `BAIDU_SECRET_KEY` diff --git a/libs/langchain-community/src/embeddings/baidu_qianfan.ts b/libs/langchain-community/src/embeddings/baidu_qianfan.ts index 1c5d74bd83a1..25a73b7d6805 100644 --- a/libs/langchain-community/src/embeddings/baidu_qianfan.ts +++ b/libs/langchain-community/src/embeddings/baidu_qianfan.ts @@ -2,6 +2,7 @@ import { Embeddings, type EmbeddingsParams } from "@langchain/core/embeddings"; import { chunkArray } from "@langchain/core/utils/chunk_array"; import { getEnvironmentVariable } from "@langchain/core/utils/env"; +/** @deprecated Install and import from @langchain/baidu-qianfan instead. */ export interface BaiduQianfanEmbeddingsParams extends EmbeddingsParams { /** Model name to use */ modelName: "embedding-v1" | "bge_large_zh" | "bge-large-en" | "tao-8k"; diff --git a/yarn.lock b/yarn.lock index 84fb05aa3d2a..b0165b0f3afb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5858,6 +5858,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" + dependencies: + "@babel/highlight": ^7.24.7 + picocolors: ^1.0.0 + checksum: 830e62cd38775fdf84d612544251ce773d544a8e63df667728cc9e0126eeef14c6ebda79be0f0bc307e8318316b7f58c27ce86702e0a1f5c321d842eb38ffda4 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.20.5": version: 7.21.0 resolution: "@babel/compat-data@npm:7.21.0" @@ -5980,6 +5990,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/generator@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^2.5.1 + checksum: 0ff31a73b15429f1287e4d57b439bba4a266f8c673bb445fe313b82f6d110f586776997eb723a777cd7adad9d340edd162aea4973a90112c5d0cfcaf6686844b + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -5989,6 +6011,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 6178566099a6a0657db7a7fa601a54fb4731ca0b8614fbdccfd8e523c210c13963649bc8fdfd53ce7dd14d05e3dda2fb22dea5b30113c488b9eb1a906d60212e + languageName: node + linkType: hard + "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" @@ -6087,6 +6118,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-environment-visitor@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-environment-visitor@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 079d86e65701b29ebc10baf6ed548d17c19b808a07aa6885cc141b690a78581b180ee92b580d755361dc3b16adf975b2d2058b8ce6c86675fcaf43cf22f2f7c6 + languageName: node + linkType: hard + "@babel/helper-function-name@npm:^7.21.0": version: 7.21.0 resolution: "@babel/helper-function-name@npm:7.21.0" @@ -6107,6 +6147,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-function-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-function-name@npm:7.24.7" + dependencies: + "@babel/template": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 142ee08922074dfdc0ff358e09ef9f07adf3671ab6eef4fca74dcf7a551f1a43717e7efa358c9e28d7eea84c28d7f177b7a58c70452fc312ae3b1893c5dab2a4 + languageName: node + linkType: hard + "@babel/helper-hoist-variables@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-hoist-variables@npm:7.18.6" @@ -6125,6 +6175,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-hoist-variables@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-hoist-variables@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 6cfdcf2289cd12185dcdbdf2435fa8d3447b797ac75851166de9fc8503e2fd0021db6baf8dfbecad3753e582c08e6a3f805c8d00cbed756060a877d705bd8d8d + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.22.15": version: 7.23.0 resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" @@ -6152,6 +6211,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-imports@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 8ac15d96d262b8940bc469052a048e06430bba1296369be695fabdf6799f201dd0b00151762b56012a218464e706bc033f27c07f6cec20c6f8f5fd6543c67054 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.23.0": version: 7.23.0 resolution: "@babel/helper-module-transforms@npm:7.23.0" @@ -6213,6 +6282,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-plugin-utils@npm:7.24.7" + checksum: 81f2a15751d892e4a8fce25390f973363a5b27596167861d2d6eab0f61856eb2ba389b031a9f19f669c0bd4dd601185828d3cebafd25431be7a1696f2ce3ef68 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.22.20, @babel/helper-remap-async-to-generator@npm:^7.22.5": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -6284,6 +6360,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-split-export-declaration@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-split-export-declaration@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: e3ddc91273e5da67c6953f4aa34154d005a00791dc7afa6f41894e768748540f6ebcac5d16e72541aea0c89bee4b89b4da6a3d65972a0ea8bfd2352eda5b7e22 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.19.4": version: 7.19.4 resolution: "@babel/helper-string-parser@npm:7.19.4" @@ -6298,6 +6383,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-string-parser@npm:7.24.7" + checksum: 09568193044a578743dd44bf7397940c27ea693f9812d24acb700890636b376847a611cdd0393a928544e79d7ad5b8b916bd8e6e772bc8a10c48a647a96e7b1a + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": version: 7.19.1 resolution: "@babel/helper-validator-identifier@npm:7.19.1" @@ -6312,6 +6404,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-identifier@npm:7.24.7" + checksum: 6799ab117cefc0ecd35cd0b40ead320c621a298ecac88686a14cffceaac89d80cdb3c178f969861bf5fa5e4f766648f9161ea0752ecfe080d8e89e3147270257 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.18.6": version: 7.21.0 resolution: "@babel/helper-validator-option@npm:7.21.0" @@ -6326,6 +6425,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-option@npm:7.24.7" + checksum: 9689166bf3f777dd424c026841c8cd651e41b21242dbfd4569a53086179a3e744c8eddd56e9d10b54142270141c91581b53af0d7c00c82d552d2540e2a919f7e + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-wrap-function@npm:7.22.20" @@ -6381,6 +6487,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/highlight@npm:7.24.7" + dependencies: + "@babel/helper-validator-identifier": ^7.24.7 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.0, @babel/parser@npm:^7.21.2": version: 7.21.2 resolution: "@babel/parser@npm:7.21.2" @@ -6399,6 +6517,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/parser@npm:7.24.7" + bin: + parser: ./bin/babel-parser.js + checksum: fc9d2c4c8712f89672edc55c0dc5cf640dcec715b56480f111f85c2bc1d507e251596e4110d65796690a96ac37a4b60432af90b3e97bb47e69d4ef83872dbbd6 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.15": version: 7.22.15 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.15" @@ -6577,6 +6704,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7a5ca629d8ca1e1ee78705a78e58c12920d07ed8006d7e7232b31296a384ff5e41d7b649bde5561196041037bbb9f9715be1d1c20975df87ca204f34ad15b965 + languageName: node + linkType: hard + "@babel/plugin-syntax-jsx@npm:^7.7.2": version: 7.18.6 resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" @@ -7186,6 +7324,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-display-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a05bf83bf5e7b31f7a3b56da1bf8e2eeec76ef52ae44435ceff66363a1717fcda45b7b4b931a2c115982175f481fc3f2d0fab23f0a43c44e6d983afc396858f0 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-development@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" @@ -7197,6 +7346,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx-development@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7" + dependencies: + "@babel/plugin-transform-react-jsx": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 653d32ea5accb12d016e324ec5a584b60a8f39e60c6a5101194b73553fdefbfa3c3f06ec2410216ec2033fddae181a2f146a1d6ed59f075c488fc4570cad2e7b + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": version: 7.22.15 resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" @@ -7212,6 +7372,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-jsx@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-module-imports": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-jsx": ^7.24.7 + "@babel/types": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ddfe494eb4b6ad567ebf0c029246df55d006512b1eb4beead73427b83af2e7e91b6d6e6954e275a92c81a5111d1e6e1fb4a62fdfc6f77c847cc7581650a7c452 + languageName: node + linkType: hard + "@babel/plugin-transform-react-pure-annotations@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.22.5" @@ -7224,6 +7399,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-pure-annotations@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d859ada3cbeb829fa3d9978a29b2d36657fcc9dcc1e4c3c3af84ec5a044a8f8db26ada406baa309e5d4d512aca53d07c520d991b891ff943bec7d8f01aae0419 + languageName: node + linkType: hard + "@babel/plugin-transform-regenerator@npm:^7.22.10": version: 7.22.10 resolution: "@babel/plugin-transform-regenerator@npm:7.22.10" @@ -7499,6 +7686,22 @@ __metadata: languageName: node linkType: hard +"@babel/preset-react@npm:^7.24.6": + version: 7.24.7 + resolution: "@babel/preset-react@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-validator-option": ^7.24.7 + "@babel/plugin-transform-react-display-name": ^7.24.7 + "@babel/plugin-transform-react-jsx": ^7.24.7 + "@babel/plugin-transform-react-jsx-development": ^7.24.7 + "@babel/plugin-transform-react-pure-annotations": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 76d0365b6bca808be65c4ccb3f3384c0792084add15eb537f16b3e44184216b82fa37f945339b732ceee6f06e09ba1f39f75c45e69b9811ddcc479f05555ea9c + languageName: node + linkType: hard + "@babel/preset-typescript@npm:^7.18.6": version: 7.23.2 resolution: "@babel/preset-typescript@npm:7.23.2" @@ -7562,6 +7765,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/template@npm:7.24.7" + dependencies: + "@babel/code-frame": ^7.24.7 + "@babel/parser": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: ea90792fae708ddf1632e54c25fe1a86643d8c0132311f81265d2bdbdd42f9f4fac65457056c1b6ca87f7aa0d6a795b549566774bba064bdcea2034ab3960ee9 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.18.8, @babel/traverse@npm:^7.23.2": version: 7.23.2 resolution: "@babel/traverse@npm:7.23.2" @@ -7598,6 +7812,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/traverse@npm:7.24.7" + dependencies: + "@babel/code-frame": ^7.24.7 + "@babel/generator": ^7.24.7 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-function-name": ^7.24.7 + "@babel/helper-hoist-variables": ^7.24.7 + "@babel/helper-split-export-declaration": ^7.24.7 + "@babel/parser": ^7.24.7 + "@babel/types": ^7.24.7 + debug: ^4.3.1 + globals: ^11.1.0 + checksum: 7cd366afe9e7ee77e493779fdf24f67bf5595247289364f4689e29688572505eaeb886d7a8f20ebb9c29fc2de7d0895e4ff9e203e78e39ac67239724d45aa83b + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": version: 7.21.2 resolution: "@babel/types@npm:7.21.2" @@ -7620,6 +7852,37 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/types@npm:7.24.7" + dependencies: + "@babel/helper-string-parser": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 + to-fast-properties: ^2.0.0 + checksum: 3e4437fced97e02982972ce5bebd318c47d42c9be2152c0fd28c6f786cc74086cc0a8fb83b602b846e41df37f22c36254338eada1a47ef9d8a1ec92332ca3ea8 + languageName: node + linkType: hard + +"@baiducloud/qianfan@npm:0.1.0": + version: 0.1.0 + resolution: "@baiducloud/qianfan@npm:0.1.0" + dependencies: + "@babel/preset-react": ^7.24.6 + "@rollup/plugin-inject": ^5.0.5 + "@rollup/plugin-json": ^6.1.0 + "@types/node-fetch": ^2.6.11 + async-mutex: ^0.5.0 + bottleneck: ^2.19.5 + crypto-js: ^4.2.0 + dotenv: ^16.4.5 + node-fetch: 2.7.0 + rollup: ^3.29.4 + typescript: ^5.3.3 + web-streams-polyfill: ^4.0.0 + checksum: 05a607846a8e4d2e86b7ad88c798eb9d8db15cbd8bdafd2606aee522c7fda2b1aa48c30b7cbca92ac17fd2228c8f3d786f6f0b420c5dc4ee05fd8dfa5a720c5e + languageName: node + linkType: hard + "@bcherny/json-schema-ref-parser@npm:10.0.5-fork": version: 10.0.5-fork resolution: "@bcherny/json-schema-ref-parser@npm:10.0.5-fork" @@ -9824,6 +10087,17 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": ^1.2.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:3.1.0": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" @@ -9831,6 +10105,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 + languageName: node + linkType: hard + "@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" @@ -9838,6 +10119,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + "@jridgewell/source-map@npm:^0.3.3": version: 0.3.5 resolution: "@jridgewell/source-map@npm:0.3.5" @@ -9855,7 +10143,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.15": +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 @@ -9872,6 +10160,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + languageName: node + linkType: hard + "@js-sdsl/ordered-map@npm:^4.4.2": version: 4.4.2 resolution: "@js-sdsl/ordered-map@npm:4.4.2" @@ -10038,6 +10336,42 @@ __metadata: languageName: unknown linkType: soft +"@langchain/baidu-qianfan@workspace:*, @langchain/baidu-qianfan@workspace:libs/langchain-baidu-qianfan": + version: 0.0.0-use.local + resolution: "@langchain/baidu-qianfan@workspace:libs/langchain-baidu-qianfan" + dependencies: + "@baiducloud/qianfan": 0.1.0 + "@jest/globals": ^29.5.0 + "@langchain/core": ">0.1.56 <0.3.0" + "@langchain/openai": ~0.1.0 + "@langchain/scripts": ~0.0.14 + "@swc/core": ^1.3.90 + "@swc/jest": ^0.2.29 + "@tsconfig/recommended": ^1.0.3 + "@types/uuid": ^9 + "@typescript-eslint/eslint-plugin": ^6.12.0 + "@typescript-eslint/parser": ^6.12.0 + dotenv: ^16.3.1 + dpdm: ^3.12.0 + eslint: ^8.33.0 + eslint-config-airbnb-base: ^15.0.0 + eslint-config-prettier: ^8.6.0 + eslint-plugin-import: ^2.27.5 + eslint-plugin-no-instanceof: ^1.0.1 + eslint-plugin-prettier: ^4.2.1 + jest: ^29.5.0 + jest-environment-node: ^29.6.4 + langchain: 0.2.5 + prettier: ^2.8.3 + release-it: ^15.10.1 + rollup: ^4.5.2 + ts-jest: ^29.1.0 + typescript: <5.2.0 + zod: ^3.22.4 + zod-to-json-schema: ^3.22.5 + languageName: unknown + linkType: soft + "@langchain/cloudflare@workspace:*, @langchain/cloudflare@workspace:libs/langchain-cloudflare": version: 0.0.0-use.local resolution: "@langchain/cloudflare@workspace:libs/langchain-cloudflare" @@ -12649,6 +12983,52 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-inject@npm:^5.0.5": + version: 5.0.5 + resolution: "@rollup/plugin-inject@npm:5.0.5" + dependencies: + "@rollup/pluginutils": ^5.0.1 + estree-walker: ^2.0.2 + magic-string: ^0.30.3 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 22cb772fd6f7178308b2ece95cdde5f8615f6257197832166294552a7e4c0d3976dc996cbfa6470af3151d8b86c00091aa93da5f4db6ec563f11b6db29fd1b63 + languageName: node + linkType: hard + +"@rollup/plugin-json@npm:^6.1.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": ^5.1.0 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: cc018d20c80242a2b8b44fae61a968049cf31bb8406218187cc7cda35747616594e79452dd65722e7da6dd825b392e90d4599d43cd4461a02fefa2865945164e + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.0": + version: 5.1.0 + resolution: "@rollup/pluginutils@npm:5.1.0" + dependencies: + "@types/estree": ^1.0.0 + estree-walker: ^2.0.2 + picomatch: ^2.3.1 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 3cc5a6d91452a6eabbfd1ae79b4dd1f1e809d2eecda6e175deb784e75b0911f47e9ecce73f8dd315d6a8b3f362582c91d3c0f66908b6ced69345b3cbe28f8ce8 + languageName: node + linkType: hard + "@rollup/rollup-android-arm-eabi@npm:4.8.0": version: 4.8.0 resolution: "@rollup/rollup-android-arm-eabi@npm:4.8.0" @@ -16908,6 +17288,16 @@ __metadata: languageName: node linkType: hard +"@types/node-fetch@npm:^2.6.11": + version: 2.6.11 + resolution: "@types/node-fetch@npm:2.6.11" + dependencies: + "@types/node": "*" + form-data: ^4.0.0 + checksum: 180e4d44c432839bdf8a25251ef8c47d51e37355ddd78c64695225de8bc5dc2b50b7bb855956d471c026bb84bd7295688a0960085e7158cbbba803053492568b + languageName: node + linkType: hard + "@types/node@npm:*": version: 18.14.6 resolution: "@types/node@npm:18.14.6" @@ -19050,6 +19440,15 @@ __metadata: languageName: node linkType: hard +"async-mutex@npm:^0.5.0": + version: 0.5.0 + resolution: "async-mutex@npm:0.5.0" + dependencies: + tslib: ^2.4.0 + checksum: be1587f4875f3bb15e34e9fcce82eac2966daef4432c8d0046e61947fb9a1b95405284601bc7ce4869319249bc07c75100880191db6af11d1498931ac2a2f9ea + languageName: node + linkType: hard + "async-retry@npm:1.3.3, async-retry@npm:^1.3.3": version: 1.3.3 resolution: "async-retry@npm:1.3.3" @@ -19601,7 +20000,7 @@ __metadata: languageName: node linkType: hard -"bottleneck@npm:^2.15.3": +"bottleneck@npm:^2.15.3, bottleneck@npm:^2.19.5": version: 2.19.5 resolution: "bottleneck@npm:2.19.5" checksum: c5eef1bbea12cef1f1405e7306e7d24860568b0f7ac5eeab706a86762b3fc65ef6d1c641c8a166e4db90f412fc5c948fc5ce8008a8cd3d28c7212ef9c3482bda @@ -24377,6 +24776,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc + languageName: node + linkType: hard + "estree-walker@npm:^3.0.3": version: 3.0.3 resolution: "estree-walker@npm:3.0.3" @@ -24481,6 +24887,7 @@ __metadata: "@langchain/aws": "workspace:*" "@langchain/azure-dynamic-sessions": "workspace:^" "@langchain/azure-openai": "workspace:*" + "@langchain/baidu-qianfan": "workspace:*" "@langchain/cloudflare": "workspace:*" "@langchain/cohere": "workspace:*" "@langchain/community": "workspace:*" @@ -29631,6 +30038,181 @@ __metadata: languageName: node linkType: hard +"langchain@npm:0.2.5": + version: 0.2.5 + resolution: "langchain@npm:0.2.5" + dependencies: + "@langchain/core": ~0.2.0 + "@langchain/openai": ~0.1.0 + "@langchain/textsplitters": ~0.0.0 + binary-extensions: ^2.2.0 + js-tiktoken: ^1.0.12 + js-yaml: ^4.1.0 + jsonpointer: ^5.0.1 + langchainhub: ~0.0.8 + langsmith: ~0.1.30 + ml-distance: ^4.0.0 + openapi-types: ^12.1.3 + p-retry: 4 + uuid: ^9.0.0 + yaml: ^2.2.1 + zod: ^3.22.4 + zod-to-json-schema: ^3.22.3 + peerDependencies: + "@aws-sdk/client-s3": ^3.310.0 + "@aws-sdk/client-sagemaker-runtime": ^3.310.0 + "@aws-sdk/client-sfn": ^3.310.0 + "@aws-sdk/credential-provider-node": ^3.388.0 + "@azure/storage-blob": ^12.15.0 + "@browserbasehq/sdk": "*" + "@gomomento/sdk": ^1.51.1 + "@gomomento/sdk-core": ^1.51.1 + "@gomomento/sdk-web": ^1.51.1 + "@mendable/firecrawl-js": ^0.0.13 + "@notionhq/client": ^2.2.10 + "@pinecone-database/pinecone": "*" + "@supabase/supabase-js": ^2.10.0 + "@vercel/kv": ^0.2.3 + "@xata.io/client": ^0.28.0 + apify-client: ^2.7.1 + assemblyai: ^4.0.0 + axios: "*" + cheerio: ^1.0.0-rc.12 + chromadb: "*" + convex: ^1.3.1 + couchbase: ^4.3.0 + d3-dsv: ^2.0.0 + epub2: ^3.0.1 + fast-xml-parser: "*" + handlebars: ^4.7.8 + html-to-text: ^9.0.5 + ignore: ^5.2.0 + ioredis: ^5.3.2 + jsdom: "*" + mammoth: ^1.6.0 + mongodb: ">=5.2.0" + node-llama-cpp: "*" + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + pdf-parse: 1.1.1 + peggy: ^3.0.2 + playwright: ^1.32.1 + puppeteer: ^19.7.2 + pyodide: ^0.24.1 + redis: ^4.6.4 + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.12 + weaviate-ts-client: "*" + web-auth-library: ^1.0.3 + ws: ^8.14.2 + youtube-transcript: ^1.0.6 + youtubei.js: ^9.1.0 + peerDependenciesMeta: + "@aws-sdk/client-s3": + optional: true + "@aws-sdk/client-sagemaker-runtime": + optional: true + "@aws-sdk/client-sfn": + optional: true + "@aws-sdk/credential-provider-node": + optional: true + "@azure/storage-blob": + optional: true + "@browserbasehq/sdk": + optional: true + "@gomomento/sdk": + optional: true + "@gomomento/sdk-core": + optional: true + "@gomomento/sdk-web": + optional: true + "@mendable/firecrawl-js": + optional: true + "@notionhq/client": + optional: true + "@pinecone-database/pinecone": + optional: true + "@supabase/supabase-js": + optional: true + "@vercel/kv": + optional: true + "@xata.io/client": + optional: true + apify-client: + optional: true + assemblyai: + optional: true + axios: + optional: true + cheerio: + optional: true + chromadb: + optional: true + convex: + optional: true + couchbase: + optional: true + d3-dsv: + optional: true + epub2: + optional: true + faiss-node: + optional: true + fast-xml-parser: + optional: true + handlebars: + optional: true + html-to-text: + optional: true + ignore: + optional: true + ioredis: + optional: true + jsdom: + optional: true + mammoth: + optional: true + mongodb: + optional: true + node-llama-cpp: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + peggy: + optional: true + playwright: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + ws: + optional: true + youtube-transcript: + optional: true + youtubei.js: + optional: true + checksum: 18078968f7a788052d02cc681e1a58d85ae7d8461db039a9e53ea7f8a17057c76a186788fceed0b0d2d02be732afa519305f16f12df57e90e734159cf7518df0 + languageName: node + linkType: hard + "langchain@workspace:*, langchain@workspace:langchain": version: 0.0.0-use.local resolution: "langchain@workspace:langchain" @@ -30644,6 +31226,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.3": + version: 0.30.10 + resolution: "magic-string@npm:0.30.10" + dependencies: + "@jridgewell/sourcemap-codec": ^1.4.15 + checksum: 456fd47c39b296c47dff967e1965121ace35417eab7f45a99e681e725b8661b48e1573c366ee67a27715025b3740773c46b088f115421c7365ea4ea6fa10d399 + languageName: node + linkType: hard + "make-dir@npm:^1.0.0": version: 1.3.0 resolution: "make-dir@npm:1.3.0" @@ -35735,6 +36326,20 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^3.29.4": + version: 3.29.4 + resolution: "rollup@npm:3.29.4" + dependencies: + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 8bb20a39c8d91130825159c3823eccf4dc2295c9a0a5c4ed851a5bf2167dbf24d9a29f23461a54c955e5506395e6cc188eafc8ab0e20399d7489fb33793b184e + languageName: node + linkType: hard + "rollup@npm:^4.5.2": version: 4.8.0 resolution: "rollup@npm:4.8.0" @@ -38386,6 +38991,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.3.3": + version: 5.5.2 + resolution: "typescript@npm:5.5.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 9c5a7982dadcb2d38d129c575dd38645ae11588ae0d4a12852fb04482bbc5a1660b2371e48fd5b33b6b605cc57cefe777670054546856945a05e77bd22c8c2cd + languageName: node + linkType: hard + "typescript@npm:^5.4.5": version: 5.4.5 resolution: "typescript@npm:5.4.5" @@ -38426,6 +39041,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@^5.3.3#~builtin": + version: 5.5.2 + resolution: "typescript@patch:typescript@npm%3A5.5.2#~builtin::version=5.5.2&hash=1f5320" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 9d89bac0de650e15d6846485f238d1e65f1013f2c260d9e53e86a1da6ecf8109d9fad9402575c5c36a6592dc5d4370db090e12971c8630ae84453654baabb6b4 + languageName: node + linkType: hard + "typescript@patch:typescript@^5.4.5#~builtin": version: 5.4.5 resolution: "typescript@patch:typescript@npm%3A5.4.5#~builtin::version=5.4.5&hash=1f5320"