Skip to content
Merged
24 changes: 20 additions & 4 deletions giskard/client/giskard_client.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
"""API Client to interact with the Giskard app"""
from typing import List

import logging
import os
import posixpath
Expand All @@ -14,6 +12,7 @@
from requests.adapters import HTTPAdapter
from requests.auth import AuthBase
from requests_toolbelt import sessions
from typing import List

import giskard
from giskard.client.dtos import DatasetMetaInfo, ModelMetaInfo, ServerInfo, SuiteInfo, TestSuiteDTO
Expand Down Expand Up @@ -74,6 +73,18 @@ def __call__(self, r):
return r


def _limit_str_size(json, field, limit=255):
if field not in json or not isinstance(json[field], str):
return

original_len = len(json[field])
json[field] = json[field][:limit].encode("utf-16-le")[: limit * 2].decode("utf-16-le", "ignore")

# Java, js, h2 and postgres use UTF-16 surrogate pairs to calculate str length while python count characters
if original_len > len(json[field]):
logger.warning(f"Field '{field} exceeded the limit of {limit} characters and has been truncated")


class GiskardClient:
def __init__(self, url: str, key: str, hf_token: str = None):
self.host_url = url
Expand All @@ -93,7 +104,7 @@ def __init__(self, url: str, key: str, hf_token: str = None):
f"Your giskard client version ({giskard.__version__}) does not match the hub version "
f"({server_settings.serverVersion}). "
f"Please upgrade your client to the latest version. "
f"pip install \"giskard[hub]>=2.0.0b\" -U"
f'pip install "giskard[hub]>=2.0.0b" -U'
)
analytics.init_server_info(server_settings)

Expand Down Expand Up @@ -319,7 +330,12 @@ def save_dataset_meta(
print(f"Dataset successfully uploaded to project key '{project_key}' with ID = {dataset_id}")

def save_meta(self, endpoint: str, meta: SMT) -> SMT:
json = self._session.put(endpoint, json=meta.to_json()).json()
meta_json = meta.to_json()

_limit_str_size(meta_json, "name")
_limit_str_size(meta_json, "display_name")

json = self._session.put(endpoint, json=meta_json).json()
return meta if json is None or "uuid" not in json else meta.from_json(json)

def load_meta(self, endpoint: str, meta_class: SMT) -> TestFunctionMeta:
Expand Down