mirror of
https://github.com/openai/codex.git
synced 2026-04-24 14:45:27 +00:00
Keep realtime call URL unadorned
Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
@@ -4,7 +4,6 @@ use crate::error::ApiError;
|
||||
use crate::provider::Provider;
|
||||
use bytes::Bytes;
|
||||
use codex_client::HttpTransport;
|
||||
use codex_client::Request;
|
||||
use codex_client::RequestTelemetry;
|
||||
use http::HeaderMap;
|
||||
use http::HeaderValue;
|
||||
@@ -16,10 +15,8 @@ use serde_json::to_string;
|
||||
use serde_json::to_value;
|
||||
use std::sync::Arc;
|
||||
use tracing::instrument;
|
||||
use url::Url;
|
||||
|
||||
const MULTIPART_BOUNDARY: &str = "codex-realtime-call-boundary";
|
||||
const REALTIME_CALL_INTENT: &str = "quicksilver";
|
||||
|
||||
pub struct RealtimeCallClient<T: HttpTransport, A: AuthProvider> {
|
||||
session: EndpointSession<T, A>,
|
||||
@@ -92,7 +89,6 @@ impl<T: HttpTransport, A: AuthProvider> RealtimeCallClient<T, A> {
|
||||
extra_headers,
|
||||
/*body*/ None,
|
||||
|req| {
|
||||
append_realtime_call_intent(req);
|
||||
req.headers
|
||||
.insert(CONTENT_TYPE, HeaderValue::from_static("application/sdp"));
|
||||
req.raw_body = Some(Bytes::from(sdp.clone()));
|
||||
@@ -119,15 +115,7 @@ impl<T: HttpTransport, A: AuthProvider> RealtimeCallClient<T, A> {
|
||||
.map_err(|err| ApiError::Stream(format!("failed to encode realtime call: {err}")))?;
|
||||
let resp = self
|
||||
.session
|
||||
.execute_with(
|
||||
Method::POST,
|
||||
Self::path(),
|
||||
extra_headers,
|
||||
Some(body),
|
||||
|req| {
|
||||
append_realtime_call_intent(req);
|
||||
},
|
||||
)
|
||||
.execute(Method::POST, Self::path(), extra_headers, Some(body))
|
||||
.await?;
|
||||
let sdp = decode_sdp_response(resp.body.as_ref())?;
|
||||
return Ok(RealtimeCallResponse { sdp });
|
||||
@@ -159,7 +147,6 @@ impl<T: HttpTransport, A: AuthProvider> RealtimeCallClient<T, A> {
|
||||
extra_headers,
|
||||
/*body*/ None,
|
||||
|req| {
|
||||
append_realtime_call_intent(req);
|
||||
req.headers.insert(
|
||||
CONTENT_TYPE,
|
||||
HeaderValue::from_static(
|
||||
@@ -177,15 +164,6 @@ impl<T: HttpTransport, A: AuthProvider> RealtimeCallClient<T, A> {
|
||||
}
|
||||
}
|
||||
|
||||
fn append_realtime_call_intent(req: &mut Request) {
|
||||
let mut url = Url::parse(&req.url).expect("endpoint session should build valid URLs");
|
||||
if !url.query_pairs().any(|(key, _)| key == "intent") {
|
||||
url.query_pairs_mut()
|
||||
.append_pair("intent", REALTIME_CALL_INTENT);
|
||||
}
|
||||
req.url = url.to_string();
|
||||
}
|
||||
|
||||
fn decode_sdp_response(body: &[u8]) -> Result<String, ApiError> {
|
||||
String::from_utf8(body.to_vec()).map_err(|err| {
|
||||
ApiError::Stream(format!(
|
||||
@@ -286,10 +264,7 @@ mod tests {
|
||||
|
||||
let request = transport.last_request.lock().unwrap().clone().unwrap();
|
||||
assert_eq!(request.method, Method::POST);
|
||||
assert_eq!(
|
||||
request.url,
|
||||
"https://api.openai.com/v1/realtime/calls?intent=quicksilver"
|
||||
);
|
||||
assert_eq!(request.url, "https://api.openai.com/v1/realtime/calls");
|
||||
assert_eq!(
|
||||
request.headers.get(CONTENT_TYPE).unwrap(),
|
||||
HeaderValue::from_static("application/sdp")
|
||||
@@ -331,10 +306,7 @@ mod tests {
|
||||
|
||||
let request = transport.last_request.lock().unwrap().clone().unwrap();
|
||||
assert_eq!(request.method, Method::POST);
|
||||
assert_eq!(
|
||||
request.url,
|
||||
"https://api.openai.com/v1/realtime/calls?intent=quicksilver"
|
||||
);
|
||||
assert_eq!(request.url, "https://api.openai.com/v1/realtime/calls");
|
||||
assert_eq!(
|
||||
request.headers.get(CONTENT_TYPE).unwrap(),
|
||||
HeaderValue::from_static("multipart/form-data; boundary=codex-realtime-call-boundary")
|
||||
@@ -378,7 +350,7 @@ mod tests {
|
||||
assert_eq!(request.method, Method::POST);
|
||||
assert_eq!(
|
||||
request.url,
|
||||
"https://chatgpt.com/backend-api/codex/realtime/calls?intent=quicksilver"
|
||||
"https://chatgpt.com/backend-api/codex/realtime/calls"
|
||||
);
|
||||
assert_eq!(request.raw_body, None);
|
||||
assert_eq!(
|
||||
|
||||
@@ -329,7 +329,7 @@ async fn conversation_start_audio_text_close_round_trip() -> Result<()> {
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn conversation_call_create_posts_session_with_intent() -> Result<()> {
|
||||
async fn conversation_call_create_posts_generated_session() -> Result<()> {
|
||||
let server = start_mock_server().await;
|
||||
let capture = RealtimeCallRequestCapture::new();
|
||||
Mock::given(method("POST"))
|
||||
@@ -366,14 +366,7 @@ async fn conversation_call_create_posts_session_with_intent() -> Result<()> {
|
||||
|
||||
let request = capture.single_request();
|
||||
assert_eq!(request.url.path(), "/v1/realtime/calls");
|
||||
assert_eq!(
|
||||
request
|
||||
.url
|
||||
.query_pairs()
|
||||
.find(|(key, _)| key == "intent")
|
||||
.map(|(_, value)| value.to_string()),
|
||||
Some("quicksilver".to_string())
|
||||
);
|
||||
assert_eq!(request.url.query(), None);
|
||||
assert_eq!(
|
||||
request
|
||||
.headers
|
||||
|
||||
Reference in New Issue
Block a user