62 lines
2.8 KiB
JavaScript
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.');
|