11from time import sleep
2- from typing import Optional , Union
2+ from typing import Optional
33
44from mindee .client_mixin import ClientMixin
55from mindee .error .mindee_error import MindeeError
1414 is_valid_get_response ,
1515 is_valid_post_response ,
1616)
17+ from mindee .parsing .v2 .common_response import CommonStatus
1718from mindee .parsing .v2 .inference_response import InferenceResponse
1819from mindee .parsing .v2 .job_response import JobResponse
1920
@@ -37,7 +38,7 @@ def __init__(self, api_key: Optional[str] = None) -> None:
3738 self .api_key = api_key
3839 self .mindee_api = MindeeApiV2 (api_key )
3940
40- def enqueue (
41+ def enqueue_inference (
4142 self , input_source : LocalInputSource , params : InferenceParameters
4243 ) -> JobResponse :
4344 """
@@ -49,39 +50,52 @@ def enqueue(
4950 :param params: Parameters to set when sending a file.
5051 :return: A valid inference response.
5152 """
52- logger .debug ("Enqueuing document to '%s' " , params .model_id )
53+ logger .debug ("Enqueuing inference using model: %s " , params .model_id )
5354
54- response = self .mindee_api .predict_async_req_post (
55- input_source = input_source , options = params
55+ response = self .mindee_api .req_post_inference_enqueue (
56+ input_source = input_source , params = params
5657 )
5758 dict_response = response .json ()
5859
5960 if not is_valid_post_response (response ):
6061 handle_error_v2 (dict_response )
61-
6262 return JobResponse (dict_response )
6363
64- def parse_queued (
65- self ,
66- queue_id : str ,
67- ) -> Union [InferenceResponse , JobResponse ]:
64+ def get_job (self , job_id : str ) -> JobResponse :
6865 """
69- Parses a queued document.
66+ Get the status of an inference that was previously enqueued.
67+
68+ Can be used for polling.
7069
71- :param queue_id: queue_id received from the API.
70+ :param job_id: UUID of the job to retrieve.
71+ :return: A job response.
7272 """
73- logger .debug ("Fetching from queue '%s'. " , queue_id )
73+ logger .debug ("Fetching job: %s " , job_id )
7474
75- response = self .mindee_api .get_inference_from_queue ( queue_id )
75+ response = self .mindee_api .req_get_job ( job_id )
7676 if not is_valid_get_response (response ):
7777 handle_error_v2 (response .json ())
78+ dict_response = response .json ()
79+ return JobResponse (dict_response )
80+
81+ def get_inference (self , inference_id : str ) -> InferenceResponse :
82+ """
83+ Get the result of an inference that was previously enqueued.
84+
85+ The inference will only be available after it has finished processing.
7886
87+ :param inference_id: UUID of the inference to retrieve.
88+ :return: An inference response.
89+ """
90+ logger .debug ("Fetching inference: %s" , inference_id )
91+
92+ response = self .mindee_api .req_get_inference (inference_id )
93+ if not is_valid_get_response (response ):
94+ handle_error_v2 (response .json ())
7995 dict_response = response .json ()
80- if "job" in dict_response :
81- return JobResponse (dict_response )
8296 return InferenceResponse (dict_response )
8397
84- def enqueue_and_parse (
98+ def enqueue_and_get_inference (
8599 self , input_source : LocalInputSource , params : InferenceParameters
86100 ) -> InferenceResponse :
87101 """
@@ -101,40 +115,28 @@ def enqueue_and_parse(
101115 params .polling_options .delay_sec ,
102116 params .polling_options .max_retries ,
103117 )
104- queue_result = self .enqueue (input_source , params )
118+ enqueue_response = self .enqueue_inference (input_source , params )
105119 logger .debug (
106- "Successfully enqueued document with job id: %s" , queue_result .job .id
120+ "Successfully enqueued inference with job id: %s" , enqueue_response .job .id
107121 )
108122 sleep (params .polling_options .initial_delay_sec )
109- retry_counter = 1
110- poll_results = self .parse_queued (
111- queue_result .job .id ,
112- )
113- while retry_counter < params .polling_options .max_retries :
114- if not isinstance (poll_results , JobResponse ):
115- break
116- if poll_results .job .status == "Failed" :
117- if poll_results .job .error :
118- detail = poll_results .job .error .detail
123+ try_counter = 0
124+ while try_counter < params .polling_options .max_retries :
125+ job_response = self .get_job (enqueue_response .job .id )
126+ if job_response .job .status == CommonStatus .FAILED .value :
127+ if job_response .job .error :
128+ detail = job_response .job .error .detail
119129 else :
120130 detail = "No error detail available."
121131 raise MindeeError (
122- f"Parsing failed for job { poll_results .job .id } : { detail } "
132+ f"Parsing failed for job { job_response .job .id } : { detail } "
123133 )
124- logger .debug (
125- "Polling server for parsing result with job id: %s" ,
126- queue_result .job .id ,
127- )
128- retry_counter += 1
134+ if job_response .job .status == CommonStatus .PROCESSED .value :
135+ return self .get_inference (job_response .job .id )
136+ try_counter += 1
129137 sleep (params .polling_options .delay_sec )
130- poll_results = self .parse_queued (queue_result .job .id )
131-
132- if not isinstance (poll_results , InferenceResponse ):
133- raise MindeeError (
134- f"Couldn't retrieve document after { retry_counter } tries."
135- )
136138
137- return poll_results
139+ raise MindeeError ( f"Couldn't retrieve document after { try_counter + 1 } tries." )
138140
139141 @staticmethod
140142 def load_inference (local_response : LocalResponse ) -> InferenceResponse :
0 commit comments