diff --git a/general-market-intelligence/components/StepReport.tsx b/general-market-intelligence/components/StepReport.tsx index a63c0fd1..528b5025 100644 --- a/general-market-intelligence/components/StepReport.tsx +++ b/general-market-intelligence/components/StepReport.tsx @@ -43,35 +43,34 @@ export const StepReport: React.FC = ({ results, strategy, onRes }; const downloadMarkdown = () => { - const signalHeaders = strategy.signals.map(s => s.name); + if (!strategy || !results) return; + + const signalHeaders = (strategy.signals || []).map(s => s.name); const headers = ["Company", "Prio", "Rev/Emp", "Status", ...signalHeaders, "Recommendation"]; const rows = sortedResults.map(r => { - const signalValues = strategy.signals.map(s => { - const data = r.dynamicAnalysis[s.id]; + const signalValues = (strategy.signals || []).map(s => { + const data = r.dynamicAnalysis ? r.dynamicAnalysis[s.id] : null; if (!data) return '-'; let content = data.value || '-'; - // Sanitize content pipes content = content.replace(/\|/g, '\\|'); if (data.proof) { - // Sanitize proof pipes and newlines const safeProof = data.proof.replace(/\|/g, '\\|').replace(/(\r\n|\n|\r)/gm, ' '); content += `
*Proof: ${safeProof}*`; } return content; }); - // Helper to sanitize other fields const safe = (str: string) => (str || '').replace(/\|/g, '\\|').replace(/(\r\n|\n|\r)/gm, ' '); return `| ${safe(r.companyName)} | ${r.tier} | ${safe(r.revenue)} / ${safe(r.employees)} | ${r.status} | ${signalValues.join(" | ")} | ${safe(r.recommendation)} |`; }); const content = ` -# Market Intelligence Report: ${strategy.productContext} -**Context:** ${strategy.idealCustomerProfile} +# Market Intelligence Report: ${strategy.productContext || 'N/A'} +**Context:** ${strategy.idealCustomerProfile || 'N/A'} **Search Strategy ICP:** ${strategy.searchStrategyICP || 'N/A'} **Digital Signals:** ${strategy.digitalSignals || 'N/A'} diff --git a/market_intel_orchestrator.py b/market_intel_orchestrator.py index 52c7a3dd..29e6b73c 100644 --- a/market_intel_orchestrator.py +++ b/market_intel_orchestrator.py @@ -547,14 +547,13 @@ def analyze_company(company_name, strategy, target_market): def generate_outreach_campaign(company_data_json, knowledge_base_content, reference_url, specific_role=None): """ Erstellt personalisierte E-Mail-Kampagnen. - Modus A (Default): Generiert Top 5 Kampagnen + Liste weiterer relevanter Rollen. - Modus B (specific_role): Generiert nur Kampagne für diese eine Rolle. """ company_name = company_data_json.get('companyName', 'Unknown') logger.info(f"--- STARTING OUTREACH GENERATION FOR: {company_name} (Role: {specific_role if specific_role else 'Top 5'}) ---") api_key = load_gemini_api_key() - GEMINI_API_URL = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:generateContent?key={api_key}" + # Use gemini-2.5-flash for SPEED in outreach generation + GEMINI_API_URL = f"https://generativelanguage.googleapis.com/v1/models/gemini-2.5-flash:generateContent?key={api_key}" if specific_role: # --- MODE B: SINGLE ROLE GENERATION ---