mirror of
https://github.com/openai/codex.git
synced 2026-11-12 21:20:34 +00:00
## What changed - Wrap `CodexErrorDetails` and an optional retry delay in `CodexErr`, allowing any mapped error to preserve server-provided retry timing. - Generate the payload-free `CodexErrKind` classification alongside the error details and reuse it for analytics. - Update error handling sites to inspect `CodexErr::details()` while preserving existing display, debug, protocol mapping, and retryability behavior. ## Testing - Add coverage for legacy debug formatting, error-specific retryability, and retry-delay propagation through API error mapping. GitOrigin-RevId: d3ab8a305f2a2ee21d0c0a8c8c388b06dda9c59a
44 lines
1.6 KiB
Rust
44 lines
1.6 KiB
Rust
use super::ResponsesStreamRequest;
|
|
use super::log_retry;
|
|
use crate::session::tests::make_session_and_context;
|
|
use codex_protocol::error::CodexErr;
|
|
use std::time::Duration;
|
|
use tracing_test::internal::MockWriter;
|
|
|
|
#[tokio::test]
|
|
async fn sampling_retry_logs_stream_error_context() {
|
|
let (_session, turn_context) = make_session_and_context().await;
|
|
let buffer: &'static std::sync::Mutex<Vec<u8>> =
|
|
Box::leak(Box::new(std::sync::Mutex::new(Vec::new())));
|
|
let subscriber = tracing_subscriber::fmt()
|
|
.with_ansi(false)
|
|
.with_max_level(tracing::Level::WARN)
|
|
.with_writer(MockWriter::new(buffer))
|
|
.finish();
|
|
let _subscriber_guard = tracing::subscriber::set_default(subscriber);
|
|
|
|
log_retry(
|
|
ResponsesStreamRequest::Sampling,
|
|
&turn_context,
|
|
&CodexErr::Stream("websocket closed by server before response.completed".to_string()),
|
|
/*retries*/ 2,
|
|
/*max_retries*/ 5,
|
|
Duration::from_secs(1),
|
|
);
|
|
|
|
let logs = String::from_utf8(
|
|
buffer
|
|
.lock()
|
|
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
|
.clone(),
|
|
)
|
|
.expect("retry log should be valid utf-8");
|
|
assert!(logs.contains("stream disconnected - retrying sampling request"));
|
|
assert!(logs.contains(&format!("turn_id={}", turn_context.sub_id)));
|
|
assert!(logs.contains("retries=2"));
|
|
assert!(logs.contains("max_retries=5"));
|
|
assert!(logs.contains(
|
|
"sampling_error=stream disconnected before completion: websocket closed by server before response.completed"
|
|
));
|
|
}
|