opsiom-cli 1.3.0__tar.gz → 1.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
opsiom_cli-1.5.0/.env ADDED
@@ -0,0 +1 @@
1
+ TOKEN_PYPI=pypi-AgEIcHlwaS5vcmcCJDI3YTY0YTk5LTExZDktNDFlOS04ZGE4LTU1MWFmNDcwZTg1MAACKlszLCJjYzExY2QyYy00ODg4LTRlOTItOTNmYy00NTdhMDhlMWQ5NjQiXQAABiDBNDAJrhWz9Rt11yQPXO1klHHZCcHTEsImiD4G6FOTWA
@@ -0,0 +1,36 @@
1
+ # Changelog
2
+
3
+ ## 1.5.0
4
+
5
+ ### Ajouts
6
+ - Sous-commandes `opsiom doctor` (diagnostic), `opsiom paths` (emplacements des fichiers) et `opsiom configure`.
7
+ - Question unique : `opsiom -p "…"` et `cat fichier | opsiom`.
8
+ - Options `-m/--model` et `--logo` (le repère graphique n’est plus affiché par défaut).
9
+ - Commandes de session `/retry`, `/copy`, `/doctor`.
10
+ - Saisie multiligne avec `"""`.
11
+ - Configuration initiale guidée : URL vérifiée, avertissement pour `http://` distant, clé API saisie masquée.
12
+ - Message explicite quand le serveur est injoignable, avec les actions à tenter.
13
+ - Packaging : `pyproject.toml`, point d’entrée `opsiom`, tests `pytest`.
14
+
15
+ ### Corrections
16
+ - `/save` : le nom de fichier est confiné au dossier des transcriptions (plus de `../` ni de chemin absolu).
17
+ - Fichiers `config.json` et `usage.json` écrits de façon atomique, avec droits 600.
18
+ - Une connexion Octix refusée n’est plus prise pour une réussite lorsque le Space redirige vers `/login`.
19
+ - Une réponse interrompue avant l’évènement de fin est signalée comme erreur.
20
+ - Après une reconnexion Octix, le message est renvoyé automatiquement.
21
+ - Les réponses conservent leurs retours à la ligne et leur indentation (listes, blocs de code).
22
+ - Les codes de couleur ne perturbent plus la largeur du prompt (readline).
23
+ - `/model <nom>` refuse les modèles inconnus.
24
+ - L’historique de saisie est sauvegardé même en cas d’erreur.
25
+ - Les connexions HTTP sont fermées proprement après chaque réponse.
26
+
27
+ ### Changements
28
+ - Interface en français avec vouvoiement partout.
29
+ - En-tête compact (quatre lignes) et repère visuel entre la question et la réponse.
30
+ - Pied de réponse sur une ligne : durée et quota.
31
+ - Symboles ASCII de repli et respect de `NO_COLOR`.
32
+ - Emplacements des fichiers via les conventions de chaque système (`APPDATA` sous Windows, `XDG` ailleurs).
33
+ - Le quota n’est plus estimé localement : seul le quota renvoyé par le serveur est affiché.
34
+
35
+ ## 1.4.0
36
+ - Version initiale du CLI avec serveur API et Space Hugging Face.
@@ -0,0 +1,173 @@
1
+ Metadata-Version: 2.5
2
+ Name: opsiom-cli
3
+ Version: 1.5.0
4
+ Summary: Interface en ligne de commande pour discuter avec Opsiom, l'assistant IA francophone.
5
+ Keywords: chatbot,cli,francophone,ia,opsiom
6
+ Classifier: Environment :: Console
7
+ Classifier: Intended Audience :: End Users/Desktop
8
+ Classifier: Natural Language :: French
9
+ Classifier: Operating System :: OS Independent
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3 :: Only
12
+ Classifier: Topic :: Communications :: Chat
13
+ Requires-Python: >=3.9
14
+ Requires-Dist: requests>=2.31
15
+ Provides-Extra: dev
16
+ Requires-Dist: pytest>=7; extra == 'dev'
17
+ Description-Content-Type: text/markdown
18
+
19
+ # opsiom-cli
20
+
21
+ Discutez avec **Opsiom**, l’assistant IA francophone, depuis votre terminal.
22
+
23
+ ```
24
+ pip install opsiom-cli
25
+ opsiom
26
+ ```
27
+
28
+ ## Sommaire
29
+
30
+ - [Démarrage rapide](#démarrage-rapide)
31
+ - [Utilisation](#utilisation)
32
+ - [Commandes de session](#commandes-de-session)
33
+ - [Configuration](#configuration)
34
+ - [Dépannage](#dépannage)
35
+ - [Confidentialité et sécurité](#confidentialité-et-sécurité)
36
+ - [Développement](#développement)
37
+
38
+ ## Démarrage rapide
39
+
40
+ 1. Installez le paquet (Python 3.9 ou plus récent) :
41
+
42
+ ```bash
43
+ pip install opsiom-cli
44
+ ```
45
+
46
+ 2. Lancez-le. Au premier démarrage, le CLI demande l’adresse du serveur, puis votre clé API ou votre pseudo Octix. Ces informations vous sont transmises par la personne qui héberge Opsiom.
47
+
48
+ ```bash
49
+ opsiom
50
+ ```
51
+
52
+ 3. Vérifiez la connexion à tout moment :
53
+
54
+ ```bash
55
+ opsiom doctor
56
+ ```
57
+
58
+ ## Utilisation
59
+
60
+ | Commande | Effet |
61
+ |---|---|
62
+ | `opsiom` | Session interactive. |
63
+ | `opsiom -p "Résume ce texte"` | Pose une question, affiche la réponse et quitte. |
64
+ | `cat notes.txt \| opsiom` | Envoie le contenu de l’entrée standard comme question. |
65
+ | `opsiom -m <modèle> …` | Choisit le modèle (identifiant ou nom partiel). |
66
+ | `opsiom configure` | Reconfigure le serveur et la clé d’accès. |
67
+ | `opsiom doctor` | Vérifie l’URL, le serveur, les modèles et le quota. |
68
+ | `opsiom paths` | Affiche les emplacements des fichiers locaux. |
69
+ | `opsiom --logo` | Affiche le repère graphique au démarrage de la session. |
70
+
71
+ ### Saisie multiligne
72
+
73
+ Dans une session, tapez `"""` seul sur une ligne, écrivez votre texte, puis terminez par `"""` seul sur une ligne. Entrée seule envoie un message simple.
74
+
75
+ ## Commandes de session
76
+
77
+ | Commande | Effet |
78
+ |---|---|
79
+ | `/retry` | Relance la dernière question. |
80
+ | `/copy` | Copie la dernière réponse dans le presse-papiers. |
81
+ | `/save [nom]` | Exporte la conversation en Markdown dans `~/opsiom-conversations/`. |
82
+ | `/new` | Repart d’une conversation vide. |
83
+ | `/clear` | Efface l’écran. |
84
+ | `/model [id ou numéro]` | Change de modèle. Sans argument, affiche un menu. |
85
+ | `/models` | Liste les modèles disponibles. |
86
+ | `/status` | Rappelle la connexion, le compte et le quota. |
87
+ | `/quota` | Affiche le quota restant aujourd’hui. |
88
+ | `/doctor` | Lance le diagnostic depuis la session. |
89
+ | `/help` | Affiche l’aide. |
90
+ | `/quit` | Quitte (aussi `/exit`, ou Ctrl+D). |
91
+
92
+ Raccourcis : **Entrée** envoie, **Ctrl+C** annule la saisie ou la réponse en cours, **Ctrl+D** quitte. L’historique des saisies se parcourt avec les flèches.
93
+
94
+ ## Configuration
95
+
96
+ Les paramètres sont lus dans cet ordre de priorité : options de ligne de commande, variables d’environnement, fichier de configuration.
97
+
98
+ | Option | Variable d’environnement | Rôle |
99
+ |---|---|---|
100
+ | `--url` | `OPSIOM_URL` | Adresse du serveur ou du Space Hugging Face. |
101
+ | `--api-key` | `OPSIOM_API_KEY` | Clé API (serveur API). |
102
+ | `--backend` | `OPSIOM_BACKEND` | `api`, `hf` ou `auto` (d’après l’adresse). |
103
+ | `--username` | `OPSIOM_USERNAME` | Pseudo Octix (Space Hugging Face). |
104
+ | — | `OPSIOM_PASSWORD` | Mot de passe Octix. **Déconseillé** : visible par les autres processus du même utilisateur. Préférez la saisie masquée. |
105
+ | `--hf-token` | `OPSIOM_HF_TOKEN` ou `HF_TOKEN` | Jeton Hugging Face, si le Space est privé. |
106
+
107
+ Fichiers locaux (`opsiom paths` les affiche) :
108
+
109
+ - **configuration** : `config.json`, droits 600. Le mot de passe n’y est jamais écrit.
110
+ - **quota local** : `usage.json`, un cache d’affichage. Le serveur fait foi.
111
+ - **historique de saisie** : pour la flèche du haut.
112
+ - **transcriptions** : dossier des exports `/save`.
113
+
114
+ ### Affichage
115
+
116
+ - Les couleurs sont désactivées si `NO_COLOR` est défini, si `TERM=dumb`, ou si la sortie est redirigée vers un fichier ou un pipe.
117
+ - Sur un terminal sans UTF-8, les symboles basculent sur de l’ASCII.
118
+
119
+ ## Dépannage
120
+
121
+ **« connexion impossible »**
122
+ Vérifiez l’adresse avec `opsiom doctor`, puis votre réseau. Si le serveur est un Space Hugging Face, il peut être en veille : patientez une minute, puis relancez.
123
+
124
+ **« clé API invalide ou expirée »**
125
+ Reconfigurez avec `opsiom configure`.
126
+
127
+ **« session expirée ou refusée par le Space »**
128
+ Le CLI propose de vous reconnecter, puis renvoie votre message.
129
+
130
+ **« quota quotidien atteint » ou « quota dépassé côté serveur »**
131
+ Le quota se réinitialise chaque jour. Utilisez `/quota` pour voir où vous en êtes.
132
+
133
+ **« modèle inconnu » ou « hors forfait »**
134
+ Tapez `/models` pour la liste. Un modèle marqué « hors forfait » n’est pas inclus dans votre offre.
135
+
136
+ **Les accents ou les couleurs s’affichent mal**
137
+ Utilisez un terminal qui gère l’UTF-8 et les couleurs 256. Sous Windows, préférez Windows Terminal.
138
+
139
+ **Le presse-papiers ne fonctionne pas avec `/copy`**
140
+ Sous Linux, installez `xclip`, `wl-copy` ou `xsel`. Sous macOS et Windows, les outils système sont utilisés.
141
+
142
+ ## Confidentialité et sécurité
143
+
144
+ - Chaque message est envoyé au serveur d’Opsiom. Le CLI ne transmet rien d’autre.
145
+ - Le mot de passe Octix n’est jamais enregistré : il est demandé à chaque lancement (saisie masquée).
146
+ - La clé API est stockée dans `config.json`, avec des droits 600. Ne partagez pas ce fichier.
147
+ - Un serveur `http://` distant est signalé : la clé et le mot de passe circuleraient en clair. Utilisez `https://`.
148
+ - Le contenu des conversations n’est écrit sur le disque que si vous lancez `/save`.
149
+
150
+ ## Développement
151
+
152
+ ```bash
153
+ git clone <dépôt>
154
+ cd opsiom-cli
155
+ pip install -e ".[dev]"
156
+ pytest
157
+ ```
158
+
159
+ Structure :
160
+
161
+ ```
162
+ src/opsiom_cli/
163
+ ├── cli.py options, configuration, question unique, sous-commandes
164
+ ├── chat.py session interactive, commandes, diagnostic, erreurs
165
+ ├── clients.py clients serveur API et Space Hugging Face, flux SSE
166
+ ├── storage.py chemins, configuration, quota local, transcriptions
167
+ └── ui.py couleurs, symboles, indicateur d’attente, streaming
168
+ tests/ tests unitaires et tests de bout en bout (faux serveur)
169
+ ```
170
+
171
+ ## Licence
172
+
173
+ À compléter.
@@ -0,0 +1,155 @@
1
+ # opsiom-cli
2
+
3
+ Discutez avec **Opsiom**, l’assistant IA francophone, depuis votre terminal.
4
+
5
+ ```
6
+ pip install opsiom-cli
7
+ opsiom
8
+ ```
9
+
10
+ ## Sommaire
11
+
12
+ - [Démarrage rapide](#démarrage-rapide)
13
+ - [Utilisation](#utilisation)
14
+ - [Commandes de session](#commandes-de-session)
15
+ - [Configuration](#configuration)
16
+ - [Dépannage](#dépannage)
17
+ - [Confidentialité et sécurité](#confidentialité-et-sécurité)
18
+ - [Développement](#développement)
19
+
20
+ ## Démarrage rapide
21
+
22
+ 1. Installez le paquet (Python 3.9 ou plus récent) :
23
+
24
+ ```bash
25
+ pip install opsiom-cli
26
+ ```
27
+
28
+ 2. Lancez-le. Au premier démarrage, le CLI demande l’adresse du serveur, puis votre clé API ou votre pseudo Octix. Ces informations vous sont transmises par la personne qui héberge Opsiom.
29
+
30
+ ```bash
31
+ opsiom
32
+ ```
33
+
34
+ 3. Vérifiez la connexion à tout moment :
35
+
36
+ ```bash
37
+ opsiom doctor
38
+ ```
39
+
40
+ ## Utilisation
41
+
42
+ | Commande | Effet |
43
+ |---|---|
44
+ | `opsiom` | Session interactive. |
45
+ | `opsiom -p "Résume ce texte"` | Pose une question, affiche la réponse et quitte. |
46
+ | `cat notes.txt \| opsiom` | Envoie le contenu de l’entrée standard comme question. |
47
+ | `opsiom -m <modèle> …` | Choisit le modèle (identifiant ou nom partiel). |
48
+ | `opsiom configure` | Reconfigure le serveur et la clé d’accès. |
49
+ | `opsiom doctor` | Vérifie l’URL, le serveur, les modèles et le quota. |
50
+ | `opsiom paths` | Affiche les emplacements des fichiers locaux. |
51
+ | `opsiom --logo` | Affiche le repère graphique au démarrage de la session. |
52
+
53
+ ### Saisie multiligne
54
+
55
+ Dans une session, tapez `"""` seul sur une ligne, écrivez votre texte, puis terminez par `"""` seul sur une ligne. Entrée seule envoie un message simple.
56
+
57
+ ## Commandes de session
58
+
59
+ | Commande | Effet |
60
+ |---|---|
61
+ | `/retry` | Relance la dernière question. |
62
+ | `/copy` | Copie la dernière réponse dans le presse-papiers. |
63
+ | `/save [nom]` | Exporte la conversation en Markdown dans `~/opsiom-conversations/`. |
64
+ | `/new` | Repart d’une conversation vide. |
65
+ | `/clear` | Efface l’écran. |
66
+ | `/model [id ou numéro]` | Change de modèle. Sans argument, affiche un menu. |
67
+ | `/models` | Liste les modèles disponibles. |
68
+ | `/status` | Rappelle la connexion, le compte et le quota. |
69
+ | `/quota` | Affiche le quota restant aujourd’hui. |
70
+ | `/doctor` | Lance le diagnostic depuis la session. |
71
+ | `/help` | Affiche l’aide. |
72
+ | `/quit` | Quitte (aussi `/exit`, ou Ctrl+D). |
73
+
74
+ Raccourcis : **Entrée** envoie, **Ctrl+C** annule la saisie ou la réponse en cours, **Ctrl+D** quitte. L’historique des saisies se parcourt avec les flèches.
75
+
76
+ ## Configuration
77
+
78
+ Les paramètres sont lus dans cet ordre de priorité : options de ligne de commande, variables d’environnement, fichier de configuration.
79
+
80
+ | Option | Variable d’environnement | Rôle |
81
+ |---|---|---|
82
+ | `--url` | `OPSIOM_URL` | Adresse du serveur ou du Space Hugging Face. |
83
+ | `--api-key` | `OPSIOM_API_KEY` | Clé API (serveur API). |
84
+ | `--backend` | `OPSIOM_BACKEND` | `api`, `hf` ou `auto` (d’après l’adresse). |
85
+ | `--username` | `OPSIOM_USERNAME` | Pseudo Octix (Space Hugging Face). |
86
+ | — | `OPSIOM_PASSWORD` | Mot de passe Octix. **Déconseillé** : visible par les autres processus du même utilisateur. Préférez la saisie masquée. |
87
+ | `--hf-token` | `OPSIOM_HF_TOKEN` ou `HF_TOKEN` | Jeton Hugging Face, si le Space est privé. |
88
+
89
+ Fichiers locaux (`opsiom paths` les affiche) :
90
+
91
+ - **configuration** : `config.json`, droits 600. Le mot de passe n’y est jamais écrit.
92
+ - **quota local** : `usage.json`, un cache d’affichage. Le serveur fait foi.
93
+ - **historique de saisie** : pour la flèche du haut.
94
+ - **transcriptions** : dossier des exports `/save`.
95
+
96
+ ### Affichage
97
+
98
+ - Les couleurs sont désactivées si `NO_COLOR` est défini, si `TERM=dumb`, ou si la sortie est redirigée vers un fichier ou un pipe.
99
+ - Sur un terminal sans UTF-8, les symboles basculent sur de l’ASCII.
100
+
101
+ ## Dépannage
102
+
103
+ **« connexion impossible »**
104
+ Vérifiez l’adresse avec `opsiom doctor`, puis votre réseau. Si le serveur est un Space Hugging Face, il peut être en veille : patientez une minute, puis relancez.
105
+
106
+ **« clé API invalide ou expirée »**
107
+ Reconfigurez avec `opsiom configure`.
108
+
109
+ **« session expirée ou refusée par le Space »**
110
+ Le CLI propose de vous reconnecter, puis renvoie votre message.
111
+
112
+ **« quota quotidien atteint » ou « quota dépassé côté serveur »**
113
+ Le quota se réinitialise chaque jour. Utilisez `/quota` pour voir où vous en êtes.
114
+
115
+ **« modèle inconnu » ou « hors forfait »**
116
+ Tapez `/models` pour la liste. Un modèle marqué « hors forfait » n’est pas inclus dans votre offre.
117
+
118
+ **Les accents ou les couleurs s’affichent mal**
119
+ Utilisez un terminal qui gère l’UTF-8 et les couleurs 256. Sous Windows, préférez Windows Terminal.
120
+
121
+ **Le presse-papiers ne fonctionne pas avec `/copy`**
122
+ Sous Linux, installez `xclip`, `wl-copy` ou `xsel`. Sous macOS et Windows, les outils système sont utilisés.
123
+
124
+ ## Confidentialité et sécurité
125
+
126
+ - Chaque message est envoyé au serveur d’Opsiom. Le CLI ne transmet rien d’autre.
127
+ - Le mot de passe Octix n’est jamais enregistré : il est demandé à chaque lancement (saisie masquée).
128
+ - La clé API est stockée dans `config.json`, avec des droits 600. Ne partagez pas ce fichier.
129
+ - Un serveur `http://` distant est signalé : la clé et le mot de passe circuleraient en clair. Utilisez `https://`.
130
+ - Le contenu des conversations n’est écrit sur le disque que si vous lancez `/save`.
131
+
132
+ ## Développement
133
+
134
+ ```bash
135
+ git clone <dépôt>
136
+ cd opsiom-cli
137
+ pip install -e ".[dev]"
138
+ pytest
139
+ ```
140
+
141
+ Structure :
142
+
143
+ ```
144
+ src/opsiom_cli/
145
+ ├── cli.py options, configuration, question unique, sous-commandes
146
+ ├── chat.py session interactive, commandes, diagnostic, erreurs
147
+ ├── clients.py clients serveur API et Space Hugging Face, flux SSE
148
+ ├── storage.py chemins, configuration, quota local, transcriptions
149
+ └── ui.py couleurs, symboles, indicateur d’attente, streaming
150
+ tests/ tests unitaires et tests de bout en bout (faux serveur)
151
+ ```
152
+
153
+ ## Licence
154
+
155
+ À compléter.
@@ -0,0 +1,39 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.18"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "opsiom-cli"
7
+ version = "1.5.0"
8
+ description = "Interface en ligne de commande pour discuter avec Opsiom, l'assistant IA francophone."
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ # TODO : compléter la licence et les auteurs avant publication
12
+ # license = { text = "..." }
13
+ # authors = [{ name = "..." }]
14
+ keywords = ["opsiom", "ia", "chatbot", "cli", "francophone"]
15
+ classifiers = [
16
+ "Programming Language :: Python :: 3",
17
+ "Programming Language :: Python :: 3 :: Only",
18
+ "Environment :: Console",
19
+ "Intended Audience :: End Users/Desktop",
20
+ "Natural Language :: French",
21
+ "Operating System :: OS Independent",
22
+ "Topic :: Communications :: Chat",
23
+ ]
24
+ dependencies = [
25
+ "requests>=2.31",
26
+ ]
27
+
28
+ [project.optional-dependencies]
29
+ dev = ["pytest>=7"]
30
+
31
+ [project.scripts]
32
+ opsiom = "opsiom_cli.cli:main"
33
+
34
+ [tool.hatch.build.targets.wheel]
35
+ packages = ["src/opsiom_cli"]
36
+
37
+ [tool.pytest.ini_options]
38
+ testpaths = ["tests"]
39
+ pythonpath = ["src"]
@@ -0,0 +1,8 @@
1
+ """Client en ligne de commande pour Opsiom."""
2
+
3
+ from importlib.metadata import PackageNotFoundError, version as _pkg_version
4
+
5
+ try:
6
+ __version__ = _pkg_version("opsiom-cli")
7
+ except PackageNotFoundError: # exécution depuis les sources, sans installation
8
+ __version__ = "0.0.0+dev"
@@ -0,0 +1,6 @@
1
+ """Permet `python -m opsiom_cli`."""
2
+
3
+ from .cli import main
4
+
5
+ if __name__ == "__main__":
6
+ raise SystemExit(main())