AI Stack : Qdrant + Claude Ollama
1. Quoi ? — Définition et contexte
Section intitulée « 1. Quoi ? — Définition et contexte »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.
Composants
Section intitulée « Composants »| Service | Port | Rôle |
|---|---|---|
| Qdrant | 6333 | Base de données vectorielle (embeddings, recherche sémantique) |
| Claude Ollama | 11434 | Passerelle API compatible Ollama vers Claude, Codex, Gemini |
| claude-redis | 6379 | Cache des sessions et états d’approbation |
Architecture visuelle
Section intitulée « Architecture visuelle »┌─────────────────────────────────────────────────────────┐│ 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) │└─────────────────────────────────────────────────────────┘2. Pourquoi ? — Enjeux et motivations
Section intitulée « 2. Pourquoi ? — Enjeux et motivations »Objectifs de l’AI Stack
Section intitulée « Objectifs de l’AI Stack »| Objectif | Solution |
|---|---|
| Pas de vendor lock-in | Interface compatible Ollama, backends interchangeables |
| RAG local | Qdrant self-hosted, données non envoyées vers le cloud |
| Multi-modèles | Claude, Codex, Gemini accessibles via la même API |
| Contrôle des exécutions | Workflow d’approbation pour les actions sensibles |
Modèles supportés par Claude Ollama
Section intitulée « Modèles supportés par Claude Ollama »| Modèle | Provider | Comportement |
|---|---|---|
claude-sonnet-4-20250514 | Claude | Avec approbation |
claude-haiku | Claude | Avec approbation |
claude-opus | Claude | Avec approbation |
claude-*-yolo | Claude | Exécution directe |
codex-max | OpenAI | Avec approbation |
codex-*-yolo | OpenAI | Mode full-auto |
gemini-flash | Avec approbation | |
gemini-*-yolo | Mode yolo | |
auto | Router | Opus sélectionne le modèle optimal |
Cas d’usage prévus avec RAG
Section intitulée « Cas d’usage prévus avec RAG »À terme : RAG hybride sur documentation interne
| Source | Type | Usage |
|---|---|---|
| Obsidian vault | Notes personnelles | Recherche dans la base de connaissances |
| Documentation projets | Markdown technique | Contextualiser les questions sur l’infra |
| Historique workflows | JSON N8N exportés | Trouver des patterns similaires |
3. Comment ? — Mise en œuvre technique
Section intitulée « 3. Comment ? — Mise en œuvre technique »Qdrant : Gestion des collections
Section intitulée « Qdrant : Gestion des collections »# Lister les collectionscurl http://localhost:6333/collections | jq '.result.collections'
# Créer une collectioncurl -X PUT http://localhost:6333/collections/documents \ -H "Content-Type: application/json" \ -d '{ "vectors": { "size": 1536, "distance": "Cosine" } }'
# Recherche vectoriellecurl http://localhost:6333/collections/documents/points/search \ -H "Content-Type: application/json" \ -d '{ "vector": [0.1, 0.2, ...], "limit": 5 }'Appel Qdrant depuis N8N
Section intitulée « Appel Qdrant depuis N8N »// 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 }}Workflow d’approbation Claude Ollama
Section intitulée « Workflow d’approbation Claude Ollama »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ésultatAPI Questions interactives
Section intitulée « API Questions interactives »Claude Ollama détecte quand un modèle pose une question et la route vers Telegram :
# Lister les questions en attentecurl http://claude-ollama:11434/api/questions
# Répondre à une questioncurl -X POST http://claude-ollama:11434/api/questions/q_abc123/answer \ -d '{"selected_options": [0, 2]}'Exemple d’appel depuis N8N
Section intitulée « Exemple d’appel depuis N8N »// 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 }}Pattern RAG avec Qdrant
Section intitulée « Pattern RAG avec Qdrant »// 1. Générer embedding du query (via OpenAI ou modèle local)// 2. Recherche Qdrantconst 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}Ressources système
Section intitulée « Ressources système »| Service | Memory | CPU | Stockage |
|---|---|---|---|
| Qdrant | 4 GB | 2 vCPU | ~1 GB (dépend des collections) |
| Claude Ollama | 4 GB | 2 vCPU | Minimal |
| claude-redis | 512 MB | 0.5 vCPU | ~100 MB |
4. Et si ? — Perspectives et limites
Section intitulée « 4. Et si ? — Perspectives et limites »Limites actuelles
Section intitulée « Limites actuelles »| Limite | Impact | Mitigation |
|---|---|---|
| Qdrant non peuplé | Pas de RAG actif actuellement | Prévu avec import Obsidian |
| Embeddings via API externe | Dépendance OpenAI pour les vecteurs | Modèle local envisageable |
| Pas de GPU | Pas de modèle local lourd | Suffisant pour les appels API |
Scénarios d’évolution
Section intitulée « Scénarios d’évolution »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
-yolopour 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
Commandes de dépannage
Section intitulée « Commandes de dépannage »# Qdrant healthcurl http://localhost:6333/healthzdocker logs ai-stack-qdrant-1 --tail 50
# Claude Ollama healthcurl http://localhost:11434/api/tagsdocker logs ai-stack-claude-ollama-1 --tail 50
# Approbations en attentecurl http://claude-ollama:11434/api/approvals
# Test webhook N8Ncurl -X POST http://n8n:5678/webhook/claude/approval \ -H "Content-Type: application/json" \ -d '{"test": true}'Pages liées
Section intitulée « Pages liées »Infrastructure
Section intitulée « Infrastructure »- Architecture VPS — Vue d’ensemble
- N8N en mode Queue — Intégration workflows
Workflows
Section intitulée « Workflows »- Telegram Orchestrator — Bot utilisant Claude
- Notification Hub — Routage des alertes IA
Référence
Section intitulée « Référence »- Glossaire — RAG, Embeddings, Vector Database, LLM