From 8c9c75677499ea6f57655eff676ef511ad19269d Mon Sep 17 00:00:00 2001 From: audrzejq <31422031+audrzejq@users.noreply.github.com> Date: Tue, 3 Mar 2026 18:17:57 +0100 Subject: [PATCH 1/2] another aproach --- packages/web/api/cron/monitor-chutes.ts | 34 +++++++++++++++++++++ packages/web/api/cron/monitor-openrouter.ts | 31 +++++++++++++++++++ packages/web/tsconfig.json | 1 + 3 files changed, 66 insertions(+) create mode 100644 packages/web/api/cron/monitor-chutes.ts create mode 100644 packages/web/api/cron/monitor-openrouter.ts diff --git a/packages/web/api/cron/monitor-chutes.ts b/packages/web/api/cron/monitor-chutes.ts new file mode 100644 index 000000000..51b2f2c9c --- /dev/null +++ b/packages/web/api/cron/monitor-chutes.ts @@ -0,0 +1,34 @@ +import { runMonitor, round6 } from '../../../monitor/index.ts' + +export const config = { maxDuration: 60 } + +export default async function handler(req: Request) { + if (req.headers.get('authorization') !== `Bearer ${process.env.CRON_SECRET}`) { + return new Response('Unauthorized', { status: 401 }) + } + + try { + await runMonitor({ + name: 'Chutes', + title: '🛰 Chutes Models Update', + s3Key: 'chutes/snapshot.json', + async fetchModels() { + const headers: Record = {} + if (process.env.CHUTES_API_KEY) headers['Authorization'] = `Bearer ${process.env.CHUTES_API_KEY}` + + const res = await fetch('https://llm.chutes.ai/v1/models', { headers }) + if (!res.ok) throw new Error(`Chutes API error: ${res.status}`) + const data = await res.json() as { data: Array<{ id: string; pricing: { prompt: number; completion: number } }> } + return data.data.map(m => ({ + id: m.id, + price_prompt: round6(m.pricing.prompt), + price_completion: round6(m.pricing.completion), + })) + }, + }) + return new Response('ok') + } catch (err) { + console.error(err) + return new Response(String(err), { status: 500 }) + } +} diff --git a/packages/web/api/cron/monitor-openrouter.ts b/packages/web/api/cron/monitor-openrouter.ts new file mode 100644 index 000000000..0fb8fe684 --- /dev/null +++ b/packages/web/api/cron/monitor-openrouter.ts @@ -0,0 +1,31 @@ +import { runMonitor, round6 } from '../../../monitor/index.ts' + +export const config = { maxDuration: 60 } + +export default async function handler(req: Request) { + if (req.headers.get('authorization') !== `Bearer ${process.env.CRON_SECRET}`) { + return new Response('Unauthorized', { status: 401 }) + } + + try { + await runMonitor({ + name: 'OpenRouter', + title: '🛰 OpenRouter Models Update', + s3Key: 'openrouter/snapshot.json', + async fetchModels() { + const res = await fetch('https://openrouter.ai/api/v1/models') + if (!res.ok) throw new Error(`OpenRouter API error: ${res.status}`) + const data = await res.json() as { data: Array<{ id: string; pricing: { prompt: string; completion: string } }> } + return data.data.map(m => ({ + id: m.id, + price_prompt: round6(parseFloat(m.pricing.prompt) * 1_000_000), + price_completion: round6(parseFloat(m.pricing.completion) * 1_000_000), + })) + }, + }) + return new Response('ok') + } catch (err) { + console.error(err) + return new Response(String(err), { status: 500 }) + } +} diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index 606701d62..9519a929a 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -12,6 +12,7 @@ ], "strict": true, "esModuleInterop": true, + "allowImportingTsExtensions": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true } From 61f9239ab5946a8f6e823432e8b151785129be39 Mon Sep 17 00:00:00 2001 From: audrzejq <31422031+audrzejq@users.noreply.github.com> Date: Tue, 3 Mar 2026 18:20:46 +0100 Subject: [PATCH 2/2] fix tsconfig --- api/cron/monitor-chutes.ts | 34 ---------------------------------- api/cron/monitor-openrouter.ts | 31 ------------------------------- packages/web/tsconfig.json | 1 + 3 files changed, 1 insertion(+), 65 deletions(-) delete mode 100644 api/cron/monitor-chutes.ts delete mode 100644 api/cron/monitor-openrouter.ts diff --git a/api/cron/monitor-chutes.ts b/api/cron/monitor-chutes.ts deleted file mode 100644 index e0cfe55a3..000000000 --- a/api/cron/monitor-chutes.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { runMonitor, round6 } from '../../packages/monitor/index.ts' - -export const config = { maxDuration: 60 } - -export default async function handler(req: Request) { - if (req.headers.get('authorization') !== `Bearer ${process.env.CRON_SECRET}`) { - return new Response('Unauthorized', { status: 401 }) - } - - try { - await runMonitor({ - name: 'Chutes', - title: '🛰 Chutes Models Update', - s3Key: 'chutes/snapshot.json', - async fetchModels() { - const headers: Record = {} - if (process.env.CHUTES_API_KEY) headers['Authorization'] = `Bearer ${process.env.CHUTES_API_KEY}` - - const res = await fetch('https://llm.chutes.ai/v1/models', { headers }) - if (!res.ok) throw new Error(`Chutes API error: ${res.status}`) - const data = await res.json() as { data: Array<{ id: string; pricing: { prompt: number; completion: number } }> } - return data.data.map(m => ({ - id: m.id, - price_prompt: round6(m.pricing.prompt), - price_completion: round6(m.pricing.completion), - })) - }, - }) - return new Response('ok') - } catch (err) { - console.error(err) - return new Response(String(err), { status: 500 }) - } -} diff --git a/api/cron/monitor-openrouter.ts b/api/cron/monitor-openrouter.ts deleted file mode 100644 index cb3469d2d..000000000 --- a/api/cron/monitor-openrouter.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { runMonitor, round6 } from '../../packages/monitor/index.ts' - -export const config = { maxDuration: 60 } - -export default async function handler(req: Request) { - if (req.headers.get('authorization') !== `Bearer ${process.env.CRON_SECRET}`) { - return new Response('Unauthorized', { status: 401 }) - } - - try { - await runMonitor({ - name: 'OpenRouter', - title: '🛰 OpenRouter Models Update', - s3Key: 'openrouter/snapshot.json', - async fetchModels() { - const res = await fetch('https://openrouter.ai/api/v1/models') - if (!res.ok) throw new Error(`OpenRouter API error: ${res.status}`) - const data = await res.json() as { data: Array<{ id: string; pricing: { prompt: string; completion: string } }> } - return data.data.map(m => ({ - id: m.id, - price_prompt: round6(parseFloat(m.pricing.prompt) * 1_000_000), - price_completion: round6(parseFloat(m.pricing.completion) * 1_000_000), - })) - }, - }) - return new Response('ok') - } catch (err) { - console.error(err) - return new Response(String(err), { status: 500 }) - } -} diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json index 9519a929a..faa634866 100644 --- a/packages/web/tsconfig.json +++ b/packages/web/tsconfig.json @@ -13,6 +13,7 @@ "strict": true, "esModuleInterop": true, "allowImportingTsExtensions": true, + "noEmit": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }