
    ,Wim"                     |    S r SSKrSSKrSSKJr  SSKJrJrJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJr   " S	 S
5      rg)u   
Prompt 文件生成器

当用户在后台配置 Prompt 后，自动生成对应的 Prompt 文件到 prompts/ 目录。
支持版本管理和历史记录。
    N)datetime)DictAnyOptional)Path)CategoryConfig)KnowledgePathConfig)StagePromptGeneratorc            	          \ rS rSrSrS\4S jrS\4S jrS\4S jrS\4S jr	SS	\S
\
S\4S jjrSS\S
\
S\4S jjrSS\S\\\4   S
\
S\4S jjrS\S\4S jrSS\S\\\4   S\\\4   4S jjrS\\\4   4S jrSrg)PromptFileGenerator   u   Prompt 文件生成器category_idc                    Xl         [        U5      U l        U R                  R                  U l        [        R
                  R                  U R                  S5      U l        [        R
                  R                  U R                  S5      U l        [        R                  " U R                  SS9  [        R                  " U R                  SS9  g)u5   
初始化生成器

Args:
    category_id: 方向ID
promptshistoryT)exist_okN)
r   r	   path_configcategory_dirospathjoinprompts_dirhistory_dirmakedirs)selfr   s     L   /Users/yu22x/Desktop/ddd_副本128/ctf/app/services/prompt/file_generator.py__init__PromptFileGenerator.__init__   s     '.{; ,,9977<<(9(99E77<<(8(8)D 	D$$t4
D$$t4    returnc                 V    [         R                  R                  U R                  S5      $ )u    获取系统 Prompt 文件路径zsystem_prompt.mdr   r   r   r   r   s    r   get_system_prompt_path*PromptFileGenerator.get_system_prompt_path&   s    ww||D,,.@AAr   c                 V    [         R                  R                  U R                  S5      $ )u    获取完整 Prompt 文件路径zfull_prompt.mdr"   r#   s    r   get_full_prompt_path(PromptFileGenerator.get_full_prompt_path*   s    ww||D,,.>??r   c                 V    [         R                  R                  U R                  S5      $ )u&   获取阶段 Prompt 配置文件路径zstages_prompt.jsonr"   r#   s    r   get_stages_prompt_path*PromptFileGenerator.get_stages_prompt_path.   s    ww||D,,.BCCr   system_promptcreate_backupc                    U R                  5       nU(       a6  [        R                  R                  U5      (       a  U R	                  US5        [        USSS9 nUR                  SU R                  R                  5        S35        UR                  S[        R                  " 5       R                  S5       S	35        UR                  S
5        UR                  U5        SSS5        U$ ! , (       d  f       U$ = f)u   
保存系统 Prompt 到文件

Args:
    system_prompt: 系统 Prompt 内容
    create_backup: 是否创建备份（历史版本）

Returns:
    保存的文件路径
r,   wutf-8encodingu   # 🎯 u    方向系统 Prompt

   **生成时间**: %Y-%m-%d %H:%M:%S

z---

N)r$   r   r   exists_create_backupopenwriter   upperr   nowstrftime)r   r,   r-   	file_pathfs        r   save_system_prompt&PromptFileGenerator.save_system_prompt2   s     //1	 RWW^^I66	?; )S73qGGgd..44677OPQGG()@)@AT)U(VVZ[\GGIGGM"	 4  43 s   BC**
C9stagesc                    U R                  5       nU(       a6  [        R                  R                  U5      (       a  U R	                  US5        U R
                  [        R                  " 5       R                  5       U[        U5      [        S U 5       5      S.S.n[        USSS9 n[        R                  " XESS	S
9  SSS5        U$ ! , (       d  f       U$ = f)u   
保存阶段 Prompt 配置到 JSON 文件

Args:
    stages: 阶段配置列表
    create_backup: 是否创建备份

Returns:
    保存的文件路径
stages_promptc              3   T   #    U  H  oR                  S 5      (       d  M  Sv   M      g7f)r      N)get).0ss     r   	<genexpr>9PromptFileGenerator.save_stages_prompt.<locals>.<genexpr>d   s     *Qfi@P11fs   (	()total_stagesstages_with_prompts)r   generated_atrA   summaryr/   r0   r1   F   )ensure_asciiindentN)r*   r   r   r6   r7   r   r   r;   	isoformatlensumr8   jsondump)r   rA   r-   r=   datar>   s         r   save_stages_prompt&PromptFileGenerator.save_stages_promptL   s     //1	 RWW^^I66	?;  ++$LLN446 #F'**Qf*Q'Q	
 )S73qIIdE!< 4  43 s   'C
CNfull_promptcontextc           	      >   U R                  5       nU(       a6  [        R                  R                  U5      (       a  U R	                  US5        [        USSS9 nUR                  SU R                  R                  5        S35        UR                  S[        R                  " 5       R                  S5       S	35        U(       a  UR                  S
5        UR                  S5        UR                  S5        UR                  5        HD  u  pg[        U[        [        [         ["        45      (       d  M,  UR                  SU SU S35        MF     UR                  S5        UR                  S5        UR                  U5        SSS5        U$ ! , (       d  f       U$ = f)u   
保存完整编译后的 Prompt 到文件（用于参考）

Args:
    full_prompt: 完整 Prompt 内容
    context: 编译上下文（用户输入等）
    create_backup: 是否创建备份

Returns:
    保存的文件路径
rZ   r/   r0   r1   u   # 📝 u    方向完整 Prompt

r3   r4   r5   u   ## 📋 编译上下文

u   | 参数 | 值 |
z|------|-----|
z| z | z |
z
---

u   ## 🎯 Prompt 内容

N)r'   r   r   r6   r7   r8   r9   r   r:   r   r;   r<   items
isinstancestrintfloatbool)r   rZ   r[   r-   r=   r>   keyvalues           r   save_full_prompt$PromptFileGenerator.save_full_promptn   sM    --/	 RWW^^I66	=9 )S73qGGgd..44677OPQGG()@)@AT)U(VVZ[\ 56,-*+")--/JC!%#sE4)@AA"SEUG4 89 #2 $GG/0GGK  4" # 43" s   CF4AF
Fr=   prefixc                    [         R                  R                  U5      (       d  g[        R                  " 5       R                  S5      n[         R                  R                  U5      n[         R                  R                  U5      u  pVU SU U 3n[         R                  R                  U R                  U5      nSSK
n	U	R                  X5        g)uh   
创建备份文件到 history 目录

Args:
    file_path: 原文件路径
    prefix: 文件名前缀
Nz%Y%m%d_%H%M%S_r   )r   r   r6   r   r;   r<   basenamesplitextr   r   shutilcopy2)
r   r=   rg   	timestampfilenamenameextbackup_filenamebackup_pathrl   s
             r   r7   "PromptFileGenerator._create_backup   s     ww~~i(( LLN++O<	77##I.GG$$X.	#HAi[6ggll4#3#3_E 	Y,r   categoryc                 2   0 nUR                  5       =(       d    0 nUR                  SS5      nU(       a  U R                  U5      US'   UR                  5       =(       d    / nU(       a  U R	                  U5      US'   U(       ad   [
        R                  " U R                  U5      n[
        R                  " U R                  UUU(       a  UOS5      nU R                  X5      US'   U$ U$ ! [         a"  n	[        S[        U	5       35         Sn	A	U$ Sn	A	ff = f)u   
生成所有 Prompt 文件

Args:
    category: 方向配置对象
    context: 编译上下文（可选，用于生成完整 Prompt）

Returns:
    生成的文件路径字典
r,    rC   NrZ   u#   ⚠️ 生成完整 Prompt 失败: )get_advanced_configrF   r?   
get_stagesrX   r
   generate_all_stagesr   compile_full_promptre   	Exceptionprintr_   )
r   ru   r[   resultadvancedr,   rA   full_stagesrZ   es
             r   generate_all_prompts(PromptFileGenerator.generate_all_prompts   s     //17R _b9&*&=&=m&LF?# $$&,"&*&=&=f&EF?# F2FFtGWGWY_`2FF$$%2M	 )-(=(=k(S}%
 v	  F;CF8DEE	Fs   A!C* *
D4DDc                    U R                   0 SS.nU R                  5       U R                  5       U R                  5       S.nUR	                  5        H  u  p4[
        R                  R                  U5      (       aZ  [
        R                  " U5      nSUR                  [        R                  " UR                  5      R                  5       S.US   U'   M  SS0US   U'   M     [
        R                  R                  U R                  5      (       ak  [
        R                  " U R                  5       Vs/ s H2  ofR!                  S	5      (       d  UR!                  S
5      (       d  M0  UPM4     nn[#        U5      US'   U$ s  snf )uD   
获取 prompts 目录摘要信息

Returns:
    摘要信息字典
r   )r   fileshistory_count)r,   rZ   rC   T)r6   sizemodifiedr   r6   Fz.mdz.jsonr   )r   r$   r'   r*   r]   r   r   r6   statst_sizer   fromtimestampst_mtimerR   r   listdirendswithrS   )r   rN   
main_filesrp   r   r   r>   history_filess           r   get_prompts_summary'PromptFileGenerator.get_prompts_summary   s@     ++
 "88:446!88:

 %**,JDww~~d##wwt}" LL ( 6 6t}} E O O Q* & +3E): & - 77>>$**++(*

43C3C(Dq(D1

SXHYHY]^]g]gho]pQ(DMq'*='9GO$ rs   2/E=%E=)r   r   r   r   r   )T)NT)N)__name__
__module____qualname____firstlineno____doc__r_   r   r$   r'   r*   rb   r?   listrX   r   r   re   r7   r   r   r   __static_attributes__ r   r   r   r      s     5C 5"B B@c @D D D TW 4   d  c  D$C $$sCx. $`d $ps $L- -S -,'^ 'd3PS8n '`dehjmem`n 'R$T#s(^ $r   r   )r   r   rU   r   typingr   r   r   pathlibr   app.models.database.modelsr   "app.services.knowledge.path_configr	   app.services.prompt.generatorr
   r   r   r   r   <module>r      s3    
   & &  5 B >e er   