mirror of
https://github.com/openai/codex.git
synced 2026-10-22 17:58:46 +00:00
Add recovery guidance to content-filter retries (#49119)
## Why Responses stopped by `content_filter` previously followed generic stream-error retry handling without guidance about the block. Retried requests need instructions to explain the limitation and offer a permitted alternative. ## What changed - Recognize content-filter failures as a distinct error while preserving retryability and the existing public error representation. - Append developer guidance to the conversation after each sampling block, retaining delivered output and using the existing retry handling. - Support a model catalog override through `model_messages.content_filter_guidance`. Missing, null, blank, or values exceeding 512 UTF-8 bytes fall back to bundled guidance. - The bundled guidance tells the model to avoid reproducing or working around blocked content, briefly explain the limitation, offer a permitted alternative, and continue unrelated authorized work. ## Testing Add a scenario and request-history snapshot covering repeated blocks, catalog guidance on each retry, retained partial output, and eventual completion. Add error-mapping assertions for retryability, public error classification, and error text. GitOrigin-RevId: ba0c201b3a5a3acf5cfa971332027240e0690225
This commit is contained in:
@@ -11,6 +11,7 @@ use crate::compact::InitialContextInjection;
|
||||
use crate::compact::run_inline_auto_compact_task;
|
||||
use crate::compact_remote_v2::run_inline_remote_auto_compact_task as run_inline_remote_auto_compact_task_v2;
|
||||
use crate::connectors;
|
||||
use crate::context::ContentFilterGuidance;
|
||||
use crate::context::ContextualUserFragment;
|
||||
use crate::context::UserVerificationNotice;
|
||||
use crate::environment_selection::TurnEnvironmentSnapshot;
|
||||
@@ -1697,15 +1698,33 @@ async fn run_sampling_request(
|
||||
|
||||
let original_input = original_input.get_or_insert(prompt.input);
|
||||
|
||||
let retry = handle_response_stream_error(
|
||||
&mut retry_state,
|
||||
max_retries,
|
||||
err,
|
||||
client_session,
|
||||
&sess,
|
||||
&turn_context,
|
||||
ResponsesStreamRequest::Sampling,
|
||||
)
|
||||
let retry = async {
|
||||
if matches!(err.details(), CodexErrorDetails::ContentFilter) {
|
||||
let model_info = &step_context.settings.model_info;
|
||||
let guidance = ContentFilterGuidance {
|
||||
text: codex_prompts::ResolvedModelMessages::from_model(model_info)
|
||||
.content_filter_guidance()
|
||||
.to_string(),
|
||||
};
|
||||
sess.record_conversation_items(
|
||||
&turn_context,
|
||||
model_info,
|
||||
&[ContextualUserFragment::into(guidance)],
|
||||
)
|
||||
.await;
|
||||
}
|
||||
|
||||
handle_response_stream_error(
|
||||
&mut retry_state,
|
||||
max_retries,
|
||||
err,
|
||||
client_session,
|
||||
&sess,
|
||||
&turn_context,
|
||||
ResponsesStreamRequest::Sampling,
|
||||
)
|
||||
.await
|
||||
}
|
||||
.or_cancel(&preempt)
|
||||
.or_cancel(&cancellation_token)
|
||||
.await?;
|
||||
|
||||
Reference in New Issue
Block a user