
    [7_i                     x   S r SSKJrJrJrJr  SSKJrJrJ	r	J
r
  SSKJr  SSKJrJr  SSKJr  \" S\SS	9r\R)                  S
S/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  SS/S9\S 5       5       r\R)                  S S/S9\S! 5       5       r\R)                  S S/S9\S" 5       5       r\R)                  S#S/S9\S$ 5       5       r \R)                  S#S/S9\S% 5       5       r!\R)                  S&S/S9\S' 5       5       r"\R)                  S(S/S9\S) 5       5       r#\R)                  S(S/S9\S* 5       5       r$\R)                  S+S/S9\S, 5       5       r%\R)                  S-S/S9\S. 5       5       r&\R)                  S/S/S9\S0 5       5       r'\R)                  S1S/S9\S2 5       5       r(\R)                  S1S/S9\S3 5       5       r)\R)                  S4S/S9\S5 5       5       r*\R)                  S1S/S9\S6 5       5       r+g7)8u9   
AI 配置 API

提供 AI 提供商配置的 CRUD 接口
    )	Blueprintjsonifyrequestg)dbAIProviderConfigAIProviderTypeSystemAIConfig)Role)login_requiredadmin_required)AIProviderFactory	ai_configz/api/ai-config)
url_prefixz
/providersGET)methodsc                       [         R                  " 5       n [        SU S.5      $ ! [         a#  n[        S[	        U5      S.5      S4s SnA$ SnAff = f)u(   获取所有可用的 AI 提供商信息T)success	providersFr   message  N)r
   get_all_provider_infor   	Exceptionstr)r   es     7/Users/yu22x/Desktop/ge/ctf/app/routes/api/ai_config.pyget_providersr      se    
"88:	"
  	  1v
   	s   "% 
AAAAz/currentc                      [         R                  R                  n [        R                  " 5       n[        R
                  " 5       n[        R                  " U 5      nUSLUUU(       a  UR                  SS9OSU(       a  UR                  SL OSS.n[        SUS.5      $ ! [         a#  n[        S[        U5      S.5      S4s SnA$ SnAff = f)	u%   获取当前用户有效的 AI 配置NTinclude_key_previewF)
has_configforce_system_aiallow_custom_aiconfigis_system_config)r   datar   r   )r   useridr
   r#   allow_user_custom_air   get_effective_configto_dictuser_idr   r   r   )r-   force_systemallow_customr%   resultr   s         r   get_current_configr1   &   s    &&)) &557%::< "66w? !,++BHfnnn>d:@$ 6e
 
  	  1v
   	s   BB 
C)CCCz
/user/listc            
      P    [         R                  R                  n [        R                  R                  U SS9R                  5       n[        SU Vs/ s H  o"R                  SS9PM     snS.5      $ s  snf ! [         a#  n[        S[        U5      S.5      S4s SnA$ SnAff = f)	u%   获取当前用户的所有 AI 配置Tr-   	is_activer    r   configsFr   r   N)r   r(   r)   r   query	filter_byallr   r,   r   r   )r-   r6   cr   s       r   list_user_configsr;   K   s    &&))"((227d2SWWYELMW		d	;WM
  	M 1v
   	s0   AA8 A3
*A8 3A8 8
B%B B% B%z/user/availablec                      [         R                  R                  n / n[        R                  " U 5      n[
        R                  " 5       n[
        R                  " 5       n[        [         R                  SS5      nU(       Ga#  U(       Gd  [        R                  R                  U SS9R                  [        R                  R                  5       5      R                  5       nU H  nUR                  UR                  UR                   =(       d    UR"                  UR"                  [$        R&                  " UR"                  5      UR(                  [+        U=(       a    UR                  UR                  :H  5      SS[+        UR                  5      UR,                  S.
5        M     [        R                  R                  SSS9R                  [        R.                  R1                  5       5      R                  5       nU H  nUR                  UR                  UR                   =(       d    UR"                  UR"                  [$        R&                  " UR"                  5      UR(                  [+        U=(       a    UR                  UR                  :H  5      SS[+        U=(       a    XWR                  :H  5      UR,                  S	.
5        M     [3        SUUUS
.5      $ ! [4         a#  n	[3        S[7        U	5      S.5      S4s Sn	A	$ Sn	A	ff = f)u   获取用户可用的 AI 配置列表（用于向导页面选择）

返回用户的个人配置和系统级配置池（如果允许）
preferred_system_ai_config_idNTr3   Fr(   )
r)   nameprovider_typeprovider_namemodel
is_default	is_systemscopeis_user_defaulttest_statussystem)
r)   r>   r?   r@   rA   rB   rC   rD   is_user_chosen_systemrF   )r   r6   r#   r$   r   r   )r   r(   r)   r   r+   r
   r#   r*   getattrr7   r8   order_byrB   descr9   appendr>   r?   r	   get_display_namerA   boolrF   
created_atascr   r   r   )
r-   r0   effective_configr.   r/   preferred_system_iduser_configsr%   system_configsr   s
             r   get_available_configsrU   ^   s   G&&)) ,@@I &557%::< &aff.MtT +11;; <  h'22779:335 
 ' ))"KK?6+?+?%+%9%9%3%D%DVEYEY%Z#\\"&'7'\<L<O<OSYS\S\<\"]!&#'+F,=,='>#)#5#5  '" *//99 : 
 (''++-

#% 	 %FMMii;v';';!'!5!5!/!@!@AUAU!V"#3#X8H8K8Kvyy8XY!!)-.A.fFY]f]fFf)g%11  %  ++	
  	  1v
   	s   KK 
L$L<LLz/user/createPOSTc                      [         R                  " 5       (       d  [        SSS.5      S4$ [        R                  " 5       n [
        R                  R                  nU R                  S5      nU R                  S5      nU(       d  [        SSS.5      S4$ U(       d  [        SS	S.5      S4$ [         R                  " U5      (       d  [        SS
U S3S.5      S4$ [        R                  " UUUU R                  S5      U R                  S5      U R                  S5      U R                  SS5      S9nU R                  S5      (       aJ  U R                  S5      Ul        U R                  S5      Ul        [        R                  R!                  5         [        SSUR#                  SS9S.5      $ ! [$         aD  n[        R                  R'                  5         [        SS[)        U5       3S.5      S4s SnA$ SnAff = f)u   创建用户 AI 配置Fu+   管理员已禁用用户自定义 AI 配置r   i  r?   api_key   请选择 AI 提供商     请输入 API Key
   提供商 
    未启用rA   base_urlr>   rB   r-   r?   rX   rA   r^   r>   rB   rF   test_messageTu   AI 配置创建成功r    r   r   r%      创建失败: r   N)r
   r*   r   r   get_jsonr   r(   r)   getis_provider_enabledr   create_configrF   r`   r   sessioncommitr,   r   rollbackr   )r'   r-   r?   rX   r%   r   s         r   create_user_configrj      s   >2244 H   
 !&&)) 1((9% 3   
  .    11-@@ 'jA    "//'((7#XXj)&!xxe4
 88M""!%-!8F"&((>":FJJ.nnn>
  	  


'Ax0
   	s6   )F- A'F- F- +.F- CF- -
G;79G60G;6G;z/user/<int:config_id>PUTc                 8    [         R                  R                  n[        R                  R                  U 5      nU(       a  UR                  U:w  a  [        SSS.5      S4$ [        R                  " 5       nSU;   a
  US   Ul
        SU;   a
  US   Ul        SU;   a
  US   Ul        SU;   a
  US   Ul        S	U;   a  US	   (       a  UR                  US	   5        S
U;   a
  US
   Ul        SU;   a   US   (       a  [        R                   " X5        ["        R$                  R'                  5         [        SSUR)                  SS9S.5      $ ! [*         aD  n["        R$                  R-                  5         [        SS[/        U5       3S.5      S4s SnA$ SnAff = f)u   更新用户 AI 配置F   配置不存在r     r?   r>   rA   r^   rX   r4   rB   Tu   配置更新成功r    ra      更新失败: r   N)r   r(   r)   r   r7   rd   r-   r   r   rc   r?   r>   rA   r^   set_api_keyr4   set_user_defaultr   rg   rh   r,   r   ri   r   )	config_idr-   r%   r'   r   s        r   update_user_configrs      s   )&&))!''++I672 ,   
 ! d"#'#8F T>v,FKd?=FL":.FOitI/$#K0F4D$6--gA


+nnn>
  	  


'Ax0
   	s%   AE "C(E 
F9FFFDELETEc                     [         R                  R                  n[        R                  R                  U 5      nU(       a  UR                  U:w  a  [        SSS.5      S4$ [        R                  R                  U5        [        R                  R                  5         [        SSS.5      $ ! [         aD  n[        R                  R                  5         [        SS[        U5       3S.5      S4s S	nA$ S	nAff = f)
u   删除用户 AI 配置Frm   r   rn   Tu   配置已删除   删除失败: r   N)r   r(   r)   r   r7   rd   r-   r   r   rg   deleterh   r   ri   r   )rr   r-   r%   r   s       r   delete_user_configrx   $  s    &&))!''++I672 ,   
 	

&!


(
  	
  


'Ax0
   	s%   AB- "A
B- -
C;79C60C;6C;z!/user/<int:config_id>/set-defaultc                 P    [         R                  R                  n[        R                  " X5      nU(       a  [        SSS.5      $ [        SSS.5      S4$ ! [         aD  n[        R                  R                  5         [        SS[        U5       3S.5      S4s S	nA$ S	nAff = f)
u   设置用户默认 AI 配置Tu   已设为默认配置r   Frm   rn      设置失败: r   N)r   r(   r)   r   rq   r   r   r   rg   ri   r   )rr   r-   r   r   s       r   set_user_default_configr{   B  s    &&))"33GG2  
  ,   
  


'Ax0
   	s$   AA A 
B%!9B B% B%z/testc            	      ~    [         R                  " 5       n U R                  S5      nU R                  S5      nU R                  S5      nU R                  S5      nU(       d  [        SSS.5      S4$ US	;  a  U(       d  [        SS
S.5      S4$ US;   Ga  US:X  Gay  UnUS:X  a  [        R
                  " [        R                  R                  SS9nU(       a  UR                  5       nU(       dE  [        R                  R                  SSSSS9R                  5       nU(       a  UR                  5       nU(       d  [        SSSS.S.5      $ UR                  S5      (       d  [        SSSS.S.5      $ SSKnSSKn	SSKn
 U	R                  5       nU
R"                  R%                  5       nX\S'   SUS'   UR'                  / SQUR(                  UR*                  SUSS9n/ n  UR,                  R/                  5       nU(       d  UR1                  5       b  OM6  UR3                  U5        MH  UR5                  SS9n[7        U	R                  5       U-
  S-  5      nSR9                  U5      R;                  5       nUS:X  a0  S U;   a  [        SSS!US".S.5      $ [        SSS#USS$  3US".S.5      $ UnS%U;   d  S&UR=                  5       ;   a  [        SSS'S.S.5      $ S(UR=                  5       ;   a  [        SSS)S.S.5      $ [        SSS*USS+  3S.S.5      $ US/:X  Ga}  UnUS:X  a  [        R
                  " [        R                  R                  S/S9nU(       a  UR                  5       nU(       dE  [        R                  R                  SS/SSS9R                  5       nU(       a  UR                  5       nU(       d  [        SSS0S.S.5      $ UR                  S5      (       d  [        SSSS.S.5      $ SSKnSSKn	SSKn
 U	R                  5       nU
R"                  R%                  5       nX\S'   X\S1'   S2US'   UR'                  / S3QUR(                  UR*                  SUSS9n/ n  UR,                  R/                  5       nU(       d  UR1                  5       b  OM6  UR3                  U5        MH  UR5                  SS9n[7        U	R                  5       U-
  S-  5      nSR9                  U5      R;                  5       nUS:X  a0  S4U;   a  [        SSS5US".S.5      $ [        SSS6USS$  3US".S.5      $ UnS%U;   d  S&UR=                  5       ;   a  [        SSS'S.S.5      $ S(UR=                  5       ;   a  [        SSS)S.S.5      $ [        SSS*USS+  3S.S.5      $ SS7S.nU R                  S85      nU(       a  [        R                  R                  U5      nU(       a  SnURH                  [        R                  R                  :X  a  SnO`URH                  cS  [        R                  (       a>  [        R                  RJ                  [L        RN                  [L        RP                  4;   a  SnU(       a3  URS                  S9US:   5        [T        RV                  RY                  5         [        SUS.5      $ [Z        R\                  " UUUUS;9nUR_                  5       nU R                  S85      nU(       a  [        R                  R                  U5      nU(       a  SnURH                  [        R                  R                  :X  a  SnO`URH                  cS  [        R                  (       a>  [        R                  RJ                  [L        RN                  [L        RP                  4;   a  SnU(       a?  URS                  US9   (       a  S9OS<US:   5        [T        RV                  RY                  5         [        SUS.5      $ !    GN= f! [>         a    [        SSS,S.S.5      s $ UR@                   a$    WRC                  5         [        SSS-S.S.5      s $ [D         a'  n[        SSS.[G        U5       3S.S.5      s SnA$ SnAff = f!    GN= f! [>         a    [        SSS,S.S.5      s $ UR@                   a$    WRC                  5         [        SSS-S.S.5      s $ [D         a'  n[        SSS.[G        U5       3S.S.5      s SnA$ SnAff = f! [D         a&  n[        SS.[G        U5       3S.5      S=4s SnA$ SnAff = f)>u   测试 AI 连接r?   rX   r^   rA   Fu   请提供提供商类型r   rZ   )augmentu   请提供 API Key)	anyrouteragentrouterr}   r~   USE_EXISTINGr-   r?   NT)r-   r?   r4   rB   u.   未配置 AnyRouter Token，请先输入 Tokenr   test_resultzsk-u)   Token 格式不正确，应以 sk- 开头r   ANTHROPIC_AUTH_TOKENzhttps://anyrouter.topANTHROPIC_BASE_URL)claude-pz Reply with exactly: ANYROUTER_OK)stdoutstderrtextenvbufsize<   )timeouti   ANYROUTER_OKu.   AnyRouter 连接成功！AI 回复验证通过)r   r   latencyu$   AnyRouter 连接成功！AI 回复: d   zInvalid API Keyauthenticationu   Token 无效或已过期offlineu$   网络连接失败，请检查网络u   CLI 执行失败:    uM   Claude CLI 未安装，请先运行: npm install -g @anthropic-ai/claude-codeu)   连接超时（60秒），请检查网络   测试失败: r   u0   未配置 AgentRouter Token，请先输入 TokenANTHROPIC_API_KEYzhttps://agentrouter.org/)r   r   z"Reply with exactly: AGENTROUTER_OKAGENTROUTER_OKu0   AgentRouter 连接成功！AI 回复验证通过u&   AgentRouter 连接成功！AI 回复: u'   Augment Token 已配置（CLI 模式）rr   r   r   r?   rX   r^   rA   failedr   )0r   rc   rd   r   r   get_user_configr   r(   r)   get_api_keyr7   r8   first
startswith
subprocesstimeosenvironcopyPopenPIPESTDOUTr   readlinepollrL   waitintjoinstriplowerFileNotFoundErrorTimeoutExpiredkillr   r   r-   roler   ADMIN	MODERATORupdate_test_statusr   rg   rh   r   createtest_connection)r'   r?   rX   r^   rA   actual_tokenr%   global_configr   r   r   
start_timer   processoutput_lineslinereturn_coder   output	error_msgr   r0   rr   
can_updateproviders                            r   r   r   ]  s
   F!1((9%88J'! 5    +G .    CC+&n,-== !		&1F '-'9'9';'(8(>(>(H(H$(*5&*'+	 )I )
  %' & )+8+D+D+FL#"#'','W($   $..u55"#'','R($   "j!%J **//+C2>./0GC,- )..L))00! ! / G $&L	"#*>>#:#:#<D#'#*<<>#=$) ((//5 # #*,,r,":K!499;#;t"CDGWW\288:F"a')V3#*+//3/_/60", $  $++//31UV\]a^aVbUc/d/60", $  %+	,	9=MQZQ`Q`Qb=b#*+//4/I0", $  ')//*;;#*+//4/U0", $   ''++0-?	$3?P+Q,(   B -/&n,-== !		&3F '-'9'9';'(8(>(>(H(H$(*7&*'+	 )I )
  %' & )+8+D+D+FL#"#'','Y($   $..u55"#'','R($   "j!%J **//+C2>.//;+,0JC,- )..N))00! ! / G $&L	"#*>>#:#:#<D#'#*<<>#=$) ((//5 # #*,,r,":K!499;#;t"CDGWW\288:F"a'+v5#*+//3/a/60", $  $++//31WX^_c`cXdWe/f/60", $  %+	,	9=MQZQ`Q`Qb=b#*+//4/I0", $  ')//*;;#*+//4/U0", $   ''++0-?	$3?P+Q,(   F  $H !HH[1	-3377	BF &+
!>>QVVYY6)-J#^^3166;;SWS]S]_c_m_mRnCn)-J%"55i	ARSJJ--/##)    %++'	
 ))+ HH[)	%++//	:F #
>>QVVYY.!%J^^+166;;4::W[WeWeJf;f!%J--%+I%6	Hy) JJ%%'!
  	j ) "#'','v($   "00 LLN"#'','R($   ! "#'',)7Ax'@($  ^h ) "#'','v($   "00 LLN"#'','R($   ! "#'',)7Ax'@($  P  'Ax0
   	sX  A/d 2d B=d &d 4d A`  !3_8 `  _8 *A*`  `  -,`  $`  ?`  B6d &d 4d A#b
 %3b b
 b .A*b
 b
 1,b
 $b
 b
 Dd 2Ed 8_=:`   a?d 0a?d 	a?a:4a?5d :a??d bb
 
d	%d '0d	d 	d	"d>d	?d d		d 
d<d71d<7d<z/admin/system/configsc            
          [         R                  R                  SSS9R                  [         R                  R                  5       [         R                  R                  5       5      R                  5       n [        SU  Vs/ s H  oR                  SS9PM     snS.5      $ s  snf ! [         a#  n[        S[        U5      S.5      S4s SnA$ SnAff = f)	u%   获取所有系统级 AI 配置列表NTr3   r    r5   Fr   r   )r   r7   r8   rJ   rB   rK   rO   rP   r9   r   r,   r   r   )r6   r:   r   s      r   list_system_ai_configsr     s    "((22 3 
 ('',,.''++-
 #% 	 ELMW		d	;WM
  	M 1v
   	s0   A>B&  B!
B& !B& &
C0CCCc            
          [         R                  " 5       =(       d    0 n U R                  S5      nU R                  S5      nU(       d  [        SSS.5      S4$ U(       d  [        SSS.5      S4$ [        R
                  " U5      (       d  [        SSU S	3S.5      S4$ [        U R                  S
S5      5      n[        R                  " SUUU R                  S5      U R                  S5      U R                  S5      US9n[        SSUR                  SS9S.5      $ ! [         aD  n[        R                  R                  5         [        SS[        U5       3S.5      S4s SnA$ SnAff = f)u/   创建系统级 AI 配置（user_id 为 None）r?   rX   FrY   r   rZ   r[   r\   r]   rB   NrA   r^   r>   r_   Tu   系统 AI 配置创建成功r    ra   rb   r   )r   rc   rd   r   r
   re   rN   r   rf   r,   r   r   rg   ri   r   )r'   r?   rX   rB   r%   r   s         r   create_system_ai_configr     s   /!'R1((9% 3   
  .    11-@@ 'jA   
 $((<78
!//'((7#XXj)&!!
 5nnn>
  	
  


'Ax0
   	s1   AD D 0.D A=D 
E+'9E& E+&E+z%/admin/system/configs/<int:config_id>c                      [         R                  R                  U 5      nU(       a  UR                  b  [	        SSS.5      S4$ [
        R                  " 5       =(       d    0 nSU;   a:  US   n[        R                  " U5      (       d  [	        SSU S3S.5      S	4$ X1l	        S
U;   a1  US
   =(       d     [        R                  " UR                  5      Ul        SU;   a
  US   Ul        SU;   a1  US   =(       d     [        R                  " UR                  5      Ul        SU;   a  US   (       a  UR!                  US   5        SU;   a  [#        US   5      Ul        SU;   a!  US   (       a  [         R&                  " SU 5        [(        R*                  R-                  5         [	        SSUR/                  SS9S.5      $ ! [0         aD  n[(        R*                  R3                  5         [	        SS[5        U5       3S.5      S4s SnA$ SnAff = f)u   更新系统级 AI 配置NF   系统 AI 配置不存在r   rn   r?   r\   r]   rZ   r>   rA   r^   rX   r4   rB   Tu   系统 AI 配置更新成功r    ra   ro   r   )r   r7   rd   r-   r   r   rc   r
   re   r?   r	   rM   r>   rA   get_default_base_urlr^   rp   rN   r4   rq   r   rg   rh   r,   r   ri   r   )rr   r%   r'   r?   r   s        r   update_system_ai_configr   >  s   /!''++I63 6   
 !'Rd" 1M!55mDD$!+M?*E     $1 T>v,_.*I*I&J^J^*_FKd?=FL":.k.2U2UV\VjVj2kFOitI/$#D$56F 4D$6--dI>


5nnn>
  	
  


'Ax0
   	s,   AF? AF? D!F? ?
H	9HHHc                     [         R                  R                  U 5      nU(       a  UR                  b  [	        SSS.5      S4$ [
        R                  R                  U5        [
        R                  R                  5         [	        SSS.5      $ ! [         aD  n[
        R                  R                  5         [	        SS[        U5       3S.5      S	4s SnA$ SnAff = f)
u   删除系统级 AI 配置NFr   r   rn   Tu   系统 AI 配置已删除rv   r   )r   r7   rd   r-   r   r   rg   rw   rh   r   ri   r   )rr   r%   r   s      r   delete_system_ai_configr   t  s    !''++I63 6   
 	

&!


2
  	  


'Ax0
   	s%   AB A
B 
C9CCCz1/admin/system/configs/<int:config_id>/set-defaultc                     [         R                  R                  U 5      nU(       a  UR                  b  [	        SSS.5      S4$ [         R
                  " SU 5      nU(       d  [	        SSS.5      S4$ [	        SS	S.5      $ ! [         aD  n[        R                  R                  5         [	        SS
[        U5       3S.5      S4s SnA$ SnAff = f)uI   设置系统默认 AI 配置（在系统配置池中选一个为默认）NFr   r   rn   u   设置默认配置失败rZ   Tu   已设为系统默认 AI 配置rz   r   )r   r7   rd   r-   r   rq   r   r   rg   ri   r   )rr   r%   r   r   s       r   set_system_default_ai_configr     s    !''++I63 6   
 #33D)D 5   
 8
  	  


'Ax0
   	s*   AB -B 3B 
C9C
C
Cz/admin/systemc                  ~    [         R                  " 5       n [        R                  " 5       [        R                  " 5       [        R
                  " 5       S.n[        SU (       a  U R                  SS9OSU[        R                  " 5       S.5      $ ! [         a#  n[        S[        U5      S.5      S4s SnA$ SnAff = f)	u   获取系统 AI 配置)enabled_providersr*   r#   Tr    N)r   system_configsettingsall_providersFr   r   )r   get_system_defaultr
   get_enabled_providersr*   r#   r   r,   r   r   r   )r   r   r   s      r   get_system_configr     s    (;;= "0!E!E!G$2$G$G$I-==?
 P]]22t2Lcg +AAC	
  	  1v
   	s   BB 
B<B71B<7B<c                  @    [         R                  " 5       n SU ;   Ga(  U S   nUR                  S5      nUR                  S5      nU(       a  U(       a  [        R                  R                  SSS9R                  5       nU(       ax  X$l        UR                  U5        UR                  S5      Ul	        UR                  S5      =(       d    [        R                  " U5      Ul        UR                  S	S
5      Ul        OH[        R                  " SUUUR                  S5      UR                  S5      UR                  S	S
5      SS9nSU ;   a  [        R                   " U S   5        SU ;   a  [        R"                  " U S   5        SU ;   a  [        R$                  " U S   5        [&        R(                  R+                  5         [-        SSS.5      $ ! [.         aD  n[&        R(                  R1                  5         [-        SS[3        U5       3S.5      S4s SnA$ SnAff = f)u   更新系统 AI 配置
default_air?   rX   NT)r-   rB   rA   r^   r>   u   系统默认r_   r   r*   r#   u   系统配置更新成功r   Fro   r   )r   rc   rd   r   r7   r8   r   r?   rp   rA   r	   r   r^   r>   rf   r
   set_enabled_providersset_allow_user_custom_aiset_force_system_air   rg   rh   r   r   ri   r   )r'   ai_datar?   rX   r   r   s         r   update_system_configr     s   :! 4<(G#KK8Mkk),G 0 6 6 @ @ # !A ! %' 
 !2?/!--g6*1++g*>M'-4[[-D-zHkHklyHzM*)0V^)LM& %5$B$B $&3 '%kk'2!(Z!8$[[@#'%M $&006I1JK "T)33D9O4PQ$..t4E/FG


1
  	
  


'Ax0
   	s   GG 
H9HHHz/system/listc                      [         R                  R                  n [        R                  " U 5      n[        [         R                  SS5      n[        R                  R                  SSS9R                  [        R                  R                  5       [        R                  R                  5       5      R                  5       n/ nU H  nUR                  UR                  UR                  =(       d    UR                   UR                   ["        R$                  " UR                   5      UR&                  UR(                  UR*                  [-        U=(       a    UR                  UR                  :H  5      [-        UR                  5      [-        U=(       a    X%R                  :H  5      UR.                  UR0                  S.5        M     [3        SUS.5      $ ! [4         a#  n[3        S[7        U5      S.5      S	4s SnA$ SnAff = f)
u   获取系统级 AI 配置池（普通用户视角）

不返回完整 API Key，只返回必要的展示字段和测试状态。
r=   NTr3   )r)   r>   r?   r@   rA   r^   r4   is_default_for_useris_system_global_defaultrH   rF   r`   r5   Fr   r   )r   r(   r)   r   r+   rI   r7   r8   rJ   rB   rK   rO   rP   r9   rL   r>   r?   r	   rM   rA   r^   r4   rN   rF   r`   r   r   r   )r-   rQ   rR   rT   r6   r%   r   s          r   list_system_ai_for_userr     s   -&&)) ,@@I &aff.MtT)//99 : 
 ('',,.''++-
 #% 	 $FNNii;v';';!'!5!5!/!@!@AUAU!V"OO#--'+,<,aAQATATX^XaXaAa'b,01B1B,C)-.A.fFY]f]fFf)g%11 & 3 3  %& 
  	  1v
   	s   GG 
H G;5H ;H z/system/choicec                      [         R                  n [        R                  " 5       =(       d    0 nUR	                  S5      nU(       d3  SU l        [        R                  R                  5         [        SSS.5      $ [        R                  R	                  U5      nU(       a  UR                  c  UR                  (       d  [        SSS.5      S4$ UR                  U l        [        R                  R                  5         [        SS	S.5      $ ! [         aD  n[        R                  R!                  5         [        SS
[#        U5       3S.5      S4s SnA$ SnAff = f)u   设置当前用户在系统 AI 池中的首选配置

body: { "config_id": int | null }
- 如果为 null 或未传，表示清除用户的系统 AI 选择（回到系统默认逻辑）
- 否则必须是 user_id 为 None 且 is_active=True 的配置
rr   NTu   已清除系统 AI 选择r   Fu   无效的系统 AI 配置rZ   u   系统 AI 选择已更新ro   r   )r   r(   r   rc   rd   r=   r   rg   rh   r   r   r7   r-   r4   r)   r   ri   r   )r(   r'   rr   r%   r   s        r   set_user_system_ai_choicer   L  s9   "vv!'RHH[)	 15D.JJ6   "''++I636;K;K 6   
 .4YY*


2
  	  


'Ax0
   	s+   A8D ;AD <D 
E9EEEz/admin/system/testc                      [         R                  " 5       n U R                  S5      nU R                  S5      nU R                  S5      nU R                  S5      nU(       a  U(       d  [        SSS.5      S4$ [        R
                  " UUUUS	9nUR                  5       n[        S
US.5      $ ! [         a&  n[        SS[        U5       3S.5      S4s SnA$ SnAff = f)u   测试系统 AI 连接r?   rX   r^   rA   Fu#   请提供提供商类型和 API Keyr   rZ   r   Tr   r   r   N)	r   rc   rd   r   r   r   r   r   r   )r'   r?   rX   r^   rA   r   r0   r   s           r   test_system_connectionr   z  s    "!1((9%88J'!G @    %++'	
 ))+!
  	
  'Ax0
   	s$   A6B. 94B. .
C8CCCz/augment/tokenc                      [         R                  R                  n [        R                  R                  U SSS9R                  5       nU(       a  UR                  (       a  UR                  OSnU(       a  UR                  5       nU(       a  UR                  5       (       ak  UR                  5       n[        U5      S:  a  USS  SUS	S  3nOS
n[        SSUUUR                  (       a  UR                  R                  5       OSS.5      $ [        SSUS.5      $ ! [         a#  n[        S[        U5      S.5      S4s SnA$ SnAff = f)u3   获取用户的 Augment Token 状态和模型配置r}   Tr-   r?   r4   augment-cli   N
   z...iu	   已配置)r   	has_tokenpreviewrA   
updated_atF)r   r   rA   r   r   )r   r(   r)   r   r7   r8   r   rA   r   r   lenr   r   	isoformatr   r   )r-   augment_configrA   rX   	token_strr   r   s          r   get_augment_tokenr     sH   (&&)) *//99# : 
 %'	 	 )7>;O;O$$Ub$002G7==??#MMO	y>B&!*3B 0IcdO3DEG)G#!%&"KYKdKd.";";"E"E"Gjn    
  	  1v
   	s$   D
D D 
E	&E>E	E	c                     SSK n  [        R                  R                  n[        R
                  " 5       nU(       a  SU;  a  [        SSS.5      S4$ US   R                  5       nU(       d  [        SSS.5      S4$  U R                  U5        [        R                  R                  [        R                  U:H  5      R                  S	S05        [        R                  R                  US
S9R!                  5       nUR#                  SS5      nU(       a?  UR%                  U5        SUl        SUl        XTl        [,        R/                  5       Ul        Oe[        US
USSSS[,        R/                  5       [,        R/                  5       S9	nUR%                  U5        [2        R4                  R7                  U5         SSKJn  U" U5      nUS   (       a  UR=                  SS5        OUR=                  SUS   5         [2        R4                  RC                  5         [        SSS.5      $ ! U R                   a    [        SSS.5      S4s $ f = f! [>         a(  nUR=                  SS[A        U5       35         SnANSnAff = f! [>         aD  n[2        R4                  RE                  5         [        SS[A        U5       3S.5      S4s SnA$ SnAff = f)u3   保存用户的 Augment Token 并设置为默认 AIr   NtokenF   Token 不能为空r   rZ   u/   Token 格式错误，请确保是有效的 JSONrB   r}   r   rA   r   Tr   zAugment CLI)	r-   r?   rA   r^   r4   rB   r>   rO   r   validate_augment_tokenvalidr   u   Token验证成功r   r   pendingu(   Token保存成功，但验证时出错: u3   Token 保存成功，已设置 Augment 为默认 AIu   保存失败: r   )#jsonr   r(   r)   r   rc   r   r   loadsJSONDecodeErrorr   r7   filterr-   updater8   r   rd   rp   r4   rB   rA   datetimeutcnowr   r   rg   add&app.services.ai.helpers.augment_helperr   r   r   r   rh   ri   )	r   r-   r'   r   r   rA   r   token_resultr   s	            r   save_augment_tokenr    s    O&&))!wd*u9MNOQTTTM'')	u9MNOQTTT	rJJy!
 	%%$$/	

&,&
' *//99# : 
 %' 	 -0&&y1'+N$(,N%#( (0(9N% .'"#??,#??,
N &&y1JJNN>*		nU1)<LG$11)=PQ11(L<ST
 	

L
  	m ## 	ru9jklnqqq	r`  	n--i;cdghidjck9lmm	n  


'Ax0
   	s   AJ )J =H& D*J 9*I #J $I 9,J & I	J I		J 
I>I94J 9I>>J 
K9K
K
Kz/augment/token/validatec                     SSK Jn    [        R                  " 5       nU(       a  SU;  a  [	        SSS.5      S4$ US   R                  5       nU(       d  [	        SSS.5      S4$ U " U5      n[        R                  R                  n[        R                  R                  USS	9R                  5       nU(       aS  US
   (       a  UR                  SUS   5        OUR                  SUS   5        [        R                  R!                  5         [	        US
   US   UR#                  S5      S.5      $ ! [$         a&  n[	        SS['        U5       3S.5      S4s SnA$ SnAff = f)u!   验证 Augment Token 是否有效r   r   r   Fr   r   rZ   r}   r   r   r   r   r   
token_info)r   r   r  u   验证失败: r   N)r  r   r   rc   r   r   r   r(   r)   r   r7   r8   r   r   r   rg   rh   rd   r   r   )r   r'   r   r0   r-   r   r   s          r   validate_augment_token_apir  .  sb    N&!wd*u9MNOQTTTM'')	u9MNOQTTT (	2 &&)))//99# : 
 %' 	
 g11)VI=NO11(F9<MNJJgi( **\2
  	  'Ax0
   	s)   1D0 )D0 $CD0 0
E :EE E c                      [         R                  R                  n [        R                  R                  U SSS9R                  5       nU(       aD  UR                  S5        SUl        [        R                  R                  5         [        SSS.5      $ [        SSS.5      S	4$ ! [         aD  n[        R                  R                  5         [        SS
[        U5       3S.5      S4s SnA$ SnAff = f)u   删除用户的 Augment Tokenr}   Tr   r   Fu   Token 已删除r   u   Token 不存在rn   rv   r   N)r   r(   r)   r   r7   r8   r   rp   r4   r   rg   rh   r   r   ri   r   )r-   r%   r   s      r   delete_augment_tokenr  ]  s    &&)) "''11# 2 
 %'	 	 r"$FJJ,  
  ,   
  


'Ax0
   	s$   BB$ B$ $
C2.9C-'C2-C2N),__doc__flaskr   r   r   r   app.models.databaser   r   r	   r
   app.models.database.userr   app.services.auth.decoratorsr   r   app.services.ai.providersr   __name__ai_config_bprouter   r1   r;   rU   rj   rs   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r       r   <module>r     s   1 0 T T ) G 7h;KL L5'2  3 J0  1F L5'2  3" %w7L  8L^ NVH5@  6@F +eW=+  >+\ +hZ@  A8 7&J  K2 GfX.H  /Hb +eW=  >, +fX>1  ?1h ;eWM1  N1h ;hZP  Q2 GRXQYZ  [B OeW5  66 OfX6<  7<H NUG42  52j $vh7)  8)X (6(;$  <$V $ug6*  7*Z $vh7S  8Sl -x@*  A*Z $xj9  :r  