- StoreForge API: e-commerce site generator via WEVIA - LeadForge API: B2B lead generation + ICP + sequences - ProposalAI API: commercial proposal generator - BlueprintAI API: process/architecture document generator - MailWarm API: email warmup status/start/history - OutreachAI API: cold outreach sequences + subject lines - FormBuilder API: AI form generator - EmailVerify API: email validation (MX, disposable, format) - Auth OTP: replaces email-only auth with OTP/magic-link - SQL migration: auth_otp + auth_attempts tables - WEVIA proxy library: routes all AI calls through server-side Ollama - Auth library: API key validation + rate limiting via Redis Co-authored-by: Yacineutt <Yacineutt@users.noreply.github.com>
73 lines
2.7 KiB
PHP
73 lines
2.7 KiB
PHP
<?php
|
|
/**
|
|
* OutreachAI API — AI-powered outreach sequence generator
|
|
* POST /api/outreachai/generate
|
|
*/
|
|
require_once __DIR__ . '/../lib/auth.php';
|
|
require_once __DIR__ . '/../lib/wevia-proxy.php';
|
|
|
|
$user = requireAuth();
|
|
rateLimitCheck($user['id'], 10, 60);
|
|
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
$action = $input['action'] ?? 'sequence';
|
|
|
|
switch ($action) {
|
|
case 'sequence':
|
|
$target = $input['target'] ?? '';
|
|
$product = $input['product'] ?? '';
|
|
$steps = min($input['steps'] ?? 5, 10);
|
|
$channel = $input['channel'] ?? 'email';
|
|
$tone = $input['tone'] ?? 'professionnel';
|
|
$language = $input['language'] ?? 'fr';
|
|
|
|
if (empty($target)) {
|
|
http_response_code(400);
|
|
echo json_encode(['error' => 'target requis']);
|
|
exit;
|
|
}
|
|
|
|
$systemPrompt = "Expert cold outreach B2B. Cree une sequence de $steps etapes multicanal. Chaque etape: sujet email, corps (personnalise), timing optimal, canal ($channel), taux de reponse estime. Ton: $tone. Evite le spam, privilegier la valeur. Langue: $language.";
|
|
$userPrompt = "Cible: $target\nProduit/Service: $product\nNombre d'etapes: $steps";
|
|
|
|
$result = weviaGenerate($systemPrompt, $userPrompt);
|
|
break;
|
|
|
|
case 'subject_lines':
|
|
$context = $input['context'] ?? '';
|
|
$count = min($input['count'] ?? 10, 20);
|
|
|
|
$systemPrompt = "Expert email marketing. Genere $count lignes de sujet email performantes. Objectif: taux d'ouverture >40%. Format JSON array avec: subject, estimated_open_rate, technique_used.";
|
|
$userPrompt = "Contexte: $context";
|
|
|
|
$result = weviaGenerate($systemPrompt, $userPrompt, ['temperature' => 0.9]);
|
|
break;
|
|
|
|
case 'personalize':
|
|
$template = $input['template'] ?? '';
|
|
$prospect = $input['prospect'] ?? [];
|
|
|
|
$systemPrompt = "Expert en personnalisation email B2B. Personnalise le template avec les informations du prospect. Rends le message naturel et specifique. Pas de formules generiques.";
|
|
$userPrompt = "Template:\n$template\n\nProspect:\n" . json_encode($prospect, JSON_PRETTY_PRINT);
|
|
|
|
$result = weviaGenerate($systemPrompt, $userPrompt);
|
|
break;
|
|
|
|
default:
|
|
http_response_code(400);
|
|
echo json_encode(['error' => 'Action invalide', 'valid' => ['sequence', 'subject_lines', 'personalize']]);
|
|
exit;
|
|
}
|
|
|
|
if (isset($result['error'])) {
|
|
http_response_code($result['status'] ?? 500);
|
|
echo json_encode(['error' => $result['error']]);
|
|
exit;
|
|
}
|
|
|
|
echo json_encode([
|
|
'action' => $action,
|
|
'content' => $result['content'],
|
|
'model' => $result['model']
|
|
]);
|