feat(codex-bridge): natural model command, spelled-out names, any gateway model, clear miss
ci / mobile-link-windows (push) Canceled after 0s
ci / approval-gate-windows (push) Canceled after 0s

Live voice chat 01a12804: the user said "Seed iki nokta bir turbo yap" (no "modeli", name spelled out) and the
model was in the gateway but not in Codex's list; the main model then promised the bridge would do it.
A sentence ending in a command verb whose name fits exactly one model is now a command, single letters are
joined, a name missing from Codex's list is looked up in the gateway's full model list, and an explicit
command whose name fits nothing is answered by the bridge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
yilsemandClaude Opus 5.5 committed 2026-10-11 01:58:58 +03:00
1 parent 8a612beba7
commit a46ff51019
3 files changed
+92 -5

No files matched your search

@@ -120,11 +120,42 @@ def _sayilari_cevir(kelimeler):
return cikti
DOLGU = {"evet", "tamam", "hadi", "peki", "tabii", "hayir", "yani", "sey", "ee", "eee", "hmm", "olur", "simdi"}
def _harfleri_birlestir(kelimeler):
"""Harf harf soylenen ad tek sozcuk olur: "s e e d iki nokta bir turbo" -> "seed iki nokta bir turbo"."""
cikti, harfler = [], []
for k in kelimeler + [""]:
if len(k) == 1 and k.isalpha():
harfler.append(k)
continue
if len(harfler) >= 3:
cikti.append("".join(harfler))
else:
cikti.extend(harfler)
harfler = []
if k:
cikti.append(k)
# Ad hem heceleyerek hem duz soylendiyse ("seed s e e d ...") tekrar atilir.
return [k for i, k in enumerate(cikti) if i == 0 or k != cikti[i - 1]]
def komut_coz(metin):
"""None | {"tur": "gec", "ad": [parcalar]} | {"tur": "sor"}."""
kelimeler = re.findall(r"[a-z0-9]+", duz(metin))
if not kelimeler or len(kelimeler) > EN_COK_KELIME or not any(k.startswith("model") for k in kelimeler):
kelimeler = _harfleri_birlestir(re.findall(r"[a-z0-9]+", duz(metin)))
if not kelimeler or len(kelimeler) > EN_COK_KELIME:
return None
if not any(k.startswith("model") for k in kelimeler):
# "modeli" denmeden soylenen komut ("Seed iki nokta bir turbo yap", "gemini flash low'a gec"): yalniz cumle
# bir komut fiiliyle bitiyorsa ve ad bir modele TAM uyuyorsa komut sayilir (kesin=False: cagiran, ad
# bulunamazsa mesaji komut saymaz, modele birakir).
if any(k.startswith(OLUMSUZ) for k in kelimeler) or kelimeler[-1] not in FIILLER or len(kelimeler) > 9:
return None
kelimeler = _sayilari_cevir(kelimeler)
ad = [TAKMA.get(k, k) for k in kelimeler[:-1] if k not in ATLA and k not in DOLGU]
ad = [p for k in ad for p in re.findall(r"[a-z]+|\d+", k)]
return {"tur": "gec", "ad": ad, "kesin": False} if len(ad) >= 2 else None
if len(kelimeler) <= 8 and any(k in SORU for k in kelimeler):
return {"tur": "sor"} if any(k in SORU_ISARETI for k in kelimeler) else None
if any(k.startswith(OLUMSUZ) for k in kelimeler):
@@ -135,10 +166,10 @@ def komut_coz(metin):
if all(k in DEVAM_EKI for k in kelimeler[son_fiil + 1:]):
kelimeler = kelimeler[:son_fiil + 1]
kelimeler = _sayilari_cevir(kelimeler)
ad = [TAKMA.get(k, k) for k in kelimeler if k not in ATLA and k not in fiil]
ad = [TAKMA.get(k, k) for k in kelimeler if k not in ATLA and k not in fiil and k not in DOLGU]
ad = [p for k in ad for p in re.findall(r"[a-z]+|\d+", k)]
# Ad soylenmemis ("modeli değiştir", "başka modele geç"): degisiklik yok, nasil soylenecegi anlatilir.
return {"tur": "gec", "ad": ad} if ad else {"tur": "nasil"}
return {"tur": "gec", "ad": ad, "kesin": True} if ad else {"tur": "nasil"}
return None