diff --git a/videodb/collection.py b/videodb/collection.py index fe39e2b..a6eecf9 100644 --- a/videodb/collection.py +++ b/videodb/collection.py @@ -484,6 +484,7 @@ def search(self, query: str, *args, **kwargs) -> Union[SearchResponse, SearchRes "mode", "return_fields", "include_clip", + "session_id", } unsupported_params = {"index_name", "index_names", "index_id", "index_ids"} @@ -506,6 +507,8 @@ def search(self, query: str, *args, **kwargs) -> Union[SearchResponse, SearchRes has_new = any(k in kwargs and kwargs[k] is not None for k in new_params) has_unsupported = any(k in kwargs and kwargs[k] is not None for k in unsupported_params) + if kwargs.get("deepsearch_config") is not None: + raise ValueError("deepsearch_config is internal and cannot be passed to search().") if has_old and (has_new or has_unsupported): raise ValueError( "Cannot mix legacy search params with new search params. " diff --git a/videodb/search.py b/videodb/search.py index 111f518..8aea795 100644 --- a/videodb/search.py +++ b/videodb/search.py @@ -184,15 +184,18 @@ def __repr__(self) -> str: class SearchResponse: """Envelope returned by high-level Search v2. - For ``response_type='shots'``, ``results`` is a :class:`SearchResult`. + For ``response_type='shots'`` or ``response_type='deepsearch'``, ``results`` is a :class:`SearchResult`. For ``response_type='aggregate'``, ``results`` is the aggregate dict/list returned by the server. """ def __init__(self, _connection, **kwargs): self._connection = _connection self.response_type = kwargs.get("response_type") + self.session_id = kwargs.get("session_id") + self.waiting_for = kwargs.get("waiting_for") or "none" + self.clarification = kwargs.get("clarification") raw_results = kwargs.get("results", []) - if self.response_type == "shots": + if self.response_type in {"shots", "deepsearch"}: self.results = SearchResult(_connection, results=raw_results) self.shots = self.results.shots else: @@ -203,21 +206,21 @@ def __repr__(self) -> str: return f"SearchResponse(response_type={self.response_type}, results={self.results})" def __iter__(self): - if self.response_type == "shots": + if self.response_type in {"shots", "deepsearch"}: return iter(self.results) if isinstance(self.results, list): return iter(self.results) return iter([self.results]) def __len__(self): - if self.response_type == "shots": + if self.response_type in {"shots", "deepsearch"}: return len(self.results) if isinstance(self.results, list): return len(self.results) return 1 if self.results is not None else 0 def __getitem__(self, index): - if self.response_type == "shots": + if self.response_type in {"shots", "deepsearch"}: return self.results[index] return self.results[index] diff --git a/videodb/video.py b/videodb/video.py index 49d236d..cb50b06 100644 --- a/videodb/video.py +++ b/videodb/video.py @@ -106,6 +106,7 @@ def search(self, query: str, *args, **kwargs) -> Union[SearchResponse, SearchRes "mode", "return_fields", "include_clip", + "session_id", } unsupported_params = {"index_name", "index_names", "index_id", "index_ids"} @@ -125,6 +126,8 @@ def search(self, query: str, *args, **kwargs) -> Union[SearchResponse, SearchRes has_new = any(k in kwargs and kwargs[k] is not None for k in new_params) has_unsupported = any(k in kwargs and kwargs[k] is not None for k in unsupported_params) + if kwargs.get("deepsearch_config") is not None: + raise ValueError("deepsearch_config is internal and cannot be passed to search().") if has_old and (has_new or has_unsupported): raise ValueError( "Cannot mix legacy search params with new search params. "