Files
image-generator/app.js

116 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
// ============================================================
// Config
// ============================================================
const express = require('express');
const fetch = require('node-fetch');
const path = require('path');
const fs = require('fs');
const PORT = 8195;
const HOST = '0.0.0.0';
// Config file stored alongside app.js
const CONFIG_FILE = path.join(__dirname, 'config.json');
function loadConfig() {
try {
return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
} catch {
return { apiKey: '', baseUrl: 'https://api.minimaxi.com' };
}
}
function saveConfig(cfg) {
fs.writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2));
}
// ============================================================
// App
// ============================================================
const app = express();
app.use(express.json());
app.use(express.static(__dirname));
// --- Settings ---
app.get('/api/config', (req, res) => {
const cfg = loadConfig();
res.json({
hasApiKey: !!cfg.apiKey,
baseUrl: cfg.baseUrl || 'https://api.minimax.io',
});
});
app.post('/api/config', (req, res) => {
const { apiKey, baseUrl } = req.body;
if (typeof apiKey !== 'string' || typeof baseUrl !== 'string') {
return res.status(400).json({ error: '参数格式错误' });
}
const cfg = { apiKey: apiKey.trim(), baseUrl: baseUrl.trim() || 'https://api.minimax.io' };
saveConfig(cfg);
res.json({ ok: true });
});
// --- Image generation ---
app.post('/api/generate', async (req, res) => {
const { prompt, aspect_ratio, model } = req.body;
if (!prompt || typeof prompt !== 'string' || !prompt.trim()) {
return res.status(400).json({ error: '请输入图片描述内容' });
}
const cfg = loadConfig();
if (!cfg.apiKey) {
return res.status(400).json({ error: '未配置 API Key请先在设置中填写 MiniMax API Key。' });
}
const baseUrl = cfg.baseUrl || 'https://api.minimax.io';
const endpoint = `${baseUrl}/v1/image_generation`;
const payload = {
model: model || 'image-01',
prompt: prompt.trim(),
aspect_ratio: aspect_ratio || '1:1',
response_format: 'base64',
};
try {
const response = await fetch(endpoint, {
method: 'POST',
headers: {
'Authorization': `Bearer ${cfg.apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
});
const data = await response.json();
if (!response.ok) {
const msg = data.error?.message || data.error || `HTTP ${response.status}`;
return res.status(response.status).json({ error: msg });
}
// Return base64 images
const images = data.data?.image_base64 || [];
res.json({ images });
} catch (err) {
console.error('[generate] error:', err.message);
res.status(500).json({ error: '无法连接 MiniMax API' + err.message });
}
});
// --- Serve index.html at root ---
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.listen(PORT, HOST, () => {
console.log(`Image Generator running at http://${HOST === '0.0.0.0' ? '10.0.10.110' : HOST}:${PORT}`);
});