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.2.tar.gz (440.8 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.2-py3-none-any.whl (22.0 kB view details)

Uploaded Python 3

File details

Details for the file kpihx_ai_cli-0.3.2.tar.gz.

File metadata

  • Download URL: kpihx_ai_cli-0.3.2.tar.gz
  • Upload date:
  • Size: 440.8 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.2.tar.gz
Algorithm Hash digest
SHA256 510b66c280d533ee5e256ed95283023671bacfe35b7be911e52a8032eece92d0
MD5 001d417928d40c520914c915d426d8e4
BLAKE2b-256 ae9d51e1d77c23871cd2cdc6274dcfdf803dec9fb7c58049c880c6178ee8c8c2

See more details on using hashes here.

File details

Details for the file kpihx_ai_cli-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: kpihx_ai_cli-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 22.0 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 79c2337888add2f6eb012f21ddf01690935c2427745b3f6023a01578835f5982
MD5 bd4baed546706aa76eab66c09a6423b3
BLAKE2b-256 1d8bcb84770f30482f369e89f821a320d70707312ba4a109cfdce8f550a87ffd

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