Un client CLI intelligent pour Ollama avec gestion d'historique et mémoire persistante
Project description
AI-CLI 🤖
Un client CLI intelligent, modulaire et puissant pour interagir avec Ollama
Installation • Fonctionnalités • Utilisation • Configuration • Architecture
✨ Fonctionnalités
🧠 Mémoire PersistanteL'agent apprend de vous et se souvient entre les sessions grâce à 📁 Historique CompletToutes vos discussions sauvegardées automatiquement en JSON avec support UTF-8. ✂️ Résumé IntelligentCompressez les longues discussions sans perdre le contexte avec |
⌨️ Interface AvancéeAuto-complétion, suggestions, rendu Markdown en temps réel avec Rich. ⚙️ 100% ConfigurablePersonnalisez chaque prompt et paramètre dans 🔄 Auto-gestion OllamaDétecte, démarre et télécharge les modèles automatiquement. |
📦 Installation
Prérequis
- Python 3.11+
- Ollama installé et fonctionnel
🚀 Installation Rapide
|
Depuis PyPI (Recommandé) pipx install ai-cli
# ou
pip install ai-cli
|
Depuis les sources git clone https://github.com/KpihX/ai-cli.git
cd ai-cli
pipx install .
# ou: uv tool install .
|
🛠️ Mode Développement
# Cloner et installer en mode développement
git clone https://github.com/KpihX/ai-cli.git
cd ai-cli
uv sync --dev
# Exécuter les tests (43 tests)
uv run pytest tests/ -v
🚀 Utilisation
Commandes de Base
| Commande | Description |
|---|---|
ai-cli -i |
Mode interactif (conversation continue) |
ai-cli -p "Question" |
Question rapide (one-shot) |
ai-cli -l |
Lister les modèles disponibles |
ai-cli -d llama3.2 |
Changer le modèle par défaut |
ai-cli -m mistral -i |
Utiliser un modèle spécifique |
Commandes Interactives (Slash Commands)
Une fois en mode interactif, vous avez accès à ces commandes :
| Commande | Description | Exemple |
|---|---|---|
/help |
📚 Affiche l'aide complète | /help |
/new |
🆕 Sauvegarde et nouvelle discussion | /new |
/old |
📂 Charger ou supprimer une discussion | /old → d 1 pour supprimer |
/memory |
🧠 Gérer la mémoire (voir/add/delete) | /memory add J'aime Python |
/resume |
📝 Résume l'historique | /resume |
/settings |
⚙️ Paramètres (modèle, température) | /settings |
/clear |
🧹 Efface l'écran | /clear |
/exit |
👋 Sauvegarde et quitte | /exit ou Ctrl+D |
💬 Exemple de Session
$ ai-cli -i
╭──────────────────────────────────────────────────────╮
│ Bienvenue dans AI-CLI ! │
╰──────────────────────────────────────────────────────╯
┌─────────────────────────────────────────────────────────────┐
│ Index │ Titre │ Date │
├───────┼───────────────────────────────┼────────────────────┤
│ 1 │ Discussion sur Python │ 20260110_143052 │
│ 2 │ Aide DevOps avec Docker │ 20260109_221015 │
└─────────────────────────────────────────────────────────────┘
Utilisez /old pour charger une ancienne discussion.
Mode Interactif avec phi3.5. Tapez /exit pour quitter.
Vous > Quelle est la différence entre Docker et Podman ?
╭─── AI (phi3.5) ────────────────────────────────────────────────────────╮
│ ## Docker vs Podman │
│ │
│ **1. Architecture** │
│ - Docker: daemon central (`dockerd`) qui gère tous les conteneurs │
│ - Podman: **daemonless**, chaque conteneur est un processus enfant │
│ │
│ **2. Sécurité** │
│ - Docker: nécessite root par défaut │
│ - Podman: **rootless** par défaut, plus sécurisé │
│ │
│ **3. Compatibilité** │
│ - Les deux utilisent les mêmes images OCI │
│ - `alias docker=podman` fonctionne dans la plupart des cas │
╰────────────────────────────────────────────────────────────────────────╯
Vous > /save L'utilisateur s'intéresse à Docker et Podman
[green]Information sauvegardée dans AI_CLI.md.[/green]
Vous > /exit
Sauvegarde de la discussion...
Proposition de titre : Docker vs Podman Comparison
Session enregistrée sous : Docker vs Podman Comparison
⚙️ Configuration
Le fichier config.yaml permet de tout personnaliser :
# ═══════════════════════════════════════════════════════════
# CONFIGURATION AI-CLI
# ═══════════════════════════════════════════════════════════
# Modèle LLM utilisé par défaut
default_model: phi3.5
# URL du serveur Ollama
ollama_url: http://localhost:11434
# Nombre de messages à garder avant résumé automatique
summary_threshold: 5
# Timeout des requêtes HTTP (secondes)
request_timeout: 30
# Répertoire de stockage des données
history_dir: ~/.ai-cli
# ─────────────────────────────────────────────────────────────
# PROMPTS PERSONNALISABLES
# ─────────────────────────────────────────────────────────────
prompts:
# Génération automatique de titre pour les sessions
title_generation: >
Génère un titre court (3-5 mots max) pour cette discussion.
Réponds UNIQUEMENT avec le titre:
{content}
# Résumé de l'historique pour /resume
summarization: >
Résume de façon concise les points clés de cet échange
pour servir de contexte historique:
{content}
# Injection de la mémoire utilisateur
memory_prefix: "Voici ce que tu sais sur l'utilisateur: {memory}"
# Message d'accueil
welcome_message: "Bienvenue dans AI-CLI !"
# Info mode interactif
interactive_info: "Mode Interactif avec {model}. Tapez /exit pour quitter."
🏗️ Architecture
ai-cli/
├── 📁 src/ai_cli/
│ ├── main.py # 🎯 Point d'entrée CLI + boucle REPL
│ ├── ollama_client.py # 🦙 Client API Ollama (stream/sync)
│ └── storage.py # 💾 Persistance (sessions + mémoire)
├── 📁 tests/
│ ├── test_main.py # ✅ Tests CLI (12 tests)
│ ├── test_client.py # ✅ Tests Ollama (16 tests)
│ └── test_storage.py # ✅ Tests Storage (15 tests)
├── 📁 docs/assets/
│ └── banner.png # 🖼️ Banner du projet
├── config.yaml # ⚙️ Configuration par défaut
├── pyproject.toml # 📦 Métadonnées du package
└── README.md # 📚 Documentation
Flux de Données
flowchart LR
subgraph User["👤 Utilisateur"]
A[Terminal]
end
subgraph CLI["🖥️ AI-CLI"]
B[main.py<br/>REPL Loop]
C[ollama_client.py<br/>Stream/Sync]
D[storage.py<br/>Persistence]
end
subgraph Backend["🦙 Ollama"]
E[LLM API]
F[phi3.5 / llama3.2 / ...]
end
subgraph Storage["📁 ~/.ai-cli/"]
G[sessions/*.json]
H[AI_CLI.md]
end
A -->|prompt| B
B -->|API call| C
C -->|HTTP POST| E
E -->|inference| F
F -->|stream| E
E -->|chunks| C
C -->|content| B
B -->|Rich render| A
B <-->|save/load| D
D <-->|read/write| G
D <-->|memory| H
Modules Détaillés
| Module | Classes/Fonctions | Responsabilité |
|---|---|---|
ollama_client.py |
|
Communication avec l'API Ollama, gestion du streaming et des erreurs réseau |
storage.py |
|
Persistance JSON des sessions et gestion de la mémoire Markdown |
main.py |
|
Point d'entrée, boucle REPL, routage des commandes slash |
📊 Tests
Le projet est couvert par 46 tests unitaires organisés en classes :
# Exécuter tous les tests
uv run pytest tests/ -v
# Avec couverture de code
uv run pytest tests/ --cov=ai_cli --cov-report=html
# Tests spécifiques
uv run pytest tests/test_client.py -v # Tests Ollama
uv run pytest tests/test_storage.py -v # Tests Storage
Couverture des Tests
| Module | Tests | Catégories |
|---|---|---|
main.py |
12 | Config, SessionState, Slash commands, Input handling |
ollama_client.py |
16 | Stream, Sync, is_running, Erreurs réseau, Backward compat |
storage.py |
18 | CRUD, Delete, Unicode, JSON corrompu, Memory modes, Init |
📁 Fichiers de Données
| Chemin | Description | Format |
|---|---|---|
~/.ai-cli/sessions/ |
Historique des discussions | JSON |
~/.ai-cli/AI_CLI.md |
Mémoire persistante de l'agent | Markdown |
~/.ai-cli/config.yaml |
Configuration utilisateur (optionnel) | YAML |
Structure d'une Session
{
"title": "Discussion sur Python",
"timestamp": "20260110_143052",
"messages": [
{"role": "system", "content": "Voici ce que tu sais..."},
{"role": "user", "content": "Explique les décorateurs"},
{"role": "assistant", "content": "Les décorateurs en Python..."}
]
}
🤝 Contribution
Les contributions sont bienvenues ! Pour contribuer :
- Fork le projet
- Créer une branche (
git checkout -b feature/ma-feature) - Committer vos changements (
git commit -m 'Add: ma feature') - Pousser (
git push origin feature/ma-feature) - Ouvrir une Pull Request
Guidelines
- Respecter le style de code existant
- Ajouter des tests pour les nouvelles fonctionnalités
- Mettre à jour la documentation si nécessaire
📜 Licence
MIT License
Copyright (c) 2026 KAMDEM POUOKAM Ivann Harold
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software...
Voir le fichier LICENSE pour le texte complet.
Fait avec ❤️ et 🐍 Python
@KpihX
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kpihx_ai_cli-0.3.6.tar.gz.
File metadata
- Download URL: kpihx_ai_cli-0.3.6.tar.gz
- Upload date:
- Size: 441.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
674f4fc26e3c912279ad76caa75331d2250a85c346e02dc2548717c44f883e62
|
|
| MD5 |
bad63b2aec5e3b41a055268f6fc1be8a
|
|
| BLAKE2b-256 |
636eba0148dd2bdac7dbc822457dae404e98c61d953489390247d689dec86871
|
File details
Details for the file kpihx_ai_cli-0.3.6-py3-none-any.whl.
File metadata
- Download URL: kpihx_ai_cli-0.3.6-py3-none-any.whl
- Upload date:
- Size: 23.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"25.10","id":"questing","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f1565adeebf6aaecb8d9147f224278407d316e0a2c80a5e34548135c32e54d8
|
|
| MD5 |
b08efd2884b0a95f3165f34714fdc73a
|
|
| BLAKE2b-256 |
2a043020c12e1da42215b5d6d68da8b8f7abec706257608637a5af7d038f4844
|