SPB Git

spb/zyquo-router Public MIT

One local endpoint, every AI provider — a private OpenAI-compatible LLM gateway for your Mac (170 models, 12 providers).

Swift 95.7% Python 2.3% Shell 1.2% Makefile 0.9%
3.2 KB · 98 lines swift
Raw Blame History
1//2//  RequestRouterTests.swift3//  Zyquo Router4//5//  Author: Simon-Pierre Boucher6//  Mail: contact@spboucher.ai7//8//  Model-resolution rules: namespaced IDs, unambiguous bare IDs, aliases,9//  disabled models, ambiguity across providers.10//1112import XCTest13@testable import ZyquoRouter1415final class RequestRouterTests: XCTestCase {16    private func model(_ id: String, _ provider: ProviderID) -> AIModel {17        AIModel(18            id: id,19            provider: provider,20            displayName: id,21            contextWindow: 128_000,22            maxOutputTokens: nil,23            capabilities: ModelCapabilities(),24            pricing: nil,25            parameterSupport: ParameterSupport()26        )27    }2829    private var router: RequestRouter {30        RequestRouter(31            catalog: [32                model("alpha-1", .openai),33                model("shared-model", .together),34                model("shared-model", .deepinfra),35                model("meta-llama/Llama-4", .deepinfra),36            ],37            aliases: ["fast": "openai/alpha-1"],38            disabledIDs: ["together/shared-model"]39        )40    }4142    func testNamespacedResolution() throws {43        let resolution = try router.resolve("openai/alpha-1")44        XCTAssertEqual(resolution.namespacedID, "openai/alpha-1")45        XCTAssertEqual(resolution.model.provider, .openai)46    }4748    func testBareIDUnambiguous() throws {49        XCTAssertEqual(try router.resolve("alpha-1").namespacedID, "openai/alpha-1")50    }5152    func testModelIDContainingSlash() throws {53        XCTAssertEqual(54            try router.resolve("deepinfra/meta-llama/Llama-4").namespacedID,55            "deepinfra/meta-llama/Llama-4"56        )57        // Bare form works too: "meta-llama" is not a provider prefix.58        XCTAssertEqual(59            try router.resolve("meta-llama/Llama-4").namespacedID,60            "deepinfra/meta-llama/Llama-4"61        )62    }6364    func testAlias() throws {65        XCTAssertEqual(try router.resolve("fast").namespacedID, "openai/alpha-1")66    }6768    func testAmbiguousBareID() {69        XCTAssertThrowsError(try router.resolve("shared-model")) { error in70            guard case RequestRouter.RoutingError.ambiguousModel(_, let candidates) = error else {71                return XCTFail("expected ambiguity, got \(error)")72            }73            XCTAssertEqual(Set(candidates), ["together/shared-model", "deepinfra/shared-model"])74        }75    }7677    func testDisabledModel() {78        XCTAssertThrowsError(try router.resolve("together/shared-model")) { error in79            guard case RequestRouter.RoutingError.disabledModel = error else {80                return XCTFail("expected disabled, got \(error)")81            }82        }83    }8485    func testUnknownModel() {86        XCTAssertThrowsError(try router.resolve("nope")) { error in87            guard case RequestRouter.RoutingError.unknownModel = error else {88                return XCTFail("expected unknown, got \(error)")89            }90        }91    }9293    func testFullCatalogHasNoAmbiguousNamespacedIDs() {94        let ids = ModelCatalogData.all.map { RequestRouter.namespacedID(for: $0) }95        XCTAssertEqual(ids.count, Set(ids).count, "namespaced IDs must be unique")96    }97}98