请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

百度@baiducloud/qianfan打包以后总找不到 dotenv,,该怎么办?

打包之前 百度 “ERNIE-Speed-128K” 和阿里云 "qwen-turbo"都能正常提问,打包以后只有 阿里云 "qwen-turbo"能正常提问, 百度 "ERNIE-Speed-128K"则抛出错误: “Error: Cannot find module ‘dotenv’”,经查 ‘dotenv’ 是安装了的,而且卸载,再安装几次仍是不行,追踪发现问题来自百度 QianfanProvider 实例初始化时,获取默认参数对象出错,要调用’dotenv’,总是找不的,造成 QianfanProvider 初始化失败,无法发出请求,我注意到您课上的 @baiducloud/qianfan 是 ^0.1.6,我现在的 @baiducloud/qianfan 是 ^0.2.3。向AI提问,试了几种方法都不行,请问老师,打包以后问题怎么解决?

constructor(accessKey: string, secretKey: string) {
    super();
    const config = {
      QIANFAN_ACCESS_KEY: accessKey,
      QIANFAN_SECRET_KEY: secretKey,
      ENABLE_OAUTH: true,
    };

    try {
      console.log("Initializing QianfanProvider with config:", config);
      // 就是这里,打包以后初始化不能完成,开发模式下运行没问题
      this.client = new ChatCompletion(config);
      console.log("QianfanProvider initialized successfully");
    } catch (error) {
      console.error("Detailed error:", {
        message: error.message,
        stack: error.stack,
        config: config,
      });
      throw error;
    }
  }

配置的3个是关键参数,QIANFAN_ACCESS_KEY QIANFAN_SECRET_KEY ENABLE_OAUTH,打印出来 ChatCompletion的默认参数很多,如下代码,是获取默认参数获取不到,初始化失败。

provider==> QianfanProvider {
  client: ChatCompletion {
    headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
    access_token: '',
    bearer_token: '',
    expires_in: 0,
    version: undefined,
    qianfanAk: '',
    qianfanSk: '',
    appid: '',
    qianfanAccessKey: 'xxxxxxxxxxxxxxx',
    qianfanSecretKey: 'xxxxxxxxxxxxxxxxxxxxxxx',
    Endpoint: undefined,
    qianfanBaseUrl: 'https://aip.baidubce.com',
    qianfanConsoleApiBaseUrl: 'https://qianfan.baidubce.com',
    qianfanV2BaseUrl: 'https://qianfan.baidubce.com/v2/chat/completions',
    qianfanLlmApiRetryTimeout: '600000',
    qianfanLlmApiRetryBackoffFactor: '0',
    qianfanLlmApiRetryCount: '1',
    enableOauth: true,
    controller: AbortController { signal: AbortSignal { aborted: false } },
    fetchInstance: Fetch$2 {
      maxRetries: 1,
      timeout: 600000,
      backoffFactor: 0,
      retryMaxWaitInterval: NaN,
      rateLimiter: [RateLimiter],
      tokenLimiter: [TokenLimiter]
    }
  }

@baiducloud/qianfan包里面 getDefaultConfig 需要依赖 dotenv

// node_modules\@baiducloud\qianfan\src\utils.ts
export function getDefaultConfig(): DefaultConfig {
    const envVariables = Object.keys(DEFAULT_CONFIG);
    if (getCurrentEnvironment() === 'browser') {
        return {...DEFAULT_CONFIG};
    }
    require('dotenv').config();
    const obj: Record<string, string> = {};
    for (const key of envVariables) {
        const value = process.env[key];
        if (value !== undefined) {
            obj[key] = value;
        }
    }
    return Object.assign({}, DEFAULT_CONFIG, obj);
}

正在回答 回答被采纳积分+3

插入代码

2回答

提问者 慕设计0021481 2025-04-03 17:11:56

张老师,经过多次摸索,我这样解决了:

1. 修改百度千问库

1
2
3
4
5
6
7
8
9
// node_modules\@baiducloud\qianfan\src\utils.ts
// 添加
import dotenv from 'dotenv'
 
export function getDefaultConfig(): DefaultConfig {
    ...
    // require('dotenv').config() 改为
    dotenv.config()
}

2. 修改 QianfanProvider.ts 导入方式

1
2
3
4
// src\provider\QianfanProvider.ts
// import { ChatCompletion } from "@baiducloud/qianfan";
// 改为
import { ChatCompletion, setEnvVariable } from "@baiducloud/qianfan/src/index";

3. 如果先设置环境变量,还是无效

1
2
3
4
// 这样无效
setEnvVariable("QIANFAN_ACCESS_KEY", accessKey);
setEnvVariable("QIANFAN_SECRET_KEY", secretKey);
this.client = new ChatCompletion();


请问,张老师,有没有不用改 @baiducloud/qianfan的简便方法?

0 回复 有任何疑惑可以回复我~
  • 张轩 #1
    同学你好 刚看到回复 这几天我帮忙研究一下 在Mac下好像不能复现
    回复 有任何疑惑可以回复我~ 2025-04-04 17:08:19
张轩 2025-03-31 22:00:34

同学你好

请问你是 mac 还是 windows 的打包?

0 回复 有任何疑惑可以回复我~
  • 提问者 慕设计0021481 #1
    是在 win10 打的包
    回复 有任何疑惑可以回复我~ 2025-03-31 23:04:11
  • 提问者 慕设计0021481 #2
    请问,张老师,有没有不用改 @baiducloud/qianfan的简便方法?
    回复 有任何疑惑可以回复我~ 2025-04-03 17:12:22
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号