1+ import warnings
12from time import sleep
2- from typing import Optional , Union
3+ from typing import Optional , Union , Type , TypeVar
34
45from mindee .client_mixin import ClientMixin
56from mindee .error .mindee_error import MindeeError
67from mindee .error .mindee_http_error_v2 import handle_error_v2
7- from mindee .input import UrlInputSource
8+ from mindee .input import UrlInputSource , BaseParameters
89from mindee .input .inference_parameters import InferenceParameters
910from mindee .input .polling_options import PollingOptions
1011from mindee .input .sources .local_input_source import LocalInputSource
1516 is_valid_post_response ,
1617)
1718from mindee .parsing .v2 .common_response import CommonStatus
19+ from mindee .v2 .parsing .inference .base_response import BaseResponse
1820from mindee .parsing .v2 .inference_response import InferenceResponse
1921from mindee .parsing .v2 .job_response import JobResponse
2022
23+ TypeBaseResponse = TypeVar ("TypeBaseResponse" , bound = BaseResponse )
24+
2125
2226class ClientV2 (ClientMixin ):
2327 """
@@ -41,20 +45,34 @@ def __init__(self, api_key: Optional[str] = None) -> None:
4145 def enqueue_inference (
4246 self ,
4347 input_source : Union [LocalInputSource , UrlInputSource ],
44- params : InferenceParameters ,
48+ params : BaseParameters ,
49+ disable_redundant_warnings : bool = False ,
50+ ) -> JobResponse :
51+ """[Deprecated] Use `enqueue` instead."""
52+ if not disable_redundant_warnings :
53+ warnings .warn (
54+ "enqueue_inference is deprecated; use enqueue instead" ,
55+ DeprecationWarning ,
56+ stacklevel = 2 ,
57+ )
58+ return self .enqueue (input_source , params )
59+
60+ def enqueue (
61+ self ,
62+ input_source : Union [LocalInputSource , UrlInputSource ],
63+ params : BaseParameters ,
4564 ) -> JobResponse :
4665 """
4766 Enqueues a document to a given model.
4867
4968 :param input_source: The document/source file to use. Can be local or remote.
50-
5169 :param params: Parameters to set when sending a file.
70+
5271 :return: A valid inference response.
5372 """
5473 logger .debug ("Enqueuing inference using model: %s" , params .model_id )
55-
5674 response = self .mindee_api .req_post_inference_enqueue (
57- input_source = input_source , params = params
75+ input_source = input_source , params = params , slug = params . get_enqueue_slug ()
5876 )
5977 dict_response = response .json ()
6078
@@ -79,34 +97,49 @@ def get_job(self, job_id: str) -> JobResponse:
7997 dict_response = response .json ()
8098 return JobResponse (dict_response )
8199
82- def get_inference (self , inference_id : str ) -> InferenceResponse :
100+ def get_inference (
101+ self ,
102+ inference_id : str ,
103+ ) -> BaseResponse :
104+ """[Deprecated] Use `get_result` instead."""
105+ return self .get_result (InferenceResponse , inference_id )
106+
107+ def get_result (
108+ self ,
109+ response_type : Type [TypeBaseResponse ],
110+ inference_id : str ,
111+ ) -> TypeBaseResponse :
83112 """
84113 Get the result of an inference that was previously enqueued.
85114
86115 The inference will only be available after it has finished processing.
87116
88117 :param inference_id: UUID of the inference to retrieve.
118+ :param response_type: Class of the product to instantiate.
89119 :return: An inference response.
90120 """
91121 logger .debug ("Fetching inference: %s" , inference_id )
92122
93- response = self .mindee_api .req_get_inference (inference_id )
123+ response = self .mindee_api .req_get_inference (
124+ inference_id , response_type .get_result_slug ()
125+ )
94126 if not is_valid_get_response (response ):
95127 handle_error_v2 (response .json ())
96128 dict_response = response .json ()
97- return InferenceResponse (dict_response )
129+ return response_type (dict_response )
98130
99- def enqueue_and_get_inference (
131+ def enqueue_and_get_result (
100132 self ,
133+ response_type : Type [TypeBaseResponse ],
101134 input_source : Union [LocalInputSource , UrlInputSource ],
102- params : InferenceParameters ,
103- ) -> InferenceResponse :
135+ params : BaseParameters ,
136+ ) -> TypeBaseResponse :
104137 """
105138 Enqueues to an asynchronous endpoint and automatically polls for a response.
106139
107140 :param input_source: The document/source file to use. Can be local or remote.
108-
109141 :param params: Parameters to set when sending a file.
142+ :param response_type: The product class to use for the response object.
110143
111144 :return: A valid inference response.
112145 """
@@ -117,14 +150,15 @@ def enqueue_and_get_inference(
117150 params .polling_options .delay_sec ,
118151 params .polling_options .max_retries ,
119152 )
120- enqueue_response = self .enqueue_inference (input_source , params )
153+ enqueue_response = self .enqueue_inference (input_source , params , True )
121154 logger .debug (
122- "Successfully enqueued inference with job id: %s" , enqueue_response .job .id
155+ "Successfully enqueued document with job id: %s" , enqueue_response .job .id
123156 )
124157 sleep (params .polling_options .initial_delay_sec )
125158 try_counter = 0
126159 while try_counter < params .polling_options .max_retries :
127160 job_response = self .get_job (enqueue_response .job .id )
161+ assert isinstance (job_response , JobResponse )
128162 if job_response .job .status == CommonStatus .FAILED .value :
129163 if job_response .job .error :
130164 detail = job_response .job .error .detail
@@ -134,8 +168,31 @@ def enqueue_and_get_inference(
134168 f"Parsing failed for job { job_response .job .id } : { detail } "
135169 )
136170 if job_response .job .status == CommonStatus .PROCESSED .value :
137- return self .get_inference (job_response .job .id )
171+ result = self .get_result (
172+ response_type or InferenceResponse , job_response .job .id
173+ )
174+ assert isinstance (result , response_type ), (
175+ f'Invalid response type "{ type (result )} "'
176+ )
177+ return result
138178 try_counter += 1
139179 sleep (params .polling_options .delay_sec )
140180
141181 raise MindeeError (f"Couldn't retrieve document after { try_counter + 1 } tries." )
182+
183+ def enqueue_and_get_inference (
184+ self ,
185+ input_source : Union [LocalInputSource , UrlInputSource ],
186+ params : InferenceParameters ,
187+ ) -> InferenceResponse :
188+ """[Deprecated] Use `enqueue_and_get_result` instead."""
189+ warnings .warn (
190+ "enqueue_and_get_inference is deprecated; use enqueue_and_get_result instead" ,
191+ DeprecationWarning ,
192+ stacklevel = 2 ,
193+ )
194+ response = self .enqueue_and_get_result (InferenceResponse , input_source , params )
195+ assert isinstance (response , InferenceResponse ), (
196+ f'Invalid response type "{ type (response )} "'
197+ )
198+ return response
0 commit comments