Skip to main content

Un client CLI intelligent pour Ollama avec gestion d'historique et mémoire persistante

Project description

AI-CLI Banner

AI-CLI 🤖

Un client CLI intelligent, modulaire et puissant pour interagir avec Ollama

InstallationFonctionnalitésUtilisationConfigurationArchitecture

Python 3.11+ MIT License Tests Ollama


✨ Fonctionnalités

🧠 Mémoire Persistante

L'agent apprend de vous et se souvient entre les sessions grâce à AI_CLI.md.

📁 Historique Complet

Toutes vos discussions sauvegardées automatiquement en JSON avec support UTF-8.

✂️ Résumé Intelligent

Compressez les longues discussions sans perdre le contexte avec /resume.

⌨️ Interface Avancée

Auto-complétion, suggestions, rendu Markdown en temps réel avec Rich.

⚙️ 100% Configurable

Personnalisez chaque prompt et paramètre dans config.yaml.

🔄 Auto-gestion Ollama

Dé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 /oldd 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
  • OllamaClient
  • OllamaConnectionError
  • chat_stream() / chat_sync()
  • generate_title() / summarize()
Communication avec l'API Ollama, gestion du streaming et des erreurs réseau
storage.py
  • StorageManager
  • StorageError
  • save_session() / load_session()
  • save_memory() / get_memory()
Persistance JSON des sessions et gestion de la mémoire Markdown
main.py
  • SessionState
  • load_config()
  • run_interactive()
  • handle_save_and_exit()
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 :

  1. Fork le projet
  2. Créer une branche (git checkout -b feature/ma-feature)
  3. Committer vos changements (git commit -m 'Add: ma feature')
  4. Pousser (git push origin feature/ma-feature)
  5. 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

kpihx_ai_cli-0.3.6.tar.gz (441.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kpihx_ai_cli-0.3.6-py3-none-any.whl (23.2 kB view details)

Uploaded Python 3

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

Hashes for kpihx_ai_cli-0.3.6.tar.gz
Algorithm Hash digest
SHA256 674f4fc26e3c912279ad76caa75331d2250a85c346e02dc2548717c44f883e62
MD5 bad63b2aec5e3b41a055268f6fc1be8a
BLAKE2b-256 636eba0148dd2bdac7dbc822457dae404e98c61d953489390247d689dec86871

See more details on using hashes here.

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

Hashes for kpihx_ai_cli-0.3.6-py3-none-any.whl
Algorithm Hash digest
SHA256 9f1565adeebf6aaecb8d9147f224278407d316e0a2c80a5e34548135c32e54d8
MD5 b08efd2884b0a95f3165f34714fdc73a
BLAKE2b-256 2a043020c12e1da42215b5d6d68da8b8f7abec706257608637a5af7d038f4844

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page