mixpeek 0.12.0__py3-none-any.whl → 0.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mixpeek/__init__.py +5 -79
- mixpeek/_hooks/__init__.py +5 -0
- mixpeek/_hooks/registration.py +13 -0
- mixpeek/_hooks/sdkhooks.py +76 -0
- mixpeek/_hooks/types.py +94 -0
- mixpeek/_version.py +11 -3
- mixpeek/assets.py +1561 -0
- mixpeek/basesdk.py +350 -0
- mixpeek/collections.py +1029 -0
- mixpeek/featureextractors.py +205 -0
- mixpeek/features.py +1181 -0
- mixpeek/health.py +167 -0
- mixpeek/httpclient.py +84 -0
- mixpeek/ingest.py +831 -0
- mixpeek/interactions.py +221 -0
- mixpeek/models/__init__.py +751 -0
- mixpeek/models/actionusage.py +16 -0
- mixpeek/models/apierror.py +22 -0
- mixpeek/models/apikey.py +25 -0
- mixpeek/models/apikeyupdate.py +49 -0
- mixpeek/models/assetfeatures.py +55 -0
- mixpeek/models/assetresponse.py +166 -0
- mixpeek/models/assets_model_searchquery.py +21 -0
- mixpeek/models/assetupdate.py +28 -0
- mixpeek/models/availableindexesresponse.py +23 -0
- mixpeek/models/availablemodels.py +12 -0
- mixpeek/models/boolindexparams.py +18 -0
- mixpeek/models/collectionmodel.py +70 -0
- mixpeek/models/collectionresult.py +73 -0
- mixpeek/models/create_api_key_organizations_users_user_email_api_keys_postop.py +23 -0
- mixpeek/models/create_collection_collections_postop.py +62 -0
- mixpeek/models/create_interaction_features_search_interactions_postop.py +59 -0
- mixpeek/models/createcollectionrequest.py +59 -0
- mixpeek/models/createnamespacerequest.py +62 -0
- mixpeek/models/datetimeindexparams.py +18 -0
- mixpeek/models/dateusage.py +22 -0
- mixpeek/models/db_model_paginationresponse.py +59 -0
- mixpeek/models/db_model_taskresponse.py +20 -0
- mixpeek/models/delete_api_key_organizations_users_user_email_api_keys_key_name_deleteop.py +23 -0
- mixpeek/models/delete_asset_assets_asset_id_deleteop.py +57 -0
- mixpeek/models/delete_collection_collections_collection_deleteop.py +59 -0
- mixpeek/models/delete_feature_features_feature_id_deleteop.py +57 -0
- mixpeek/models/delete_interaction_features_search_interactions_interaction_id_deleteop.py +59 -0
- mixpeek/models/delete_namespace_namespaces_namespace_deleteop.py +18 -0
- mixpeek/models/delete_user_organizations_users_user_email_deleteop.py +16 -0
- mixpeek/models/denseembedding.py +16 -0
- mixpeek/models/embeddingrequest.py +59 -0
- mixpeek/models/embeddingresponse.py +64 -0
- mixpeek/models/errormessage.py +13 -0
- mixpeek/models/errorresponse.py +21 -0
- mixpeek/models/facedetectsettings.py +52 -0
- mixpeek/models/featureextractionembeddingrequest.py +54 -0
- mixpeek/models/featureresponse.py +74 -0
- mixpeek/models/features_model_paginationresponse.py +59 -0
- mixpeek/models/featureupdaterequest.py +21 -0
- mixpeek/models/filtercondition.py +74 -0
- mixpeek/models/floatindexparams.py +18 -0
- mixpeek/models/full_asset_update_assets_asset_id_putop.py +69 -0
- mixpeek/models/full_feature_update_features_feature_id_putop.py +69 -0
- mixpeek/models/geoindexparams.py +18 -0
- mixpeek/models/get_asset_assets_asset_id_getop.py +73 -0
- mixpeek/models/get_asset_with_features_assets_asset_id_features_getop.py +73 -0
- mixpeek/models/get_collection_collections_collection_getop.py +59 -0
- mixpeek/models/get_feature_features_feature_id_getop.py +70 -0
- mixpeek/models/get_interaction_features_search_interactions_interaction_id_getop.py +59 -0
- mixpeek/models/get_namespace_namespaces_namespace_getop.py +18 -0
- mixpeek/models/get_task_tasks_task_id_getop.py +57 -0
- mixpeek/models/get_user_organizations_users_user_email_getop.py +16 -0
- mixpeek/models/groupbyoptions.py +71 -0
- mixpeek/models/groupbyoptionsasset.py +71 -0
- mixpeek/models/groupedassetdata.py +18 -0
- mixpeek/models/healthcheckresponse.py +13 -0
- mixpeek/models/httpvalidationerror.py +21 -0
- mixpeek/models/imagedescribesettings.py +82 -0
- mixpeek/models/imagedetectsettings.py +53 -0
- mixpeek/models/imagereadsettings.py +71 -0
- mixpeek/models/imagesettings.py +79 -0
- mixpeek/models/ingest_image_url_ingest_images_url_postop.py +59 -0
- mixpeek/models/ingest_text_ingest_text_postop.py +59 -0
- mixpeek/models/ingest_video_url_ingest_videos_url_postop.py +59 -0
- mixpeek/models/inputtype.py +11 -0
- mixpeek/models/integerindexparams.py +24 -0
- mixpeek/models/interactionresponse.py +87 -0
- mixpeek/models/interactiontype.py +11 -0
- mixpeek/models/jsonimageoutputsettings.py +55 -0
- mixpeek/models/jsontextoutputsettings.py +55 -0
- mixpeek/models/jsonvideooutputsettings.py +55 -0
- mixpeek/models/keywordindexparams.py +21 -0
- mixpeek/models/kill_task_tasks_task_id_deleteop.py +57 -0
- mixpeek/models/list_assets_assets_postop.py +77 -0
- mixpeek/models/list_collections_collections_getop.py +65 -0
- mixpeek/models/list_features_features_postop.py +79 -0
- mixpeek/models/list_interactions_features_search_interactions_getop.py +96 -0
- mixpeek/models/listassetsrequest.py +75 -0
- mixpeek/models/listassetsresponse.py +22 -0
- mixpeek/models/listcollectionsresponse.py +22 -0
- mixpeek/models/listfeaturesrequest.py +77 -0
- mixpeek/models/listfeaturesresponse.py +22 -0
- mixpeek/models/logicaloperator_input.py +88 -0
- mixpeek/models/logicaloperator_output.py +103 -0
- mixpeek/models/logodetectsettings.py +52 -0
- mixpeek/models/modality.py +13 -0
- mixpeek/models/modeldetails.py +57 -0
- mixpeek/models/namespaceresponse.py +54 -0
- mixpeek/models/organizationmodel.py +45 -0
- mixpeek/models/partial_asset_update_assets_asset_id_patchop.py +69 -0
- mixpeek/models/payloadindexconfig.py +94 -0
- mixpeek/models/payloadindextype.py +17 -0
- mixpeek/models/payloadschematype.py +15 -0
- mixpeek/models/percolaterequest.py +57 -0
- mixpeek/models/permission.py +10 -0
- mixpeek/models/processimageurlinput.py +99 -0
- mixpeek/models/processtextinput.py +94 -0
- mixpeek/models/processvideourlinput.py +99 -0
- mixpeek/models/querysettings.py +56 -0
- mixpeek/models/rerankingoptions.py +47 -0
- mixpeek/models/search_assets_assets_search_postop.py +59 -0
- mixpeek/models/search_features_features_search_postop.py +96 -0
- mixpeek/models/search_model_searchquery_input.py +76 -0
- mixpeek/models/searchassetsrequest.py +78 -0
- mixpeek/models/searchinteraction.py +82 -0
- mixpeek/models/searchquery_output.py +79 -0
- mixpeek/models/searchrequestfeatures_input.py +151 -0
- mixpeek/models/searchrequestfeatures_output.py +151 -0
- mixpeek/models/sortoption.py +28 -0
- mixpeek/models/sparseembedding.py +21 -0
- mixpeek/models/tasks_model_taskresponse.py +24 -0
- mixpeek/models/taskstatus.py +16 -0
- mixpeek/models/textindexparams.py +31 -0
- mixpeek/models/textsettings.py +61 -0
- mixpeek/models/tokenizertype.py +11 -0
- mixpeek/models/update_api_key_organizations_users_user_email_api_keys_key_name_patchop.py +30 -0
- mixpeek/models/update_collection_collections_collection_putop.py +74 -0
- mixpeek/models/update_namespace_namespaces_namespace_putop.py +28 -0
- mixpeek/models/updateassetrequest.py +60 -0
- mixpeek/models/updatenamespacerequest.py +26 -0
- mixpeek/models/usage.py +18 -0
- mixpeek/models/usermodel_input.py +36 -0
- mixpeek/models/usermodel_output.py +36 -0
- mixpeek/models/uuidindexparams.py +21 -0
- mixpeek/models/validationerror.py +26 -0
- mixpeek/models/vectormodel.py +11 -0
- mixpeek/models/vectortype.py +9 -0
- mixpeek/models/videodescribesettings.py +82 -0
- mixpeek/models/videodetectsettings.py +53 -0
- mixpeek/models/videoreadsettings.py +71 -0
- mixpeek/models/videosettings.py +101 -0
- mixpeek/models/videotranscriptionsettings.py +69 -0
- mixpeek/namespaces.py +1143 -0
- mixpeek/organizations.py +1508 -0
- mixpeek/py.typed +1 -0
- mixpeek/sdk.py +135 -0
- mixpeek/sdkconfiguration.py +45 -0
- mixpeek/searchinteractions.py +647 -0
- mixpeek/tasks.py +387 -0
- mixpeek/types/__init__.py +19 -29
- mixpeek/types/basemodel.py +39 -0
- mixpeek/utils/__init__.py +97 -0
- mixpeek/utils/annotations.py +55 -0
- mixpeek/utils/enums.py +34 -0
- mixpeek/utils/eventstreaming.py +238 -0
- mixpeek/utils/forms.py +202 -0
- mixpeek/utils/headers.py +136 -0
- mixpeek/utils/logger.py +27 -0
- mixpeek/utils/metadata.py +118 -0
- mixpeek/utils/queryparams.py +205 -0
- mixpeek/utils/requestbodies.py +66 -0
- mixpeek/utils/retries.py +217 -0
- mixpeek/utils/security.py +174 -0
- mixpeek/utils/serializers.py +215 -0
- mixpeek/utils/url.py +155 -0
- mixpeek/utils/values.py +134 -0
- mixpeek-0.13.dist-info/METADATA +439 -0
- mixpeek-0.13.dist-info/RECORD +176 -0
- {mixpeek-0.12.0.dist-info → mixpeek-0.13.dist-info}/WHEEL +1 -1
- py.typed +1 -0
- mixpeek/_base_client.py +0 -2041
- mixpeek/_client.py +0 -444
- mixpeek/_compat.py +0 -221
- mixpeek/_constants.py +0 -14
- mixpeek/_exceptions.py +0 -108
- mixpeek/_files.py +0 -123
- mixpeek/_models.py +0 -788
- mixpeek/_qs.py +0 -150
- mixpeek/_resource.py +0 -43
- mixpeek/_response.py +0 -824
- mixpeek/_streaming.py +0 -333
- mixpeek/_types.py +0 -219
- mixpeek/_utils/__init__.py +0 -56
- mixpeek/_utils/_logs.py +0 -25
- mixpeek/_utils/_proxy.py +0 -62
- mixpeek/_utils/_reflection.py +0 -42
- mixpeek/_utils/_streams.py +0 -12
- mixpeek/_utils/_sync.py +0 -81
- mixpeek/_utils/_transform.py +0 -387
- mixpeek/_utils/_typing.py +0 -120
- mixpeek/_utils/_utils.py +0 -414
- mixpeek/lib/.keep +0 -4
- mixpeek/resources/__init__.py +0 -117
- mixpeek/resources/accounts.py +0 -271
- mixpeek/resources/assets/__init__.py +0 -33
- mixpeek/resources/assets/assets.py +0 -708
- mixpeek/resources/assets/features.py +0 -172
- mixpeek/resources/collections.py +0 -283
- mixpeek/resources/entities/__init__.py +0 -47
- mixpeek/resources/entities/entities.py +0 -134
- mixpeek/resources/entities/faces.py +0 -514
- mixpeek/resources/entities/labels.py +0 -388
- mixpeek/resources/features/__init__.py +0 -33
- mixpeek/resources/features/features.py +0 -562
- mixpeek/resources/features/search.py +0 -731
- mixpeek/resources/healthcheck.py +0 -135
- mixpeek/resources/index/__init__.py +0 -47
- mixpeek/resources/index/images.py +0 -249
- mixpeek/resources/index/index.py +0 -289
- mixpeek/resources/index/videos.py +0 -249
- mixpeek/resources/tasks.py +0 -258
- mixpeek/types/account_update_params.py +0 -28
- mixpeek/types/asset_create_params.py +0 -36
- mixpeek/types/asset_create_response.py +0 -15
- mixpeek/types/asset_response.py +0 -46
- mixpeek/types/asset_search_params.py +0 -43
- mixpeek/types/asset_search_response.py +0 -15
- mixpeek/types/asset_update_params.py +0 -25
- mixpeek/types/asset_update_response.py +0 -11
- mixpeek/types/assets/__init__.py +0 -3
- mixpeek/types/collection_list_params.py +0 -19
- mixpeek/types/collection_list_response.py +0 -14
- mixpeek/types/entities/__init__.py +0 -13
- mixpeek/types/entities/face_create_params.py +0 -21
- mixpeek/types/entities/face_list_params.py +0 -18
- mixpeek/types/entities/face_list_response.py +0 -15
- mixpeek/types/entities/face_response.py +0 -17
- mixpeek/types/entities/face_update_params.py +0 -22
- mixpeek/types/entities/label_list_params.py +0 -18
- mixpeek/types/entities/label_list_response.py +0 -30
- mixpeek/types/entities/label_response.py +0 -30
- mixpeek/types/entities/label_update_params.py +0 -21
- mixpeek/types/feature.py +0 -32
- mixpeek/types/feature_list_params.py +0 -37
- mixpeek/types/feature_list_response.py +0 -28
- mixpeek/types/feature_retrieve_params.py +0 -18
- mixpeek/types/feature_update_params.py +0 -16
- mixpeek/types/features/__init__.py +0 -8
- mixpeek/types/features/search_feedback_params.py +0 -23
- mixpeek/types/features/search_file_params.py +0 -29
- mixpeek/types/features/search_text_params.py +0 -72
- mixpeek/types/features/search_url_params.py +0 -72
- mixpeek/types/grouped_asset_data.py +0 -24
- mixpeek/types/health_check_response.py +0 -10
- mixpeek/types/index/__init__.py +0 -8
- mixpeek/types/index/image_url_params.py +0 -135
- mixpeek/types/index/image_url_response.py +0 -20
- mixpeek/types/index/video_url_params.py +0 -154
- mixpeek/types/index/video_url_response.py +0 -20
- mixpeek/types/index_text_params.py +0 -77
- mixpeek/types/index_text_response.py +0 -14
- mixpeek/types/shared/__init__.py +0 -7
- mixpeek/types/shared/filter_condition.py +0 -19
- mixpeek/types/shared/logical_operator.py +0 -12
- mixpeek/types/shared/model_pagination_response.py +0 -21
- mixpeek/types/shared/sort_option.py +0 -15
- mixpeek/types/shared/task_response.py +0 -15
- mixpeek/types/shared_params/__init__.py +0 -4
- mixpeek/types/shared_params/logical_operator.py +0 -13
- mixpeek/types/shared_params/sort_option.py +0 -15
- mixpeek/types/user.py +0 -34
- mixpeek-0.12.0.dist-info/METADATA +0 -345
- mixpeek-0.12.0.dist-info/RECORD +0 -99
- mixpeek-0.12.0.dist-info/licenses/LICENSE +0 -201
@@ -0,0 +1,82 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from .vectormodel import VectorModel
|
5
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
6
|
+
from pydantic import model_serializer
|
7
|
+
from typing import Optional
|
8
|
+
from typing_extensions import NotRequired, TypedDict
|
9
|
+
|
10
|
+
|
11
|
+
class ImageDescribeSettingsJSONOutputTypedDict(TypedDict):
|
12
|
+
r"""JSON format for the response"""
|
13
|
+
|
14
|
+
|
15
|
+
class ImageDescribeSettingsJSONOutput(BaseModel):
|
16
|
+
r"""JSON format for the response"""
|
17
|
+
|
18
|
+
|
19
|
+
class ImageDescribeSettingsTypedDict(TypedDict):
|
20
|
+
prompt: NotRequired[Nullable[str]]
|
21
|
+
r"""Prompt for image description"""
|
22
|
+
enabled: NotRequired[bool]
|
23
|
+
r"""Enable image description"""
|
24
|
+
max_length: NotRequired[Nullable[int]]
|
25
|
+
r"""Maximum length of the description"""
|
26
|
+
json_output: NotRequired[ImageDescribeSettingsJSONOutputTypedDict]
|
27
|
+
r"""JSON format for the response"""
|
28
|
+
vector_index: NotRequired[Nullable[VectorModel]]
|
29
|
+
r"""Name of the vector model to use for embedding the text output. If vector_index is duplicated, the vector will be overwritten."""
|
30
|
+
|
31
|
+
|
32
|
+
class ImageDescribeSettings(BaseModel):
|
33
|
+
prompt: OptionalNullable[str] = UNSET
|
34
|
+
r"""Prompt for image description"""
|
35
|
+
|
36
|
+
enabled: Optional[bool] = True
|
37
|
+
r"""Enable image description"""
|
38
|
+
|
39
|
+
max_length: OptionalNullable[int] = UNSET
|
40
|
+
r"""Maximum length of the description"""
|
41
|
+
|
42
|
+
json_output: Optional[ImageDescribeSettingsJSONOutput] = None
|
43
|
+
r"""JSON format for the response"""
|
44
|
+
|
45
|
+
vector_index: OptionalNullable[VectorModel] = UNSET
|
46
|
+
r"""Name of the vector model to use for embedding the text output. If vector_index is duplicated, the vector will be overwritten."""
|
47
|
+
|
48
|
+
@model_serializer(mode="wrap")
|
49
|
+
def serialize_model(self, handler):
|
50
|
+
optional_fields = [
|
51
|
+
"prompt",
|
52
|
+
"enabled",
|
53
|
+
"max_length",
|
54
|
+
"json_output",
|
55
|
+
"vector_index",
|
56
|
+
]
|
57
|
+
nullable_fields = ["prompt", "max_length", "vector_index"]
|
58
|
+
null_default_fields = []
|
59
|
+
|
60
|
+
serialized = handler(self)
|
61
|
+
|
62
|
+
m = {}
|
63
|
+
|
64
|
+
for n, f in self.model_fields.items():
|
65
|
+
k = f.alias or n
|
66
|
+
val = serialized.get(k)
|
67
|
+
serialized.pop(k, None)
|
68
|
+
|
69
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
70
|
+
is_set = (
|
71
|
+
self.__pydantic_fields_set__.intersection({n})
|
72
|
+
or k in null_default_fields
|
73
|
+
) # pylint: disable=no-member
|
74
|
+
|
75
|
+
if val is not None and val != UNSET_SENTINEL:
|
76
|
+
m[k] = val
|
77
|
+
elif val != UNSET_SENTINEL and (
|
78
|
+
not k in optional_fields or (optional_nullable and is_set)
|
79
|
+
):
|
80
|
+
m[k] = val
|
81
|
+
|
82
|
+
return m
|
@@ -0,0 +1,53 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from .facedetectsettings import FaceDetectSettings, FaceDetectSettingsTypedDict
|
5
|
+
from .logodetectsettings import LogoDetectSettings, LogoDetectSettingsTypedDict
|
6
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
7
|
+
from pydantic import model_serializer
|
8
|
+
from typing_extensions import NotRequired, TypedDict
|
9
|
+
|
10
|
+
|
11
|
+
class ImageDetectSettingsTypedDict(TypedDict):
|
12
|
+
faces: NotRequired[Nullable[FaceDetectSettingsTypedDict]]
|
13
|
+
r"""Settings for face detection"""
|
14
|
+
logos: NotRequired[Nullable[LogoDetectSettingsTypedDict]]
|
15
|
+
r"""Settings for logo detection"""
|
16
|
+
|
17
|
+
|
18
|
+
class ImageDetectSettings(BaseModel):
|
19
|
+
faces: OptionalNullable[FaceDetectSettings] = UNSET
|
20
|
+
r"""Settings for face detection"""
|
21
|
+
|
22
|
+
logos: OptionalNullable[LogoDetectSettings] = UNSET
|
23
|
+
r"""Settings for logo detection"""
|
24
|
+
|
25
|
+
@model_serializer(mode="wrap")
|
26
|
+
def serialize_model(self, handler):
|
27
|
+
optional_fields = ["faces", "logos"]
|
28
|
+
nullable_fields = ["faces", "logos"]
|
29
|
+
null_default_fields = []
|
30
|
+
|
31
|
+
serialized = handler(self)
|
32
|
+
|
33
|
+
m = {}
|
34
|
+
|
35
|
+
for n, f in self.model_fields.items():
|
36
|
+
k = f.alias or n
|
37
|
+
val = serialized.get(k)
|
38
|
+
serialized.pop(k, None)
|
39
|
+
|
40
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
41
|
+
is_set = (
|
42
|
+
self.__pydantic_fields_set__.intersection({n})
|
43
|
+
or k in null_default_fields
|
44
|
+
) # pylint: disable=no-member
|
45
|
+
|
46
|
+
if val is not None and val != UNSET_SENTINEL:
|
47
|
+
m[k] = val
|
48
|
+
elif val != UNSET_SENTINEL and (
|
49
|
+
not k in optional_fields or (optional_nullable and is_set)
|
50
|
+
):
|
51
|
+
m[k] = val
|
52
|
+
|
53
|
+
return m
|
@@ -0,0 +1,71 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from .vectormodel import VectorModel
|
5
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
6
|
+
from pydantic import model_serializer
|
7
|
+
from typing import Optional
|
8
|
+
from typing_extensions import NotRequired, TypedDict
|
9
|
+
|
10
|
+
|
11
|
+
class ImageReadSettingsJSONOutputTypedDict(TypedDict):
|
12
|
+
r"""JSON format for the response"""
|
13
|
+
|
14
|
+
|
15
|
+
class ImageReadSettingsJSONOutput(BaseModel):
|
16
|
+
r"""JSON format for the response"""
|
17
|
+
|
18
|
+
|
19
|
+
class ImageReadSettingsTypedDict(TypedDict):
|
20
|
+
enabled: NotRequired[bool]
|
21
|
+
r"""Enable image reading"""
|
22
|
+
prompt: NotRequired[Nullable[str]]
|
23
|
+
r"""Prompt for reading on-screen text"""
|
24
|
+
json_output: NotRequired[ImageReadSettingsJSONOutputTypedDict]
|
25
|
+
r"""JSON format for the response"""
|
26
|
+
vector_index: NotRequired[Nullable[VectorModel]]
|
27
|
+
r"""Name of the vector model to use for embedding the text output. If vector_index is duplicated, the vector will be overwritten."""
|
28
|
+
|
29
|
+
|
30
|
+
class ImageReadSettings(BaseModel):
|
31
|
+
enabled: Optional[bool] = True
|
32
|
+
r"""Enable image reading"""
|
33
|
+
|
34
|
+
prompt: OptionalNullable[str] = UNSET
|
35
|
+
r"""Prompt for reading on-screen text"""
|
36
|
+
|
37
|
+
json_output: Optional[ImageReadSettingsJSONOutput] = None
|
38
|
+
r"""JSON format for the response"""
|
39
|
+
|
40
|
+
vector_index: OptionalNullable[VectorModel] = UNSET
|
41
|
+
r"""Name of the vector model to use for embedding the text output. If vector_index is duplicated, the vector will be overwritten."""
|
42
|
+
|
43
|
+
@model_serializer(mode="wrap")
|
44
|
+
def serialize_model(self, handler):
|
45
|
+
optional_fields = ["enabled", "prompt", "json_output", "vector_index"]
|
46
|
+
nullable_fields = ["prompt", "vector_index"]
|
47
|
+
null_default_fields = []
|
48
|
+
|
49
|
+
serialized = handler(self)
|
50
|
+
|
51
|
+
m = {}
|
52
|
+
|
53
|
+
for n, f in self.model_fields.items():
|
54
|
+
k = f.alias or n
|
55
|
+
val = serialized.get(k)
|
56
|
+
serialized.pop(k, None)
|
57
|
+
|
58
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
59
|
+
is_set = (
|
60
|
+
self.__pydantic_fields_set__.intersection({n})
|
61
|
+
or k in null_default_fields
|
62
|
+
) # pylint: disable=no-member
|
63
|
+
|
64
|
+
if val is not None and val != UNSET_SENTINEL:
|
65
|
+
m[k] = val
|
66
|
+
elif val != UNSET_SENTINEL and (
|
67
|
+
not k in optional_fields or (optional_nullable and is_set)
|
68
|
+
):
|
69
|
+
m[k] = val
|
70
|
+
|
71
|
+
return m
|
@@ -0,0 +1,79 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from .embeddingrequest import EmbeddingRequest, EmbeddingRequestTypedDict
|
5
|
+
from .imagedescribesettings import ImageDescribeSettings, ImageDescribeSettingsTypedDict
|
6
|
+
from .imagedetectsettings import ImageDetectSettings, ImageDetectSettingsTypedDict
|
7
|
+
from .imagereadsettings import ImageReadSettings, ImageReadSettingsTypedDict
|
8
|
+
from .jsonimageoutputsettings import (
|
9
|
+
JSONImageOutputSettings,
|
10
|
+
JSONImageOutputSettingsTypedDict,
|
11
|
+
)
|
12
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
13
|
+
from pydantic import model_serializer
|
14
|
+
from typing import List, Optional
|
15
|
+
from typing_extensions import NotRequired, TypedDict
|
16
|
+
|
17
|
+
|
18
|
+
class ImageSettingsTypedDict(TypedDict):
|
19
|
+
read: NotRequired[Nullable[ImageReadSettingsTypedDict]]
|
20
|
+
r"""Settings for reading and analyzing image content."""
|
21
|
+
embed: NotRequired[List[EmbeddingRequestTypedDict]]
|
22
|
+
r"""List of embedding settings for generating multiple embeddings. If url is provided, value must be None.
|
23
|
+
Default: [{type: 'url', vector_index: 'multimodal'}] if none provided.
|
24
|
+
"""
|
25
|
+
describe: NotRequired[Nullable[ImageDescribeSettingsTypedDict]]
|
26
|
+
r"""Settings for generating image descriptions."""
|
27
|
+
detect: NotRequired[Nullable[ImageDetectSettingsTypedDict]]
|
28
|
+
r"""Settings for object detection in images."""
|
29
|
+
json_output: NotRequired[Nullable[JSONImageOutputSettingsTypedDict]]
|
30
|
+
r"""Settings for structured JSON output of image analysis."""
|
31
|
+
|
32
|
+
|
33
|
+
class ImageSettings(BaseModel):
|
34
|
+
read: OptionalNullable[ImageReadSettings] = UNSET
|
35
|
+
r"""Settings for reading and analyzing image content."""
|
36
|
+
|
37
|
+
embed: Optional[List[EmbeddingRequest]] = None
|
38
|
+
r"""List of embedding settings for generating multiple embeddings. If url is provided, value must be None.
|
39
|
+
Default: [{type: 'url', vector_index: 'multimodal'}] if none provided.
|
40
|
+
"""
|
41
|
+
|
42
|
+
describe: OptionalNullable[ImageDescribeSettings] = UNSET
|
43
|
+
r"""Settings for generating image descriptions."""
|
44
|
+
|
45
|
+
detect: OptionalNullable[ImageDetectSettings] = UNSET
|
46
|
+
r"""Settings for object detection in images."""
|
47
|
+
|
48
|
+
json_output: OptionalNullable[JSONImageOutputSettings] = UNSET
|
49
|
+
r"""Settings for structured JSON output of image analysis."""
|
50
|
+
|
51
|
+
@model_serializer(mode="wrap")
|
52
|
+
def serialize_model(self, handler):
|
53
|
+
optional_fields = ["read", "embed", "describe", "detect", "json_output"]
|
54
|
+
nullable_fields = ["read", "describe", "detect", "json_output"]
|
55
|
+
null_default_fields = []
|
56
|
+
|
57
|
+
serialized = handler(self)
|
58
|
+
|
59
|
+
m = {}
|
60
|
+
|
61
|
+
for n, f in self.model_fields.items():
|
62
|
+
k = f.alias or n
|
63
|
+
val = serialized.get(k)
|
64
|
+
serialized.pop(k, None)
|
65
|
+
|
66
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
67
|
+
is_set = (
|
68
|
+
self.__pydantic_fields_set__.intersection({n})
|
69
|
+
or k in null_default_fields
|
70
|
+
) # pylint: disable=no-member
|
71
|
+
|
72
|
+
if val is not None and val != UNSET_SENTINEL:
|
73
|
+
m[k] = val
|
74
|
+
elif val != UNSET_SENTINEL and (
|
75
|
+
not k in optional_fields or (optional_nullable and is_set)
|
76
|
+
):
|
77
|
+
m[k] = val
|
78
|
+
|
79
|
+
return m
|
@@ -0,0 +1,59 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from .processimageurlinput import ProcessImageURLInput, ProcessImageURLInputTypedDict
|
5
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
6
|
+
from mixpeek.utils import FieldMetadata, HeaderMetadata, RequestMetadata
|
7
|
+
import pydantic
|
8
|
+
from pydantic import model_serializer
|
9
|
+
from typing_extensions import Annotated, NotRequired, TypedDict
|
10
|
+
|
11
|
+
|
12
|
+
class IngestImageURLIngestImagesURLPostRequestTypedDict(TypedDict):
|
13
|
+
process_image_url_input: ProcessImageURLInputTypedDict
|
14
|
+
x_namespace: NotRequired[Nullable[str]]
|
15
|
+
r"""Optional namespace for data isolation. This can be a namespace name or namespace ID. Example: 'netflix_prod' or 'ns_1234567890'. To create a namespace, use the /namespaces endpoint."""
|
16
|
+
|
17
|
+
|
18
|
+
class IngestImageURLIngestImagesURLPostRequest(BaseModel):
|
19
|
+
process_image_url_input: Annotated[
|
20
|
+
ProcessImageURLInput,
|
21
|
+
FieldMetadata(request=RequestMetadata(media_type="application/json")),
|
22
|
+
]
|
23
|
+
|
24
|
+
x_namespace: Annotated[
|
25
|
+
OptionalNullable[str],
|
26
|
+
pydantic.Field(alias="X-Namespace"),
|
27
|
+
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
|
28
|
+
] = UNSET
|
29
|
+
r"""Optional namespace for data isolation. This can be a namespace name or namespace ID. Example: 'netflix_prod' or 'ns_1234567890'. To create a namespace, use the /namespaces endpoint."""
|
30
|
+
|
31
|
+
@model_serializer(mode="wrap")
|
32
|
+
def serialize_model(self, handler):
|
33
|
+
optional_fields = ["X-Namespace"]
|
34
|
+
nullable_fields = ["X-Namespace"]
|
35
|
+
null_default_fields = []
|
36
|
+
|
37
|
+
serialized = handler(self)
|
38
|
+
|
39
|
+
m = {}
|
40
|
+
|
41
|
+
for n, f in self.model_fields.items():
|
42
|
+
k = f.alias or n
|
43
|
+
val = serialized.get(k)
|
44
|
+
serialized.pop(k, None)
|
45
|
+
|
46
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
47
|
+
is_set = (
|
48
|
+
self.__pydantic_fields_set__.intersection({n})
|
49
|
+
or k in null_default_fields
|
50
|
+
) # pylint: disable=no-member
|
51
|
+
|
52
|
+
if val is not None and val != UNSET_SENTINEL:
|
53
|
+
m[k] = val
|
54
|
+
elif val != UNSET_SENTINEL and (
|
55
|
+
not k in optional_fields or (optional_nullable and is_set)
|
56
|
+
):
|
57
|
+
m[k] = val
|
58
|
+
|
59
|
+
return m
|
@@ -0,0 +1,59 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from .processtextinput import ProcessTextInput, ProcessTextInputTypedDict
|
5
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
6
|
+
from mixpeek.utils import FieldMetadata, HeaderMetadata, RequestMetadata
|
7
|
+
import pydantic
|
8
|
+
from pydantic import model_serializer
|
9
|
+
from typing_extensions import Annotated, NotRequired, TypedDict
|
10
|
+
|
11
|
+
|
12
|
+
class IngestTextIngestTextPostRequestTypedDict(TypedDict):
|
13
|
+
process_text_input: ProcessTextInputTypedDict
|
14
|
+
x_namespace: NotRequired[Nullable[str]]
|
15
|
+
r"""Optional namespace for data isolation. This can be a namespace name or namespace ID. Example: 'netflix_prod' or 'ns_1234567890'. To create a namespace, use the /namespaces endpoint."""
|
16
|
+
|
17
|
+
|
18
|
+
class IngestTextIngestTextPostRequest(BaseModel):
|
19
|
+
process_text_input: Annotated[
|
20
|
+
ProcessTextInput,
|
21
|
+
FieldMetadata(request=RequestMetadata(media_type="application/json")),
|
22
|
+
]
|
23
|
+
|
24
|
+
x_namespace: Annotated[
|
25
|
+
OptionalNullable[str],
|
26
|
+
pydantic.Field(alias="X-Namespace"),
|
27
|
+
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
|
28
|
+
] = UNSET
|
29
|
+
r"""Optional namespace for data isolation. This can be a namespace name or namespace ID. Example: 'netflix_prod' or 'ns_1234567890'. To create a namespace, use the /namespaces endpoint."""
|
30
|
+
|
31
|
+
@model_serializer(mode="wrap")
|
32
|
+
def serialize_model(self, handler):
|
33
|
+
optional_fields = ["X-Namespace"]
|
34
|
+
nullable_fields = ["X-Namespace"]
|
35
|
+
null_default_fields = []
|
36
|
+
|
37
|
+
serialized = handler(self)
|
38
|
+
|
39
|
+
m = {}
|
40
|
+
|
41
|
+
for n, f in self.model_fields.items():
|
42
|
+
k = f.alias or n
|
43
|
+
val = serialized.get(k)
|
44
|
+
serialized.pop(k, None)
|
45
|
+
|
46
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
47
|
+
is_set = (
|
48
|
+
self.__pydantic_fields_set__.intersection({n})
|
49
|
+
or k in null_default_fields
|
50
|
+
) # pylint: disable=no-member
|
51
|
+
|
52
|
+
if val is not None and val != UNSET_SENTINEL:
|
53
|
+
m[k] = val
|
54
|
+
elif val != UNSET_SENTINEL and (
|
55
|
+
not k in optional_fields or (optional_nullable and is_set)
|
56
|
+
):
|
57
|
+
m[k] = val
|
58
|
+
|
59
|
+
return m
|
@@ -0,0 +1,59 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from .processvideourlinput import ProcessVideoURLInput, ProcessVideoURLInputTypedDict
|
5
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
6
|
+
from mixpeek.utils import FieldMetadata, HeaderMetadata, RequestMetadata
|
7
|
+
import pydantic
|
8
|
+
from pydantic import model_serializer
|
9
|
+
from typing_extensions import Annotated, NotRequired, TypedDict
|
10
|
+
|
11
|
+
|
12
|
+
class IngestVideoURLIngestVideosURLPostRequestTypedDict(TypedDict):
|
13
|
+
process_video_url_input: ProcessVideoURLInputTypedDict
|
14
|
+
x_namespace: NotRequired[Nullable[str]]
|
15
|
+
r"""Optional namespace for data isolation. This can be a namespace name or namespace ID. Example: 'netflix_prod' or 'ns_1234567890'. To create a namespace, use the /namespaces endpoint."""
|
16
|
+
|
17
|
+
|
18
|
+
class IngestVideoURLIngestVideosURLPostRequest(BaseModel):
|
19
|
+
process_video_url_input: Annotated[
|
20
|
+
ProcessVideoURLInput,
|
21
|
+
FieldMetadata(request=RequestMetadata(media_type="application/json")),
|
22
|
+
]
|
23
|
+
|
24
|
+
x_namespace: Annotated[
|
25
|
+
OptionalNullable[str],
|
26
|
+
pydantic.Field(alias="X-Namespace"),
|
27
|
+
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
|
28
|
+
] = UNSET
|
29
|
+
r"""Optional namespace for data isolation. This can be a namespace name or namespace ID. Example: 'netflix_prod' or 'ns_1234567890'. To create a namespace, use the /namespaces endpoint."""
|
30
|
+
|
31
|
+
@model_serializer(mode="wrap")
|
32
|
+
def serialize_model(self, handler):
|
33
|
+
optional_fields = ["X-Namespace"]
|
34
|
+
nullable_fields = ["X-Namespace"]
|
35
|
+
null_default_fields = []
|
36
|
+
|
37
|
+
serialized = handler(self)
|
38
|
+
|
39
|
+
m = {}
|
40
|
+
|
41
|
+
for n, f in self.model_fields.items():
|
42
|
+
k = f.alias or n
|
43
|
+
val = serialized.get(k)
|
44
|
+
serialized.pop(k, None)
|
45
|
+
|
46
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
47
|
+
is_set = (
|
48
|
+
self.__pydantic_fields_set__.intersection({n})
|
49
|
+
or k in null_default_fields
|
50
|
+
) # pylint: disable=no-member
|
51
|
+
|
52
|
+
if val is not None and val != UNSET_SENTINEL:
|
53
|
+
m[k] = val
|
54
|
+
elif val != UNSET_SENTINEL and (
|
55
|
+
not k in optional_fields or (optional_nullable and is_set)
|
56
|
+
):
|
57
|
+
m[k] = val
|
58
|
+
|
59
|
+
return m
|
@@ -0,0 +1,24 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from mixpeek.types import BaseModel
|
5
|
+
from typing import Optional
|
6
|
+
from typing_extensions import NotRequired, TypedDict
|
7
|
+
|
8
|
+
|
9
|
+
class IntegerIndexParamsTypedDict(TypedDict):
|
10
|
+
r"""Configuration for integer index"""
|
11
|
+
|
12
|
+
type: NotRequired[str]
|
13
|
+
lookup: NotRequired[bool]
|
14
|
+
range: NotRequired[bool]
|
15
|
+
|
16
|
+
|
17
|
+
class IntegerIndexParams(BaseModel):
|
18
|
+
r"""Configuration for integer index"""
|
19
|
+
|
20
|
+
type: Optional[str] = "integer"
|
21
|
+
|
22
|
+
lookup: Optional[bool] = True
|
23
|
+
|
24
|
+
range: Optional[bool] = True
|
@@ -0,0 +1,87 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from .interactiontype import InteractionType
|
5
|
+
from .searchrequestfeatures_output import (
|
6
|
+
SearchRequestFeaturesOutput,
|
7
|
+
SearchRequestFeaturesOutputTypedDict,
|
8
|
+
)
|
9
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
10
|
+
from pydantic import model_serializer
|
11
|
+
from typing_extensions import NotRequired, TypedDict
|
12
|
+
|
13
|
+
|
14
|
+
class InteractionResponseMetadataTypedDict(TypedDict):
|
15
|
+
pass
|
16
|
+
|
17
|
+
|
18
|
+
class InteractionResponseMetadata(BaseModel):
|
19
|
+
pass
|
20
|
+
|
21
|
+
|
22
|
+
class InteractionResponseTypedDict(TypedDict):
|
23
|
+
feature_id: str
|
24
|
+
r"""ID of the item that was interacted with"""
|
25
|
+
interaction_type: InteractionType
|
26
|
+
interaction_id: str
|
27
|
+
r"""Unique identifier for this interaction"""
|
28
|
+
search_request: NotRequired[Nullable[SearchRequestFeaturesOutputTypedDict]]
|
29
|
+
r"""The search request that led to this interaction"""
|
30
|
+
position: NotRequired[Nullable[int]]
|
31
|
+
r"""Position in search results where interaction occurred"""
|
32
|
+
metadata: NotRequired[Nullable[InteractionResponseMetadataTypedDict]]
|
33
|
+
r"""Additional context about the interaction"""
|
34
|
+
session_id: NotRequired[Nullable[str]]
|
35
|
+
r"""Search session identifier"""
|
36
|
+
|
37
|
+
|
38
|
+
class InteractionResponse(BaseModel):
|
39
|
+
feature_id: str
|
40
|
+
r"""ID of the item that was interacted with"""
|
41
|
+
|
42
|
+
interaction_type: InteractionType
|
43
|
+
|
44
|
+
interaction_id: str
|
45
|
+
r"""Unique identifier for this interaction"""
|
46
|
+
|
47
|
+
search_request: OptionalNullable[SearchRequestFeaturesOutput] = UNSET
|
48
|
+
r"""The search request that led to this interaction"""
|
49
|
+
|
50
|
+
position: OptionalNullable[int] = UNSET
|
51
|
+
r"""Position in search results where interaction occurred"""
|
52
|
+
|
53
|
+
metadata: OptionalNullable[InteractionResponseMetadata] = UNSET
|
54
|
+
r"""Additional context about the interaction"""
|
55
|
+
|
56
|
+
session_id: OptionalNullable[str] = UNSET
|
57
|
+
r"""Search session identifier"""
|
58
|
+
|
59
|
+
@model_serializer(mode="wrap")
|
60
|
+
def serialize_model(self, handler):
|
61
|
+
optional_fields = ["search_request", "position", "metadata", "session_id"]
|
62
|
+
nullable_fields = ["search_request", "position", "metadata", "session_id"]
|
63
|
+
null_default_fields = []
|
64
|
+
|
65
|
+
serialized = handler(self)
|
66
|
+
|
67
|
+
m = {}
|
68
|
+
|
69
|
+
for n, f in self.model_fields.items():
|
70
|
+
k = f.alias or n
|
71
|
+
val = serialized.get(k)
|
72
|
+
serialized.pop(k, None)
|
73
|
+
|
74
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
75
|
+
is_set = (
|
76
|
+
self.__pydantic_fields_set__.intersection({n})
|
77
|
+
or k in null_default_fields
|
78
|
+
) # pylint: disable=no-member
|
79
|
+
|
80
|
+
if val is not None and val != UNSET_SENTINEL:
|
81
|
+
m[k] = val
|
82
|
+
elif val != UNSET_SENTINEL and (
|
83
|
+
not k in optional_fields or (optional_nullable and is_set)
|
84
|
+
):
|
85
|
+
m[k] = val
|
86
|
+
|
87
|
+
return m
|
@@ -0,0 +1,11 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from enum import Enum
|
5
|
+
|
6
|
+
|
7
|
+
class InteractionType(str, Enum):
|
8
|
+
VIEW = "view"
|
9
|
+
CLICK = "click"
|
10
|
+
POSITIVE_FEEDBACK = "positive_feedback"
|
11
|
+
NEGATIVE_FEEDBACK = "negative_feedback"
|
@@ -0,0 +1,55 @@
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
from mixpeek.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
5
|
+
from pydantic import model_serializer
|
6
|
+
from typing_extensions import NotRequired, TypedDict
|
7
|
+
|
8
|
+
|
9
|
+
class JSONImageOutputSettingsResponseShapeTypedDict(TypedDict):
|
10
|
+
pass
|
11
|
+
|
12
|
+
|
13
|
+
class JSONImageOutputSettingsResponseShape(BaseModel):
|
14
|
+
pass
|
15
|
+
|
16
|
+
|
17
|
+
class JSONImageOutputSettingsTypedDict(TypedDict):
|
18
|
+
response_shape: NotRequired[Nullable[JSONImageOutputSettingsResponseShapeTypedDict]]
|
19
|
+
prompt: NotRequired[Nullable[str]]
|
20
|
+
|
21
|
+
|
22
|
+
class JSONImageOutputSettings(BaseModel):
|
23
|
+
response_shape: OptionalNullable[JSONImageOutputSettingsResponseShape] = UNSET
|
24
|
+
|
25
|
+
prompt: OptionalNullable[str] = UNSET
|
26
|
+
|
27
|
+
@model_serializer(mode="wrap")
|
28
|
+
def serialize_model(self, handler):
|
29
|
+
optional_fields = ["response_shape", "prompt"]
|
30
|
+
nullable_fields = ["response_shape", "prompt"]
|
31
|
+
null_default_fields = []
|
32
|
+
|
33
|
+
serialized = handler(self)
|
34
|
+
|
35
|
+
m = {}
|
36
|
+
|
37
|
+
for n, f in self.model_fields.items():
|
38
|
+
k = f.alias or n
|
39
|
+
val = serialized.get(k)
|
40
|
+
serialized.pop(k, None)
|
41
|
+
|
42
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
43
|
+
is_set = (
|
44
|
+
self.__pydantic_fields_set__.intersection({n})
|
45
|
+
or k in null_default_fields
|
46
|
+
) # pylint: disable=no-member
|
47
|
+
|
48
|
+
if val is not None and val != UNSET_SENTINEL:
|
49
|
+
m[k] = val
|
50
|
+
elif val != UNSET_SENTINEL and (
|
51
|
+
not k in optional_fields or (optional_nullable and is_set)
|
52
|
+
):
|
53
|
+
m[k] = val
|
54
|
+
|
55
|
+
return m
|