Combos that come from 9Router, directly or through the gateway's 9router provider, are no longer added to Codex's model list; the gateway's own combos keep their plain names. The IDE no longer leaves a config.toml backup behind: turning the setting off already restores the file byte for byte. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HRDGW1LiKcDUZYUdKBoWYW
95 lines
5.3 KiB
Python
95 lines
5.3 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_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()
|