feat(codex-bridge): Jev checks every added model, routing a block to Katman-1 first

Any added model's answer is now checked, not just the layer combos; a blocked
answer falls to Katman-1, then 2, 3, 4. A selected layer only tries the ones
after it; Katman-4 is delivered unasked. Layer fallbacks always open through
the AITURK gateway, which hosts the combos, whatever route the model used.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
yilsemandClaude Opus 4.8 committed 2026-10-11 09:15:59 +03:00
1 parent be0b33e89b
commit 11bbaddcc7
3 files changed
+44 -17

No files matched your search

@@ -1,12 +1,15 @@
"""Katman denetimi: Jev, katman combosunun her adimdaki cevabini gecirir ya da gecirmez (11 Ekim 2026). """Katman denetimi: Jev, katman combosunun her adimdaki cevabini gecirir ya da gecirmez (11 Ekim 2026).
Kullanici karari (11 Ekim 2026): "Jev kati olsun. Af yok istisna yok. 1.Katman combosu Jev'e gelirse Jev bunu Kullanici karari (11 Ekim 2026): "Jev kati olsun. Af yok istisna yok. Herhangi bir model Jev'e gelirse Jev bunu
gecirmezse 2.Katmana yonlendirecek. 2.Katman gecmezse 3.Katmana, 3.Katman gecmezse 4.Katmana. 4.Katman combosu gecirmezse 1.Katmana yonlendirecek. 1.Katman combosu gecmezse 2.Katmana, 2.Katman gecmezse 3.Katmana, 3.Katman
gelirse Jev bunu sorgulamadan gecirecek." gecmezse 4.Katmana. 4.Katman combosu gelirse Jev bunu sorgulamadan gecirecek."
Katmanlar OmniRoute combolaridir (KATMAN); kopru onlari yalniz adiyla cagirir. Jev (TypeSafe System One) metin Yani denetim secili modelin katman olup olmamasina bakmaz: kopruye ugrayan her ek modelin cevabi denetlenir.
uretmez, sorulan evet/hayir sorularina olasilik verir. Kural tektir ve istisnasi yoktur: cevap istegi yapmiyorsa Gecmezse adimi sirayla Katman-1 -> Katman-2 -> Katman-3 -> Katman-4 yapar; secili model zaten bir katmansa
(ret) ya da sormadan kendi sartlariyla degistiriyorsa (sart) adim gecmez ve ayni adimi bir sonraki katman yapar. yalniz ondan sonrakiler denenir. Katmanlar OmniRoute combolaridir (KATMAN); kopru onlari yalniz adiyla cagirir.
Jev (TypeSafe System One) metin uretmez, sorulan evet/hayir sorularina olasilik verir. Kural tektir ve istisnasi
yoktur: cevap istegi yapmiyorsa (ret) ya da sormadan kendi sartlariyla degistiriyorsa (sart) adim gecmez.
Metni olmayan (yalniz arac cagiran) adimda sorulacak cevap yoktur. Jev'e ulasilamazsa cevap oldugu gibi verilir. Metni olmayan (yalniz arac cagiran) adimda sorulacak cevap yoktur. Jev'e ulasilamazsa cevap oldugu gibi verilir.
""" """
import json import json
@@ -37,9 +40,14 @@ _ANAHTAR = {"okundu": False, "deger": ""}
def sonrakiler(hedef): def sonrakiler(hedef):
"""Bu katmandan sonra sirayla denenecek katmanlar. Son katman ve katman olmayan model icin bos: Jev'e sorulmaz.""" """Jev gecirmezse sirayla denenecek katmanlar. Secili model bir katmansa ondan sonrakiler; katman degilse
butun katmanlar bastan (once Katman-1). Son katman (Katman-4) kendisi gelince bos doner: sorgulanmadan gecer."""
ad = str(hedef or "") ad = str(hedef or "")
return list(KATMAN[KATMAN.index(ad) + 1:]) if ad in KATMAN else [] if not ad or ad == KATMAN[-1]:
return []
if ad in KATMAN:
return list(KATMAN[KATMAN.index(ad) + 1:])
return list(KATMAN)
def anahtar(ortam=None, dosyalar=None): def anahtar(ortam=None, dosyalar=None):
+12 -5
View File
@@ -1568,19 +1568,26 @@ class H(http.server.BaseHTTPRequestHandler):
open(os.path.join(LOGDIR, f"{n:04d}_req.json"), "wb").write(data) open(os.path.join(LOGDIR, f"{n:04d}_req.json"), "wb").write(data)
hdrs = {"Authorization": f"Bearer {route['key']}", "Content-Type": "application/json", "Accept": "text/event-stream", "User-Agent": UA} hdrs = {"Authorization": f"Bearer {route['key']}", "Content-Type": "application/json", "Accept": "text/event-stream", "User-Agent": UA}
last = None last = None
# Katman denetimi (jev_denetim.py): Katman-1..3 cevabini Jev gecirmezse adimi siradaki katman yapar. # Katman denetimi (jev_denetim.py): kopruye ugrayan HER ek modelin cevabi Jev'e sorulur; gecmezse adim
# Katman-4 ve katman olmayan modeller sorulmaz. # sirayla Katman-1 -> 2 -> 3 -> 4 yapar (secili model zaten katmansa ondan sonrakiler). Katman-4 sorulmadan
jev_sira = [] if ozet_tetik or rewriter is None or not jev_denetim.anahtar() else jev_denetim.sonrakiler(target) # gecer. Katmanlar OmniRoute combolaridir: yedek her zaman AITURK gecidi (ide_route) uzerinden acilir,
# secili model baska bir rotada olsa bile. Gecit yoksa denetim yapilmaz. Ozet isteginde ve aracsiz
# (rewriter yok) yolda kapalidir.
jev_rota = ROUTES.get(ide_route)
jev_sira = ([] if ozet_tetik or rewriter is None or jev_rota is None or not jev_denetim.anahtar()
else jev_denetim.sonrakiler(target))
jev_istek = jev_denetim.son_istek(req) if jev_sira else "" jev_istek = jev_denetim.son_istek(req) if jev_sira else ""
def jev_ac(ad): def jev_ac(ad):
katman_req = json.loads(data) katman_req = json.loads(data)
katman_req["model"] = ad katman_req["model"] = ad
jev_hdrs = {"Authorization": f"Bearer {jev_rota['key']}", "Content-Type": "application/json",
"Accept": "text/event-stream", "User-Agent": UA}
yanit = urllib.request.urlopen(urllib.request.Request( yanit = urllib.request.urlopen(urllib.request.Request(
route["url"], data=json.dumps(katman_req, ensure_ascii=False).encode("utf-8"), headers=hdrs, method="POST"), jev_rota["url"], data=json.dumps(katman_req, ensure_ascii=False).encode("utf-8"), headers=jev_hdrs, method="POST"),
timeout=UPSTREAM_IDLE_TIMEOUT) timeout=UPSTREAM_IDLE_TIMEOUT)
return (yanit, SseRewriter(custom, hedef=ad, tasma=self._tasma_ogren, aracsiz=self._aracsiz_ogren), return (yanit, SseRewriter(custom, hedef=ad, tasma=self._tasma_ogren, aracsiz=self._aracsiz_ogren),
f"[{n} {route_name.upper()} {slug}=>{ad}]") f"[{n} {slug}=>{ad}]")
# A 9Router combo (Fusion-*, no provider prefix) runs a whole panel upstream. Once it may # A 9Router combo (Fusion-*, no provider prefix) runs a whole panel upstream. Once it may
# have started (timeout, 504, cut stream) resending it runs and bills it twice (28 Sep 2026); # have started (timeout, 504, cut stream) resending it runs and bills it twice (28 Sep 2026);
# only failures before the work starts (no connection, 500/502/503/529) are retried. # only failures before the work starts (no connection, 500/502/503/529) are retried.
@@ -59,14 +59,19 @@ class Karar(unittest.TestCase):
class Katman(unittest.TestCase): class Katman(unittest.TestCase):
def test_chain(self): def test_a_non_layer_model_falls_through_every_layer_from_the_top(self):
self.assertEqual(jev_denetim.sonrakiler("Uncensored-Uygulama"),
["Katman-1", "Katman-2", "Katman-3", "Katman-4"])
self.assertEqual(jev_denetim.sonrakiler("ide/some-model"),
["Katman-1", "Katman-2", "Katman-3", "Katman-4"])
def test_a_selected_layer_only_tries_the_ones_after_it(self):
self.assertEqual(jev_denetim.sonrakiler("Katman-1"), ["Katman-2", "Katman-3", "Katman-4"]) self.assertEqual(jev_denetim.sonrakiler("Katman-1"), ["Katman-2", "Katman-3", "Katman-4"])
self.assertEqual(jev_denetim.sonrakiler("Katman-2"), ["Katman-3", "Katman-4"]) self.assertEqual(jev_denetim.sonrakiler("Katman-2"), ["Katman-3", "Katman-4"])
self.assertEqual(jev_denetim.sonrakiler("Katman-3"), ["Katman-4"]) self.assertEqual(jev_denetim.sonrakiler("Katman-3"), ["Katman-4"])
def test_last_layer_and_other_models_are_not_asked(self): def test_last_layer_is_never_asked(self):
self.assertEqual(jev_denetim.sonrakiler("Katman-4"), []) self.assertEqual(jev_denetim.sonrakiler("Katman-4"), [])
self.assertEqual(jev_denetim.sonrakiler("Uncensored-Uygulama"), [])
self.assertEqual(jev_denetim.sonrakiler(None), []) self.assertEqual(jev_denetim.sonrakiler(None), [])
@@ -134,7 +139,7 @@ class Akis(unittest.TestCase):
self.h.send_response = Mock() self.h.send_response = Mock()
self.h.send_header = Mock() self.h.send_header = Mock()
self.h.end_headers = Mock() self.h.end_headers = Mock()
self.cevap = {"Katman-2": sse("iki"), "Katman-3": sse("uc"), "Katman-4": sse("dort")} self.cevap = {"Katman-1": sse("bir"), "Katman-2": sse("iki"), "Katman-3": sse("uc"), "Katman-4": sse("dort")}
def sor(self, istek, metin, key): def sor(self, istek, metin, key):
self.asked.append(metin) self.asked.append(metin)
@@ -167,6 +172,13 @@ class Akis(unittest.TestCase):
self.assertEqual(self.asked, ["Fenerbahçe'nin 13 puanı var."]) self.assertEqual(self.asked, ["Fenerbahçe'nin 13 puanı var."])
self.assertEqual(self.opened, []) self.assertEqual(self.opened, [])
def test_a_blocked_non_layer_model_goes_to_layer_1_first(self):
self.puanlar = [{"ret": 0.9, "sart": 0.0}] # the selected (non-layer) model is blocked
self.calistir(sse("Bunu yapamam."), sira=("Katman-1", "Katman-2", "Katman-3", "Katman-4"))
self.assertEqual(self.sent(), self.cevap["Katman-1"])
self.assertEqual(self.opened, ["Katman-1"])
self.assertEqual(self.asked, ["Bunu yapamam.", "bir"])
def test_blocked_layer_1_goes_to_layer_2_which_is_checked_too(self): def test_blocked_layer_1_goes_to_layer_2_which_is_checked_too(self):
self.puanlar = [{"ret": 0.9, "sart": 0.0}] self.puanlar = [{"ret": 0.9, "sart": 0.0}]
self.calistir(sse("Bunu yapamam.")) self.calistir(sse("Bunu yapamam."))