87 lines
2.8 KiB
TypeScript
87 lines
2.8 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { env } from "../src/env.js";
|
|
import { describeProviderChatBackend, fetchProviderCatalogModels } from "../src/llm/provider-adapters.js";
|
|
|
|
for (const { name, listedModels, expectedModels } of [
|
|
{
|
|
name: "OpenAI catalog includes chat-latest while excluding non-chat models",
|
|
listedModels: [
|
|
"gpt-4.1-mini",
|
|
"chat-latest",
|
|
"o3",
|
|
"chatgpt-4o-latest",
|
|
"chat-latest",
|
|
"text-embedding-3-small",
|
|
"omni-moderation-latest",
|
|
"gpt-4o-audio-preview",
|
|
"gpt-realtime",
|
|
"gpt-4o-transcribe",
|
|
"gpt-4o-mini-tts",
|
|
"gpt-image-1",
|
|
"chatgpt-image-latest",
|
|
"gpt-4o-search-preview",
|
|
"computer-use-preview",
|
|
"sora-2",
|
|
],
|
|
expectedModels: ["chat-latest", "chatgpt-4o-latest", "gpt-4.1-mini", "o3"],
|
|
},
|
|
{
|
|
name: "OpenAI catalog does not invent models absent from the provider response",
|
|
listedModels: ["gpt-4.1-mini"],
|
|
expectedModels: ["gpt-4.1-mini"],
|
|
},
|
|
]) {
|
|
test(name, async (t) => {
|
|
const originalKey = env.OPENAI_API_KEY;
|
|
env.OPENAI_API_KEY = "test-openai-key";
|
|
t.after(() => { env.OPENAI_API_KEY = originalKey; });
|
|
t.mock.method(globalThis, "fetch", async (input: RequestInfo | URL) => {
|
|
const url = input instanceof Request ? input.url : String(input);
|
|
assert.equal(url, "https://api.openai.com/v1/models");
|
|
return Response.json({ data: listedModels.map((id) => ({ id })) });
|
|
});
|
|
|
|
assert.deepEqual(await fetchProviderCatalogModels("openai"), expectedModels);
|
|
});
|
|
}
|
|
|
|
test("provider backend registry selects chat protocol and managed-tool mode", () => {
|
|
assert.deepEqual(describeProviderChatBackend("openai", []), {
|
|
provider: "openai",
|
|
protocol: "chat-completions",
|
|
managedTools: false,
|
|
enabledTools: [],
|
|
});
|
|
assert.deepEqual(describeProviderChatBackend("openai", ["web_search"]), {
|
|
provider: "openai",
|
|
protocol: "responses",
|
|
managedTools: true,
|
|
enabledTools: ["web_search"],
|
|
});
|
|
assert.deepEqual(describeProviderChatBackend("anthropic", ["web_search"]), {
|
|
provider: "anthropic",
|
|
protocol: "messages",
|
|
managedTools: true,
|
|
enabledTools: ["web_search"],
|
|
});
|
|
assert.deepEqual(describeProviderChatBackend("xai", ["web_search"]), {
|
|
provider: "xai",
|
|
protocol: "chat-completions",
|
|
managedTools: true,
|
|
enabledTools: ["web_search"],
|
|
});
|
|
assert.deepEqual(describeProviderChatBackend("gemini", ["web_search"]), {
|
|
provider: "gemini",
|
|
protocol: "gemini",
|
|
managedTools: true,
|
|
enabledTools: ["web_search"],
|
|
});
|
|
assert.deepEqual(describeProviderChatBackend("hermes-agent", ["web_search"]), {
|
|
provider: "hermes-agent",
|
|
protocol: "chat-completions",
|
|
managedTools: false,
|
|
enabledTools: [],
|
|
});
|
|
});
|