11from time import sleep
2- from typing import Optional , Union
2+ from typing import Optional , Union , Type
33
44from mindee .client_mixin import ClientMixin
55from mindee .error .mindee_error import MindeeError
66from mindee .error .mindee_http_error_v2 import handle_error_v2
7- from mindee .input import UrlInputSource
7+ from mindee .input import UrlInputSource , UtilityParameters
88from mindee .input .inference_parameters import InferenceParameters
99from mindee .input .polling_options import PollingOptions
1010from mindee .input .sources .local_input_source import LocalInputSource
1515 is_valid_post_response ,
1616)
1717from mindee .parsing .v2 .common_response import CommonStatus
18+ from mindee .v2 import BaseInferenceResponse
1819from mindee .parsing .v2 .inference_response import InferenceResponse
1920from mindee .parsing .v2 .job_response import JobResponse
2021
@@ -41,20 +42,21 @@ def __init__(self, api_key: Optional[str] = None) -> None:
4142 def enqueue_inference (
4243 self ,
4344 input_source : Union [LocalInputSource , UrlInputSource ],
44- params : InferenceParameters ,
45+ params : Union [InferenceParameters , UtilityParameters ],
46+ slug : Optional [str ] = None ,
4547 ) -> JobResponse :
4648 """
4749 Enqueues a document to a given model.
4850
4951 :param input_source: The document/source file to use. Can be local or remote.
50-
5152 :param params: Parameters to set when sending a file.
53+ :param slug: Slug for the endpoint.
54+
5255 :return: A valid inference response.
5356 """
5457 logger .debug ("Enqueuing inference using model: %s" , params .model_id )
55-
5658 response = self .mindee_api .req_post_inference_enqueue (
57- input_source = input_source , params = params
59+ input_source = input_source , params = params , slug = slug
5860 )
5961 dict_response = response .json ()
6062
@@ -79,13 +81,18 @@ def get_job(self, job_id: str) -> JobResponse:
7981 dict_response = response .json ()
8082 return JobResponse (dict_response )
8183
82- def get_inference (self , inference_id : str ) -> InferenceResponse :
84+ def get_inference (
85+ self ,
86+ inference_id : str ,
87+ inference_response_type : Type [InferenceResponse ] = InferenceResponse ,
88+ ) -> BaseInferenceResponse :
8389 """
8490 Get the result of an inference that was previously enqueued.
8591
8692 The inference will only be available after it has finished processing.
8793
8894 :param inference_id: UUID of the inference to retrieve.
95+ :param inference_response_type: Class of the product to instantiate.
8996 :return: An inference response.
9097 """
9198 logger .debug ("Fetching inference: %s" , inference_id )
@@ -94,19 +101,20 @@ def get_inference(self, inference_id: str) -> InferenceResponse:
94101 if not is_valid_get_response (response ):
95102 handle_error_v2 (response .json ())
96103 dict_response = response .json ()
97- return InferenceResponse (dict_response )
104+ return inference_response_type (dict_response )
98105
99- def enqueue_and_get_inference (
106+ def _enqueue_and_get (
100107 self ,
101108 input_source : Union [LocalInputSource , UrlInputSource ],
102- params : InferenceParameters ,
109+ params : Union [InferenceParameters , UtilityParameters ],
110+ inference_response_type : Optional [Type [InferenceResponse ]] = InferenceResponse ,
103111 ) -> InferenceResponse :
104112 """
105113 Enqueues to an asynchronous endpoint and automatically polls for a response.
106114
107115 :param input_source: The document/source file to use. Can be local or remote.
108-
109116 :param params: Parameters to set when sending a file.
117+ :param inference_response_type: The product class to use for the response object.
110118
111119 :return: A valid inference response.
112120 """
@@ -117,9 +125,14 @@ def enqueue_and_get_inference(
117125 params .polling_options .delay_sec ,
118126 params .polling_options .max_retries ,
119127 )
120- enqueue_response = self .enqueue_inference (input_source , params )
128+ slug = (
129+ inference_response_type .inference .get_slug ()
130+ if inference_response_type
131+ else None
132+ )
133+ enqueue_response = self .enqueue_inference (input_source , params , slug )
121134 logger .debug (
122- "Successfully enqueued inference with job id: %s" , enqueue_response .job .id
135+ "Successfully enqueued document with job id: %s" , enqueue_response .job .id
123136 )
124137 sleep (params .polling_options .initial_delay_sec )
125138 try_counter = 0
@@ -134,8 +147,57 @@ def enqueue_and_get_inference(
134147 f"Parsing failed for job { job_response .job .id } : { detail } "
135148 )
136149 if job_response .job .status == CommonStatus .PROCESSED .value :
137- return self .get_inference (job_response .job .id )
150+ result = self .get_inference (
151+ job_response .job .id , inference_response_type or InferenceResponse
152+ )
153+ assert isinstance (result , InferenceResponse ), (
154+ f'Invalid response type "{ type (result )} "'
155+ )
156+ return result
138157 try_counter += 1
139158 sleep (params .polling_options .delay_sec )
140159
141160 raise MindeeError (f"Couldn't retrieve document after { try_counter + 1 } tries." )
161+
162+ def enqueue_and_get_inference (
163+ self ,
164+ input_source : Union [LocalInputSource , UrlInputSource ],
165+ params : InferenceParameters ,
166+ ) -> InferenceResponse :
167+ """
168+ Enqueues to an asynchronous endpoint and automatically polls for a response.
169+
170+ :param input_source: The document/source file to use. Can be local or remote.
171+
172+ :param params: Parameters to set when sending a file.
173+
174+ :return: A valid inference response.
175+ """
176+ response = self ._enqueue_and_get (input_source , params )
177+ assert isinstance (response , InferenceResponse ), (
178+ f'Invalid response type "{ type (response )} "'
179+ )
180+ return response
181+
182+ def enqueue_and_get_utility (
183+ self ,
184+ inference_response_type : Type [InferenceResponse ],
185+ input_source : Union [LocalInputSource , UrlInputSource ],
186+ params : UtilityParameters ,
187+ ) -> InferenceResponse :
188+ """
189+ Enqueues to an asynchronous endpoint and automatically polls for a response.
190+
191+ :param input_source: The document/source file to use. Can be local or remote.
192+
193+ :param params: Parameters to set when sending a file.
194+
195+ :param inference_response_type: The product class to use for the response object.
196+
197+ :return: A valid inference response.
198+ """
199+ response = self ._enqueue_and_get (input_source , params , inference_response_type )
200+ assert isinstance (response , inference_response_type ), (
201+ f'Invalid response type "{ type (response )} "'
202+ )
203+ return response
0 commit comments