Files
wevads-gpu/saas-backends/outreachai/api.php
Cursor Agent 463f2d232a Add SaaS Factory backends: 8 product APIs + OTP auth + WEVIA proxy
- 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>
2026-03-09 22:35:16 +00:00

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']
]);