Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ RELEASE-GUIDE.md
TODOS.md
AGENTS.md

# Generated model registries
packages/pi-ai/src/*.generated.ts

# opencode local config
.opencode/
test-results/
4 changes: 3 additions & 1 deletion packages/pi-ai/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1326,7 +1326,9 @@ Create a new provider file (for example `amazon-bedrock.ts`) that exports:
- Map chat/tool-capable provider model data to the standardized `Model` interface via `scripts/generate-models.ts`
- Map image-generation provider model data to the standardized `ImagesModel` interface via `scripts/generate-image-models.ts`
- Handle provider-specific quirks (pricing format, capability flags, model ID transformations)
- Run `pnpm run generate` from `packages/pi-ai` when changing model generation; `pnpm run build` compiles the committed generated catalogs without refreshing them.
- The generated catalogs (`src/*.generated.ts`) are ignored by git. Run `pnpm run generate` from `packages/pi-ai` when changing model generation or when you need to inspect the generated output locally.
- `pnpm run build` and `pnpm test` regenerate the catalogs before compiling or running Vitest, so a fresh clone does not need committed generated files.
- Generation fetches live model metadata from models.dev, OpenRouter, and Vercel AI Gateway. Run those commands with network access; for image-model generation, set `OPENROUTER_MODELS_URL` to point the OpenRouter image model fetch at a fixture or mirror when needed.

#### 5. Tests (`test/`)

Expand Down
3 changes: 2 additions & 1 deletion packages/pi-ai/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@
"generate-models": "node scripts/generate-models.ts",
"generate-image-models": "node scripts/generate-image-models.ts",
"generate": "pnpm run generate-models && pnpm run generate-image-models",
"build": "pnpm run clean && tsc -p tsconfig.json --incremental false",
"build": "pnpm run generate && pnpm run clean && tsc -p tsconfig.json --incremental false",
Comment thread
cursor[bot] marked this conversation as resolved.
"pretest": "pnpm run generate",
"test": "vitest --run",
"prepublishOnly": "pnpm run clean && pnpm run build"
},
Expand Down
25 changes: 19 additions & 6 deletions packages/pi-ai/scripts/generate-image-models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ interface OpenRouterModelRecord {
async function fetchOpenRouterImageModels(): Promise<ImagesModel<"openrouter-images">[]> {
try {
console.log("Fetching image models from OpenRouter API...");
const response = await fetch(`${OPENROUTER_BASE_URL}/models?output_modalities=image`);
const url =
process.env["OPENROUTER_MODELS_URL"] ?? `${OPENROUTER_BASE_URL}/models?output_modalities=image`;
const response = await fetch(url);
const data = (await response.json()) as { data?: OpenRouterModelRecord[] };
const models: ImagesModel<"openrouter-images">[] = [];

Expand Down Expand Up @@ -76,7 +78,7 @@ async function fetchOpenRouterImageModels(): Promise<ImagesModel<"openrouter-ima
}
}

function generateImageModelsFile(models: ImagesModel<"openrouter-images">[]): string {
export function generateImageModelsFile(models: ImagesModel<"openrouter-images">[]): string {
const imageModelsByProvider = {
openrouter: Object.fromEntries(
models
Expand Down Expand Up @@ -119,13 +121,24 @@ ${providerEntries}

async function main(): Promise<void> {
const models = await fetchOpenRouterImageModels();
if (models.length === 0) {
console.error(
"OpenRouter image-models fetch returned no models; refusing to overwrite src/image-models.generated.ts.",
);
console.error(
"Retry when network is available, or build with the committed catalog (skip generate-image-models).",
);
process.exit(1);
}
const output = generateImageModelsFile(models);
const outputPath = join(packageRoot, "src", "image-models.generated.ts");
writeFileSync(outputPath, output, "utf-8");
console.log(`Generated ${outputPath}`);
}

main().catch((error) => {
console.error(error);
process.exit(1);
});
if (process.argv[1] === __filename) {
main().catch((error) => {
console.error(error);
process.exit(1);
});
}
Comment thread
jeremymcs marked this conversation as resolved.
Loading
Loading