diff --git a/codex-rs/codex-api/src/endpoint/realtime_client_secrets.rs b/codex-rs/codex-api/src/endpoint/realtime_client_secrets.rs index 16b2adb4ec..1c3ac0ef5d 100644 --- a/codex-rs/codex-api/src/endpoint/realtime_client_secrets.rs +++ b/codex-rs/codex-api/src/endpoint/realtime_client_secrets.rs @@ -1,7 +1,6 @@ use crate::auth::AuthProvider; use crate::endpoint::realtime_websocket::RealtimeSessionConfig; -use crate::endpoint::realtime_websocket::methods_common::normalized_session_mode; -use crate::endpoint::realtime_websocket::methods_common::session_update_session; +use crate::endpoint::realtime_websocket::session_update_session_json; use crate::endpoint::session::EndpointSession; use crate::error::ApiError; use crate::provider::Provider; @@ -61,13 +60,11 @@ impl RealtimeClientSecretsClient { } fn realtime_client_secret_request_body(config: &RealtimeSessionConfig) -> Result { - let session_mode = normalized_session_mode(config.event_parser, config.session_mode); - let mut session = serde_json::to_value(session_update_session( + let mut session = session_update_session_json( config.event_parser, config.instructions.clone(), - session_mode, - )) - .map_err(|err| ApiError::Stream(format!("failed to encode realtime session config: {err}")))?; + config.session_mode, + )?; if let Some(model) = config.model.as_ref() && let Some(session_object) = session.as_object_mut() { diff --git a/codex-rs/codex-api/src/endpoint/realtime_websocket/methods_common.rs b/codex-rs/codex-api/src/endpoint/realtime_websocket/methods_common.rs index ce9a3c325d..048ea6127a 100644 --- a/codex-rs/codex-api/src/endpoint/realtime_websocket/methods_common.rs +++ b/codex-rs/codex-api/src/endpoint/realtime_websocket/methods_common.rs @@ -10,11 +10,13 @@ use crate::endpoint::realtime_websocket::protocol::RealtimeEventParser; use crate::endpoint::realtime_websocket::protocol::RealtimeOutboundMessage; use crate::endpoint::realtime_websocket::protocol::RealtimeSessionMode; use crate::endpoint::realtime_websocket::protocol::SessionUpdateSession; +use crate::error::ApiError; +use serde_json::Value; pub(super) const REALTIME_AUDIO_SAMPLE_RATE: u32 = 24_000; const AGENT_FINAL_MESSAGE_PREFIX: &str = "\"Agent Final Message\":\n\n"; -pub(crate) fn normalized_session_mode( +fn normalized_session_mode( event_parser: RealtimeEventParser, session_mode: RealtimeSessionMode, ) -> RealtimeSessionMode { @@ -48,7 +50,7 @@ pub(super) fn conversation_handoff_append_message( } } -pub(crate) fn session_update_session( +fn session_update_session( event_parser: RealtimeEventParser, instructions: String, session_mode: RealtimeSessionMode, @@ -60,6 +62,19 @@ pub(crate) fn session_update_session( } } +pub(crate) fn session_update_session_json( + event_parser: RealtimeEventParser, + instructions: String, + session_mode: RealtimeSessionMode, +) -> Result { + serde_json::to_value(session_update_session( + event_parser, + instructions, + session_mode, + )) + .map_err(|err| ApiError::Stream(format!("failed to encode realtime session config: {err}"))) +} + pub(super) fn websocket_intent(event_parser: RealtimeEventParser) -> Option<&'static str> { match event_parser { RealtimeEventParser::V1 => v1_websocket_intent(), diff --git a/codex-rs/codex-api/src/endpoint/realtime_websocket/mod.rs b/codex-rs/codex-api/src/endpoint/realtime_websocket/mod.rs index 67f7dd4148..1e0dfdd686 100644 --- a/codex-rs/codex-api/src/endpoint/realtime_websocket/mod.rs +++ b/codex-rs/codex-api/src/endpoint/realtime_websocket/mod.rs @@ -1,5 +1,5 @@ pub mod methods; -pub(crate) mod methods_common; +mod methods_common; mod methods_v1; mod methods_v2; pub mod protocol; @@ -13,6 +13,7 @@ pub use methods::RealtimeWebsocketClient; pub use methods::RealtimeWebsocketConnection; pub use methods::RealtimeWebsocketEvents; pub use methods::RealtimeWebsocketWriter; +pub(crate) use methods_common::session_update_session_json; pub use protocol::RealtimeEventParser; pub use protocol::RealtimeSessionConfig; pub use protocol::RealtimeSessionMode;