繁体   English   中英

nodejs 应用程序在 openai dall-e 2 api 上崩溃拒绝请求

[英]nodejs app crash on openai dall-e 2 api rejected request

我肯定很笨,但我无法弄清楚如何处理 openai api 被拒绝的请求(对于上下文,dall-e 2 是一个图像生成器)

当用户尝试生成禁止图像时,我的 nodejs 应用程序就退出了

async function start(arg) {
    try{
        // generate image
        const response = openai.createImage({
            prompt: arg,
            n: 1,
            size: "1024x1024",
        });
        // on success response
        response.then(res =>{
            console.log("ok");
        })
        response.catch(err =>{
            console.log(err);
        });
        
    } catch(e){
        console.log(e);
    }   
}

它在出口处给了我类似的东西:

data: {
      error: {
        code: null,
        message: 'Your request was rejected as a result of our safety system. Your prompt may contain text that is not allowed by our safety system.',
        param: null,
        type: 'invalid_request_error'
      }
    }

尝试使用 response.catch 并尝试捕获但没有成功,应用程序每次都退出

我至少想首先忽略这个错误

另一方面,我想 console.log 给定的消息(data.error.message)

老实说,我不知道该怎么做,甚至不明白为什么 try catch 不起作用

根据给出的详细信息,我的猜测是 getImages 返回的 Promise 被拒绝了。 你可以通过在你的.catch 回调和 catch 语句中添加一些额外的日志来稍微调试一下。

如何执行此操作实际上取决于您尝试使用此 api 执行的操作,无论发生什么情况,当前编写的代码都会记录一些内容并退出。

有几种方法可以处理这个

  1. 使用您的.catch来处理错误。 利用 promise chainability 你可以得到这样的东西
openai.createImage({
    prompt: arg,
    n: 1,
    size: "1024x1024",
    user: msg.author.id,
})
.catch((e) => {
    if (e.data.error.message.includes('safety system')) {
        return 'something'
    }

    console.error(e)
})

如果您需要响应对象,则 asnwer 可能会有所不同。 看起来 openai 包是基于 axios 构建的,您可以将 axios 选项传递给它。 请参阅https://axios-http.com/docs/handling_errorshttps://npmjs.com/package/openai的请求选项部分

编辑感谢@JacksonChristoffersen ,我找到了我的解决方案

基本上我得到的是 HTTP 状态 400

我刚刚添加了来自 axios 的请求选项来验证小于 500 的 http 状态

这是解决方案:

async function start(arg) {
    try{
        // generate image
        const response = openai.createImage({
            prompt: arg,
            n: 1,
            size: "1024x1024",
        },{
            validateStatus: function (status) {
                return status < 500; // Resolve only if the status code is less than 500
            }
        });
        // on success response
        response.then(res =>{
            console.log("ok");
        })
        response.catch(err =>{
            console.log(err);
        });
        
    } catch(e){
        console.log(e);
    }   
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM