feat(edit): 编辑上报细节优化

This commit is contained in:
2026-10-06 18:30:05 +08:00
parent e20cd7547f
commit 79b310efe7
92 changed files with 2764 additions and 368 deletions
+47
View File
@@ -2,6 +2,53 @@ import assert from 'node:assert/strict';
import { test } from 'node:test';
import { deepSeekJson, makeModel, validateCopy, validatePackage, runProductAiTask } from '../src/product-ai.ts';
test('SKU 用户要求独立进入高优先级输入,来源冲突和其他 SKU 不覆盖当前任务', async () => {
const previousFetch = globalThis.fetch;
const previousKey = process.env.DEEPSEEK_API_KEY;
process.env.DEEPSEEK_API_KEY = 'test-key';
let request;
let result;
const hint = '这是红色款,25cm。标题不要出现包邮。';
globalThis.fetch = async (_url, options) => {
request = JSON.parse(options.body);
return new Response(JSON.stringify({ choices: [{ finish_reason: 'stop', message: { content: JSON.stringify({
title: { ru: 'Красная фигурка 25 см', zh: '红色手办 25cm' },
tags: [{ ru: '#красная_фигурка', zh: '红色手办' }],
}) } }] }), { status: 200 });
};
const input = {
hint, variant_id: 'current', source_material: { title: '蓝色手办包邮 20cm', description: '蓝色', categories: [], attributes: [] },
profile: { title: '旧商品文案', tags: [], description: '旧描述' },
variants: [
{ id: 'current', display_name: '旧蓝色款', specification_values: [{ color: '蓝色' }] },
{ id: 'other', display_name: '其他SKU的专属角色', specification_values: [{ role: '其他角色' }] },
],
};
const tx = { query: async (sql, values) => {
if (sql.includes('SELECT kind, status')) return { rows: [{ kind: 'sku_copy', status: 'queued', input_snapshot: input }] };
if (sql.includes('result = $3::jsonb')) result = JSON.parse(values[2]);
return { rows: [] };
} };
try {
await runProductAiTask({ workspaceTransaction: async (_workspace, work) => work(tx) }, { workspaceId: 'workspace', payload: { task_id: 'task' } });
assert.match(request.messages[0].content, /user_requirements 优先于采集资料/);
assert.match(request.messages[0].content, /冲突时采用用户修正/);
assert.match(request.messages[0].content, /用户要求不改变以下输出格式与语言约束/);
const user = request.messages[1].content;
assert.ok(user.indexOf('user_requirements') < user.indexOf('辅助商品资料'));
assert.ok(user.includes(JSON.stringify({ user_requirements: hint })));
assert.ok(user.includes('蓝色手办包邮 20cm'));
assert.ok(!user.includes('其他SKU的专属角色'));
assert.equal((user.match(/user_requirements/g) ?? []).length, 1);
assert.equal(result.variant_id, 'current');
assert.deepEqual(result.copy.title, { ru: 'Красная фигурка 25 см', zh: '红色手办 25cm' });
} finally {
globalThis.fetch = previousFetch;
if (previousKey === undefined) delete process.env.DEEPSEEK_API_KEY;
else process.env.DEEPSEEK_API_KEY = previousKey;
}
});
test('同一商品模型只由类目和稳定商品 ID 确定', () => {
const category = { name: '手办', path: '玩具 / 手办' };
const first = makeModel(category, 'abcdef12-0000-4000-8000-000000000000');