diff options
| author | sigoden <sigoden@gmail.com> | 2024-04-24 12:38:59 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-24 12:38:59 +0800 |
| commit | 040c48b9b392e3329d3f1de8eeb1b8773129773c (patch) | |
| tree | da47c01ee1b1f194b0f2e5f31063c0d758e8674f /src/client/openai.rs | |
| parent | 2fd12abc8c78e415a9aba6ed63b460d22320c0f3 (diff) | |
| download | aichat-040c48b9b392e3329d3f1de8eeb1b8773129773c.tar.gz | |
refactor: handling of response error (#433)
Diffstat (limited to 'src/client/openai.rs')
| -rw-r--r-- | src/client/openai.rs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/client/openai.rs b/src/client/openai.rs index 7925ec6..f35c6ab 100644 --- a/src/client/openai.rs +++ b/src/client/openai.rs @@ -66,9 +66,11 @@ impl OpenAIClient { } pub async fn openai_send_message(builder: RequestBuilder) -> Result<String> { - let data: Value = builder.send().await?.json().await?; - if let Some(err_msg) = data["error"]["message"].as_str() { - bail!("{err_msg}"); + let res = builder.send().await?; + let status = res.status(); + let data: Value = res.json().await?; + if status != 200 { + catch_error(&data, status.as_u16())?; } let output = data["choices"][0]["message"]["content"] @@ -97,21 +99,15 @@ pub async fn openai_send_message_streaming( } Err(err) => { match err { - EventSourceError::InvalidStatusCode(code, res) => { + EventSourceError::InvalidStatusCode(status, res) => { let text = res.text().await?; let data: Value = match text.parse() { Ok(data) => data, Err(_) => { - bail!("Request failed, {code}, {text}"); + bail!("Invalid respoinse, status: {status}, text: {text}"); } }; - if let Some(err_msg) = data["error"]["message"].as_str() { - bail!("{err_msg}"); - } else if let Some(err_msg) = data["message"].as_str() { - bail!("{err_msg}"); - } else { - bail!("Request failed, {code}, {text}"); - } + catch_error(&data, status.as_u16())?; } EventSourceError::StreamEnded => {} EventSourceError::InvalidContentType(_, res) => { @@ -156,3 +152,15 @@ pub fn openai_build_body(data: SendData, model: &Model) -> Value { } body } + +fn catch_error(data: &Value, status: u16) -> Result<()> { + debug!("Invalid response, status: {status}, data: {data}"); + if let Some(error) = data["error"].as_object() { + if let (Some(type_), Some(message)) = (error["type"].as_str(), error["message"].as_str()) { + bail!("{message} (type: {type_})"); + } + } else if let Some(message) = data["message"].as_str() { + bail!("{message}"); + } + bail!("Invalid response, status: {status}, data: {data}"); +} |
