Abmacode12 commited on
Commit
8e0056e
·
verified ·
1 Parent(s): dd308b8

Merci encore pour votre collaboration sur le projet Espace Codage. J’avance bien grâce à votre travail.

Browse files

Je me permets de vous solliciter pour finaliser l'intégration de notre IA Rosalinda, afin qu'elle soit pleinement fonctionnelle — comme présenté dans l’interface visible sur la capture d’écran. J’aimerais que le backend soit opérationnel à 100 %, avec les fonctionnalités suivantes :

💬 Réponses en langage naturel via GPT-4

🖼️ Génération d’images avec DALL·E

🎤 (Optionnel) Préparation à la saisie vocale (Whisper)

✅ Réponses affichées proprement dans l’interface

🌐 Connectivité fluide entre frontend et backend

Je vous serais très reconnaissant si vous pouviez mettre en place cette intégration de manière gratuite et professionnelle, pour nous aider à continuer à bâtir ce projet dans de bonnes conditions techniques.

Voici les éléments déjà prêts :

🔐 Clé API OpenAI disponible

✅ Interface frontend fonctionnelle

⚙️ Backend Node.js fourni (via server.js, .env, etc.)

🖼️ Capture d'écran avec la structure souhaitée de l’interface

Je vous fais entièrement confiance pour cette étape cruciale, et je reste à disposition pour toute information complémentaire. Merci encore pour votre engagement et votre aide précieuse.

Files changed (3) hide show
  1. .env +4 -0
  2. script.js +24 -24
  3. server.js +75 -0
.env ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ ```plaintext
2
+ OPENAI_API_KEY=votre_clé_api_openai
3
+ PORT=3000
4
+ ```
script.js CHANGED
@@ -1,6 +1,7 @@
1
 
2
  // Configuration Backend
3
- const BACKEND_URL = "https://huggingface.co/spaces/Abmacode12/espace-codage";
 
4
  let isRecording = false;
5
  let mediaRecorder;
6
  let audioChunks = [];
@@ -30,27 +31,29 @@ async function sendMessage() {
30
  method: 'POST',
31
  headers: {
32
  'Content-Type': 'application/json',
 
33
  },
34
  body: JSON.stringify({
35
  message: message,
36
- type: 'text'
 
37
  })
38
  });
39
 
40
  const data = await response.json();
41
  activityMonitor.textContent = '[ Rosalinda en ligne ]';
42
 
43
- if (data.type === 'text') {
44
- addMessage('assistant', data.content);
45
- if (data.code) {
46
- codeOutput.innerHTML = `<pre><code>${data.code}</code></pre>`;
 
 
 
 
47
  }
48
- } else if (data.type === 'image') {
49
- const resultOutput = document.querySelector('.result-output');
50
- resultOutput.innerHTML = `<img src="${data.url}" alt="Image générée" style="max-width:100%;">`;
51
- addMessage('assistant', `Voici l'image que vous avez demandée :`);
52
  }
53
- } catch (error) {
54
  console.error('Erreur backend:', error);
55
  activityMonitor.textContent = '[ Erreur de connexion ]';
56
  addMessage('assistant', "Désolé, une erreur s'est produite. Veuillez réessayer.");
@@ -126,39 +129,36 @@ async function sendAudioMessage(audioBlob) {
126
  addMessage('assistant', "Désolé, une erreur s'est produite lors du traitement audio.");
127
  }
128
  }
129
-
130
- // Bouton Nouvelle Tâche
131
  document.querySelector('.menu button:nth-child(1)').addEventListener('click', async () => {
132
- const prompt = prompt("Décrivez l'image ou la vidéo que vous souhaitez générer:");
133
  if (prompt) {
134
  try {
135
- activityMonitor.textContent = '[ Génération en cours... ]';
136
- const response = await fetch(`${BACKEND_URL}/api/generate`, {
137
  method: 'POST',
138
  headers: {
139
  'Content-Type': 'application/json',
 
140
  },
141
  body: JSON.stringify({
142
- prompt: prompt,
143
- type: 'image' // ou 'video' si supporté
144
  })
145
  });
146
 
147
  const data = await response.json();
148
- activityMonitor.textContent = '[ Génération terminée ]';
149
 
150
- if (data.type === 'image') {
151
  const resultOutput = document.querySelector('.result-output');
152
  resultOutput.innerHTML = `<img src="${data.url}" alt="Image générée" style="max-width:100%;">`;
153
- } else if (data.type === 'video') {
154
- const resultOutput = document.querySelector('.result-output');
155
- resultOutput.innerHTML = `<video controls style="max-width:100%;"><source src="${data.url}" type="video/mp4"></video>`;
156
  }
157
  } catch (error) {
158
  console.error('Erreur génération:', error);
159
  activityMonitor.textContent = '[ Erreur de génération ]';
 
160
  }
161
  }
162
  });
163
-
164
  console.log("Interface Espace Codage chargée avec intégration backend complète.");
 
1
 
2
  // Configuration Backend
3
+ const BACKEND_URL = "http://localhost:3000"; // Ou votre URL de production
4
+ const OPENAI_API_KEY = "YOUR_OPENAI_KEY"; // À remplacer par votre clé ou via .env
5
  let isRecording = false;
6
  let mediaRecorder;
7
  let audioChunks = [];
 
31
  method: 'POST',
32
  headers: {
33
  'Content-Type': 'application/json',
34
+ 'Authorization': `Bearer ${OPENAI_API_KEY}`
35
  },
36
  body: JSON.stringify({
37
  message: message,
38
+ model: 'gpt-4',
39
+ temperature: 0.7
40
  })
41
  });
42
 
43
  const data = await response.json();
44
  activityMonitor.textContent = '[ Rosalinda en ligne ]';
45
 
46
+ if (data.choices && data.choices[0].message) {
47
+ const responseText = data.choices[0].message.content;
48
+ addMessage('assistant', responseText);
49
+
50
+ // Détection de code dans la réponse
51
+ const codeBlocks = responseText.match(/```[\s\S]*?```/g);
52
+ if (codeBlocks) {
53
+ codeOutput.innerHTML = `<pre><code>${codeBlocks.join('\n\n')}</code></pre>`;
54
  }
 
 
 
 
55
  }
56
+ } catch (error) {
57
  console.error('Erreur backend:', error);
58
  activityMonitor.textContent = '[ Erreur de connexion ]';
59
  addMessage('assistant', "Désolé, une erreur s'est produite. Veuillez réessayer.");
 
129
  addMessage('assistant', "Désolé, une erreur s'est produite lors du traitement audio.");
130
  }
131
  }
132
+ // Bouton Génération d'image
 
133
  document.querySelector('.menu button:nth-child(1)').addEventListener('click', async () => {
134
+ const prompt = prompt("Décrivez l'image que vous souhaitez générer avec DALL·E:");
135
  if (prompt) {
136
  try {
137
+ activityMonitor.textContent = '[ Génération image en cours... ]';
138
+ const response = await fetch(`${BACKEND_URL}/api/generate-image`, {
139
  method: 'POST',
140
  headers: {
141
  'Content-Type': 'application/json',
142
+ 'Authorization': `Bearer ${OPENAI_API_KEY}`
143
  },
144
  body: JSON.stringify({
145
+ prompt: prompt
 
146
  })
147
  });
148
 
149
  const data = await response.json();
150
+ activityMonitor.textContent = '[ Image générée ]';
151
 
152
+ if (data.url) {
153
  const resultOutput = document.querySelector('.result-output');
154
  resultOutput.innerHTML = `<img src="${data.url}" alt="Image générée" style="max-width:100%;">`;
155
+ addMessage('assistant', `Voici l'image générée pour "${prompt}"`);
 
 
156
  }
157
  } catch (error) {
158
  console.error('Erreur génération:', error);
159
  activityMonitor.textContent = '[ Erreur de génération ]';
160
+ addMessage('assistant', "Désolé, une erreur s'est produite lors de la génération de l'image.");
161
  }
162
  }
163
  });
 
164
  console.log("Interface Espace Codage chargée avec intégration backend complète.");
server.js ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ require('dotenv').config();
2
+ const express = require('express');
3
+ const { OpenAI } = require('openai');
4
+ const multer = require('multer');
5
+ const path = require('path');
6
+ const fs = require('fs');
7
+
8
+ const app = express();
9
+ const port = process.env.PORT || 3000;
10
+
11
+ // Configuration OpenAI
12
+ const openai = new OpenAI({
13
+ apiKey: process.env.OPENAI_API_KEY
14
+ });
15
+
16
+ // Middleware
17
+ app.use(express.json());
18
+ app.use(express.static('public'));
19
+
20
+ // Routes API
21
+ app.post('/api/chat', async (req, res) => {
22
+ try {
23
+ const completion = await openai.chat.completions.create({
24
+ model: req.body.model || "gpt-4",
25
+ messages: [
26
+ {
27
+ role: "system",
28
+ content: "Tu es Rosalinda, une assistante IA spécialisée en développement logiciel. Sois concise, technique et utile."
29
+ },
30
+ { role: "user", content: req.body.message }
31
+ ],
32
+ temperature: req.body.temperature || 0.7
33
+ });
34
+ res.json(completion);
35
+ } catch (error) {
36
+ console.error('OpenAI Error:', error);
37
+ res.status(500).json({ error: error.message });
38
+ }
39
+ });
40
+
41
+ app.post('/api/generate-image', async (req, res) => {
42
+ try {
43
+ const response = await openai.images.generate({
44
+ prompt: req.body.prompt,
45
+ n: 1,
46
+ size: "1024x1024"
47
+ });
48
+ res.json({ url: response.data[0].url });
49
+ } catch (error) {
50
+ console.error('DALL-E Error:', error);
51
+ res.status(500).json({ error: error.message });
52
+ }
53
+ });
54
+
55
+ // Configuration pour l'audio
56
+ const upload = multer({ dest: 'uploads/' });
57
+
58
+ app.post('/api/transcribe', upload.single('audio'), async (req, res) => {
59
+ try {
60
+ const transcription = await openai.audio.transcriptions.create({
61
+ file: fs.createReadStream(req.file.path),
62
+ model: "whisper-1"
63
+ });
64
+ fs.unlinkSync(req.file.path); // Nettoyage
65
+ res.json({ text: transcription.text });
66
+ } catch (error) {
67
+ console.error('Whisper Error:', error);
68
+ res.status(500).json({ error: error.message });
69
+ }
70
+ });
71
+
72
+ // Démarrer le serveur
73
+ app.listen(port, () => {
74
+ console.log(`Serveur backend démarré sur http://localhost:${port}`);
75
+ });