
    -jiTW                     v   S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
  S SKrS SKrS SKrS SKJs  Jr  S SKrS SKJrJrJrJrJr  S SKJrJr  S SK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K%J&r&  S SK'J(r(  SSK)J*r*  SSK+J,r,  SSK-J.r.  SSK/J0r0J1r1  SSK2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<  S r=S r>g)    N)version)commonprefix)Path)is_mlu_availableis_musa_availableis_npu_availableis_sdaa_availableis_xpu_available)	ModelCardModelCardData)TrialTrialPruned)ExperimentalWarning)
TPESampler)StudyDirection)ValidationError)Choice)install   )Analyzer)Settings)	Evaluator)AbliterationParametersModel)
empty_cacheformat_durationget_readme_introget_trial_parametersload_promptsprintprompt_passwordprompt_pathprompt_selectprompt_textc                    ^ ^!^"^#^$^%^& S[         R                  ;  a'  S[         R                  ;  a  S[         R                  S'   [        S[        S5       35        [        S5        [        S5        [        5         [	        [
        R                  5      S:  a[  S	[
        R                  ;  aG  [
        R                  S
   R                  S5      (       d   [
        R                  R                  S
S	5         [        5       m$[        R                  R                  5       (       a-  [        S[        R                  R!                  5        S35        GOh[#        5       (       a-  [        S[        R$                  R!                  5        S35        GO,['        5       (       a,  [        S[        R(                  R!                  5        S35        O[+        5       (       a,  [        S[        R,                  R!                  5        S35        O[/        5       (       a,  [        S[        R0                  R!                  5        S35        O{[3        5       (       a(  [        S[        R                  R4                   S35        OD[        R6                  R8                  R                  5       (       a  [        S5        O[        S5        [        R:                  " S5        S[        R<                  R>                  l         [B        RD                  RG                  5         [H        RD                  RK                  [H        RD                  RL                  5        [N        RP                  " S[R        S 9  [U        T$5      m![        5         [        S!T$RV                  RX                   S"35        [[        T$RV                  5      n[        S#[	        U5       S$35        [        5         [        S%T$R\                  RX                   S"35        [[        T$R\                  5      n[        S#[	        U5       S$35        T$R^                  S:X  GaE  [        5         [        S&5        SnS
nS
nUT$R`                  ::  a  [        S'U S(3S)S*9  U[b        Rd                  " U[	        U5      -  5      -  nUS U n T!Rg                  U5        [h        Rj                  " 5       m%T!Rg                  U5      n[h        Rj                  " 5       nU V	s/ s H'  n	[	        T!Rn                  Rq                  U	5      5      PM)     n
n	[s        U
5      UT%-
  -  n[        S-US. S/35        X:  a  UnUnUS0-  nUT$R`                  ::  a  M  UT$l/        [        S1T$R^                   S35        [        5         [        S25        T!Ru                  US S3 US S3 -   5      n[w        U5      Ry                  S45      T!l=        T!Rz                  R                  S55      (       a  S6T!l=        O'T!Rz                  R                  S75      (       a  S8T!l=        T!Rz                  (       a  [        S9T!Rz                  < S35        O[        S:5        [}        T$T!5      m T$R~                  b`  [        5         [        S;T$R~                   S"35        T$R~                  T$l@        T!R                  5         [        S<5        T R                  5         g [        5         [        S=5        [        S>5        T!R                  U5      n[        S?5        T!R                  U5      n[        R                  " UR                  SS@9UR                  SS@9-
  S0SSA9m#[        T$T!X5      nT$R                  (       a  UR                  5         T$R                  (       a  UR                  5         AAA[        5         Sm&[h        Rj                  " 5       m%SB[        SC[        [        [        4   4U U!U#U$U%U&4SD jjm"SB[        SC[        [        [        4   4U"4SE jjn[H        R                  " [        T$R                  SFSGSH9[        R                  [        R                  /SI9n UR                  UT$R                  SJ9  UR                  (       d  [        e[        UR                  SK SL9nU Vs/ s HV  n[        SMUR                  SN   SO SPUR                  SQ   SR SS[	        T R\                  5       STUR                  SU   SV 3USW9PMX     nnUR                  [        SXS)SW95        [        5         [        SY5        [        5         [        SZ5         [        5         [        S[U5      nUb  US):X  a  g [        5         [        S\UR                  SN    S"35        [        S]5        T!R                  5         [        S^5        T!R                  T#UR                  S_   UR                  S`   5         [        5         [        Sa/ SbQ5      nUb  USc:X  a  GO U=Sd:X  ag    [        Se5      nU(       d  MA  [        Sf5        T!R                  R                  U5        T!Rn                  R                  U5        [        SgU Sh35        GO=Si:X  Ga    [        R                  " 5       nU(       d  [        Sj5      nU(       d  M  [        R                  " U5      nUR                  SkUR                  SlSm5      5      nUR                  SnSo5      n[        SpU SqU Sr35        [        SsUSl    SS[        T$R                  5      R                   St3Su9n[        SvSwSx/5      nUSx:H  n[        Sy5        T!R                  R                  UUUSz9  T!Rn                  R                  UUUSz9  [        T$R                  5      R                  5       (       Gd<  [        R                  " T$R                  5      nUR                  c  [        5       Ulk        UR                  R                  c  / UR                  lm        UR                  R                  R                  S{5        UR                  R                  R                  S|5        UR                  R                  R                  S}5        UR                  R                  R                  S~5        [        T$UT R                  T R\                  5      UR                  -   Ulp        UR                  UUS9  [        SU Sh35        OS:X  a  [        5         [        S5        ST$R                  S./n  [        SSSGS9nU(       d  OFUR                  SUS.5        [        SS)S*9  T!R                  U5      n	UR                  SU	S.5        MY   GM  GMD  ! [         an  n [        SU R                  5        S35        U R                  5        H  n [        SU S   S    SU S    S35        M      [        5         [        S5         S n A g S n A ff = f! [l         a"  n US:X  a  e [        S+U  S,35         S n A GM  S n A ff = fs  sn	f ! [         a     GNf = fs  snf ! [        [        4 a     M  f = f! [l         a  n [        SU  S35         S n A GNS n A ff = f)NPYTORCH_ALLOC_CONFPYTORCH_CUDA_ALLOC_CONFzexpandable_segments:TrueuW   [cyan]█░█░█▀▀░█▀▄░█▀▀░▀█▀░█░█▀▀[/]  vzheretic-llmuT   [cyan]█▀█░█▀▀░█▀▄░█▀▀░░█░░█░█░░[/]u   [cyan]▀░▀░▀▀▀░▀░▀░▀▀▀░░▀░░▀░▀▀▀[/]  [blue underline]https://github.com/p-e-w/heretic[/]r   z--model-z"[red]Configuration contains [bold]z[/] errors:[/]z[bold]locr   z[/]: [yellow]msg[/]zkRun [bold]heretic --help[/] or see [bold]config.default.toml[/] for details about configuration parameters.zGPU type: [bold]zXPU type: [bold]zMLU type: [bold]zSDAA type: [bold]zMUSA type: [bold]zCANN version: [bold]z$GPU type: [bold]Apple Metal (MPS)[/]zN[bold yellow]No GPU or other accelerator detected. Operations will be slow.[/]F@   ignore)categoryz Loading good prompts from [bold][/]...z* [bold]z[/] prompts loadedzLoading bad prompts from [bold]z!Determining optimal batch size...z* Trying batch size [bold]z[/]...  )endz[red]Failed[/] ()z[green]Ok[/] ([bold]z.0fz[/] tokens/s)   z* Chosen batch size: [bold]z&Checking for common response prefix...d    z<think>z<think></think>z<|channel|>analysis<|message|>zR<|channel|>analysis<|message|><|end|><|start|>assistant<|channel|>final<|message|>z* Prefix found: [bold]z* None foundzLoading model [bold]* Evaluating...z+Calculating per-layer refusal directions...z)* Obtaining residuals for good prompts...z(* Obtaining residuals for bad prompts...)dim)pr8   trialreturnc           
        > TS-  mU R                  ST5        U R                  SSS/5      nU R                  SS[        TR	                  5       5      S-
  -  S[        TR	                  5       5      S-
  -  5      nUS:X  a  S n0 nTR                  5        H  nU R                  U S	3S
S5      nU R                  U S3S[        TR	                  5       5      S-
  -  [        TR	                  5       5      S-
  5      nU R                  U S3SS5      nU R                  U S3SS[        TR	                  5       5      S-
  -  5      n[        UUXu-  US9X4'   M     U R                  SU5        U R                  SU5        [        5         [        ST STR                   S35        [        S5        [        U 5      R                  5        H  u  p[        SU	 SU
 S35        M     [        S5        TR                  5         [        S5        TR                  TX#5        [        S5        TR                  5       u  pn[        R                  " 5       T-
  nUT-  TR                  T-
  -  n[        5         [        S[!        U5       S35        TTR                  :  a  [        S [!        U5       S35        U R                  S!U5        U R                  S"U5        U$ )#Nr   indexdirection_scopeglobalz	per layerdirection_indexg?g?z.max_weightg?g      ?z.max_weight_positiong333333?z.min_weightg        g      ?z.min_weight_distance)
max_weightmax_weight_position
min_weightmin_weight_distance
parameterszRunning trial [bold]z[/] of [bold]r0   z* Parameters:z  * z	 = [bold]r,   * Reloading model...* Abliterating...r7   z[grey50]Elapsed time: [bold]z[/][/]z([grey50]Estimated remaining time: [bold]kl_divergencerefusals)set_user_attrsuggest_categoricalsuggest_floatlen
get_layersget_abliterable_componentsr   r    n_trialsr   itemsreload_model
abliterate	get_scoretimeperf_counterr   )r:   r>   r@   rE   	componentrA   rB   rC   rD   namevaluescorerH   rI   elapsed_timeremaining_time	evaluatormodelrefusal_directionssettings
start_timetrial_indexs                   F/home/james-whalen/.local/lib/python3.13/site-packages/heretic/main.py	objectiverun.<locals>.objective   s	   qG[133
  --3u'')*Q./3u'')*Q./
 k)"O
99;I ,,+[)J
 #("5"5+12s5++-.23E$$&'!+# ,,+[)J
 #("5"5+12s5++-.23# %;%$7&3$7	%J!9 <F 	-?L*5";-}X=N=N<OvV	
 	o/6<<>KDDiwc23 ?$%!"+_I )2)<)<)>&h((*Z7&4+
 	,_\-J,K6RS***:?>;Z:[[ab 	O];J1    c                 z   >  T" U 5      $ ! [          a%    U R                  R                  5         [        5       ef = f)N)KeyboardInterruptstudystopr   )r:   rd   s    rc   objective_wrapperrun.<locals>.objective_wrappera  s:    	 U##  	 KK-	 s    /:   T)n_startup_trialsn_ei_candidatesmultivariate)sampler
directions)rP   c                      U R                   S   $ )NrI   )
user_attrs)r:   s    rc   <lambda>run.<locals>.<lambda>  s    %**:6rf   )keyz[Trial r=   z>3z] Refusals: rI   z>2/z, KL divergence: rH   z.4f)titlerY   zNone (exit program)z%[bold green]Optimization finished![/]a  The following trials resulted in Pareto optimal combinations of refusals and KL divergence. After selecting a trial, you will be able to save the model, upload it to Hugging Face, or chat with it to test how well it works. You can return to this menu later to select a different trial. [yellow]Note that KL divergence values above 1 usually indicate significant damage to the original model's capabilities.[/]zWhich trial do you want to use?z!Restoring model from trial [bold]rF   rG   r@   rE   z1What do you want to do with the decensored model?) Save the model to a local folder Upload the model to Hugging FaceChat with the model(Nothing (return to trial selection menu)r}   rz   zPath to the folder:zSaving model...zModel saved to [bold]z[/].r{   zHugging Face access token:fullnamerX   zunknown useremailzno email foundzLogged in as [bold]z (z)[/]zName of repository:z-heretic)defaultz+Should the repository be public or private?PublicPrivatezUploading model...)privatetokenheretic
uncensored
decensoredabliterated)r   zModel uploaded to [bold]r|   z8[cyan]Press Ctrl+C at any time to return to the menu.[/]system)rolecontentzUser:>)qmarkunsafeuserz[bold]Assistant:[/] 	assistantz[red]Error: )tosenvironr    r   rM   sysargv
startswithinsertr   r   error_counterrorstorchcudais_availableget_device_namer
   xpur   mlur	   sdaar   musar   cannbackendsmpsset_grad_enabled_dynamoconfigcache_size_limittransformersloggingset_verbosity_erroroptunaset_verbosityWARNINGwarningsfilterwarningsr   r   good_promptsdatasetr   bad_prompts
batch_sizemax_batch_sizemathceilget_responsesrU   rV   	Exception	tokenizerencodesumget_responses_batchedr   rstripresponse_prefixr   evaluate_modelr^   rR   rT   get_residuals_batchedF	normalizemeanr   print_residual_geometryplot_residualsr   r   tuplefloatcreate_studyr   rn   r   MINIMIZEoptimizerP   rh   best_trialssortedr   rt   appendr#   rS   r"   save_pretrainedhuggingface_hub	get_tokenr!   whoamigetr$   r   rX   push_to_hubexistsr   loaddatar   tagsr   base_refusalstextsystem_promptstream_chat_responseEOFError)'errorr   r   r   best_batch_sizebest_performanceprompts	responsesend_timeresponseresponse_lengthsperformancegood_residualsbad_residualsanalyzerrk   ri   r   r:   choicesactionsave_directoryr   r   r~   r   repo_id
visibilityr   cardchatmessager]   r^   rd   r_   r`   ra   rb   s'                                   @@@@@@@rc   runr   4   s    	BJJ.%RZZ7+E

'( 
cdklydzc{
|}	
`a	 	T 
G 	CHHSXX%'',, 	I&: zz   !;!;!= >cBC			 !:!:!< =SAB			 !:!:!< =SAB			!%**"<"<">!?sCD			!%**"<"<">!?sCD			$U]]%7%7$8<=				(	(	*	*45\	

 
5! -/EMM) ,,. NN  !7!78 H/BC(OE	G	,X-B-B-J-J,K6
RS 5 56L	HS&''9
:;	G	+H,@,@,H,H+I
PQx334K	HS%&&8
9:a12
H333.zl'BK"TYYzC<M/M%NNGkz*G##G,!..0
!//8	,,. GP FO(EOO**845i    ./8j3HIK(S(9GH-",#. !OJC H333F .+H,?,?+@DE	G	
23++L#,>TcAR,RSI )3::3?E ''	22 1				)	)*J	K	K t&u'<'<&?sCDn(E*I*$X%<%<$=VDE!00 	G	
78	
5600>N	
45//<Mq!N$7$7A$7$>>
 %GH''((*! 	xMK""$Ja a5#6 a aF   5+>   %66

 #++^-D-DEE(83D3DE 6K !
 !E 	%**73B7 8"--j9"=Qs9CXCX?Y>Z [""'"2"2?"CC!HJ 	
 !  
 NN'	
 
G	
12	G	J ?I=ERK1%2B2B72K1LFST$%!"./\*	
 G"CF ~+U!U
p1;)45J)K-$/033NC77G 5n5ETJK; !0 9 9 ;$$34P$QE$$.55e<#'88& HHV^<$ !%2B C 3H:RwdKL"-1'+F|nAd8>>6J6O6O5PPX$Y#
 &3I ( )&
 #-	"923//#$+"' 0 
 33#$+"' 4   $HNN3::<<#,>>(..#AD#yy0,9O	#yy~~513		 IINN11)< IINN11,? IINN11,? IINN11-@ 0$,$)$-$;$;$-$9$9	!" #'))!, !I !,,WE,B 8	FG.V
 &.(:P:PQ  #&*5$+*-+/+"
 (/$) $V,P Q %&<" E+0+E+Ed+K $[X,V W # /K % g
  
253D3D3F2G~VW\\^EF5<?+=ucJK $ 	y	
 	
j  ? (q12 J   		"
\ %6x#@ & %&  1UG3/001s   3
u, Aw' .x;x Ax,&y Ay 6y Iy !+y x1  Ax1 #y ,
w$6A$ww$'
x1xx
x)(x)1yy yy 
y,y''y,c                      [        5          [        5         g ! [         aT  n [        U [        5      (       d  [        U R
                  [        5      (       a  [        5         [        S5         S n A g e S n A ff = f)Nz[red]Shutting down...[/])r   r   BaseException
isinstancerh   __context__r    )r   s    rc   mainr   ;  s_    I 
 e.//:04
 4
 G,--
s   
 
A5A	A0/A00A5)?r   r   r   rU   r   importlib.metadatar   os.pathr   pathlibr   r   r   r   torch.nn.functionalnn
functionalr   r   accelerate.utilsr   r   r   r	   r
   r   r   r   r   optuna.exceptionsr   optuna.samplersr   optuna.studyr   pydanticr   questionaryr   rich.tracebackr   r   r   r   r   r]   r   r^   r   r   utilsr   r   r   r   r   r    r!   r"   r#   r$   r   r    rf   rc   <module>r     s|     	 
   &           5 % 1 & ' $  "     0  D1Nrf   