debug-parse26.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. // Extract mainTheme
  11. const mainThemeMatch = aiResponse.match(/"mainTheme"\s*:\s*"([^"]+)"/);
  12. console.log('mainTheme:', mainThemeMatch ? mainThemeMatch[1].substring(0, 50) : 'none');
  13. // Extract structureLogic
  14. const structureLogicMatch = aiResponse.match(/"structureLogic"\s*:\s*"([^"]+)"/);
  15. console.log('structureLogic:', structureLogicMatch ? structureLogicMatch[1].substring(0, 50) : 'none');
  16. // Find chapters array
  17. const chaptersArrayStart = aiResponse.indexOf('"chapters":[');
  18. console.log('\nChapters array starts at:', chaptersArrayStart);
  19. if (chaptersArrayStart === -1) {
  20. console.log('No chapters array found!');
  21. process.exit(1);
  22. }
  23. // Find array end by counting brackets
  24. let bracketDepth = 0;
  25. let inString = false;
  26. let escapeNext = false;
  27. let arrayEnd = -1;
  28. for (let i = chaptersArrayStart + 12; i < aiResponse.length; i++) {
  29. const ch = aiResponse[i];
  30. if (escapeNext) { escapeNext = false; continue; }
  31. if (ch === '\\') { escapeNext = true; continue; }
  32. if (ch === '"') { inString = !inString; continue; }
  33. if (inString) continue;
  34. if (ch === '[') bracketDepth++;
  35. else if (ch === ']') { bracketDepth--; if (bracketDepth === 0) { arrayEnd = i; break; } }
  36. }
  37. console.log('Chapters array ends at:', arrayEnd);
  38. if (arrayEnd === -1) {
  39. console.log('Could not find array end!');
  40. process.exit(1);
  41. }
  42. const arrayContent = aiResponse.substring(chaptersArrayStart + 12, arrayEnd);
  43. console.log('Array content length:', arrayContent.length);
  44. console.log('Array content start:', JSON.stringify(arrayContent.substring(0, 100)));
  45. console.log('Array content end:', JSON.stringify(arrayContent.substring(arrayContent.length - 100)));
  46. // Fix missing quotes
  47. function fixMissingQuotes(jsonStr) {
  48. return jsonStr
  49. .replace(/\{number":/g, '{"number":')
  50. .replace(/\{title":/g, '{"title":')
  51. .replace(/\{summary":/g, '{"summary":')
  52. .replace(/\{opening":/g, '{"opening":')
  53. .replace(/\{structure":/g, '{"structure":')
  54. .replace(/\{mustCover":/g, '{"mustCover":')
  55. .replace(/\{mustNotRepeat":/g, '{"mustNotRepeat":')
  56. .replace(/\{toneAdjustment":/g, '{"toneAdjustment":')
  57. .replace(/\{keyTakeaway":/g, '{"keyTakeaway":')
  58. .replace(/\{keyPoints":/g, '{"keyPoints":')
  59. .replace(/\{estimatedWords":/g, '{"estimatedWords":')
  60. .replace(/\{writingInstructions":/g, '{"writingInstructions":')
  61. .replace(/\{number:/g, '{"number":')
  62. .replace(/\{title:/g, '{"title":')
  63. .replace(/\{summary:/g, '{"summary":')
  64. .replace(/\{opening:/g, '{"opening":')
  65. .replace(/\{structure:/g, '{"structure":')
  66. .replace(/\{mustCover:/g, '{"mustCover":')
  67. .replace(/\{mustNotRepeat:/g, '{"mustNotRepeat":')
  68. .replace(/\{toneAdjustment:/g, '{"toneAdjustment":')
  69. .replace(/\{keyTakeaway:/g, '{"keyTakeaway":')
  70. .replace(/\{keyPoints:/g, '{"keyPoints":')
  71. .replace(/\{estimatedWords:/g, '{"estimatedWords":')
  72. .replace(/\{writingInstructions:/g, '{"writingInstructions":');
  73. }
  74. const fixedContent = fixMissingQuotes(arrayContent);
  75. console.log('\nFixed content start:', JSON.stringify(fixedContent.substring(0, 100)));
  76. // Try to parse
  77. try {
  78. const chapters = JSON.parse('[' + fixedContent + ']');
  79. console.log('Parsed SUCCESS, chapters:', chapters.length);
  80. } catch(e) {
  81. console.log('Parse FAILED:', e.message.substring(0, 80));
  82. // Try regex extraction
  83. const chapterMatches = fixedContent.match(/\{[^}]+\}/g) || [];
  84. console.log('Found', chapterMatches.length, 'chapter objects by regex');
  85. let validChapters = 0;
  86. for (const chStr of chapterMatches) {
  87. try {
  88. const ch = JSON.parse(chStr);
  89. if (ch && ch.title && ch.number) {
  90. validChapters++;
  91. console.log(' Valid chapter:', ch.number, '-', ch.title.substring(0, 40));
  92. }
  93. } catch(e) {
  94. // Skip
  95. }
  96. }
  97. console.log('Total valid chapters:', validChapters);
  98. }