import assert from 'node:assert/strict'; import test from 'node:test'; import { buildWechatPageImageInstruction, buildWechatStandaloneImageInstruction, resolveWechatImageGenerationPolicy, WECHAT_PAGE_THUMBNAIL_MODE, } from './image-generation-policy.mjs'; import { classifyWechatIntent } from './intent/classifier.mjs'; test('service-account page always requires a fresh thumbnail without forcing body images', () => { const policy = resolveWechatImageGenerationPolicy({ text: '请做一个苏州旅行页面', isPageGenerate: true, requireFreshPageThumbnail: true, }); assert.equal(policy.pageThumbnailMode, WECHAT_PAGE_THUMBNAIL_MODE.REQUIRED_FRESH); assert.equal(policy.imageGenerationMode, 'required'); assert.equal(policy.inlineImageMode, 'auto'); assert.equal(policy.standaloneImageMode, 'auto'); assert.match(buildWechatPageImageInstruction(policy), /每个本轮交付给用户的正式内容页面/); }); test('no-image page request disables body images but keeps required fresh thumbnail', () => { const policy = resolveWechatImageGenerationPolicy({ text: '生成一个活动页面,只要文字,不要图片', isPageGenerate: true, requireFreshPageThumbnail: true, }); assert.equal(policy.pageThumbnailMode, 'required_fresh'); assert.equal(policy.inlineImageMode, 'disabled'); assert.match(buildWechatPageImageInstruction(policy), /正文和 Hero 不展示图片/); }); test('explicit body illustration request is independent from the page thumbnail', () => { const policy = resolveWechatImageGenerationPolicy({ text: '生成一个科普页面,每个章节都要正文插图', isPageGenerate: true, requireFreshPageThumbnail: true, }); assert.equal(policy.inlineImageMode, 'required'); }); test('standalone image intent gets an inline_image tool contract', () => { const policy = resolveWechatImageGenerationPolicy({ text: '帮我生成一张雨夜橘猫图片' }); assert.equal(policy.standaloneImageMode, 'required'); const instruction = buildWechatStandaloneImageInstruction(policy, { sourceMessageId: 'msg-1' }); assert.match(instruction, /purpose=`inline_image`/); assert.match(instruction, /idempotency_key=wechat-msg-1-image/); }); test('explicitly declining a page keeps standalone image generation out of page flow', () => { const text = '请生成一张雨夜橘猫插画,只生成图片,不要生成页面'; const intent = classifyWechatIntent({ msgType: 'text', agentText: text }); assert.equal(intent.kind, 'chat.general'); const policy = resolveWechatImageGenerationPolicy({ text, isPageGenerate: intent.kind === 'page.generate', requireFreshPageThumbnail: true, }); assert.equal(policy.pageThumbnailMode, 'auto'); assert.equal(policy.standaloneImageMode, 'required'); });