Import AITURK IDE 1.0.0-beta.1 from Hermes 63279301; preserve MIT license
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
"""patch V4A provider gate (#95681).
|
||||
|
||||
V4A is the OpenAI apply_patch dialect; the dual-mode schema taxed every
|
||||
non-OpenAI session ~149 tok/call for a format their models weren't
|
||||
trained on. Base schema = replace-only (mode gone, path/old/new required);
|
||||
the V4A layer renders only for OpenAI-family mains. Handler accepts both
|
||||
shapes from any model (replay compat; mode defaults to replace).
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", ".."))
|
||||
|
||||
import tools.file_tools as ft
|
||||
|
||||
|
||||
def _family(prov, model):
|
||||
with patch("agent.auxiliary_client._read_main_provider", return_value=prov), \
|
||||
patch("agent.auxiliary_client._read_main_model", return_value=model):
|
||||
return ft._is_openai_family_main()
|
||||
|
||||
|
||||
def _override(prov, model):
|
||||
with patch("agent.auxiliary_client._read_main_provider", return_value=prov), \
|
||||
patch("agent.auxiliary_client._read_main_model", return_value=model):
|
||||
return ft._patch_schema_overrides()
|
||||
|
||||
|
||||
class TestPatchV4AGate(unittest.TestCase):
|
||||
def test_family_detector(self):
|
||||
for prov, model, want in [
|
||||
("openai", "gpt-5.2", True),
|
||||
("openai-codex", "codex-large", True),
|
||||
("azure-openai", "deploy-x", True),
|
||||
("openrouter", "openai/gpt-5.2", True),
|
||||
("nous", "openai/o5-mini", True),
|
||||
("openrouter", "anthropic/claude-sonnet-4", False),
|
||||
("anthropic", "claude-fable-5", False),
|
||||
("nous", "hermes-4-405b", False),
|
||||
("", "", False),
|
||||
]:
|
||||
self.assertEqual(_family(prov, model), want, (prov, model))
|
||||
|
||||
def test_base_schema_is_replace_only(self):
|
||||
props = ft.PATCH_SCHEMA["parameters"]["properties"]
|
||||
self.assertNotIn("mode", props)
|
||||
self.assertNotIn("patch", props)
|
||||
self.assertEqual(ft.PATCH_SCHEMA["parameters"]["required"],
|
||||
["path", "old_string", "new_string"])
|
||||
self.assertNotIn("V4A", ft.PATCH_SCHEMA["description"])
|
||||
|
||||
def test_openai_family_gets_v4a_layer(self):
|
||||
o = _override("openai", "gpt-5.2")
|
||||
self.assertIn("V4A", o["description"])
|
||||
self.assertIn("mode", o["parameters"]["properties"])
|
||||
self.assertIn("patch", o["parameters"]["properties"])
|
||||
self.assertEqual(o["parameters"]["required"], ["mode"])
|
||||
|
||||
def test_non_openai_gets_no_override(self):
|
||||
self.assertEqual(_override("anthropic", "claude-fable-5"), {})
|
||||
|
||||
def test_handler_accepts_both_shapes_regardless(self):
|
||||
"""Wire compat: replace works without mode; V4A applies even from
|
||||
sessions whose schema never advertised it."""
|
||||
work = tempfile.mkdtemp(prefix="v4a_t_")
|
||||
f1 = os.path.join(work, "a.txt")
|
||||
open(f1, "w").write("alpha beta\n")
|
||||
r = json.loads(ft.patch_tool(path=f1, old_string="beta", new_string="B"))
|
||||
self.assertFalse(r.get("error"), r)
|
||||
v4a = (
|
||||
"*** Begin Patch\n"
|
||||
f"*** Update File: {f1}\n@@\n-alpha B\n+A B\n"
|
||||
"*** End Patch"
|
||||
)
|
||||
r = json.loads(ft.patch_tool(mode="patch", patch=v4a))
|
||||
self.assertFalse(r.get("error"), r)
|
||||
self.assertEqual(open(f1).read().strip(), "A B")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user