Ajoutez un ancrage de recherche à un workflow d'IA contractuelle en interrogeant les mises à jour réglementaires, le contexte de l'entreprise et les précédents spécifiques au secteur avant ou pendant l'analyse du contrat. Les outils d'IA de révision de contrats fonctionnent souvent avec des données d'entraînement statiques qui ignorent les changements réglementaires récents, les risques spécifiques à l'entreprise et les conditions actuelles du marché. Une étape d'enrichissement par recherche exécutée avant l'analyse donne à l'IA un contexte actuel sur la contrepartie, les réglementations pertinentes et les actions récentes d'exécution, produisant des évaluations de risque plus précises.
Prérequis
- Python 3.8+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Un texte de contrat ou des clauses clés à analyser
Parcours
Étape 1: Extraire les entités clés du contrat
Identifier les noms d'entreprises, les juridictions et les types de clauses nécessitant un enrichissement par recherche.
import os, requests, re
API_KEY = os.environ['SCAVIO_API_KEY']
def extract_entities(contract_text: str) -> dict:
"""Extract searchable entities from contract text."""
entities = {
'companies': [],
'jurisdictions': [],
'clause_types': [],
}
# Simple company name extraction (between quotes or after 'between')
company_patterns = re.findall(r'"([A-Z][^"]{2,50})"', contract_text)
entities['companies'] = list(set(company_patterns))[:5]
# Jurisdiction extraction
jurisdiction_keywords = ['governed by the laws of', 'jurisdiction of', 'state of', 'courts of']
for kw in jurisdiction_keywords:
match = re.search(kw + r'\s+([A-Z][\w\s]{2,30})', contract_text)
if match:
entities['jurisdictions'].append(match.group(1).strip())
# Clause type detection
clause_keywords = {'indemnification': 'indemnif', 'non-compete': 'non-compete',
'termination': 'terminat', 'liability': 'liabilit', 'confidentiality': 'confidential'}
for clause, keyword in clause_keywords.items():
if keyword in contract_text.lower():
entities['clause_types'].append(clause)
return entities
sample = 'Agreement between "Acme Corp" and "Beta LLC" governed by the laws of Delaware. Includes indemnification and non-compete clauses.'
entities = extract_entities(sample)
print(f"Companies: {entities['companies']}")
print(f"Jurisdictions: {entities['jurisdictions']}")
print(f"Clauses: {entities['clause_types']}")Étape 2: Rechercher des signaux de risque d'entreprise
Rechercher chaque contrepartie pour les procès, les actions d'exécution et les actualités récentes.
def search_company_risk(company: str) -> dict:
queries = [
f'{company} lawsuit 2026',
f'{company} SEC enforcement',
f'{company} bankruptcy risk',
]
risk_signals = {'company': company, 'lawsuits': [], 'enforcement': [], 'news': []}
for query in queries:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': query}, timeout=15)
results = resp.json().get('organic_results', [])
for r in results[:3]:
title = r.get('title', '')
if any(w in title.lower() for w in ['lawsuit', 'sued', 'settlement', 'verdict']):
risk_signals['lawsuits'].append(title)
elif any(w in title.lower() for w in ['sec', 'enforcement', 'fine', 'penalty']):
risk_signals['enforcement'].append(title)
else:
risk_signals['news'].append(title)
return risk_signals
risk = search_company_risk('Acme Corp')
print(f"Lawsuits: {len(risk['lawsuits'])}")
print(f"Enforcement: {len(risk['enforcement'])}")Étape 3: Rechercher les mises à jour réglementaires
Extraire les changements réglementaires récents pertinents pour la juridiction du contrat et les types de clauses.
def search_regulatory(jurisdiction: str, clause_types: list) -> list:
updates = []
for clause in clause_types:
query = f'{clause} clause regulation {jurisdiction} 2026'
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': query}, timeout=15)
results = resp.json().get('organic_results', [])
for r in results[:2]:
updates.append({
'clause': clause,
'title': r.get('title', ''),
'snippet': r.get('snippet', '')[:150],
'url': r.get('link', ''),
})
return updates
updates = search_regulatory('Delaware', ['indemnification', 'non-compete'])
for u in updates:
print(f"[{u['clause']}] {u['title'][:60]}")Étape 4: Construire le contexte d'enrichissement
Combiner tous les résultats de recherche dans un bloc de contexte structuré pour l'IA contractuelle.
def build_contract_context(entities: dict) -> dict:
context = {'companies': {}, 'regulatory': [], 'risk_level': 'low'}
for company in entities.get('companies', []):
risk = search_company_risk(company)
context['companies'][company] = risk
if risk['lawsuits'] or risk['enforcement']:
context['risk_level'] = 'high' if risk['enforcement'] else 'medium'
for jurisdiction in entities.get('jurisdictions', []):
updates = search_regulatory(jurisdiction, entities.get('clause_types', []))
context['regulatory'].extend(updates)
return context
context = build_contract_context(entities)
print(f"Risk level: {context['risk_level']}")
print(f"Regulatory updates: {len(context['regulatory'])}")Étape 5: Générer une invite d'analyse enrichie
Formater le contexte de recherche en une section d'invite pour l'IA de révision de contrats.
def format_analysis_prompt(contract_text: str, context: dict) -> str:
parts = ['ENRICHMENT CONTEXT (from live search):', '']
if context.get('risk_level') != 'low':
parts.append(f"RISK LEVEL: {context['risk_level'].upper()}")
for company, risk in context.get('companies', {}).items():
parts.append(f'\nCounterparty: {company}')
if risk['lawsuits']:
parts.append(f" Active litigation: {'; '.join(risk['lawsuits'][:2])}")
if risk['enforcement']:
parts.append(f" Enforcement actions: {'; '.join(risk['enforcement'][:2])}")
if context.get('regulatory'):
parts.append('\nRecent regulatory updates:')
for u in context['regulatory'][:3]:
parts.append(f" [{u['clause']}] {u['title'][:60]}")
parts.append('')
parts.append('CONTRACT TEXT:')
parts.append(contract_text[:1000])
return '\n'.join(parts)
prompt = format_analysis_prompt(sample, context)
print(prompt[:500])Exemple Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def contract_context(company, clause):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'{company} {clause} lawsuit 2026'}).json()
return [r.get('title', '')[:60] for r in data.get('organic_results', [])[:3]]
print(contract_context('Acme Corp', 'indemnification'))Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function contractContext(company, clause) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({platform: 'google', query: `${company} ${clause} lawsuit 2026`})
});
return ((await r.json()).organic_results || []).slice(0, 3).map(r => (r.title || '').slice(0, 60));
}
contractContext('Acme Corp', 'indemnification').then(console.log);Sortie attendue
A contract AI workflow enriched with live search data including counterparty risk signals, regulatory updates, and enforcement actions for more accurate contract review.