Files
2026-07-13 13:39:12 +08:00

147 lines
4.3 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import { getMcpModelsCatalog } from "../../open-sse/mcp-server/server.ts";
test("getMcpModelsCatalog aggregates only active connection model endpoints", async () => {
const calls: string[] = [];
const result = await getMcpModelsCatalog(
{},
{
listProviderConnections: async () => [
{ id: "conn-github", provider: "github", isActive: true },
{ id: "conn-codex", provider: "codex", isActive: false },
],
fetchJson: async (path: string) => {
calls.push(path);
if (path === "/api/providers/conn-github/models?excludeHidden=true") {
return {
source: "api",
models: [
{ id: "gpt-4.1", owned_by: "github", supportedEndpoints: ["chat"] },
{
id: "text-embedding-3-small",
owned_by: "github",
supportedEndpoints: ["embeddings"],
},
],
};
}
throw new Error(`Unexpected path: ${path}`);
},
}
);
assert.deepEqual(calls, ["/api/providers/conn-github/models?excludeHidden=true"]);
assert.deepEqual(result, {
models: [
{
id: "gpt-4.1",
provider: "github",
capabilities: ["chat"],
status: "available",
pricing: undefined,
},
{
id: "text-embedding-3-small",
provider: "github",
capabilities: ["embedding"],
status: "available",
pricing: undefined,
},
],
source: "api",
});
});
test("getMcpModelsCatalog exposes codex default thinking effort when no override is stored", async () => {
const result = await getMcpModelsCatalog(
{ provider: "codex" },
{
listProviderConnections: async () => [
{
id: "conn-codex",
provider: "codex",
isActive: true,
providerSpecificData: {},
},
],
fetchJson: async () => ({
source: "api",
models: [{ id: "gpt-5.5", owned_by: "codex", supportedEndpoints: ["chat"] }],
}),
}
);
assert.equal(result.models.length, 1);
assert.equal(result.models[0]?.thinkingEffort, "medium");
});
test("getMcpModelsCatalog exposes stored thinking effort overrides", async () => {
const result = await getMcpModelsCatalog(
{ provider: "chatgpt-web" },
{
listProviderConnections: async () => [
{
id: "conn-chatgpt",
provider: "chatgpt-web",
isActive: true,
providerSpecificData: { thinkingEffort: "extended" },
},
],
fetchJson: async () => ({
source: "api",
models: [{ id: "gpt-5", owned_by: "chatgpt-web", supportedEndpoints: ["chat"] }],
}),
}
);
assert.equal(result.models.length, 1);
assert.equal(result.models[0]?.thinkingEffort, "extended");
});
test("getMcpModelsCatalog resolves provider aliases to active connection ids", async () => {
const calls: string[] = [];
const result = await getMcpModelsCatalog(
{ provider: "gh", capability: "chat" },
{
listProviderConnections: async () => [
{ id: "conn-github", provider: "github", isActive: true },
{ id: "conn-codex", provider: "codex", isActive: true },
],
fetchJson: async (path: string) => {
calls.push(path);
return {
source: "api",
models: [{ id: "gpt-4.1", owned_by: "github", supportedEndpoints: ["chat"] }],
};
},
}
);
assert.deepEqual(calls, ["/api/providers/conn-github/models?excludeHidden=true"]);
assert.equal(result.models.length, 1);
assert.equal(result.models[0]?.provider, "github");
assert.deepEqual(result.models[0]?.capabilities, ["chat"]);
});
test("getMcpModelsCatalog returns empty result when requested provider has no active connection", async () => {
const result = await getMcpModelsCatalog(
{ provider: "github" },
{
listProviderConnections: async () => [{ id: "conn-codex", provider: "codex", isActive: true }],
fetchJson: async () => {
throw new Error("fetchJson should not be called without a matching active provider");
},
}
);
assert.deepEqual(result, {
models: [],
source: "provider_connections",
warning: "No active connections found for provider 'github'.",
});
});