
    lC_iچ                         S r SSKJr  SSKJrJr  SSKJr  SSKr " S S5      r " S	 S
\R                  5      r
 " S S5      r " S S5      r " S S5      r " S S5      rg)uy   
AI 提供商配置模型

支持多种 AI 提供商：OpenAI、DeepSeek、Claude、通义千问、智谱GLM、自定义
    )datetime   )dbget_beijing_nowUserNc                       \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSr/ SQr/ SQr\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rSrg)AIProviderType   u   AI 提供商类型openaideepseekclaudeqwenzhipugroqtogether
openroutergeminimistralsiliconflow	anyrouteragentrouteraugmentcustomcustom_openaicustom_anthropic)r   r   r   )r   r   r   c                     [         R                  [         R                  [         R                  [         R                  [         R
                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  [         R                   [         R"                  /$ )u   获取所有提供商类型)r
   OPENAIDEEPSEEKCLAUDEQWENZHIPUGROQTOGETHER
OPENROUTERGEMINIMISTRALSILICONFLOW	ANYROUTERAGENTROUTERAUGMENTCUSTOMCUSTOM_OPENAICUSTOM_ANTHROPIC     >/Users/yu22x/Desktop/ge/ctf/app/models/database/ai_provider.pyget_allAIProviderType.get_all)   s     !!##!!  ##%%!!""&&$$&&""!!((++#
 	
r0   c                      [         R                  5        V s/ s H  o [         R                  ;  d  M  U PM     sn $ s  sn f )u   获取仅支持 API 的提供商（排除 CLI 模式提供商）

CLI 模式提供商（AnyRouter、AgentRouter、Augment）使用独立的配置界面，
不应出现在"自定义 API"的提供商下拉列表中。
)r
   r2   CLI_PROVIDERS)ps    r1   get_api_providers AIProviderType.get_api_providers@   s2     *113]3a@\@\7\3]]]s   ;;c                 j   0 [         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R
                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S	_[         R                  S
_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                   S_[         R"                  S_nUR%                  X 5      $ )u   获取提供商显示名称OpenAIDeepSeekzClaude (Anthropic)u   通义千问u	   智谱GLMu   Groq (免费高速)zTogether AI
OpenRouterzGoogle Geminiz
Mistral AIu   SiliconFlow (硅基流动)	AnyRouterAgentRouterzAugment CLIu	   自定义u   自定义 (OpenAI 兼容)u   自定义 (Anthropic 兼容)r
   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   get)provider_typenamess     r1   get_display_nameAIProviderType.get_display_nameI   sM   
!!8
##Z
 !!#7
 	

   +
 !6
 ##]
 %%|
 !!?
 ""L
 &&(D
 $$k
 &&
 ""M
 !!;
  ((*E!
" ++-K#
& yy66r0   c                 l   0 [         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R
                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S	_[         R                  S
_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                  S_[         R                   S_[         R"                  S_nUR%                  U S5      $ )u   获取提供商默认 Base URLzhttps://api.openai.com/v1zhttps://api.deepseek.com/v1zhttps://api.anthropic.com/v1z1https://dashscope.aliyuncs.com/compatible-mode/v1z$https://open.bigmodel.cn/api/paas/v4zhttps://api.groq.com/openai/v1zhttps://api.together.xyz/v1zhttps://openrouter.ai/api/v1z7https://generativelanguage.googleapis.com/v1beta/openaizhttps://api.mistral.ai/v1zhttps://api.siliconflow.cn/v1zhttps://anyrouter.top/v1https://agentrouter.org/ r?   )rA   urlss     r1   get_default_base_url#AIProviderType.get_default_base_urla   sW   
!!#>
##%B
 !!#A
 !T	

   "H
 !A
 ##%B
 %%'E
 !!#\
 ""$?
 &&(G
 $$&@
 &&(B
 ""B
 !!2
  (("!
" ++R#
& xxr**r0   c                    0 [         R                  / SQ_[         R                  / SQ_[         R                  / SQ_[         R                  / SQ_[         R
                  / SQ_[         R                  / SQ_[         R                  / SQ_[         R                  / SQ_[         R                  / S	Q_[         R                  / S
Q_[         R                  / SQ_[         R                  / SQ_[         R                  / SQ_[         R                  S/_[         R                  / _[         R                   / _[         R"                  / _nUR%                  U / 5      $ )u!   获取提供商默认模型列表)zgpt-5z
gpt-5-minizgpt-5.1zgpt-5.1-minizgpt-5.1-nanozgpt-4.1zgpt-4.1-minizgpt-4.1-nanogpt-4ogpt-4o-minio3zo3-minizo4-minio1zo1-minizo1-progpt-4-turbozgpt-4gpt-3.5-turbo)deepseek-chatzdeepseek-reasonerdeepseek-coder)
zclaude-opus-4.5zclaude-opus-4claude-sonnet-4claude-sonnet-4-5-20250514claude-3-5-sonnet-20241022zclaude-3-5-sonnet-20240620claude-3-5-haiku-20241022zclaude-3-opus-20240229zclaude-3-sonnet-20240229zclaude-3-haiku-20240307)z	qwen3-maxz
qwen3-pluszqwen3-turbozqwen2.5-maxzqwen2.5-pluszqwen2.5-turbozqwen-maxzqwen-max-latestz	qwen-pluszqwen-plus-latestz
qwen-turbozqwen-turbo-latestz	qwen-longzqwen-coder-plus)zglm-4.6zglm-4.5vz
glm-4-plusz
glm-4-longzglm-4zglm-4-flashz	glm-4-airz
glm-4-airxzglm-4-9bzglm-4vzglm-4v-plusz
codegeex-4)zllama-3.3-70b-versatilezllama-3.1-70b-versatilezllama-3.1-8b-instantzllama3-70b-8192zllama3-8b-8192zmixtral-8x7b-32768zgemma2-9b-it)z'meta-llama/Llama-3.3-70B-Instruct-Turboz,meta-llama/Meta-Llama-3.1-70B-Instruct-Turboz+meta-llama/Meta-Llama-3.1-8B-Instruct-Turboz$mistralai/Mixtral-8x7B-Instruct-v0.1z"mistralai/Mistral-7B-Instruct-v0.3zQwen/Qwen2.5-72B-Instruct-TurbozQwen/Qwen2.5-7B-Instruct-Turboz)deepseek-ai/DeepSeek-R1-Distill-Llama-70B)zkwaipilot/kat-coder-pro:freez%meta-llama/llama-3.2-3b-instruct:freezgoogle/gemma-2-9b-it:freez"mistralai/mistral-7b-instruct:freezqwen/qwen-2-7b-instruct:freezopenai/gpt-4ozanthropic/claude-3.5-sonnetzgoogle/gemini-pro-1.5)zgemini-2.0-flash-expgemini-2.0-flashgemini-1.5-progemini-1.5-flashzgemini-1.5-flash-8bz
gemini-pro)zmistral-large-latestzmistral-medium-latestzmistral-small-latestzopen-mixtral-8x22bzopen-mixtral-8x7bzopen-mistral-7bzcodestral-latest)zdeepseek-ai/DeepSeek-V3zdeepseek-ai/DeepSeek-R1zQwen/Qwen2.5-72B-InstructzQwen/Qwen2.5-32B-InstructzQwen/Qwen2.5-7B-Instructz&meta-llama/Meta-Llama-3.1-70B-Instructz%meta-llama/Meta-Llama-3.1-8B-InstructzTHUDM/glm-4-9b-chat)zclaude-opus-4-5-20251101zclaude-opus-4-1-20250805zclaude-opus-4-20250514claude-sonnet-4-5-20250929zclaude-sonnet-4-20250514claude-haiku-4-5-20251001zclaude-3-7-sonnet-20250219rV   rW   zgpt-5-codexrL   rM   rP   rQ   zgemini-2.5-prorX   rY   rZ   rR   rS   zllama-3.1-70b-instructzllama-3.1-8b-instructzmistral-largezmixtral-8x7b)r[   rU   r\   rW   zaugment-defaultr?   )rA   modelss     r1   get_default_models!AIProviderType.get_default_modelsy   s   k
!! $k
 ## &k
( !! $)k
@  "Ak
X    
#Yk
n  "ok
F ## &Gk
b %% (ck
z !! 
${k
P "" %Qk
h && )ik
D $$ 'Ek
~ && )k
N ""%6$7Ok
P !!2Qk
R (("Sk
T ++RUk
X zz-,,r0   r/   N)__name__
__module____qualname____firstlineno____doc__r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r5   CUSTOM_API_TYPESstaticmethodr2   r7   rC   rI   r^   __static_attributes__r/   r0   r1   r
   r
      s    FHFDEDHJFGKIKGF#M) <M G
 
, ^ ^ 7 7. + +. n- n-r0   r
   c            	       v   \ rS rSrSrSr\R                  " \R                  SS9r	\R                  " \R                  \R                  " S5      SS9r\R                  " \R                  " S5      S	S9r\R                  " \R                  " S
5      5      r\R                  " \R                  S	S9r\R                  " \R                  " S5      5      r\R                  " \R                  " S
5      5      r\R                  " \R&                  SS9r\R                  " \R&                  S	S9r\R                  " \R,                  5      r\R                  " \R,                  5      r\R                  " \R                  " S5      5      r\R                  " \R                  5      r\R                  " \R,                  \S9r\R                  " \R,                  \\S9r\R<                  " S\/\R>                  " SSS9S9r S S jr!S r"S r#S!S jr$S r%\&S!S j5       r'\&S 5       r(\&S 5       r)\&S 5       r*\&S"S j5       r+Sr,g)#AIProviderConfigi+  ui   AI 提供商配置模型

存储用户或系统的 AI 提供商配置，包括 API Key（加密存储）
ai_provider_configsT)primary_keyzusers.id)nullable2   Fd      )default   )rp   onupdater   
ai_configsdynamic)lazy)foreign_keysbackrefc                 (   U R                   U R                  U R                  [        R	                  U R                  5      U R
                  U R                  U R                  U R                  U R                  U R                  (       a  U R                  R                  5       OSU R                  (       a  U R                  R                  5       OSU R                  U R                  U R                  (       a  U R                  R                  5       OSU R                   (       a  U R                   R                  5       OSS.nU(       aK  U R#                  5       nU(       a!  [%        U5      S:  a  USS  SUSS  3US'   U$ U(       a  SUS'   U$ SUS'   U$ )	uc   转换为字典

Args:
    include_key_preview: 是否包含 API Key 预览（前4位...后4位）
N)iduser_idrA   provider_namenamebase_urlmodel	is_active
is_default	last_used	last_testtest_statustest_message
created_at
updated_at      z...api_key_previewz***)ry   rz   rA   r
   rC   r|   r}   r~   r   r   r   	isoformatr   r   r   r   r   get_api_keylen)selfinclude_key_previewdatakeys       r1   to_dictAIProviderConfig.to_dictJ  s=    ''||!//+<<T=O=OPIIZZ//7;~~11347;~~1134++ --9=$//335d9=$//335d
$ ""$Cs3x!|-0!WISRS
*C&'  */&'  +/&'r0   c                     SSK nU(       a=  UR                  UR                  S5      5      R                  S5      nUSSS2   U l        gSU l        g)u   设置 API Key（加密存储）

注意：这里使用简单的 base64 编码，生产环境建议使用更安全的加密方式
r   Nutf-8rG   )base64	b64encodeencodedecodeapi_key_encrypted)r   api_keyr   encodeds       r1   set_api_keyAIProviderConfig.set_api_keym  sF    
 	&&w~~g'>?FFwOG%,TrT]D"%'D"r0   c                     SSK nU R                  (       aB   U R                  SSS2   nUR                  UR                  S5      5      R	                  S5      $ g! [
         a     gf = f)u   获取解密后的 API Keyr   Nr   r   )r   r   	b64decoder   r   	Exception)r   r   reversed_strs      r1   r   AIProviderConfig.get_api_keyz  sg    !!#55dd;''(;(;G(DELLWUU   s   A A 
A&%A&Nc                 v    Xl         X l        [        5       U l        [        R
                  R                  5         g)u   更新测试状态N)r   r   r   r   r   sessioncommit)r   statusmessages      r1   update_test_status#AIProviderConfig.update_test_status  s(    !#(*


r0   c                 ^    [        5       U l        [        R                  R	                  5         g)u   标记为已使用N)r   r   r   r   r   r   s    r1   	mark_usedAIProviderConfig.mark_used  s    (*


r0   c                     [         R                  R                  U SS9nU(       a  UR                  US9nUR                  SS9R                  5       =(       d    UR                  5       $ )u   获取用户的 AI 配置

Args:
    user_id: 用户 ID
    provider_type: 可选，指定提供商类型
    
Returns:
    AIProviderConfig 或 None
T)rz   r   )rA   )r   ri   query	filter_byfirst)rz   rA   r   s      r1   get_user_config AIProviderConfig.get_user_config  sW     !&&00D0QOO-O@E$/557H5;;=Hr0   c                  \    [         R                  R                  SSSS9R                  5       $ )u   获取系统默认 AI 配置NT)rz   r   r   r   r/   r0   r1   get_system_default#AIProviderConfig.get_system_default  s4      %%// 0 
 %'		r0   c                 j  ^ SSK Jn  [        R                  5       n[        R	                  5       nU b  UR
                  R                  U 5      OSnUb  UR                  OSmU4S jnU(       a  U" 5       nU(       a  U$ gU" 5       nU(       a  U$ U(       a  [        R                  U 5      nU(       a  U$ g)uR  获取用户有效的 AI 配置

优先级规则（用户必须显式选择）：
1. 如果系统强制使用系统 AI（force_system_ai=True）：
   1) 如果用户选择了系统池中的某条配置且仍然有效 → 使用该配置
   2) 否则 → 返回 None（用户需要从系统池中选择一个）
2. 如果不强制系统 AI：
   1) 如果允许用户自定义 AI（allow_user_custom_ai=True），
      且用户有个人默认配置 → 使用用户个人默认配置
   2) 否则，如果用户在系统池中选择了某条配置且仍然有效 → 使用该配置
   3) 否则 → 返回 None（用户需要选择系统AI或个人配置）

注意：不再使用"系统全局默认"概念，用户必须显式选择。

Args:
    user_id: 用户 ID
    
Returns:
    AIProviderConfig 或 None（表示用户需要选择配置）
r   r   Nc                  n   > T (       d  g[         R                  R                  T SSS9R                  5       $ )u6   根据用户偏好获取一条有效的系统级配置NT)ry   rz   r   r   )preferred_system_ids   r1   _get_preferred_system_configKAIProviderConfig.get_effective_config.<locals>._get_preferred_system_config  s9    &#))33& 4  eg	r0   )
userr   SystemAIConfigforce_system_aiallow_user_custom_air   r@   preferred_system_ai_config_idri   r   )	rz   r   force_systemallow_customr   r   preferred_system_configuser_configr   s	           @r1   get_effective_config%AIProviderConfig.get_effective_config  s    , 	 &557%::< +2*=tzz~~g&4262BD.. 		 &B&D#&.. #?"@"** *::7CK"" r0   c                    [         R                  R                  U S9R                  SS05        [         R                  R	                  U5      nU(       a6  UR
                  U :X  a&  SUl        [        R                  R                  5         gg)u   设置用户默认配置rz   r   FT)
ri   r   r   updater@   rz   r   r   r   r   )rz   	config_idconfigs      r1   set_user_default!AIProviderConfig.set_user_default  sn     	(((9@@,PUAVW!''++I6fnn/ $FJJr0   c                    [        U UU=(       d    [        R                  U5      U=(       d    [        R                  U5      U=(       d"    [        R	                  U5      =(       d    S/S   SUSS9nUR                  U5        U(       a.  [         R                  R                  U S9R                  SS05        [        R                  R                  U5        [        R                  R                  5         U$ )	u  创建 AI 配置

Args:
    user_id: 用户 ID（None 表示系统配置）
    provider_type: 提供商类型
    api_key: API Key
    model: 模型名称
    base_url: API Base URL
    name: 配置名称
    is_default: 是否设为默认
    
Returns:
    AIProviderConfig
Nr   Tpending)rz   rA   r|   r}   r~   r   r   r   r   r   F)ri   r
   rC   rI   r^   r   r   r   r   r   r   addr   )rz   rA   r   r~   r}   r|   r   r   s           r1   create_configAIProviderConfig.create_config  s      "'G88GS!D!D]!SZN==mLVQUPVXYZ!!	
 	7# "",,W,=DDlTYEZ[


v


r0   )r   r   r   r   r   )FN)NNNF)-r`   ra   rb   rc   rd   __tablename__r   ColumnIntegerry   
ForeignKeyrz   StringrA   r|   Textr   r}   r~   Booleanr   r   DateTimer   r   r   r   r   r   r   relationshiprw   r   r   r   r   r   r   rf   r   r   r   r   r   rg   r/   r0   r1   ri   ri   +  s    *M	2::4	0Bii

BMM*$=MGIIbiime<M99RYYs^$D		"''E:yy3(HIIbiin%E		"**d3I2::u5J		"++&I		"++&I))BIIbM*K99RWW%L2;;@J2;;/ZJ ??Y

<i8D!F(

 I I   @ @D 
 
 ! !r0   ri   c                       \ rS rSrSr\SS j5       r\SS j5       r\S 5       r\S 5       r	\S 5       r
\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       rSrg)r   i#  uI   系统 AI 配置兼容层（使用 system_configs 表的 category='ai'）Nc                     SSK Jn  SSKJn  UR                  R                  U SSS9R                  5       nU(       a  UR                  5       $ U$ )u   获取配置值r   r   SystemConfigaiT)r   categoryenabled)baser   r   r   r   r   r   	get_value)r   rp   r   r   r   s        r1   
get_configSystemAIConfig.get_config(  sG     	(##--#d-SYY[##%%r0   c                 X   SSK Jn  SSKJn  UR                  R                  U SS9R                  5       nU(       a  UR                  U5        U(       a  X%l        O5U" U SUSS9nUR                  U5        UR                  R                  U5        UR                  R                  5         U$ )u   设置配置值r   r   r   r   )r   r   rG   )r   valuedescriptionr   )r   r   r   r   r   r   r   	set_valuer   r   r   r   )r   r   r   r   r   r   s         r1   
set_configSystemAIConfig.set_config3  s     	(##--#-EKKMU#%0"!'	F U#JJNN6"


r0   c                      [         R                  S[        R                  5       5      n U (       d  [        R                  5       $ U $ )u"   获取启用的 AI 提供商列表enabled_providers)r   r   r
   r2   )r   s    r1   get_enabled_providers$SystemAIConfig.get_enabled_providersJ  s7     !++,?AWAWAYZ!))++r0   c                 0    [         R                  SU S5      $ )u"   设置启用的 AI 提供商列表r   u   启用的 AI 提供商列表r   r   )	providerss    r1   set_enabled_providers$SystemAIConfig.set_enabled_providersS  s      ((*
 	
r0   c                 2    [         R                  5       nX;   $ )u   检查提供商是否启用)r   r   )rA   r   s     r1   is_provider_enabled"SystemAIConfig.is_provider_enabled\  s     !668''r0   c                  .    [         R                  SS5      $ )u$   是否允许用户使用自定义 AIr   Tr   r   r/   r0   r1   r   #SystemAIConfig.allow_user_custom_aib  s     (()?FFr0   c                 0    [         R                  SU S5      $ )u*   设置是否允许用户使用自定义 AIr   u+   是否允许用户使用自定义 AI 配置r   )allows    r1   set_allow_user_custom_ai'SystemAIConfig.set_allow_user_custom_aig  s      (("9
 	
r0   c                  .    [         R                  SS5      $ )u'   是否强制所有用户使用系统 AIr   Fr   r/   r0   r1   r   SystemAIConfig.force_system_aip  s     (():EBBr0   c                 0    [         R                  SU S5      $ )u-   设置是否强制所有用户使用系统 AIr   uB   是否强制所有用户使用系统 AI（禁用用户自定义）r   )forces    r1   set_force_system_ai"SystemAIConfig.set_force_system_aiu  s      ((P
 	
r0   c            	          [         R                  5       n / n[        R                  5       nSS/nX#-   nU HU  nUR	                  U[        R                  U5      [        R                  U5      [        R                  U5      XP;   S.5        MW     U$ )u   获取所有 API 提供商信息（用于前端"自定义 API"下拉列表）

注意：现在包含 AnyRouter 和 AgentRouter，但 Augment 仍然使用独立配置界面。
r   r   )typer|   r}   r]   r   )r   r   r
   r7   appendrC   rI   r^   )r   r   api_providersadditional_providersall_providersrA   s         r1   get_all_provider_info$SystemAIConfig.get_all_provider_info~  s     !668	&88: +];%<*M%&77F*??N(;;MJ(3  + r0   r/   r   )r`   ra   rb   rc   rd   rf   r   r   r   r   r   r   r  r   r	  r  rg   r/   r0   r1   r   r   #  s    S    ,   
 
 ( (
 G G 
 
 C C 
 
  r0   r   c                   \    \ rS rSrSr\S 5       r\S	S j5       r\S 5       r\	S 5       r
Srg)
AugmentSessionTokeni  uC   Augment Session Token 兼容层（使用 ai_provider_configs 表）c                      [         R                  R                  SSSSS9R                  5       n U (       a  U R	                  5       $ g)u   获取全局TokenNr   Trz   rA   r   r   ri   r   r   r   r   r   s    r1   get_global_token$AugmentSessionToken.get_global_token  sN     "''11#	 2 

 %' 	 %%''r0   Nc           
         [         R                  R                  SSS9R                  SS05        [         R                  R                  SSSS9R	                  5       nU(       a)  UR                  U 5        SUl        U=(       d    SUl        OH[        SSU=(       d    SS	S
SSS9nUR                  U 5        [        R                  R                  U5        [        R                  R                  5         U$ )u   设置全局TokenNr   rz   rA   r   FTrz   rA   r   u   全局 Augment Tokenzaugment-clirG   rz   rA   r|   r~   r}   r   r   )ri   r   r   r   r   r   r   r|   r   r   r   r   )	token_strr|   admin_user_idr   s       r1   set_global_token$AugmentSessionToken.set_global_token  s     	((# 	) 	
 &,&
' "''11# 2 
 %'	 	 y) $F8"8FK%'33#F y)JJNN6"


r0   c                      [         R                  R                  SSS9R                  5       n U  H  nUR	                  S5        SUl        M     [        R                  R                  5         [        U 5      S:  $ )u   删除全局TokenNr   r  rG   Fr   )
ri   r   r   allr   r   r   r   r   r   )configsr   s     r1   delete_global_token'AugmentSessionToken.delete_global_token  st     #((22# 3 
 #% 	 Fr"$F  	

7|ar0   c                 $     " S S5      nU" 5       $ )   查询接口（兼容）c                        \ rS rSrS rS rSrg),AugmentSessionToken.query.<locals>.MockQueryi  c                     U $ r   r/   r   kwargss     r1   r   6AugmentSessionToken.query.<locals>.MockQuery.filter_by      r0   c                     g r   r/   r   s    r1   r   2AugmentSessionToken.query.<locals>.MockQuery.first      r0   r/   Nr`   ra   rb   rc   r   r   rg   r/   r0   r1   	MockQueryr+        r0   r5  r/   clsr5  s     r1   r   AugmentSessionToken.query  s    	 	
 {r0   r/   )u   全局TokenN)r`   ra   rb   rc   rd   rf   r  r!  r&  classmethodr   rg   r/   r0   r1   r  r    sV    M
 
 
 ! !F 
  
   r0   r  c                   l    \ rS rSrSr\S 5       r\S 5       r\S
S j5       r\S 5       r	\
S 5       rSrg	)AnyRouterTokeni  u=   AnyRouter Token 兼容层（使用 ai_provider_configs 表）c                     [         R                  R                  U SSS9R                  5       nU(       a  UR	                  5       $ g)   获取用户的 Tokenr   Tr  Nr  rz   r   s     r1   get_user_tokenAnyRouterToken.get_user_token  sK     "''11% 2 
 %'	 	
 %%''r0   c                      [         R                  R                  SSSSS9R                  5       n U (       a  U R	                  5       $ g)   获取全局 TokenNr   Tr  r  r  s    r1   r  AnyRouterToken.get_global_token   sN     "''11%	 2 

 %' 	 %%''r0   c           
      ~   [         R                  R                  U SSS9R                  5       nU(       a"  UR	                  U5        U=(       d    SUl        OH[        U SU=(       d    SSSSSS9nUR	                  U5        [        R                  R                  U5        [        R                  R                  5         U$ )	   设置用户的 Tokenr   Tr  zAnyRouter TokenrT   zhttps://anyrouter.topFr  
ri   r   r   r   r   r|   r   r   r   r   rz   r  r|   r   s       r1   set_user_tokenAnyRouterToken.set_user_token  s     "''11% 2 
 %'	 	 y)3"3FK%)..'0 F y)JJNN6"


r0   c                     [         R                  R                  U SSS9R                  5       nU(       a7  UR	                  S5        SUl        [        R                  R                  5         gg)   删除用户的 Tokenr   Tr  rG   F	ri   r   r   r   r   r   r   r   r   r?  s     r1   delete_user_token AnyRouterToken.delete_user_token)  se     "''11% 2 
 %'	 	
 r"$FJJr0   c                 $     " S S5      nU" 5       $ )r)  c                        \ rS rSrS rS rSrg)'AnyRouterToken.query.<locals>.MockQueryi;  c                     U $ r   r/   r-  s     r1   r   1AnyRouterToken.query.<locals>.MockQuery.filter_by<  r0  r0   c                     g r   r/   r   s    r1   r   -AnyRouterToken.query.<locals>.MockQuery.first>  r3  r0   r/   Nr4  r/   r0   r1   r5  rR  ;  r6  r0   r5  r/   r7  s     r1   r   AnyRouterToken.query8      	 	
 {r0   r/   Nu   用户 Tokenr`   ra   rb   rc   rd   rf   r@  r  rI  rN  r:  r   rg   r/   r0   r1   r<  r<    sg    G	 	 
 
  6    r0   r<  c                   l    \ rS rSrSr\S 5       r\S 5       r\S
S j5       r\S 5       r	\
S 5       rSrg	)AgentRouterTokeniF  uu   AgentRouter Token 兼容层（使用 ai_provider_configs 表）

API 文档: https://docs.agentrouter.org/start.html
c                     [         R                  R                  U SSS9R                  5       nU(       a  UR	                  5       $ g)r>  r   Tr  Nr  r?  s     r1   r@  AgentRouterToken.get_user_tokenL  sK     "''11' 2 
 %'	 	
 %%''r0   c                      [         R                  R                  SSSSS9R                  5       n U (       a  U R	                  5       $ g)rC  Nr   Tr  r  r  s    r1   r  !AgentRouterToken.get_global_tokenX  sN     "''11'	 2 

 %' 	 %%''r0   c           
      ~   [         R                  R                  U SSS9R                  5       nU(       a"  UR	                  U5        U=(       d    SUl        OH[        U SU=(       d    SSSSSS9nUR	                  U5        [        R                  R                  U5        [        R                  R                  5         U$ )	rF  r   Tr  zAgentRouter TokenrT   rF   Fr  rG  rH  s       r1   rI  AgentRouterToken.set_user_tokene  s     "''11' 2 
 %'	 	 y)5"5FK%+00'3 F y)JJNN6"


r0   c                     [         R                  R                  U SSS9R                  5       nU(       a7  UR	                  S5        SUl        [        R                  R                  5         gg)rL  r   Tr  rG   FrM  r?  s     r1   rN  "AgentRouterToken.delete_user_token  se     "''11' 2 
 %'	 	
 r"$FJJr0   c                 $     " S S5      nU" 5       $ )r)  c                        \ rS rSrS rS rSrg))AgentRouterToken.query.<locals>.MockQueryi  c                     U $ r   r/   r-  s     r1   r   3AgentRouterToken.query.<locals>.MockQuery.filter_by  r0  r0   c                     g r   r/   r   s    r1   r   /AgentRouterToken.query.<locals>.MockQuery.first  r3  r0   r/   Nr4  r/   r0   r1   r5  rg    r6  r0   r5  r/   r7  s     r1   r   AgentRouterToken.query  rX  r0   r/   NrY  rZ  r/   r0   r1   r\  r\  F  sk    
 	 	 
 
  6    r0   r\  )rd   r   r   r   r   r   r   jsonr
   Modelri   r   r  r<  r\  r/   r0   r1   <module>ro     sk     %  Y- Y-xrrxx rpq qvM MfO OjR Rr0   