Project Files
src / configSchematics.ts
import { createConfigSchematics } from "@lmstudio/sdk";
// La liste de modèles locaux est rafraîchie au démarrage du plugin (lms
// dev / lms push) en interrogeant `client.system.listDownloadedModels`.
// Si l'init échoue (LM Studio injoignable, etc.) on retombe sur une
// liste de fallback raisonnable — l'utilisateur pourra toujours pointer
// vers un autre modèle via le champ remoteModel (libre) si besoin.
export type ModelOption = { value: string; displayName: string };
const FALLBACK_MODELS: ModelOption[] = [
{ value: "qwen3-14b", displayName: "qwen3-14b (fallback)" },
];
let _currentLocalModels: ModelOption[] = FALLBACK_MODELS;
let _built: ReturnType<typeof build> | null = null;
function build(localModels: ModelOption[]) {
const safeLocal = localModels.length > 0 ? localModels : FALLBACK_MODELS;
const defaultLocal = safeLocal[0].value;
return createConfigSchematics()
.field(
"mode",
"select",
{
displayName: "OĂą tourne le narrateur",
hint: "Local = sur ce Mac (utilise localHost/localModel). Distant = sur une autre machine LM Studio du réseau (utilise remoteHost/remoteModel).",
options: [
{ value: "local", displayName: "Local (ce poste)" },
{ value: "remote", displayName: "Distant (autre machine LM Studio)" },
],
},
"local",
)
.field(
"localHost",
"string",
{
displayName: "Local — host:port",
hint: "Instance LM Studio locale (typiquement localhost:1234).",
},
"localhost:1234",
)
.field(
"localModel",
"select",
{
displayName: "Local — modèle narrateur",
hint: `Modèle chargé/téléchargé sur ce poste. Liste rafraîchie au démarrage du plugin (${safeLocal.length} détecté(s)). Pour utiliser un modèle absent de la liste, redémarre lms dev après l'avoir téléchargé.`,
options: safeLocal,
},
defaultLocal,
)
.field(
"remoteHost",
"string",
{
displayName: "Remote — host:port",
hint: "Instance LM Studio distante qui exécute le modèle narrateur (ex: 192.0.2.1:1234).",
},
"192.0.2.1:1234",
)
.field(
"remoteModel",
"string",
{
displayName: "Remote — modèle narrateur",
hint: "ID du modèle chargé côté remote (saisie libre — on ne peut pas énumérer les modèles d'une machine distante depuis ici). Ex : qwen3-30b, openai/gpt-oss-120b.",
},
"qwen3-14b",
)
.field(
"temperature",
"numeric",
{
displayName: "Température narrateur",
hint: "Créativité du narrateur. 0.85 marche bien pour la fiction interactive.",
slider: { min: 0.0, max: 1.5, step: 0.05 },
},
0.85,
)
.field(
"maxRetries",
"numeric",
{
displayName: "Retries en cas de citation hallucinée",
hint: "Nombre de tentatives correctives après une citation hors corpus. 2 = 3 essais max au total.",
slider: { min: 0, max: 4, step: 1 },
int: true,
},
2,
)
.field(
"defaultNotion",
"string",
{
displayName: "Notion par défaut",
hint: "Slug de notion bac (liberte, conscience, devoir, etat, justice…). Filtre le corpus injecté.",
},
"liberte",
)
.field(
"defaultSujet",
"string",
{
displayName: "Sujet par défaut",
hint: "Sujet de dissertation bac proposé si l'utilisateur ne précise rien.",
},
"La liberté est-elle l'absence de contrainte ?",
)
.field(
"storageDir",
"string",
{
displayName: "Dossier de persistance des sessions",
hint: "Chemin absolu. Vide = ~/.livre-heros-bac/sessions/. Chaque session est un fichier JSONL append-only.",
},
"",
)
.build();
}
// Récupère la version courante des schematics. Construit à la demande
// si pas encore initialisée — utile pour les imports précoces (avant
// que main() ait pu fetch la liste de modèles).
export function getConfigSchematics() {
if (!_built) _built = build(_currentLocalModels);
return _built;
}
// Reconstruit avec une nouvelle liste de modèles. Appelée par index.ts
// main() après avoir interrogé LM Studio. Le toolsProvider lit ensuite
// via getConfigSchematics() Ă chaque tool call.
export function rebuildConfigSchematics(localModels: ModelOption[]) {
_currentLocalModels = localModels;
_built = build(localModels);
return _built;
}
// Export historique pour compat — pointe vers la version courante.
// Note : ne PAS utiliser cet export depuis du code qui s'exécute après
// rebuildConfigSchematics(), il restera bloqué sur la 1re version.
// Préférer getConfigSchematics() partout.
export const configSchematics = getConfigSchematics();