mirror of
https://github.com/openai/codex.git
synced 2026-11-12 21:20:34 +00:00
## What changed - Default `features.api_key_cyber_access_programs` to `true` and allow `codex exec` to select Daybreak with an OpenAI API key. Select the advertised standard program when `daybreak=false`, while respecting explicit feature opt-outs. - Resolve API-key eligibility for TUI background turns from the target thread's feature settings, including project opt-outs. Omit access-program overrides when the server cannot report those settings. - Preserve automatic server treatment for unlisted models and missing or empty Cyber program metadata in exec and TUI. Continue rejecting Daybreak when a nonempty program list does not offer it. ## Testing Update regression coverage for API-key Daybreak selection, the off override, explicit opt-outs, resumed sessions, target-thread settings, and missing model metadata. GitOrigin-RevId: f3cf7bd95a2754d4b4281bc70b18c7da4b177552
142 lines
3.9 KiB
Rust
142 lines
3.9 KiB
Rust
use super::*;
|
|
use codex_protocol::openai_models::ModelAccessPrograms;
|
|
use pretty_assertions::assert_eq;
|
|
|
|
#[test]
|
|
fn turn_program_uses_catalog_and_preserves_legacy_models() {
|
|
let mut model = crate::test_support::TEST_MODEL_PRESETS[0].clone();
|
|
model.available_access_programs = Some(ModelAccessPrograms {
|
|
cyber: vec![
|
|
CyberAccessProgram::Standard,
|
|
CyberAccessProgram::DaybreakBlue,
|
|
],
|
|
});
|
|
let models = vec![model.clone()];
|
|
for (name, enabled, expected) in [
|
|
(
|
|
model.model.as_str(),
|
|
true,
|
|
Some(CyberAccessProgram::DaybreakBlue),
|
|
),
|
|
(
|
|
model.model.as_str(),
|
|
false,
|
|
Some(CyberAccessProgram::Standard),
|
|
),
|
|
("unlisted-model", false, None),
|
|
("unlisted-model", true, None),
|
|
] {
|
|
assert_eq!(
|
|
program_for_turn(&models, name, /*eligible_account*/ true, enabled),
|
|
Ok(expected)
|
|
);
|
|
}
|
|
assert!(
|
|
program_for_turn(
|
|
&models,
|
|
&model.model,
|
|
/*eligible_account*/ false,
|
|
/*enabled*/ true
|
|
)
|
|
.is_err()
|
|
);
|
|
for (programs, rejects) in [
|
|
(None, false),
|
|
(Some(vec![]), false),
|
|
(Some(vec![CyberAccessProgram::Standard]), true),
|
|
] {
|
|
model.available_access_programs = programs.map(|cyber| ModelAccessPrograms { cyber });
|
|
let result = program_for_turn(
|
|
std::slice::from_ref(&model),
|
|
&model.model,
|
|
/*eligible_account*/ true,
|
|
/*enabled*/ true,
|
|
);
|
|
if rejects {
|
|
assert!(result.is_err());
|
|
} else {
|
|
assert_eq!(result, Ok(None));
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn refusal_guidance_uses_the_model_catalog() {
|
|
let mut model = crate::test_support::TEST_MODEL_PRESETS[0].clone();
|
|
model.available_access_programs = Some(ModelAccessPrograms {
|
|
cyber: vec![CyberAccessProgram::Standard],
|
|
});
|
|
for (name, expected) in [
|
|
("gpt-5.6-sol", Notice::Apply),
|
|
("gpt-6-astra", Notice::Astra),
|
|
("gpt-6-astra-wm", Notice::Astra),
|
|
] {
|
|
model.model = name.into();
|
|
assert_eq!(
|
|
notice_for_setting(
|
|
std::slice::from_ref(&model),
|
|
name,
|
|
/*enabled*/ false,
|
|
/*can_enable_daybreak*/ true,
|
|
),
|
|
expected
|
|
);
|
|
}
|
|
model
|
|
.available_access_programs
|
|
.as_mut()
|
|
.unwrap()
|
|
.cyber
|
|
.push(CyberAccessProgram::DaybreakBlue);
|
|
assert_eq!(
|
|
notice_for_setting(
|
|
std::slice::from_ref(&model),
|
|
&model.model,
|
|
/*enabled*/ false,
|
|
/*can_enable_daybreak*/ true,
|
|
),
|
|
Notice::Disabled
|
|
);
|
|
assert_eq!(
|
|
notice_for_setting(
|
|
std::slice::from_ref(&model),
|
|
&model.model,
|
|
/*enabled*/ true,
|
|
/*can_enable_daybreak*/ true,
|
|
),
|
|
Notice::Enabled
|
|
);
|
|
model.available_access_programs.as_mut().unwrap().cyber =
|
|
vec![CyberAccessProgram::DaybreakBlue];
|
|
assert_eq!(
|
|
notice_for_setting(
|
|
std::slice::from_ref(&model),
|
|
&model.model,
|
|
/*enabled*/ false,
|
|
/*can_enable_daybreak*/ true
|
|
),
|
|
Notice::Disabled
|
|
);
|
|
let other = model.clone();
|
|
model.model = "gpt-5.6-sol".into();
|
|
model.available_access_programs.as_mut().unwrap().cyber = vec![CyberAccessProgram::Standard];
|
|
assert_eq!(
|
|
notice_for_setting(
|
|
&[model.clone(), other],
|
|
&model.model,
|
|
/*enabled*/ false,
|
|
/*can_enable_daybreak*/ true
|
|
),
|
|
Notice::Apply
|
|
);
|
|
assert_eq!(
|
|
notice_for_setting(
|
|
&[],
|
|
"gpt-6-astra",
|
|
/*enabled*/ false,
|
|
/*can_enable_daybreak*/ true
|
|
),
|
|
Notice::Apply
|
|
);
|
|
}
|