feat(imitation): add article imitation create flow

Introduce 仿写创作: new list and create views, backend imitation service
and prompt templates, worker task routing for imitation jobs, and one-click
rewrite triggers from question citation sources. Surface source article
URL/title on article list/detail, and restrict failed articles to delete-only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-25 21:36:44 +08:00
parent 46d0a7aea0
commit 40d9a6cc63
29 changed files with 2678 additions and 120 deletions
+78
View File
@@ -71,6 +71,7 @@ const enUS = {
templates: "Templates",
custom: "Custom Generation",
freeCreate: "Free Create",
imitation: "Imitation Create",
media: "Media",
brandManagement: "Brand Management",
brands: "Brand Library",
@@ -150,6 +151,14 @@ const enUS = {
title: "Free Create",
description: "Create and edit articles freely, no templates or AI generation required.",
},
imitation: {
title: "Imitation Create",
description: "Manage rewritten articles generated from citation sources or external URLs.",
},
imitationCreate: {
title: "Imitation Create",
description: "Extract an article from a URL, then generate a new article in one step.",
},
media: {
title: "Media Management",
description: "Review desktop-managed media bindings, authorization state, and sync results in one place.",
@@ -385,6 +394,7 @@ const enUS = {
citationAnalysisTitle: "Citation Analysis",
contentCitations: "Content Citations",
contentCitationsTitle: "Content Citations",
imitationAction: "Imitation create",
taskDebugTitle: "Async Task Debug",
taskDebugHint: "For troubleshooting the callback -> queue -> worker flow only. The four main content sections above stay unchanged.",
contentCitationBadge: "Content Citation",
@@ -551,9 +561,76 @@ const enUS = {
instant_task: "Instant task",
schedule_task: "Scheduled task",
free_create: "Free create",
imitation: "Imitation create",
kol: "Refined template generation",
},
},
imitation: {
actions: {
create: "New Rewrite",
submit: "Submit and generate",
},
filters: {
publishStatus: "Publish status",
generateStatus: "Generation status",
keyword: "Search",
createdTime: "Created time",
createdTimeStart: "Start time",
createdTimeEnd: "End time",
keywordPlaceholder: "Search by article title",
},
list: {
eyebrow: "Imitation Create",
count: "{count} articles",
sourceArticle: "Source",
empty: "No rewritten articles yet. Start from a citation source or create one manually.",
deleteConfirm: "Delete this rewritten article?",
deleteSuccess: "Article deleted.",
deleteError: "Failed to delete article.",
},
create: {
title: "Create rewritten article",
subtitle: "The backend fetches the source article first, then generates a new original article from your settings.",
sourceSection: "Source article",
settingsSection: "Rewrite settings",
sourceURL: "Article URL",
sourceTitle: "Source title",
language: "Article language",
industry: "Industry / scenario",
brandName: "Brand / subject",
region: "Region",
targetAudience: "Target audience",
contentGoal: "Content goal",
tone: "Tone",
lengthGoal: "Length",
keywords: "Keywords",
preservePoints: "Keep / emphasize",
avoidPoints: "Avoid",
extraRequirements: "Extra requirements",
enableWebSearch: "Allow web search supplement",
webSearchHint: "When enabled, generation can reference live web information for newer facts or industry context.",
knowledgeBase: "Reference knowledge base",
knowledgeBasePlaceholder: "Optional. Add facts, brand material, and industry background.",
knowledgeBaseHint: "Selected groups are retrieved in the backend and passed to generation as reference context.",
sourceURLPlaceholder: "https://example.com/article",
sourceTitlePlaceholder: "Optional. Citation titles are prefilled automatically.",
industryPlaceholder: "For example: home improvement, education, SaaS, healthcare",
brandNamePlaceholder: "Optional. Helps the article fit a specific brand or subject.",
regionPlaceholder: "For example: Shanghai, East China, nationwide, North America",
targetAudiencePlaceholder: "For example: first-time buyers, channel partners, procurement leads",
contentGoalPlaceholder: "For example: education, conversion, brand trust, selection advice",
tonePlaceholder: "For example: professional, conversational, comparative, news analysis",
lengthGoalPlaceholder: "For example: around 1200 words, short post, long-form guide",
keywordsPlaceholder: "Type keywords and press Enter",
preservePointsPlaceholder: "List facts, data, arguments, or examples that must be kept.",
avoidPointsPlaceholder: "List claims, competitors, compliance risks, or wording to avoid.",
extraRequirementsPlaceholder: "Add channel, structure, title style, or industry-specific instructions.",
queued: "Rewrite task submitted and queued.",
sourceURLRequired: "Enter the source article URL first.",
submitError: "Failed to submit rewrite task.",
backToList: "Back to rewrites",
},
},
freeCreate: {
actions: {
create: "New Article",
@@ -856,6 +933,7 @@ const enUS = {
templateType: "Template",
currentVersion: "Current version",
source: "Source label",
sourceArticle: "Source article",
wordCount: "Word count",
},
versionUntitled: "Untitled version",