MetaGLM / zhipuai-sdk-nodejs-v4

智谱 AI 开放接口 V4 的 nodejs SDK
53 stars 4 forks source link

求助官方:调用接口抛出error异常如何捕获,以及响应的response,希望能有更详细的调用方式示例 #2

Closed pixeldin closed 8 months ago

pixeldin commented 8 months ago

非流式问答

使用接口的时候会抛出一个errorcatch住之后打印为空,调用方式如下:

参考官方示例

  async callModelAPI() {
    const dialogue = async () => {

      const client = new ZhipuAI({ apiKey: this.api_key }); // 创建 ZhipuAI 客户端

      try {
        const response = await client.createCompletions({
          model: 'glm-4',
          messages: [
            { role: 'system', content: '你是一个聪明且富有创造力的小说作家' },
            {
              role: 'user',
              content:
                '请你作为童话故事大王,写一篇短篇童话故事,故事的主题是要永远保持一颗善良的心,要能够激发儿童的学习兴趣和想象力,同时也能够帮助儿童更好地理解和接受故事中所蕴含的道理和价值观。',
            },
          ],
          stream: false,          
        });
        if (response.choices && response.choices.length > 0) {
          for (const choice of response.choices) {
            const message = choice.message;
            console.log(message); // 打印 choices.message
          }
        }
        //...
      } catch (error) {
        console.dir('catch error in createCompletions', error);
        this.logger.error(
          `error occurs: ${JSON.stringify(error)}, from callModelAPI()`,
        );
      }
    };

    dialogue();
  }

输出日志如下:

[Nest] 18508 - 2024/03/18 20:20:24 ERROR [ZhipuService] error occurs: "", from callModelAPI()

请问如何分析出具体错误信息?


流式问答

后面也尝试过使用流式SSE方式,如果是设置stream: true改为流式,则响应的response结构如下, image image 我尝试判断response其中的choice字段,但是其长度为0

        if (response.choices && response.choices.length > 0) {
          for (const choice of response.choices) {
            const message = choice.message;
            console.log(message); // 打印 choices.message
          }
        } else {
          console.log('response.choices 为空或未定义');
        }

image 请问该如何提取所需信息,能否提供示例代码对响应消息进行获取?

winily commented 8 months ago

第一点,经过我这边简单的尝试,错误是有成功返回来的,至于 console.dir 没输出是因为 console.dir 的第二参数是InspectOptions

image

第二点,流式请求的时候如我注释所说,请求返回的是一个Nodejs 的 Stream 对象,需要通过 .on("data", ()=> ...) 读取

response.on('data', (message) => {
    console.log(message.toString());
})

// 输出
data: {"id":"8489583196621604331","created":1710769321,"model":"glm-4","choices":[{"index":0,"delta":{"role":"assistant","content":"标题"}}]}

data: {"id":"8489583196621604331","created":1710769321,"model":"glm-4","choices":[{"index":0,"delta":{"role":"assistant","content":":"}}]}

data: {"id":"8489583196621604331","created":1710769321,"model":"glm-4","choices":[{"index":0,"delta":{"role":"assistant","content":"魔法"}}]}
......
pixeldin commented 8 months ago

打印error详情

image 感谢回复,从我的捕获错误来看,似乎还是无法打印出来


流式模式

也许是我这边的问题,为什么返回的response对象编译器无法识别为stream类型 image

winily commented 8 months ago

不是很清楚你这个错误是如何触发的,如果能给出复现的方法就最好了, 我可以去详细的排查一下

至于第二个编辑器报错可能是没有正确的识别类型,但是它其实是正常可用的,可以先屏蔽这个错误,

// ts 使用忽略该行的类型检查
// @ts-ignore

我计划近期可能会修改一下接口吧流式和非流式的接口分开返回正确的类型提示

pixeldin commented 8 months ago

好的,感谢。 经测试使用// @ts-ignore在流式模式下可以正常接收。