Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions codex-rs/codex-api/src/requests/headers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ pub fn build_session_headers(session_id: Option<String>, thread_id: Option<Strin
let mut headers = HeaderMap::new();
if let Some(id) = session_id {
insert_header(&mut headers, "session_id", &id);
insert_header(&mut headers, "session-id", &id);
}
if let Some(id) = thread_id {
insert_header(&mut headers, "thread_id", &id);
insert_header(&mut headers, "thread-id", &id);
}
headers
}
Expand Down
8 changes: 8 additions & 0 deletions codex-rs/codex-api/tests/clients.rs
Original file line number Diff line number Diff line change
Expand Up @@ -462,10 +462,18 @@ async fn azure_default_store_attaches_ids_and_headers() -> Result<()> {
req.headers.get("session_id").and_then(|v| v.to_str().ok()),
Some("sess_123")
);
assert_eq!(
req.headers.get("session-id").and_then(|v| v.to_str().ok()),
Some("sess_123")
);
assert_eq!(
req.headers.get("thread_id").and_then(|v| v.to_str().ok()),
Some("thread_123")
);
assert_eq!(
req.headers.get("thread-id").and_then(|v| v.to_str().ok()),
Some("thread_123")
);
assert_eq!(
req.headers
.get("x-client-request-id")
Expand Down
14 changes: 14 additions & 0 deletions codex-rs/core/tests/suite/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -764,7 +764,9 @@ async fn includes_session_id_thread_id_and_model_headers_in_request() {
let request = resp_mock.single_request();
assert_eq!(request.path(), "/v1/responses");
let request_session_id = request.header("session_id").expect("session_id header");
let request_session_id_hyphenated = request.header("session-id").expect("session-id header");
let request_thread_id = request.header("thread_id").expect("thread_id header");
let request_thread_id_hyphenated = request.header("thread-id").expect("thread-id header");
let request_authorization = request
.header("authorization")
.expect("authorization header");
Expand All @@ -776,7 +778,12 @@ async fn includes_session_id_thread_id_and_model_headers_in_request() {
let thread_id_string = expected_thread_id.to_string();

assert_eq!(request_session_id, expected_session_id.to_string());
assert_eq!(
request_session_id_hyphenated,
expected_session_id.to_string()
);
assert_eq!(request_thread_id, thread_id_string.as_str());
assert_eq!(request_thread_id_hyphenated, thread_id_string.as_str());
assert_eq!(request_originator, originator().value);
assert_eq!(request_authorization, "Bearer Test API Key");
assert_eq!(
Expand Down Expand Up @@ -1038,12 +1045,19 @@ async fn chatgpt_auth_sends_correct_request() {
let request_body = request.body_json();

let request_session_id = request.header("session_id").expect("session_id header");
let request_session_id_hyphenated = request.header("session-id").expect("session-id header");
let request_thread_id = request.header("thread_id").expect("thread_id header");
let request_thread_id_hyphenated = request.header("thread-id").expect("thread-id header");
let installation_id =
std::fs::read_to_string(test.codex_home_path().join(INSTALLATION_ID_FILENAME))
.expect("read installation id");
assert_eq!(request_session_id, expected_session_id.to_string());
assert_eq!(
request_session_id_hyphenated,
expected_session_id.to_string()
);
assert_eq!(request_thread_id, expected_thread_id.to_string());
assert_eq!(request_thread_id_hyphenated, expected_thread_id.to_string());

assert_eq!(request_originator, originator().value);
assert_eq!(request_authorization, "Bearer Access Token");
Expand Down
19 changes: 14 additions & 5 deletions codex-rs/tui/tests/suite/model_availability_nux.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,15 +177,24 @@ trust_level = "trusted"
}
};
let output_text = String::from_utf8_lossy(&output);
let interrupt_only_output = {
let trimmed_output = output_text.trim();
!trimmed_output.is_empty()
&& trimmed_output
let rendered_output = {
let mut parser = vt100::Parser::new(
/*rows*/ 24, /*cols*/ 80, /*scrollback_len*/ 0,
);
parser.process(&output);
parser.screen().contents()
};
let interrupted_during_terminal_startup = {
let trimmed_output = rendered_output.trim();
trimmed_output.is_empty()
|| trimmed_output
.chars()
.all(|character| character == '^' || character == 'C' || character.is_whitespace())
};
anyhow::ensure!(
exit_code == 0 || exit_code == 130 || (exit_code == 1 && interrupt_only_output),
exit_code == 0
|| exit_code == 130
|| (exit_code == 1 && interrupted_during_terminal_startup),
"unexpected exit code from codex resume: {exit_code}; output: {output_text}",
);

Expand Down
Loading