Katman-2 Codex isteginde hata olayi donduruyor, kopru bunu cevap diye gonderiyor ve Codex ayni adimi bastan deneyip turu cevapsiz birakiyordu. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
127 lines
5.2 KiB
Python
127 lines
5.2 KiB
Python
"""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. Herhangi bir model Jev'e gelirse Jev bunu
|
|
gecirmezse 1.Katmana yonlendirecek. 1.Katman combosu gecmezse 2.Katmana, 2.Katman gecmezse 3.Katmana, 3.Katman
|
|
gecmezse 4.Katmana. 4.Katman combosu gelirse Jev bunu sorgulamadan gecirecek."
|
|
|
|
Yani denetim secili modelin katman olup olmamasina bakmaz: kopruye ugrayan her ek modelin cevabi denetlenir.
|
|
Gecmezse adimi sirayla Katman-1 -> Katman-2 -> Katman-3 -> Katman-4 yapar; secili model zaten bir katmansa
|
|
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.
|
|
"""
|
|
import json
|
|
import os
|
|
import re
|
|
import urllib.request
|
|
|
|
ADRES = "https://api.typesafe.ai/v1/systemone"
|
|
MODEL = "jev-1.13.0"
|
|
KATMAN = ("Katman-1", "Katman-2", "Katman-3", "Katman-4")
|
|
ESIK = {"ret": 0.5, "sart": 0.7}
|
|
SURE = 6.0
|
|
EN_COK_ISTEK = 3000
|
|
EN_COK_CEVAP = 6000
|
|
SORU = {
|
|
"ret": ("The assistant did NOT do what the user asked or did NOT answer the user's question: it refused, declined, "
|
|
"said it cannot or will not, avoided giving the requested judgment, or redirected to a different topic."),
|
|
"sart": ("The assistant changed the request on its own: it added its own conditions, softened or relabeled what was "
|
|
"asked, or left part of it out, instead of doing exactly what the user asked."),
|
|
}
|
|
_ANAHTAR = {"okundu": False, "deger": ""}
|
|
|
|
|
|
def sonrakiler(hedef):
|
|
"""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 "")
|
|
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):
|
|
"""TypeSafe anahtari: ortam degiskeni, sonra ~/.typesafe/typesafe.env. Yoksa ""."""
|
|
ortam = os.environ if ortam is None else ortam
|
|
deger = str(ortam.get("TYPESAFE_API_KEY") or "").strip()
|
|
if deger:
|
|
return deger
|
|
if dosyalar is None:
|
|
if _ANAHTAR["okundu"]:
|
|
return _ANAHTAR["deger"]
|
|
dosyalar = [os.path.join(os.path.expanduser("~"), ".typesafe", "typesafe.env")]
|
|
onbellek = True
|
|
else:
|
|
onbellek = False
|
|
for yol in dosyalar:
|
|
try:
|
|
with open(yol, encoding="utf-8", errors="replace") as f:
|
|
for satir in f:
|
|
m = re.match(r"^\s*TYPESAFE_API_KEY\s*=\s*(.*)$", satir)
|
|
if m:
|
|
deger = m.group(1).strip().strip('"').strip("'")
|
|
break
|
|
except OSError:
|
|
continue
|
|
if deger:
|
|
break
|
|
if onbellek:
|
|
_ANAHTAR.update(okundu=True, deger=deger)
|
|
return deger
|
|
|
|
|
|
def _metin(oge):
|
|
icerik = oge.get("content")
|
|
if isinstance(icerik, str):
|
|
return icerik
|
|
return "".join(str(p.get("text") or "") for p in icerik or [] if isinstance(p, dict))
|
|
|
|
|
|
def son_istek(req):
|
|
"""Kullanicinin bu turdaki istegi: son kullanici mesaji. Sesli aktarimda yalniz <input> icindeki soz;
|
|
baska sarmalli sistem mesajlari (kanca baglami) atlanir."""
|
|
for oge in reversed(req.get("input") or []):
|
|
if not (isinstance(oge, dict) and oge.get("type", "message") == "message" and oge.get("role") == "user"):
|
|
continue
|
|
metin = _metin(oge).strip()
|
|
m = re.search(r"<realtime_delegation>.*?<input>(.*?)</input>", metin, re.S)
|
|
if m:
|
|
return m.group(1).strip()[:EN_COK_ISTEK]
|
|
if metin and not metin.startswith("<"):
|
|
return metin[:EN_COK_ISTEK]
|
|
return ""
|
|
|
|
|
|
def _kisalt(metin, sinir):
|
|
if len(metin) <= sinir:
|
|
return metin
|
|
bas = sinir * 2 // 3
|
|
return metin[:bas] + "\n[...]\n" + metin[-(sinir - bas):]
|
|
|
|
|
|
def _gonder(govde, key, sure):
|
|
istek = urllib.request.Request(ADRES, data=json.dumps(govde).encode("utf-8"), method="POST",
|
|
headers={"Authorization": "Bearer " + key, "Content-Type": "application/json"})
|
|
with urllib.request.urlopen(istek, timeout=sure) as yanit:
|
|
return json.load(yanit)
|
|
|
|
|
|
def sor(istek, cevap, key, sure=SURE, gonder=_gonder):
|
|
"""Jev'e sorar. Donus: {"ret", "sart"} olasiliklari | None (sorulamadi)."""
|
|
govde = {"model": MODEL, "state": {"user_request": istek, "assistant_reply": _kisalt(cevap, EN_COK_CEVAP)},
|
|
"questions": {k: {"type": "noul", "instructions": v} for k, v in SORU.items()}}
|
|
try:
|
|
yanitlar = (gonder(govde, key, sure) or {}).get("answers") or {}
|
|
return {k: float(yanitlar[k]["noul"]) for k in SORU}
|
|
except Exception:
|
|
return None
|
|
|
|
|
|
def karar(puan):
|
|
"""True: adim gecmez, sonraki katman yapar. Istisna yok."""
|
|
return puan["ret"] >= ESIK["ret"] or puan["sart"] >= ESIK["sart"]
|