diff --git a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx
index c0cca000c..ddbc7a502 100644
--- a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx
+++ b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx
@@ -245,6 +245,40 @@ test('后台素材查询不展示分类筛选和分类列', async () => {
expect(screen.queryByRole('columnheader', { name: '分类' })).toBeNull();
});
+test('后台素材查询将中间产物标记为不单独计费', async () => {
+ vi.mocked(listAdminEditorAssets).mockResolvedValueOnce({
+ entries: [
+ {
+ ...generatedAsset,
+ assetId: 'asset-source',
+ label: '角色形象原图',
+ assetKind: 'editor_green_screen_source',
+ generationCostMudPoints: 0,
+ },
+ generatedAsset,
+ ],
+ nextCursor: null,
+ });
+
+ render(
+ ,
+ );
+
+ const sourceRow = (await screen.findByText('角色形象原图')).closest('tr');
+ const finalRow = screen.getByText('角色形象 1').closest('tr');
+ expect(sourceRow).not.toBeNull();
+ expect(finalRow).not.toBeNull();
+ expect(within(sourceRow!).getByText('不单独计费')).toBeTruthy();
+ expect(within(finalRow!).getByText('12 泥点')).toBeTruthy();
+
+ fireEvent.click(within(sourceRow!).getByRole('button', { name: '详情' }));
+ expect(
+ within(await screen.findByRole('dialog', { name: '素材详情' })).getByText(
+ '不单独计费',
+ ),
+ ).toBeTruthy();
+});
+
test('后台素材查询缩略图使用 objectKey 换签后展示', async () => {
render(
,
diff --git a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.tsx b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.tsx
index 5bb5d25fa..d8276fe8f 100644
--- a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.tsx
+++ b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.tsx
@@ -24,6 +24,10 @@ const ADMIN_ASSET_READ_EXPIRE_SECONDS = 300;
const ADMIN_ASSET_READ_DISPATCH_SPACING_MS = 40;
const ADMIN_ASSET_READ_RETRY_DELAYS_MS = [400, 1_200, 3_000] as const;
const ADMIN_ASSET_THUMBNAIL_ROOT_MARGIN = '240px 0px';
+const NON_BILLED_INTERMEDIATE_ASSET_KINDS = new Set([
+ 'editor_green_screen_source',
+ 'editor_image_edit_source',
+]);
const AUDIO_ASSET_COVER_SRC = `${import.meta.env.DEV ? import.meta.env.BASE_URL : '/'}creation-home/audio-asset-cover.png`;
let adminAssetReadDispatchTail = Promise.resolve();
@@ -217,7 +221,7 @@ export function AdminEditorAssetQueryPage({
{promptText}
-
{entry.generationCostMudPoints} 泥点 |
+ {generationCostLabel(entry)} |
|