const express = require('express'); const cors = require('cors'); const axios = require('axios'); const app = express(); const port = 3000; // Конфигурация API Stable Diffusion const SD_API_URL = 'http://localhost:7860'; app.use(cors()); app.use(express.json()); // Прокси для txt2img с отслеживанием прогресса app.post('/api/txt2img', async (req, res) => { try { // Отправляем запрос на генерацию const generationPromise = axios.post(`${SD_API_URL}/sdapi/v1/txt2img`, req.body); // Начинаем отслеживать прогресс сразу let isGenerating = true; let lastProgress = 0; while (isGenerating) { try { const progressResponse = await axios.get(`${SD_API_URL}/sdapi/v1/progress`); const progress = progressResponse.data; if (progress.progress >= 1.0) { isGenerating = false; } // Если прогресс изменился, обновляем lastProgress if (progress.progress !== lastProgress) { lastProgress = progress.progress; console.log(`Прогресс генерации: ${Math.round(progress.progress * 100)}%`); } await new Promise(resolve => setTimeout(resolve, 100)); } catch (error) { console.error('Ошибка при получении прогресса:', error); break; } } // Ждем завершения генерации const response = await generationPromise; res.json(response.data); } catch (error) { console.error('Ошибка при запросе к Stable Diffusion API:', error); res.status(500).json({ error: 'Ошибка при генерации изображения' }); } }); // Прокси для проверки прогресса app.get('/api/progress', async (req, res) => { try { const response = await axios.get(`${SD_API_URL}/sdapi/v1/progress`); const progress = response.data; // Добавляем дополнительную информацию о прогрессе const result = { ...progress, percentage: Math.round(progress.progress * 100), current_step: progress.state?.sampling_step || 0, total_steps: progress.state?.sampling_steps || 1 }; res.json(result); } catch (error) { console.error('Ошибка при получении прогресса:', error); res.status(500).json({ error: 'Ошибка при получении прогресса' }); } }); // Прокси для получения моделей app.get('/api/sd-models', async (req, res) => { try { const response = await axios.get(`${SD_API_URL}/sdapi/v1/sd-models`); res.json(response.data); } catch (error) { console.error('Ошибка при получении списка моделей:', error); res.status(500).json({ error: 'Ошибка при получении списка моделей' }); } }); // Прокси для получения сэмплеров app.get('/api/samplers', async (req, res) => { try { const response = await axios.get(`${SD_API_URL}/sdapi/v1/samplers`); res.json(response.data); } catch (error) { console.error('Ошибка при получении списка сэмплеров:', error); res.status(500).json({ error: 'Ошибка при получении списка сэмплеров' }); } }); app.listen(port, () => { console.log(`Сервер запущен на порту ${port}`); });