feat: expose image generation to page agents

This commit is contained in:
john
2026-07-19 18:39:46 +08:00
parent 5b88f8ece5
commit 9cf12e3786
10 changed files with 220 additions and 10 deletions
+30 -6
View File
@@ -1,8 +1,6 @@
const PURPOSES = new Set(['inline_image', 'hero', 'card_cover', 'feed_cover']);
export function attachMindSpaceImageGenerationRoutes(router, { getService } = {}) {
router.post('/mindspace/v1/images/generate', async (req, res) => {
const service = getService?.();
async function handleGenerate(req, res, { service, userId, consumerPrefix }) {
if (!service) {
return res.status(503).json({
ok: false,
@@ -26,11 +24,11 @@ export function attachMindSpaceImageGenerationRoutes(router, { getService } = {}
return res.status(400).json({ message: '幂等键不能超过 128 字符' });
}
const result = await service.generate({
userId: req.currentUser.id,
userId,
purpose,
prompt,
negativePrompt: req.body?.negative_prompt,
consumerRef: `mindspace:${req.requestId ?? 'request'}:${purpose}`,
consumerRef: `${consumerPrefix}:${req.requestId ?? 'request'}:${purpose}`,
idempotencyKey,
});
if (!result.ok) {
@@ -43,5 +41,31 @@ export function attachMindSpaceImageGenerationRoutes(router, { getService } = {}
return res.status(unavailable ? 503 : 409).json(result);
}
return res.status(201).json({ data: result });
});
}
export function attachMindSpaceImageGenerationRoutes(
router,
{ getService, requireInternal = null } = {},
) {
router.post('/mindspace/v1/images/generate', async (req, res) => {
const service = getService?.();
return handleGenerate(req, res, {
service,
userId: req.currentUser.id,
consumerPrefix: 'mindspace',
});
});
if (requireInternal) {
router.post('/agent/mindspace_image_generate', async (req, res) => {
if (!requireInternal(req, res)) return;
const userId = String(req.body?.user_id ?? req.body?.userId ?? '').trim();
if (!userId) return res.status(400).json({ message: '缺少 user_id' });
return handleGenerate(req, res, {
service: getService?.(),
userId,
consumerPrefix: 'mindspace-agent',
});
});
}
}