@@ -63,7 +63,7 @@ def __init__(
6363 str ,
6464 Providers ,
6565 ] = {}
66- """Provider 实例映射. key: provider_id, value: Provider 实例"""
66+ """Provider 实例映射。 key: provider_id, value: Provider 实例"""
6767 self .llm_tools = llm_tools
6868
6969 self .curr_provider_inst : Provider | None = None
@@ -107,7 +107,7 @@ def _notify_provider_changed(
107107 self ._provider_change_callback (provider_id , provider_type , umo )
108108 except Exception as e :
109109 logger .warning (
110- "调用 provider 变更回调失败: provider_id=%s, type=%s, err=%s" ,
110+ "调用 provider 变更回调失败: provider_id=%s, type=%s, err=%s" ,
111111 provider_id ,
112112 provider_type ,
113113 safe_error ("" , e ),
@@ -119,7 +119,7 @@ def _notify_provider_changed(
119119 hook (provider_id , provider_type , umo )
120120 except Exception as e :
121121 logger .warning (
122- "调用 provider 变更钩子失败: provider_id=%s, type=%s, err=%s" ,
122+ "调用 provider 变更钩子失败: provider_id=%s, type=%s, err=%s" ,
123123 provider_id ,
124124 provider_type ,
125125 safe_error ("" , e ),
@@ -270,7 +270,11 @@ def get_using_provider(
270270
271271 return provider
272272
273- async def initialize (self ) -> None :
273+ async def initialize (
274+ self ,
275+ * ,
276+ init_timeout : float | int | str | None = None ,
277+ ) -> None :
274278 # 逐个初始化提供商
275279 for provider_config in self .providers_config :
276280 try :
@@ -331,16 +335,25 @@ async def initialize(self) -> None:
331335 if not self .curr_tts_provider_inst and self .tts_provider_insts :
332336 self .curr_tts_provider_inst = self .tts_provider_insts [0 ]
333337
334- async def _init_mcp_clients_bg () -> None :
335- try :
336- await self .llm_tools .init_mcp_clients ()
337- except Exception :
338- logger .error ("MCP init background task failed" , exc_info = True )
339-
340- if self ._mcp_init_task is None or self ._mcp_init_task .done ():
341- self ._mcp_init_task = asyncio .create_task (
342- _init_mcp_clients_bg (),
343- name = "provider-manager:mcp-init" ,
338+ # 初始化 MCP Client 连接(等待完成以确保工具可用)
339+ strict_mcp_init = os .getenv ("ASTRBOT_MCP_INIT_STRICT" , "" ).strip ().lower () in {
340+ "1" ,
341+ "true" ,
342+ "yes" ,
343+ "on" ,
344+ }
345+ mcp_init_summary = await self .llm_tools .init_mcp_clients (
346+ raise_on_all_failed = strict_mcp_init ,
347+ init_timeout = init_timeout ,
348+ )
349+ if (
350+ mcp_init_summary .total > 0
351+ and mcp_init_summary .success == 0
352+ and not strict_mcp_init
353+ ):
354+ logger .warning (
355+ "MCP 服务全部初始化失败,系统将继续启动(可设置 "
356+ "ASTRBOT_MCP_INIT_STRICT=1 以在此场景下中止启动)。"
344357 )
345358
346359 def dynamic_import_provider (self , type : str ) -> None :
@@ -652,7 +665,7 @@ async def load_provider(self, provider_config: dict) -> None:
652665 await inst .initialize ()
653666 self .rerank_provider_insts .append (inst )
654667 case _:
655- # 未知供应商抛出异常,确保inst初始化
668+ # 未知供应商抛出异常,确保 inst 初始化
656669 # Should be unreachable
657670 raise Exception (
658671 f"未知的提供商类型:{ provider_metadata .provider_type } "
@@ -716,7 +729,7 @@ def get_insts(self):
716729 async def terminate_provider (self , provider_id : str ) -> None :
717730 if provider_id in self .inst_map :
718731 logger .info (
719- f"终止 { provider_id } 提供商适配器({ len (self .provider_insts )} , { len (self .stt_provider_insts )} , { len (self .tts_provider_insts )} ) ..." ,
732+ f"终止 { provider_id } 提供商适配器 ({ len (self .provider_insts )} , { len (self .stt_provider_insts )} , { len (self .tts_provider_insts )} ) ..." ,
720733 )
721734
722735 if self .inst_map [provider_id ] in self .provider_insts :
@@ -743,7 +756,7 @@ async def terminate_provider(self, provider_id: str) -> None:
743756 await self .inst_map [provider_id ].terminate () # type: ignore
744757
745758 logger .info (
746- f"{ provider_id } 提供商适配器已终止({ len (self .provider_insts )} , { len (self .stt_provider_insts )} , { len (self .tts_provider_insts )} )" ,
759+ f"{ provider_id } 提供商适配器已终止 ({ len (self .provider_insts )} , { len (self .stt_provider_insts )} , { len (self .tts_provider_insts )} )" ,
747760 )
748761 del self .inst_map [provider_id ]
749762
0 commit comments