Skip to content

Commit 9c3acfa

Browse files
authored
Upgrade pydantic to v2 (PR1) (#1191)
1 parent a466efd commit 9c3acfa

File tree

72 files changed

+310
-231
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+310
-231
lines changed

.github/workflows/run_required_checks.yml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,17 @@ jobs:
2424
- name: Check for Non-Markdown Changes
2525
id: check_changes
2626
run: |
27-
if git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep -vE '\.md$'; then
28-
echo "non_documentation_changes_found=true" >> $GITHUB_OUTPUT
27+
BEFORE="${{ github.event.before }}"
28+
AFTER="${{ github.sha }}"
29+
30+
if [ -z "$BEFORE" ] || \
31+
git diff --name-only "$BEFORE" "$AFTER" | grep -qvE '\.md$'
32+
then
33+
# either BEFORE was empty, or we found at least one non‑.md change
34+
echo "non_documentation_changes_found=true" >> "$GITHUB_OUTPUT"
2935
else
30-
echo "non_documentation_changes_found=false" >> $GITHUB_OUTPUT
36+
# BEFORE was set and all changed files end in .md
37+
echo "non_documentation_changes_found=false" >> "$GITHUB_OUTPUT"
3138
fi
3239
3340
Run-integration-tests:

requirements.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Marqo's requirements files are stored in marqo-base repo: https://github.com/marqo-ai/marqo-base/tree/main/requirements
2+
# Every time we upgrade dependencies, we need to build a new base image. This process often requires upgrading Vespa
3+
# as well (since Vespa regularly removes old version from their dns repo). In the long run, we'll merge marqo-base repo
4+
# back into marqo repo, and improve the image building process. In the short term, we will add new platform-agnostic
5+
# dependencies (or upgrades of these dependencies) in this file. Please not if the dependency is platform-relevant,
6+
# meaning you need to use one version for arm64 and another for amd64, you still need to follow the process in
7+
# marqo-base repo and build a new base image.
28

39
msgpack==1.1.0
410
msgpack_numpy==0.4.8
5-
python-json-logger==3.3.0
11+
python-json-logger==3.3.0
12+
pydantic==2.11.1
13+
fastapi==0.115.12
14+
fastapi-utils==0.8.0
15+
uvicorn==0.34.0

src/marqo/api/models/add_docs_objects.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from typing import List, Dict
22
from typing import Optional, Any, Sequence
33

4-
from pydantic import BaseModel, root_validator
5-
from pydantic import Field
4+
from pydantic.v1 import BaseModel, root_validator
5+
from pydantic.v1 import Field
66

77
from marqo.tensor_search.enums import EnvVars
88
from marqo.tensor_search.models.private_models import ModelAuth
@@ -25,7 +25,7 @@ class Config:
2525
mappings: Optional[dict] = None
2626
documents: Sequence[Dict[str, Any]]
2727
imageDownloadThreadCount: int = Field(default_factory=lambda: read_env_vars_and_defaults_ints(EnvVars.MARQO_IMAGE_DOWNLOAD_THREAD_COUNT_PER_REQUEST))
28-
mediaDownloadThreadCount: Optional[int]
28+
mediaDownloadThreadCount: Optional[int] = None
2929
textChunkPrefix: Optional[str] = None
3030

3131
@root_validator

src/marqo/api/models/embed_request.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
"""
66
from typing import Union, List, Dict, Optional
77

8-
import pydantic
9-
from pydantic import Field, root_validator
8+
from pydantic.v1 import Field, root_validator, validator
109

1110
from marqo.base_model import MarqoBaseModel
1211
from marqo.core.embed.embed import EmbedContentType
@@ -21,7 +20,7 @@ class EmbedRequest(MarqoBaseModel):
2120
modelAuth: Optional[ModelAuth] = None
2221
content_type: Optional[EmbedContentType] = Field(default=EmbedContentType.Query, alias="contentType")
2322

24-
@pydantic.validator('content')
23+
@validator('content')
2524
def validate_content(cls, value):
2625
# Iterate through content list items
2726
if (isinstance(value, list) or isinstance(value, dict)) and len(value) == 0:

src/marqo/api/models/get_batch_documents_request.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pydantic import Field, conlist
1+
from pydantic.v1 import Field, conlist
22

33
from marqo.base_model import MarqoBaseModel
44

src/marqo/api/models/recommend_query.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from marqo.core.models.interpolation_method import InterpolationMethod
44
from marqo.tensor_search.models.api_models import BaseMarqoModel
5-
from pydantic import root_validator
5+
from pydantic.v1 import root_validator
66
from marqo.tensor_search.models.score_modifiers_object import ScoreModifierLists
77

88

src/marqo/api/models/update_documents.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Dict, Any, List
22

3-
from pydantic import validator
3+
from pydantic.v1 import validator
44

55
from marqo.base_model import ImmutableStrictBaseModel
66
from marqo.api.exceptions import BadRequestError

src/marqo/base_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pydantic import BaseModel
1+
from pydantic.v1 import BaseModel
22

33

44
class MarqoBaseModel(BaseModel):

src/marqo/core/embed/embed.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,24 @@
22
from timeit import default_timer as timer
33
from typing import List, Optional, Union, Dict
44

5-
import pydantic
6-
7-
import marqo.api.exceptions as api_exceptions
8-
import marqo.s2_inference.errors as s2_inference_errors
95
from marqo import exceptions as base_exceptions
106
from marqo.core.index_management.index_management import IndexManagement
117
from marqo.core.inference.api import Inference
12-
from marqo.tensor_search import utils
8+
from marqo.logging import get_logger
139
from marqo.tensor_search.models.api_models import BulkSearchQueryEntity
1410
from marqo.tensor_search.models.private_models import ModelAuth
1511
from marqo.tensor_search.models.search import Qidx
1612
from marqo.tensor_search.telemetry import RequestMetricsStore
17-
from marqo.logging import get_logger
1813
from marqo.vespa.vespa_client import VespaClient
1914

2015
logger = get_logger(__name__)
2116

17+
2218
class EmbedContentType(str, Enum):
2319
Query = "query"
2420
Document = "document"
2521

22+
2623
class Embed:
2724
def __init__(self, vespa_client: VespaClient, index_management: IndexManagement, inference: Inference):
2825
self.vespa_client = vespa_client

src/marqo/core/inference/api/inference.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
from abc import ABC, abstractmethod
22
from typing import Optional, Dict, Any, List, Tuple, Union
33

4-
import pydantic
54
from numpy import ndarray
6-
from pydantic import StrictStr, root_validator
5+
from pydantic.v1 import StrictStr, root_validator, Field
76

87
from marqo.base_model import ImmutableBaseModel
98
from marqo.core.inference.api import Modality, PreprocessingConfigType
@@ -12,21 +11,21 @@
1211

1312

1413
class ModelConfig(ImmutableBaseModel):
15-
model_name: StrictStr = pydantic.Field(alias='modelName')
16-
model_properties: Optional[Dict[str, Any]] = pydantic.Field(default=None, alias='modelProperties')
17-
model_auth: Optional[ModelAuth] = pydantic.Field(default=None, alias='modelAuth')
18-
normalize_embeddings: bool = pydantic.Field(default=True, alias='normalizeEmbeddings')
14+
model_name: StrictStr = Field(alias='modelName')
15+
model_properties: Optional[Dict[str, Any]] = Field(default=None, alias='modelProperties')
16+
model_auth: Optional[ModelAuth] = Field(default=None, alias='modelAuth')
17+
normalize_embeddings: bool = Field(default=True, alias='normalizeEmbeddings')
1918

2019

2120
class InferenceRequest(ImmutableBaseModel):
2221
modality: Modality
23-
contents: List[str] = pydantic.Field(min_items=1)
24-
device: Optional[str] = pydantic.Field(default=None)
25-
model_config: ModelConfig = pydantic.Field(alias='modelConfig')
26-
preprocessing_config: PreprocessingConfigType = pydantic.Field(alias='preprocessingConfig')
27-
use_inference_cache: bool = pydantic.Field(default=False, alias='useInferenceCache')
22+
contents: List[str] = Field(min_items=1)
23+
device: Optional[str] = Field(default=None)
24+
model_config: ModelConfig = Field(alias='modelConfig')
25+
preprocessing_config: PreprocessingConfigType = Field(alias='preprocessingConfig')
26+
use_inference_cache: bool = Field(default=False, alias='useInferenceCache')
2827
# whether we should return error for individual content, when set to false, any error should fail the whole batch
29-
return_individual_error: bool = pydantic.Field(default=True, alias='returnIndividualError')
28+
return_individual_error: bool = Field(default=True, alias='returnIndividualError')
3029

3130
@root_validator(pre=False)
3231
def check_preprocessing_config_matches_modality(cls, values):
@@ -47,8 +46,8 @@ class InferenceErrorModel(ImmutableBaseModel):
4746
"""
4847
A model class to store error information for each individual content
4948
"""
50-
status_code: int = pydantic.Field(default=400)
51-
error_code: str = pydantic.Field(default='inference_error')
49+
status_code: int = Field(default=400)
50+
error_code: str = Field(default='inference_error')
5251
error_message: str
5352

5453

0 commit comments

Comments
 (0)