diff --git a/open-sse/config/providers/registry/free-ai/index.ts b/open-sse/config/providers/registry/free-ai/index.ts new file mode 100644 index 0000000000..a055dab8db --- /dev/null +++ b/open-sse/config/providers/registry/free-ai/index.ts @@ -0,0 +1,11 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const freeAiProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "free-ai", + alias: "free-ai", + baseUrl: "https://api.free.ai/v1/chat/", + modelsUrl: "https://api.free.ai/v1/models", + models: [], + passthroughModels: true, +}); diff --git a/tests/unit/free-tier-providers-wave4-b.test.ts b/tests/unit/free-tier-providers-wave4-b.test.ts new file mode 100644 index 0000000000..a547e150a0 --- /dev/null +++ b/tests/unit/free-tier-providers-wave4-b.test.ts @@ -0,0 +1,27 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { freeAiProvider } from "../../open-sse/config/providers/registry/free-ai/index.ts"; +import { + DefaultExecutor, + getExecutor, + hasSpecializedExecutor, +} from "../../open-sse/executors/index.ts"; + +test("Free.ai exposes its exact OpenAI-compatible endpoint and live catalog", () => { + assert.equal(freeAiProvider.id, "free-ai"); + assert.equal(freeAiProvider.alias, "free-ai"); + assert.equal(freeAiProvider.format, "openai"); + assert.equal(freeAiProvider.executor, "default"); + assert.equal(freeAiProvider.authType, "apikey"); + assert.equal(freeAiProvider.authHeader, "bearer"); + assert.equal(freeAiProvider.baseUrl, "https://api.free.ai/v1/chat/"); + assert.equal(freeAiProvider.modelsUrl, "https://api.free.ai/v1/models"); + assert.deepEqual(freeAiProvider.models, []); + assert.equal(freeAiProvider.passthroughModels, true); +}); + +test("Free.ai uses DefaultExecutor without a specialized executor", () => { + assert.ok(getExecutor("free-ai") instanceof DefaultExecutor); + assert.equal(hasSpecializedExecutor("free-ai"), false); +});