Le contenu IA sans données en direct, c’est de la daube. Les articles sur les 'meilleures API' avec des prix fabriqués et des comparaisons de produits aux fonctionnalités imaginaires échouent parce que le LLM a inventé les détails. Ce tutoriel construit un pipeline de contenu qui récupère des données réelles avant de générer du texte : prix actuels issus des résultats de recherche, opinions des utilisateurs depuis Reddit, et détails des produits depuis Amazon. Le résultat passe la vérification des faits parce que les faits proviennent de sources en direct.
Prérequis
- Python 3.10+
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Une clé API OpenAI pour la génération de contenu
Parcours
Étape 1: Construire le récupérateur de données multi-source
Extraire les données de Google, Reddit et Amazon via Scavio.
import os, requests, json
SK = os.environ['SCAVIO_API_KEY']
OK = os.environ['OPENAI_API_KEY']
SH = {'x-api-key': SK, 'Content-Type': 'application/json'}
def fetch_google(q):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': q, 'country_code': 'us'}).json()
return [{'title': r['title'], 'snippet': r.get('snippet', ''), 'url': r['link']}
for r in data.get('organic_results', [])[:5]]
def fetch_reddit(q):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': q, 'platform': 'reddit', 'country_code': 'us'}).json()
return [{'title': r['title'], 'snippet': r.get('snippet', '')}
for r in data.get('organic_results', [])[:5]]
def fetch_products(q):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': q, 'platform': 'amazon', 'marketplace': 'US'}).json()
return [{'title': p.get('title', ''), 'price': p.get('price', 'N/A'), 'rating': p.get('rating', '')}
for p in data.get('products', [])[:5]]Étape 2: Assembler un brief de recherche
Compiler les données de toutes les sources en un brief structuré pour le LLM.
def research(topic, product_query=None):
brief = f'Topic: {topic}\n\n=== Google ===\n'
g = fetch_google(topic)
brief += '\n'.join(f"- {r['title']}: {r['snippet']}" for r in g)
brief += '\n\n=== Reddit ===\n'
r = fetch_reddit(topic)
brief += '\n'.join(f"- {d['title']}: {d['snippet']}" for d in r)
credits = 2
if product_query:
p = fetch_products(product_query)
brief += '\n\n=== Amazon Products ===\n'
brief += '\n'.join(f"- {x['title']}: {x['price']} ({x['rating']})" for x in p)
credits += 1
print(f'Research cost: ${credits * 0.005:.3f}')
return briefÉtape 3: Générer un contenu ancré
Transmettre le brief au LLM avec des instructions strictes pour n’utiliser que les données fournies.
def generate(topic, brief):
resp = requests.post('https://api.openai.com/v1/chat/completions',
headers={'Authorization': f'Bearer {OK}', 'Content-Type': 'application/json'},
json={'model': 'gpt-4o', 'temperature': 0.3, 'messages': [
{'role': 'system', 'content': 'Write based ONLY on the research brief. No fabricated stats. '
'If data is missing, say so. Cite Reddit as "users report". Start with a direct answer.'},
{'role': 'user', 'content': f'Write 600 words about: {topic}\n\n{brief}'}]})
return resp.json()['choices'][0]['message']['content']
brief = research('best noise canceling headphones 2026', 'noise canceling headphones')
article = generate('best noise canceling headphones 2026', brief)
print(article[:300])Étape 4: Valider les prix dans le contenu généré
Vérifier que les montants en dollars dans l’article apparaissent dans les données sources.
import re
def validate(content, brief):
source = brief.lower()
prices = re.findall(r'\$[\d,.]+', content)
issues = [p for p in prices if p.lower() not in source]
if issues:
print(f'WARNING: {len(issues)} unverified prices: {issues}')
else:
print('All prices verified against source data.')
return issues
validate(article, brief)Exemple Python
import os, requests
SK = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': SK, 'Content-Type': 'application/json'}
def research(topic):
g = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': topic, 'country_code': 'us'}).json().get('organic_results', [])[:3]
r = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': topic, 'platform': 'reddit', 'country_code': 'us'}).json().get('organic_results', [])[:3]
print(f'{len(g)} Google + {len(r)} Reddit results. Cost: $0.010')
return g, r
research('best serp api 2026')Exemple JavaScript
const SK = process.env.SCAVIO_API_KEY;
const SH = { 'x-api-key': SK, 'Content-Type': 'application/json' };
async function research(topic) {
const [g, r] = await Promise.all([
fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query: topic, country_code: 'us' })
}).then(r => r.json()),
fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query: topic, platform: 'reddit', country_code: 'us' })
}).then(r => r.json()),
]);
console.log(`${(g.organic_results||[]).length}G + ${(r.organic_results||[]).length}R. Cost: $0.010`);
}
research('best serp api 2026').catch(console.error);Sortie attendue
Research cost: $0.015
The Sony WH-1000XM5 remains the top noise canceling headphone
in 2026, priced at $298 on Amazon with a 4.6 rating. Users on
Reddit report the XM5 noise cancellation outperforms Bose QC
Ultra in airplane environments...
All prices verified against source data.