fix(provider): fallback to responses on chat transport errors
This commit is contained in:
parent
44fa7f3d3d
commit
1461b00ad1
1 changed files with 101 additions and 8 deletions
|
|
@ -809,10 +809,29 @@ impl Provider for OpenAiCompatibleProvider {
|
||||||
|
|
||||||
let url = self.chat_completions_url();
|
let url = self.chat_completions_url();
|
||||||
|
|
||||||
let response = self
|
let response = match self
|
||||||
.apply_auth_header(self.http_client().post(&url).json(&request), credential)
|
.apply_auth_header(self.http_client().post(&url).json(&request), credential)
|
||||||
.send()
|
.send()
|
||||||
.await?;
|
.await
|
||||||
|
{
|
||||||
|
Ok(response) => response,
|
||||||
|
Err(chat_error) => {
|
||||||
|
if self.supports_responses_fallback {
|
||||||
|
let sanitized = super::sanitize_api_error(&chat_error.to_string());
|
||||||
|
return self
|
||||||
|
.chat_via_responses(credential, system_prompt, message, model)
|
||||||
|
.await
|
||||||
|
.map_err(|responses_err| {
|
||||||
|
anyhow::anyhow!(
|
||||||
|
"{} chat completions transport error: {sanitized} (responses fallback failed: {responses_err})",
|
||||||
|
self.name
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return Err(chat_error.into());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if !response.status().is_success() {
|
if !response.status().is_success() {
|
||||||
let status = response.status();
|
let status = response.status();
|
||||||
|
|
@ -891,10 +910,38 @@ impl Provider for OpenAiCompatibleProvider {
|
||||||
};
|
};
|
||||||
|
|
||||||
let url = self.chat_completions_url();
|
let url = self.chat_completions_url();
|
||||||
let response = self
|
let response = match self
|
||||||
.apply_auth_header(self.http_client().post(&url).json(&request), credential)
|
.apply_auth_header(self.http_client().post(&url).json(&request), credential)
|
||||||
.send()
|
.send()
|
||||||
.await?;
|
.await
|
||||||
|
{
|
||||||
|
Ok(response) => response,
|
||||||
|
Err(chat_error) => {
|
||||||
|
if self.supports_responses_fallback {
|
||||||
|
let system = messages.iter().find(|m| m.role == "system");
|
||||||
|
let last_user = messages.iter().rfind(|m| m.role == "user");
|
||||||
|
if let Some(user_msg) = last_user {
|
||||||
|
let sanitized = super::sanitize_api_error(&chat_error.to_string());
|
||||||
|
return self
|
||||||
|
.chat_via_responses(
|
||||||
|
credential,
|
||||||
|
system.map(|m| m.content.as_str()),
|
||||||
|
&user_msg.content,
|
||||||
|
model,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map_err(|responses_err| {
|
||||||
|
anyhow::anyhow!(
|
||||||
|
"{} chat completions transport error: {sanitized} (responses fallback failed: {responses_err})",
|
||||||
|
self.name
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Err(chat_error.into());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if !response.status().is_success() {
|
if !response.status().is_success() {
|
||||||
let status = response.status();
|
let status = response.status();
|
||||||
|
|
@ -991,10 +1038,24 @@ impl Provider for OpenAiCompatibleProvider {
|
||||||
};
|
};
|
||||||
|
|
||||||
let url = self.chat_completions_url();
|
let url = self.chat_completions_url();
|
||||||
let response = self
|
let response = match self
|
||||||
.apply_auth_header(self.http_client().post(&url).json(&request), credential)
|
.apply_auth_header(self.http_client().post(&url).json(&request), credential)
|
||||||
.send()
|
.send()
|
||||||
.await?;
|
.await
|
||||||
|
{
|
||||||
|
Ok(response) => response,
|
||||||
|
Err(error) => {
|
||||||
|
tracing::warn!(
|
||||||
|
"{} native tool call transport failed: {error}; falling back to history path",
|
||||||
|
self.name
|
||||||
|
);
|
||||||
|
let text = self.chat_with_history(messages, model, temperature).await?;
|
||||||
|
return Ok(ProviderChatResponse {
|
||||||
|
text: Some(text),
|
||||||
|
tool_calls: vec![],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if !response.status().is_success() {
|
if !response.status().is_success() {
|
||||||
return Err(super::api_error(&self.name, response).await);
|
return Err(super::api_error(&self.name, response).await);
|
||||||
|
|
@ -1053,13 +1114,45 @@ impl Provider for OpenAiCompatibleProvider {
|
||||||
};
|
};
|
||||||
|
|
||||||
let url = self.chat_completions_url();
|
let url = self.chat_completions_url();
|
||||||
let response = self
|
let response = match self
|
||||||
.apply_auth_header(
|
.apply_auth_header(
|
||||||
self.http_client().post(&url).json(&native_request),
|
self.http_client().post(&url).json(&native_request),
|
||||||
credential,
|
credential,
|
||||||
)
|
)
|
||||||
.send()
|
.send()
|
||||||
.await?;
|
.await
|
||||||
|
{
|
||||||
|
Ok(response) => response,
|
||||||
|
Err(chat_error) => {
|
||||||
|
if self.supports_responses_fallback {
|
||||||
|
let system = request.messages.iter().find(|m| m.role == "system");
|
||||||
|
let last_user = request.messages.iter().rfind(|m| m.role == "user");
|
||||||
|
if let Some(user_msg) = last_user {
|
||||||
|
let sanitized = super::sanitize_api_error(&chat_error.to_string());
|
||||||
|
return self
|
||||||
|
.chat_via_responses(
|
||||||
|
credential,
|
||||||
|
system.map(|m| m.content.as_str()),
|
||||||
|
&user_msg.content,
|
||||||
|
model,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.map(|text| ProviderChatResponse {
|
||||||
|
text: Some(text),
|
||||||
|
tool_calls: vec![],
|
||||||
|
})
|
||||||
|
.map_err(|responses_err| {
|
||||||
|
anyhow::anyhow!(
|
||||||
|
"{} native chat transport error: {sanitized} (responses fallback failed: {responses_err})",
|
||||||
|
self.name
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Err(chat_error.into());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if !response.status().is_success() {
|
if !response.status().is_success() {
|
||||||
let status = response.status();
|
let status = response.status();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue