即使标记返回错误GoFiber(golang,AWS SAM本地API网关),OpenAI审核仍在继续

f87krz0w  于 2023-05-27  发布在  Go
关注(0)|答案(1)|浏览(109)

我正在使用AWS API Gateway使用GoFiber创建API,并通过sam local start-api进行本地测试
API通过OpenAI生成一个提示,在我完成创建文本/图像的繁重工作之前,我通过审核API端点运行用户输入。如果我强制返回检查器函数ModeratePromptInput的所有值,它将显示错误。但是,如果我在调用者中检查err != nil,它将继续运行程序。我该怎么弥补?
以下是调用者(重要的部分):

// This is the function signature:
// func GenerateOutput(c *fiber.Ctx) (interface{}, error) 

// ....
// Create OpenAI Client for dependency injection
    oClient := openai.NewClient(os.Getenv("OPENAI_SECRET_KEY"))

    // Moderate the input to prevent abuse (exit early if input is abusive)
    err := actions.ModeratePromptInput(c, oClient)
    if err != nil {
        log.Printf("Error moderating prompt input: %v", err)
        return nil, c.JSON(fiber.Map{
            "error": "Error within error logic",
        })
    }
    // Code continues here - I want it to stop on error

这是调节功能:

func ModeratePromptInput(c *fiber.Ctx, oClient *openai.Client) error {
    promptInput := models.NewOutputRequest{}
    if err := c.BodyParser(&promptInput); err != nil {
        return err
    }

    moderationInput := openai.ModerationRequest{}
    moderationInput.Input = promptInput.UserInput

    res, err := oClient.Moderations(c.Context(), moderationInput)
    if err != nil || res.Results == nil || len(res.Results) == 0 {
        return c.Status(500).JSON(fiber.Map{
            "error": "Could not moderate input",
        })
    }

    if res.Results[0].Flagged {
        return c.Status(403).JSON(fiber.Map{
            "error":    "Input is abusive",
            "results:": res.Results,
        })
    }
    return nil
}

我通过单步执行检查了自己,我用GitHub Copilot检查了,我用ChatGPT检查了,他们都说这是正确的。已封送/未封送的结构携带数据。请求和响应对象正确。但是,我没有得到我想的流动。是不是有什么我不知道的东西导致这个继续运行?

kr98yfug

kr98yfug1#

问题是以下语句大多数时候返回nil

return c.Status(500).JSON(fiber.Map{
    "error": "Could not moderate input",
})
return c.Status(403).JSON(fiber.Map{
    "error":    "Input is abusive",
    "results:": res.Results,
})

看起来你想要的是:

c.Status(500).JSON(fiber.Map{
    "error": "Could not moderate input",
})
return errors.New("Could not moderate input")

但这仍然不起作用,因为func GenerateOutput将再次调用c.JSON。我不认为你可以写两次回复。
一个可能的修复方法是修改ModeratePromptInput如下:

var errCouldNotModerate = errors.New("Could not moderate input")

type flaggedError struct {
    results any // I don't know the type of the result
}

func (e *flaggedError) Error() string {
    return "Input is abusive"
}

func ModeratePromptInput(c *fiber.Ctx, oClient *openai.Client) error {
    promptInput := models.NewOutputRequest{}
    if err := c.BodyParser(&promptInput); err != nil {
        return err
    }

    moderationInput := openai.ModerationRequest{}
    moderationInput.Input = promptInput.UserInput

    res, err := oClient.Moderations(c.Context(), moderationInput)
    if err != nil || res.Results == nil || len(res.Results) == 0 {
        if err != nil {
            // at least log the err so that you know what's going on.
        }
        return errCouldNotModerate
    }

    if res.Results[0].Flagged {
        return &flaggedError{
            results: res.Results,
        }
    }
    return nil
}

并修改GenerateOutput以根据错误值构造响应。

相关问题