Files
dwroller/scripts/smoke-openai-charm.js

62 lines
2.8 KiB
JavaScript

#!/usr/bin/env node
const fs = require('fs');
const { execFileSync } = require('child_process');
const path = require('path');
const pdfPath = process.argv[2] || 'data/Deathwatch_Core_Rulebook_copy.pdf';
if (!fs.existsSync(pdfPath)) {
console.error('PDF not found at', pdfPath);
process.exit(1);
}
// read .env for OPENAI_API_KEY
const envRaw = fs.readFileSync(path.resolve(__dirname,'..','.env'),'utf8');
const m = envRaw.split(/\n|\r/).map(l=>l.trim()).find(l=>l.startsWith('OPENAI_API_KEY='));
if (!m) { console.error('OPENAI_API_KEY not found in .env'); process.exit(1); }
const key = m.replace(/^OPENAI_API_KEY=/,'').trim();
if (!key) { console.error('OPENAI_API_KEY is empty'); process.exit(1); }
console.log('Uploading PDF...');
let uploadResp;
try{
uploadResp = execFileSync('curl', ['-s','-X','POST','https://api.openai.com/v1/files', '-H', `Authorization: Bearer ${key}`, '-F', `file=@${pdfPath}`, '-F', 'purpose=responses'], { encoding: 'utf8', maxBuffer: 20*1024*1024 });
}catch(err){
console.error('Upload failed:', err.message);
process.exit(1);
}
let uploadJson;
try{ uploadJson = JSON.parse(uploadResp); }catch(e){ console.error('Failed to parse upload response:', uploadResp.slice(0,1000)); process.exit(1); }
if (uploadJson.error){ console.error('Upload error from API:', uploadJson.error); process.exit(1); }
const fileId = uploadJson.id;
if (!fileId){ console.error('No file id returned in upload response'); process.exit(1); }
console.log('Uploaded file id:', fileId);
const prompt = `You are given an uploaded PDF (file id: ${fileId}). Does the Deathwatch Core Rulebook include a skill titled \"Charm\"? Answer with JSON only: {\"present\": true|false, \"confidence\": 0-1, \"note\": \"short reason\"}.`;
const payload = JSON.stringify({ model: 'gpt-4o-mini', input: prompt, files: [fileId], temperature: 0 });
console.log('Querying Responses API for "Charm"...');
let respRaw;
try{
respRaw = execFileSync('curl', ['-s','-X','POST','https://api.openai.com/v1/responses', '-H', `Authorization: Bearer ${key}`, '-H', 'Content-Type: application/json', '-d', payload], { encoding: 'utf8', maxBuffer: 20*1024*1024 });
}catch(err){ console.error('Responses API call failed:', err.message); process.exit(1); }
// print a short preview of the response
console.log('Responses API raw response preview:');
console.log(respRaw.slice(0,4000));
// try to extract JSON in response text
try{
const parsed = JSON.parse(respRaw);
console.log('\nParsed Responses JSON keys:', Object.keys(parsed));
// try to find text content
if (parsed.output && parsed.output.length){
console.log('\nModel output (first content item):');
console.log(JSON.stringify(parsed.output[0], null, 2).slice(0,4000));
}
}catch(e){
console.log('\nCould not parse Responses raw as JSON; showing raw body (truncated)');
}
console.log('\nDone.');