litserve openapi schema 处理简单说明

litserve 在处理openai schema 的时候实际上还是利用了fastapi 的能力,只是litserve 抽象了api 开发的处理,对于openapi request 以及response 的类型基于了动态获取(通过python 的inspect 模块)

参考处理

  • server.py

register_endpoints

def register_endpoints(self):
    self._register_internal_endpoints()
    for lit_api in self.litapi_connector:
        # 获取lit_api 几个方法的签名,包含了request 以及response,decode_request 处理request 类型,encode_response 处理response 类型
        decode_request_signature = inspect.signature(lit_api.decode_request)
        encode_response_signature = inspect.signature(lit_api.encode_response)

        request_type = decode_request_signature.parameters["request"].annotation
        if request_type == decode_request_signature.empty:
            request_type = Request

        response_type = encode_response_signature.return_annotation
        if response_type == encode_response_signature.empty:
            response_type = Response
      
        self._register_api_endpoints(lit_api, request_type, response_type)

_register_api_endpoints 内部实际就是标准的fastapi 动态注册路由,此处会判断是spec 还是普通的litapi

def _register_api_endpoints(self, lit_api: LitAPI, request_type, response_type):
    """Register endpoint routes for the FastAPI app."""

    self._callback_runner.trigger_event(EventTypes.ON_SERVER_START.value, litserver=self)

    # Create handlers
    handler = StreamingRequestHandler(lit_api, self) if lit_api.stream else RegularRequestHandler(lit_api, self)

    # Create endpoint function
    async def endpoint_handler(request: request_type) -> response_type:
        return await handler.handle_request(request, request_type)

    # Register endpoint
    if not lit_api.spec:
        self.app.add_api_route(
            lit_api.api_path,
            endpoint_handler,
            methods=["POST"],
            dependencies=[Depends(self.setup_auth())],
        )

    # Handle specs
    self._register_spec_endpoints(lit_api)

    # Register middleware
    self._register_middleware()

说明

litserve 的内部实际上是利用了inspect 模块以及动态路由注册的模式实现openapi schema 处理的,了解此机制还是比较重要的,可以编写更好的方法

参考资料

src/litserve/server.py

https://docs.python.org/zh-cn/3.9/library/inspect.html

posted on 2025-09-23 08:00  荣锋亮  阅读(17)  评论(0)    收藏  举报

导航