From 72e5bc9cb69e7a2ac1b73e6d14ebaa1ee43444d5 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sun, 2 Aug 2026 01:31:36 -0300 Subject: [PATCH] feat: add wave2 free-tier provider registries --- .../providers/registry/literouter/index.ts | 11 ++++ .../providers/registry/meganova/index.ts | 11 ++++ .../config/providers/registry/mnn-ai/index.ts | 11 ++++ .../unit/free-tier-providers-wave2-a.test.ts | 51 +++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 open-sse/config/providers/registry/literouter/index.ts create mode 100644 open-sse/config/providers/registry/meganova/index.ts create mode 100644 open-sse/config/providers/registry/mnn-ai/index.ts create mode 100644 tests/unit/free-tier-providers-wave2-a.test.ts diff --git a/open-sse/config/providers/registry/literouter/index.ts b/open-sse/config/providers/registry/literouter/index.ts new file mode 100644 index 0000000000..fd13e540eb --- /dev/null +++ b/open-sse/config/providers/registry/literouter/index.ts @@ -0,0 +1,11 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const literouterProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "literouter", + alias: "literouter", + baseUrl: "https://api.literouter.com/v1/chat/completions", + modelsUrl: "https://api.literouter.com/v1/models", + models: [], + passthroughModels: true, +}); diff --git a/open-sse/config/providers/registry/meganova/index.ts b/open-sse/config/providers/registry/meganova/index.ts new file mode 100644 index 0000000000..f03ad2462b --- /dev/null +++ b/open-sse/config/providers/registry/meganova/index.ts @@ -0,0 +1,11 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const meganovaProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "meganova", + alias: "meganova", + baseUrl: "https://api.meganova.ai/v1/chat/completions", + modelsUrl: "https://api.meganova.ai/v1/models", + models: [], + passthroughModels: true, +}); diff --git a/open-sse/config/providers/registry/mnn-ai/index.ts b/open-sse/config/providers/registry/mnn-ai/index.ts new file mode 100644 index 0000000000..f1d7e2317f --- /dev/null +++ b/open-sse/config/providers/registry/mnn-ai/index.ts @@ -0,0 +1,11 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const mnnAiProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "mnn-ai", + alias: "mnn-ai", + baseUrl: "https://api.mnnai.ru/v1/chat/completions", + modelsUrl: "https://api.mnnai.ru/v1/models", + models: [], + passthroughModels: true, +}); diff --git a/tests/unit/free-tier-providers-wave2-a.test.ts b/tests/unit/free-tier-providers-wave2-a.test.ts new file mode 100644 index 0000000000..fa9412c5d5 --- /dev/null +++ b/tests/unit/free-tier-providers-wave2-a.test.ts @@ -0,0 +1,51 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { literouterProvider } from "../../open-sse/config/providers/registry/literouter/index.ts"; +import { meganovaProvider } from "../../open-sse/config/providers/registry/meganova/index.ts"; +import { mnnAiProvider } from "../../open-sse/config/providers/registry/mnn-ai/index.ts"; +import type { RegistryEntry } from "../../open-sse/config/providers/shared.ts"; + +const providers: Array<{ + entry: RegistryEntry; + id: string; + chatUrl: string; + modelsUrl: string; +}> = [ + { + entry: literouterProvider, + id: "literouter", + chatUrl: "https://api.literouter.com/v1/chat/completions", + modelsUrl: "https://api.literouter.com/v1/models", + }, + { + entry: mnnAiProvider, + id: "mnn-ai", + chatUrl: "https://api.mnnai.ru/v1/chat/completions", + modelsUrl: "https://api.mnnai.ru/v1/models", + }, + { + entry: meganovaProvider, + id: "meganova", + chatUrl: "https://api.meganova.ai/v1/chat/completions", + modelsUrl: "https://api.meganova.ai/v1/models", + }, +]; + +for (const { entry, id, chatUrl, modelsUrl } of providers) { + test(`${id} uses an OpenAI-compatible Bearer registry entry`, () => { + assert.equal(entry.id, id); + assert.equal(entry.alias, id); + assert.equal(entry.format, "openai"); + assert.equal(entry.executor, "default"); + assert.equal(entry.authType, "apikey"); + assert.equal(entry.authHeader, "bearer"); + assert.equal(entry.baseUrl, chatUrl); + assert.equal(entry.modelsUrl, modelsUrl); + assert.equal(entry.passthroughModels, true); + }); + + test(`${id} leaves model discovery to the live upstream catalog`, () => { + assert.deepEqual(entry.models, []); + }); +}