
    hi$                       d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZm Z   e e!          Z"edd            Z#ddZ$ e$            Z%dS )u   
应用入口与工厂 —— 创建 FastAPI 实例，注册生命周期钩子、中间件和路由。
FastAPI application factory for the zm-rag backend.
    )annotations)asynccontextmanager)AnyAsyncIterator)FastAPIHTTPExceptionRequest)CORSMiddlewareJSONResponse)settings)EmbeddingClient)ESClient)	LLMClient)MySQLClient)Neo4jClient)RedisClient)configure_logging
get_loggerappr   returnAsyncIterator[None]c               	  K   t          t          j                   t                              dt          j        t          j        t          j                   t          j                    }|| j	        _
        t                              dt          j                   t          j        |          }|| j	        _        t                              dt          j                   	 |                                 d	{V  n@# t           $ r3}t                              d
t%          |                     Y d	}~nd	}~ww xY wt'          j                    }|| j	        _        t                              dt          j                   d	}t          j        rt          j        rt          j        r	 t3          j                     d	{V }|                                 d	{V  |                                 d	{V  t                              dt          j        t          j                   nK# t           $ r>}t                              dt%          |          t          j                   Y d	}~nd	}~ww xY w|| j	        _        t?                      }|| j	        _         t                              dt          j!                   tE                      }|| j	        _#        t                              dt          j$                   ddl%m&}  ||          }	|	| j	        _'        	 |	(                                 d	{V  |	)                                 d	{V  t                              d           n@# t           $ r3}t                              dt%          |                     Y d	}~nd	}~ww xY wd	W V  t                              d           |*                                 d	{V  |*                                 d	{V  |*                                 d	{V  ||*                                 d	{V  |*                                 d	{V  |*                                 d	{V  t                              d           d	S )uA  应用生命周期钩子：启动时初始化各基础设施客户端并挂载到 app.state，关闭时优雅释放连接。

    Startup / shutdown lifecycle hook.

    * **Startup** – initialise ES, Neo4j and Redis clients; attach to ``app.state``.
    * **Shutdown** – close all client connections gracefully.
    )debugapp_starting)r   versionr   redis_client_ready)url)redis_clientes_client_ready)hostNes_create_indices_failed)errorneo4j_client_ready)urimysql_client_ready)r!   databasemysql_client_init_failed)r#   backendembedding_client_ready)modelllm_client_readyr   )GraphAdminServicegraph_admin_service_readygraph_admin_init_failedapp_shutting_downapp_stopped)+r   r   r   loggerinfoapp_nameapp_versionr   from_settingsstater   	redis_urlr   	es_clientes_hostcreate_indices	Exceptionr#   strr   neo4j_client	neo4j_urimysql_enabled
mysql_hostmysql_databaser   ensure_research_sessions_tableensure_convert_log_tablewarningresearch_session_backendmysql_clientr   embedding_clientembedding_modelr   
llm_client	llm_modelapp.core.graph_admin_servicer-   graph_admin_serviceensure_default_typesrefresh_type_cacheclose)
r   r   r9   excr>   rG   rH   rJ   r-   rM   s
             "D:\work\zm-rag\backend\app\main.pylifespanrS      s      HN++++
KK$n	     ,..L)CI
KK$(*<K=== &LAAAI#CI
KK!(8K999A&&(((((((((( A A A 	/s3xx@@@@@@@@A ,..L)CI
KK$(*<K=== L ("5 (:Q 	!,!:!<!<<<<<<<L==?????????77999999999KK$(!0     
  	 	 	NN*#hh 9         	 *CI '((!1CI
KK(0HKIII J%CI
KK"(*<K=== ?>>>>>++L99$7CI!B!66888888888!44666666666/0000 B B B0CAAAAAAAAB 
EEEE KK#$$$
//











  """""""""

 
 
"
""""""""





KKsJ   &D 
D>)D99D>-A>H, ,
I464I//I4!AM0 0
N-:)N((N-c                    t          t          j        t          j        dt                    } t          j        rddlm} |                     |           |                     t          t          j
        dg dg d           dd	lm} |                     |           |                     d
dg          dd            }|                     t                     dd            }|                     d          dd            }| S )u   构建并返回配置完成的 FastAPI 应用实例，包括限流中间件、CORS、路由注册和全局异常处理。

    Build and return the configured :class:`FastAPI` application.u)   政策法规 RAG 检索增强生成系统)titler   descriptionrS   r   )RateLimitMiddlewareT)GETPOSTPUTDELETEOPTIONS)AuthorizationzContent-TypeAcceptzX-Requested-With)allow_originsallow_credentialsallow_methodsallow_headers)	v1_routerz/healthsystem)tagsr   dict[str, Any]c                 :   K   dt           j        t           j        dS )zLightweight liveness probe.ok)statusr   r   )r   r4   r5        rR   health_checkz create_app.<locals>.health_check   s&       $+
 
 	
rk   requestr	   rQ   r<   r   c                   K   t          |t                    r|t                              d| j        j        | j        t          |          |           t          dddi          S )Nunhandled_exception)pathmethodr#   exc_infoi  detailzInternal server errorstatus_codecontent)	
isinstancer   r2   r#   r   rp   rq   r=   r   rm   rQ   s     rR   unhandled_exception_handlerz/create_app.<locals>.unhandled_exception_handler   s{       c=)) 	I!!>c(( 	 	
 	
 	
 67
 
 
 	
rk     r   c                ,   K   t          dddi          S )Nrz   rs   zResource not foundrt   r   rx   s     rR   not_found_handlerz%create_app.<locals>.not_found_handler   s)      34
 
 
 	
rk   )r   rf   )rm   r	   rQ   r<   r   r   )rm   r	   rQ   r   r   r   )r   r   r4   r5   rS   rate_limit_enabledapp.middleware.rate_limitrW   add_middlewarer
   cors_originsapp.api.v1.routerrc   include_routergetexception_handlerr<   )r   rW   rc   rl   ry   r|   s         rR   
create_appr      s[    $?	  C " 0AAAAAA./// +AAAUUU     ,+++++y!!! 	WWYhZW((
 
 
 )(
 	9%%
 
 
 &%
" 	3
 
 
  
 Jrk   N)r   r   r   r   )r   r   )&__doc__
__future__r   
contextlibr   typingr   r   fastapir   r   r	   fastapi.middleware.corsr
   fastapi.responsesr   
app.configr   #app.infrastructure.embedding_clientr   app.infrastructure.es_clientr   app.infrastructure.llm_clientr   app.infrastructure.mysql_clientr   app.infrastructure.neo4j_clientr   app.infrastructure.redis_clientr   app.utils.loggerr   r   __name__r2   rS   r   r   rj   rk   rR   <module>r      s   
 # " " " " " * * * * * * % % % % % % % % 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 * * * * * *       ? ? ? ? ? ? 1 1 1 1 1 1 3 3 3 3 3 3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 : : : : : : : :	H		
 _ _ _ _HE E E ER jllrk   