| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- const fs = require('fs');
- const content = fs.readFileSync('temp/rich-outline-fail_57_1779014691106.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);
- const pos = 523;
- console.log('\n=== Position', pos, 'context ===');
- console.log(JSON.stringify(aiResponse.substring(Math.max(0,pos-80), pos+80)));
- // Check what char is at position 523
- console.log('\nChar at 523:', JSON.stringify(aiResponse[523]));
- console.log('Char code at 523:', aiResponse.charCodeAt(523));
- // Check if position 523 is inside a string
- let inString = false;
- let escapeNext = false;
- let lastQuotePos = -1;
- for (let i = 0; i < pos; i++) {
- const ch = aiResponse[i];
- if (escapeNext) { escapeNext = false; continue; }
- if (ch === '\\') { escapeNext = true; continue; }
- if (ch === '"') { inString = !inString; lastQuotePos = i; }
- }
- console.log('At pos 523, inString:', inString, 'lastQuotePos:', lastQuotePos);
- // First 200 chars
- console.log('\n=== First 200 chars ===');
- console.log(JSON.stringify(aiResponse.substring(0, 200)));
- // Check for <think>
- console.log('\nContains <think>:', aiResponse.includes('<think>'));
- console.log('Starts with {:', aiResponse.trim().startsWith('{'));
- // Try the fixed think tag regex
- const thinkTagMatch = aiResponse.match(/^<think>[\s\S]*?<\/think>\s*/i);
- console.log('thinkTagMatch found:', !!thinkTagMatch);
- // Try strategy 1: direct parse
- try {
- const data = JSON.parse(aiResponse);
- console.log('Direct parse SUCCESS, chapters:', data.chapters?.length);
- } catch(e) {
- console.log('Direct parse failed:', e.message.substring(0, 80));
- }
- // Try strategy 2: remove code blocks
- let cleaned = aiResponse.replace(/```json\s*/g, '').replace(/```\s*/g, '');
- try {
- const data = JSON.parse(cleaned);
- console.log('After codeblock removal SUCCESS, chapters:', data.chapters?.length);
- } catch(e) {
- console.log('Strategy 2 failed:', e.message.substring(0, 80));
- }
- // Strategy 3: regex extract
- const match = aiResponse.match(/\{[\s\S]*\}/);
- if (match) {
- try {
- const data = JSON.parse(match[0]);
- console.log('Strategy 3 SUCCESS, chapters:', data.chapters?.length);
- } catch(e) {
- console.log('Strategy 3 failed:', e.message.substring(0, 80));
- }
- } else {
- console.log('Strategy 3: no JSON object found');
- }
|