Skip to content

Commit 7f113c5

Browse files
author
kyluke mcdougall
committed
fix(codex): add required instructions field for Codex API
The Codex API requires an instructions field. Extract system messages from session to use as instructions, with a default fallback.
1 parent 91a70f5 commit 7f113c5

1 file changed

Lines changed: 33 additions & 16 deletions

File tree

src/llm/openai/service/codex.rs

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,37 @@ const DEFAULT_CODEX_MODEL: &str = "gpt-4o";
1717

1818
/// Chat using the Codex API with OAuth authentication
1919
pub async fn chat(access_token: &str, session: &mut Session, model_param: Option<&str>) -> Result<()> {
20-
eprintln!("Codex: model parameter received: {:?}", model_param);
2120
let model = model_param.unwrap_or(DEFAULT_CODEX_MODEL).to_string();
22-
eprintln!("Codex: Using model: {}", model);
2321

24-
// Convert session messages to Codex format
25-
let messages: Vec<CodexMessage> = session
26-
.messages
27-
.iter()
28-
.map(|m| CodexMessage {
29-
role: m.role.to_string(),
30-
content: m.content.clone(),
31-
})
32-
.collect();
22+
// Extract system messages for instructions, and non-system messages for input
23+
let mut instructions: Option<String> = None;
24+
let mut chat_messages: Vec<CodexMessage> = Vec::new();
25+
26+
for m in &session.messages {
27+
if m.role == Role::System {
28+
// Combine system messages into instructions
29+
if let Some(ref mut inst) = instructions {
30+
inst.push_str("\n\n");
31+
inst.push_str(&m.content);
32+
} else {
33+
instructions = Some(m.content.clone());
34+
}
35+
} else {
36+
chat_messages.push(CodexMessage {
37+
role: m.role.to_string(),
38+
content: m.content.clone(),
39+
});
40+
}
41+
}
42+
43+
// Provide default instructions if none found
44+
let instructions = instructions.unwrap_or_else(|| {
45+
"You are a helpful AI assistant.".to_string()
46+
});
3347

3448
// Check total input size
35-
let total_input_size: usize = messages.iter().map(|m| m.content.len()).sum();
49+
let total_input_size: usize = chat_messages.iter().map(|m| m.content.len()).sum::<usize>()
50+
+ instructions.len();
3651

3752
if total_input_size > 500_000 {
3853
return Err(anyhow!(
@@ -41,11 +56,13 @@ pub async fn chat(access_token: &str, session: &mut Session, model_param: Option
4156
));
4257
}
4358

44-
// Create the request
45-
let request = if messages.len() == 1 && messages[0].role == "user" {
46-
CodexRequest::simple(model, messages[0].content.clone())
59+
// Create the request with instructions
60+
let request = if chat_messages.len() == 1 && chat_messages[0].role == "user" {
61+
CodexRequest::simple(model, chat_messages[0].content.clone())
62+
.with_instructions(instructions)
4763
} else {
48-
CodexRequest::from_messages(model, messages)
64+
CodexRequest::from_messages(model, chat_messages)
65+
.with_instructions(instructions)
4966
};
5067

5168
// Make the request

0 commit comments

Comments
 (0)