feat(models): improve OpenRouter free scan
This commit is contained in:
84
src/agents/model-scan.test.ts
Normal file
84
src/agents/model-scan.test.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { scanOpenRouterModels } from "./model-scan.js";
|
||||
|
||||
function createFetchFixture(payload: unknown): typeof fetch {
|
||||
return async () =>
|
||||
new Response(JSON.stringify(payload), {
|
||||
status: 200,
|
||||
headers: { "content-type": "application/json" },
|
||||
});
|
||||
}
|
||||
|
||||
describe("scanOpenRouterModels", () => {
|
||||
it("lists free models without probing", async () => {
|
||||
const fetchImpl = createFetchFixture({
|
||||
data: [
|
||||
{
|
||||
id: "acme/free-by-pricing",
|
||||
name: "Free By Pricing",
|
||||
context_length: 16_384,
|
||||
max_completion_tokens: 1024,
|
||||
supported_parameters: ["tools", "tool_choice", "temperature"],
|
||||
modality: "text",
|
||||
pricing: { prompt: "0", completion: "0", request: "0", image: "0" },
|
||||
created_at: 1_700_000_000,
|
||||
},
|
||||
{
|
||||
id: "acme/free-by-suffix:free",
|
||||
name: "Free By Suffix",
|
||||
context_length: 8_192,
|
||||
supported_parameters: [],
|
||||
modality: "text",
|
||||
pricing: { prompt: "0", completion: "0" },
|
||||
},
|
||||
{
|
||||
id: "acme/paid",
|
||||
name: "Paid",
|
||||
context_length: 4_096,
|
||||
supported_parameters: ["tools"],
|
||||
modality: "text",
|
||||
pricing: { prompt: "0.000001", completion: "0.000002" },
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const results = await scanOpenRouterModels({
|
||||
fetchImpl,
|
||||
probe: false,
|
||||
});
|
||||
|
||||
expect(results.map((entry) => entry.id)).toEqual([
|
||||
"acme/free-by-pricing",
|
||||
"acme/free-by-suffix:free",
|
||||
]);
|
||||
|
||||
const byPricing = results[0]!;
|
||||
expect(byPricing.supportsToolsMeta).toBe(true);
|
||||
expect(byPricing.supportedParametersCount).toBe(3);
|
||||
expect(byPricing.isFree).toBe(true);
|
||||
expect(byPricing.tool.skipped).toBe(true);
|
||||
expect(byPricing.image.skipped).toBe(true);
|
||||
});
|
||||
|
||||
it("requires an API key when probing", async () => {
|
||||
const fetchImpl = createFetchFixture({ data: [] });
|
||||
const previousKey = process.env.OPENROUTER_API_KEY;
|
||||
try {
|
||||
delete process.env.OPENROUTER_API_KEY;
|
||||
await expect(
|
||||
scanOpenRouterModels({
|
||||
fetchImpl,
|
||||
probe: true,
|
||||
apiKey: "",
|
||||
}),
|
||||
).rejects.toThrow(/Missing OpenRouter API key/);
|
||||
} finally {
|
||||
if (previousKey === undefined) {
|
||||
delete process.env.OPENROUTER_API_KEY;
|
||||
} else {
|
||||
process.env.OPENROUTER_API_KEY = previousKey;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user