45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import { Hono } from 'hono';
|
|
import type { HonoVariables } from '@@/create-router';
|
|
import { readApiKeys } from '@@/api/server-settings/pi-mono';
|
|
|
|
export const piMonoModelsRouter = new Hono<{ Variables: HonoVariables }>();
|
|
|
|
piMonoModelsRouter.get('/pi-mono/models', async (ctx) => {
|
|
try {
|
|
const storedKeys = await readApiKeys();
|
|
const proc = Bun.spawn(['pi', '--list-models'], {
|
|
stdout: 'pipe',
|
|
stderr: 'pipe',
|
|
env: { ...process.env, ...storedKeys },
|
|
});
|
|
|
|
const output = await new Response(proc.stdout).text();
|
|
await proc.exited;
|
|
|
|
if (proc.exitCode !== 0) return ctx.json([]);
|
|
|
|
// Parse the whitespace-separated table output:
|
|
// provider model context max-out thinking images
|
|
// anthropic claude-sonnet-4-6 200K 128K yes yes
|
|
const lines = output.trim().split('\n').filter(Boolean);
|
|
const models: { id: string; name: string; provider: string; providerId: string }[] = [];
|
|
|
|
// Skip header line (first line)
|
|
for (let i = 1; i < lines.length; i++) {
|
|
const cols = lines[i]!.trim().split(/\s+/);
|
|
if (cols.length < 2) continue;
|
|
const [provider, model] = cols;
|
|
models.push({
|
|
id: `${provider}/${model}`,
|
|
name: model!,
|
|
provider: provider!,
|
|
providerId: provider!,
|
|
});
|
|
}
|
|
|
|
return ctx.json(models);
|
|
} catch {
|
|
return ctx.json([]);
|
|
}
|
|
});
|