@@ -48,6 +48,7 @@ export class Veo3 extends VideoAbstract<Veo3Params> {
4848 Authorization : `Bearer ${ process . env . KIEAI_API_KEY } ` ,
4949 } ,
5050 method : 'POST' ,
51+ signal : AbortSignal . timeout ( 30000 ) ,
5152 body : JSON . stringify ( {
5253 prompt : customParams . prompt ,
5354 imageUrls : customParams ?. images ?. map ( ( p ) => p . path ) || [ ] ,
@@ -58,12 +59,18 @@ export class Veo3 extends VideoAbstract<Veo3Params> {
5859 ) . json ( ) ;
5960
6061 if ( value . code !== 200 && value . code !== 201 ) {
61- throw new Error ( `Failed to generate video` ) ;
62+ throw new Error ( value ?. msg || `Failed to generate video` ) ;
6263 }
6364
6465 const taskId = value . data . taskId ;
65- let videoUrl = [ ] ;
66- while ( videoUrl . length === 0 ) {
66+ console . log ( 'veo3 taskId' , taskId ) ;
67+ let attempts = 0 ;
68+ const maxAttempts = 180 ; // ~30 minutes at 10s interval
69+ while ( true ) {
70+ if ( attempts ++ >= maxAttempts ) {
71+ throw new Error ( 'Video generation timed out' ) ;
72+ }
73+
6774 console . log ( 'waiting for video to be ready' ) ;
6875 const data = await (
6976 await fetch (
@@ -73,18 +80,34 @@ export class Veo3 extends VideoAbstract<Veo3Params> {
7380 'Content-Type' : 'application/json' ,
7481 Authorization : `Bearer ${ process . env . KIEAI_API_KEY } ` ,
7582 } ,
83+ signal : AbortSignal . timeout ( 30000 ) ,
7684 }
7785 )
7886 ) . json ( ) ;
7987
80- if ( data . code !== 200 && data . code !== 400 ) {
81- throw new Error ( `Failed to get video info` ) ;
88+ if ( data . code !== 200 ) {
89+ throw new Error ( data ?. msg || `Failed to get video info` ) ;
90+ }
91+
92+ // successFlag: 0 = generating, 1 = success, anything else = failed
93+ const successFlag = data ?. data ?. successFlag ;
94+ if ( successFlag !== 0 && successFlag !== 1 ) {
95+ throw new Error (
96+ data ?. data ?. errorMessage ||
97+ `Video generation failed (status ${ successFlag } )`
98+ ) ;
99+ }
100+
101+ const videoUrl = data ?. data ?. response ?. resultUrls || [ ] ;
102+ if ( videoUrl . length > 0 ) {
103+ return videoUrl [ 0 ] ;
104+ }
105+
106+ if ( successFlag === 1 ) {
107+ throw new Error ( 'Video generation succeeded but no video URL returned' ) ;
82108 }
83109
84- videoUrl = data ?. data ?. response ?. resultUrls || [ ] ;
85110 await timer ( 10000 ) ;
86111 }
87-
88- return videoUrl [ 0 ] ;
89112 }
90113}
0 commit comments