mirror of
https://github.com/openai/codex.git
synced 2026-05-23 12:34:25 +00:00
Add exclude output to streamed Responses requests
This commit is contained in:
@@ -179,6 +179,8 @@ pub struct ResponsesApiRequest {
|
||||
pub store: bool,
|
||||
pub stream: bool,
|
||||
pub include: Vec<String>,
|
||||
#[serde(skip_serializing_if = "Vec::is_empty")]
|
||||
pub exclude: Vec<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub service_tier: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
@@ -203,6 +205,7 @@ impl From<&ResponsesApiRequest> for ResponseCreateWsRequest {
|
||||
store: request.store,
|
||||
stream: request.stream,
|
||||
include: request.include.clone(),
|
||||
exclude: request.exclude.clone(),
|
||||
service_tier: request.service_tier.clone(),
|
||||
prompt_cache_key: request.prompt_cache_key.clone(),
|
||||
text: request.text.clone(),
|
||||
@@ -227,6 +230,8 @@ pub struct ResponseCreateWsRequest {
|
||||
pub store: bool,
|
||||
pub stream: bool,
|
||||
pub include: Vec<String>,
|
||||
#[serde(skip_serializing_if = "Vec::is_empty")]
|
||||
pub exclude: Vec<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub service_tier: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
|
||||
@@ -331,6 +331,7 @@ async fn streaming_client_retries_on_transport_error() -> Result<()> {
|
||||
store: false,
|
||||
stream: true,
|
||||
include: Vec::new(),
|
||||
exclude: Vec::new(),
|
||||
service_tier: None,
|
||||
prompt_cache_key: None,
|
||||
text: None,
|
||||
@@ -432,6 +433,7 @@ async fn azure_default_store_attaches_ids_and_headers() -> Result<()> {
|
||||
store: true,
|
||||
stream: true,
|
||||
include: Vec::new(),
|
||||
exclude: Vec::new(),
|
||||
service_tier: None,
|
||||
prompt_cache_key: None,
|
||||
text: None,
|
||||
|
||||
@@ -760,6 +760,7 @@ impl ModelClient {
|
||||
store: provider.is_azure_responses_endpoint(),
|
||||
stream: true,
|
||||
include,
|
||||
exclude: vec!["output".to_string()],
|
||||
service_tier,
|
||||
prompt_cache_key,
|
||||
text,
|
||||
|
||||
@@ -22,6 +22,7 @@ fn serializes_text_verbosity_when_set() {
|
||||
store: false,
|
||||
stream: true,
|
||||
include: vec![],
|
||||
exclude: vec![],
|
||||
prompt_cache_key: None,
|
||||
service_tier: None,
|
||||
text: Some(TextControls {
|
||||
@@ -69,6 +70,7 @@ fn serializes_text_schema_with_strict_format() {
|
||||
store: false,
|
||||
stream: true,
|
||||
include: vec![],
|
||||
exclude: vec![],
|
||||
prompt_cache_key: None,
|
||||
service_tier: None,
|
||||
text: Some(text_controls),
|
||||
@@ -130,6 +132,7 @@ fn omits_text_when_not_set() {
|
||||
store: false,
|
||||
stream: true,
|
||||
include: vec![],
|
||||
exclude: vec![],
|
||||
prompt_cache_key: None,
|
||||
service_tier: None,
|
||||
text: None,
|
||||
@@ -140,6 +143,30 @@ fn omits_text_when_not_set() {
|
||||
assert!(v.get("text").is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn omits_exclude_when_not_set() {
|
||||
let req = ResponsesApiRequest {
|
||||
model: "gpt-5.1".to_string(),
|
||||
instructions: "i".to_string(),
|
||||
input: vec![],
|
||||
tools: vec![],
|
||||
tool_choice: "auto".to_string(),
|
||||
parallel_tool_calls: true,
|
||||
reasoning: None,
|
||||
store: false,
|
||||
stream: true,
|
||||
include: vec![],
|
||||
exclude: vec![],
|
||||
prompt_cache_key: None,
|
||||
service_tier: None,
|
||||
text: None,
|
||||
client_metadata: None,
|
||||
};
|
||||
|
||||
let v = serde_json::to_value(&req).expect("json");
|
||||
assert!(v.get("exclude").is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn serializes_flex_service_tier_when_set() {
|
||||
let req = ResponsesApiRequest {
|
||||
@@ -153,6 +180,7 @@ fn serializes_flex_service_tier_when_set() {
|
||||
store: false,
|
||||
stream: true,
|
||||
include: vec![],
|
||||
exclude: vec![],
|
||||
prompt_cache_key: None,
|
||||
service_tier: Some(ServiceTier::Flex.to_string()),
|
||||
text: None,
|
||||
|
||||
@@ -23,6 +23,8 @@ use codex_model_provider_info::create_oss_provider_with_base_url;
|
||||
use codex_otel::SessionTelemetry;
|
||||
use codex_protocol::SessionId;
|
||||
use codex_protocol::ThreadId;
|
||||
use codex_protocol::config_types::ReasoningSummary as ReasoningSummaryConfig;
|
||||
use codex_protocol::models::BaseInstructions;
|
||||
use codex_protocol::models::ContentItem;
|
||||
use codex_protocol::models::ResponseItem;
|
||||
use codex_protocol::openai_models::ModelInfo;
|
||||
@@ -123,6 +125,43 @@ fn test_session_telemetry() -> SessionTelemetry {
|
||||
)
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn build_responses_request_excludes_completed_output() {
|
||||
let session = test_model_client(SessionSource::Cli).new_session();
|
||||
let prompt = super::Prompt {
|
||||
input: Vec::new(),
|
||||
tools: Vec::new(),
|
||||
parallel_tool_calls: false,
|
||||
base_instructions: BaseInstructions {
|
||||
text: "base instructions".to_string(),
|
||||
},
|
||||
personality: None,
|
||||
output_schema: None,
|
||||
output_schema_strict: false,
|
||||
};
|
||||
let provider = session
|
||||
.client
|
||||
.state
|
||||
.provider
|
||||
.api_provider()
|
||||
.await
|
||||
.expect("resolve api provider");
|
||||
|
||||
let request = session
|
||||
.client
|
||||
.build_responses_request(
|
||||
&provider,
|
||||
&prompt,
|
||||
&test_model_info(),
|
||||
/*effort*/ None,
|
||||
ReasoningSummaryConfig::None,
|
||||
/*service_tier*/ None,
|
||||
)
|
||||
.expect("build responses request");
|
||||
|
||||
assert_eq!(request.exclude, vec!["output".to_string()]);
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct TagCollectorVisitor {
|
||||
tags: BTreeMap<String, String>,
|
||||
|
||||
@@ -68,6 +68,10 @@ async fn responses_mode_stream_cli() {
|
||||
|
||||
let request = resp_mock.single_request();
|
||||
assert_eq!(request.path(), "/v1/responses");
|
||||
assert_eq!(
|
||||
request.body_json()["exclude"],
|
||||
serde_json::json!(["output"])
|
||||
);
|
||||
|
||||
// TODO(jif) fix
|
||||
// // Verify a new session rollout was created and is discoverable via list_conversations
|
||||
|
||||
Reference in New Issue
Block a user