Date : 2026-03-26 / 2026-03-27 Statut : Fonctionnel avec limitations identifiées Prochaine étape : Détection intelligente des modèles vision vs texte
Interface web moderne pour chatter avec :
/genimg)/generate-image (POST) reçoit prompts, envoie à ComfyUI, polling, retourne image_url./start.sh)server.log, mcp_server.log)stop.sh)/genimg <description> → génère image via ComfyUI| Problème | Cause | Solution |
|---|---|---|
| CORS blocked | Fichiers ouverts via file:// |
Serveur Python sur port 8084 + CORS middleware dans MCP |
Identifier already declared |
main.js chargé deux fois + code inline |
Nettoyé HTML: un seul <script src="main.js"> |
Unexpected end of input |
Corruption de main.js pendant édition |
Rebuild complet du fichier |
| Ollama/LM Studio 400 Bad Request | max_tokens: -1 (invalide) |
Changé en max_tokens: 4096 |
| Image générée ajoutée 2× | addImageMessage() + push manuel |
Supprimé le push manuel dans handleImageGeneration() |
Image générée comme message user |
addImageMessage(..., true) |
Changé en false → message assistant |
| Model select vide après reconnexion | selectedIndex non défini après innerHTML = "" |
Forcé modelSelect.selectedIndex = 0 |
| connexion perdue après génération image | Doublon + format invalide → erreurs 400 → état inconsistent | Fixé doublon + format texte-only pour modèles texte |
| Images toujours envoyées en texte-only | buildConversationHistory() envoie seulement texte pour msg.isImage |
Non fixé → voir section "À faire" |
SERVER_PRESETS = {
ollama: 'http://localhost:11434',
lmstudio: 'http://localhost:1234',
openrouter: 'https://openrouter.ai/api/v1'
}
http://localhost:8084http://localhost:8085http://127.0.0.1:8188http://localhost:11434http://localhost:1234Pas besoin. Les URLs sont en dur dans le code et le selecteur.
start.sh — Démarre ComfyUI check → web server → MCP serverstop.sh — Arrête proprement les serveursstyles.css — CSS externalisé (tiré de l'ancien index.html)PROGRESS.md — Ce fichierindex.html — Ajouté server-url-input (hidden), removed inline scriptmain.js — Rebuild complet + nombreuses correctionsbackend/mcp_server.py — Ajouté logs, seed randomization, sleepREADME.md — Mis à jour avec nouvelles fonctionnalités et instructionsmain.js.corrupted — Sauvegarde corruptionindex.html.bak, index.html.bak_jsfix — Backupsserver.log, mcp_server.log — Logs serveurs.web_server.pid, .mcp_server.pid — PIDs serveursmain.js ou backend/mcp_server.py)./stop.sh./start.shNote : Le cache navigateur est activé par défaut. Utiliser DevTools → Network → "Disable cache" (quand DevTools ouvert) pour éviter Ctrl+Shift+R.
buildConversationHistory() dans main.js convertit tous les messages avec images (msg.isImage) en simple texte :
if (msg.isImage) {
const textContent = msg.text || "Image generated.";
history.push({
role: msg.isUser ? 'user' : 'assistant',
content: textContent // ← SEULEMENT TEXTE, PAS L'IMAGE
});
}
Conséquence :
Résultat : L'upload d'image et les images générées ne sont jamais "vues" par l'IA, même si le modèle le supporte.
Créer une fonction modelSupportsVision(modelName) :
function modelSupportsVision(modelName) {
const visionModels = [
'gpt-4o', 'gpt-4-turbo', 'gpt-4-vision',
'claude-3', 'claude-3-5', 'claude-3-opus',
'llava', 'bakllava', 'moondream'
];
return visionModels.some(v => modelName.toLowerCase().includes(v));
}
buildConversationHistory()currentChat.messages.forEach(msg => {
if (msg.isImage) {
const textContent = msg.text || "Image generated.";
if (modelSupportsVision(currentModel)) {
// Format multimodal (texte + image)
history.push({
role: msg.isUser ? 'user' : 'assistant',
content: [
{ type: "text", text: textContent },
{ type: "image_url", image_url: { url: msg.imageData } }
]
});
} else {
// Texte seulement (modèle texte)
history.push({
role: msg.isUser ? 'user' : 'assistant',
content: textContent
});
}
} else {
history.push({ role: msg.isUser ? 'user' : 'assistant', content: msg.content });
}
});
Ajouter un checkbox "Enable vision" dans l'UI (sidebar) qui force le mode vision indépendamment du nom du modèle.
Ollama + llama3.2 (texte-only) :
Ollama + llava:7b (vision) :
image_url)OpenRouter + GPT-4o (vision) :
{
"role": "user",
"content": [
{ "type": "text", "text": "What's in this image?" },
{ "type": "image_url", "image_url": { "url": "data:image/jpeg;base64,..." } }
]
}
Important : image_url peut être:
http://127.0.0.1:8188/view?...)Dans notre code, upload → base64, généré ComfyUI → URL HTTP. Les deux fonctionnent si le modèle peut fetch l'URL externe (Ollama local peut, OpenAI/OpenRouter ne peuvent pas fetch 127.0.0.1). Pour OpenRouter, il faudrait converter en base64.
Non abordé ici : conversion URL → base64 pour cloud APIs. À considérer plus tard si besoin.
Dans mcp_server.py, avant d'envoyer le workflow à ComfyUI, on parcourt tous les nœuds avec inputs.seed et on y met une valeur aléatoire. Cela évite que ComfyUI ne retourne le même résultat (cache interne).
for node in workflow.values():
if isinstance(node, dict) and "inputs" in node:
if "seed" in node["inputs"]:
node["inputs"]["seed"] = random.randint(0, 2**32 - 1)
# Vérifier ComfyUI curl http://127.0.0.1:8188/system_stats # Démarrer l'application ./start.sh # Voir logs MCP en temps réel tail -f backend/mcp_server.log # Arrêter ./stop.sh
./start.shllama3.2 est texte-only. Pour images, installer llava (ollama pull llava)PROGRESS.md (ce fichier)Signature : Claude (Assistant IA) — Dernière mise à jour : 2026-03-26 22:00 UTC