Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,22 @@
" print(f\" prix : {m.get('price')} {m.get('type')}/unite | tags : {m.get('tags')}\")\n"
]
},
{
"cell_type": "markdown",
"id": "lecture-catalogue-vllm-local",
"metadata": {},
"source": [
"### Lecture — un catalogue qui tient en un modèle\n",
"\n",
"`ai/models` renvoie **un seul modèle pour `vllm-local` : `qwen3.6-35b-a3b`**. Trois champs méritent lecture :\n",
"\n",
"- **`features = ['completion']`** : ce modèle est déclaré pour *compléter*, pas (via cette route) pour dialoguer. Le catalogue expose la capacité ; le point d'entrée `ai/chat` en fera l'usage, la cellule suivante serrera la main dans l'autre sens.\n",
"- **`8192` tokens de contexte, `4096` de complétion max** : le volume est borné — c'est l'ordre de grandeur d'une inférence locale quantifiée. C'est le guide de dimensionnement pour ne pas lui envoyer un corpus entier.\n",
"- **`price = {in: 0, out: 0}`** et tags **`['core', 'chat']`** : l'instance de dev est gratuite et marquée `core`. Le prix nul ne dit rien de la valeur, il dit l'absence de comptage.\n",
"\n",
"Le catalogue est donc la **source de vérité sur ce que le serveur sait servir** — on l'interroge avant de brancher un usage."
]
},
{
"cell_type": "code",
"execution_count": 4,
Expand Down Expand Up @@ -341,6 +357,18 @@
"print(\"environnement inexistant :\", inconnu.get(\"success\"), \"|\", inconnu.get(\"error\"))\n"
]
},
{
"cell_type": "markdown",
"id": "lecture-poignee-de-main",
"metadata": {},
"source": [
"### Lecture — la poignée de main, et son échec propre\n",
"\n",
"`ai/test_connection` répond pour `vllm-local` : **`success = True`, `provider = custom`, `modeles trouves = 1 ['qwen3.6-35b-a3b']`**. Le `provider` est `custom` ; le champ `details['endpoint']` — l'adresse du serveur de modèles — est volontairement masqué, c'est un secret local.\n",
"\n",
"Le second appel répond face à un `envId` inventé : **`success = False`, message « Environment not found. »** Le serveur **valide l'identifiant**, il ne l'invente pas : une faute de frappe dans un `env_id` ne produit pas un modèle vide, elle produit un **échec explicite**. C'est le contrat à garder pour la suite — on peut donc interroger un environnement inexistant **en toute sécurité** : l'API refuse avant de toucher quoi que ce soit."
]
},
{
"cell_type": "markdown",
"id": "35cfb7e4",
Expand Down Expand Up @@ -542,6 +570,18 @@
" print(f\" {e['id']:14s} [{e.get('type'):7s}] {modeles_de(e)}\")\n"
]
},
{
"cell_type": "markdown",
"id": "lecture-declarer-second-env",
"metadata": {},
"source": [
"### Lecture — déclarer un second environnement par recopie\n",
"\n",
"Ajouter `vllm-secours` ne part pas de zéro : la cellule **recopie la configuration de `vllm-local`** (`copy.deepcopy(source)`), change `id` et `name`, puis re-POST le `settings/update` complet. Résultat : **`update = True`, et `ai_envs` porte désormais deux entrées** — `vllm-local` et `vllm-secours`, même `type custom`, même modèle `qwen3.6-35b-a3b`.\n",
"\n",
"Le geste est un **read-modify-write** : on lit `ai_envs`, on le modifie en mémoire, on le réécrit en entier. C'est précisément la contre-mesure du piège de la section précédente — `settings/update` *remplace*, il ne *patch* pas, donc il faut toujours renvoyer l'objet complet. L'`id` suffit à faire un nouvel environnement : le serveur n'exige aucun enregistrement préalable."
]
},
{
"cell_type": "code",
"execution_count": 7,
Expand Down Expand Up @@ -580,6 +620,18 @@
" \"|\", (test.get(\"data\") or {}).get(\"message\"))\n"
]
},
{
"cell_type": "markdown",
"id": "lecture-interroger-secours",
"metadata": {},
"source": [
"### Lecture — le secours répond : même serveur, autre enveloppe\n",
"\n",
"Le nouveau `envId` est interrogé deux fois. `ai/models` sur `vllm-secours` → **`['qwen3.6-35b-a3b']`** ; `ai/test_connection` sur `vllm-secours` → **`True`, « Connection successful. Found 1 models. »**\n",
"\n",
"Le secours **tient** le même modèle que l'instance principale — un seul, toujours `qwen3.6-35b-a3b`. C'est cohérent : `vllm-secours` est une **copie** de `vllm-local`, donc les deux pointent le même backend sous un id différent. La valeur de la déclaration n'est pas un nouveau moteur, c'est une **enveloppe de repli** : si `vllm-local` tombe, `vllm-secours` est déjà configuré. La suite montre comment basculer."
]
},
{
"cell_type": "code",
"execution_count": 8,
Expand Down Expand Up @@ -633,6 +685,18 @@
"print(\"default_env remis :\", remis.get(\"ai_default_env\"))\n"
]
},
{
"cell_type": "markdown",
"id": "lecture-basculer-usage",
"metadata": {},
"source": [
"### Lecture — basculer un usage, vérifier, remettre\n",
"\n",
"La bascule réécrit `ai_default_env` en read-modify-write : `vllm-local` → `vllm-secours`. La vérification rend **`default_env bascule : vllm-secours | model : qwen3.6-35b-a3b`**, puis la cellule **remet tout à sa place** : `default_env remis : vllm-local`.\n",
"\n",
"Deux lectures : (1) **`ai_default_model` suit l'environnement** — basculer l'env change aussi le modèle par défaut, on ne les règle pas indépendamment. (2) La séquence est une **inversion maîtrisée** : on écrit, on vérifie, on remet. C'est l'ombre d'un blue-green, et le test de non-régression est justement `remis = vllm-local` — l'usage est revenu à son point de départ."
]
},
{
"cell_type": "code",
"execution_count": 9,
Expand Down Expand Up @@ -673,6 +737,18 @@
" \"|\", (test.get(\"data\") or {}).get(\"message\"))\n"
]
},
{
"cell_type": "markdown",
"id": "lecture-purger-secours",
"metadata": {},
"source": [
"### Lecture — purger : la réversibilité du read-modify-write\n",
"\n",
"La purge réécrit `ai_envs` **sans** `vllm-secours` (`[e for e in ... if e[\"id\"] != \"vllm-secours\"]`). L'état final est bien l'état initial : **`envs final = ['vllm-local']`, `default_env = vllm-local`, `model = qwen3.6-35b-a3b`, `module_embeddings = True`**, et `ai/test_connection` sur `vllm-local` → **`True`, « Connection successful. Found 1 models. »**\n",
"\n",
"C'est la leçon de la section : parce que `settings/update` **remplace** l'objet entier, toute modification (ajout, bascule, purge) est **entièrement réversible** — il suffit de réécrire `ai_envs` (ou `ai_default_env`) avec la valeur voulue. L'instance jetable revient à son état de référence sans état résiduel, et la dernière poignée de main confirme que le serveur est de nouveau opérationnel."
]
},
{
"cell_type": "markdown",
"id": "815f1d64",
Expand Down
Loading