Codex only received combos and the models named in the IDE config, so none of the models behind the providers added to 9Router showed up. Those single models are now always added; 9Router's combos stay hidden. The copy of the same model that comes through OmniRoute is still added only when the IDE config names it, so each model is listed once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HRDGW1LiKcDUZYUdKBoWYW
108 lines
6.2 KiB
Python
108 lines
6.2 KiB
Python
import json, os, tempfile, unittest
|
|
import ide_catalog as c
|
|
|
|
|
|
def girdi(mid, ad, yetenek=("chat",), sira=0, kaynak="omniroute"):
|
|
return {"id": mid, "turkservis": {"display_name": ad, "capabilities": list(yetenek), "order": sira, "source": kaynak}}
|
|
|
|
|
|
KATALOG = [
|
|
girdi("Ajan-Arac", "OmniRoute · Ajan-Arac", sira=5),
|
|
girdi("9router-cc-opus", "OmniRoute · cc/claude-opus-5-5", sira=2),
|
|
girdi("9router-nano-x", "OmniRoute · nano/x", sira=1),
|
|
girdi("gorsel", "OmniRoute · gpt-image-1", ("image",)),
|
|
girdi("9router-Takim-Agir", "OmniRoute · Takim-Agir", sira=9),
|
|
girdi("9router-Takim-Agir-6e65dba5", "OmniRoute · Takim-Agir", sira=8),
|
|
girdi("Ajan-Arac", "OmniRoute · Ajan-Arac (tekrar)"),
|
|
]
|
|
|
|
|
|
class Ayar(unittest.TestCase):
|
|
def test_dosya_yoksa_varsayilan_acik(self):
|
|
self.assertEqual(c.ayar_oku(os.path.join(tempfile.gettempdir(), "yok-boyle-dosya.json")), {"enabled": True, "kapsam": "ide"})
|
|
|
|
def test_kapatma_ve_bozuk_dosya(self):
|
|
with tempfile.TemporaryDirectory() as d:
|
|
yol = os.path.join(d, "a.json")
|
|
for icerik, beklenen in [('{"enabled": false}', {"enabled": False, "kapsam": "ide"}),
|
|
('{"enabled": true, "kapsam": "hepsi"}', {"enabled": True, "kapsam": "hepsi"}),
|
|
('{"enabled": "hayir", "kapsam": "x"}', {"enabled": True, "kapsam": "ide"}),
|
|
('bozuk', {"enabled": True, "kapsam": "ide"})]:
|
|
open(yol, "w", encoding="utf-8").write(icerik)
|
|
self.assertEqual(c.ayar_oku(yol), beklenen, icerik)
|
|
|
|
|
|
class Yapilandirma(unittest.TestCase):
|
|
def test_config_yaml_okuma(self):
|
|
with tempfile.TemporaryDirectory() as d:
|
|
open(os.path.join(d, "config.yaml"), "w", encoding="utf-8").write(
|
|
"model:\n default: Ajan-Arac\n provider: turkservis\nproviders:\n baska:\n models:\n Yabanci: {}\n"
|
|
" turkservis:\n base_url: https://ornek.test/v1/\n # yorum\n models:\n Hermes-Master: {}\n"
|
|
" 'cc/claude-opus-5-5': {}\n timeout: 3\nmcp_servers:\n x:\n models:\n Degil: {}\n")
|
|
open(os.path.join(d, ".env"), "w", encoding="utf-8").write("A=1\nHERMES_CUSTOM_TURKSERVIS_API_KEY='sahte-anahtar'\n")
|
|
self.assertEqual(c.ide_yapilandirma(d), ("https://ornek.test/v1", "Ajan-Arac", ["Hermes-Master", "cc/claude-opus-5-5"]))
|
|
self.assertEqual(c.anahtar_oku(d), "sahte-anahtar")
|
|
|
|
def test_dosyalar_yoksa(self):
|
|
with tempfile.TemporaryDirectory() as d:
|
|
self.assertEqual(c.ide_yapilandirma(d), (c.DEFAULT_BASE, "", []))
|
|
self.assertEqual(c.anahtar_oku(d), "")
|
|
|
|
|
|
class Secim(unittest.TestCase):
|
|
def test_ide_kapsami(self):
|
|
s = c.sec(KATALOG, ["cc/claude-opus-5-5"], "ide")
|
|
# Tanimli model + adlandirilmis combolar; tanimsiz saglayici modeli ve gorsel modeli yok.
|
|
self.assertEqual([x["id"] for x in s], ["9router-cc-opus", "Ajan-Arac"])
|
|
|
|
def test_9router_combolari_gosterilmez(self):
|
|
katalog = [girdi("9router-Takim-Agir-6e65dba5", "Takim-Agir", kaynak="9router", sira=1),
|
|
girdi("9router-Takim-Agir", "Takim-Agir (2)", sira=2),
|
|
girdi("Takim-Agir", "Takim-Agir (3)", sira=3),
|
|
girdi("Ajan-Arac", "Ajan-Arac", sira=4),
|
|
girdi("9router-nano-x", "nano/x", kaynak="9router", sira=5)]
|
|
s = c.sec(katalog, ["nano/x"], "ide")
|
|
# 9Router combosu ve gecidin 9router saglayicisindaki kopyasi yok; OmniRoute'un kendi combosu
|
|
# sayacsiz adiyla kalir. 9Router'in tekil modeli (combo degil) etkilenmez.
|
|
self.assertEqual([(x["id"], x["ad"]) for x in s],
|
|
[("Takim-Agir", "Takim-Agir"), ("Ajan-Arac", "Ajan-Arac"), ("9router-nano-x", "nano/x")])
|
|
|
|
def test_9router_saglayici_modelleri_tanimsiz_da_olsa_eklenir(self):
|
|
katalog = [girdi("9router-nano-x-aaaa1111", "nano/x", kaynak="9router", sira=1),
|
|
girdi("9router-nano-x", "nano/x (2)", sira=2),
|
|
girdi("9router-ocg-y-bbbb2222", "ocg/y", kaynak="9router", sira=3),
|
|
girdi("vag-z", "vag/z", sira=4),
|
|
girdi("9router-ses", "nano/ses", ("tts",), kaynak="9router", sira=5),
|
|
girdi("9router-Takim-Agir-6e65dba5", "Takim-Agir", kaynak="9router", sira=6)]
|
|
s = c.sec(katalog, [], "ide")
|
|
# 9Router modelleri IDE ayarinda adi gecmese de gelir; OmniRoute kopyasi, OmniRoute'un kendi
|
|
# saglayici modeli, sohbet olmayan model ve 9Router combosu gelmez.
|
|
self.assertEqual([(x["id"], x["ad"]) for x in s],
|
|
[("9router-nano-x-aaaa1111", "nano/x"), ("9router-ocg-y-bbbb2222", "ocg/y")])
|
|
|
|
def test_gorunen_ad_yalniz_saglayici_ve_model(self):
|
|
for tam, beklenen in [("OmniRoute · ag/gemini-3.8-flash", "ag/gemini-3.8-flash"),
|
|
("nano/qwen/qwen3.8-27b-obliterated:thinking", "nano/qwen3.8-27b-obliterated:thinking"),
|
|
("9Router · Nous-Research/inclusionai/ling-3.1-flash", "Nous-Research/ling-3.1-flash"),
|
|
("cf/@cf/qwen/qwq-32b", "cf/qwq-32b"),
|
|
("OmniRoute · Ajan-Arac", "Ajan-Arac"), ("cc/claude-opus-5-5", "cc/claude-opus-5-5")]:
|
|
self.assertEqual(c.kisa_ad(tam), beklenen, tam)
|
|
|
|
def test_cakisan_adlar_ayirt_edilir(self):
|
|
adlar = c.adlandir([("a", "nano/z-ai/glm-5.3"), ("b", "nano/baska/glm-5.3"), ("d", "cc/opus"), ("e-12345678", "OmniRoute · Takim-Agir")],
|
|
dolu={"takim-agir"})
|
|
self.assertEqual(adlar["a"], "nano/z-ai/glm-5.3") # kisa adi cakisan: aradaki halka geri gelir
|
|
self.assertEqual(adlar["b"], "nano/baska/glm-5.3")
|
|
self.assertEqual(adlar["d"], "cc/opus")
|
|
self.assertEqual(adlar["e-12345678"], "Takim-Agir [12345678]")
|
|
self.assertEqual(len(set(adlar.values())), 4)
|
|
|
|
def test_hepsi_kapsami_yalniz_sohbet(self):
|
|
s = c.sec(KATALOG, [], "hepsi")
|
|
self.assertEqual(len(s), 3) # iki 9Router combosu hicbir kapsamda gosterilmez
|
|
self.assertNotIn("gorsel", [x["id"] for x in s])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|