Files
codex/prs/bolinfest/PR-2186.md
2025-09-02 15:17:45 -07:00

2.7 KiB

PR #2186: [apply-patch] Support applypatch command string

Description

Summary

GPT-OSS and gpt-5-mini have training artifacts that cause the models to occasionally use applypatch instead of apply_patch. I think long-term we'll want to provide apply_patch as a first class tool, but for now let's silently handle this case to avoid hurting model performance

Testing

  • Added unit test

Full Diff

diff --git a/codex-rs/apply-patch/src/lib.rs b/codex-rs/apply-patch/src/lib.rs
index 61b1b68f9e..262d219d6d 100644
--- a/codex-rs/apply-patch/src/lib.rs
+++ b/codex-rs/apply-patch/src/lib.rs
@@ -82,8 +82,9 @@ pub struct ApplyPatchArgs {
 }
 
 pub fn maybe_parse_apply_patch(argv: &[String]) -> MaybeApplyPatch {
+    const APPLY_PATCH_COMMANDS: [&str; 2] = ["apply_patch", "applypatch"];
     match argv {
-        [cmd, body] if cmd == "apply_patch" => match parse_patch(body) {
+        [cmd, body] if APPLY_PATCH_COMMANDS.contains(&cmd.as_str()) => match parse_patch(body) {
             Ok(source) => MaybeApplyPatch::Body(source),
             Err(e) => MaybeApplyPatch::PatchParseError(e),
         },
@@ -722,6 +723,31 @@ mod tests {
         }
     }
 
+    #[test]
+    fn test_literal_applypatch() {
+        let args = strs_to_strings(&[
+            "applypatch",
+            r#"*** Begin Patch
+*** Add File: foo
++hi
+*** End Patch
+"#,
+        ]);
+
+        match maybe_parse_apply_patch(&args) {
+            MaybeApplyPatch::Body(ApplyPatchArgs { hunks, patch: _ }) => {
+                assert_eq!(
+                    hunks,
+                    vec![Hunk::AddFile {
+                        path: PathBuf::from("foo"),
+                        contents: "hi\n".to_string()
+                    }]
+                );
+            }
+            result => panic!("expected MaybeApplyPatch::Body got {result:?}"),
+        }
+    }
+
     #[test]
     fn test_heredoc() {
         let args = strs_to_strings(&[

Review Comments

codex-rs/apply-patch/src/lib.rs

@@ -82,8 +82,9 @@ pub struct ApplyPatchArgs {
 }
 
 pub fn maybe_parse_apply_patch(argv: &[String]) -> MaybeApplyPatch {
+    const APPLY_PATCH_COMMANDS: [&str; 2] = ["apply_patch", "applypatch"];

This should have a comment (and ideally to link to a GitHub issue or something with more information) that explains why we are accepting applypatch. Ideally, it would also provide guidance about criteria for when we should stop recognizing applypatch.