
    \i8                     H    S r SSKJrJrJr  SSKJr  SSKJr   " S S5      r	g)uI   
Prompt 编译服务

提供自动编译和存储 Prompt 模板的功能
    )DictAnyOptional)CategoryConfig)StagePromptGeneratorc                   \    \ rS rSrSr\S\S\4S j5       r\S\	S\	S\
S	\	S\	4
S
 j5       rSrg)PromptCompilerService   u   Prompt 编译服务categoryreturnc                     U R                  5       =(       d    0 nUR                  SS5      nSSSSS.n0 nU R                  5       nU(       Ga+  UR                  5        GH  u  pgXe;  a  M  XV   nUR                  S/ 5      n	UR                  S	0 5      n
U	(       d  M>  U R                  US
SSSSU
R                  SS5      U
R                  SS5      U
R                  SSS/5      U
R                  SS5      S.n/ nUR                  5        H  u  pUR                  S	0 5      nUR                  SS5      nUR                  SS5      nUR                  S/ 5      nU(       a  SUS    SUS    S3OSnUR                  SU SU SU S U S!3	5        M     S"R                  U5      US#'   / nU	 GH  n0 UEnUR                  S$5      (       Ga^  US$   nSS%Kn[        U5      nUR                  S&SUUR                  S'9nUR                  S(SUUR                  S'9nUR                  S)SU5      nUR                  S"5      n/ nU H-  nUR                  S*U5      (       a  M  UR                  U5        M/     S"R                  U5      nUR                  S+S,U5      nUR                  5       nU[        U5      :w  aL  SS%KnUR                  [         5      nUR#                  S-UR                  S.5       S/U S0[        U5       S135        UR                  S25      (       a  US2   S,-   U-   US2'   OUUS2'   UR                  U5        GM     [$        R&                  " U R(                  UUU(       a  UOS%S39nU(       d  GM  UXG'   GM     GO U R+                  5       n	U	(       d  g4U R-                  5       n UR                  5        GH  u  pgS%n!U  H  n"U"R                  S55      U:X  d  M  U"n!  O   U R                  US
SSSSS6.nU!(       aV  U!R                  SS5      US'   U!R                  SS5      US7'   U!R                  SSS/5      US'   U!R                  SS5      US'   U (       a  / nU  H  n"U"R                  S5S5      n#U"R                  SS5      nU"R                  SS5      nU"R                  S/ 5      nU(       a  SUS    SUS    S3OSnUR                  SU# SU SU S U S!3	5        M     S"R                  U5      US#'   / n$U	 GHc  n0 UEnUR                  S85      (       a  UUS8   ;   a  US8   U   nUR                  S55      (       a  US5   US5'   UR                  S95      b  US9   US9'   UR                  S:5      (       a  US:   US;'   UR                  S5      (       a  US   US'   UR                  S25      (       a  US2   US2'   UR                  S<0 5      n%[/        U%[0        5      (       aj  UU%;   ad  U%U   n&U&(       aX  [/        U&[0        5      (       aC  U&R                  S=S5      nU(       a*  UR                  S25      (       a  US2   S,-   U-   US2'   OUUS2'   U$R                  U5        GMf     [$        R&                  " U R(                  U$UU(       a  UOS%S39nU(       d  GM  UXG'   GM     U R3                  U5        SS>KJn'   U'R8                  R;                  5         SS%KnUR                  [         5      nUR#                  S?U R(                   S@35        gB! [<         aZ  n(SS%KnUR                  [         5      nUR?                  SA[A        U(5       35        U'R8                  RC                  5          S%n(A(g4S%n(A(ff = f! [<         aN  n(SS%KnUR?                  SC[A        U(5       35        SS%K"n)UR?                  U)RG                  5       5         S%n(A(g4S%n(A(ff = f)Duw   编译并保存所有难度的 Prompt 模板

Args:
    category: CategoryConfig 实例
    
Returns:
    是否成功
system_prompt beginnereasymediumhard)u   入门u   简单u   中等u   困难stagesrules{{language}}{{knowledge_points}}	{{scene}}zPHP, Python, Node.js, Go, JavazDASCTF{...}writeup_count   	max_countdepth_rangeg      ?g      $@	diff_rateg333333?)r   
difficultylanguageknowledge_pointssceneavailable_languagesflag_formatr   max_knowledger   r   r   [,    ]z| z | u    个 | u    篇 | z |
difficulty_tablepromptNu-   ^\s*\*\*?阶段\s*\d+\s*末[：:].*?\*\*?\s*$)flagsu#   ^\s*阶段\s*\d+\s*末[：:].*?\s*$u   阶段\s*\d+\s*末[：:][^\n]*u   阶段\s*\d+\s*末z\n{3,}z

u   已清理阶段 idu    的旧格式内容（z -> u
    字符）user_extension)category_idr   contextglobal_rulesFname)r   r   r   r    r!   r"   r#   r$   difficulty_configdescriptionoutput_formatoutputpromptscontent)dbu8   ✅ 已保存编译后的 Prompt 到数据库（方向: u   ）u2   ❌ 保存编译后的 Prompt 到数据库失败: Tu   编译 Prompt 失败: )$get_advanced_configgetget_difficultiesitemsr2   appendjoinrelensub	MULTILINEsplitsearchstriplogging	getLogger__name__infor   compile_full_promptr-   
get_stagesget_difficulty_rules
isinstancedictset_compiled_promptsapp.models.database.modelsr9   sessioncommit	Exceptionerrorstrrollback	traceback
format_exc)*r   advancedr   difficulty_mapcompiled_promptsdifficultiesdifficulty_namedifficulty_keydiff_configr   r   r0   difficulty_table_rows	diff_namediff_cfg
diff_rulesr   r   r   	depth_strprocessed_stagesstage
stage_copyprompt_contentr@   original_lengthlinescleaned_lineslinerG   loggercompiled_promptdifficulty_rulesdifficulty_ruleruler2   merged_stagesr7   prompt_datar9   erX   s*                                             N   /Users/yu22x/Desktop/ddd_副本138/ctf/app/services/prompt/compiler_service.pycompile_and_save_prompts.PromptCompilerService.compile_and_save_prompts   sJ   d	335;H$LL"=M % " 	N  " $446L7E7K7K7M3O&: "."?K(__Xr:F'OOGR8E!  %-MM&5$2,B!,/O'4).?A)F).;)B',yyd'L%*YY{C%@G -/)/;/A/A/C+	%-\\'2%>
$.NN;$B	(2(J&0nn]B&GOZaA'7r+a.9I$K`b	-44r)C	{RYZgYhhopyozz|5}~ 0D 37))<Q2RG./ (*$!'%.Y
 !99X..-28_N &.1..AO .0VV4dfhjx  AC  AM  AMV  .NN-/VV4Z\^`nvx  wC  wCV  .DN-/VV4UWY[i-jN %3$8$8$>E,.M(-')yy1F'M'M$1$8$8$> ). .2YY}-EN .0VVIv~-VN-;-A-A-CN.#n2EE .)0):):8)D &.>uyy>OOefuevvz{~  @N  |O  {P  PZ  -[  !\)~~.>???IJZ?[^d?dgu?u
+; <?M
+; <(//
;U "(Z ';&N&N$,KK/ '6C]	'O ';J(8y 8N~ ",,. #+#@#@#B  8F7K7K7M3O&*O 088F+>.2O! !1 %-MM&5$2,B!,/O'4G '3B3F3FXY3Z03B3F3F{TU3V01@1D1D]UXZ^T_1`./>/B/B;PS/T, (02-$4D#'88FB#7D(,a(@I,0HH_a,HM*.((="*EKS^!KN+;2k!n=MQ(OdfI1882dV3ykQXYfXggnoxnyy{9|} %5 7;ii@U6V 23 %'M!'%.Y
 !99%899nPUViPj>j*/0C*D^*TK*v665@5H
6 2*}=I<G<V
= 9*??7B?7S
8 4*??>I/>Z
? ;*/?@@?JK[?\
+; < #())Ir":%gt44G9S*1/*BK*z+t/L/L1<B1O#1'1~~6F'G'GGQRbGcflGlo}G}
3C(DGU
3C(D%,,Z8; "(@ ';&N&N$,KK, '6C]	'O ';J(8a 8Nf ))*:; 6


!!# **84VW_WbWbVccfgh    **84QRUVWRXQYZ[

##%  	MM23q6(;<MM)..01	s`   I]+ D]+ ."]+ A ]+ J6]+  ]+ 1A\ 
](A]#]+ #]((]+ +
_5A^>>_prompt_templater   vulnerabilitiesr!   c                    U nU(       a  [        U5      OSnUR                  SU5      n[        U[        5      (       a  SR	                  S U 5       5      nOU(       a  [        U5      OSnUR                  SU5      nUc  SnO][        U[
        5      (       a4  UR                  S5      (       a  [        UR                  SS5      5      OSnOU(       a  [        U5      OSnUR                  SU5      nU$ )u  替换 Prompt 模板中的占位符

Args:
    prompt_template: Prompt 模板（包含占位符）
    language: 编程语言
    vulnerabilities: 漏洞类型列表
    scene: 场景（可以是字符串、字典或None）
    
Returns:
    替换后的 Prompt
r   r   r&   c              3   8   #    U  H  n[        U5      v   M     g 7f)N)rV   ).0vs     rv   	<genexpr>=PromptCompilerService.replace_placeholders.<locals>.<genexpr>  s      AAQs   r   r2   r   )rV   replacerN   listr?   rO   r;   )ry   r   rz   r!   r+   language_strvuln_str	scene_strs           rv   replace_placeholders*PromptCompilerService.replace_placeholders   s     ! )1s8}b= ot,,yy A AAH/>s?+BH 6A =It$$6;ii6G6GEIIfb12RI&+E
IY7     N)rI   
__module____qualname____firstlineno____doc__staticmethodr   boolrw   rV   r   r   __static_attributes__r   r   rv   r	   r	      sd    m> md m m^ #c #S #SW #`c #hk # #r   r	   N)
r   typingr   r   r   rQ   r   app.services.prompt.generatorr   r	   r   r   rv   <module>r      s$   
 ' & 5 >W Wr   