@@ -191,6 +191,7 @@ async def wait(
191191 task : Union [str , DashScopeAPIResponse ],
192192 api_key : str = None ,
193193 workspace : str = None ,
194+ wait_timeout : int = - 1 ,
194195 ** kwargs ,
195196 ) -> DashScopeAPIResponse :
196197 """Wait for async task completion and return task result.
@@ -199,6 +200,12 @@ async def wait(
199200 task (Union[str, DashScopeAPIResponse]): The task_id, or
200201 async_call response.
201202 api_key (str, optional): The api_key. Defaults to None.
203+ workspace (str, optional): The dashscope workspace id.
204+ wait_timeout (int, optional): The maximum seconds to wait
205+ for the task to complete. Default is -1, which means no
206+ timeout. When set to a value > 0, if the task does not
207+ complete within this time, a timeout error response will
208+ be returned.
202209
203210 Returns:
204211 DashScopeAPIResponse: The async task information.
@@ -208,6 +215,7 @@ async def wait(
208215 max_wait_seconds = 5
209216 increment_steps = 3
210217 step = 0
218+ start_time = time .time ()
211219 while True :
212220 step += 1
213221 # we start by querying once every second, and double
@@ -217,6 +225,23 @@ async def wait(
217225 # (server side return immediately when ready)
218226 if wait_seconds < max_wait_seconds and step % increment_steps == 0 :
219227 wait_seconds = min (wait_seconds * 2 , max_wait_seconds )
228+ if wait_timeout is not None and 0 < wait_timeout <= (
229+ time .time () - start_time
230+ ):
231+ logger .warning (
232+ "Wait task: %s timeout after %s seconds." ,
233+ task_id ,
234+ wait_timeout ,
235+ )
236+ return DashScopeAPIResponse (
237+ request_id = task_id ,
238+ status_code = HTTPStatus .REQUEST_TIMEOUT ,
239+ code = "WaitTaskTimeout" ,
240+ message = (
241+ f"Wait task: { task_id } timeout after "
242+ f"{ wait_timeout } seconds."
243+ ),
244+ )
220245 rsp = await cls ._get (
221246 task_id ,
222247 api_key ,
@@ -600,6 +625,10 @@ def call(
600625 ** kwargs ,
601626 ) -> DashScopeAPIResponse :
602627 """Call service and get result."""
628+ wait_timeout = - 1
629+ if "wait_timeout" in kwargs :
630+ wait_timeout = kwargs .pop ("wait_timeout" )
631+
603632 task_response = cls .async_call ( # type: ignore[misc]
604633 * args ,
605634 api_key = api_key ,
@@ -610,6 +639,7 @@ def call(
610639 task_response ,
611640 api_key = api_key ,
612641 workspace = workspace ,
642+ wait_timeout = wait_timeout ,
613643 )
614644 return response
615645
@@ -767,6 +797,7 @@ def wait(
767797 task : Union [str , DashScopeAPIResponse ],
768798 api_key : str = None ,
769799 workspace : str = None ,
800+ wait_timeout : int = - 1 ,
770801 ** kwargs ,
771802 ) -> DashScopeAPIResponse :
772803 """Wait for async task completion and return task result.
@@ -775,6 +806,12 @@ def wait(
775806 task (Union[str, DashScopeAPIResponse]): The task_id, or
776807 async_call response.
777808 api_key (str, optional): The api_key. Defaults to None.
809+ workspace (str, optional): The dashscope workspace id.
810+ wait_timeout (int, optional): The maximum seconds to wait
811+ for the task to complete. Default is -1, which means no
812+ timeout. When set to a value > 0, if the task does not
813+ complete within this time, a timeout error response will
814+ be returned.
778815
779816 Returns:
780817 DashScopeAPIResponse: The async task information.
@@ -784,6 +821,7 @@ def wait(
784821 max_wait_seconds = 5
785822 increment_steps = 3
786823 step = 0
824+ start_time = time .time ()
787825 while True :
788826 step += 1
789827 # we start by querying once every second, and double
@@ -794,6 +832,23 @@ def wait(
794832 # (server side return immediately when ready)
795833 if wait_seconds < max_wait_seconds and step % increment_steps == 0 :
796834 wait_seconds = min (wait_seconds * 2 , max_wait_seconds )
835+ if wait_timeout is not None and 0 < wait_timeout <= (
836+ time .time () - start_time
837+ ):
838+ logger .warning (
839+ "Wait task: %s timeout after %s seconds." ,
840+ task_id ,
841+ wait_timeout ,
842+ )
843+ return DashScopeAPIResponse (
844+ request_id = task_id ,
845+ status_code = HTTPStatus .REQUEST_TIMEOUT ,
846+ code = "WaitTaskTimeout" ,
847+ message = (
848+ f"Wait task: { task_id } timeout after "
849+ f"{ wait_timeout } seconds."
850+ ),
851+ )
797852 rsp = cls ._get (task_id , api_key , workspace = workspace , ** kwargs )
798853 if rsp .status_code == HTTPStatus .OK :
799854 if rsp .output is None :
0 commit comments