Make transformed tool required order deterministic (#4564) (#4665)

(cherry picked from commit 7934124fb5)

Co-authored-by: Marcelo Trylesinski <marcelotryle@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Jeremiah Lowin 2026-07-27 13:11:04 -04:00 committed by GitHub
commit 49c5ed5581
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 24 additions and 2 deletions

View file

@ -41,6 +41,23 @@ def test_tool_from_tool_no_change(add_tool):
assert new_tool.description == add_tool.description
def test_transformed_tool_required_order_is_deterministic():
"""`required` must follow property order, not set iteration order.
Set iteration order varies with PYTHONHASHSEED, which broke snapshot
tests of tools/list output across processes.
"""
def fn(alpha: int, beta: str, gamma: float, delta: bool, epsilon: int) -> str:
return "x"
base = Tool.from_function(fn)
transformed = Tool.from_tool(base, transform_args={"alpha": ArgTransform(name="a")})
props = list(transformed.parameters["properties"])
assert transformed.parameters["required"] == props
assert props == ["a", "beta", "gamma", "delta", "epsilon"]
def test_from_tool_accepts_decorated_function():
@tool
def search(q: str, limit: int = 10) -> list[str]: