SandboxApplyPatchTool splits patch lines with str.splitlines(), so a form feed or 
 in a line breaks Add/Update File

已关闭 适合新手
#5,349 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

@abhishekacharya200 已经在做这个了。

开始于 2026年10月11日。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
78/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
python
领域
tooling

调研方向

从 src/agents/sandbox/capabilities/tools/apply_patch_tool.py 中的 _parse_apply_patch_input 开始,将其分行方式与在 LF 处结束行的 Lark grammar 进行比较。然后检查 agents/apply_diff.py,它也按 "\n" 分割。验证 Add File 内容是否保留列出的字符,以及 Update File 复现案例是否将 const n = 1 改为 const n = 2。

由索引模型根据 Issue 内容生成。

描述

Please read this first
  • Have you read the docs? Agents SDK docs
  • Have you searched for related issues? Others may have faced similar issues.
Describe the bug

SandboxApplyPatchTool parses the freeform patch with raw_input.splitlines() (_parse_apply_patch_input in src/agents/sandbox/capabilities/tools/apply_patch_tool.py). str.splitlines() also breaks at \v, \f, \x1c-\x1e, \x85, \u2028, \u2029 and a bare \r. The tool's own Lark grammar only ends a line at LF: add_line: "+" /(.*)/ LF and change_line: ("+" | "-" | " ") /(.*)/ LF. agents/apply_diff.py also splits on "\n".

So a patch the grammar accepts is rejected when any line contains one of those characters. For example, a form feed between sections of a Python or C file, or a \u2028 inside a JS string or pasted text:

  • *** Add File: fails with Invalid Add File line: <rest of the line>, and the file is not created.
  • *** Update File: turns the rest of the line into an unprefixed diff line, and apply_diff fails with Invalid Line: <rest of the line>. This happens even when the character is only in a context line.

Splitting the envelope on "\n", as the grammar and apply_diff do, makes both cases work. In the repro below, the same hunk applies cleanly once it is split that way.

Debug information
  • Agents SDK version: main at 125efa0 (0.23.1)
  • Python version: 3.12.3
  • Operating system: Linux
  • Model and model provider: n/a (the parser is called directly)
  • Does the issue reproduce with the latest Agents SDK release? Yes. v0.23.1 has the same splitlines() call and grammar; I ran the repro on main (125efa0).
  • Does the issue occur consistently or intermittently? Consistently
'+page one\x0cpage two' -> Invalid Add File line: page two
'+const s = "a\u2028b";' -> Invalid Add File line: b";
'+x\x85y' -> Invalid Add File line: y
parsed diff: '@@\n const s = "a\nb";\n-const n = 1;\n+const n = 2;\n'
apply_diff -> Invalid Line: b";
'const s = "a\u2028b";\nconst n = 2;\n'
Repro steps
from agents.apply_diff import apply_diff
from agents.sandbox.capabilities.tools import SandboxApplyPatchTool
from agents.testing import scripted_sandbox_session

tool = SandboxApplyPatchTool(session=scripted_sandbox_session())

# 1. Add File: the grammar's add_line is "+" /(.*)/ LF, so these lines are valid input.
for line in ["+page one\fpage two", '+const s = "a\u2028b";', "+x\x85y"]:
    patch = f"*** Begin Patch\n*** Add File: notes.txt\n{line}\n*** End Patch\n"
    try:
        tool.parse_custom_input(patch)
        print(ascii(line), "-> parsed")
    except ValueError as e:
        print(ascii(line), "->", e)

# 2. Update File whose context line contains U+2028.
original = 'const s = "a\u2028b";\nconst n = 1;\n'
patch = (
    "*** Begin Patch\n*** Update File: app.js\n@@\n"
    ' const s = "a\u2028b";\n-const n = 1;\n+const n = 2;\n*** End Patch\n'
)
(op,) = tool.parse_custom_input(patch)
print("parsed diff:", ascii(op.diff))
try:
    apply_diff(original, op.diff)
except ValueError as e:
    print("apply_diff ->", e)

# The same hunk, split on "\n" only, applies cleanly.
print(ascii(apply_diff(original, '@@\n const s = "a\u2028b";\n-const n = 1;\n+const n = 2;\n')))
Expected behavior

The three Add File patches create files whose content keeps the form feed, \u2028 and \x85. The Update File patch changes const n = 1; to const n = 2;, which is what apply_diff produces when the hunk is split on "\n" only.

主要语言
Python
星标
30.4k
派生
4.9k
平均合并
16 小时 32 分钟
30 天内合并 PR
85

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

openai/openai-agents-python 的其他 Issue

查看 openai/openai-agents-python 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。