| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- const fs = require('fs');
- const content = fs.readFileSync('temp/rich-outline-fail_57_1779015509994.txt', 'utf-8');
- const marker = '========== AI 原始响应 ';
- const markerIdx = content.indexOf(marker);
- const headerEndIdx = content.indexOf(' ==========', markerIdx);
- const aiStart = content.indexOf('\n', headerEndIdx) + 1;
- const aiEnd = content.indexOf('\n\n', aiStart);
- const aiResponse = content.substring(aiStart, aiEnd);
- console.log('AI response length:', aiResponse.length);
- // Let me try a completely different approach: check if there's a smarter fix
- // I'll look for ALL occurrences of },{ followed by an unquoted property name
- // First, let's find what property names are used after },{
- const allCases = [];
- const regex = /\},\{([^"]+):/g;
- let match;
- while ((match = regex.exec(aiResponse)) !== null) {
- allCases.push({pos: match.index, prop: match[1]});
- }
- console.log('Found', allCases.length, 'cases of },{propName:');
- if (allCases.length < 20) {
- allCases.forEach(c => console.log(' pos', c.pos, ':', c.prop));
- }
- // Check if maybe there are nested issues
- // Let's try parsing from the beginning but stop at position 1624
- const truncatedAtError = aiResponse.substring(0, 1624) + '"}]}]}'; // Close all open structures
- try {
- JSON.parse(truncatedAtError);
- console.log('Truncated parse: SUCCESS');
- } catch(e) {
- console.log('Truncated parse: FAILED -', e.message.substring(0, 80));
- }
- // Try a different fix: replace ALL },{ with },{"
- const fixedV2 = aiResponse.replace(/\},\{([a-zA-Z_])/g, '},{"$1');
- try {
- const data = JSON.parse(fixedV2);
- console.log('\nFix v2: SUCCESS, chapters:', data.chapters?.length);
- } catch(e) {
- console.log('\nFix v2: FAILED -', e.message.substring(0, 80));
- // Find which occurrence is problematic
- const fixedPos = parseInt(e.message.match(/position (\d+)/)?.[1] || '0');
- console.log('Error at position', fixedPos);
- console.log('Context:', JSON.stringify(fixedV2.substring(Math.max(0, fixedPos-50), fixedPos+50)));
- }
- // Let's also check for a different issue - what if there's a missing comma between array elements?
- // Check for patterns like "keyPoints":["foo","bar"]}{"next"
- const badTransition = /\]\}\{/g;
- const badTransitions = aiResponse.match(badTransition);
- console.log('\nFound', badTransitions ? badTransitions.length : 0, 'instances of ]}{ (missing comma)');
- // Let's check if the entire JSON is actually truncated - look at the very end
- console.log('\n=== End of JSON ===');
- console.log('Last 200 chars:', JSON.stringify(aiResponse.substring(aiResponse.length - 200)));
- // Try parsing from start, but let's see if we can find any workaround
- // What if we just try to extract the chapters array without the outer structure?
- const chaptersMatch = aiResponse.match(/"chapters"\s*:\s*\[([\s\S]*)\]\s*\}$/);
- if (chaptersMatch) {
- console.log('\nFound chapters array match, length:', chaptersMatch[1].length);
- try {
- const chaptersStr = '[{"number":1' + chaptersMatch[1];
- const data = JSON.parse(chaptersStr);
- console.log('Chapters extraction: SUCCESS, count:', data.length);
- } catch(e) {
- console.log('Chapters extraction: FAILED -', e.message.substring(0, 80));
- }
- } else {
- console.log('\nNo chapters array found at expected location');
- }
|