@@ -90,6 +90,7 @@ async def request_logger(self, request):
9090 "grok-3-search" : "grok-3" ,
9191 "grok-3-imageGen" : "grok-3" ,
9292 "grok-3-deepsearch" : "grok-3" ,
93+ "grok-3-deepersearch" : "grok-3" ,
9394 "grok-3-reasoning" : "grok-3"
9495 },
9596 "API" : {
@@ -116,6 +117,7 @@ async def request_logger(self, request):
116117 "RETRYSWITCH" : False ,
117118 "MAX_ATTEMPTS" : 2
118119 },
120+ "TOKEN_STATUS_FILE" : "token_status.json" ,
119121 "SHOW_THINKING" : os .environ .get ("SHOW_THINKING" ) == "true" ,
120122 "IS_THINKING" : False ,
121123 "IS_IMG_GEN" : False ,
@@ -161,15 +163,35 @@ def __init__(self):
161163 "RequestFrequency" : 10 ,
162164 "ExpirationTime" : 24 * 60 * 60 * 1000 # 24小时
163165 },
166+ "grok-3-deepersearch" : {
167+ "RequestFrequency" : 3 ,
168+ "ExpirationTime" : 24 * 60 * 60 * 1000 # 24小时
169+ },
164170 "grok-3-reasoning" : {
165171 "RequestFrequency" : 10 ,
166172 "ExpirationTime" : 24 * 60 * 60 * 1000 # 24小时
167173 }
168174 }
169175 self .token_reset_switch = False
170176 self .token_reset_timer = None
171-
172- def add_token (self , token ):
177+ self .load_token_status () # 加载令牌状态
178+ def save_token_status (self ):
179+ try :
180+ with open (CONFIG ["TOKEN_STATUS_FILE" ], 'w' , encoding = 'utf-8' ) as f :
181+ json .dump (self .token_status_map , f , indent = 2 , ensure_ascii = False )
182+ logger .info ("令牌状态已保存到配置文件" , "TokenManager" )
183+ except Exception as error :
184+ logger .error (f"保存令牌状态失败: { str (error )} " , "TokenManager" )
185+
186+ def load_token_status (self ):
187+ try :
188+ if os .path .exists (CONFIG ["TOKEN_STATUS_FILE" ]):
189+ with open (CONFIG ["TOKEN_STATUS_FILE" ], 'r' , encoding = 'utf-8' ) as f :
190+ self .token_status_map = json .load (f )
191+ logger .info ("已从配置文件加载令牌状态" , "TokenManager" )
192+ except Exception as error :
193+ logger .error (f"加载令牌状态失败: { str (error )} " , "TokenManager" )
194+ def add_token (self , token ,isinitialization = False ):
173195 sso = token .split ("sso=" )[1 ].split (";" )[0 ]
174196 for model in self .model_config .keys ():
175197 if model not in self .token_model_map :
@@ -193,6 +215,8 @@ def add_token(self, token):
193215 "invalidatedTime" : None ,
194216 "totalRequestCount" : 0
195217 }
218+ if not isinitialization :
219+ self .save_token_status ()
196220
197221 def set_token (self , token ):
198222 models = list (self .model_config .keys ())
@@ -218,6 +242,8 @@ def delete_token(self, token):
218242
219243 if sso in self .token_status_map :
220244 del self .token_status_map [sso ]
245+
246+ self .save_token_status ()
221247
222248 logger .info (f"令牌已成功移除: { token } " , "TokenManager" )
223249 return True
@@ -289,6 +315,8 @@ def get_next_token_for_model(self, model_id, is_return=False):
289315 self .token_status_map [sso ][normalized_model ]["invalidatedTime" ] = int (time .time () * 1000 )
290316 self .token_status_map [sso ][normalized_model ]["totalRequestCount" ] += 1
291317
318+ self .save_token_status ()
319+
292320 return token_entry ["token" ]
293321
294322 return None
@@ -578,13 +606,33 @@ def upload_base64_image(self, base64_data, url):
578606 except Exception as error :
579607 logger .error (str (error ), "Server" )
580608 return ''
581-
609+ # def convert_system_messages(self, messages):
610+ # try:
611+ # system_prompt = []
612+ # i = 0
613+ # while i < len(messages):
614+ # if messages[i].get('role') != 'system':
615+ # break
616+
617+ # system_prompt.append(self.process_message_content(messages[i].get('content')))
618+ # i += 1
619+
620+ # messages = messages[i:]
621+ # system_prompt = '\n'.join(system_prompt)
622+
623+ # if not messages:
624+ # raise ValueError("没有找到用户或者AI消息")
625+ # return {"system_prompt":system_prompt,"messages":messages}
626+ # except Exception as error:
627+ # logger.error(str(error), "Server")
628+ # raise ValueError(error)
582629 def prepare_chat_request (self , request ):
583630 if ((request ["model" ] == 'grok-2-imageGen' or request ["model" ] == 'grok-3-imageGen' ) and
584631 not CONFIG ["API" ]["PICGO_KEY" ] and not CONFIG ["API" ]["TUMY_KEY" ] and
585632 request .get ("stream" , False )):
586633 raise ValueError ("该模型流式输出需要配置PICGO或者TUMY图床密钥!" )
587634
635+ # system_message, todo_messages = self.convert_system_messages(request["messages"]).values()
588636 todo_messages = request ["messages" ]
589637 if request ["model" ] in ['grok-2-imageGen' , 'grok-3-imageGen' , 'grok-3-deepsearch' ]:
590638 last_message = todo_messages [- 1 ]
@@ -599,6 +647,11 @@ def prepare_chat_request(self, request):
599647 convert_to_file = False
600648 last_message_content = ''
601649 search = request ["model" ] in ['grok-2-search' , 'grok-3-search' ]
650+ deepsearchPreset = ''
651+ if request ["model" ] == 'grok-3-deepsearch' :
652+ deepsearchPreset = 'default'
653+ elif request ["model" ] == 'grok-3-deepersearch' :
654+ deepsearchPreset = 'deeper'
602655
603656 # 移除<think>标签及其内容和base64图片
604657 def remove_think_tags (text ):
@@ -622,7 +675,6 @@ def process_content(content):
622675 elif content ["type" ] == 'text' :
623676 return remove_think_tags (content ["text" ])
624677 return remove_think_tags (self .process_message_content (content ))
625-
626678 for current in todo_messages :
627679 role = 'assistant' if current ["role" ] == 'assistant' else 'user'
628680 is_last_message = current == todo_messages [- 1 ]
@@ -694,11 +746,11 @@ def process_content(content):
694746 "xPostAnalyze" : search
695747 },
696748 "enableSideBySide" : True ,
697- "isPreset" : False ,
698749 "sendFinalMetadata" : True ,
699- "customInstructions" : "" ,
700- "deepsearchPreset" : "default" if request ["model" ] == 'grok-3-deepsearch' else "" ,
701- "isReasoning" : request ["model" ] == 'grok-3-reasoning'
750+ "customPersonality" : "" ,
751+ "deepsearchPreset" : deepsearchPreset ,
752+ "isReasoning" : request ["model" ] == 'grok-3-reasoning' ,
753+ "disableTextFollowUps" : True
702754 }
703755
704756class MessageProcessor :
@@ -753,7 +805,7 @@ def process_model_response(response, model):
753805 result ["token" ] = response .get ("token" )
754806 elif model == 'grok-3' :
755807 result ["token" ] = response .get ("token" )
756- elif model == 'grok-3-deepsearch' :
808+ elif model in [ 'grok-3-deepsearch' , 'grok-3-deepersearch' ] :
757809 if response .get ("messageStepId" ) and not CONFIG ["SHOW_THINKING" ]:
758810 return result
759811 if response .get ("messageStepId" ) and not CONFIG ["IS_THINKING" ]:
@@ -763,7 +815,11 @@ def process_model_response(response, model):
763815 result ["token" ] = "</think>" + response .get ("token" , "" )
764816 CONFIG ["IS_THINKING" ] = False
765817 elif (response .get ("messageStepId" ) and CONFIG ["IS_THINKING" ] and response .get ("messageTag" ) == "assistant" ) or response .get ("messageTag" ) == "final" :
766- result ["token" ] = response .get ("token" )
818+ result ["token" ] = response .get ("token" ,"" )
819+ elif (CONFIG ["IS_THINKING" ] and response .get ("token" ,"" ).get ("action" ,"" ) == "webSearch" ):
820+ result ["token" ] = response .get ("token" ,"" ).get ("action_input" ,"" ).get ("query" ,"" )
821+ elif (CONFIG ["IS_THINKING" ] and response .get ("webSearchResults" )):
822+ result ["token" ] = Utils .organize_search_results (response ['webSearchResults' ])
767823 elif model == 'grok-3-reasoning' :
768824 if response .get ("isThinking" ) and not CONFIG ["SHOW_THINKING" ]:
769825 return result
@@ -927,6 +983,7 @@ def generate():
927983 continue
928984 try :
929985 line_json = json .loads (chunk .decode ("utf-8" ).strip ())
986+ print (line_json )
930987 if line_json .get ("error" ):
931988 logger .error (json .dumps (line_json , indent = 2 ), "Server" )
932989 yield json .dumps ({"error" : "RateLimitError" }) + "\n \n "
@@ -961,9 +1018,11 @@ def generate():
9611018def initialization ():
9621019 sso_array = os .environ .get ("SSO" , "" ).split (',' )
9631020 logger .info ("开始加载令牌" , "Server" )
1021+ token_manager .load_token_status ()
9641022 for sso in sso_array :
9651023 if sso :
966- token_manager .add_token (f"sso-rw={ sso } ;sso={ sso } " )
1024+ token_manager .add_token (f"sso-rw={ sso } ;sso={ sso } " ,True )
1025+ token_manager .save_token_status ()
9671026
9681027 logger .info (f"成功加载令牌: { json .dumps (token_manager .get_all_tokens (), indent = 2 )} " , "Server" )
9691028 logger .info (f"令牌加载完成,共加载: { len (token_manager .get_all_tokens ())} 个令牌" , "Server" )
@@ -1138,7 +1197,7 @@ def chat_completions():
11381197 retry_count = 0
11391198 grok_client = GrokApiClient (model )
11401199 request_payload = grok_client .prepare_chat_request (data )
1141-
1200+ logger . info ( json . dumps ( request_payload , indent = 2 ))
11421201
11431202 while retry_count < CONFIG ["RETRY" ]["MAX_ATTEMPTS" ]:
11441203 retry_count += 1
@@ -1196,6 +1255,9 @@ def chat_completions():
11961255 token_manager .reduce_token_request_count (model ,1 )#重置去除当前因为错误未成功请求的次数,确保不会因为错误未成功请求的次数导致次数上限
11971256 if token_manager .get_token_count_for_model (model ) == 0 :
11981257 raise ValueError (f"{ model } 次数已达上限,请切换其他模型或者重新对话" )
1258+ print ("状态码:" , response .status_code )
1259+ print ("响应头:" , response .headers )
1260+ print ("响应内容:" , response .text )
11991261 raise ValueError (f"IP暂时被封无法破盾,请稍后重试或者更换ip" )
12001262 elif response .status_code == 429 :
12011263 response_status_code = 429
0 commit comments