Skip to content

Commit 2cfa106

Browse files
authored
Responses: set x-client-request-id as convesration_id when talking to responses (openai#14312)
Right now we're sending the header session_id to responses which is ignored/dropped. This sets a useful x-client-request-id to the conversation_id.
1 parent 78280f8 commit 2cfa106

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

codex-rs/codex-api/src/endpoint/responses.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ impl<T: HttpTransport, A: AuthProvider> ResponsesClient<T, A> {
7575
}
7676

7777
let mut headers = extra_headers;
78+
if let Some(ref conv_id) = conversation_id {
79+
insert_header(&mut headers, "x-client-request-id", conv_id);
80+
}
7881
headers.extend(build_conversation_headers(conversation_id));
7982
if let Some(subagent) = subagent_header(&session_source) {
8083
insert_header(&mut headers, "x-openai-subagent", &subagent);

codex-rs/core/src/client.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,14 +487,16 @@ impl ModelClient {
487487
turn_metadata_header: Option<&str>,
488488
) -> ApiHeaderMap {
489489
let turn_metadata_header = parse_turn_metadata_header(turn_metadata_header);
490+
let conversation_id = self.state.conversation_id.to_string();
490491
let mut headers = build_responses_headers(
491492
self.state.beta_features_header.as_deref(),
492493
turn_state,
493494
turn_metadata_header.as_ref(),
494495
);
495-
headers.extend(build_conversation_headers(Some(
496-
self.state.conversation_id.to_string(),
497-
)));
496+
if let Ok(header_value) = HeaderValue::from_str(&conversation_id) {
497+
headers.insert("x-client-request-id", header_value);
498+
}
499+
headers.extend(build_conversation_headers(Some(conversation_id)));
498500
headers.insert(
499501
OPENAI_BETA_HEADER,
500502
HeaderValue::from_static(RESPONSES_WEBSOCKETS_V2_BETA_HEADER_VALUE),

codex-rs/core/tests/suite/client_websockets.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,12 @@ use tracing_test::traced_test;
4949
const MODEL: &str = "gpt-5.2-codex";
5050
const OPENAI_BETA_HEADER: &str = "OpenAI-Beta";
5151
const WS_V2_BETA_HEADER_VALUE: &str = "responses_websockets=2026-02-06";
52+
const X_CLIENT_REQUEST_ID_HEADER: &str = "x-client-request-id";
5253

5354
struct WebsocketTestHarness {
5455
_codex_home: TempDir,
5556
client: ModelClient,
57+
conversation_id: ThreadId,
5658
model_info: ModelInfo,
5759
effort: Option<ReasoningEffortConfig>,
5860
summary: ReasoningSummary,
@@ -88,6 +90,10 @@ async fn responses_websocket_streams_request() {
8890
handshake.header(OPENAI_BETA_HEADER),
8991
Some(WS_V2_BETA_HEADER_VALUE.to_string())
9092
);
93+
assert_eq!(
94+
handshake.header(X_CLIENT_REQUEST_ID_HEADER),
95+
Some(harness.conversation_id.to_string())
96+
);
9197

9298
server.shutdown().await;
9399
}
@@ -1606,6 +1612,7 @@ async fn websocket_harness_with_options(
16061612
WebsocketTestHarness {
16071613
_codex_home: codex_home,
16081614
client,
1615+
conversation_id,
16091616
model_info,
16101617
effort,
16111618
summary,

0 commit comments

Comments
 (0)