我们有一个monorepo FastAPI应用程序。它有多个服务作为路由器,其中每个路由器对应不同的数据源等其他API。根据分离关注点的原则,每个服务被分组成独立的路由,PYDANTIC的输入和响应模型,其他功能等。 例子是 "service1 search"有一个路由,该路由通过特定参数给出对API的搜索函数做出调用。 而 "service2 search"有一个路由,执行一个针对数据库的SQL查询。

最近的监管者要求我们实施一个“抽象层”。这个想法是,“搜索”函数可以使用任何搜索服务,这意味着它可以调用传过来的API调用到一个数据源,也可以执行一个SQL查询到一个独立的数据库等。这些调用将返回一个适应统一的响应模型,独立于原始响应数据。

试图在FastAPI上实现这个看起来相当困难。我可以创建新的“everything”路由,逐一查询适当的服务/数据模型,然后组合这些响应,适应那些到统一数据模型的。如果我这样做,我被告知这不可接受;FastAPI要求知道哪个源要查询。我也不能让用户指定他们需要的源,因为我们并不希望用户知道数据存储的位置。

我注意到一个代理/LLM可以做到这一点,让我们的路由干净,允许我们在代理级别尝试确定路由逻辑,允许代理选择正确的路由,然后通过结构化输出来适应原始响应。这也被拒绝了。

在这种情况下,我无法实现抽象层想法,保持代码可维护性,pythonic,遵循FastAPI原则,且分离关注点和清晰的路由逻辑。