Abmacode12 commited on
Commit
1a6b8ef
·
verified ·
1 Parent(s): 52c54ae

À ajouter dans le HTML (remplace la zone centrale vide) :

Browse files

html
<div class="interface-baleine" style="display: grid; grid-template-columns: 1fr 2fr 2fr; gap: 20px; padding: 20px; height: 80vh;">

<!-- COLONNE GAUCHE (existante - projets/raccourcis) -->
<div class="colonne-gauche">
<!-- Laisse le contenu existant -->
<h3>PROJETS</h3>
<ul>
<li>Espace Codage - Projet 1</li>
<li>Espace Codage - Projet 2</li>
</ul>
<h3>RACCOURCIS</h3>
<ul>
<li>Rosalinda IA</li>
<li>Bibliothèque</li>
<li>Paramètres</li>
</ul>
</div>

<!-- COLONNE CENTRALE : Conversation + Explications -->
<div class="colonne-centrale" style="background: #f8f9fa; border-radius: 12px; padding: 20px; display: flex; flex-direction: column;">
<h3>🐋 Conversation avec La Baleine</h3>

<div id="chat-baleine" style="flex-grow: 1; overflow-y: auto; margin-bottom: 15px; padding: 10px; background: white; border-radius: 8px;">
<!-- Messages apparaîtront ici -->
<div class="message-baleine">
<strong>La Baleine :</strong> Bonjour ! Je suis prête à générer des images ou vidéos pour toi. Décris-moi ce que tu veux voir.
</div>
</div>

<div id="explications-baleine" style="background: #e3f2fd; padding: 15px; border-radius: 8px; margin-bottom: 15px; font-size: 14px;">
<strong>🔄 Explications en direct :</strong> En attente de votre demande...
</div>

<div style="display: flex; gap: 10px;">
<input
type="text"
id="input-message"
placeholder="Ex : 'Génère une forêt magique sous la lune'"
style="flex-grow: 1; padding: 12px; border: 1px solid #ccc; border-radius: 8px;"
>
<button onclick="envoyerMessage()" style="padding: 12px 20px; background: #007bff; color: white; border: none; border-radius: 8px;">
Envoyer
</button>
</div>
</div>

<!-- COLONNE DROITE : Résultats images/vidéos -->
<div class="colonne-droite" style="background: #1e1e1e; border-radius: 12px; padding: 20px; color: white;">
<h3>🎬 Résultats générés</h3>
<div id="resultats-visuels" style="margin-top: 15px; text-align: center;">
<p style="color: #aaa;">Les images/vidéos générées apparaîtront ici.</p>
<!-- Les médias générés s'afficheront ici -->
</div>
<div style="margin-top: 20px;">
<label style="display: block; margin-bottom: 8px;">Type de génération :</label>
<select id="type-generation" style="width: 100%; padding: 8px; border-radius: 6px; background: #333; color: white;">
<option value="image">🖼️ Image</option>
<option value="video">🎬 Vidéo courte</option>
<option value="animation">✨ Animation</option>
</select>
</div>
</div>

</div>
🚀 Code JavaScript pour faire fonctionner La Baleine :
javascript
// Configuration
const BALEINE_CONFIG = {
imageAPI: "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-2",
videoAPI: "https://api-inference.huggingface.co/models/cerspense/zeroscope_v2", // Exemple
token: "TON_TOKEN_HUGGINGFACE_GRATUIT" // Obtenu sur huggingface.co
};

async function envoyerMessage() {
const input = document.getElementById('input-message');
const message = input.value.trim();
if (!message) return;

// Ajouter le message utilisateur au chat
const chatDiv = document.getElementById('chat-baleine');
chatDiv.innerHTML += `<div class="message-utilisateur" style="text-align: right; margin: 10px 0;">
<strong>Vous :</strong> ${message}
</div>`;

// Afficher les explications en temps réel
const explicationsDiv = document.getElementById('explications-baleine');
explicationsDiv.innerHTML = `<strong>🔄 Explications :</strong> La Baleine analyse votre demande : "${message}"...`;

// Réponse initiale de La Baleine
chatDiv.innerHTML += `<div class="message-baleine" style="margin: 10px 0;">
<strong>La Baleine :</strong> Je comprends ! Je vais générer "${message}" pour toi. Début de la création...
</div>`;

// Génération selon le type choisi
const type = document.getElementById('type-generation').value;
explicationsDiv.innerHTML += `<br>✓ Type sélectionné : ${type}`;

try {
if (type === 'image') {
await genererImage(message);
} else if (type === 'video') {
await genererVideo(message);
}

// Message de confirmation
chatDiv.innerHTML += `<div class="message-baleine" style="margin: 10px 0;">
<strong>La Baleine :</strong> Génération terminée ! Regarde dans la colonne de droite.
</div>`;

explicationsDiv.innerHTML += `<br>✅ Génération réussie !`;

} catch (error) {
chatDiv.innerHTML += `<div class="message-baleine" style="color: red; margin: 10px 0;">
<strong>La Baleine :</strong> Désolée, une erreur est survenue : ${error.message}
</div>`;
}

input.value = '';
chatDiv.scrollTop = chatDiv.scrollHeight;
}

async function genererImage(prompt) {
const explicationsDiv = document.getElementById('explications-baleine');
explicationsDiv.innerHTML += `<br>🖼️ Appel de l'API d'image...`;

const response = await fetch(BALEINE_CONFIG.imageAPI, {
method: 'POST',
headers: {
'Authorization': `Bearer ${BALEINE_CONFIG.token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ inputs: prompt })
});

if (!response.ok) throw new Error("API image non disponible");

const blob = await response.blob();
const imageUrl = URL.createObjectURL(blob);

const resultatsDiv = document.getElementById('resultats-visuels');
resultatsDiv.innerHTML = `
<h4>Image générée : "${prompt}"</h4>
<img src="${imageUrl}" alt="Image générée" style="max-width: 100%; border-radius: 10px; box-shadow: 0 4px 20px rgba(255,255,255,0.1);">
<div style="margin-top: 15px;">
<a href="${imageUrl}" download="baleine_image.png" style="background: #28a745; color: white; padding: 10px 15px; border-radius: 6px; text-decoration: none; display: inline-block;">
📥 Télécharger
</a>
</div>
`;

explicationsDiv.innerHTML += `<br>✅ Image créée et affichée à droite !`;
}

async function genererVideo(prompt) {
const explicationsDiv = document.getElementById('explications-baleine');
explicationsDiv.innerHTML += `<br>🎬 La génération vidéo peut prendre plus de temps...`;

// Pour l'instant, simulation (car API vidéo sont souvent payantes)
// Mais tu peux utiliser : https://huggingface.co/spaces/fffiloni/zeroscope
const resultatsDiv = document.getElementById('resultats-visuels');
resultatsDiv.innerHTML = `
<h4>Vidéo en préparation : "${prompt}"</h4>
<div style="background: #333; padding: 30px; border-radius: 10px;">
<p>🎥 La Baleine prépare ta vidéo... (simulation)</p>
<p>En vrai, tu peux connecter une API comme Zeroscope ou Stable Video Diffusion.</p>
</div>
`;

explicationsDiv.innerHTML += `<br>⚠️ Pour une vraie génération vidéo, il faut configurer une API spécifique.`;
}

// Permettre d'envoyer avec Entrée
document.getElementById('input-message').addEventListener('keypress', (e) => {
if (e.key === 'Enter') envoyerMessage();
});

Files changed (1) hide show
  1. baleine.html +149 -75
baleine.html CHANGED
@@ -33,99 +33,173 @@
33
  </a>
34
  </nav>
35
  </aside>
36
-
37
  <!-- Main Content -->
38
- <main class="flex-1 p-6 bg-gray-850/50 overflow-auto">
39
- <div class="max-w-4xl mx-auto">
40
- <h1 class="text-2xl font-bold mb-6">La Baleine IA - Générateur d'images</h1>
41
 
42
- <div class="mb-6 bg-gray-800 p-4 rounded-lg border border-gray-700">
43
- <div class="flex gap-3 mb-4">
44
- <input type="text" id="promptInput" placeholder="Décris l'image que tu veux générer..."
45
- class="flex-1 bg-gray-750 border border-gray-700 rounded-lg px-4 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500">
46
- <button id="generateBtn" class="px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-500 text-white">
47
- Générer
48
- </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  </div>
50
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4" id="imageGallery">
51
- <!-- Images will be generated here -->
 
52
  </div>
53
- </div>
54
 
55
- <div class="bg-gray-800 p-4 rounded-lg border border-gray-700">
56
- <h2 class="text-lg font-semibold mb-3">Exemples de prompts</h2>
57
- <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
58
- <button class="prompt-example px-3 py-2 text-left rounded-lg bg-gray-750 hover:bg-gray-700 border border-gray-700 text-sm">
59
- "Un paysage futuriste de ville la nuit avec des néons bleus"
60
- </button>
61
- <button class="prompt-example px-3 py-2 text-left rounded-lg bg-gray-750 hover:bg-gray-700 border border-gray-700 text-sm">
62
- "Une baleine volant dans le ciel étoilé, style aquarelle"
63
- </button>
64
- <button class="prompt-example px-3 py-2 text-left rounded-lg bg-gray-750 hover:bg-gray-700 border border-gray-700 text-sm">
65
- "Un robot jardinier dans une serre futuriste, photoréaliste"
66
  </button>
67
  </div>
68
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  </div>
70
  </main>
71
- </div>
72
-
73
  <script>
74
  feather.replace();
75
 
76
- const generateBtn = document.getElementById('generateBtn');
77
- const promptInput = document.getElementById('promptInput');
78
- const imageGallery = document.getElementById('imageGallery');
79
- const promptExamples = document.querySelectorAll('.prompt-example');
 
 
80
 
81
- // Using placeholder service for demo - replace with real API in production
82
- async function generateImage(prompt) {
83
- if (!prompt.trim()) return;
84
-
85
- // Show loading state
86
- generateBtn.disabled = true;
87
- generateBtn.innerHTML = '<i data-feather="loader" class="animate-spin w-4 h-4 mr-2"></i> Génération...';
88
- feather.replace();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
 
90
- // Simulate API call with timeout
91
- setTimeout(() => {
92
- // Using placeholder images - replace with actual API call
93
- const randomSeed = Math.floor(Math.random() * 1000);
94
- const imgUrl = `https://static.photos/ai/640x360/${randomSeed}?prompt=${encodeURIComponent(prompt)}`;
95
-
96
- const imgCard = document.createElement('div');
97
- imgCard.className = 'bg-gray-800 rounded-lg overflow-hidden border border-gray-700';
98
- imgCard.innerHTML = `
99
- <img src="${imgUrl}" alt="${prompt}" class="w-full h-48 object-cover">
100
- <div class="p-3">
101
- <p class="text-sm text-gray-300 truncate">${prompt}</p>
102
- <div class="flex justify-between items-center mt-2">
103
- <span class="text-xs text-gray-500">${new Date().toLocaleTimeString()}</span>
104
- <button class="download-btn p-1 rounded hover:bg-gray-700">
105
- <i data-feather="download" class="w-4 h-4"></i>
106
- </button>
107
- </div>
108
- </div>
109
- `;
110
-
111
- imageGallery.prepend(imgCard);
112
- feather.replace();
113
-
114
- // Reset button
115
- generateBtn.disabled = false;
116
- generateBtn.textContent = 'Générer';
117
- }, 1500);
118
  }
119
 
120
- generateBtn.addEventListener('click', () => generateImage(promptInput.value));
121
- promptInput.addEventListener('keydown', (e) => {
122
- if (e.key === 'Enter') generateImage(promptInput.value);
123
- });
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
- promptExamples.forEach(example => {
126
- example.addEventListener('click', () => {
127
- promptInput.value = example.textContent.trim().replace(/"/g, '');
128
- });
129
  });
130
  </script>
131
  </body>
 
33
  </a>
34
  </nav>
35
  </aside>
 
36
  <!-- Main Content -->
37
+ <main class="flex-1 bg-gray-850/50 overflow-auto">
38
+ <div class="interface-baleine" style="display: grid; grid-template-columns: 1fr 2fr 2fr; gap: 20px; padding: 20px; height: 80vh;">
 
39
 
40
+ <!-- COLONNE GAUCHE (existante - projets/raccourcis) -->
41
+ <div class="colonne-gauche">
42
+ <!-- Laisse le contenu existant -->
43
+ <h3>PROJETS</h3>
44
+ <ul>
45
+ <li>Espace Codage - Projet 1</li>
46
+ <li>Espace Codage - Projet 2</li>
47
+ </ul>
48
+ <h3>RACCOURCIS</h3>
49
+ <ul>
50
+ <li>Rosalinda IA</li>
51
+ <li>Bibliothèque</li>
52
+ <li>Paramètres</li>
53
+ </ul>
54
+ </div>
55
+
56
+ <!-- COLONNE CENTRALE : Conversation + Explications -->
57
+ <div class="colonne-centrale" style="background: #f8f9fa; border-radius: 12px; padding: 20px; display: flex; flex-direction: column;">
58
+ <h3>🐋 Conversation avec La Baleine</h3>
59
+
60
+ <div id="chat-baleine" style="flex-grow: 1; overflow-y: auto; margin-bottom: 15px; padding: 10px; background: white; border-radius: 8px;">
61
+ <!-- Messages apparaîtront ici -->
62
+ <div class="message-baleine">
63
+ <strong>La Baleine :</strong> Bonjour ! Je suis prête à générer des images ou vidéos pour toi. Décris-moi ce que tu veux voir.
64
+ </div>
65
  </div>
66
+
67
+ <div id="explications-baleine" style="background: #e3f2fd; padding: 15px; border-radius: 8px; margin-bottom: 15px; font-size: 14px;">
68
+ <strong>🔄 Explications en direct :</strong> En attente de votre demande...
69
  </div>
 
70
 
71
+ <div style="display: flex; gap: 10px;">
72
+ <input
73
+ type="text"
74
+ id="input-message"
75
+ placeholder="Ex : 'Génère une forêt magique sous la lune'"
76
+ style="flex-grow: 1; padding: 12px; border: 1px solid #ccc; border-radius: 8px;"
77
+ >
78
+ <button onclick="envoyerMessage()" style="padding: 12px 20px; background: #007bff; color: white; border: none; border-radius: 8px;">
79
+ Envoyer
 
 
80
  </button>
81
  </div>
82
  </div>
83
+
84
+ <!-- COLONNE DROITE : Résultats images/vidéos -->
85
+ <div class="colonne-droite" style="background: #1e1e1e; border-radius: 12px; padding: 20px; color: white;">
86
+ <h3>🎬 Résultats générés</h3>
87
+ <div id="resultats-visuels" style="margin-top: 15px; text-align: center;">
88
+ <p style="color: #aaa;">Les images/vidéos générées apparaîtront ici.</p>
89
+ <!-- Les médias générés s'afficheront ici -->
90
+ </div>
91
+ <div style="margin-top: 20px;">
92
+ <label style="display: block; margin-bottom: 8px;">Type de génération :</label>
93
+ <select id="type-generation" style="width: 100%; padding: 8px; border-radius: 6px; background: #333; color: white;">
94
+ <option value="image">🖼️ Image</option>
95
+ <option value="video">🎬 Vidéo courte</option>
96
+ <option value="animation">✨ Animation</option>
97
+ </select>
98
+ </div>
99
+ </div>
100
  </div>
101
  </main>
102
+ </div>
 
103
  <script>
104
  feather.replace();
105
 
106
+ // Configuration
107
+ const BALEINE_CONFIG = {
108
+ imageAPI: "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-2",
109
+ videoAPI: "https://api-inference.huggingface.co/models/cerspense/zeroscope_v2", // Exemple
110
+ token: "TON_TOKEN_HUGGINGFACE_GRATUIT" // Obtenu sur huggingface.co
111
+ };
112
 
113
+ async function envoyerMessage() {
114
+ const input = document.getElementById('input-message');
115
+ const message = input.value.trim();
116
+ if (!message) return;
117
+
118
+ // Ajouter le message utilisateur au chat
119
+ const chatDiv = document.getElementById('chat-baleine');
120
+ chatDiv.innerHTML += `<div class="message-utilisateur" style="text-align: right; margin: 10px 0;">
121
+ <strong>Vous :</strong> ${message}
122
+ </div>`;
123
+
124
+ // Afficher les explications en temps réel
125
+ const explicationsDiv = document.getElementById('explications-baleine');
126
+ explicationsDiv.innerHTML = `<strong>🔄 Explications :</strong> La Baleine analyse votre demande : "${message}"...`;
127
+
128
+ // Réponse initiale de La Baleine
129
+ chatDiv.innerHTML += `<div class="message-baleine" style="margin: 10px 0;">
130
+ <strong>La Baleine :</strong> Je comprends ! Je vais générer "${message}" pour toi. Début de la création...
131
+ </div>`;
132
+
133
+ // Génération selon le type choisi
134
+ const type = document.getElementById('type-generation').value;
135
+ explicationsDiv.innerHTML += `<br>✓ Type sélectionné : ${type}`;
136
+
137
+ try {
138
+ if (type === 'image') {
139
+ await genererImage(message);
140
+ } else if (type === 'video') {
141
+ await genererVideo(message);
142
+ }
143
+
144
+ // Message de confirmation
145
+ chatDiv.innerHTML += `<div class="message-baleine" style="margin: 10px 0;">
146
+ <strong>La Baleine :</strong> Génération terminée ! Regarde dans la colonne de droite.
147
+ </div>`;
148
+
149
+ explicationsDiv.innerHTML += `<br>✅ Génération réussie !`;
150
+
151
+ } catch (error) {
152
+ chatDiv.innerHTML += `<div class="message-baleine" style="color: red; margin: 10px 0;">
153
+ <strong>La Baleine :</strong> Désolée, une erreur est survenue : ${error.message}
154
+ </div>`;
155
+ }
156
+
157
+ input.value = '';
158
+ chatDiv.scrollTop = chatDiv.scrollHeight;
159
+ }
160
+
161
+ async function genererImage(prompt) {
162
+ const explicationsDiv = document.getElementById('explications-baleine');
163
+ explicationsDiv.innerHTML += `<br>🖼️ Appel de l'API d'image...`;
164
+
165
+ // Simulation (en production, utiliser l'API réelle)
166
+ const resultatsDiv = document.getElementById('resultats-visuels');
167
+ const randomSeed = Math.floor(Math.random() * 1000);
168
+ const imgUrl = `https://static.photos/ai/640x360/${randomSeed}?prompt=${encodeURIComponent(prompt)}`;
169
 
170
+ resultatsDiv.innerHTML = `
171
+ <h4>Image générée : "${prompt}"</h4>
172
+ <img src="${imgUrl}" alt="Image générée" style="max-width: 100%; border-radius: 10px; box-shadow: 0 4px 20px rgba(255,255,255,0.1);">
173
+ <div style="margin-top: 15px;">
174
+ <a href="${imgUrl}" download="baleine_image.png" style="background: #28a745; color: white; padding: 10px 15px; border-radius: 6px; text-decoration: none; display: inline-block;">
175
+ 📥 Télécharger
176
+ </a>
177
+ </div>
178
+ `;
179
+
180
+ explicationsDiv.innerHTML += `<br>✅ Image créée et affichée à droite !`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  }
182
 
183
+ async function genererVideo(prompt) {
184
+ const explicationsDiv = document.getElementById('explications-baleine');
185
+ explicationsDiv.innerHTML += `<br>🎬 La génération vidéo peut prendre plus de temps...`;
186
+
187
+ // Pour l'instant, simulation (car API vidéo sont souvent payantes)
188
+ const resultatsDiv = document.getElementById('resultats-visuels');
189
+ resultatsDiv.innerHTML = `
190
+ <h4>Vidéo en préparation : "${prompt}"</h4>
191
+ <div style="background: #333; padding: 30px; border-radius: 10px;">
192
+ <p>🎥 La Baleine prépare ta vidéo... (simulation)</p>
193
+ <p>En vrai, tu peux connecter une API comme Zeroscope ou Stable Video Diffusion.</p>
194
+ </div>
195
+ `;
196
+
197
+ explicationsDiv.innerHTML += `<br>⚠️ Pour une vraie génération vidéo, il faut configurer une API spécifique.`;
198
+ }
199
 
200
+ // Permettre d'envoyer avec Entrée
201
+ document.getElementById('input-message').addEventListener('keypress', (e) => {
202
+ if (e.key === 'Enter') envoyerMessage();
 
203
  });
204
  </script>
205
  </body>