
    !YigW                     $   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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g)u9   
AI 配置 API

提供 AI 提供商配置的 CRUD 接口
    )	Blueprintjsonifyrequestg)dbAIProviderConfigAIProviderTypeSystemAIConfig)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     K   /Users/yu22x/Desktop/ddd_副本131/ctf/app/routes/api/user_ai_config_api.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_configr0   %   s    &&)) &557%::< "66w? !,++BHfnnn>d:@$ 6e
 
  	  1v
   	s   BB 
C)CCCz
/user/listc            
      N    [         R                  R                  n [        R                  R                  U 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 配置)r,   Tr   )r   configsFr   r   N)r   r'   r(   r   query	filter_byallr   r+   r   r   )r,   r2   cr   s       r   list_user_configsr7   J   s    &&))"((2272CGGIELMW		d	;WM
  	M 1v
   	s0   AA7 A2
)A7 2A7 7
B$BB$B$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  provider_typeapi_keyu   请选择 AI 提供商  u   请输入 API Keyu
   提供商 u
    未启用modelbase_urlname
is_default)r,   r:   r;   r=   r>   r?   r@   test_statustest_messageTu   AI 配置创建成功r   r   r   r$   u   创建失败: r   N)r
   r)   r   r   get_jsonr   r'   r(   getis_provider_enabledr   create_configrA   rB   r   sessioncommitr+   r   rollbackr   )r&   r,   r:   r;   r$   r   s         r   create_user_configrK   ]   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?   r=   r>   r;   	is_activer@   Tu   配置更新成功r   rC   u   更新失败: r   N)r   r'   r(   r   r3   rE   r,   r   r   rD   r:   r?   r=   r>   set_api_keyrP   set_user_defaultr   rH   rI   r+   r   rJ   r   )	config_idr,   r$   r&   r   s        r   update_user_configrT      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 配置FrN   r   rO   Tu   配置已删除u   删除失败: r   N)r   r'   r(   r   r3   rE   r,   r   r   rH   deleterI   r   rJ   r   )rS   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   FrN   rO   u   设置失败: r   N)r   r'   r(   r   rR   r   r   r   rH   rJ   r   )rS   r,   r   r   s       r   set_user_default_configrZ      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(       a  U(       d  [        SSS.5      S4$ US	;   Ga  US
:X  Ga/  UnUS:X  aF  SSKJn  UR                  [        R                  R                  5      =(       d    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R-                  5       b  OM6  UR/                  U5        MH  UR1                  SS9n[3        UR                  5       U
-
  S-  5      nSR5                  U5      R7                  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R9                  5       ;   a  [        SSS$S.S.5      $ S%UR9                  5       ;   a  [        SSS&S.S.5      $ [        SSS'USS(  3S.S.5      $ US,:X  Ga3  UnUS:X  aF  SS-KJ"n  UR                  [        R                  R                  5      =(       d    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'   X[S/'   S0US'   UR#                  / S1QUR$                  UR&                  SUSS9n/ n  UR(                  R+                  5       nU(       d  UR-                  5       b  OM6  UR/                  U5        MH  UR1                  SS9n[3        UR                  5       U
-
  S-  5      nSR5                  U5      R7                  5       nUS:X  a0  S2U;   a  [        SSS3US.S.5      $ [        SSS4USS!  3US.S.5      $ UnS"U;   d  S#UR9                  5       ;   a  [        SSS$S.S.5      $ S%UR9                  5       ;   a  [        SSS&S.S.5      $ [        SSS'USS(  3S.S.5      $ [        SSS5S.S.5      $ [F        RH                  " UUUUS69nURK                  5       nU R                  S75      nU(       ao  [L        RN                  R                  U5      nU(       aI  URP                  [        R                  R                  :X  a!  URS                  US8   (       a  S8OS9US:   5        [        SUS.5      $ !    GN= f! [:         a    [        SSS)S.S.5      s $ UR<                   a$    WR?                  5         [        SSS*S.S.5      s $ [@         a'  n[        SSS+[C        U5       3S.S.5      s SnA$ SnAff = f!    GNH= f! [:         a    [        SSS)S.S.5      s $ UR<                   a$    WR?                  5         [        SSS*S.S.5      s $ [@         a'  n[        SSS+[C        U5       3S.S.5      s SnA$ SnAff = f! [@         a&  n[        SS+[C        U5       3S.5      S;4s SnA$ SnAff = f)<u   测试 AI 连接r:   r;   r>   r=   Fu#   请提供提供商类型和 API Keyr   r<   )	anyrouteragentrouteraugmentr\   USE_EXISTINGr   )AnyRouterTokenTu.   未配置 AnyRouter Token，请先输入 Token)r   test_resultzsk-u)   Token 格式不正确，应以 sk- 开头N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秒），请检查网络u   测试失败: r]   )AgentRouterTokenu0   未配置 AgentRouter Token，请先输入 TokenANTHROPIC_API_KEYzhttps://agentrouter.org/)rd   re   z"Reply with exactly: AGENTROUTER_OKAGENTROUTER_OKu0   AgentRouter 连接成功！AI 回复验证通过u&   AgentRouter 连接成功！AI 回复: u'   Augment Token 已配置（CLI 模式）)r:   r;   r>   r=   rS   r   failedr   r   )*r   rD   rE   r   app.models.databaser`   get_user_tokenr   r'   r(   get_global_token
startswith
subprocesstimeosenvironcopyPopenPIPESTDOUTrf   readlinepollappendwaitintjoinstriplowerFileNotFoundErrorTimeoutExpiredkillr   r   rt   r   createtest_connectionr   r3   r,   update_test_status)r&   r:   r;   r>   r=   actual_tokenr`   r|   r}   r~   
start_timeri   processoutput_lineslinereturn_codero   output	error_msgr   rt   providerr/   rS   r$   s                            r   r   r     s/   G!1((9%88J'!G @    CC+&n,B#1#@#@#K#p~OnOnOpL#"#'','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,D#3#B#B16699#M#tQaQrQrQtL#"#'','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,(   D ##'#L$    %++'	
 ))+ HH[)	%++//	:F&..AFFII5))!'	!2I9%
 !
  	kj ) "#'','v($   "00 LLN"#'','R($   ! "#'',)7Ax'@($  Dh ) "#'','v($   "00 LLN"#'','R($   ! "#'',)7Ax'@($  V  'Ax0
   	sQ  A6[ 9A3[ -&[ [ !AW 3V= 4W 5V= 
A*W 5W ,W :$W W 6A,[ #&[ 
[ A#Y ;3Y .Y /Y A*Y /Y ,Y 4$Y Y 0[ B;[ =W?W Y [ "0Y[ 	YX?9Y:[ ?Y[ Y	Y [*[ ,0[[ 	['[	[[ 	[[ 
\[<6\<\N)__doc__flaskr   r   r   r   rx   r   r   r	   r
   app.services.auth.decoratorsr   r   app.services.ai.providersr   __name__ai_config_bprouter   r0   r7   rK   rT   rX   rZ   r        r   <module>r      s   1 0 T T G 7h;KL L5'2  3 J0  1F L5'2  3" NVH5@  6@F +eW=+  >+\ +hZ@  A8 7&J  K2 GfX.I  /Ir   