Aller au contenu

AI Stack : Qdrant + Claude Ollama

L’AI Stack fournit les services d’intelligence artificielle à l’infrastructure. Elle combine une base de données vectorielle pour le RAG et une passerelle API multi-modèles.

ServicePortRôle
Qdrant6333Base de données vectorielle (embeddings, recherche sémantique)
Claude Ollama11434Passerelle API compatible Ollama vers Claude, Codex, Gemini
claude-redis6379Cache des sessions et états d’approbation
┌─────────────────────────────────────────────────────────┐
│ N8N Workflows │
│ ├─ Intent detection (Telegram) │
│ ├─ RAG queries (knowledge base) │
│ └─ Approval callbacks │
└────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ ai-internal network │
│ ┌─────────────────────┐ ┌───────────────────────────┐ │
│ │ Qdrant │ │ Claude Ollama │ │
│ │ (port 6333) │ │ (port 11434) │ │
│ │ │ │ │ │
│ │ - Collections │ │ - Claude models │ │
│ │ - Embeddings │ │ - Codex models │ │
│ │ - Vector search │ │ - Gemini models │ │
│ │ │ │ - YOLO vs approval │ │
│ └─────────────────────┘ └───────────────────────────┘ │
│ │ │
│ ┌────────┴────────┐ │
│ ▼ ▼ │
│ claude-redis Subprocess │
│ (sessions) (CLI calls) │
└─────────────────────────────────────────────────────────┘

ObjectifSolution
Pas de vendor lock-inInterface compatible Ollama, backends interchangeables
RAG localQdrant self-hosted, données non envoyées vers le cloud
Multi-modèlesClaude, Codex, Gemini accessibles via la même API
Contrôle des exécutionsWorkflow d’approbation pour les actions sensibles
ModèleProviderComportement
claude-sonnet-4-20250514ClaudeAvec approbation
claude-haikuClaudeAvec approbation
claude-opusClaudeAvec approbation
claude-*-yoloClaudeExécution directe
codex-maxOpenAIAvec approbation
codex-*-yoloOpenAIMode full-auto
gemini-flashGoogleAvec approbation
gemini-*-yoloGoogleMode yolo
autoRouterOpus sélectionne le modèle optimal

À terme : RAG hybride sur documentation interne

SourceTypeUsage
Obsidian vaultNotes personnellesRecherche dans la base de connaissances
Documentation projetsMarkdown techniqueContextualiser les questions sur l’infra
Historique workflowsJSON N8N exportésTrouver des patterns similaires

Fenêtre de terminal
# Lister les collections
curl http://localhost:6333/collections | jq '.result.collections'
# Créer une collection
curl -X PUT http://localhost:6333/collections/documents \
-H "Content-Type: application/json" \
-d '{
"vectors": {
"size": 1536,
"distance": "Cosine"
}
}'
# Recherche vectorielle
curl http://localhost:6333/collections/documents/points/search \
-H "Content-Type: application/json" \
-d '{
"vector": [0.1, 0.2, ...],
"limit": 5
}'
// HTTP Request : Recherche dans une collection
{
"url": "http://qdrant:6333/collections/knowledge/points/search",
"method": "POST",
"body": {
"vector": "{{ $json.embedding }}",
"limit": 10,
"with_payload": true
}
}
Requête (non-YOLO)
┌─────────────────────────────────────────┐
│ Claude Ollama reçoit la requête │
│ ├─ Génère un plan d'exécution │
│ ├─ Envoie webhook N8N │
│ └─ Attend approbation (timeout 5min) │
└───────────────────────┬─────────────────┘
┌─────────────────────────────────────────┐
│ N8N Telegram Orchestrator │
│ ├─ Affiche le plan via Telegram │
│ └─ Boutons [Approve] [Reject] │
└───────────────────────┬─────────────────┘
┌───────────────┴───────────────┐
▼ ▼
Approved Rejected
│ │
▼ ▼
Exécution réelle Réponse "Rejected"
Retour du résultat

Claude Ollama détecte quand un modèle pose une question et la route vers Telegram :

Fenêtre de terminal
# Lister les questions en attente
curl http://claude-ollama:11434/api/questions
# Répondre à une question
curl -X POST http://claude-ollama:11434/api/questions/q_abc123/answer \
-d '{"selected_options": [0, 2]}'
// Intent detection pour Telegram Orchestrator
{
"url": "http://claude-ollama:11434/api/generate",
"method": "POST",
"body": {
"model": "claude-sonnet-4-20250514",
"prompt": `Analyse ce message Telegram et retourne un JSON:
- intent: docker|help|chat|unknown
- entities: {stack?, action?}
Message: ${message}`,
"stream": false
}
}
// 1. Générer embedding du query (via OpenAI ou modèle local)
// 2. Recherche Qdrant
const qdrantResults = await searchQdrant(query);
// 3. Enrichir le prompt Claude avec les résultats
{
"model": "claude-sonnet-4-20250514",
"prompt": `Contexte:\n${qdrantResults}\n\nQuestion: ${userQuery}`,
"stream": false
}
ServiceMemoryCPUStockage
Qdrant4 GB2 vCPU~1 GB (dépend des collections)
Claude Ollama4 GB2 vCPUMinimal
claude-redis512 MB0.5 vCPU~100 MB

LimiteImpactMitigation
Qdrant non peupléPas de RAG actif actuellementPrévu avec import Obsidian
Embeddings via API externeDépendance OpenAI pour les vecteursModèle local envisageable
Pas de GPUPas de modèle local lourdSuffisant pour les appels API

Si le RAG est activé avec Obsidian :

  • Import automatique des notes via N8N workflow
  • Collection dédiée obsidian-knowledge
  • Recherche contextuelle dans les conversations Telegram

Si besoin de modèles locaux :

  • Ajouter un serveur avec GPU
  • Déployer Ollama réel avec Llama 3 ou Mistral
  • Claude Ollama route vers le modèle local selon le prompt

Si les coûts API augmentent :

  • Caching des réponses fréquentes (Redis)
  • Utiliser les modèles -yolo pour les tâches non critiques
  • Router les requêtes simples vers Haiku (moins cher)

Si besoin de multi-tenant :

  • Collections Qdrant par projet/client
  • Namespaces dans Claude Ollama
  • Isolation des credentials
Fenêtre de terminal
# Qdrant health
curl http://localhost:6333/healthz
docker logs ai-stack-qdrant-1 --tail 50
# Claude Ollama health
curl http://localhost:11434/api/tags
docker logs ai-stack-claude-ollama-1 --tail 50
# Approbations en attente
curl http://claude-ollama:11434/api/approvals
# Test webhook N8N
curl -X POST http://n8n:5678/webhook/claude/approval \
-H "Content-Type: application/json" \
-d '{"test": true}'

  • Glossaire — RAG, Embeddings, Vector Database, LLM