From 5de31d5766f3d0c50569d81b47384ac6f884b8bd Mon Sep 17 00:00:00 2001 From: vickytechkey Date: Mon, 19 Oct 2026 21:09:21 +0530 Subject: [PATCH] fix: graceful fallback and manual option for onboarding brand analysis --- apps/web/src/components/prompt-wizard.tsx | 24 ++++++++--- packages/lib/src/onboarding/analyze.ts | 49 +++++++++++++++++++++-- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/apps/web/src/components/prompt-wizard.tsx b/apps/web/src/components/prompt-wizard.tsx index 344eb2f..b5d4abd 100644 --- a/apps/web/src/components/prompt-wizard.tsx +++ b/apps/web/src/components/prompt-wizard.tsx @@ -365,12 +365,24 @@ export default function PromptWizard({ onComplete }: PromptWizardProps) { {error} - +
+ + +
) : (
diff --git a/packages/lib/src/onboarding/analyze.ts b/packages/lib/src/onboarding/analyze.ts index f7a51a2..918252b 100644 --- a/packages/lib/src/onboarding/analyze.ts +++ b/packages/lib/src/onboarding/analyze.ts @@ -197,7 +197,30 @@ export async function analyzeBrand(options: AnalyzeBrandOptions): Promise 0 ? [ + { name: "Competitor 1", domains: ["example-competitor.com"], aliases: [] } + ] : [], + suggestedPrompts: ctx.maxPrompts > 0 ? [ + { prompt: `best ${rawName.toLowerCase()} alternatives`, tags: ["competitors"] }, + { prompt: `what is ${rawName.toLowerCase()}`, tags: ["general"] }, + { prompt: `top platforms like ${rawName.toLowerCase()}`, tags: ["competitors"] }, + { prompt: `how does ${rawName.toLowerCase()} work`, tags: ["product"] }, + ] : [], + }; + } const result = normalizeAnalysisResult(raw, ctx); console.log( @@ -452,7 +475,13 @@ ${excerptBlock} Identify direct competitors that sell similar products or services. Use web search to verify facts. Never invent information — return an empty array if uncertain.`; const schema = buildCompetitorsSchema(maxCompetitors); - const raw = await runStructuredResearchPrompt(prompt, schema); + let raw: { competitors?: { name: string; domains?: string[]; aliases?: string[] }[] }; + try { + raw = await runStructuredResearchPrompt(prompt, schema); + } catch (err) { + console.warn(`[onboarding] analyzeCompetitors LLM failed for ${options.website}:`, err); + raw = { competitors: [] }; + } const competitors: OnboardingCompetitor[] = []; const ownedDomains = new Set([normalizedWebsite]); @@ -529,7 +558,21 @@ ${comps} Identify a starter set of AI tracking prompts to monitor this brand's visibility in LLM outputs. Use web search to verify facts.`; const schema = buildPromptsSchema(maxPrompts); - const raw = await runStructuredResearchPrompt(prompt, schema); + let raw: { suggestedPrompts?: { prompt: string; tags?: string[] }[] }; + try { + raw = await runStructuredResearchPrompt(prompt, schema); + } catch (err) { + console.warn(`[onboarding] analyzePrompts LLM failed for ${options.website}:`, err); + const rawName = options.brandName || "Brand"; + raw = { + suggestedPrompts: [ + { prompt: `best ${rawName.toLowerCase()} alternatives`, tags: ["competitors"] }, + { prompt: `what is ${rawName.toLowerCase()}`, tags: ["general"] }, + { prompt: `how does ${rawName.toLowerCase()} work`, tags: ["product"] }, + { prompt: `top tools like ${rawName.toLowerCase()}`, tags: ["competitors"] }, + ], + }; + } const suggestedPrompts: OnboardingPrompt[] = []; const seen = new Set();