dates
This commit is contained in:
@@ -10,6 +10,7 @@ import type {
|
||||
Competitor,
|
||||
DorkQuery
|
||||
} from './types'
|
||||
import { logServer } from "@/lib/server-logger";
|
||||
|
||||
const openai = new OpenAI({
|
||||
apiKey: process.env.OPENAI_API_KEY
|
||||
@@ -46,7 +47,13 @@ async function aiGenerate<T>(prompt: string, systemPrompt: string, temperature:
|
||||
|
||||
try { return JSON.parse(jsonStr) as T }
|
||||
catch (e) {
|
||||
console.error('Failed to parse JSON:', jsonStr.substring(0, 200))
|
||||
await logServer({
|
||||
level: "error",
|
||||
message: "Failed to parse JSON from AI response",
|
||||
labels: ["analysis-pipeline", "ai", "error"],
|
||||
payload: { sample: jsonStr.substring(0, 200) },
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
throw new Error('Invalid JSON response from AI')
|
||||
}
|
||||
}
|
||||
@@ -490,60 +497,149 @@ export async function performDeepAnalysis(
|
||||
content: ScrapedContent,
|
||||
onProgress?: (update: AnalysisProgressUpdate) => void | Promise<void>
|
||||
): Promise<EnhancedProductAnalysis> {
|
||||
console.log('🔍 Starting deep analysis...')
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Starting deep analysis",
|
||||
labels: ["analysis-pipeline", "start"],
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
|
||||
console.log(' 🧭 Product profiling...')
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Product profiling",
|
||||
labels: ["analysis-pipeline", "profile"],
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
const productProfile = await extractProductProfile(content)
|
||||
console.log(` ✓ Profiled as ${productProfile.category} for ${productProfile.targetPersona} (conf ${productProfile.confidence})`)
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Product profile complete",
|
||||
labels: ["analysis-pipeline", "profile"],
|
||||
payload: {
|
||||
category: productProfile.category,
|
||||
targetPersona: productProfile.targetPersona,
|
||||
confidence: productProfile.confidence,
|
||||
},
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
|
||||
console.log(' 📦 Pass 1: Features...')
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Pass 1: Features",
|
||||
labels: ["analysis-pipeline", "features"],
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "features", status: "running" })
|
||||
const features = await extractFeatures(content)
|
||||
console.log(` ✓ ${features.length} features`)
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Features extracted",
|
||||
labels: ["analysis-pipeline", "features"],
|
||||
payload: { count: features.length },
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "features", status: "completed", detail: `${features.length} features` })
|
||||
|
||||
console.log(' 🏆 Pass 2: Competitors...')
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Pass 2: Competitors",
|
||||
labels: ["analysis-pipeline", "competitors"],
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "competitors", status: "running" })
|
||||
const candidateSet = await generateCompetitorCandidates(productProfile)
|
||||
const competitors = await selectDirectCompetitors(productProfile, candidateSet.candidates)
|
||||
console.log(` ✓ ${competitors.length} competitors: ${competitors.map(c => c.name).join(', ')}`)
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Competitors extracted",
|
||||
labels: ["analysis-pipeline", "competitors"],
|
||||
payload: { count: competitors.length, names: competitors.map((c) => c.name) },
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({
|
||||
key: "competitors",
|
||||
status: "completed",
|
||||
detail: `${competitors.length} competitors: ${competitors.map(c => c.name).join(', ')}`
|
||||
})
|
||||
|
||||
console.log(' 🔑 Pass 3: Keywords...')
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Pass 3: Keywords",
|
||||
labels: ["analysis-pipeline", "keywords"],
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "keywords", status: "running" })
|
||||
const keywords = await generateKeywords(features, content, competitors)
|
||||
console.log(` ✓ ${keywords.length} keywords (${keywords.filter(k => k.type === 'differentiator').length} differentiators)`)
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Keywords extracted",
|
||||
labels: ["analysis-pipeline", "keywords"],
|
||||
payload: {
|
||||
count: keywords.length,
|
||||
differentiators: keywords.filter((k) => k.type === "differentiator").length,
|
||||
},
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({
|
||||
key: "keywords",
|
||||
status: "completed",
|
||||
detail: `${keywords.length} keywords (${keywords.filter(k => k.type === 'differentiator').length} differentiators)`
|
||||
})
|
||||
|
||||
console.log(' 🎯 Pass 4: Problems...')
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Pass 4: Problems",
|
||||
labels: ["analysis-pipeline", "problems"],
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "problems", status: "running" })
|
||||
const problems = await identifyProblems(features, content)
|
||||
const personas = await generatePersonas(content, problems)
|
||||
console.log(` ✓ ${problems.length} problems, ${personas.length} personas`)
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Problems and personas extracted",
|
||||
labels: ["analysis-pipeline", "problems"],
|
||||
payload: { problems: problems.length, personas: personas.length },
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({
|
||||
key: "problems",
|
||||
status: "completed",
|
||||
detail: `${problems.length} problems, ${personas.length} personas`
|
||||
})
|
||||
|
||||
console.log(' 💡 Pass 5: Use cases...')
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Pass 5: Use cases",
|
||||
labels: ["analysis-pipeline", "use-cases"],
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "useCases", status: "running" })
|
||||
const useCases = await generateUseCases(features, personas, problems)
|
||||
console.log(` ✓ ${useCases.length} use cases`)
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Use cases extracted",
|
||||
labels: ["analysis-pipeline", "use-cases"],
|
||||
payload: { count: useCases.length },
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "useCases", status: "completed", detail: `${useCases.length} use cases` })
|
||||
|
||||
console.log(' 🔎 Pass 6: Dork queries...')
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Pass 6: Dork queries",
|
||||
labels: ["analysis-pipeline", "dork-queries"],
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "dorkQueries", status: "running" })
|
||||
const dorkQueries = generateDorkQueries(keywords, problems, useCases, competitors)
|
||||
console.log(` ✓ ${dorkQueries.length} queries`)
|
||||
await logServer({
|
||||
level: "info",
|
||||
message: "Dork queries extracted",
|
||||
labels: ["analysis-pipeline", "dork-queries"],
|
||||
payload: { count: dorkQueries.length },
|
||||
source: "lib/analysis-pipeline",
|
||||
});
|
||||
await onProgress?.({ key: "dorkQueries", status: "completed", detail: `${dorkQueries.length} queries` })
|
||||
|
||||
const productName = content.title.split(/[\|\-–—:]/)[0].trim()
|
||||
|
||||
Reference in New Issue
Block a user