feat(market-intel): implement role-based campaign engine and gritty reporting

- Implementierung der rollenbasierten Campaign-Engine mit operativem Fokus (Grit).
- Integration von Social Proof (Referenzkunden) in die E-Mail-Generierung.
- Erweiterung des Deep Tech Audits um gezielte Wettbewerber-Recherche (Technographic Search).
- Fix des Lösch-Bugs in der Target-Liste und Optimierung des Frontend-States.
- Erweiterung des Markdown-Exports um transparente Proof-Links und Evidenz.
- Aktualisierung der Dokumentation in readme.md und market_intel_backend_plan.md.
This commit is contained in:
2025-12-22 15:54:06 +00:00
parent 6fcd29a11a
commit 461d9d3bbc
9 changed files with 545 additions and 76 deletions

View File

@@ -170,11 +170,65 @@ export const generateOutreachCampaign = async (
language: Language,
referenceUrl: string
): Promise<EmailDraft[]> => {
// Dieser Teil muss noch im Python-Backend implementiert werden
console.warn("generateOutreachCampaign ist noch nicht im Python-Backend implementiert.");
return [];
};
console.log(`Frontend: Starte Outreach-Generierung für ${companyData.companyName}...`);
try {
const response = await fetch(`${API_BASE_URL}/generate-outreach`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
companyData,
knowledgeBase,
referenceUrl
}),
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`Backend-Fehler: ${errorData.error || response.statusText}`);
}
const result = await response.json();
console.log(`Frontend: Outreach-Generierung für ${companyData.companyName} erfolgreich.`);
// Transform new backend structure to match frontend EmailDraft interface
if (Array.isArray(result)) {
return result.map((item: any) => {
// Construct a body that shows the sequence
let fullBody = "";
const firstSubject = item.emails?.[0]?.subject || "No Subject";
if (item.emails && Array.isArray(item.emails)) {
item.emails.forEach((mail: any, idx: number) => {
fullBody += `### Email ${idx + 1}: ${mail.subject}\n\n`;
fullBody += `${mail.body}\n\n`;
if (idx < item.emails.length - 1) fullBody += `\n---\n\n`;
});
} else {
// Fallback for flat structure or error
fullBody = item.body || "No content generated.";
}
return {
persona: item.target_role || "Unknown Role",
subject: firstSubject,
body: fullBody,
keyPoints: item.rationale ? [item.rationale] : []
};
});
} else if (result.campaign && Array.isArray(result.campaign)) {
return result.campaign as EmailDraft[];
}
return [];
} catch (error) {
console.error(`Frontend: Outreach-Generierung fehlgeschlagen für ${companyData.companyName}`, error);
throw error;
}
};
export const translateEmailDrafts = async (drafts: EmailDraft[], targetLanguage: Language): Promise<EmailDraft[]> => {
// Dieser Teil muss noch im Python-Backend oder direkt im Frontend implementiert werden
console.warn("translateEmailDrafts ist noch nicht im Python-Backend implementiert.");