修正 executor 日志与重试错误的 provider 归属

生成 / 编辑路径的 tracing 字段与参考图数量校验错误改用 settings.provider

nanobanana 路径改用 VectorEngine provider

重试辅助函数 retry_image_send_after_delay / retry_image_upstream_status_after_delay 增加 provider 参数
This commit is contained in:
2026-09-19 13:23:50 +08:00
parent 89587c9e9e
commit e393a803f2
@@ -12,7 +12,7 @@ use crate::image_provider::{
constants::{
GPT_IMAGE_2_5_EDIT_MODEL, GPT_IMAGE_2_5_GENERATION_MODEL, GPT_IMAGE_2_C_MODEL,
GPT_IMAGE_2_MODEL, VECTOR_ENGINE_IMAGE_EDIT_MAX_REFERENCE_IMAGES,
VECTOR_ENGINE_NANOBANANA_MAX_REFERENCE_IMAGES, VECTOR_ENGINE_PROVIDER,
VECTOR_ENGINE_NANOBANANA_MAX_REFERENCE_IMAGES,
},
curl_transport::{
map_curl_error, send_image_json_request_with_curl,
@@ -143,6 +143,7 @@ pub async fn create_image_generation_with_model(
attempt,
) {
if retry_image_upstream_status_after_delay(
settings.provider,
"generation",
request_url.as_str(),
attempt,
@@ -165,6 +166,7 @@ pub async fn create_image_generation_with_model(
Err(error) => {
if should_retry_image_curl_send_error(&error, attempt) {
if retry_image_send_after_delay(
settings.provider,
"generation",
request_url.as_str(),
"request_send",
@@ -205,7 +207,7 @@ pub async fn create_image_generation_with_model(
};
let response_status = response.status;
tracing::info!(
provider = VECTOR_ENGINE_PROVIDER,
provider = settings.provider.as_str(),
endpoint = %request_url,
status = response_status,
image_model = upstream_model,
@@ -271,7 +273,7 @@ pub async fn create_nanobanana_generate_content(
})?;
if reference_images.len() > VECTOR_ENGINE_NANOBANANA_MAX_REFERENCE_IMAGES {
return Err(PlatformImageError::InvalidRequest {
provider: VECTOR_ENGINE_PROVIDER,
provider: settings.provider.as_str(),
message: format!(
"{failure_context}:参考图最多允许 {VECTOR_ENGINE_NANOBANANA_MAX_REFERENCE_IMAGES} 张,当前提交 {} 张。",
reference_images.len()
@@ -334,6 +336,7 @@ pub async fn create_nanobanana_generate_content(
attempt,
) {
if retry_image_upstream_status_after_delay(
ImageProvider::VectorEngine,
"nanobanana_generate_content",
request_url.as_str(),
attempt,
@@ -356,6 +359,7 @@ pub async fn create_nanobanana_generate_content(
Err(error) => {
if should_retry_image_curl_send_error(&error, attempt) {
if retry_image_send_after_delay(
ImageProvider::VectorEngine,
"nanobanana_generate_content",
request_url.as_str(),
"request_send",
@@ -394,7 +398,7 @@ pub async fn create_nanobanana_generate_content(
};
let response_status = response.status;
tracing::info!(
provider = VECTOR_ENGINE_PROVIDER,
provider = settings.provider.as_str(),
endpoint = %request_url,
status = response_status,
image_model = model,
@@ -495,13 +499,13 @@ pub async fn create_image_edit_with_references_and_model(
})?;
if reference_images.is_empty() {
return Err(PlatformImageError::InvalidRequest {
provider: VECTOR_ENGINE_PROVIDER,
provider: settings.provider.as_str(),
message: format!("{failure_context}:缺少参考图,图片编辑需要至少一张参考图。"),
});
}
if reference_images.len() > VECTOR_ENGINE_IMAGE_EDIT_MAX_REFERENCE_IMAGES {
return Err(PlatformImageError::InvalidRequest {
provider: VECTOR_ENGINE_PROVIDER,
provider: settings.provider.as_str(),
message: format!(
"{failure_context}:参考图最多允许 {VECTOR_ENGINE_IMAGE_EDIT_MAX_REFERENCE_IMAGES} 张,当前提交 {} 张。",
reference_images.len()
@@ -529,7 +533,7 @@ pub async fn create_image_edit_with_references_and_model(
reference_images,
);
tracing::info!(
provider = VECTOR_ENGINE_PROVIDER,
provider = settings.provider.as_str(),
endpoint = %request_url,
image_model = upstream_model,
requested_image_model = requested_model,
@@ -586,6 +590,7 @@ pub async fn create_image_edit_with_references_and_model(
attempt,
) {
if retry_image_upstream_status_after_delay(
settings.provider,
"edit",
request_url.as_str(),
attempt,
@@ -608,6 +613,7 @@ pub async fn create_image_edit_with_references_and_model(
Err(error) => {
if should_retry_image_curl_send_error(&error, attempt) {
if retry_image_send_after_delay(
settings.provider,
"edit",
request_url.as_str(),
"request_send",
@@ -648,7 +654,7 @@ pub async fn create_image_edit_with_references_and_model(
};
let response_status = response.status;
tracing::info!(
provider = VECTOR_ENGINE_PROVIDER,
provider = settings.provider.as_str(),
endpoint = %request_url,
status = response_status,
image_model = upstream_model,
@@ -760,6 +766,7 @@ fn should_retry_image_upstream_response(status: u16, raw_body: &str, attempt: u3
}
async fn retry_image_send_after_delay(
provider: ImageProvider,
request_kind: &'static str,
request_url: &str,
failure_stage: &'static str,
@@ -775,11 +782,12 @@ async fn retry_image_send_after_delay(
request_params: Option<&serde_json::Value>,
request_deadline: Option<Instant>,
) -> bool {
let provider_label = provider.as_str();
let delay_ms =
image_provider_send_retry_delay_ms(attempt, image_provider_send_retry_jitter_ms());
if !retry_delay_fits_request_deadline(request_deadline, delay_ms) {
tracing::warn!(
provider = VECTOR_ENGINE_PROVIDER,
provider = provider_label,
endpoint = %request_url,
request_kind,
failure_stage = "request_budget",
@@ -800,7 +808,7 @@ async fn retry_image_send_after_delay(
return false;
}
tracing::warn!(
provider = VECTOR_ENGINE_PROVIDER,
provider = provider_label,
endpoint = %request_url,
request_kind,
failure_stage,
@@ -826,6 +834,7 @@ async fn retry_image_send_after_delay(
}
async fn retry_image_upstream_status_after_delay(
provider: ImageProvider,
request_kind: &'static str,
request_url: &str,
attempt: u32,
@@ -837,11 +846,12 @@ async fn retry_image_upstream_status_after_delay(
request_params: Option<&serde_json::Value>,
request_deadline: Option<Instant>,
) -> bool {
let provider_label = provider.as_str();
let delay_ms =
image_provider_send_retry_delay_ms(attempt, image_provider_send_retry_jitter_ms());
if !retry_delay_fits_request_deadline(request_deadline, delay_ms) {
tracing::warn!(
provider = VECTOR_ENGINE_PROVIDER,
provider = provider_label,
endpoint = %request_url,
request_kind,
failure_stage = "request_budget",
@@ -858,7 +868,7 @@ async fn retry_image_upstream_status_after_delay(
return false;
}
tracing::warn!(
provider = VECTOR_ENGINE_PROVIDER,
provider = provider_label,
endpoint = %request_url,
request_kind,
failure_stage = "upstream_status",