1
1
from time import sleep
2
- from typing import Optional , Union
2
+ from typing import Optional
3
3
4
4
from mindee .client_mixin import ClientMixin
5
5
from mindee .error .mindee_error import MindeeError
14
14
is_valid_get_response ,
15
15
is_valid_post_response ,
16
16
)
17
+ from mindee .parsing .v2 .common_response import CommonStatus
17
18
from mindee .parsing .v2 .inference_response import InferenceResponse
18
19
from mindee .parsing .v2 .job_response import JobResponse
19
20
@@ -37,7 +38,7 @@ def __init__(self, api_key: Optional[str] = None) -> None:
37
38
self .api_key = api_key
38
39
self .mindee_api = MindeeApiV2 (api_key )
39
40
40
- def enqueue (
41
+ def enqueue_inference (
41
42
self , input_source : LocalInputSource , params : InferenceParameters
42
43
) -> JobResponse :
43
44
"""
@@ -49,39 +50,52 @@ def enqueue(
49
50
:param params: Parameters to set when sending a file.
50
51
:return: A valid inference response.
51
52
"""
52
- logger .debug ("Enqueuing document to '%s' " , params .model_id )
53
+ logger .debug ("Enqueuing inference using model: %s " , params .model_id )
53
54
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
56
57
)
57
58
dict_response = response .json ()
58
59
59
60
if not is_valid_post_response (response ):
60
61
handle_error_v2 (dict_response )
61
-
62
62
return JobResponse (dict_response )
63
63
64
- def parse_queued (
65
- self ,
66
- queue_id : str ,
67
- ) -> Union [InferenceResponse , JobResponse ]:
64
+ def get_job (self , job_id : str ) -> JobResponse :
68
65
"""
69
- Parses a queued document.
66
+ Get the status of an inference that was previously enqueued.
67
+
68
+ Can be used for polling.
70
69
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.
72
72
"""
73
- logger .debug ("Fetching from queue '%s'. " , queue_id )
73
+ logger .debug ("Fetching job: %s " , job_id )
74
74
75
- response = self .mindee_api .get_inference_from_queue ( queue_id )
75
+ response = self .mindee_api .req_get_job ( job_id )
76
76
if not is_valid_get_response (response ):
77
77
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.
78
86
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 ())
79
95
dict_response = response .json ()
80
- if "job" in dict_response :
81
- return JobResponse (dict_response )
82
96
return InferenceResponse (dict_response )
83
97
84
- def enqueue_and_parse (
98
+ def enqueue_and_get_inference (
85
99
self , input_source : LocalInputSource , params : InferenceParameters
86
100
) -> InferenceResponse :
87
101
"""
@@ -101,40 +115,28 @@ def enqueue_and_parse(
101
115
params .polling_options .delay_sec ,
102
116
params .polling_options .max_retries ,
103
117
)
104
- queue_result = self .enqueue (input_source , params )
118
+ enqueue_response = self .enqueue_inference (input_source , params )
105
119
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
107
121
)
108
122
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
119
129
else :
120
130
detail = "No error detail available."
121
131
raise MindeeError (
122
- f"Parsing failed for job { poll_results .job .id } : { detail } "
132
+ f"Parsing failed for job { job_response .job .id } : { detail } "
123
133
)
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
129
137
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
- )
136
138
137
- return poll_results
139
+ raise MindeeError ( f"Couldn't retrieve document after { try_counter + 1 } tries." )
138
140
139
141
@staticmethod
140
142
def load_inference (local_response : LocalResponse ) -> InferenceResponse :
0 commit comments