fix(codex-link): use member OmniRoute catalog and metadata ordering
This commit is contained in:
1 parent
88e660768c
commit
6e91154f15
8 files changed
+151
-45
No files matched your search
@@ -6,9 +6,8 @@ anahtar IDE'nin kendi .env dosyasindan her yenilemede okunur, bridge.json'a yazi
|
||||
Ac/kapat: %LOCALAPPDATA%\\TurkServis\\AITURK-IDE\\codex-baglama.json
|
||||
{"enabled": true, "kapsam": "ide"}
|
||||
Dosya yoksa ACIK sayilir (kullanici karari, 9 Ekim 2026: varsayilan acik).
|
||||
kapsam "ide" : IDE ayarinda tanimli modeller + 9Router'a eklenmis saglayicilarin modelleri +
|
||||
adlandirilmis combolar (varsayilan)
|
||||
kapsam "hepsi" : gecitteki butun sohbet modelleri (1000+; Codex listesi cok buyur)
|
||||
kapsam "ide" ve "hepsi": gecidin uye katalogundaki OmniRoute sohbet modelleri.
|
||||
Yerel config'teki model adlari uye katalogunu sinirlamaz.
|
||||
"""
|
||||
import json, os, re, urllib.request
|
||||
|
||||
@@ -125,10 +124,10 @@ def adlandir(girdiler, dolu=()):
|
||||
return sonuc
|
||||
|
||||
|
||||
def sec(data, tanimli, kapsam="ide"):
|
||||
"""Gecit katalogundan Codex'e eklenecek girdiler: [{'id','ad'}], sirali ve tekrarsiz.
|
||||
def sec(data, tanimli=(), kapsam="ide", turler=None):
|
||||
"""Gecidin uye katalogundan girdiler: [{'id','ad','kind'}], sirali ve tekrarsiz.
|
||||
Yalniz sohbet modelleri; resim/ses/video/embedding uretenler eklenmez."""
|
||||
tanimli = {a.lower() for a in tanimli if a}
|
||||
turler = turler or {}
|
||||
secilen, gorulen = [], set()
|
||||
for m in data:
|
||||
mid = m.get("id") or ""
|
||||
@@ -136,20 +135,16 @@ def sec(data, tanimli, kapsam="ide"):
|
||||
if not mid or mid in gorulen or "chat" not in (ts.get("capabilities") or ["chat"]):
|
||||
continue
|
||||
gorunen = ts.get("display_name") or mid
|
||||
kisa = gorunen.split(" · ")[-1].strip()
|
||||
combo = "/" not in kisa # saglayici/model bicimi degil: adlandirilmis combo ya da takma ad
|
||||
# 9Router'dan gelen combolar Codex'te gosterilmez (kullanici karari, 9 Ekim 2026): dogrudan
|
||||
# 9Router kaynagi ve gecidin "9router" saglayicisi uzerinden gelen kopyalari.
|
||||
if combo and (ts.get("source") == "9router" or mid.lower().startswith("9router-")):
|
||||
kind = turler.get(mid) or ts.get("kind") or "model"
|
||||
# Tek uye yolu: 9Router -> OmniRoute -> TurkServis -> Codex.
|
||||
# Dogrudan 9Router satirlari ayni modelin ikinci kopyasi olarak eklenmez.
|
||||
if ts.get("source") != "omniroute":
|
||||
continue
|
||||
# 9Router'a eklenmis saglayicilarin tekil modelleri her zaman eklenir (kullanici karari, 9 Ekim 2026:
|
||||
# "9Router'in combosu olmasin dedim, 9Router'in modeli olsun"). Ayni modelin OmniRoute uzerinden
|
||||
# gelen kopyasi yalniz IDE ayarinda tanimliysa eklenir; boylece her model listede bir kez durur.
|
||||
dokuz_model = not combo and ts.get("source") == "9router"
|
||||
if kapsam != "hepsi" and not combo and not dokuz_model and kisa.lower() not in tanimli and mid.lower() not in tanimli:
|
||||
# Combo adi biciminden tahmin edilmez; duz adli Agnes/Bekci modelleri de vardir.
|
||||
if kind == "combo" and mid.lower().startswith("9router-"):
|
||||
continue
|
||||
gorulen.add(mid)
|
||||
secilen.append({"id": mid, "ad": gorunen, "sira": ts.get("order") or 0})
|
||||
secilen.append({"id": mid, "ad": gorunen, "kind": kind, "sira": ts.get("order") or 0})
|
||||
secilen.sort(key=lambda s: (s["sira"], s["id"]))
|
||||
# Gecit ayni adin ikinci yoluna "ad (2)" der; birincisi listede yoksa sayac anlamsizdir.
|
||||
adlar = {s["ad"].split(" · ")[-1].strip().lower() for s in secilen}
|
||||
@@ -158,7 +153,38 @@ def sec(data, tanimli, kapsam="ide"):
|
||||
if taban != s["ad"] and taban.split(" · ")[-1].strip().lower() not in adlar:
|
||||
adlar.add(taban.split(" · ")[-1].strip().lower())
|
||||
s["ad"] = taban
|
||||
return [{"id": s["id"], "ad": s["ad"]} for s in secilen]
|
||||
return [{"id": s["id"], "ad": s["ad"], "kind": s["kind"]} for s in secilen]
|
||||
|
||||
|
||||
def sirala_codex(modeller, ekler):
|
||||
"""Tum listeyi siralar: combo A-Z, sonra saglayici A-Z / model A-Z.
|
||||
Kimlik ve yetenek alanlari korunur; kayitli model secimine dokunulmaz.
|
||||
Codex'in isDefault etiketi kendi davranisi geregi ilk gorunur satira verilir."""
|
||||
bilgiler = {m["slug"]: m for m in ekler}
|
||||
|
||||
def anahtar(m):
|
||||
slug = m.get("slug", "")
|
||||
bilgi = bilgiler.get(slug, {})
|
||||
ad = kisa_ad(m.get("display_name") or slug)
|
||||
if ad.startswith(DOKUZ_ISARET):
|
||||
ad = ad[len(DOKUZ_ISARET):]
|
||||
if bilgi.get("kind") == "combo":
|
||||
return (0, ad.casefold(), "", slug)
|
||||
if slug.startswith("ide/"):
|
||||
mid = slug[len("ide/"):]
|
||||
if mid.startswith("9router-"):
|
||||
mid = mid[len("9router-"):]
|
||||
saglayici, _, model = ad.partition("/")
|
||||
if not model:
|
||||
saglayici, _, _ = mid.partition("-")
|
||||
model = ad
|
||||
else:
|
||||
saglayici, model = "OpenAI", ad
|
||||
return (1, saglayici.casefold(), model.casefold(), slug)
|
||||
|
||||
modeller.sort(key=anahtar)
|
||||
for n, model in enumerate(modeller):
|
||||
model["priority"] = n
|
||||
|
||||
|
||||
def yukle(ua="AstraBridge/1.0 (codex)", timeout=30):
|
||||
@@ -172,5 +198,19 @@ def yukle(ua="AstraBridge/1.0 (codex)", timeout=30):
|
||||
return "anahtar-yok", "", "", []
|
||||
base, varsayilan, adlar = ide_yapilandirma()
|
||||
req = urllib.request.Request(base + "/models", headers={"Authorization": f"Bearer {anahtar}", "User-Agent": ua})
|
||||
data = json.load(urllib.request.urlopen(req, timeout=timeout)).get("data", [])
|
||||
return "tamam", base, anahtar, sec(data, adlar + [varsayilan], ayar["kapsam"])
|
||||
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
||||
data = json.load(resp).get("data")
|
||||
if not isinstance(data, list) or not data:
|
||||
raise ValueError("Gecit bos veya gecersiz model katalogu dondurdu")
|
||||
req = urllib.request.Request(base + "/router/catalog", headers={"Authorization": f"Bearer {anahtar}", "User-Agent": ua})
|
||||
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
||||
metadata = json.load(resp).get("models")
|
||||
if not isinstance(metadata, list) or not metadata:
|
||||
raise ValueError("Gecit model turlerini dondurmedi")
|
||||
# Bu ucta uye listesinde olmayan ic kayitlar da bulunur. Yalniz tur bilgisi alinir;
|
||||
# modele erisim listesi her zaman /models yanitidir.
|
||||
turler = {m["id"]: m["kind"] for m in metadata if m.get("id") and m.get("kind") in ("combo", "model")}
|
||||
girdiler = sec(data, adlar + [varsayilan], ayar["kapsam"], turler)
|
||||
if not girdiler:
|
||||
raise ValueError("Gecitte kullanilabilir OmniRoute sohbet modeli yok")
|
||||
return "tamam", base, anahtar, girdiler
|
||||
Reference in new issue
Block a user