From e9a4f515ecee672a105110cfa83dae9fa3e66893 Mon Sep 17 00:00:00 2001 From: Vitalii Bulyzhyn Date: Tue, 4 Oct 2022 14:17:16 -0300 Subject: [PATCH 1/8] Add diffgram model base class and example --- sdk/samples/model_server.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 sdk/samples/model_server.py diff --git a/sdk/samples/model_server.py b/sdk/samples/model_server.py new file mode 100644 index 0000000..eba070c --- /dev/null +++ b/sdk/samples/model_server.py @@ -0,0 +1,6 @@ +from diffgram import DiffgramBaseModel +from fastapi import FastAPI + +app = FastAPI() + +DiffgramBaseModel().serve(app) \ No newline at end of file From a92ebedfed8e4589f384bef9937ccb66683a5144 Mon Sep 17 00:00:00 2001 From: Vitalii Bulyzhyn Date: Tue, 4 Oct 2022 14:17:36 -0300 Subject: [PATCH 2/8] Add diffgram model base class and example --- sdk/diffgram.egg-info/PKG-INFO | 65 ++++++++++++++++++++++ sdk/diffgram.egg-info/SOURCES.txt | 53 ++++++++++++++++++ sdk/diffgram.egg-info/dependency_links.txt | 1 + sdk/diffgram.egg-info/requires.txt | 5 ++ sdk/diffgram.egg-info/top_level.txt | 2 + sdk/diffgram/__init__.py | 1 + sdk/diffgram/core/core.py | 1 - sdk/diffgram/models/__init__.py | 0 sdk/diffgram/models/base_model.py | 27 +++++++++ sdk/requirements.txt | 3 +- 10 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 sdk/diffgram.egg-info/PKG-INFO create mode 100644 sdk/diffgram.egg-info/SOURCES.txt create mode 100644 sdk/diffgram.egg-info/dependency_links.txt create mode 100644 sdk/diffgram.egg-info/requires.txt create mode 100644 sdk/diffgram.egg-info/top_level.txt create mode 100644 sdk/diffgram/models/__init__.py create mode 100644 sdk/diffgram/models/base_model.py diff --git a/sdk/diffgram.egg-info/PKG-INFO b/sdk/diffgram.egg-info/PKG-INFO new file mode 100644 index 0000000..83e04e9 --- /dev/null +++ b/sdk/diffgram.egg-info/PKG-INFO @@ -0,0 +1,65 @@ +Metadata-Version: 2.1 +Name: diffgram +Version: 0.0.0 +Summary: SDK for Diffgram +Home-page: https://github.com/diffgram/python-sdk +Author: Diffgram +Author-email: support@diffgram.com +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Description-Content-Type: text/markdown + + +# SDK for Diffgram + +This is the SDK for [Diffgram](https://github.com/diffgram/diffgram)
and +[Diffgram.com](https://diffgram.com/)
+ +## SDK Install + +#### [Full Documentation](https://diffgram.readme.io/docs) + +### Quickstart Install SDK +`pip install diffgram` + +On linux +`pip3 install diffgram` + +[Credentials Guide](https://diffgram.readme.io/reference)
+[Get Credentials from Diffgram.com](https://diffgram.com/) (or your Private Deploy) + +The starting point for most useful work is to get a project: +``` +from diffgram import Project + +project = Project(host = "https://diffgram.com", + project_string_id = "replace_with_project_string", + client_id = "replace_with_client_id", + client_secret = "replace_with_client_secret") +``` + +Replace `host` with your URL for Open Core installs. + +* [Tasks Introduction](https://diffgram.readme.io/docs/tasks-introduction) +* [Import Introduction](https://diffgram.readme.io/docs/importing-your-data) +* [Updating Existing Instances](https://diffgram.readme.io/docs/importing-instances-walkthrough) +* [Pre-Label Example Video](https://youtu.be/55Hofp1H7yM) +* [Compatibility](https://diffgram.readme.io/docs/compatibility-will-diffgram-work-with-my-system) + + +#### Beta +Note the API/SDK is in beta and is undergoing rapid improvement. There may be breaking changes. +Please see the [API docs](https://diffgram.readme.io/reference) for the latest canonical reference +and be sure to upgrade to latest ie: `pip install diffgram --upgrade`. We will attempt to keep the SDK up to date with the API. + +[Help articles for Diffgram.com](https://diffgram.readme.io/) See below for some examples. + +Requires Python >=3.5 + +The default install through pip will install dependencies +for local prediction (tensorflow opencv) as listed in `requirements.txt`. +The only requirement needed for majority of functions is `requests`. +If you are looking for a minimal size install and already have requests use +the `--no-dependencies` flag ie `pip install diffgram --no-dependencies` + diff --git a/sdk/diffgram.egg-info/SOURCES.txt b/sdk/diffgram.egg-info/SOURCES.txt new file mode 100644 index 0000000..2d16844 --- /dev/null +++ b/sdk/diffgram.egg-info/SOURCES.txt @@ -0,0 +1,53 @@ +setup.py +diffgram/__init__.py +diffgram.egg-info/PKG-INFO +diffgram.egg-info/SOURCES.txt +diffgram.egg-info/dependency_links.txt +diffgram.egg-info/requires.txt +diffgram.egg-info/top_level.txt +diffgram/brain/__init__.py +diffgram/brain/brain.py +diffgram/brain/inference.py +diffgram/brain/instance.py +diffgram/brain/train.py +diffgram/convert/__init__.py +diffgram/convert/convert.py +diffgram/core/__init__.py +diffgram/core/core.py +diffgram/core/diffgram_dataset_iterator.py +diffgram/core/directory.py +diffgram/core/directory_samples.py +diffgram/core/sliced_directory.py +diffgram/export/__init__.py +diffgram/export/export.py +diffgram/file/__init__.py +diffgram/file/file.py +diffgram/file/file_3d.py +diffgram/file/file_constructor.py +diffgram/file/test_existing_instances.py +diffgram/file/test_file.py +diffgram/file/view.py +diffgram/job/__init__.py +diffgram/job/guide.py +diffgram/job/job.py +diffgram/label/__init__.py +diffgram/label/label_new.py +diffgram/label/test_label.py +diffgram/member/__init__.py +diffgram/models/__init__.py +diffgram/models/base_model.py +diffgram/pytorch_diffgram/__init__.py +diffgram/pytorch_diffgram/diffgram_pytorch_dataset.py +diffgram/regular/__init__.py +diffgram/regular/regular.py +diffgram/role/Role.py +diffgram/role/__init__.py +diffgram/task/__init__.py +diffgram/task/task.py +diffgram/task/test_task.py +diffgram/tensorflow_diffgram/__init__.py +diffgram/tensorflow_diffgram/diffgram_tensorflow_dataset.py +diffgram/tensorflow_diffgram/pytorch_test.py +diffgram/utils/__init__.py +diffgram/utils/visualization_utils.py +tests/__init__.py \ No newline at end of file diff --git a/sdk/diffgram.egg-info/dependency_links.txt b/sdk/diffgram.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/sdk/diffgram.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/sdk/diffgram.egg-info/requires.txt b/sdk/diffgram.egg-info/requires.txt new file mode 100644 index 0000000..2b53ab3 --- /dev/null +++ b/sdk/diffgram.egg-info/requires.txt @@ -0,0 +1,5 @@ +requests>=2.20.1 +scipy>=1.1.0 +six>=1.9.0 +pillow>=6.1.0 +imageio>=2.9.0 diff --git a/sdk/diffgram.egg-info/top_level.txt b/sdk/diffgram.egg-info/top_level.txt new file mode 100644 index 0000000..34aeb02 --- /dev/null +++ b/sdk/diffgram.egg-info/top_level.txt @@ -0,0 +1,2 @@ +diffgram +tests diff --git a/sdk/diffgram/__init__.py b/sdk/diffgram/__init__.py index 6c7afa0..e8c5954 100644 --- a/sdk/diffgram/__init__.py +++ b/sdk/diffgram/__init__.py @@ -5,3 +5,4 @@ from diffgram.core.core import Project from diffgram.file.file import File from diffgram.task.task import Task +from diffgram.models.base_model import DiffgramBaseModel diff --git a/sdk/diffgram/core/core.py b/sdk/diffgram/core/core.py index d094def..c07f868 100644 --- a/sdk/diffgram/core/core.py +++ b/sdk/diffgram/core/core.py @@ -18,7 +18,6 @@ from diffgram.task.task import Task from requests.auth import HTTPBasicAuth - class Project(): default_directory: Directory last_response_header: None diff --git a/sdk/diffgram/models/__init__.py b/sdk/diffgram/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sdk/diffgram/models/base_model.py b/sdk/diffgram/models/base_model.py new file mode 100644 index 0000000..2f1f4fb --- /dev/null +++ b/sdk/diffgram/models/base_model.py @@ -0,0 +1,27 @@ +from fastapi import FastAPI + +class DiffgramBaseModel(): + def init(self): + pass + + def infere(self): + raise NotImplementedError + + def get_schema(self): + raise NotImplementedError + + def ping(self): + pass + + def serve(self, app): + @app.get("/infere") + async def predict(): + return { + "message": "Infere route" + } + + @app.get("/get_schema") + async def schema(): + return { + "message": "Get schema here" + } \ No newline at end of file diff --git a/sdk/requirements.txt b/sdk/requirements.txt index 651c49d..c96107c 100644 --- a/sdk/requirements.txt +++ b/sdk/requirements.txt @@ -5,4 +5,5 @@ six>=1.9.0 tensorflow>=1.12.0 pillow torch -imageio>=2.9.0 \ No newline at end of file +imageio>=2.9.0 +fastapi>=0.85.0 \ No newline at end of file From 01de0ffe61f805542a9988079e7034a08b0342c6 Mon Sep 17 00:00:00 2001 From: Vitalii Bulyzhyn Date: Tue, 4 Oct 2022 15:53:40 -0300 Subject: [PATCH 3/8] Add typing to the model wrapper --- sdk/diffgram.egg-info/SOURCES.txt | 1 + sdk/diffgram/__init__.py | 2 +- sdk/diffgram/models/base_model.py | 23 +++++++++++++++++------ sdk/diffgram/models/model_interfaces.py | 9 +++++++++ sdk/samples/model_server.py | 14 +++++++++++--- 5 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 sdk/diffgram/models/model_interfaces.py diff --git a/sdk/diffgram.egg-info/SOURCES.txt b/sdk/diffgram.egg-info/SOURCES.txt index 2d16844..cbc17eb 100644 --- a/sdk/diffgram.egg-info/SOURCES.txt +++ b/sdk/diffgram.egg-info/SOURCES.txt @@ -36,6 +36,7 @@ diffgram/label/test_label.py diffgram/member/__init__.py diffgram/models/__init__.py diffgram/models/base_model.py +diffgram/models/model_interfaces.py diffgram/pytorch_diffgram/__init__.py diffgram/pytorch_diffgram/diffgram_pytorch_dataset.py diffgram/regular/__init__.py diff --git a/sdk/diffgram/__init__.py b/sdk/diffgram/__init__.py index e8c5954..2e36099 100644 --- a/sdk/diffgram/__init__.py +++ b/sdk/diffgram/__init__.py @@ -5,4 +5,4 @@ from diffgram.core.core import Project from diffgram.file.file import File from diffgram.task.task import Task -from diffgram.models.base_model import DiffgramBaseModel +from diffgram.models.base_model import DiffgramBaseModel, Instance diff --git a/sdk/diffgram/models/base_model.py b/sdk/diffgram/models/base_model.py index 2f1f4fb..c4387b2 100644 --- a/sdk/diffgram/models/base_model.py +++ b/sdk/diffgram/models/base_model.py @@ -1,10 +1,10 @@ -from fastapi import FastAPI - +from .model_interfaces import DiffgramFile, Instance +from typing import List class DiffgramBaseModel(): def init(self): pass - def infere(self): + def infere(self, file: DiffgramFile) -> List[Instance]: raise NotImplementedError def get_schema(self): @@ -14,10 +14,21 @@ def ping(self): pass def serve(self, app): - @app.get("/infere") - async def predict(): + @app.post("/infere") + async def predict(file: DiffgramFile): + predictions = self.infere(file) + + if not isinstance(predictions, List): + raise ValueError('infere should return List of type Instance') + + for prediction in predictions: + res = isinstance(prediction, Instance) + if not res: + raise ValueError('infere should return List of type Instance') + return { - "message": "Infere route" + "file": file, + "predictions": predictions } @app.get("/get_schema") diff --git a/sdk/diffgram/models/model_interfaces.py b/sdk/diffgram/models/model_interfaces.py new file mode 100644 index 0000000..f03a04e --- /dev/null +++ b/sdk/diffgram/models/model_interfaces.py @@ -0,0 +1,9 @@ +from pydantic import BaseModel +from typing import List + +class DiffgramFile(BaseModel): + id: int + type: str + +class Instance(BaseModel): + id: int diff --git a/sdk/samples/model_server.py b/sdk/samples/model_server.py index eba070c..0a7d7e1 100644 --- a/sdk/samples/model_server.py +++ b/sdk/samples/model_server.py @@ -1,6 +1,14 @@ -from diffgram import DiffgramBaseModel +from diffgram import DiffgramBaseModel, Instance from fastapi import FastAPI -app = FastAPI() +class MyTestModel(DiffgramBaseModel): + def infere(self, file): + return [ + Instance(id=1) + ] + + def get_schema(self): + return super().get_schema() -DiffgramBaseModel().serve(app) \ No newline at end of file +app = FastAPI() +MyTestModel().serve(app) \ No newline at end of file From 67922d3c19b749639458cf0c056cd174a99d1ba1 Mon Sep 17 00:00:00 2001 From: Vitalii Bulyzhyn Date: Tue, 4 Oct 2022 16:28:09 -0300 Subject: [PATCH 4/8] Add typing for the model output --- sdk/samples/model_server.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sdk/samples/model_server.py b/sdk/samples/model_server.py index 0a7d7e1..c69c987 100644 --- a/sdk/samples/model_server.py +++ b/sdk/samples/model_server.py @@ -1,11 +1,11 @@ -from diffgram import DiffgramBaseModel, Instance +from diffgram import DiffgramBaseModel, Prediction, Instance, Attribute from fastapi import FastAPI - class MyTestModel(DiffgramBaseModel): def infere(self, file): - return [ - Instance(id=1) - ] + return Prediction( + instances=[Instance(id=1)], + attributes=[Attribute(id=1)] + ) def get_schema(self): return super().get_schema() From 34ed4faaba0d4c4ffa356379de0de65bdb6f73f6 Mon Sep 17 00:00:00 2001 From: Vitalii Bulyzhyn Date: Tue, 4 Oct 2022 16:31:49 -0300 Subject: [PATCH 5/8] Add prediction payload validation --- sdk/diffgram/__init__.py | 3 ++- sdk/diffgram/models/base_model.py | 24 +++++++++++++++--------- sdk/diffgram/models/model_interfaces.py | 8 ++++++++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/sdk/diffgram/__init__.py b/sdk/diffgram/__init__.py index 2e36099..d126c9c 100644 --- a/sdk/diffgram/__init__.py +++ b/sdk/diffgram/__init__.py @@ -5,4 +5,5 @@ from diffgram.core.core import Project from diffgram.file.file import File from diffgram.task.task import Task -from diffgram.models.base_model import DiffgramBaseModel, Instance +from diffgram.models.base_model import DiffgramBaseModel +from diffgram.models.model_interfaces import DiffgramFile, Prediction, Attribute, Instance diff --git a/sdk/diffgram/models/base_model.py b/sdk/diffgram/models/base_model.py index c4387b2..3e8343f 100644 --- a/sdk/diffgram/models/base_model.py +++ b/sdk/diffgram/models/base_model.py @@ -1,10 +1,9 @@ -from .model_interfaces import DiffgramFile, Instance -from typing import List +from .model_interfaces import DiffgramFile, Prediction, Attribute, Instance class DiffgramBaseModel(): def init(self): pass - def infere(self, file: DiffgramFile) -> List[Instance]: + def infere(self, file: DiffgramFile) -> Prediction: raise NotImplementedError def get_schema(self): @@ -18,13 +17,20 @@ def serve(self, app): async def predict(file: DiffgramFile): predictions = self.infere(file) - if not isinstance(predictions, List): - raise ValueError('infere should return List of type Instance') + if not isinstance(predictions, Prediction): + raise ValueError('predictions should be of type Prediction') - for prediction in predictions: - res = isinstance(prediction, Instance) - if not res: - raise ValueError('infere should return List of type Instance') + if predictions.instances: + for predicted_instance in predictions.instances: + instance = isinstance(predicted_instance, Instance) + if not instance: + raise ValueError('predicted instances should be of type Instance') + + if predictions.attributes: + for predicted_attributes in predictions.attributes: + instance = isinstance(predicted_attributes, Attribute) + if not instance: + raise ValueError('predicted attributes should be of type Attribute') return { "file": file, diff --git a/sdk/diffgram/models/model_interfaces.py b/sdk/diffgram/models/model_interfaces.py index f03a04e..e6ac45b 100644 --- a/sdk/diffgram/models/model_interfaces.py +++ b/sdk/diffgram/models/model_interfaces.py @@ -1,9 +1,17 @@ from pydantic import BaseModel +from typing import Optional from typing import List class DiffgramFile(BaseModel): id: int type: str +class Attribute(BaseModel): + id: int class Instance(BaseModel): id: int + +class Prediction(BaseModel): + instances: Optional[List[Instance]] + attributes: Optional[List[Attribute]] + From c816c47e1409be7c7d643ef5779e2adb619c1fb5 Mon Sep 17 00:00:00 2001 From: Vitalii Bulyzhyn Date: Wed, 5 Oct 2022 11:56:34 -0300 Subject: [PATCH 6/8] WIP: add typechecking for allowed files --- sdk/diffgram/models/base_model.py | 27 +++++++++++++++++++++---- sdk/diffgram/models/model_interfaces.py | 6 ++---- sdk/samples/model_server.py | 2 +- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/sdk/diffgram/models/base_model.py b/sdk/diffgram/models/base_model.py index 3e8343f..e8937dc 100644 --- a/sdk/diffgram/models/base_model.py +++ b/sdk/diffgram/models/base_model.py @@ -1,7 +1,22 @@ +from fastapi import HTTPException +from typing import List, Literal from .model_interfaces import DiffgramFile, Prediction, Attribute, Instance class DiffgramBaseModel(): - def init(self): - pass + diffgram_allowed_types = Literal['image', 'frame', 'video', 'text', 'audio', 'sensor_fusion', 'geospatial'] + + def __init__( + self, + allowed_types: list = None + ): + if allowed_types is not None: + if not isinstance(allowed_types, list): + raise ValueError('allowed_types must be of type list') + + for allowed_type in allowed_types: + if allowed_type not in self.diffgram_allowed_types: + raise ValueError(f"{allowed_type} is not valid Diffgram file type") + + self.allowed_types = allowed_types def infere(self, file: DiffgramFile) -> Prediction: raise NotImplementedError @@ -14,7 +29,11 @@ def ping(self): def serve(self, app): @app.post("/infere") - async def predict(file: DiffgramFile): + async def infere_route(file: DiffgramFile): + if self.allowed_types is not None: + if file.type not in self.allowed_types: + raise HTTPException(status_code=404, detail=f"This model does not support {file.type} files") + predictions = self.infere(file) if not isinstance(predictions, Prediction): @@ -38,7 +57,7 @@ async def predict(file: DiffgramFile): } @app.get("/get_schema") - async def schema(): + async def get_schema_route(): return { "message": "Get schema here" } \ No newline at end of file diff --git a/sdk/diffgram/models/model_interfaces.py b/sdk/diffgram/models/model_interfaces.py index e6ac45b..14c8128 100644 --- a/sdk/diffgram/models/model_interfaces.py +++ b/sdk/diffgram/models/model_interfaces.py @@ -1,10 +1,8 @@ from pydantic import BaseModel -from typing import Optional -from typing import List - +from typing import Optional, List, Literal class DiffgramFile(BaseModel): id: int - type: str + type: Literal['image', 'frame', 'video', 'text', 'audio', 'sensor_fusion', 'geospatial'] class Attribute(BaseModel): id: int diff --git a/sdk/samples/model_server.py b/sdk/samples/model_server.py index c69c987..4f6f91d 100644 --- a/sdk/samples/model_server.py +++ b/sdk/samples/model_server.py @@ -11,4 +11,4 @@ def get_schema(self): return super().get_schema() app = FastAPI() -MyTestModel().serve(app) \ No newline at end of file +MyTestModel(allowed_types=["image"]).serve(app) \ No newline at end of file From 54a49b75d3d784af7134ede12d122b585b1cb939 Mon Sep 17 00:00:00 2001 From: Vitalii Bulyzhyn Date: Wed, 5 Oct 2022 13:51:54 -0300 Subject: [PATCH 7/8] Handle allowed types for model --- sdk/diffgram/models/base_model.py | 2 +- sdk/samples/model_server.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/diffgram/models/base_model.py b/sdk/diffgram/models/base_model.py index e8937dc..2ca0d5a 100644 --- a/sdk/diffgram/models/base_model.py +++ b/sdk/diffgram/models/base_model.py @@ -13,7 +13,7 @@ def __init__( raise ValueError('allowed_types must be of type list') for allowed_type in allowed_types: - if allowed_type not in self.diffgram_allowed_types: + if allowed_type not in self.diffgram_allowed_types.__dict__['__args__']: raise ValueError(f"{allowed_type} is not valid Diffgram file type") self.allowed_types = allowed_types diff --git a/sdk/samples/model_server.py b/sdk/samples/model_server.py index 4f6f91d..02c2dfa 100644 --- a/sdk/samples/model_server.py +++ b/sdk/samples/model_server.py @@ -11,4 +11,4 @@ def get_schema(self): return super().get_schema() app = FastAPI() -MyTestModel(allowed_types=["image"]).serve(app) \ No newline at end of file +MyTestModel(allowed_types=["image", "audio"]).serve(app) \ No newline at end of file From 473d1fbb63a391dc1c3bd7f04cc0d28f995bf4e4 Mon Sep 17 00:00:00 2001 From: Vitalii Bulyzhyn Date: Wed, 5 Oct 2022 14:53:55 -0300 Subject: [PATCH 8/8] Add vaidator to Diffgram FIle model --- sdk/diffgram/models/base_model.py | 21 ++++++++++++++------- sdk/diffgram/models/model_interfaces.py | 24 +++++++++++++++++++++++- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/sdk/diffgram/models/base_model.py b/sdk/diffgram/models/base_model.py index 2ca0d5a..d2ec39f 100644 --- a/sdk/diffgram/models/base_model.py +++ b/sdk/diffgram/models/base_model.py @@ -1,12 +1,14 @@ +from abc import ABC, abstractmethod from fastapi import HTTPException -from typing import List, Literal +from typing import Literal from .model_interfaces import DiffgramFile, Prediction, Attribute, Instance -class DiffgramBaseModel(): +class DiffgramBaseModel(ABC): diffgram_allowed_types = Literal['image', 'frame', 'video', 'text', 'audio', 'sensor_fusion', 'geospatial'] - + allowed_types: list = None + def __init__( self, - allowed_types: list = None + allowed_types: list = None, ): if allowed_types is not None: if not isinstance(allowed_types, list): @@ -18,15 +20,14 @@ def __init__( self.allowed_types = allowed_types + @abstractmethod def infere(self, file: DiffgramFile) -> Prediction: raise NotImplementedError + @abstractmethod def get_schema(self): raise NotImplementedError - def ping(self): - pass - def serve(self, app): @app.post("/infere") async def infere_route(file: DiffgramFile): @@ -60,4 +61,10 @@ async def infere_route(file: DiffgramFile): async def get_schema_route(): return { "message": "Get schema here" + } + + @app.get("/ping") + async def ping_route(): + return { + "message": "Model is up and running" } \ No newline at end of file diff --git a/sdk/diffgram/models/model_interfaces.py b/sdk/diffgram/models/model_interfaces.py index 14c8128..eb59df0 100644 --- a/sdk/diffgram/models/model_interfaces.py +++ b/sdk/diffgram/models/model_interfaces.py @@ -1,9 +1,31 @@ -from pydantic import BaseModel +from pydantic import BaseModel, AnyUrl, validator from typing import Optional, List, Literal + +class DiffgramImage(BaseModel): + height: int + width: int + url_signed: AnyUrl + +class DiffgramText(BaseModel): + tokens_url_signed: AnyUrl + class DiffgramFile(BaseModel): id: int + original_filename: str + image: Optional[DiffgramImage] + text: Optional[DiffgramText] type: Literal['image', 'frame', 'video', 'text', 'audio', 'sensor_fusion', 'geospatial'] + @validator('type') + def requre_object_if_type(cls, type, values): + file_object = values.get(type) + + if not file_object: + raise ValueError(f"{type} is missing in the payload") + + return type + + class Attribute(BaseModel): id: int class Instance(BaseModel):