From 950424f68a58e301f9f5d4d80544e9a82486764e Mon Sep 17 00:00:00 2001 From: xiamuceer Date: Sat, 14 Mar 2026 20:34:54 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E6=9B=B4=E6=96=B0AI=E8=81=8C?= =?UTF-8?q?=E4=B8=9A=E7=94=9F=E6=88=90=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=BE=93=E5=85=A5=E8=81=8C=E4=B8=9A=E8=A6=81=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/careers.py | 24 ++++++++++++++++++++---- frontend/src/pages/Careers.tsx | 21 ++++++++++++++++++++- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/backend/app/api/careers.py b/backend/app/api/careers.py index 28aed82..cacee6a 100644 --- a/backend/app/api/careers.py +++ b/backend/app/api/careers.py @@ -160,6 +160,7 @@ async def generate_career_system( project_id: str, main_career_count: int = 3, sub_career_count: int = 6, + user_requirements: str = "", enable_mcp: bool = False, http_request: Request = None, db: AsyncSession = Depends(get_db), @@ -223,7 +224,20 @@ async def generate_career_system( - 世界规则:{project.world_rules or '未设定'} """ - user_requirements = f""" + sanitized_user_requirements = user_requirements.strip() + extra_requirement_text = "" + if sanitized_user_requirements: + extra_requirement_text = f""" +用户额外要求: +{sanitized_user_requirements} + +执行要求: +- 请优先满足用户提出的职业方向、能力风格、限制条件和避雷项 +- 如果用户要求与已有职业高度相似,请保留需求核心,但生成定位差异明确的新职业 +- 如果用户要求与项目世界观冲突,请在不违背世界观的前提下进行合理改写和本土化适配 +""" + + generation_requirements = f""" 已有职业情况:{existing_careers_text} 生成要求(增量式): @@ -233,14 +247,15 @@ async def generate_career_system( - 新职业应填补已有职业体系的空缺,丰富职业多样性 - 主职业必须严格符合世界观规则,体现核心能力体系 - 副职业可以更加自由灵活,包含生产、辅助、特殊类型 -""" + +{extra_requirement_text}""" yield await tracker.preparing("构建AI提示词...") # 构建提示词 prompt = f"""{project_context} -{user_requirements} +{generation_requirements} 请为这个小说项目生成新的补充职业(增量式)。要求: 1. **仔细分析已有职业**,避免生成重复或相似的职业 @@ -288,7 +303,8 @@ async def generate_career_system( 4. 阶段名称要符合世界观特色 5. 副职业可以相对简化,但要有独特性 6. 所有职业都要符合项目的整体世界观设定 -7. 只返回纯JSON,不要添加任何解释文字 +7. 如果提供了用户额外要求,请优先满足;若与世界观冲突,必须以世界观为准进行合理改写 +8. 只返回纯JSON,不要添加任何解释文字 """ yield await tracker.generating(0, max(3000, len(prompt) * 8), "调用AI生成新职业...") diff --git a/frontend/src/pages/Careers.tsx b/frontend/src/pages/Careers.tsx index cc59fa5..c229c84 100644 --- a/frontend/src/pages/Careers.tsx +++ b/frontend/src/pages/Careers.tsx @@ -159,19 +159,25 @@ export default function Careers() { }); }; - const handleAIGenerate = async (values: { main_career_count: number; sub_career_count: number }) => { + const handleAIGenerate = async (values: { + main_career_count: number; + sub_career_count: number; + user_requirements?: string; + }) => { setIsAIModalOpen(false); setAiGenerating(true); setAiProgress(0); setAiMessage('开始生成新职业...'); try { + const userRequirements = values.user_requirements?.trim() || ''; const eventSource = new EventSource( `/api/careers/generate-system?` + new URLSearchParams({ project_id: projectId || '', main_career_count: values.main_career_count.toString(), sub_career_count: values.sub_career_count.toString(), + user_requirements: userRequirements, enable_mcp: 'false' }).toString(), { withCredentials: true } @@ -422,6 +428,19 @@ export default function Careers() { + +