Kopru: bos donen adim kabul edilmez, siradaki katman yapar

Ne yazi ne arac cagrisi iceren yanit (hata olayi dahil) cevap diye
verilmiyor; secili modelde de katmanda da siradaki katmana geciliyor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yilsemandClaude Opus 5.5 committed 2026-10-11 10:03:40 +03:00
1 parent 77504b9aa4
commit ff53cafb5c
2 files changed
+20 -10

No files matched your search

+7 -10
View File
@@ -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, 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.""" tag)). Son katmanin cevabi sorulmadan akar. Beklerken SSE yorum satiri gider ki Codex akisi kopmus saymasin."""
self._akis_basligi(resp, resp.status) 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): def w(b):
if b: if b:
@@ -908,14 +908,12 @@ class H(http.server.BaseHTTPRequestHandler):
gecmedi = jev_denetim.karar(puan) gecmedi = jev_denetim.karar(puan)
log(f"{tag} katman denetimi: ret={puan['ret']:.2f} sart={puan['sart']:.2f} -> " 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)") f"{'GECMEDI' if gecmedi else 'gecti'} ({time.time() - t0:.1f} sn, {len(metin)} karakter)")
elif katmanda: elif b'_call"' not in b"".join(parcalar):
# Katman cevap yerine hata dondurduyse (or. arac cagrisi desteklemeyen model "upstream 400") # Bos adim: ne yazi var ne arac cagrisi (hata olayi da boyledir, or. "upstream 400"). Kabul
# acilamamis sayilir; hata cevap diye verilirse Codex ayni adimi bastan dener ve tur cevapsiz kalir. # edilmez, siradaki katman yapar; bos yanit cevap diye verilirse Codex adimi bastan dener.
govde = b"".join(parcalar) gecmedi = True
if (b"event: error" in govde or b'"type":"error"' in govde or b'"type": "error"' in govde log(f"{tag} katman denetimi: bos adim (yazi da komut da yok), siradakine geciliyor: "
or b"response.failed" in govde): f"{b''.join(parcalar)[-200:]!r}")
gecmedi = True
log(f"{tag} katman denetimi: katman hata dondurdu, siradakine geciliyor: {govde[-200:]!r}")
yeni = None yeni = None
while gecmedi and kalan and yeni is None: while gecmedi and kalan and yeni is None:
ad = kalan.pop(0) ad = kalan.pop(0)
@@ -926,7 +924,6 @@ class H(http.server.BaseHTTPRequestHandler):
if yeni is None: if yeni is None:
break break
resp, rewriter, tag = yeni resp, rewriter, tag = yeni
katmanda = True
log(f"{tag} katman denetimi: adim bu katmana verildi") log(f"{tag} katman denetimi: adim bu katmana verildi")
if not kalan: if not kalan:
return self._stream(resp, resp.status, tag, rewriter, izle, basliksiz=True) return self._stream(resp, resp.status, tag, rewriter, izle, basliksiz=True)
@@ -218,6 +218,19 @@ class Akis(unittest.TestCase):
self.assertEqual(self.sent(), body) self.assertEqual(self.sent(), body)
self.assertEqual(self.asked, []) 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): def test_unreachable_jev_keeps_the_answer(self):
self.puanlar = [None] self.puanlar = [None]
body = sse("Bunu yapamam.") body = sse("Bunu yapamam.")