{"id":28456273,"url":"https://github.com/modzy/sdk-python","last_synced_at":"2025-06-29T10:32:19.251Z","repository":{"id":42060173,"uuid":"276437588","full_name":"modzy/sdk-python","owner":"modzy","description":"Python library for Modzy Machine Learning Operations (MLOps) Platform","archived":false,"fork":false,"pushed_at":"2023-09-08T15:52:41.000Z","size":1425,"stargazers_count":25,"open_issues_count":7,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-06-06T23:07:34.526Z","etag":null,"topics":["ai-security","api-client","deployment","docker","drift-detection","explainable-ai","kuberenetes","machine-learning","machine-learning-operations","microservices","mlops","model-deployment","model-serving","production-machine-learning","python","serving"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/modzy.png","metadata":{"files":{"readme":"README.md","changelog":"HISTORY.rst","contributing":"CONTRIBUTING.adoc","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-07-01T17:09:04.000Z","updated_at":"2025-04-14T16:57:03.000Z","dependencies_parsed_at":"2025-06-06T23:07:36.732Z","dependency_job_id":"992b2079-d74d-4664-8cc6-8546c549ad06","html_url":"https://github.com/modzy/sdk-python","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/modzy/sdk-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modzy%2Fsdk-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modzy%2Fsdk-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modzy%2Fsdk-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modzy%2Fsdk-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/modzy","download_url":"https://codeload.github.com/modzy/sdk-python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modzy%2Fsdk-python/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262578225,"owners_count":23331581,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-security","api-client","deployment","docker","drift-detection","explainable-ai","kuberenetes","machine-learning","machine-learning-operations","microservices","mlops","model-deployment","model-serving","production-machine-learning","python","serving"],"created_at":"2025-06-06T23:07:32.520Z","updated_at":"2025-06-29T10:32:19.242Z","avatar_url":"https://github.com/modzy.png","language":"Python","readme":"\u003cdiv align=\"center\"\u003e\n\n![python-sdk-github-banner.png](https://raw.githubusercontent.com/modzy/sdk-python/main/python-sdk-github-banner.png)\n\n![GitHub contributors](https://img.shields.io/github/contributors/modzy/sdk-python?logo=GitHub\u0026style=flat)\n![GitHub last commit](https://img.shields.io/github/last-commit/modzy/sdk-python?logo=GitHub\u0026style=flat)\n![GitHub issues](https://img.shields.io/github/issues-raw/modzy/sdk-python?logo=github\u0026style=flat)\n![GitHub](https://img.shields.io/github/license/modzy/sdk-python?logo=apache\u0026style=flat)\n\n![PyPI](https://img.shields.io/pypi/v/modzy-sdk?logo=pypi\u0026style=flat)\n![PyPI - Downloads](https://img.shields.io/pypi/dm/modzy-sdk?logo=pypi\u0026style=flat)\n\n**[Python SDK Documentation Page](https://docs.modzy.com)**\n\n\u003c/div\u003e\n\n# Installation\n\nInstall Modzy's Python SDK with PIP\n\n```bash\n  pip install modzy-sdk\n```\n    \n# Usage/Examples\n\n## Initializing the SDK\nInitialize your client by authenticating with an API key. You can [download an API Key](https://docs.modzy.com/docs/view-and-manage-api-keys#download-team-api-key) from your instance of Modzy.\n\n```python\nfrom modzy import ApiClient\n\n# Sets BASE_URL and API_KEY values\n# Best to set these as environment variables\nBASE_URL = \"Valid Modzy URL\" # e.g., \"https://trial.modzy.com\"\nAPI_KEY = \"Valid Modzy API Key\" # e.g., \"JbFkWZMx4Ea3epIrxSgA.a2fR36fZi3sdFPoztAXT\"\n\nclient = ApiClient(base_url=BASE_URL, api_key=API_KEY)\n```\n## Running Inferences\n### Raw Text Inputs\nSubmit an inference job to a text-based model by providing the model ID, version, and raw input text:\n\n```python\n# Creates a dictionary for text input(s)\nsources = {}\n\n# Adds any number of inputs\nsources[\"first-phone-call\"] = {\n    \"input.txt\": \"Mr Watson, come here. I want to see you.\",\n}\n\n# Submit the text to v1.0.1 of a Sentiment Analysis model, and to make the job explainable, change explain=True\njob = client.jobs.submit_text(\"ed542963de\", \"1.0.1\", sources, explain=False)\n```\n### File Inputs\nPass a file from your local directory to a model by providing the model ID, version, and the filepath of your sample data:\n\n```python\n# Generate a mapping of your local file (nyc-skyline.jpg) to the input filename the model expects\nsources = {\"nyc-skyline\": {\"image\": \"./images/nyc-skyline.jpg\"}}\n\n# Submit the image to v1.0.1 of an Image-based Geolocation model\njob = client.jobs.submit_file(\"aevbu1h3yw\", \"1.0.1\", sources)\n```\n### Embedded Inputs\nConvert images and other large inputs to base64 embedded data and submit to a model by providing a model ID, version number, and dictionary with one or more base64 encoded inputs:\n```python\nfrom modzy._util import file_to_bytes\n\n# Embed input as a string in base64\nimage_bytes = file_to_bytes('./images/tower-bridge.jpg')\n# Prepare the source dictionary\nsources = {\"tower-bridge\": {\"image\": image_bytes}}\n\n# Submit the image to v1.0.1 of an Imaged-based Geolocation model\njob = client.jobs.submit_embedded(\"aevbu1h3yw\", \"1.0.1\", sources)\n```\n### Inputs from Databases\nSubmit data from a SQL database to a model by providing a model ID, version, a SQL query, and database connection credentials:\n```python\n# Add database connection and query information\ndb_url = \"jdbc:postgresql://db.bit.io:5432/bitdotio\"\ndb_username = DB_USER_NAME\ndb_password = DB_PASSWORD\ndb_driver = \"org.postgresql.Driver\"\n# Select as \"input.txt\" becase that is the required input name for this model\ndb_query = \"SELECT \\\"mailaddr\\\" as \\\"input.txt\\\" FROM \\\"user/demo_repo\\\".\\\"atl_parcel_attr\\\" LIMIT 10;\"\n\n# Submit the database query to v0.0.12 of a Named Entity Recognition model\njob = client.jobs.submit_jdbc(\"a92fc413b5\",\"0.0.12\",db_url, db_username, db_password, db_driver, db_query)\n```\n### Inputs from Cloud Storage\nSubmit data directly from your cloud storage bucket (Amazon S3, Azure Blob, NetApp StorageGrid supported) by providing a model ID, version, and storage-blob-specific parameters.\n\n#### AWS S3\n```python\n# Define sources dictionary with bucket and key that points to the correct file in your s3 bucket\nsources = {\n  \"first-amazon-review\": {\n    \"input.txt\": {\n      \"bucket\": \"s3-bucket-name\",\n      \"key\": \"key-to-file.txt\"\n    }\n  }\n}\n\nAWS_ACCESS_KEY = \"aws-acces-key\"\nAWC_SECRET_ACCESS_KEY = \"aws-secret-access-key\"\nAWS_REGION = \"us-east-1\"\n\n# Submit s3 input to v1.0.1 of a Sentiment Analysis model\njob = client.jobs.submit_aws_s3(\"ed542963de\", \"1.0.1\", sources, AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY, AWS_REGION)\n```\n\n#### Azure Blob Storage\n```python\n# Define sources dictionary with container name and filepath that points to the correct file in your Azure Blob container\nsources = {\n  \"first-amazon-review\": {\n    \"input.txt\": {\n      \"container\": \"azure-blob-container-name\",\n      \"filePath\": \"key-to-file.txt\"\n    }\n  }\n}\n\nAZURE_STORAGE_ACCOUNT = \"Azure-Storage-Account\"\nAZURE_STORAGE_ACCOUNT_KEY = \"cvx....ytw==\"\n\n# Submit Azure Blob input to v1.0.1 of a Sentiment Analysis model\njob = client.jobs.submit_azureblob(\"ed542963de\", \"1.0.1\", sources, AZURE_STORAGE_ACCOUNT, AZURE_STORAGE_ACCOUNT_KEY)\n```\n\n#### NetApp StorageGRID\n```python\n# Define sources dictionary with bucket name and key that points to the correct file in your NetApp StorageGRID bucket\nsources = {\n  \"first-amazon-review\": {\n    \"input.txt\": {\n      \"bucket\": \"bucket-name\",\n      \"key\": \"key-to-file.txt\"\n    }\n  }\n}\n\nACCESS_KEY = \"access-key\"\nSECRET_ACCESS_KEY = \"secret-access-key\"\nSTORAGE_GRID_ENDPOINT = \"https://endpoint.storage-grid.example\"\n\n# Submit StorageGRID input to v1.0.1 of a Sentiment Analysis model\njob = client.jobs.submit_storagegrid(\"ed542963de\", \"1.0.1\", sources, ACCESS_KEY, SECRET_ACCESS_KEY, STORAGE_GRID_ENDPOINT)\n```\n## Getting Results\nModzy's APIs are asynchronous by nature, which means you can use the `results` API to query available results for all completed inference jobs at any point in time. There are two ways you might leverage this Python SDK to query results:\n\n### Block Job until it completes \nThis method provides a mechanism to mimic a sycnchronous API by using two different APIs subsequently and a utility function.\n\n```python\n# Define sources dictionary with input data\nsources = {\"my-input\": {\"input.txt\": \"Today is a beautiful day!\"}}\n# Submit the text to v1.0.1 of a Sentiment Analysis model, and to make the job explainable, change explain=True\njob = client.jobs.submit_text(\"ed542963de\", \"1.0.1\", sources, explain=False)\n# Use block until complete method to periodically ping the results API until job completes\nresults = client.results.block_until_complete(job, timeout=None, poll_interval=5)\n```\n\n### Query a Job's Result \nThis method simply queries the results for a job at any point in time and returns the status of the job, which includes the results if the job has completed.\n\n```python\n#  Query results for a job at any point in time\nresults = client.results.get(job)\n#  Print the inference results\nresults_json = result.get_first_outputs()['results.json']\nprint(results_json)\n```\n\n## Deploying Models\nDeploy a model to a your private model library in Modzy\n\n```Python\nfrom modzy import ApiClient\n\n# Sets BASE_URL and API_KEY values\n# Best to set these as environment variables\nBASE_URL = \"Valid Modzy URL\" # e.g., \"https://trial.modzy.com\"\nAPI_KEY = \"Valid Modzy API Key\" # e.g., \"JbFkWZMx4Ea3epIrxSgA.a2fR36fZi3sdFPoztAXT\"\n\nclient = ApiClient(base_url=BASE_URL, api_key=API_KEY)\n\nmodel_data = client.models.deploy(\n    container_image=\"modzy/grpc-echo-model:1.0.0\",\n    model_name=\"Echo Model\",\n    model_version=\"0.0.1\",\n    sample_input_file=\"./test.txt\",\n    run_timeout=\"60\",\n    status_timeout=\"60\",\n    short_description=\"This model returns the same text passed through as input, similar to an 'echo.'\",\n    long_description=\"This model returns the same text passed through as input, similar to an 'echo.'\",\n    technical_details=\"This section can include any technical information abot your model. Include information about how your model was trained, any underlying architecture details, or other pertinant information an end-user would benefit from learning.\",\n    performance_summary=\"This is the performance summary.\"\n)\n\nprint(model_data)\n```\nTo use **`client.models.deploy()`** there are 4 fields that are required:\n* `container_image (str)`: This parameter must represent a container image repository \u0026 tag name, or in other words, the string you would include after a docker pull command. For example, if you were to download this container image using docker pull modzy/grpc-echo-model:1.0.0, include just _`modzy/grpc-echo-model:1.0.0`_ for this parameter\n* `model_name`: The name of the model you would like to deploy\n* `model_version`: The version of the model you would like to deploy\n* `sample_input_file`: Filepath to a sample piece of data that your model is expected to process and perform inference against.\n\n## Running Inferences at the Edge\n\nThe SDK provides support for running inferences on edge devices through Modzy's Edge Client. The inference workflow is almost identical to the previously outlined workflow, and provides functionality for interacting with both Job and Inferences APIs:\n\n### Initialize Edge Client\n\n```python\nfrom modzy import EdgeClient\n\n# Initialize edge client\n# Use 'localhost' for local inferences, otherwise use the device's full IP address\nclient = EdgeClient('localhost',55000)\n```\n\n### Submit Inference with *Job* API\nModzy Edge supports `text`, `embedded`, and `aws-s3` input types.\n\n```python\n# Submit text job to Sentiment Analysis model deployed on edge device by providing a model ID, version, and raw text data, wait for completion\njob = client.jobs.submit_text(\"ed542963de\",\"1.0.27\",{\"input.txt\": \"this is awesome\"})\n# Block until results are ready\nfinal_job_details = client.jobs.block_until_complete(job)\nresults = client.jobs.get_results(job)\n```\n\n### Query Details about Inference with *Job* API\n```python\n# get job details for a particular job\njob_details = client.jobs.get_job_details(job)\n\n# get job details for all jobs run on your Modzy Edge instance\nall_job_details = client.jobs.get_all_job_details()\n```\n\n### Submit Inference with *Inference* API\n\nThe SDK provides several methods for interacting with Modzy's Inference API:\n* **Synchronous**: This convenience method wraps two SDK methods and is optimal for use cases that require real-time or sequential results (i.e., a prediction results are needed to inform action before submitting a new inference)\n* **Asynchronous**: This method combines two SDK methods and is optimal for submitting large batches of data and querying results at a later time (i.e., real-time inference is not required)\n* **Streaming**: This method is a convenience method for running multiple synchronous inferences consecutively and allows users to submit iterable objects to be processed sequentially in real-time\n\n*Synchronous (image-based model example)*\n```python\nfrom modzy import EdgeClient\nfrom modzy.edge import InputSource\n\nimage_bytes = open(\"image_path.jpg\", \"rb\").read()\ninput_object = InputSource(\n    key=\"image\", # input filename defined by model author\n    data=image_bytes,\n) \n\nwith EdgeClient('localhost', 55000) as client:\n  inference = client.inferences.run(\"\u003cmodel-id\u003e\", \"\u003cmodel-version\u003e\", input_object, explain=False, tags=None)\nresults = inference.result.outputs\n```\n\n*Asynchronous (image-based model example - submit batch of images in folder)*\n```python\nimport os\nfrom modzy import EdgeClient\nfrom modzy.edge import InputSource\n\n# submit inferences\nimg_folder = \"./images\"\ninferences = []\nfor img in os.listdir(img_folder):\n  input_object = InputSource(\n    key=\"image\", # input filename defined by model author\n    data=open(os.path.join(img_folder, img), 'rb').read()\n  )\n  with EdgeClient('localhost', 55000) as client:\n    inference = client.inferences.perform_inference(\"\u003cmodel-id\u003e\", \"\u003cmodel-version\u003e\", input_object, explain=False, tags=None)\n  inferences.append(inference)\n\n# query results \nwith EdgeClient('localhost', 55000) as client:\n  results = [client.inferences.block_until_complete(inference.identifier) for inferences in inferences]\n```\n\n*Stream*\n```python\nimport os\nfrom modzy import EdgeClient\nfrom modzy.edge import InputSource\n\n# generate requests iterator to pass to stream method\nrequests = []\nfor img in os.listdir(img_folder):\n  input_object = InputSource(\n    key=\"image\", # input filename defined by model author\n    data=open(os.path.join(img_folder, img), 'rb').read()\n  )\n  with EdgeClient('localhost', 55000) as client:\n    requests.append(client.inferences.build_inference_request(\"\u003cmodel-id\u003e\", \"\u003cmodel-version\u003e\", input_object, explain=False, tags=None)) \n\n# submit list of inference requests to streaming API\nwith EdgeClient('localhost', 55000) as client:\n  streaming_results = client.inferences.stream(requests)\n```\n\n# SDK Code Examples\n\nView examples of practical workflows:\n\n* [Image-Based Geolocation Inference Notebook](https://github.com/modzy/modzy-jupyter-notebook-samples/blob/main/python-sdk-inference/Submitting%20Jobs%20with%20Python%20SDK%20-%20Image-Based%20Geolocation.ipynb)\n* [Automobile Classification Inference Notebook with Explainability](https://github.com/modzy/modzy-jupyter-notebook-samples/blob/main/python-sdk-inference/Submitting%20Jobs%20with%20Python%20SDK%20-%20Automobile%20Classification.ipynb)\n* [Batch Inference with Sentiment Analysis](https://github.com/modzy/modzy-jupyter-notebook-samples/blob/main/python-sdk-inference/Submitting%20Batch%20Jobs%20with%20Python%20SDK%20-%20Sentiment%20Analysis.ipynb)\n\n# Documentation\n\nModzy's SDK is built on top of the [Modzy HTTP/REST API](https://docs.modzy.com/reference/introduction). For a full list of features and supported routes visit [Python SDK on docs.modzy.com](https://docs.modzy.com/docs/python)\n\n# API Reference\n\n| Feature | Code |Api route\n| ---     | ---  | ---\n|Deploy new model|client.models.deploy()|[api/models](https://docs.modzy.com/reference/model-deployment)\n|Get all models|client.models.get_all()|[api/models](https://docs.modzy.com/reference/get-all-models)|\n|List models|client.models.get_models()|[api/models](https://docs.modzy.com/reference/list-models)|\n|Get model details|client.models.get()|[api/models/:model-id](https://docs.modzy.com/reference/list-model-details)|\n|List models by name|client.models.get_by_name()|[api/models](https://docs.modzy.com/reference/list-models)|\n|List models by tag|client.tags.get_tags_and_models()|[api/models/tags/:tag-id](https://docs.modzy.com/reference/list-models-by-tag) |\n|Get related models|client.models.get_related()|[api/models/:model-id/related-models](https://docs.modzy.com/reference/get-related-models)|\n|List a model's versions|client.models.get_versions()|[api/models/:model-id/versions](https://docs.modzy.com/reference/list-versions)|\n|Get a version's details|client.models.get_version()|[api/models/:model-id/versions/:version-id](https://docs.modzy.com/reference/get-version-details)|\n|Update processing engines|client.models.update_processing_engines()|[api/resource/models](https://docs.modzy.com/reference/update-a-version-1)|\n|Get minimum engines|client.models.get_minimum_engines()|[api/models/processing-engines](https://docs.modzy.com/reference/get-minimum-engines)|\n|List tags|client.tags.get_all()|[api/models/tags](https://docs.modzy.com/reference/list-tags)|\n|Submit a Job (Text)|client.jobs.submit_text()|[api/jobs](https://docs.modzy.com/reference/create-a-job)|\n|Submit a Job (Embedded)|client.jobs.submit_embedded()|[api/jobs](https://docs.modzy.com/reference/create-a-job)|\n|Submit a Job (File)|client.jobs.submit_file()|[api/jobs](https://docs.modzy.com/reference/create-a-job)|\n|Submit a Job (AWS S3)|client.jobs.submit_aws_s3()|[api/jobs](https://docs.modzy.com/reference/create-a-job)|\n|Submit a Job (Azure Blob Storage)|client.jobs.submit_azureblob()|[api/jobs](https://docs.modzy.com/reference/create-a-job)|\n|Submit a Job (NetApp StorageGRID)|client.jobs.submit_storagegrid()|[api/jobs](https://docs.modzy.com/reference/create-a-job)|\n|Submit a Job (JDBC)|client.jobs.submit_jdbc()|[api/jobs](https://docs.modzy.com/reference/create-a-job)|\n|Cancel job|job.cancel()|[api/jobs/:job-id](https://docs.modzy.com/reference/cancel-a-job)  |\n|Hold until inference is complete|job.block_until_complete()|[api/jobs/:job-id](https://docs.modzy.com/reference/get-job-details)  |\n|Get job details|client.jobs.get()|[api/jobs/:job-id](https://docs.modzy.com/reference/get-job-details)  |\n|Get results|job.get_result()|[api/results/:job-id](https://docs.modzy.com/reference/get-results)  |\n|Get the job history|client.jobs.get_history()|[api/jobs/history](https://docs.modzy.com/reference/list-the-job-history)  |\n|Submit a Job with Edge Client (Embedded)|EdgeClient.jobs.submit_embedded()|[Python/edge/jobs](https://docs.modzy.com/docs/edgeclientjobssubmit_embedded) |\n|Submit a Job with Edge Client (Text)|EdgeClient.jobs.submit_text()|[Python/edge/jobs](https://docs.modzy.com/docs/edgeclientjobssubmit_text) |\n|Submit a Job with Edge Client (AWS S3)|EdgeClient.jobs.submit_aws_s3()|[Python/edge/jobs](https://docs.modzy.com/docs/edgeclientjobssubmit_aws_s3) |\n|Get job details with Edge Client|EdgeClient.jobs.get_job_details()|[Python/edge/jobs](https://docs.modzy.com/docs/edgeclientjobsget_job_details) |\n|Get all job details with Edge Client|EdgeClient.jobs.get_all_job_details()|[Python/edge/jobs](https://docs.modzy.com/docs/edgeclientjobsget_all_job_details) |\n|Hold until job is complete with Edge Client|EdgeClient.jobs.block_until_complete()|[Python/edge/jobs](https://docs.modzy.com/docs/edgeclientjobsblock_until_complete) |\n|Get results with Edge Client|EdgeClient.jobs.get_results()|[Python/edge/jobs](https://docs.modzy.com/docs/edgeclientjobsget_results) |\n|Build inference request with Edge Client|EdgeClient.inferences.build_inference_request()|[Python/edge/inferences](https://docs.modzy.com/docs/edgeclientinferencesbuild_inference_request) |\n|Perform inference with Edge Client|EdgeClient.inferences.perform_inference()|[Python/edge/inferences](https://docs.modzy.com/docs/edgeclientinferencesperform_inference) |\n|Get inference details with Edge Client|EdgeClient.inferences.get_inference_details()|[Python/edge/inferences](https://docs.modzy.com/docs/edgeclientinferencesget_inference_details) |\n|Run synchronous inferences with Edge Client|EdgeClient.inferences.run()|[Python/edge/inferences](https://docs.modzy.com/docs/edgeclientinferencesrun) |\n|Hold until inference completes with Edge Client|EdgeClient.inferences.block_until_complete()|[Python/edge/inferences](https://docs.modzy.com/docs/edgeclientinferencesblock_until_complete) |\n|Stream inferences with Edge Client|EdgeClient.inferences.stream()|[Python/edge/inferences](https://docs.modzy.com/docs/edgeclientinferencesstream) |\n\n\n# Support\n\nFor support, email opensource@modzy.com or join our [Slack](https://www.modzy.com/slack).\n# Contributing\n\nContributions are always welcome!\n\nSee [`contributing.md`](https://github.com/modzy/sdk-python/tree/main/contributing.adoc) for ways to get started.\n\nPlease adhere to this project's `code of conduct`.\n\nWe are happy to receive contributions from all of our users. Check out our contributing file to learn more.\n\n[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](https://github.com/modzy/sdk-python/tree/main/CODE_OF_CONDUCT.md)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmodzy%2Fsdk-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmodzy%2Fsdk-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmodzy%2Fsdk-python/lists"}