mirror of
https://github.com/openai/codex.git
synced 2026-04-27 16:15:09 +00:00
@@ -37,6 +37,8 @@ use codex_protocol::user_input::UserInput;
|
||||
use core_test_support::load_default_config_for_test;
|
||||
use core_test_support::responses::ev_completed;
|
||||
use core_test_support::responses::ev_completed_with_tokens;
|
||||
use core_test_support::responses::ev_message_item_added;
|
||||
use core_test_support::responses::ev_output_text_delta;
|
||||
use core_test_support::responses::ev_response_created;
|
||||
use core_test_support::responses::mount_sse_once;
|
||||
use core_test_support::responses::mount_sse_once_match;
|
||||
@@ -1787,6 +1789,64 @@ async fn context_window_error_sets_total_tokens_to_model_window() -> anyhow::Res
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn incomplete_response_emits_content_filter_error_message() -> anyhow::Result<()> {
|
||||
skip_if_no_network!(Ok(()));
|
||||
let server = MockServer::start().await;
|
||||
|
||||
let incomplete_response = sse(vec![
|
||||
ev_response_created("resp_incomplete"),
|
||||
ev_message_item_added("msg_incomplete", "partial content"),
|
||||
ev_output_text_delta("continued chunk"),
|
||||
json!({
|
||||
"type": "response.incomplete",
|
||||
"response": {
|
||||
"id": "resp_incomplete",
|
||||
"object": "response",
|
||||
"status": "incomplete",
|
||||
"error": null,
|
||||
"incomplete_details": {
|
||||
"reason": "content_filter"
|
||||
}
|
||||
}
|
||||
}),
|
||||
]);
|
||||
|
||||
let responses_mock = mount_sse_once(&server, incomplete_response).await;
|
||||
|
||||
let TestCodex { codex, .. } = test_codex()
|
||||
.with_config(|config| {
|
||||
config.model_provider.stream_max_retries = Some(0);
|
||||
})
|
||||
.build(&server)
|
||||
.await?;
|
||||
codex
|
||||
.submit(Op::UserInput {
|
||||
items: vec![UserInput::Text {
|
||||
text: "trigger incomplete".into(),
|
||||
text_elements: Vec::new(),
|
||||
}],
|
||||
final_output_json_schema: None,
|
||||
})
|
||||
.await?;
|
||||
|
||||
let error_event = wait_for_event(&codex, |ev| matches!(ev, EventMsg::Error(_))).await;
|
||||
assert!(
|
||||
matches!(
|
||||
error_event,
|
||||
EventMsg::Error(ref err)
|
||||
if err.message
|
||||
== "stream disconnected before completion: Incomplete response returned, reason: content_filter"
|
||||
),
|
||||
"expected incomplete content filter error; got {error_event:?}"
|
||||
);
|
||||
|
||||
assert_eq!(responses_mock.requests().len(), 1);
|
||||
|
||||
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn azure_overrides_assign_properties_used_for_responses_url() {
|
||||
skip_if_no_network!();
|
||||
|
||||
Reference in New Issue
Block a user