diff --git a/apps/desktop/assets/codex-bridge/kopru.py b/apps/desktop/assets/codex-bridge/kopru.py index ffb8698..ae9041a 100644 --- a/apps/desktop/assets/codex-bridge/kopru.py +++ b/apps/desktop/assets/codex-bridge/kopru.py @@ -876,7 +876,7 @@ class H(http.server.BaseHTTPRequestHandler): Gecerse oldugu gibi verilir; gecmezse atilir ve ayni adimi siradaki katman yapar (ac(ad): (resp, rewriter, tag)). Son katmanin cevabi sorulmadan akar. Beklerken SSE yorum satiri gider ki Codex akisi kopmus saymasin.""" self._akis_basligi(resp, resp.status) - kalan, son_yazi, katmanda = list(sira), time.time(), False + kalan, son_yazi = list(sira), time.time() def w(b): if b: @@ -908,14 +908,12 @@ class H(http.server.BaseHTTPRequestHandler): gecmedi = jev_denetim.karar(puan) log(f"{tag} katman denetimi: ret={puan['ret']:.2f} sart={puan['sart']:.2f} -> " f"{'GECMEDI' if gecmedi else 'gecti'} ({time.time() - t0:.1f} sn, {len(metin)} karakter)") - elif katmanda: - # Katman cevap yerine hata dondurduyse (or. arac cagrisi desteklemeyen model "upstream 400") - # acilamamis sayilir; hata cevap diye verilirse Codex ayni adimi bastan dener ve tur cevapsiz kalir. - govde = b"".join(parcalar) - if (b"event: error" in govde or b'"type":"error"' in govde or b'"type": "error"' in govde - or b"response.failed" in govde): - gecmedi = True - log(f"{tag} katman denetimi: katman hata dondurdu, siradakine geciliyor: {govde[-200:]!r}") + elif b'_call"' not in b"".join(parcalar): + # Bos adim: ne yazi var ne arac cagrisi (hata olayi da boyledir, or. "upstream 400"). Kabul + # edilmez, siradaki katman yapar; bos yanit cevap diye verilirse Codex adimi bastan dener. + gecmedi = True + log(f"{tag} katman denetimi: bos adim (yazi da komut da yok), siradakine geciliyor: " + f"{b''.join(parcalar)[-200:]!r}") yeni = None while gecmedi and kalan and yeni is None: ad = kalan.pop(0) @@ -926,7 +924,6 @@ class H(http.server.BaseHTTPRequestHandler): if yeni is None: break resp, rewriter, tag = yeni - katmanda = True log(f"{tag} katman denetimi: adim bu katmana verildi") if not kalan: return self._stream(resp, resp.status, tag, rewriter, izle, basliksiz=True) diff --git a/apps/desktop/assets/codex-bridge/test_jev_denetim.py b/apps/desktop/assets/codex-bridge/test_jev_denetim.py index 6539225..9a81486 100644 --- a/apps/desktop/assets/codex-bridge/test_jev_denetim.py +++ b/apps/desktop/assets/codex-bridge/test_jev_denetim.py @@ -218,6 +218,19 @@ class Akis(unittest.TestCase): 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 + self.assertEqual(self.asked, ["iki"]) # nothing to ask about the empty step itself + self.assertEqual(self.opened, ["Katman-2"]) + self.assertEqual(self.sent(), self.cevap["Katman-2"]) + + def test_an_empty_layer_goes_on_to_the_one_after_it(self): + self.puanlar = [{"ret": 0.9, "sart": 0.0}] + self.cevap["Katman-2"] = sse() + self.calistir(sse("hayir")) + self.assertEqual(self.opened, ["Katman-2", "Katman-3"]) + self.assertEqual(self.sent(), self.cevap["Katman-3"]) + def test_unreachable_jev_keeps_the_answer(self): self.puanlar = [None] body = sse("Bunu yapamam.")