+
    Uî—i8‘  ã                  óÈ   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	 ^ RI
Ht ^ RIHtHtHtHtHt ^ RIHt ]P(                  ! ]4      t ! R R4      tR	t ! R
 R]4      tR# )ut  
Prompt Engineer Agent â€“ generates image and video prompts per frame.

Uses a SINGLE streaming LLM call for ALL frames. A brace-counting JSON
extractor parses complete ScenePrompts objects in real-time as the model
streams them, providing per-scene progress feedback.

Falls back to instructor-based single-frame calls for any scenes that
fail to parse from the stream.
)ÚannotationsN)ÚCallableÚIteratorÚOptional)ÚValidationError)ÚAllScenePromptsÚCharacterTemplateÚExpandedFrameBreakdownÚFrameÚScenePrompts)Ú	BaseAgentc                  ó,   € ] tR t^#tRtR tR R ltRtR# )ÚStreamingJsonExtractorzƒBrace-counting parser that extracts top-level JSON objects from a
stream of text chunks.  Handles nested braces and escaped quotes.c                	óL   € R V n         ^ V n        RV n        RV n        RV n        R# )Ú FNéÿÿÿÿ)Ú_bufÚ_depthÚ
_in_stringÚ_escape_nextÚ
_obj_start)Úselfs   &ÚS/home/gabslocked/Desktop/Projetos/Images/video_automation/agents/prompt_engineer.pyÚ__init__ÚStreamingJsonExtractor.__init__'   s&   € ØˆŒ	ØˆŒØˆŒØ!ˆÔØˆŽó    c               ó    € V ^8„  d   QhRRRR/# )é   ÚchunkÚstrÚreturnz	list[str]© )Úformats   "r   Ú__annotate__Ú#StreamingJsonExtractor.__annotate__.   s   € ÷ ñ ˜#ð  )ñ r   c                óÞ  € . pV EFc  pV ;P                   V,          un         V P                  '       d
   RV n        K8  VR8X  d   V P                  '       d
   RV n        KZ  VR8X  d   V P                  '       * V n        Ky  V P                  '       d   K  VR8X  dN   V P                  ^ 8X  d"   \	        V P                   4      ^,
          V n        V ;P                  ^,          un        Ká  VR8X  g   Kê  V ;P                  ^,          un        V P                  ^ 8X  g   EK  V P
                  ^ 8¼  g   EK+  V P                   V P
                  R pVP                  V4       RV n         R	V n        EKf  	  V# )
zBFeed a text chunk, return list of complete top-level JSON objects.FÚ\TÚ"Ú{Ú}Nr   r   )r   r   r   r   Úlenr   Úappend)r   r   ÚobjectsÚchÚobj_strs   &&   r   ÚfeedÚStreamingJsonExtractor.feed.   s
  € àˆÜˆBØIŠI˜OIà× × Ð Ø$)Ô!ÙØTŒz˜dŸoŸo˜oØ$(Ô!ÙØSŒyØ&*§o¡oÔ"5”ÙØˆÙàSŒyØ—;‘; !Ô#Ü&)¨$¯)©)£n°qÕ&8D”OØ—’˜qÕ —Øs–Ø—’˜qÕ •Ø—;‘; !×#¨¯©¸1×(<Ø"Ÿi™i¨¯©Ð(8Ð9GØ—N‘N 7Ô+Ø "D”IØ&(D—Oñ3 ð4 ˆr   )r   r   r   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r/   Ú__static_attributes__r!   r   r   r   r   #   s   † ñIò÷ñ r   r   uID  You are an expert AI image and video prompt engineer creating photorealistic, high-quality visuals
for viral short-form video with STRICT VISUAL CONSISTENCY and CINEMATIC VIDEO PROMPTS.

You will receive ALL {total_frames} frames at once. For EACH frame, output a JSON object
(one after another, NOT inside an array) with these exact fields:

  scene_number, image_prompt, video_prompt, sync_word, anatomical_highlight,
  clothing_description, environment, emotional_tone, camera_move, character_action, sound_effects

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 1: IMAGE PROMPT STRUCTURE (FOLLOW THIS ORDER EXACTLY)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

Each image_prompt MUST follow this EXACT structure order:

1. SCENE OPENER (first sentence): Start with the SPECIFIC environment, action, and mood.
   Use vivid, unique details that make THIS scene visually distinct.

2. CHARACTER IN ACTION (second part): Describe the character PERFORMING the specific
   pose/action for THIS scene, integrated naturally into the environment.
   Include the full character physical description here.

3. CAMERA & COMPOSITION (end): Camera shot, lighting, style keywords.

This order ensures each image looks DIFFERENT because the image generator
prioritizes the opening description.

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 2: CONSEQUENCE PHILOSOPHY (CRITICAL)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

{consequence_philosophy}

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
âš ï¸ SECTION 2.5: MANDATORY DYNAMIC ACTION (GOLDEN RULE #1) âš ï¸
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

ðŸš¨ ABSOLUTE RULE: THE CHARACTER MUST ALWAYS BE DOING SOMETHING ðŸš¨

NEVER generate a static neutral pose. EVERY scene must show the character
ACTIVELY PERFORMING an action that REPRESENTS the narrative concept.

MANDATORY ACTION VERBS (use these in character_action and image_prompt):
â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”

PHYSICAL EFFORT: lifting, carrying, dragging, pushing, pulling, climbing, 
                 gripping, squeezing, throwing, catching, swinging

MOVEMENT: running, sprinting, walking, stumbling, crawling, jumping, falling,
          rolling, dodging, lunging, crouching, kneeling

COMBAT/SURVIVAL: fighting, striking, blocking, aiming, shooting, stabbing,
                 defending, retreating, advancing, hiding, escaping

EMOTIONAL EXPRESSION: recoiling, trembling, collapsing, reaching, embracing,
                      clutching, covering face, pounding fists, head in hands

INTERACTION: eating, drinking, chewing, swallowing, examining, searching,
             opening, closing, breaking, building, repairing

CONTEXT â†’ ACTION MAPPING (MANDATORY):
â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”

| NARRATIVE CONTEXT      | âŒ WRONG (Static)           | âœ… CORRECT (Dynamic)                    |
|------------------------|-----------------------------|-----------------------------------------|
| Character is strong    | Standing with muscles       | LIFTING heavy object, muscles bulging   |
| Character is hungry    | Standing near food          | EATING voraciously, jaw working         |
| Character is tired     | Standing looking tired      | COLLAPSED against wall, chest heaving   |
| Character is scared    | Standing with wide eyes     | CROUCHING behind cover, scanning        |
| Character is running   | Standing in running pose    | MID-STRIDE with leg extended, arms pump |
| Character is thinking  | Standing with hand on chin  | PACING while examining object           |
| Character is in pain   | Standing holding body part  | BENT OVER clutching area, grimacing     |
| Character is fighting  | Standing in fight stance    | MID-PUNCH with fist connecting          |
| Character is dying     | Standing wounded            | FALLING/COLLAPSED asymmetrically        |

âŒ FORBIDDEN STATIC POSES:
- Standing neutrally facing camera
- Standing with arms at sides
- Standing in T-pose or A-pose
- Standing "looking at" something without action
- Any pose where the character is NOT actively doing something

âœ… EVERY IMAGE MUST SHOW:
- A specific ACTION verb in progress (not completed, not about to start)
- Body parts in motion or tension
- Interaction with environment or objects
- Physical consequence of the narrative moment

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 3: VISUAL CONSISTENCY (NON-NEGOTIABLE)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

The character description MUST appear VERBATIM in every image prompt.
DO NOT summarize, paraphrase, or reference indirectly.
EVERY prompt must be FULLY SELF-CONTAINED â€” no references between frames.

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 4: HARD PROHIBITIONS
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

{hard_prohibitions}

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 5: ANATOMICAL HIGHLIGHT RULES (REAL ANATOMY)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

{anatomical_rules}

NEVER use generic colored glow. ALWAYS show REAL anatomical structures:
- Muscles with fibers, fascicles, tendons with correct anatomical names
- Organs with structure, lobes, organic texture
- Medical and scientific visualization â€” NOT stylized, NOT cartoonish

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 6: CLOTHING RULES
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

{clothing_rule}

âš ï¸ CRITICAL CLOTHING OPACITY RULE (MANDATORY):
When the character wears ANY clothing, the clothing MUST be:
- 100% OPAQUE SOLID FABRIC - NO transparency, NO see-through effect
- COMPLETELY HIDE the skeleton/body underneath - NO bones visible through fabric
- REAL MATERIAL (cotton, denim, wool, etc.) - NOT a transparent overlay
- Only EXPOSED areas (head, hands, uncovered limbs) show the skeleton

âŒ FORBIDDEN: Translucent shirt showing ribs through fabric
âŒ FORBIDDEN: X-ray effect where bones are visible under clothes
âŒ FORBIDDEN: Ghostly/transparent clothing overlay
âœ… REQUIRED: Solid opaque clothing that completely covers what's underneath

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 7: SPECIAL SCENE RULES
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

DEATH SCENES:
{death_rules}

CHILD SCENES:
{child_rules}

ZOMBIE/INFECTED SCENES:
{zombie_rules}

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 8: VIDEO PROMPT STRUCTURE (CINEMATIC)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

The video_prompt describes ONLY action and camera. The image already exists.

CAMERA MOVEMENT LIBRARY (use these exact names in camera_move field):
- LOCKED_STATIC: Camera fixed, character moves
- SUBTLE_DRIFT: Almost imperceptible micro-movement
- SLOW_PAN_LEFT / SLOW_PAN_RIGHT: Slow horizontal rotation
- WHIP_PAN: Fast rotation with motion blur
- TILT_UP / TILT_DOWN: Vertical rotation
- CRANE_UP / CRANE_DOWN: Physical vertical movement
- DOLLY_IN / DOLLY_OUT: Physical approach/retreat
- PUSH_IN: Dramatic dolly in for emotional peak
- PULL_BACK_REVEAL: Retreat revealing context
- ORBIT: Camera circles subject
- TRACKING_SHOT: Camera moves alongside subject
- FOLLOW_SHOT: Camera follows from behind
- HANDHELD: Organic movement with tremor
- STEADICAM_FLOAT: Smooth fluid movement
- OVERHEAD_STATIC: Bird's eye looking down
- OVERHEAD_SLOW_PULLBACK: Bird's eye slowly retreating

EMOTION â†’ CAMERA MAPPING:
- Tension building â†’ PUSH_IN, DOLLY_IN
- Revelation/Shock â†’ PULL_BACK_REVEAL, CRASH_ZOOM
- Intimacy/Vulnerability â†’ SUBTLE_DRIFT, close-up
- Power/Dominance â†’ TILT_UP, CRANE_UP
- Despair/Defeat â†’ CRANE_DOWN, OVERHEAD_STATIC
- Pursuit/Urgency â†’ HANDHELD, TRACKING_SHOT
- Contemplation â†’ ORBIT, SUBTLE_DRIFT
- Chaos/Panic â†’ WHIP_PAN, HANDHELD
- Death/Ending â†’ OVERHEAD_STATIC, OVERHEAD_SLOW_PULLBACK

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 9: CHARACTER ACTION (JOINT-BY-JOINT)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

The character_action field MUST describe action JOINT-BY-JOINT with:
- Specific articulation, muscle, direction, velocity
- Kinetic chain (which muscle fires first, second, etc.)
- Timing in seconds (e.g., "0.0-0.3s wind-up, 0.3-0.5s release")
- Transition to next scene

MUSCLE REFERENCE BY ACTION:
- Running: Quadriceps expanding/contracting in 0.4s cycles, hamstrings eccentric, gastrocnemius push-off
- Throwing: Deltoid fires first, pectoralis pulls, biceps backswing, triceps explodes
- Gripping: Flexor digitorum profundus contracts, tendons visible through fingers
- Breathing: Diaphragm descending, intercostals tensioning, rib cage expanding
- Chewing: Masseter contracting/relaxing rapidly, temporalis pulsing at temples
- Swallowing: Esophagus with peristaltic contractions descending

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 10: SOUND EFFECTS (PHYSICAL ONLY)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

The sound_effects field lists ONLY physical SFX. Be specific:
- "deep snow crunch per step"
- "wood whistle in bow drill"
- "fire crackle and pop"
- "fabric rustle on movement"
- "bone click on joint movement"

ABSOLUTE PROHIBITION: NO music. NO voice. NO narration. NO dialogue.

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 11: SHOT INTERCALATION
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

{shot_intercalation}

RULES:
- NEVER repeat same camera angle in consecutive scenes
- Every 3 scenes: at least 1 extreme close or anatomical macro
- Consecutive scenes MUST CONTRAST in camera type

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 12: COVERAGE SHOTS (MULTI-ANGLE CONSISTENCY)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

{coverage_instructions}

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 13: LANGUAGE RULES (MANDATORY)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

â€¢ image_prompt MUST be written in English (en-US)
â€¢ video_prompt MUST be written in English (en-US)
â€¢ character_action MUST be written in English (en-US)
â€¢ sync_word should be extracted from the pt-BR narration text as-is
â€¢ Even if frame data contains Portuguese text, ALWAYS write prompts in English

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
SECTION 14: OUTPUT FORMAT (CRITICAL â€” FOLLOW EXACTLY)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

Output each scene as a SEPARATE raw JSON object, one after another.
Do NOT wrap them in an array. Do NOT add markdown fences. Just output the JSON
objects sequentially. Example:

{{"scene_number": 1, "image_prompt": "...", "video_prompt": "...", "sync_word": "...", "anatomical_highlight": "", "clothing_description": "...", "environment": "...", "emotional_tone": "...", "camera_move": "PUSH_IN", "character_action": "...", "sound_effects": "..."}}

Rules:
â€¢ NEVER abbreviate the character description
â€¢ NEVER reference other frames
â€¢ Each image prompt MUST begin with environment/scene, NOT with character description
â€¢ Output EXACTLY {total_frames} JSON objects matching the frame numbers provided
â€¢ camera_move MUST be a named movement from the library
â€¢ character_action MUST describe joint-by-joint with muscles and timing
â€¢ sound_effects MUST be physical SFX only â€” NO music, NO voicec                  óz   € ] tR tRtRtRR R lltR R ltR R	 lt]R
 R l4       t	]R R l4       t
R R ltRtR# )ÚPromptEngineerAgentiS  zEGenerates full image + video prompts via a single streaming LLM call.Nc               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r   Úframesr	   Úcharacter_templater   Úon_progressz$Optional[Callable[[int, int], None]]Úon_scene_readyz(Optional[Callable[[ScenePrompts], None]]Úmax_retriesÚintr    r   r!   )r"   s   "r   r#   Ú PromptEngineerAgent.__annotate__V  sO   € ÷ n/ñ n/à&ðn/ð .ðn/ð :ð	n/ð
 Aðn/ð ðn/ð 
ñn/r   c           
     ó  € \        VP                  4      pR.V,          p^ pV P                  VP                  V4      w  rš\        P	                  RW`P
                  4        V P                  Wš4      p\        4       pV Fó  pVP                  V4      pV FÙ  p \        P                  ! V4      pVP                  ^,
          p^ Tu;8:  d   V8  d}   M MyVVV&   V^,          p\        P                  RVP                  TVP                  '       d   VP                  R,          MR4       V'       d	   V! W†4       V'       d   V! V4       K¶  K¸  \        P                  RVP                  V4       KÛ  	  Kõ  	  \'        V4       UUu. uF  w  ppVe   K  VNK  	  pppV'       d9   \        P	                  R\        V4      TV Uu. uF  pV^,           NK  	  up4       \)        ^V^,           4       F  pV'       g    M†\        P	                  R\        V4      VV4       . pV FW  p V P+                  VP                  V,          V4      pVVV&   V^,          pV'       d	   V! W†4       V'       d   V! V4       KW  KY  	  TpK‘  	  V'       d*   \/        RV Uu. uF  pV^,           NK  	  up RV R24      h\1        VR7      #   \        \         P"                  3 d+   p\        P                  RTR,          T4        Rp?EKi  Rp?ii ; i  \$         d    \        P                  R	R
R7        ELµi ; iu uppi u upi   \$         d7    \        P                  RT^,           TR
R7       TP-                  T4        EKZ  i ; iu upi )a®  Generate prompts for all frames in one streaming LLM call.

Args:
    frames: Expanded frame breakdown from the Frame Expander agent.
    character_template: Character template with physical description.
    on_progress: Callback(current, total) fired as each scene completes.
    on_scene_ready: Callback(scene) fired with each parsed ScenePrompts.
    max_retries: Max retries for failed/missing scenes via instructor fallback.
NzEStreaming prompt generation for %d frames in a single call (model=%s)zStreamed scene %d/%d: %s:Né2   NÚ?z'Scene number %d out of range (total=%d)u/   Failed to parse streamed JSON object: %s â€” %s:Néd   Nz=Streaming call failed, will retry missing scenes individuallyT)Úexc_infou?   %d/%d scenes missing after stream â€” retrying individually: %sz#Retrying %d scene(s), attempt %d/%dzFrame %d retry %d failedz'Failed to generate prompts for frames: z after z retries)Úscenes)r*   r:   Ú_build_promptsÚloggerÚinfoÚmodelÚ_stream_textr   r/   r   Úmodel_validate_jsonÚscene_numberÚdebugÚenvironmentÚwarningr   ÚjsonÚJSONDecodeErrorÚ	ExceptionÚ	enumerateÚrangeÚ_generate_singler+   ÚRuntimeErrorr   )r   r:   r;   r<   r=   r>   ÚtotalÚresultsÚ	completedÚsystemÚuserÚtext_streamÚ	extractorÚ
text_chunkÚjson_objectsr.   ÚsceneÚidxÚeÚiÚrÚfailedÚattemptÚstill_faileds   &&&&&&                  r   ÚgenerateÚPromptEngineerAgent.generateV  s?  € ô" F—M‘MÓ"ˆØ.2¨V°e­^ˆØˆ	ð ×*Ñ*¨6¯=©=Ð:LÓM‰ˆô 	‰ØSØ—:‘:ô	
ð
%	Ø×+Ñ+¨FÓ9ˆKä.Ó0ˆIÛ)
Ø(Ÿ~™~¨jÓ9Û+GðÜ ,× @Ò @ÀÓ I˜Ø#×0Ñ0°1Õ4˜Ø Ö+ e×+Ø+0˜G C™LØ%¨N˜IÜ"ŸL™LØ :Ø %× 2Ñ 2°EØ:?×:K×:KÐ:K × 1Ñ 1°#Ö 6ÐQTô÷
  +Ù +¨IÔ =ß-Ù .¨uÖ 5ñ  .ô #ŸN™NØ IØ %× 2Ñ 2°Eöó#  ,ñ *ôH !*¨'Ô 2Ô@Ñ 2™˜˜1°a—!!Ñ 2ˆÑ@ßÜK‰KØQÜF“˜U±FÓ$;±F¨q Q¨§U U±FÑ$;ôô
 ˜Q ¨a¥Ö0ˆGßÙÜK‰KØ5ÜF“˜W kôð ˆLÛð-Ø ×1Ñ1ØŸ™ cÕ*Ð,>óEð $)G˜C‘LØ •NIß"Ù# IÔ5ß%Ù& uÖ-ñ &ñ ð" "ŠFñ3 1÷6 ÜØ9Ù#)Ó*¡6˜aA˜—EE¡6Ñ*Ð+¨7°;°-¸xðIóð ô
  gÔ.Ð.øôk ,¬T×-AÑ-AÐBô ÜŸ™ØMØ# DM¨1÷ó ûðûô ô 	ÜN‰NØOØð ÷ ð	üó Aùò %<øô, !ô -Ü—N‘NØ2°C¸!µG¸WØ!%ð #ô ð !×'Ñ'¨×,Ð,ð-üò +sŒ   Á!6L ÂA6J=Ä J=Ä0J=Å J=ÅL Å!J=Å-L Æ	L.ÆL.ÇL4È#AL9É,L9ÊM=
Ê=LËK=Ë6L Ë=LÌL Ì"L+Ì*L+Ì9<M:Í9M:c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú
all_frameszlist[Frame]Útemplater   r    ztuple[str, str]r!   )r"   s   "r   r#   r@   È  s-   € ÷ |ñ |àð|ð $ð|ð 
ñ	|r   c                óê  € VP                   '       d*   RRP                  R VP                    4       4      ,           MRp\        VRR4      ;'       g    Rp\        VRR4      ;'       g    R	p\        VR
R4      ;'       g    Rp\        VRR4      ;'       g    Rp\        VRR4      ;'       g    Rp\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      p	V	'       d   Rp
MRp
\        P                  \        V4      VVP                  VP                  VVVVVV
R7
      p. pV Fï  pRpVP                  '       d   RVP                   2pRp\        VRR4      pV'       d'   \        VRR4      p\        VR^ 4      pRV RV RV R2pR VP                   R!VP                   R"VP                   R#VP                   R$VP                   R%VP                   R&VP                    R'VP"                   R(VP$                   V V 2pVP'                  V4       Kñ  	  R)P                  V4      R*VP(                   R+VP*                   R,VP,                   R-VP                   2,           pVV3# ).z7Build system + user prompts for ALL frames in one call.úThe model MUST NOT generate:
Ú
c              3  ó,   "  € T F
  pR V 2x € K  	  R# 5i©u   âœ— Nr!   ©Ú.0Úps   & r   Ú	<genexpr>Ú5PromptEngineerAgent._build_prompts.<locals>.<genexpr>Î  ó   é € ð J
Ù :˜1ˆd1#JÓ :ùó   ‚úNone specified.Úconsequence_philosophyr   úåShow the CONSEQUENCE, not the symptom. Each image must REPRESENT an action, not just literally illustrate what was said. The character is ALWAYS doing something that demonstrates the concept through visible physical consequences.Údeath_scene_ruleszOverhead camera 100%. Asymmetric fall posture (head NOT facing camera). Pale blue-white bioluminescent fluid pooling around body.Úchild_rulesuq   Small blurred indistinct human-shaped silhouette â€” NO facial features, NO detailed body, purely abstract shape.Úzombie_ruleszgGrey-green desaturated skin, unnatural posture, empty eyes. ZERO wounds, ZERO decomposition, ZERO gore.Úshot_intercalation_rulesu•   Opening: Wide â†’ Medium â†’ Close. Action: Low-angle â†’ Profile â†’ Macro. Climax: Eye-level â†’ Extreme close â†’ Medium. End: Macro â†’ Overhead.c              3  ó<   "  € T F  p\        VR R4      x € K  	  R# 5i)Úcoverage_group_idN)Úgetattr)rt   Úframes   & r   rv   rw   ê  s$   é € ð 
á#ô EÐ.°×5Ð5Û#ùs   ‚TFur  COVERAGE MODE ACTIVE: Some frames share the same coverage_group_id.
Frames with the SAME coverage_group_id show the SAME SCENE from DIFFERENT ANGLES.

CRITICAL RULES FOR COVERAGE FRAMES:
- Frames with same coverage_group_id MUST have IDENTICAL:
  â€¢ Environment description (verbatim)
  â€¢ Character pose/action description (verbatim)
  â€¢ Lighting conditions
  â€¢ sync_word

- ONLY vary between coverage frames:
  â€¢ Camera angle (wide/medium/close-up)
  â€¢ Composition
  â€¢ Visual emphasis
  â€¢ camera_move (use subtle movements for coverage)

EXAMPLE: If coverage_group_id='coverage_1' has 3 frames:
  Frame 1 (master): Wide shot of skeleton sitting on couch
  Frame 2 (medium): Medium shot of skeleton sitting on couch (lateral angle)
  Frame 3 (close-up): Close-up of skeleton sitting on couch (face detail)
ALL THREE show the SAME ACTION, just different camera angles.z-Coverage mode is not active for these frames.©
Útotal_framesÚhard_prohibitionsÚanatomical_rulesÚclothing_ruler{   Údeath_rulesr~   r   Úshot_intercalationÚcoverage_instructionsú
  Anatomical highlight: r‚   NÚcoverage_angle_typeÚunknownÚcoverage_angle_indexz
  [COVERAGE] Group: z	, Angle: z (Ú)uÐ   â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
FRAME uÚ   
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
  Environment: ú
  Pose/Action: ú	
  Mood: ú
  Visual focus: ú
  Camera shot: ú
  Camera movement: ú
  Composition: ú
  Narration text: z

uÑ  

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
CHARACTER TEMPLATE (COPY VERBATIM INTO EVERY IMAGE PROMPT)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
u½  

â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
RULES (APPLY TO ALL FRAMES)
â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
POSE RULE: ú
ENVIRONMENT RULE: ú
CLOTHING RULE: )r‡   Újoinrƒ   ÚanyÚSYSTEM_PROMPTr"   r*   Úanatomical_highlight_rulesr‰   Úanatomical_highlightÚframe_numberÚenvironment_detailÚpose_actionÚmoodÚvisual_focusÚcamera_shotÚcamera_movementÚcompositionÚnarration_textr+   Úphysical_descriptionÚ	pose_ruleÚenvironment_rule)r   rl   rm   r‡   r{   rŠ   r~   r   r‹   Úhas_coveragerŒ   r[   Úframe_sectionsr„   Ú	anat_hintÚcoverage_hintÚcoverage_groupÚ
angle_typeÚ	angle_idxÚsectionr\   s   &&&                  r   rG   Ú"PromptEngineerAgent._build_promptsÈ  s:  € ð ×(×(Ð(ð >ÀÇ	Á	ñ J
Ø (× :Ò :óJ
ó A
ö 
à.?ð 	ô
 ")¨Ð3KÈRÓ!P÷ "
ð "
ð]ð 	ô
 ˜hÐ(;¸RÓ@÷ 
ð 
ðHð 	ô ˜h¨°rÓ:÷ 
ð 
ð7ð 	ô ˜x¨¸Ó<÷ 
ð 
ð:ð 	ô % XÐ/IÈ2ÓN÷ 
ð 
ðWð 	÷ “sñ 
á#ó
—s—s’sñ 
á#ó
ó 
ˆ÷
 ðPñ "ð* %TÐ!ä×%Ñ%Ü˜Z›Ø/Ø%×@Ñ@Ø"×0Ñ0Ø#9Ø#Ø#Ø%Ø1Ø"7ð &ó 
ˆð ˆÛˆEØˆIØ×)×)Ð)Ø8¸×9SÑ9SÐ8TÐU	ð ˆMÜ$ UÐ,?ÀÓFˆNßÜ$ UÐ,AÀ9ÓM
Ü# EÐ+AÀ1ÓE	à,¨^Ð,<ð =Ø'˜[¨¨:¨,°að9ð ðØ×+Ñ+Ð,ð -"à"'×":Ñ":Ð!;ð <"Ø"'×"3Ñ"3Ð!4ð 5Ø Ÿ:™:˜,ð '#Ø#(×#5Ñ#5Ð"6ð 7"Ø"'×"3Ñ"3Ð!4ð 5&Ø&+×&;Ñ&;Ð%<ð ="Ø"'×"3Ñ"3Ð!4ð 5%Ø%*×%9Ñ%9Ð$:Ø+Ø /ð#ð ð ×!Ñ! 'Ö*ñ?  ðD K‰K˜Ó'ðZð ×,Ñ,Ð-ð .ð #×,Ñ,Ð-ð .!Ø!)×!:Ñ!:Ð ;ð <Ø&×4Ñ4Ð5ð	7õ
7ð 	ð tˆ|Ðr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r[   r   r\   r    úIterator[str]r!   )r"   s   "r   r#   r@   H  s&   € ÷ Eñ E 3ð E¨cð E°mñ Er   c              #  ó^  "  € RV P                   9   d2   V P                   P                  R^4      ^ ,          P                  4       MRpV P                   P                  R^4      R,          pVR8X  d   V P                  WAV4       Rj  x€L
  R# V P	                  WAV4       Rj  x€L
  R#  L" L5i)zAStream raw text chunks from the LLM, auto-detecting the provider.Ú/ÚopenaiÚ	anthropicNr   )rJ   ÚsplitÚlowerÚ_stream_anthropicÚ_stream_openai)r   r[   r\   ÚproviderÚ
model_names   &&&  r   rK   Ú PromptEngineerAgent._stream_textH  s   é € à:=ÀÇÁÔ:K4—:‘:×#Ñ# C¨Ó+¨AÕ.×4Ñ4Ô6ÐQYˆØ—Z‘Z×%Ñ% c¨1Ó-¨bÕ1ˆ
à{Ô"Ø×-Ñ-¨jÀ$ÓG×GÒGà×*Ñ*¨:¸tÓD×DÒDñ HáDùs$   ‚BB-ÂB)ÂB-Â"B+Â#B-Â+B-c               ó(   € V ^8„  d   QhRRRRRRRR/# ©r   rJ   r   r[   r\   r    r¶   r!   )r"   s   "r   r#   r@   S  s(   € ÷ ñ  ð ¨cð ¸ð Àñ r   c           	   #  óø   "  € ^ RI pVP                  4       pVP                  P                  V RVRRRV/.RR7      ;_uu_ 4       pVP                   F  pVx € K	  	  RRR4       R#   + '       g   i     R# ; i5i)z(Stream text from Anthropic Messages API.Ni @  Úroler\   Úcontentç333333ã?)rJ   Ú
max_tokensr[   ÚmessagesÚtemperature)rº   Ú	AnthropicrÉ   Ústreamr]   )rJ   r[   r\   rº   ÚclientrÌ   Útexts   &&&    r   r½   Ú%PromptEngineerAgent._stream_anthropicR  s}   é € ó 	Ø×$Ñ$Ó&ˆà_‰_×#Ñ#ØØØØ˜v y°$Ð7Ð8Øð $÷ 
ô 
ð Ø×*Ô*Ø”
ñ +÷
÷ 
÷ 
ò 
üs   ‚AA:ÁA&Á
A:Á&A7	Á1	A:c               ó(   € V ^8„  d   QhRRRRRRRR/# rÃ   r!   )r"   s   "r   r#   r@   c  s(   € ÷ $ñ $˜cð $¨3ð $°cð $¸mñ $r   c              #  óh  "  € ^ RI pVP                  4       pVP                  P                  P	                  V RRRV/RRRV/.RRR7      pV F`  pVP
                  '       d   VP
                  ^ ,          P                  MRpV'       g   K>  VP                  '       g   KR  VP                  x € Kb  	  R# 5i)	z-Stream text from OpenAI Chat Completions API.NrÅ   r[   rÆ   r\   rÇ   T)rJ   rÉ   rÊ   rÌ   )r¹   ÚOpenAIÚchatÚcompletionsÚcreateÚchoicesÚdeltarÆ   )rJ   r[   r\   r¹   rÍ   rÌ   r   r×   s   &&&     r   r¾   Ú"PromptEngineerAgent._stream_openaib  s   é € ó 	Ø—‘“ˆà—‘×(Ñ(×/Ñ/Øà˜ 9¨fÐ5Ø˜ ¨DÐ1ðð Øð 0ó 
ˆó ˆEØ.3¯m¯m¨mE—M‘M !Õ$×*Ò*ÀˆEß‰u˜ŸŸšØ—m‘mÔ#ó ùs   ‚BB2Â
B2ÂB2c               ó$   € V ^8„  d   QhRRRRRR/# )r   r„   r
   rm   r   r    r   r!   )r"   s   "r   r#   r@   x  s-   € ÷ @
ñ @
àð@
ð $ð@
ð 
ñ	@
r   c                ót  € VP                   '       d*   RRP                  R VP                    4       4      ,           MRp\        VRR4      ;'       g    Rp\        VRR4      ;'       g    Rp\        VR	R4      ;'       g    Rp\        VR
R4      ;'       g    RpRpRp	\        P	                  ^VVP
                  VP                  VVVVVV	R7
      p
RpVP                  '       d   RVP                   2pRVP                   RVP                   RVP                   RVP                   RVP                   RVP                   RVP                   RVP                   RVP                    V RVP"                   RVP$                   RVP&                   RVP                   2pV P)                  V
V\*        RR7      # )zHGenerate prompt for a single frame using instructor (structured output).ro   rp   c              3  ó,   "  € T F
  pR V 2x € K  	  R# 5irr   r!   rs   s   & r   rv   Ú7PromptEngineerAgent._generate_single.<locals>.<genexpr>~  rx   ry   rz   r{   r   r|   rŠ   r~   r   z,Single frame mode - maintain visual variety.z6Coverage mode is not active for single frame fallback.r…   r   zFRAME z
  Environment: r’   r“   r”   r•   r–   r—   r˜   z&

CHARACTER TEMPLATE (COPY VERBATIM):
z

POSE RULE: r™   rš   rÇ   )Úsystem_promptÚuser_promptÚresponse_modelrÊ   )r‡   r›   rƒ   r   r"   rž   r‰   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   Úcallr   )r   r„   rm   r‡   r{   rŠ   r~   r   r‹   rŒ   r[   r®   r\   s   &&&          r   rV   Ú$PromptEngineerAgent._generate_singlex  s+  € ð ×(×(Ð(ð >ÀÇ	Á	ñ J
Ø (× :Ò :óJ
ó A
ö 
à.?ð 	ô
 ")¨Ð3KÈRÓ!P÷ "
ð "
ð]ð 	ô
 ˜h¨°rÓ:×@Ð@¸bˆÜ˜h¨°rÓ:×@Ð@¸bˆÜ˜x¨¸Ó<×BÐBÀˆð LÐØ XÐä×%Ñ%ØØ/Ø%×@Ñ@Ø"×0Ñ0Ø#9Ø#Ø#Ø%Ø1Ø"7ð &ó 
ˆð ˆ	Ø×%×%Ð%Ø4°U×5OÑ5OÐ4PÐQˆIð U×'Ñ'Ð(ð )Ø#×6Ñ6Ð7ð 8Ø#×/Ñ/Ð0ð 1Ø—z‘zlð #Ø$×1Ñ1Ð2ð 3Ø#×/Ñ/Ð0ð 1"Ø"'×"7Ñ"7Ð!8ð 9Ø#×/Ñ/Ð0ð 1!Ø!&×!5Ñ!5Ð 6Øˆkð 4à×,Ñ,Ð-ð .Ø"×,Ñ,Ð-ð .!Ø!)×!:Ñ!:Ð ;ð <Ø&×4Ñ4Ð5ð7ð 	ð$ y‰yØ ØÜ'Øð	 ó 
ð 	
r   r!   )NNé   )r1   r2   r3   r4   r5   ri   rG   rK   Ústaticmethodr½   r¾   rV   r6   r!   r   r   r8   r8   S  sM   † ÙO÷n/õd|õ@Eð ôó ðð ô$ó ð$÷*@
ñ @
r   r8   )r5   Ú
__future__r   rQ   ÚloggingÚosÚtypingr   r   r   Úpydanticr   Úmodelsr   r   r	   r
   r   Úagents.base_agentr   Ú	getLoggerr1   rH   r   r   r8   r!   r   r   Ú<module>rì      sb   ðñ	õ #ã Û Û 	ß /Ñ /å $÷õ õ (à	×	Ò	˜8Ó	$€÷
(ñ (ðZ@€ôFe
˜)ö e
r   