Files
art/server.js
T

100 lines
3.9 KiB
JavaScript

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}`);
});