debug-parse25.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. const fs = require('fs');
  2. const content = fs.readFileSync('temp/rich-outline-fail_57_1779022210168.txt', 'utf-8');
  3. const marker = '========== AI 原始响应 ';
  4. const markerIdx = content.indexOf(marker);
  5. const headerEndIdx = content.indexOf(' ==========', markerIdx);
  6. const aiStart = content.indexOf('\n', headerEndIdx) + 1;
  7. const aiEnd = content.indexOf('\n\n', aiStart);
  8. const aiResponse = content.substring(aiStart, aiEnd);
  9. console.log('AI response length:', aiResponse.length);
  10. // Count braces
  11. let openBraces = 0, closeBraces = 0;
  12. let inString = false, escapeNext = false;
  13. for (let i = 0; i < aiResponse.length; i++) {
  14. const ch = aiResponse[i];
  15. if (escapeNext) { escapeNext = false; continue; }
  16. if (ch === '\\') { escapeNext = true; continue; }
  17. if (ch === '"') { inString = !inString; continue; }
  18. if (inString) continue;
  19. if (ch === '{') openBraces++;
  20. else if (ch === '}') closeBraces++;
  21. }
  22. console.log('Open braces:', openBraces, 'Close:', closeBraces, 'Diff:', openBraces - closeBraces);
  23. console.log('Ends with }:', aiResponse.trim().endsWith('}'));
  24. try {
  25. JSON.parse(aiResponse);
  26. console.log('Raw parse: SUCCESS');
  27. } catch(e) {
  28. console.log('Raw parse FAILED:', e.message.substring(0, 100));
  29. const pos = parseInt(e.message.match(/position (\d+)/)?.[1] || '0');
  30. console.log('Error at position:', pos);
  31. if (pos > 0 && pos < aiResponse.length) {
  32. console.log('Context:', JSON.stringify(aiResponse.substring(Math.max(0,pos-50), pos+50)));
  33. }
  34. }