1313# limitations under the License.
1414
1515import json
16- import time
16+ import asyncio
1717import traceback
1818from typing import Dict , cast
1919
@@ -125,7 +125,10 @@ async def generate(
125125
126126
127127async def video_generate (
128- params : list , tool_context : ToolContext , batch_size : int = 10
128+ params : list ,
129+ tool_context : ToolContext ,
130+ batch_size : int = 10 ,
131+ max_wait_seconds : int = 1200 ,
129132) -> Dict :
130133 """
131134 Generate videos in **batch** from text prompts, optionally guided by a first/last frame,
@@ -139,6 +142,10 @@ async def video_generate(
139142 A list of video generation requests. Each item supports the fields below.
140143 batch_size (int):
141144 The number of videos to generate in a batch. Defaults to 10.
145+ max_wait_seconds (int):
146+ Maximum time in seconds to wait for all video tasks in each batch.
147+ Default is 20 minutes (1200 seconds). When the timeout is reached,
148+ unfinished tasks will be marked as timeout errors.
142149
143150 Required per item:
144151 - video_name (str):
@@ -241,6 +248,7 @@ async def video_generate(
241248 """
242249 success_list = []
243250 error_list = []
251+ timeout_tasks = []
244252 logger .debug (f"Using model: { getenv ('MODEL_VIDEO_NAME' , DEFAULT_VIDEO_MODEL_NAME )} " )
245253 logger .debug (f"video_generate params: { params } " )
246254
@@ -299,6 +307,10 @@ async def video_generate(
299307
300308 logger .debug ("begin query video_generate task status..." )
301309
310+ sleep_interval = 10
311+ max_sleep_times = max_wait_seconds // sleep_interval
312+ sleep_times = 0
313+
302314 while True :
303315 task_list = list (task_dict .keys ())
304316 if len (task_list ) == 0 :
@@ -332,7 +344,23 @@ async def video_generate(
332344 logger .debug (
333345 f"{ task_dict [task_id ]} video_generate current status: { status } , Retrying after 10 seconds..."
334346 )
335- time .sleep (10 )
347+ if sleep_times >= max_sleep_times :
348+ logger .error (
349+ f"video_generate polling timed out after { max_wait_seconds } seconds; remaining tasks: { task_dict } "
350+ )
351+ for task_id , video_name in task_dict .items ():
352+ timeout_tasks .append (
353+ {
354+ "task_id" : task_id ,
355+ "video_name" : video_name ,
356+ }
357+ )
358+ error_list .append (video_name )
359+ task_dict .clear ()
360+ break
361+
362+ await asyncio .sleep (sleep_interval )
363+ sleep_times += 1
336364
337365 add_span_attributes (
338366 span ,
@@ -353,6 +381,7 @@ async def video_generate(
353381 "status" : "error" ,
354382 "success_list" : success_list ,
355383 "error_list" : error_list ,
384+ "timeout_tasks" : timeout_tasks ,
356385 }
357386 else :
358387 logger .debug (
@@ -362,6 +391,7 @@ async def video_generate(
362391 "status" : "success" ,
363392 "success_list" : success_list ,
364393 "error_list" : error_list ,
394+ "timeout_tasks" : timeout_tasks ,
365395 }
366396
367397
0 commit comments