35 lines
1.5 KiB
JavaScript
35 lines
1.5 KiB
JavaScript
/* Can Claude actually serve a request right now? */
|
|
import dotenv from 'dotenv';
|
|
dotenv.config();
|
|
|
|
const key = process.env.ANTHROPIC_API_KEY;
|
|
if (!key) { console.log('❌ ANTHROPIC_API_KEY is not set.'); process.exit(1); }
|
|
|
|
const chains = [process.env.LLM_CHAIN_SUPERVISOR, process.env.LLM_CHAIN_AGENT].join(',');
|
|
const models = [...new Set(chains.split(',').map((s) => s.replace(/^anthropic:/, '').trim()).filter(Boolean))];
|
|
|
|
const rows = [];
|
|
for (const model of models) {
|
|
try {
|
|
const res = await fetch('https://api.anthropic.com/v1/messages', {
|
|
method: 'POST',
|
|
headers: { 'content-type': 'application/json', 'x-api-key': key, 'anthropic-version': '2023-06-01' },
|
|
body: JSON.stringify({ model, max_tokens: 16, messages: [{ role: 'user', content: 'Say OK' }] }),
|
|
signal: AbortSignal.timeout(30000),
|
|
});
|
|
const j = await res.json();
|
|
rows.push(res.ok
|
|
? [model, 'OK', JSON.stringify(j.content?.[0]?.text)]
|
|
: [model, `HTTP ${res.status}`, String(j.error?.message || '').slice(0, 110)]);
|
|
} catch (e) { rows.push([model, 'ERR', e.message.slice(0, 110)]); }
|
|
}
|
|
|
|
console.log('model'.padEnd(24), 'status'.padEnd(10), 'detail');
|
|
console.log('-'.repeat(100));
|
|
for (const [m, s, d] of rows) console.log(m.padEnd(24), String(s).padEnd(10), d || '');
|
|
|
|
const ok = rows.filter(([, s]) => s === 'OK');
|
|
console.log(`
|
|
${ok.length ? `✅ ${ok.length}/${rows.length} model(s) usable: ${ok.map((r) => r[0]).join(', ')}` : '❌ Claude cannot serve a request right now.'}`);
|
|
process.exit(0);
|