Génération de contenu par IA avec prise en charge multi-fournisseurs, contexte de marque et appariement sémantique des styles
Version 1.0.0 • Plus de 80 endpoints • PHP 8.1+
URL de base : https://oui-compose:8890
Introduction
L’API Oui Compose est une puissante plateforme de génération de contenu avec prise en charge de plusieurs fournisseurs d’IA. Elle propose un système de compétences (skills) modulaire, un moteur de contexte de marque, un appariement sémantique des styles et des capacités de RAG (Retrieval Augmented Generation, génération augmentée par récupération).
Authentification
L’API Compose prend en charge deux méthodes d’authentification :
Limites de débit
| Offre | Requêtes/min | Requêtes/mois | Tokens/mois |
|---|---|---|---|
| Starter | 30 | 10,000 | 1,000,000 |
| Professional | 60 | 100,000 | 5,000,000 |
| Enterprise | 300 | 1,000,000 | 50,000,000 |
| Illimité | Illimité | Illimité | Illimité |
Génération de contenu
POST /api/generate
Génère du contenu par IA avec des options personnalisables.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
| user_prompt requis | string | Le prompt/la demande de contenu |
| content_type optionnel | string | social_media, blog_post |
| brand_id optionnel | string | Identifiant du contexte de marque |
| style_id optionnel | string | Identifiant du style rédactionnel |
| provider optionnel | string | anthropic, openai, openrouter |
| model optionnel | string | Nom du modèle spécifique |
| skills optionnel | array | Compétences (skills) à appliquer : social_media, blog_writer, seo, copywriting, email_marketing, storytelling, newsletter |
| use_rag optionnel | boolean | Utiliser la base de connaissances RAG |
| rag_query optionnel | string | Requête de recherche RAG (si use_rag=true) |
| options optionnel | object | temperature, max_tokens, top_p |
Réponse
{
"success": true,
"content": {
"text": "AI is revolutionizing marketing in ways we never imagined...",
"platform": "linkedin",
"hashtags": ["#AIMarketing", "#DigitalTransformation"],
"cta": "What AI tools are you using in your marketing strategy?"
},
"metadata": {
"content_type": "social_media",
"provider": "anthropic",
"model": "claude-3-sonnet-20240229",
"skills_used": ["social_media", "copywriting"],
"response_time_ms": 2340,
"tokens_used": {
"input": 150,
"output": 280,
"total": 430
}
},
"_meta": {
"response_time_ms": 2345,
"version": "1.0.0"
}
}
POST /api/generate/batch
Génère plusieurs contenus en une seule requête.
Réponse
{
"success": true,
"count": 2,
"results": [
{ "success": true, "content": {...} },
{ "success": true, "content": {...} }
],
"summary": {
"successful": 2,
"failed": 0
}
}
GET /api/content-types
Liste tous les types de contenu disponibles et leur configuration.
Réponse
{
"content_types": {
"social_media": {
"name": "social_media",
"display_name": "Social Media Post",
"description": "Platform-specific social media content",
"required_fields": ["user_prompt"],
"optional_fields": ["platform", "hashtags", "tone"],
"defaults": {
"max_tokens": 280
}
},
"blog_post": {
"name": "blog_post",
"display_name": "Blog Post",
"description": "Long-form blog article content",
"required_fields": ["user_prompt"],
"optional_fields": ["title", "sections", "seo_keywords"],
"defaults": {
"max_tokens": 2000
}
}
}
}
Gestion des marques
GET /api/brands/{brandId}
Récupère le contexte et les réglages d’une marque.
Réponse
{
"brand_name": "Acme Corporation",
"industry": "Technology",
"target_audience": "B2B SaaS decision makers",
"products": ["Product A", "Product B"],
"voice": {
"tone": "Professional yet approachable",
"vocabulary": ["innovation", "efficiency", "growth"],
"personality_traits": ["trustworthy", "expert", "friendly"]
},
"metadata": {
"website": "https://acme.com",
"social_handles": {
"twitter": "@acme",
"linkedin": "acme-corporation"
}
}
}
PUT /api/brands/{brandId}
Met à jour le contexte de marque.
Corps de la requête
{
"brand_name": "Acme Corporation",
"industry": "Technology",
"target_audience": "Enterprise software buyers",
"products": ["Product A", "Product B", "Product C"],
"voice": {
"tone": "Professional and authoritative",
"vocabulary": ["enterprise", "scalable", "secure"],
"personality_traits": ["innovative", "reliable"]
}
}
POST /api/brands/{brandId}/analyze-style
Analyse des échantillons de texte pour en extraire, grâce à l’IA, la voix de marque et les schémas de style.
Corps de la requête
{
"samples": [
"First sample of brand content to analyze...",
"Second sample of brand content...",
"Third sample text showing brand voice..."
]
}
Réponse
{
"success": true,
"analysis": {
"tone": "Professional with friendly undertones",
"vocabulary_level": "Advanced but accessible",
"common_phrases": ["drive results", "empower teams", "innovative solutions"],
"sentence_structure": "Mix of short impactful sentences and detailed explanations",
"key_patterns": {
"opening_style": "Question or bold statement",
"closing_style": "Call to action",
"transition_words": ["moreover", "consequently", "indeed"]
}
},
"style_id": "style_abc123"
}
Stratégie de contenu
GET /api/brands/{brandId}/strategy
Récupère la stratégie de contenu d’une marque.
Réponse
{
"brand_id": "acme-corp",
"content_pillars": [
{
"name": "Thought Leadership",
"description": "Industry insights and trends",
"weight": 0.3,
"themes": ["AI trends", "Future of work", "Digital transformation"]
},
{
"name": "Product Education",
"description": "How-to guides and tutorials",
"weight": 0.4,
"themes": ["Feature highlights", "Use cases", "Best practices"]
},
{
"name": "Company Culture",
"description": "Behind the scenes and team stories",
"weight": 0.3,
"themes": ["Team spotlights", "Company values", "Events"]
}
],
"monthly_themes": {
"January": "New Year, New Goals",
"February": "Love Your Data"
}
}
PUT /api/brands/{brandId}/strategy
Met à jour la stratégie de contenu.
Corps de la requête
{
"content_pillars": [
{
"name": "Thought Leadership",
"description": "Industry insights",
"weight": 0.35,
"themes": ["AI trends", "Innovation"]
}
],
"monthly_themes": {
"March": "Spring Cleaning Your Tech Stack"
}
}
POST /api/brands/{brandId}/schedule
Construit le planning de contenu à partir de la stratégie.
Corps de la requête
{
"start_date": "2024-02-01",
"end_date": "2024-02-28",
"frequency": "daily",
"content_types": ["social_media", "blog_post"],
"num_items": 30
}
Réponse
{
"success": true,
"schedule": [
{
"date": "2024-02-01",
"content_type": "social_media",
"theme": "Product Education",
"suggested_topics": ["New feature announcement", "Tutorial teaser"]
},
{
"date": "2024-02-02",
"content_type": "blog_post",
"theme": "Thought Leadership",
"suggested_topics": ["AI trends in 2024"]
}
]
}
POST /api/brands/{brandId}/calendar
Génère un calendrier de contenu complet, avec génération automatique facultative.
Corps de la requête
{
"month": 3,
"year": 2024,
"auto_generate": false
}
Réponse
{
"success": true,
"calendar": {
"2024-03-01": {
"content_pieces": [
{
"type": "social_media",
"theme": "Thought Leadership",
"priority": 1
}
]
},
"2024-03-04": {
"content_pieces": [
{
"type": "blog_post",
"theme": "Product Education",
"priority": 2
}
]
}
}
}
Base de connaissances (RAG)
GET /api/brands/{brandId}/knowledge
Interroge la base de connaissances de la marque par recherche sémantique.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
| q requis | string | Requête de recherche |
| limit optionnel | integer | Nombre de résultats (par défaut : 5) |
Réponse
{
"success": true,
"results": [
{
"document_id": "doc_123",
"content": "Relevant content from knowledge base...",
"metadata": {
"source": "Product documentation",
"tags": ["features", "pricing"]
},
"relevance_score": 0.92
}
]
}
POST /api/brands/{brandId}/knowledge
Ajoute un document à la base de connaissances avec génération automatique des embeddings.
Corps de la requête
{
"content": "Your document content to add to the knowledge base...",
"metadata": {
"source": "Company blog",
"tags": ["marketing", "best-practices"],
"author": "Marketing Team"
}
}
Réponse
{
"success": true,
"document_id": "doc_456"
}
Tableau de bord d’administration
GET /admin/dashboard
Récupère les statistiques générales du tableau de bord.
Réponse
{
"active_keys": 45,
"total_requests": 125000,
"total_tokens": 5800000,
"unique_users": 32,
"top_content_types": [
{"type": "social_media", "count": 45000},
{"type": "blog_post", "count": 12000}
],
"top_providers": [
{"provider": "anthropic", "count": 80000},
{"provider": "openai", "count": 45000}
],
"alerts": 2,
"system_health": "healthy"
}
Gestion des clés d’API
GET /admin/keys
Liste toutes les clés d’API.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
| status | string | active, revoked, expired |
| limit | integer | Résultats par page (par défaut : 50) |
Réponse
{
"keys": [
{
"key_id": "key_abc123",
"name": "Production Key",
"key": "oui_live_xxxx",
"status": "active",
"tier": "professional",
"permissions": ["generate", "brands", "strategy"],
"created_at": "2024-01-01T00:00:00Z",
"last_used_at": "2024-01-22T14:00:00Z",
"expires_at": null
}
],
"total": 45
}
POST /admin/keys
Crée une nouvelle clé d’API. Remarque : la clé complète n’est affichée qu’une seule fois, à sa création.
Corps de la requête
{
"name": "New Production Key",
"tier": "professional",
"permissions": ["generate", "strategy", "brands", "rag"],
"brand_ids": ["brand_123"],
"expires_at": "2025-01-01T00:00:00Z"
}
Réponse
{
"success": true,
"key_id": "key_def456",
"key": "oui_live_abc123def456...",
"message": "API key created successfully"
}
POST /admin/keys/{keyId}/rotate
Effectue la rotation (régénération) d’une clé d’API. L’ancienne clé est immédiatement invalidée.
Réponse
{
"success": true,
"new_key": "oui_live_newkey789...",
"message": "Key rotated successfully"
}
Analytique
GET /admin/analytics
Récupère les données analytiques par type.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
| type | string | usage, content_types, providers, brands, errors, performance |
| period | string | 7d, 30d, 90d, 1y (default: 30d) |
Supervision
GET /admin/monitoring
Récupère l’état de supervision du système.
Réponse
{
"status": "healthy",
"database": "connected",
"uptime": 864000,
"active_workers": 4,
"memory_usage": 256,
"cpu_usage": 15.5,
"last_check": "2024-01-22T14:00:00Z"
}
GET /admin/monitoring/health
Contrôle de santé détaillé de tous les services.
Réponse
{
"status": "healthy",
"checks": {
"database": "ok",
"cache": "ok",
"providers": {
"anthropic": "ok",
"openai": "ok",
"openrouter": "ok"
}
},
"last_check": "2024-01-22T14:00:00Z"
}
Webhooks
GET /admin/webhooks/events
Liste les événements webhook disponibles.
Réponse
{
"events": {
"content.generated": "When content is successfully generated",
"content.failed": "When content generation fails",
"batch.completed": "When a batch generation completes",
"api_key.created": "When a new API key is created",
"api_key.revoked": "When an API key is revoked",
"rate_limit.exceeded": "When rate limit is exceeded",
"brand.updated": "When brand context is updated",
"schedule.generated": "When a content schedule is generated",
"document.added": "When a document is added to knowledge base",
"test": "Test webhook event"
}
}
POST /admin/webhooks
Créer un nouvel abonnement webhook.
Corps de la requête
{
"name": "Content Notifications",
"url": "https://your-app.com/webhooks/compose",
"events": ["content.generated", "content.failed"],
"is_active": true,
"retry_count": 3,
"timeout_seconds": 30
}
Réponse
{
"success": true,
"id": 1,
"secret": "whsec_abc123...",
"message": "Webhook created successfully. Save the secret - it will only be shown once."
}
Identifiants des fournisseurs
GET /admin/credentials
Liste tous les identifiants des fournisseurs d’IA (les clés d’API ne sont pas exposées).
Réponse
{
"credentials": [
{
"id": 1,
"provider": "anthropic",
"name": "Claude Production",
"organization_id": null,
"base_url": null,
"model_override": null,
"is_active": true,
"is_default": true,
"settings": {},
"created_at": "2024-01-01T00:00:00Z"
}
]
}
POST /admin/credentials
Ajoute un nouvel identifiant de fournisseur.
Corps de la requête
{
"provider": "anthropic",
"name": "Claude Backup",
"api_key": "sk-ant-api03-...",
"is_active": true,
"is_default": false
}
POST /admin/credentials/{credId}/test
Teste la connexion avec l’identifiant d’un fournisseur.
Réponse
{
"success": true,
"message": "Connection successful",
"details": {
"status": "connected",
"http_code": 200
}
}
Jobs et tâches cron
GET /admin/jobs
Liste tous les jobs avec filtrage.
Paramètres
| Paramètre | Type | Description |
|---|---|---|
| status | string | pending, processing, completed, failed |
| type | string | Filtre par type de job |
Réponse
{
"jobs": [
{
"id": "job_abc123",
"type": "batch_generation",
"queue": "default",
"status": "completed",
"data": {},
"result": {},
"attempts": 1,
"max_attempts": 3,
"created_at": "2024-01-22T13:00:00Z",
"completed_at": "2024-01-22T13:05:00Z"
}
],
"total": 150
}
GET /admin/cron
Liste les tâches cron.
Réponse
{
"tasks": [
{
"id": "cron_123",
"name": "Daily Analytics Report",
"handler": "AnalyticsHandler::dailyReport",
"expression": "0 6 * * *",
"description": "Generate daily analytics report",
"is_active": true,
"last_run_at": "2024-01-22T06:00:00Z",
"next_run_at": "2024-01-23T06:00:00Z",
"last_result": "success"
}
]
}
POST /admin/cron/{taskId}/run
Exécute immédiatement une tâche cron.
Réponse
{
"success": true,
"job_id": "job_xyz789"
}
Codes d’erreur
| Code | Statut | Description |
|---|---|---|
UNAUTHORIZED | 401 | Authentification invalide ou manquante |
FORBIDDEN | 403 | Droits insuffisants |
NOT_FOUND | 404 | Ressource introuvable |
VALIDATION_ERROR | 400 | Échec de la validation de la requête |
RATE_LIMIT_EXCEEDED | 429 | Limite de débit dépassée |
PROVIDER_ERROR | 502 | Le fournisseur d’IA a renvoyé une erreur |
INTERNAL_ERROR | 500 | Erreur interne du serveur |