- Pre-generate sessionId on client side before API call to avoid race conditions - Add small delays in progress tracker to ensure EventSource connection is established - Improve logging and error handling in progress streaming - Add connection confirmation messages in EventSource stream - Fix TypeScript interface to include sessionId in AnalysisProgress This should resolve the lag between actual analysis progress and progress bar display.
138 lines
4.5 KiB
JavaScript
138 lines
4.5 KiB
JavaScript
import { NextResponse } from 'next/server'
|
|
import { enhancedScreenshotService } from '../../../lib/enhanced-screenshot'
|
|
import { aiAnalysisService } from '../../../lib/ai-analysis'
|
|
import { progressTracker } from '../../../lib/progress-tracker'
|
|
|
|
export async function POST(request) {
|
|
try {
|
|
const body = await request.json()
|
|
const { symbol, layouts, timeframe, timeframes, selectedLayouts, analyze = true, sessionId: providedSessionId } = body
|
|
|
|
console.log('📊 Enhanced screenshot request:', { symbol, layouts, timeframe, timeframes, selectedLayouts, providedSessionId })
|
|
|
|
// Use provided sessionId or generate one
|
|
const sessionId = providedSessionId || `analysis_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
|
|
console.log('🔍 Using session ID:', sessionId)
|
|
|
|
// Create progress tracking session with initial steps
|
|
const initialSteps = [
|
|
{
|
|
id: 'init',
|
|
title: 'Initializing Analysis',
|
|
description: 'Starting AI-powered trading analysis...',
|
|
status: 'pending'
|
|
},
|
|
{
|
|
id: 'auth',
|
|
title: 'TradingView Authentication',
|
|
description: 'Logging into TradingView accounts',
|
|
status: 'pending'
|
|
},
|
|
{
|
|
id: 'navigation',
|
|
title: 'Chart Navigation',
|
|
description: 'Navigating to chart layouts',
|
|
status: 'pending'
|
|
},
|
|
{
|
|
id: 'loading',
|
|
title: 'Chart Data Loading',
|
|
description: 'Waiting for chart data and indicators',
|
|
status: 'pending'
|
|
},
|
|
{
|
|
id: 'capture',
|
|
title: 'Screenshot Capture',
|
|
description: 'Capturing high-quality screenshots',
|
|
status: 'pending'
|
|
},
|
|
{
|
|
id: 'analysis',
|
|
title: 'AI Analysis',
|
|
description: 'Analyzing screenshots with AI',
|
|
status: 'pending'
|
|
}
|
|
]
|
|
|
|
// Create the progress session
|
|
console.log('🔍 Creating progress session with steps:', initialSteps.length)
|
|
progressTracker.createSession(sessionId, initialSteps)
|
|
console.log('🔍 Progress session created successfully')
|
|
|
|
// Prepare configuration for screenshot service
|
|
const config = {
|
|
symbol: symbol || 'BTCUSD',
|
|
timeframe: timeframe || timeframes?.[0] || '60', // Use single timeframe, fallback to first of array, then default
|
|
layouts: layouts || selectedLayouts || ['ai'],
|
|
sessionId, // Pass session ID for progress tracking
|
|
credentials: {
|
|
email: process.env.TRADINGVIEW_EMAIL,
|
|
password: process.env.TRADINGVIEW_PASSWORD
|
|
}
|
|
}
|
|
|
|
console.log('🔧 Using config:', config)
|
|
|
|
let screenshots = []
|
|
let analysis = null
|
|
|
|
// Perform AI analysis if requested
|
|
if (analyze) {
|
|
try {
|
|
console.log('🤖 Starting automated capture and analysis...')
|
|
const result = await aiAnalysisService.captureAndAnalyzeWithConfig(config, sessionId)
|
|
screenshots = result.screenshots
|
|
analysis = result.analysis
|
|
console.log('✅ Automated capture and analysis completed')
|
|
} catch (analysisError) {
|
|
console.error('❌ Automated capture and analysis failed:', analysisError)
|
|
// Fall back to screenshot only
|
|
screenshots = await enhancedScreenshotService.captureWithLogin(config, sessionId)
|
|
}
|
|
} else {
|
|
// Capture screenshots only
|
|
screenshots = await enhancedScreenshotService.captureWithLogin(config, sessionId)
|
|
}
|
|
|
|
console.log('📸 Final screenshots:', screenshots)
|
|
|
|
const result = {
|
|
success: true,
|
|
sessionId, // Return session ID for progress tracking
|
|
timestamp: Date.now(),
|
|
symbol: config.symbol,
|
|
layouts: config.layouts,
|
|
timeframes: [config.timeframe],
|
|
screenshots: screenshots.map(path => ({
|
|
layout: config.layouts[0], // For now, assume one layout
|
|
timeframe: config.timeframe,
|
|
url: `/screenshots/${path.split('/').pop()}`,
|
|
timestamp: Date.now()
|
|
})),
|
|
analysis: analysis,
|
|
message: `Successfully captured ${screenshots.length} screenshot(s)${analysis ? ' with AI analysis' : ''}`
|
|
}
|
|
|
|
return NextResponse.json(result)
|
|
} catch (error) {
|
|
console.error('Enhanced screenshot API error:', error)
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: 'Analysis failed',
|
|
message: error.message
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|
|
export async function GET() {
|
|
return NextResponse.json({
|
|
message: 'Enhanced Screenshot API - use POST method for analysis',
|
|
endpoints: {
|
|
POST: '/api/enhanced-screenshot - Run analysis with parameters'
|
|
}
|
|
})
|
|
}
|