Les piles de recherche LLM locales (Ollama, LMStudio, LocalAI) offrent confidentialité et coût nul par token, mais n'ont pas accès aux données web actuelles. Ajouter une API de recherche comme outil donne à votre modèle local un ancrage en direct sans envoyer vos prompts aux LLM cloud. Un seul appel HTTP renvoie des résultats structurés que votre modèle local peut citer.
Prérequis
- Ollama ou LMStudio fonctionnant localement
- Python 3.8+
- Une clé API Scavio (niveau gratuit : 250/mois)
Parcours
Étape 1: Créer la fonction de l'outil de recherche
Construisez une fonction simple que votre LLM local peut appeler pour la recherche web.
import requests, os
SCAVIO_KEY = os.environ.get('SCAVIO_API_KEY', 'your_key_here')
def web_search(query: str, platform: str = 'google') -> str:
"""Search the web and return structured results for the local LLM."""
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'platform': platform, 'query': query}, timeout=10)
results = resp.json().get('organic', [])[:5]
# Format for local LLM context (plain text, token-efficient)
lines = []
for r in results:
lines.append(f"- {r.get('title','')}: {r.get('snippet','')} ({r.get('link','')})")
return '\n'.join(lines) if lines else 'No results found.'Étape 2: Intégrer avec Ollama
Utilisez l'appel d'outil d'Ollama pour invoquer la recherche web quand nécessaire.
import ollama
def research_with_search(question: str) -> str:
# First, ask the model if it needs search
response = ollama.chat(model='llama3.2', messages=[
{'role': 'system', 'content': 'You are a research assistant. If you need current information, say SEARCH: <query>. Otherwise answer directly.'},
{'role': 'user', 'content': question}
])
answer = response['message']['content']
# If model requests search, fetch and re-prompt
if 'SEARCH:' in answer:
query = answer.split('SEARCH:')[1].strip()
search_results = web_search(query)
response = ollama.chat(model='llama3.2', messages=[
{'role': 'system', 'content': 'Answer using the search results below.'},
{'role': 'user', 'content': f'Question: {question}\n\nSearch results:\n{search_results}'}
])
return response['message']['content']
return answer
print(research_with_search('What is the current version of Python?'))Étape 3: Ajouter une recherche multiplateforme
Étendez pour rechercher des opinions sur Reddit et des tutoriels sur YouTube.
def deep_research(topic: str) -> dict:
google = web_search(topic, 'google')
reddit = web_search(topic, 'reddit')
youtube = web_search(topic, 'youtube')
context = f"""Research on: {topic}
Google results:
{google}
Reddit discussions:
{reddit}
YouTube videos:
{youtube}"""
response = ollama.chat(model='llama3.2', messages=[
{'role': 'system', 'content': 'Synthesize a research brief from the sources below. Cite sources.'},
{'role': 'user', 'content': context}
])
return {'topic': topic, 'brief': response['message']['content'], 'credits_used': 3}Exemple Python
import requests, os, ollama
def search(q, platform='google'):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'},
json={'platform': platform, 'query': q}).json()
return '\n'.join(f"- {x['title']}: {x.get('snippet','')}" for x in r.get('organic',[])[:5])
def research(q):
ctx = search(q)
return ollama.chat(model='llama3.2', messages=[{'role':'user','content':f'{q}\n\nContext:\n{ctx}'}])['message']['content']Exemple JavaScript
async function search(query, platform = 'google') {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform, query})
});
return (await r.json()).organic?.slice(0,5).map(x => `- ${x.title}: ${x.snippet}`).join('\n');
}Sortie attendue
A local LLM research stack that can search the live web for current information, combining Ollama's privacy with Scavio's structured search data.