65 lines
2.2 KiB
JavaScript
65 lines
2.2 KiB
JavaScript
|
|
#!/usr/bin/env node
|
|||
|
|
/**
|
|||
|
|
* image-api-bridge.js · Python ↔ Node 图片API桥接
|
|||
|
|
* D144 · 铸渊 ICE-GL-ZY001
|
|||
|
|
*
|
|||
|
|
* Python 通过 subprocess 调用本脚本,stdin 输入 JSON 命令,stdout 输出 JSON 结果。
|
|||
|
|
* 解决 char-hero-design-packer.py 依赖 JS image-api-adapter 的问题。
|
|||
|
|
*
|
|||
|
|
* 用法:
|
|||
|
|
* echo '{"action":"generate_character_ref","charId":"CHAR-003","l0":"...","l1":"..."}' | node image-api-bridge.js
|
|||
|
|
* echo '{"action":"generate_image","prompt":"...","size":"2048x2048","filename":"test.png"}' | node image-api-bridge.js
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
// 桥接模式:所有日志输出到 stderr,stdout 只输出最终 JSON 结果
|
|||
|
|
console.log = (...args) => process.stderr.write(args.join(' ') + '\n');
|
|||
|
|
console.warn = (...args) => process.stderr.write(args.join(' ') + '\n');
|
|||
|
|
console.error = (...args) => process.stderr.write(args.join(' ') + '\n');
|
|||
|
|
|
|||
|
|
const { generateImage, generateCharacterRef } = require('./image-api-adapter');
|
|||
|
|
|
|||
|
|
let input = '';
|
|||
|
|
process.stdin.setEncoding('utf8');
|
|||
|
|
process.stdin.on('data', chunk => input += chunk);
|
|||
|
|
process.stdin.on('end', async () => {
|
|||
|
|
try {
|
|||
|
|
const req = JSON.parse(input || '{}');
|
|||
|
|
let result;
|
|||
|
|
|
|||
|
|
switch (req.action) {
|
|||
|
|
case 'generate_character_ref': {
|
|||
|
|
const { charId, l0, l1 } = req;
|
|||
|
|
if (!charId) throw new Error('缺少 charId');
|
|||
|
|
result = await generateCharacterRef({
|
|||
|
|
charId,
|
|||
|
|
l0Descriptor: l0 || '中国古代修仙少年,16岁,亚洲面孔',
|
|||
|
|
l1Config: l1 ? { clothing: l1 } : undefined,
|
|||
|
|
});
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
case 'generate_image': {
|
|||
|
|
const { prompt, size, filename, outputPath } = req;
|
|||
|
|
if (!prompt) throw new Error('缺少 prompt');
|
|||
|
|
result = await generateImage({ prompt, size, filename, outputPath });
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
throw new Error(`未知操作: ${req.action}`);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
process.stdout.write(JSON.stringify({ ok: true, data: result }) + '\n');
|
|||
|
|
process.exit(0);
|
|||
|
|
} catch (err) {
|
|||
|
|
process.stdout.write(JSON.stringify({ ok: false, error: err.message }) + '\n');
|
|||
|
|
process.exit(1);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// stdin 已关闭(pipe 模式),直接触发 end
|
|||
|
|
if (process.stdin.isTTY) {
|
|||
|
|
process.stderr.write('用法: echo \'{"action":"..."}\' | node image-api-bridge.js\n');
|
|||
|
|
process.exit(1);
|
|||
|
|
}
|