61 lines
2.0 KiB
TypeScript
61 lines
2.0 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
import * as fs from "node:fs";
|
|
import * as os from "node:os";
|
|
import * as path from "node:path";
|
|
import { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
|
|
import { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
|
|
import { Snowflake } from "@oh-my-pi/pi-utils";
|
|
|
|
function stdoutCommand(value: string): string {
|
|
return `${JSON.stringify(process.execPath)} -e ${JSON.stringify(`process.stdout.write(${JSON.stringify(value)})`)}`;
|
|
}
|
|
|
|
describe("ModelRegistry command-resolved models.yml values", () => {
|
|
let tempDir = "";
|
|
let authStorage: AuthStorage;
|
|
let modelsPath = "";
|
|
|
|
beforeEach(async () => {
|
|
tempDir = path.join(os.tmpdir(), `pi-test-model-command-values-${Snowflake.next()}`);
|
|
fs.mkdirSync(tempDir, { recursive: true });
|
|
modelsPath = path.join(tempDir, "models.json");
|
|
authStorage = await AuthStorage.create(":memory:");
|
|
});
|
|
|
|
afterEach(() => {
|
|
authStorage.close();
|
|
if (!tempDir || !fs.existsSync(tempDir)) return;
|
|
try {
|
|
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
} catch (error) {
|
|
if ((error as NodeJS.ErrnoException).code !== "EBUSY") throw error;
|
|
}
|
|
});
|
|
|
|
test("provider apiKey and headers resolve from command stdout", async () => {
|
|
fs.writeFileSync(
|
|
modelsPath,
|
|
JSON.stringify({
|
|
providers: {
|
|
anthropic: {
|
|
baseUrl: "https://anthropic-proxy.example.com/v1",
|
|
apiKey: `!${stdoutCommand("cmd-api-key")}`,
|
|
authHeader: true,
|
|
headers: { "X-Api-Key": `!${stdoutCommand("cmd-header")}` },
|
|
},
|
|
},
|
|
}),
|
|
);
|
|
|
|
const registry = new ModelRegistry(authStorage, modelsPath);
|
|
const models = registry.getAll().filter(model => model.provider === "anthropic");
|
|
|
|
expect(models.length).toBeGreaterThan(1);
|
|
for (const model of models) {
|
|
expect(model.headers?.Authorization).toBe("Bearer cmd-api-key");
|
|
expect(model.headers?.["X-Api-Key"]).toBe("cmd-header");
|
|
}
|
|
expect(await registry.getApiKey(models[0])).toBe("cmd-api-key");
|
|
});
|
|
});
|