From 8fbbe226db280210052e04255e34ca3edafe1e16 Mon Sep 17 00:00:00 2001 From: yilsem Date: Sun, 11 Oct 2026 10:43:00 +0300 Subject: [PATCH] Kopru: son katmanin dondurdugu oldugu gibi gider, sarmalayici yok Co-Authored-By: Claude Opus 5.5 --- apps/desktop/assets/codex-bridge/kopru.py | 14 +++++--------- .../assets/codex-bridge/test_jev_denetim.py | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/apps/desktop/assets/codex-bridge/kopru.py b/apps/desktop/assets/codex-bridge/kopru.py index 0a3c731..1249d49 100644 --- a/apps/desktop/assets/codex-bridge/kopru.py +++ b/apps/desktop/assets/codex-bridge/kopru.py @@ -882,7 +882,7 @@ class H(http.server.BaseHTTPRequestHandler): self.end_headers() else: self._akis_basligi(resp, resp.status) - kalan, son_yazi, son_hata = list(sira), time.time(), "" + kalan, son_yazi, son_govde = list(sira), time.time(), b"" def w(b): if b: @@ -930,9 +930,8 @@ class H(http.server.BaseHTTPRequestHandler): try: yeni = ac(ad) except Exception as e: - govde = e.read().decode("utf-8", "replace") if hasattr(e, "read") else "" - son_hata = f"{ad}: {e} {govde}".strip() - log(f"{tag} katman denetimi: {ad} acilamadi ({son_hata[:300]})") + son_govde = e.read() if hasattr(e, "read") else b"" + log(f"{tag} katman denetimi: {ad} acilamadi ({type(e).__name__}: {e} {son_govde[:200]!r})") if yeni is None: break resp, rewriter, tag = yeni @@ -940,11 +939,8 @@ class H(http.server.BaseHTTPRequestHandler): if not kalan: return self._stream(resp, resp.status, tag, rewriter, izle, basliksiz=True) if gecmedi: - # Siradakine gecilen adimda onceki model bir sey soyleyemez: son katmanin kendi hatasi gider. - log(f"{tag} katman denetimi: son katman da acilamadi, onun hatasi veriliyor") - olay = {"type": "response.failed", "response": {"id": "resp_astrabridge_katman", "object": "response", - "status": "failed", "output": [], "error": {"code": "katman_hatasi", "message": son_hata}}} - w(b"event: response.failed\ndata: " + json.dumps(olay, ensure_ascii=False).encode("utf-8") + b"\n\n") + # Son katman ne dondurduyse o gider, hicbir sey eklenmez; dondurmediyse hicbir sey gitmez. + w(son_govde) else: for chunk in parcalar: if izle is not None: diff --git a/apps/desktop/assets/codex-bridge/test_jev_denetim.py b/apps/desktop/assets/codex-bridge/test_jev_denetim.py index bb7f50c..377ee98 100644 --- a/apps/desktop/assets/codex-bridge/test_jev_denetim.py +++ b/apps/desktop/assets/codex-bridge/test_jev_denetim.py @@ -263,8 +263,18 @@ class Akis(unittest.TestCase): self.calistir(sse("Bunu yapamam.")) self.assertEqual(self.opened, ["Katman-2", "Katman-3", "Katman-4"]) self.assertNotIn(b"yapamam", self.h.wfile.getvalue()) - self.assertIn(b"response.failed", self.sent()) - self.assertIn(b"Katman-4: acilamadi", self.sent()) # the last layer's own error reaches the user + self.assertEqual(self.sent(), b"") # the last layer said nothing: nothing is added + + def test_the_last_layers_own_error_body_is_delivered_untouched(self): + class Hata(Exception): + def read(self): + return b'{"error": {"message": "katman 4 hatasi"}}' + self.puanlar = [{"ret": 0.9, "sart": 0.0}] + + def ac(ad): + raise Hata("HTTP 400") + self.h._denetimli_akis(Yanit(sse("Bunu yapamam.")), "[1]", None, None, "yap", ["Katman-4"], ac) + self.assertEqual(self.sent(), b'{"error": {"message": "katman 4 hatasi"}}') def test_unreachable_jev_keeps_the_answer(self): self.puanlar = [None]