首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式validationError FastAPI & pydantic

模式validationError FastAPI & pydantic
EN

Stack Overflow用户
提问于 2021-10-13 10:53:36
回答 1查看 3.2K关注 0票数 1

我正在使用FastAPI框架创建一个API,我的post请求有效负载如下所示

代码语言:javascript
复制
{
    "batch_id": "7r3683693242",
    "queries": [
        "What is the capital of Germany",
        "How is Electricity generated"
    ],
    "num_items_to_return": 2,
    "passage_id_and_score_matrix": [
        [
            ["16278720_0", 0.8], ["169339_0", 0.6]
        ],
        [
            ["19258753_14", 0.6], ["3270043_12", 0.4]
        ]
    ]
 }

我把我的化脓性模型定义为

代码语言:javascript
复制
class ReRankerPayload(BaseModel):
    batch_id: str
    queries: List[str]
    num_items_to_return: int
    passage_id_and_score_matrix: List[List[Tuple[str, float]]]

我的API签名

代码语言:javascript
复制
@app.post("/rerank-passages")
async def rerank_passages(payload: ReRankerPayload):
    response = reranker.get_results(
        payload.batch_id, payload.queries,                                    
        payload.passage_id_and_score_matrix, 
        payload.num_items_to_return,
    )
    return response

uvicorn.run(app, host="0.0.0.0", port=8080, log_config=None)

当我打开托管在127.0.0.1:8080/docs上的swagger页面时,我会得到以下错误

代码语言:javascript
复制
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/starlette/exceptions.py", line 82, in __call__
    raise exc
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/starlette/exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/starlette/routing.py", line 656, in __call__
    await route.handle(scope, receive, send)
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/starlette/routing.py", line 259, in handle
    await self.app(scope, receive, send)
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/starlette/routing.py", line 61, in app
    response = await func(request)
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/fastapi/applications.py", line 161, in openapi
    return JSONResponse(self.openapi())
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/fastapi/applications.py", line 136, in openapi
    self.openapi_schema = get_openapi(
  File "/home/dimension/.virtualenvs/buddy/lib/python3.8/site-packages/fastapi/openapi/utils.py", line 410, in get_openapi
    return jsonable_encoder(OpenAPI(**output), by_alias=True, exclude_none=True)  # type: ignore
  File "pydantic/main.py", line 362, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 2 validation errors for OpenAPI
components -> schemas -> ReRankerPayload -> properties -> passage_id_and_score_matrix -> items -> items -> items
  value is not a valid dict (type=type_error.dict)
components -> schemas -> ReRankerPayload -> $ref
  field required (type=value_error.missing)

以上代码在0.65.2版本上运行良好,但在0.70.0上却不起作用。我如何使上述代码工作,而不考虑快速make版本。

EN

回答 1

Stack Overflow用户

发布于 2021-10-16 17:01:32

看起来元组目前是在OpenAPI中不支持

有几种方法可以解决这个问题:

  1. ListUnion一起使用:
代码语言:javascript
复制
from pydantic import BaseModel
from typing import List, Union

class ReRankerPayload(BaseModel):
    batch_id: str
    queries: List[str]
    num_items_to_return: int
    passage_id_and_score_matrix: List[List[List[Union[str, float]]]]

这是最快的解决方案,但无法确保最内部列表/数组中的项目数。

  1. 按照链接线程中的建议,您可以使用Pydantic的conlist
代码语言:javascript
复制
from pydantic import BaseModel, conlist
from typing import List, Union

class ReRankerPayload(BaseModel):
    batch_id: str
    queries: List[str]
    num_items_to_return: int
    passage_id_and_score_matrix: List[List[conlist(Union[str, float], min_items=2, max_items=2)]]

这将确保在最内部的列表中只能传递两个项,并且它们要么是str,要么是float,但是它不能确保顺序。

  1. 如果可以调整请求体,请考虑将其更改为以下内容:
代码语言:javascript
复制
from pydantic import BaseModel
from typing import List

class Entry(BaseModel):
    id: str
    score: float

class ReRankerPayload(BaseModel):
    batch_id: str
    queries: List[str]
    num_items_to_return: int
    passage_id_and_score_matrix: List[List[Entry]]

这提高了可读性,并确保Entry始终具有两个属性(idscore)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69554228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档