Claude + Symfony : 5 patterns pour intégrer l'IA dans ton app PHP
Photo by Rock'n Roll Monkey on Unsplash
Tu as une app Symfony en prod. Tu veux y greffer Claude (Anthropic) — pas pour faire un POC, mais pour ajouter des fonctions utiles qui restent maintenables.
Voilà 5 patterns que j'utilise au quotidien sur MoonManager et les apps clients Monwoo — du plus simple au plus puissant.
Pourquoi greffer Claude dans une app Symfony existante
L'IA générative apporte une vraie valeur quand elle s'intègre au workflow existant — pas quand elle reste un POC isolé. Sur les apps que je maintiens (MoonManager, miguel.monwoo.com), Claude est devenu un service Symfony comme un autre : injecté, testable, monitorable.
L'objectif : partager 5 patterns d'intégration qui ont survécu à la mise en prod, avec leurs cas d'usage concrets.
Pattern 1 — One-shot prompt (sync, simple, prévisible)
Le pattern de base : un appel synchrone Claude → une réponse texte. Idéal pour les tâches courtes, déterministes, où l'utilisateur attend une réponse en moins de 5 secondes.
Cas d'usage Monwoo : résumé automatique des messages clients entrants pour la liste des leads dans le cockpit admin. Généré une fois, mis en cache en DB.
class AiOneShotService {
public function summarize(string $message): string {
$response = $this->httpClient->request('POST', 'https://api.anthropic.com/v1/messages', [
'headers' => ['x-api-key' => $this->apiKey, 'anthropic-version' => '2023-06-01'],
'json' => [
'model' => 'claude-haiku-4-5-20251001',
'max_tokens' => 200,
'messages' => [['role' => 'user', 'content' => "Résume en 2 phrases:\n$message"]],
],
]);
return $response->toArray()['content'][0]['text'] ?? '';
}
}
Pattern 2 — Streaming SSE (réponse temps réel)
Pour les réponses longues affichées au fur et à mesure de la génération (chatbot). Symfony StreamedResponse + Anthropic stream: true.
Cas Monwoo : chatbot cross-domain info.monwoo.com + miguel.monwoo.com — premiers mots visibles en moins d'une seconde, attente acceptable même pour une réponse de 30 secondes.
#[Route('/api/chatbot/stream', methods: ['POST'])]
public function stream(Request $req): StreamedResponse {
return new StreamedResponse(function () use ($req) {
$response = $this->httpClient->request('POST', $this->apiUrl, [
'json' => ['model' => 'claude-sonnet-4-6', 'stream' => true, /*...*/],
'buffer' => false,
]);
foreach ($this->httpClient->stream($response) as $chunk) {
echo "data: " . $chunk->getContent() . "\n\n";
ob_flush(); flush();
}
}, 200, ['Content-Type' => 'text/event-stream', 'X-Accel-Buffering' => 'no']);
}
Pattern 3 — Tool calling (Claude appelle tes fonctions Symfony)
Le pattern le plus puissant : Claude décide d'appeler une fonction PHP que tu exposes. Tu déclares les outils (signatures, descriptions), Claude reçoit la question utilisateur et choisit lui-même quelle fonction invoquer avec quels paramètres.
Cas Monwoo : chatbot lead capture qui utilise 3 outils : lookup_existing_lead(email), create_lead(name, email, topic), schedule_followup(email, days). Quand un visiteur écrit "Salut, je suis Paul de Acme, on peut se rappeler sur du Symfony ?", Claude orchestre lui-même la recherche, création et confirmation.
Pattern 4 — Background classification (Symfony Messenger + Claude)
Pour le batch processing (captures écran, emails, factures), on utilise Symfony Messenger : chaque item dispatché dans une queue, worker consume + appelle Claude en async.
Cas Monwoo : pipeline MoonManager classifie 1 capture/10 min via worker Messenger + Claude OCR. Retry automatique sur rate limit, concurrence contrôlée, découplé du HTTP utilisateur.
Pattern 5 — Cost tracking (transparence facturation IA)
Logger chaque appel API Claude avec tokens in/out, modèle, coût en euros, projet associé. Permet de répondre transparent au client : "Ce mois, votre projet a consommé 12,40 € d'IA — détail des 87 appels sur demande."
class AiUsageTracker {
public function track(string $model, int $tokensIn, int $tokensOut, ?string $projectTag = null): void {
$cost = $this->computeCost($model, $tokensIn, $tokensOut);
$log = (new AiUsageLog())->setModel($model)->setTokensIn($tokensIn)
->setTokensOut($tokensOut)->setCostEur($cost)->setProjectTag($projectTag);
$this->em->persist($log); $this->em->flush();
}
}
Mise en place progressive recommandée
- Semaine 1 : Pattern 1 (one-shot) pour une fonction simple
- Semaine 2-3 : Pattern 5 (cost tracking) AVANT de scaler
- Semaine 4 : Pattern 4 (Messenger) si batch processing
- Mois 2 : Pattern 2 (streaming) pour UX longues
- Mois 3 : Pattern 3 (tool calling) pour workflows agentiques
Pour aller plus loin
Le code complet des 5 patterns (services Symfony, tests E2E, configuration .env, retry exponentiel, monitoring) est disponible en pack Partner Monwoo (99 €) : code source + walkthrough vidéo screencast 30 min + dashboard cost tracking Svelte 5.
Questions, projets ?
Cas tordu non couvert ? service@monwoo.com — 30 minutes d'échange gratuit pour cadrer.