erplibre/script/todo/assistant/__init__.py
Mathieu Benoit 8fc026c5c7 [ADD] assistant : serveur LLM reconnu, catalogue gpt, sessions locales
L'entrée « Question IA » envoyait toute question à une seule API distante, sur
un modèle figé et sans historique : aucun serveur local n'était atteignable,
et rien ne disait où partait le texte.

Deux règles gouvernent ce qui la remplace. Un port ne dit jamais qui répond —
un seul en héberge jusqu'à trois, et une famille réémet l'API d'une autre en
entier — donc l'identité se lit dans le CORPS, par une échelle ordonnée. Et
une adresse ne devient jamais du texte d'invite : le détecteur du dépôt ne
voit pas les noms d'hôte, d'où une poignée opaque à sa place.

Vérifié : 284 tests, et contre un serveur du réseau — reconnaissance,
capacités lues, conversation multi-tours, triage juste.

--- EN ---

The "AI question" entry sent every question to a single remote API, on a
frozen model and with no history: no local server was reachable, and nothing
said where the text was going.

Two rules govern what replaces it. A port never says who answers — one hosts
up to three products, and one family re-serves another's native API in full —
so identity is read from the BODY, by an ordered ladder. And an address never
becomes prompt text: the repository's detector does not see host names, hence
an opaque handle in its place.

Checked: 284 tests, and against a server on the network — recognition,
capabilities read, a multi-turn conversation, a correct triage.

Assisted-by: Claude Opus 5
2026-09-09 07:35:15 -04:00

31 lines
1.7 KiB
Python

#!/usr/bin/env python3
# © 2026 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
"""Assistant LLM du CLI TODO : quel serveur répond, et que lui dire.
Le paquet est découpé par responsabilité : `fingerprint` reconnaît QUI répond
sur un port, `capabilities` traduit cette reconnaissance en ce que le modèle
sait faire, `servers` garde les serveurs retenus, `backends` parle à l'un
d'eux, `chat` tient la conversation. Aucun de ces modules n'importe `todo.py` ;
c'est le mixin `script/todo/assistant_menu.py` qui les branche sur le CLI.
La frontière est tenue par un test — importer ce paquet ne doit jamais tirer
`script.todo.todo`, qui coûte près d'une seconde et imprime sur la sortie.
Deux règles gouvernent tout ce qui suit, et aucune n'est une précaution de
style.
**Une adresse ne devient jamais du texte de prompt.** Un alias SSH, un nom
d'hôte, une adresse IP, un nom de VM désignent des machines qui ne
s'annoncent nulle part ailleurs. Un serveur porte donc une POIGNÉE opaque —
`server-1` — et c'est elle qui circule ; l'adresse vit dans l'affichage du
menu et dans la configuration privée, jamais dans une invite, un argument de
commande ou un fichier que le dépôt suit. Le détecteur du dépôt reconnaît les
adresses, les courriels et les chemins de compte ; il ne reconnaît PAS les
noms, ce qui rend le filtrage insuffisant et la structure nécessaire.
**Le port dit où frapper, jamais qui répond.** Trois logiciels écoutent sur
8080, deux sur 5000, et l'un d'eux réémet l'API d'un autre à l'identique. La
reconnaissance se lit dans le CORPS d'une réponse, dans un ordre fixe dont
`fingerprint` porte la raison.
"""