fix(codex-bridge): preserve tool model and stream preparation without Jev fallback

This commit is contained in:
yilsem committed 2026-10-11 15:51:43 +03:00
1 parent 8fbbe226db
commit 3726d2a553
6 files changed
+118 -14

No files matched your search

@@ -127,6 +127,7 @@ class Akis(unittest.TestCase):
sahte.sor = self.sor
sahte.karar = jev_denetim.karar
sahte.komutlar = jev_denetim.komutlar
sahte.hazirlik_mi = jev_denetim.hazirlik_mi
env = {"jev_denetim": sahte, "yarim": yarim, "time": time, "http": __import__("http.client"),
"log": self.logs.append, "RESP_HOP": set(), "json": json}
adlar = ("_akis_basligi", "_denetimli_akis", "_stream")
@@ -216,17 +217,56 @@ class Akis(unittest.TestCase):
KOMUT = (b'event: response.output_item.done\ndata: {"type": "response.output_item.done", "item": '
b'{"type": "function_call", "name": "shell", "arguments": "{\\"cmd\\": \\"dir\\"}"}}\n\n')
def test_a_step_without_text_is_asked_with_its_tool_calls(self):
def test_a_step_without_text_passes_without_jev(self):
body = self.KOMUT + sse()
self.calistir(body)
self.assertEqual(self.sent(), body)
self.assertEqual(self.asked, ['[komut] shell: {"cmd": "dir"}'])
self.assertEqual(self.asked, [])
self.assertEqual(self.opened, [])
def test_a_blocked_step_without_text_goes_to_the_next_layer(self):
def test_tool_step_cannot_be_replaced_even_if_jev_would_refuse(self):
self.puanlar = [{"ret": 0.9, "sart": 0.0}]
self.calistir(self.KOMUT + sse())
self.assertEqual(self.opened, ["Katman-2"])
self.assertEqual(self.sent(), self.cevap["Katman-2"])
body = self.KOMUT + sse()
self.calistir(body)
self.assertEqual(self.opened, [])
self.assertEqual(self.asked, [])
self.assertEqual(self.sent(), body)
def test_tool_event_reaches_client_before_upstream_finishes(self):
first = (b'data: {"type":"response.output_item.added","item":'
b'{"type":"function_call","name":"shell","arguments":""}}\n\n')
owner = self
class Streaming(Yanit):
def __init__(self):
super().__init__(b'')
self.parts = [first, owner.KOMUT + sse()]
self.reads = 0
def read1(self, n):
self.reads += 1
if self.reads == 2:
owner.assertIn(first, owner.h.wfile.getvalue())
owner.assertEqual(owner.asked, [])
owner.assertEqual(owner.opened, [])
return super().read1(n)
self.h._denetimli_akis(Streaming(), '[1]', None, None, 'yap', ['Katman-1'], self.ac)
self.assertEqual(self.sent(), first + self.KOMUT + sse())
def test_text_with_a_tool_call_is_preparation_not_a_final_refusal(self):
body = sse('Önce dosyaları inceleyeceğim.') + self.KOMUT
self.calistir(body)
self.assertEqual(self.sent(), body)
self.assertEqual(self.asked, [])
self.assertEqual(self.opened, [])
def test_explicit_commentary_passes_without_jev(self):
body = (b'data: {"type":"response.output_item.added","item":'
b'{"type":"message","role":"assistant","phase":"commentary"}}\n\n' + sse('Araştırıyorum.'))
self.calistir(body)
self.assertEqual(self.sent(), body)
self.assertEqual(self.asked, [])
def test_an_empty_step_of_the_selected_model_goes_to_the_next_layer(self):
self.calistir(sse()) # no text, no tool call