
    5ik                    J   d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZ dd	lmZmZmZmZmZmZmZmZmZmZmZ dd
l m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z)  ejT                  e+      Z, e       Z-	 	 	 	 	 	 	 	 	 	 ddZ.ddZ/ G d d      Z0y)u  
Pipeline orchestrator – runs all 5 agents in sequence and assembles the
ProductionPlan.

Flow:
  1. ScriptAnalyzer   → narrative beats
  2. FrameExpander    → 25 frames/min with camera variety
  3. PromptEngineer   → image + video prompt per frame (one LLM call each)
  4. TTSScriptwriter  → narration text per frame
  5. TimelinePlanner  → exact timestamps and cut points
    )annotationsN)Path)CallableOptional)ThreadPoolExecutor)Console)	BarColumnMofNCompleteColumnProgressSpinnerColumn
TextColumnTimeElapsedColumn)AllScenePromptsAllSceneTTSExpandedFrameBreakdownPipelineConfigPipelineEventPipelineModeProductionPlanProductionSceneSceneBreakdownSceneTTSTimeline)ScriptAnalyzerAgent)FrameExpanderAgent)PromptEngineerAgent)TTSScriptwriterAgent)TimelinePlannerAgentc                <   g }|j                   D ci c]  }|j                  | }}|j                   D ci c]  }|j                  | }}|j                   D ci c]  }|j                  | }	}| j                  D ]  }
|
j                  }|j	                  |      }|j	                  |      }|	j	                  |      }|j                  t        d i d|d|r|j                  ndd|r|j                  ndd|r|j                  ndd|r|j                  ndd|r|j                  nd	d
|r|j                  r|j                  n|
j                  d|
j                  d|
j                  d|
j                   d|
j"                  d|
j$                  d|
j&                  d|r|j(                  ndd|r|j*                  ndd|r|j,                  n|
j.                  d|r|j0                  ndd|
j2                  d|r|j4                  n|
j4                  d|r|j6                  n|
j6                  d|r|j8                  ndd|r|j:                  n|
j                  dt=        |
dd      dt=        |
dd      dt=        |
dd              |S c c}w c c}w c c}w )!zBCombine outputs from all agents into unified ProductionScene list.scene_number
time_startz00:00.00time_endduration_secondsg        	cut_point
transitionzcrossfade 0.3senvironmentpose_actionmoodcamera_shotcamera_movementcompositionvisual_focusimage_prompt video_prompttts_textvoice_directionnarration_notes	sync_wordanatomical_highlightclothing_descriptionemotional_tonecoverage_group_idNcoverage_angle_indexr   coverage_angle_type )scenesr    framesframe_numbergetappendr   r!   r"   r#   r$   r%   r&   environment_detailr'   r(   r)   r*   r+   r,   r-   r/   r0   narration_textr1   r2   r3   r4   r5   r6   getattr)r<   promptsttstimeliner;   p
prompt_mapttts_maptime_mapframentms                1/root/.openclaw/workspace/visionaryfx/pipeline.py_merge_into_production_scenesrO   :   s    %'F-4^^<!..!#<J<*-**5Qq~~q 5G5+3??;a!;H; '
NN1KKN\\!_ ,.2==J )+
 9;!4!4	
 +-",,* -/2==4D  MM-- "-- ZZ "-- !& 5 5 "-- #//  01Q^^b!" 01Q^^b#$ ()e.B.B%& 67 1 1B'( !& 5 5)* *+!+++.  &'%;%;//12 @AQ%;%;b34 45q//%**58 #*%1Dd"K9: &-U4JA%N;< %,E3H"$M=!	
'
P MY =5;s   JJJc                v   ddd| j                    d| j                   dt        | j                   t        | j                  dz  d      z         ddd	d
dddddddd| j
                  j                   d| j
                  j                   d| j
                  j                   d| j
                  j                   d| j
                  j                   dddd| j                  j                   d| j                  j                   d| j                  j                   dg}| j                  D ]  }|j!                  d|j"                   d|j$                  dd|j&                          |j!                  d|j$                  dd |j&                          |j!                  d!|j(                   d"|j*                           |dd#d$| j                  j,                  j/                          d%| j                  j                   d&| j                  j                   d'd| j                   dd(d)| j0                   d*gz  }|S )+z,Generate step-by-step assembly instructions.z=== ASSEMBLY INSTRUCTIONS ===r.   zTotal frames: Total duration: zFrames per minute: ~<   g?u   STEP 1 — GENERATE IMAGESzxFor each frame below, copy the 'Image Prompt' and paste it into your image generator (DALL-E 3, Midjourney, Flux, etc.).z*Save each generated image as frame_XX.png.u   STEP 2 — GENERATE VIDEO CLIPSzFor each frame, upload the generated image to your video generator (Runway ML, Kling AI, Luma, etc.) and paste the 'Video Prompt'.z%Save each video clip as frame_XX.mp4.u   STEP 3 — GENERATE VOICEOVERzAFor each frame, copy the 'TTS Text' and paste it into ElevenLabs.zUse Voice ID: zUse Model: zStability: z | Similarity: z
 | Speed: z Save each audio as frame_XX.mp3.u#   STEP 4 — ASSEMBLE IN VIDEO EDITORzCreate a new project: z @ zfps ()z  [z] Place frame_02dz.mp4 at z    Overlay frame_z.mp3 audio at z    Cut at z | u   STEP 5 — EXPORTz
Export as  (z, zfps)u   STEP 6 — PUBLISHz
Upload to z and add captions/hashtags.)total_scenestotal_duration_formattedroundmaxtotal_duration_secondsvoice_settingsvoice_idmodel_id	stabilitysimilarity_boostspeedexport_settings
resolutionfpsaspect_ratior;   r?   r)   r    r!   r$   r%   video_formatuppertarget_platform)planinstructionsss      rN   _build_assembly_instructionsrk   r   s    	(

**+,
4889:
uT%6%6T=X=X[]=]_b9c%cdef
$	>4
)	J/
'K
,,5567
d))2234
d))334 5**;;< =%%++,	. 	+
-
 !5!5!@!@ A##
$E$*>*>*K*K)LA	O7L> [[ J!--q~~c.B C,,!	
 	  4N1<<.Q	
 	k!++c!,,HIJ 

T))66<<>? @  ++,Bt/C/C/G/G.H	N
4889:

T))**EF	 	L     c                  J    e Zd ZdZ	 d		 	 	 d
dZddZddZddZddZddZ	y)Pipelinez;Orchestrates the full video production pipeline (5 agents).Nc                B    || _         |j                  | _        || _        y N)config	llm_modelmodel	_on_event)selfrq   on_events      rN   __init__zPipeline.__init__   s    
 %%
!rl   c                R    | j                   | j                  t        di |       yy)z2Emit a pipeline event if a callback is registered.Nr:   )rt   r   )ru   kwargss     rN   _emitzPipeline._emit   s%    >>%NN=2623 &rl   c                    | j                   }	 | j                  ||      S # t        $ r"}| j                  dt	        |              d}~ww xY w)z1Execute the pipeline and return a ProductionPlan.error
event_typemessageN)rq   _run_pipeline	Exceptionrz   str)ru   storycfgexcs       rN   runzPipeline.run   sJ    kk	%%eS11 	JJ'3s8J<	s     	AAAc                     j                  dddd       t        t               t        d      t              5 }|j                  dd	
      }t         j                        }|j                  |j                        }|j                  |d       d	d	d	       t        j                  dj                   d        j                  ddd|j                   d        j                  ddddj                   d       t        t               t        d      t              5 }|j                  dj                   dd	
      }t         j                        }|j                  |      |j                  |d       d	d	d	       t        j                  dj                    d        j                  dddj                    d        j                  ddddj                    ddj                           j                  dd d!d"       t        j                  d#       dA fd$}dB fd%}	t#        d&      5 }
|
j%                  |      }|
j%                  |	      }|j'                         }|j'                         }d	d	d	       t)        d' j*                  D              }|r?j*                  D ci c],  }t-        |d(d      dk(  rt-        |d)d	      r|j.                  |. }}i }j0                  D ]<  }|j3                  |j4                        }|s!|j6                  s.|||j6                  <   > g }j*                  D ]h  }t-        |d(d      dkD  st-        |d)d	      }|s$||v s)||   }|j9                  t;        |j.                  |j<                  |j>                  *             j |j0                  jA                  |       |j0                  jC                  d+ ,       t        j                  dtE        j0                         d-       t        j                  dtE        j0                         d.        j                  dddtE        |j0                         d/        j                  dd d!tE        |j0                         d0        j                  dd1d2d3       t        t               t        d      t              5 }|j                  d4d	
      }tG        5      }|jI                  |      }|j                  |d6       d	d	d	       t        j                  d7jJ                   d8        j                  dd1d2d9|jJ                          tM        |||      }tO        jP                  jR                  |jJ                  |jT                  j                   j                  jV                  jX                  jZ                  j\                  j^                  |:
      }ta        |      |_1        jd                  tf        jh                  k(  r jk                  |       n.jd                  tf        jl                  k(  r jo                  |        j                  d;d<|jP                   d=|j                   d>|jJ                   d?@       |S # 1 sw Y   xY w# 1 sw Y   +xY w# 1 sw Y   4xY wc c}w # 1 sw Y   xY w)Cz0Internal pipeline execution with event emission.agent_start   zScript Analyzerz(Analyzing script into narrative beats...)r~   agent_number
agent_namer   z[bold blue]{task.description})consolez3Agent 1/5: Analyzing script into narrative beats...N)totalrs   z![green]Agent 1/5: Script analyzed)descriptionz
  [dim]-> z! narrative beats identified[/dim]agent_completez narrative beats identified   zFrame ExpanderzExpanding beats into ~z cinematic frames...z!Agent 2/5: Expanding beats into ~z![green]Agent 2/5: Frames expandedz' frames with varied camera angles[/dim]z! frames with varied camera angles   zPrompt EngineerzEngineering prompts (z frames, streaming)...r   )r~   r   r   r   progress_currentprogress_total   zTTS ScriptwriterzWriting narration scripts...z_
[bold blue]Agents 3+4/5: Running Prompt Engineer + TTS Scriptwriter in parallel...[/bold blue]c                 h    t        j                        } | j                  j                        S )Nr   )r   rs   generatecharacter_template)prompterr   r<   ru   s    rN   _run_prompt_engineerz4Pipeline._run_pipeline.<locals>._run_prompt_engineer  s*    *<H$$VS-C-CDDrl   c                    t        j                        } ddlm} t	        d j
                  D              }j
                  D cg c]  }|rt        |dd      dk(  r| }}t        j                  j                  t        |      |D cg c]L  } ||j                  |j                  |j                  |j                  |j                  |j                         N c}      }| j#                  |      S c c}w c c}w )Nr   r   )SceneAnalysisc              3  6   K   | ]  }t        |d d        ywr7   NrB   .0fs     rN   	<genexpr>zHPipeline._run_pipeline.<locals>._run_tts_scriptwriter.<locals>.<genexpr>$  s      #:;.5#   r8   )r    r&   r'   r(   rA   r2   )titlesummaryrV   r;   )r   rs   modelsr   anyr<   rB   r   r   r   lenr=   r@   r'   r(   rA   r2   r   )
tts_writerr   coverage_enabledr   tts_source_framesframe_as_scenesr<   ru   s         rN   _run_tts_scriptwriterz5Pipeline._run_pipeline.<locals>._run_tts_scriptwriter  s    -DJJ?J,  # #?E}}#   "==!'716La+PTU+U ! !
 -ll !23 /
  "%&^^$%$8$8$%MMVV'('7'7()(9(9
	O  &&77+!
s   C8AC=)max_workersc              3  6   K   | ]  }t        |d d        ywr   r   r   s     rN   r   z)Pipeline._run_pipeline.<locals>.<genexpr>F  s      
67GA*D1
r   r8   r7   )r    r0   r1   c                    | j                   S rp   )r    )rj   s    rN   <lambda>z(Pipeline._run_pipeline.<locals>.<lambda>c  s
    !.. rl   )keyz& image + video prompts generated[/dim]z TTS scripts[/dim]z  image + video prompts generatedz TTS scripts generated   zTimeline PlannerzPlanning timeline...zAgent 5/5: Planning timeline...)rq   z%[green]Agent 5/5: Timeline calculatedz  [dim]-> Total duration: [/dim]rQ   )
r   r   rW   rZ   rV   rg   character_template_namer[   ra   r;   pipeline_completezPipeline complete: rU   z	 scenes, rS   r}   )returnr   )r   r   )8rz   r   r   r   r   add_taskr   rs   analyzerg   updateprintrV   frames_per_minuter   expandtotal_framesr   submitresultr   r<   rB   r=   r;   r>   r    r7   r?   r   r0   r1   extendsortr   r   rh   rW   rO   r   r   r   rZ   valuer   namer[   ra   rk   assembly_instructionsmoder   PLAN_AND_IMAGES_generate_imagesGENERATE_generate_all_assets)ru   r   r   progresstaskanalyzer	breakdownexpanderr   r   executorprompt_future
tts_futurerC   rD   r   r   master_frame_maptts_by_group	scene_ttsmaster_framesecondary_ttsgroup_idsrcplannerrE   production_scenesrh   r<   s   ` `                         @rN   r   zPipeline._run_pipeline   s    	

$(>	 	 	
 O67
 
	S $$ET % D +<H(0(8(8@S@S(TIOOD.QOR
	S 	//00QR	
 	

'( --..IJ	 	 	
 	

$',S-B-B,CCWX	 	 	
 O67
 	S $$3C4I4I3J K& ' % D
 *

;H-5__Y-LFOOD.QOR	S 	,,--TU	
 	

''**++LM	 	 	
 	

$(+F,?,?+@@VW!.. 	 	
 	

$)2	 	 	
 	)	

	E	8>  A. 	3($OO,@AM!)>?J'4';';'=G)002C	3  
;A==
 
  ,2== &'14a8A=A2D9 !   
 13L ZZ M	/33I4J4JKL$B$BCLL!?!?@M M]] 	14a81<&q*=tDHH$<*84%,,X)*%(\\,/,?,?. 	 JJm,JJOO 8O9W^^,--ST	
 	
3szz?"33EFG

'(7>>*++KL	 	 	
 	

')3::''=>	 	 	
 	

$)*	 	 	
 O67
 	W $$%Fd$SD*#6G!(c!2HOOD.UOV	W 	()J)J(K6R	
 	

')&x'H'H&IJ	 	 	
 :GS(
 ,,NN%-%F%F#+#B#B,,//55$'$:$:$?$?--//$
 &B$%G" 88|333!!$'XX...%%d+

*)$**R8I8I7J)TXTqTqSrrst 	 	

 u
	S 
	S8	S 	S\	3 	3 b	W 	Ws9   AZ!(AZ.AZ;>1[A[!Z+.Z8;[[c                ,   t        | j                  j                        dz  }|j                  dd       t        j                  d       	 ddl}ddlm}m	} ddl
}|j                  dd	      }|j                  d
d	      }|j                  |j                  dd      j                         d       |||      |j                         }		 |	j                  j!                               }
|
st#        d      t        j                  dj$                   d       i }|j&                  D ]  }|d|j(                  ddz  }t+        |dd      }t+        |dd      }t+        |dd	      }d}|rW|dkD  rR|j                  |      }|r#t        j                  d| d| d|dd  d       nt        j                  d| d| d       |r+|j,                  ||ffd	}|	j                   |              n-|	j                  j/                  |j,                  |              |r7|dk(  r2j0                  }|r$|||<   t        j                  d!| d"|dd  d       |r|rd#| d$nd	}t        j                  d%|j(                   d&|j2                   | d'       | j5                  d(|j(                  dt7        |      |j(                  |j2                  d)|j(                   d&|j2                   d*+        	 |	j                  j9                                |	j;                          t        j                  d,       y# |	j                  j9                                |	j;                          w xY w# t<        $ r}t        j                  d-| d.        d}~ww xY w)/z0Generate only images (for PLAN_AND_IMAGES mode).assetsTparentsexist_okzE
[bold yellow]Generating images with Nano Banana Pro...[/bold yellow]r   N)FlowBrowserEngineASPECT_RATIOSGOOGLE_FLOW_SESSION_TOKENr.   GOOGLE_FLOW_CSRF_TOKENGOOGLE_FLOW_ASPECT_RATIOportraitIMAGE_ASPECT_RATIO_PORTRAITz!FlowBrowserEngine failed to startu:   [dim]Using Flow / Nano Banana Pro (GEM_PIX_2) — project=r   frame_rT   .pngr7   r8   r9   u   [dim]  → Coverage ref [z / z]: using master    u	   …[/dim]u)   [yellow]  ⚠ No master captured yet for z angle u*    — generating without reference[/yellow]c                   K   j                  |       d {    	 j                  | |       d {   j                          d {    S 7 97 7 	# j                          d {  7   w xY ww)Nrd   )set_reference_imager   clear_reference_image)_prompt_path_refaspectengines      rN   _gen_with_refz0Pipeline._generate_images.<locals>._gen_with_ref  sy     
 #)"<"<T"BBBE-3__$+U .= ." (" '-&B&B&D D D C(" !Ef&B&B&D D DsS   A6AA6A AA A6AA6A A6A3,A/-A33A6r   u   [dim]  → Master captured [z]: z []u   [green]✓ Frame /[/green]image_generatedzImage z
 generated)r~   image_scene_numberimage_base64
image_pathr   r   r   z/
[bold green]All images generated![/bold green]z[red]Image generation failed: [/red])r   rq   
output_dirmkdirr   r   asyncioproviders.flow_browser_enginer   r   osgetenvr>   lowernew_event_looprun_until_completestartRuntimeError
project_idr;   r    rB   r-   r   last_media_idrV   rz   r   stopcloser   )ru   rh   r   r   r   r   r  sessioncsrfloopokcoverage_master_media_idsrj   img_pathcoverage_groupangle_index
angle_typereference_media_idr   
master_midangle_labelr   r   r   s                         @@rN   r   zPipeline._generate_images  s   $++001H<
5T	
n	Vii ;R@G995r:D"&&		4jAGGI-F
 'w5F))+D\,,V\\^<&'JKKPQWQbQbPccij =?) MA)fQ^^C4H,MMH &-Q0CT%JN")!-CQ"GK!(,A2!FJ59&%+/-F-J-J*.* .#MM";N;K3zl [00B3B0G/H	!S
 $MM"KNK[ \))45_!a * %&NN"*!3E //@//"OO !v ,  &+*:%+%9%9
%HR5nE#MM">~>Nc#-cr?"39!> /="ZL*QS   MM+ANN+;1T=N=N<OP[}\de JJ#4+,>>%)#&x=)*'+'8'8"((8$:K:K9LJ W  KM^ ''6

MMLM ''6

 	MM:3%vFG	s3   A=M+ H%L7 2AM+ 71M((M+ +	N4NNc           
         t         j                  j                        dz  }|j                  dd       t        j                  d        j                         	 ddlm} t         j                  j                  dd      }t        j                  d	|j                          d
        | j                  j                        }j                  D ]o  }|dk(  rdnd}|d|j                  d| z  }|j                  |j                  |       t        j                  d|j                   dj                    d| d       q t        j                  d|j                          d       	 ddlm}
 t        j                  d        j-                  ddddj                           |
       }j                  D ]  }|d|j                  ddz  }|d|j                  dd z  }|j/                         s!t$        j1                  d!|j                         \|j                  fd2 fd"}	 |j                  ||j2                  ||#       t        j                  d$|j                   dj                    d%        |j7                          t        j                  d)        j-                  d*dd+j                    d,-       y# t"        $ r9}	t        j                  d|	 d       t$        j'                  d       Y d}	~	d}	~	ww xY w# t"        $ rR}t$        j5                  d&|j                  |       t        j                  d'|j                   d(| d       Y d}~d}~ww xY w# t8        $ r#}t        j                  d.| d/       Y d}~yd}~wt"        $ r8}	t        j                  d0|	 d       t$        j'                  d1       Y d}	~	yd}	~	ww xY w)3z<Generate all assets: images, TTS, video (for GENERATE mode).r   Tr   zL
[bold yellow]Generating all assets (this may take a while)...[/bold yellow]r   )get_tts_providertts_provider
chatterboxz'
[bold yellow]Generating TTS audio via z...[/bold yellow]z.wavz.mp3r   rT   u   [green]✓ Audio r   rU   z	)[/green]z([bold green]All TTS audio generated via z![/bold green]z[red]TTS generation failed: r   zTTS generation errorN)GrokVideoProviderzB
[bold yellow]Generating video clips via Grok I2V...[/bold yellow]r   Video Generatorz&Generating video clips via Grok I2V...r~   r   r   r   r   r   z.mp4z,Image not found for scene %d, skipping videoc           	     T    j                  ddd| d|  d|j                         y )Nagent_progressr  zScene z: %r  )rz   rV   )r   _snrh   ru   s     rN   _on_video_progressz9Pipeline._generate_all_assets.<locals>._on_video_progressn  s8    JJ#3#4"(Rz ;),'+'8'8  rl   )r   r/   output_pathon_progressu   [green]✓ Video r   zVideo failed for scene %d: %su   [red]✗ Video z	 failed: z3[bold green]Video generation complete![/bold green]r   zVideo generation complete (z clips))r~   r   r   z 
[dim]Video generation skipped: r   z[red]Video generation failed: zVideo generation failed)r   intr   None)r   rq   r   r   r   r   r   	providersr  rB   r[   rf   r;   r    r   r0   rV   r   logger	exceptionproviders.grok_video_providerr  rz   existswarningr/   r|   r  EnvironmentError)ru   rh   r   r  provider_nametts_provrj   ext
audio_pathr   r  
video_provr  vid_pathr$  vid_excenv_excs   ``               rN   r   zPipeline._generate_all_assets)  s   $++001H<
5	
 	d#	52#**NLM MM:=;N;N;P:QQbc ((B(BCH[[  - =f6'F1>>#2Fse*LL
!!!**j9''7q9J9J8K2m_\ef MM:=;N;N;P:QQ_`A	8GMMU JJ(,@!"#00   +,J[[ #%&0DD(II%&0DD(II(NNF :;.. ''#+%&^^$,$6	 (  MM+ANN+;1T=N=N<OxX5#J MMOPJJ+,5d6G6G5HP  y  	5MM8VDE344	5d ! LL7 MM)!..)97)6R 	    	OMM=gYfMNN 	8MM:3%vFG677	8sk   DK /B=M) -AL<A	M) 	L.LL	M&AM!M) !M&&M) )	O2NO.OOrp   )rq   r   rv   z)Optional[Callable[[PipelineEvent], None]])r   r(  )r   r   r   r   )r   r   r   r   r   r   )rh   r   r   r(  )
__name__
__module____qualname____doc__rw   rz   r   r   r   r   r:   rl   rN   rn   rn      s@    E
 ?C"" <"4
dLwrl8rl   rn   )
r<   r   rC   r   rD   r   rE   r   r   zlist[ProductionScene])rh   r   r   z	list[str])1r;  
__future__r   loggingpathlibr   typingr   r   concurrent.futuresr   rich.consoler   rich.progressr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   agents.script_analyzerr   agents.frame_expanderr   agents.prompt_engineerr   agents.tts_scriptwriterr   agents.timeline_plannerr   	getLoggerr8  r*  r   rO   rk   rn   r:   rl   rN   <module>rI     s   
 #   % 1       7 4 6 8 8			8	$
)5"55 
5 	5
 5p5zf8 f8rl   