Ë
    Þ›XjE:  ã                  óÀ   — d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	 d dl
mZ dZe G d„ d«      «       Ze G d	„ d
«      «       ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zy)é    )Úannotations)Ú	dataclassÚfield)ÚAny)ÚLAYOUTSÚCreativeBrief)Ú
LLMService)ÚlinkedinÚ	instagramÚxÚthreadsÚfacebookc                  ó<   — e Zd ZU ded<   ded<   edd„«       Zd	d„Zy)
ÚPlatformPostÚstrÚpostú	list[str]Úhashtagsc           	     óò   — |xs i } | t        |j                  dd«      «      j                  «       |j                  d«      xs g D �cg c]  }t        |«      j                  d«      ‘Œ c}d d ¬«      S c c}w )Nr   Ú r   Ú#é   ©r   r   )r   ÚgetÚstripÚlstrip)ÚclsÚdataÚhs      ú9/var/www/html/content_generation/src/services/ideation.pyÚ	from_dictzPlatformPost.from_dict   sr   € àŠz�rˆÙÜ�T—X‘X˜f bÓ)Ó*×0Ñ0Ó2Ø37·8±8¸JÓ3GÒ3MÈ2Ð3MÓOÑ3M¨Q”c˜!“f—m‘m CÕ(Ð3MÑOÐPSÐQSÐTô
ð 	
ùâOs   Á!A4
c                ón  — | j                   j                  «       }|j                  «       D �cg c]$  }|j                  «       j	                  d«      rŒ#|‘Œ& }}dj                  |«      j                  «       }dj                  d„ | j                  D «       «      }|r|› d|› �j                  «       S |S c c}w )Nr   Ú
Ú c              3  ó,   K  — | ]  }|sŒd |› �–— Œ y­w)r   N© )Ú.0r   s     r    Ú	<genexpr>z/PlatformPost.as_publish_text.<locals>.<genexpr>   s   è ø€ Ð<© Aº!˜!˜A˜3œ©ùs   ‚Š
z

)r   ÚrstripÚ
splitlinesr   Ú
startswithÚjoinr   )ÚselfÚbodyÚlnÚlinesÚtagss        r    Úas_publish_textzPlatformPost.as_publish_text   sš   € Ø�y‰y×ÑÓ!ˆØ"Ÿo™oÔ/ÓRÑ/˜°r·x±x³z×7LÑ7LÈSÕ7Q’Ð/ˆÐRØ�y‰y˜Ó×%Ñ%Ó'ˆØ�x‰xÑ<¨¯ªÓ<Ó<ˆÙ.2�$��t˜D˜6Ð"×(Ñ(Ó*Ð<¸Ð<ùò Ss   ­$B2ÁB2N)r   zdict[str, Any] | NoneÚreturnz'PlatformPost'©r3   r   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__Úclassmethodr!   r2   r&   ó    r    r   r      s$   … à
ƒIØÓàò
ó ð
ô=r:   r   c                  ó¬  — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded<   d	Zded
<   dZded<    ee¬«      Zded<   d	Z	ded<   dZ
ded<   dZded<   dZded<   d	Zded<   dZded<   dZded<   d	Zded<   d	Zded<   dZded<    ee¬«      Zd ed!<    ee¬«      Zd ed"<    ee¬«      Zded#<    ee¬«      Zd$ed%<   d*d&„Zd+d'„Zed,d-d)„«       Zy().ÚContentIdear   ÚidÚformatÚtopicÚhookÚnews_urlÚ
news_titleÚvisual_briefr   Úcreative_directionÚeditorial_overlayÚlayout)Údefault_factoryr   ÚpaletteÚpalette_nameÚmodern_startupÚ
typographyÚdark_premiumÚbackground_styleÚeditorial_3dÚillustration_styleÚimage_promptÚ	cinematicÚvideo_styleÚsquareÚaspectÚwhy_it_mattersÚkey_factÚaiÚnews_categoryzlist[dict[str, str]]ÚslidesÚvideo_scriptÚsource_refszdict[str, PlatformPost]Ú	platformsc                ón   — | j                   j                  |«      xs t        | j                  ddg¬«      S )NÚAIÚTechr   )r\   r   r   r@   )r-   Únames     r    ÚplatformzContentIdea.platform<   s.   € Ø�~‰~×!Ñ! $Ó'Ò`¬<¸T¿Y¹YÐRVÐX^ÐQ_Ô+`Ð`r:   c                ó(   — | j                   xs dd d S )Nz	Tech Newsé<   )rB   )r-   s    r    Únews_source_labelzContentIdea.news_source_label?   s   € Ø—‘Ò. ;°°Ð4Ð4r:   Nc                ó^  — t        |j                  dd«      «      j                  «       j                  «       }|dvrd}|j                  d«      xs g }|dk(  rŽt	        |«      dk  r€|j                  dd«      d	dd
œdt        |j                  dd«      «      dd
œdt        |j                  dd«      «      dd
œdt        |j                  dd«      «      dd
œdddd
œdddd
œdddd
œg}t        |j                  d«      xs |r|j
                  nd«      j                  «       }|t        vr'|r|j
                  nt        |t	        t        «      z     }|j                  d «      xs |r|j                  ng D �cg c]  }t        |«      ‘Œ c}d d! }|r|st        |j                  «      }|j                  d"«      xs i }	t        D �
ci c]'  }
|
t        j                  |	j                  |
«      «      “Œ) }}
|j                  d#«      xs g D �cg c]¥  }t        |j                  d$d«      «      t        |j                  d%d«      «      t        |j                  d&d«      «      t        |j                  d'd«      «      t        |j                  d(d)«      «      t        |j                  d*d!«      xs d!«      d+œ‘Œ§ c}d d, }|d-k(  rµt	        |«      d!k  r§dt        |j                  dd«      «      d.dd/d0d+œd1d2t        |j                  dd«      «      dd3dd+œd4t        |j                  dd5«      «      t        |j                  dd«      «      dd)d6d+œd7d8t        |j                  dd«      «      dd9d:d+œdd;d<dd=d>d+œg} | dYi d?t        |j                  d?«      xs d@|dA›�«      “d|“dt        |j                  dd«      «      j                  «       “dt        |j                  dd«      «      j                  «       “dBt        |j                  dBd«      «      j                  «       “dCt        |j                  dCd«      «      j                  «       “dDt        |j                  dDd«      «      j                  «       “dEt        |j                  dEd«      «      j                  «       “d|“d |“dFt        |j                  dF«      xs |r|j                  nd«      “dGt        |j                  dG«      xs |r|j                  ndH«      “dIt        |j                  dI«      xs |r|j                  ndJ«      “dKt        |j                  dK«      xs |r|j                   ndL«      “dMt        |j                  dMd«      «      j                  «       “dNt        |j                  dN«      xs |r|j"                  ndO«      “dPt        |j                  dP«      xs |r|j$                  ndQ«      “dt        |j                  dd«      «      j                  «       “dt        |j                  dd«      «      j                  «       “dRt        |j                  dRdS«      «      j                  «       j                  «       “d|D �cg c]m  }t        |j                  dTd«      «      t        |j                  dUd«      «      t        |j                  dVd«      «      t        |j                  dMd«      «      dWœ‘Œo c}d d, “d#|“dX|j                  dX«      xs g D �cg c]  }t        |«      ‘Œ c}d d: “d"|“ŽS c c}w c c}
w c c}w c c}w c c}w )ZNr>   Úimage>   rf   ÚvideoÚcarouselrY   rh   é   r@   ÚHookzThe moment everything shifted.)Útitler.   ÚrolezWhat happenedr?   r   ÚwhatzWhy it mattersrU   ÚwhyzThe numbersrV   ÚstatszThe insightz$Here's what most people are missing.ÚinsightzWhat's nextz This changes the next 12 months.Úfuturez	Your movez)Save + share with someone who needs this.ÚctarF   rE   rH   é   r\   rZ   ÚbeatÚ	on_screenÚ	voiceoverÚvisualÚmotionÚzoom_inÚseconds)rt   ru   rv   rw   rx   rz   é   rg   zThis just dropped.Úpunch_ing      @ÚproblemzWhat changedÚ	pan_rightÚdetailszThe detailsé   ÚimpactzWhy you should careÚparallaxé   zFollow for daily AI dropsz
Save this.Úzoom_outé   r=   úidea-Ú02drA   rB   rC   rD   rI   rK   rJ   rM   rL   rO   rN   rP   rR   rQ   rT   rS   rX   rW   rk   r.   rl   )rk   r.   rl   rP   r[   r&   )r   r   Úlowerr   ÚlenrF   r   rH   ÚlistÚ	PLATFORMSr   r!   ÚfloatrI   rK   Ú
backgroundrO   rR   rT   )r   r   ÚidxÚbriefÚfmtrY   rF   ÚcrH   Úraw_platformsÚpr\   ÚsrZ   r   s                  r    r!   zContentIdea.from_dictB   s†  € ä�$—(‘(˜8 WÓ-Ó.×4Ñ4Ó6×<Ñ<Ó>ˆØÐ4Ñ4ØˆCà—‘˜(Ó#Ò) rˆØ�*Ò¤ V£¨q¢àŸ(™( 6¨6Ó2Ð<\ÐflÑmØ)´3°t·x±xÀÈÓ7LÓ3MÐW]Ñ^Ø*´C¸¿¹ÐAQÐSUÓ8VÓ4WÐafÑgØ'´°T·X±X¸jÈ"Ó5MÓ1NÐX_Ñ`Ø'Ð1WÐajÑkØ'Ð1SÐ]eÑfØ%Ð/ZÐdiÑjðˆFô �T—X‘X˜hÓ'Ò[¹E¨E¯LªLÐGZÓ\×bÑbÓdˆØœÑ Ù%*�U—\’\´¸¼cÄ'»lÑ8JÑ0KˆFà$(§H¡H¨YÓ$7Ò$[ÉU¸E¿MºMÐXZÐ$[Ó]Ñ$[˜a”3�q•6Ð$[Ñ]Ð^`Ð_`ÐaˆÙ™Ü˜5Ÿ=™=Ó)ˆGàŸ™ Ó-Ò3°ˆÝNWÓXÉiÈ�Qœ×.Ñ.¨}×/@Ñ/@ÀÓ/CÓDÑDÈiˆ	ÐXð —h‘h˜~Ó.Ò4°"Ð4ó

ñ 5�ô ˜AŸE™E &¨"Ó-Ó.Ü  §¡ {°BÓ!7Ó8Ü  §¡ {°BÓ!7Ó8Ü˜aŸe™e H¨bÓ1Ó2Ü˜aŸe™e H¨iÓ8Ó9Ü  §¡ y°!Ó!4Ò!9¸Ó:óð 5ñ

ð ˆ1ð
ˆð �'Š>œc ,Ó/°!Ò3à¬c°$·(±(¸6À2Ó2FÓ.GÐVjÐvxð  EOð  \_ñ  `Ø"°ÌcÐRV×RZÑRZÐ[bÐdfÓRgÓNhÐtvð  CNð  [\ñ  ]Ø"´°T·X±X¸jÈ-Ó5XÓ1YÔhkÐlp×ltÑltð  vFð  HJó  mKó  iLð  XZð  foð  |}ñ  ~Ø!Ð0EÔTWÐX\×X`ÑX`ÐaqÐsuÓXvÓTwð  DFð  R\ð  ijñ  kØÐ-HÐWcÐoqð  ~Hð  UVñ  WðˆLñ ò 
Ü�4—8‘8˜D“>Ò6 u¨S°¨IÐ%6Ô7ð
áð
ô �d—h‘h˜w¨Ó+Ó,×2Ñ2Ô4ð
ô �T—X‘X˜f bÓ)Ó*×0Ñ0Ô2ð	
ô
 ˜Ÿ™ *¨bÓ1Ó2×8Ñ8Ô:ð
ô ˜4Ÿ8™8 L°"Ó5Ó6×<Ñ<Ô>ð
ô ˜TŸX™X n°bÓ9Ó:×@Ñ@ÔBð
ô  # 4§8¡8Ð,@À"Ó#EÓF×LÑLÔNð
ñ ð
ñ ð
ô ˜TŸX™X nÓ5Ò^ÑPU¸%×:LÒ:LÐ[]Ô_ð
ô ˜4Ÿ8™8 LÓ1ÒfÉ%°e×6FÒ6FÐUeÔgð
ô ! §¡Ð*<Ó!=Ò!pÑV[À%×BRÒBRÐaoÔqð
ô  # 4§8¡8Ð,@Ó#AÒ#|ÑbgÀe×F^ÒF^Ðm{Ô}ð
ô ˜TŸX™X n°bÓ9Ó:×@Ñ@ÔBð
ô  ˜DŸH™H ]Ó3ÒdÉU¸×8IÒ8IÐXcÔeð!
ô" �t—x‘x Ó)ÒR¹e¨e¯lªlÈÔSð#
ô$ ˜tŸx™xÐ(8¸"Ó=Ó>×DÑDÔFð%
ô& ˜Ÿ™ *¨bÓ1Ó2×8Ñ8Ô:ð'
ô( ˜dŸh™h ¸Ó=Ó>×DÑDÓF×LÑLÔNð)
ñ* qwó  xñ  qwð  lmœc !§%¡%¨°Ó"4Ó5¼sÀ1Ç5Á5ÈÐQSÓCTÓ?UÔ_bÐcd×chÑchÐioÐqsÓctÓ_uô  HKð  LM÷  LQñ  LQð  R`ð  bdó  Leó  Hfó  gð  qwñ  xð  y{ð  z{ñ  |ð+
ñ, &ð-
ð. +/¯(©(°=Ó*AÒ*GÀRÐ*GÓIÑ*G Aœ˜Q�Ð*GÑIÈ"È1ÑMð/
ñ0  ð1
ð 	
ùò9 ^ùò
 Yùò

ùòT xùâIs    Å4\Ç,\ÈB*\ Ù&A2\%Û9\*)r`   r   r3   r   r4   )N)r   zdict[str, Any]rŽ   Úintr�   zCreativeBrief | Noner3   z'ContentIdea')r5   r6   r7   r8   rD   rF   r   rŠ   rH   rI   rK   rM   rO   rP   rR   rT   rU   rV   rX   rY   rZ   r[   Údictr\   ra   rd   r9   r!   r&   r:   r    r<   r<   !   s  … àƒGØƒKØƒJØ
ƒIØƒMØƒOØÓØ Ð˜Ó Ø%€FˆCÓ%Ù¨tÔ4€GˆYÓ4Ø€L�#ÓØ&€J�Ó&Ø*Ð�cÓ*Ø,Ð˜Ó,Ø€L�#ÓØ"€K�Ó"Ø€FˆCÓØ€N�CÓØ€HˆcÓØ€M�3ÓÙ#(¸Ô#>€FÐ Ó>Ù).¸tÔ)D€LÐ&ÓDÙ"°4Ô8€K�Ó8Ù).¸tÔ)D€IÐ&ÓDóaó5ð óJ
ó ñJ
r:   r<   u%  You are the Creative Director + Social Strategist for a premium AI/Tech media brand
(quality bar: OpenAI, Nvidia, Apple, Stripe, Linear, Figma, Arc â€” NEVER Canva-like templates).

MISSION: Turn breaking tech news into scroll-stopping, publish-ready social assets with agency-level polish.

VOICE:
- Natural fluent English, modern Gen-Z energy, professional credibility.
- Sharp, concrete, specific. Avoid empty hype, buzzword soup, and generic phrasing.
- Forbidden cliches: "game-changer", "revolutionary", "changing everything" unless backed by evidence.

FACTUALITY (non-negotiable):
- Every idea maps to ONE real item from the provided feed.
- Do not invent data, quotes, timelines, valuations, benchmarks, or product claims.
- If a number is uncertain, speak in implications, not fake precision.
- key_fact must be specific and verifiable from the source context.

CONTENT RULES:
- Prioritize: breaking launches, funding rounds, model updates, cyber incidents, research papers, major big-tech moves.
- Hook in first 1â€“2 lines. Make "why it matters" practical for operators/builders/decision-makers.
- Unique copy per platform. Never paraphrase the same caption 5 times.
- Emojis: 0â€“3 tasteful max.
- Hashtags ONLY in hashtags arrays (not in post body).

PLATFORM WRITING STANDARDS:
- linkedin: 900â€“1300 chars, insight-led narrative, crisp line breaks, 3â€“5 tags.
- instagram: high-energy storytelling, skimmable rhythm, 8â€“12 tags, social CTA.
- x: <=260 chars, punchy and opinionated, one clear takeaway.
- threads: 350â€“500 chars, conversational perspective + debate hook.
- facebook: 400â€“800 chars, clear context + discussion starter.

IMAGE / VISUAL RULES:
- image_prompt describes a full cinematic scene that EXPLAINS the story visually.
- No text-in-image instructions, no poster language, no blank backgrounds, no generic "AI brain" wallpaper.
- Include tangible objects/environments: devices, UI, labs, chips, dashboards, robotics, people-in-context, data metaphors.
- Match subject language to news_category (ai/hardware/startup/cyber/research/programming/robotics/healthcare/finance/cloud/opensource/bigtech).
- Follow assigned creative brief EXACTLY (layout, palette, typography, background, illustration_style).

CAROUSEL RULES:
- 6â€“7 slides, narrative arc: hook -> what happened -> why it matters -> stats/fact -> expert insight -> future impact -> CTA.
- Each slide must add NEW information (no repetitive rewording).
- Slide titles <=8 words. Body concise and high-signal.

VIDEO RULES:
- Cinematic reel storyboard, not slideshow.
- Beats: hook (0â€“2s) -> problem (2â€“6s) -> details (6â€“15s) -> impact (15â€“25s) -> CTA (25â€“35s).
- Each beat needs: on_screen (<=6 words), voiceover, visual scene, motion.
- motion one of: zoom_in|zoom_out|pan_left|pan_right|punch_in|parallax|glitch.

QUALITY GATE (self-check before output):
Reject and regenerate internally if any idea is generic, repetitive, or weak.
Do not output ideas that:
- look like templates,
- repeat prior layout/palette/style,
- have weak hooks,
- lack a concrete key_fact,
- or have vague visual prompts.
c               ó¬  — |rdnd}g }	|rg d¢nddg}
t        |«      D ]"  }|	j                  |
|t        |
«      z     «       Œ$ d|› d|› dt        d	«      j	                  d
„ t        |«      D «       «      › dt        |«      › d|› d|› d|› d|	› d|› d�}| j                  t        |d¬«      }t        |t        «      r|j                  d«      n|}t        |t        «      st        d«      ‚g }t        |d | «      D ]Ù  \  }}|t        |«      k  r||   nd }t        j                  ||dz   |¬«      }|r‘|j                   |_        t        |j"                  «      |_        |j$                  |_        |j&                  |_        |j(                  |_        |j,                  |_        |j.                  |_        |j0                  |_        |j                  |«       ŒÛ |S )Nzimage, carousel, videozimage, carousel)rf   rh   rg   rf   rh   zBrand: zC

## Recent styles ALREADY USED (do NOT repeat these combinations)
uL   

## LOCKED creative briefs (assign idea-01 to brief 1, etc. â€” mandatory)
é
   c              3  ó²   K  — | ]O  \  }}|d z   › d|j                   › d|j                  › d|j                  › d|j                  › d|j                  › �–— ŒQ y­w)é   z. z | N)rF   rI   rK   rO   rR   )r'   ÚiÚbs      r    r(   z!generate_ideas.<locals>.<genexpr>ã   si   è ø€ ð  Zñ  YÑvzÐvwÐyz��1‘��R˜Ÿ™�z  Q§^¡^Ð$4°C¸¿¹°~ÀSÈ×I]ÑI]ÐH^Ð^aÐbc×boÑboÐapÔqñ  Yùs   ‚AAz

Full briefs:
z

## Creator style notes
uL   

## Latest news (ONLY source of truth â€” pick the highest-impact stories)
z

Create exactly zJ packages from DISTINCT high-impact news stories.
Suggested format order: z
Mix of formats available: u¯  .

Each idea MUST:
1. Use its locked creative brief fields (layout, palette, typography, background_style, illustration_style, video_style, aspect, palette_name)
2. Include a rich image_prompt (cinematic scene, no text-in-image, agency quality)
3. Include news_category one of: ai|hardware|startup|cyber|research|programming|robotics|healthcare|finance|cloud|opensource|bigtech
4. Have UNIQUE platform copy for linkedin, instagram, x, threads, facebook
5. Have a strong key_fact tied to the source (no fabricated numbers)
6. Avoid repeating sentence structure across platform posts for the same idea

JSON schema:
{
  "ideas": [
    {
      "id": "idea-01",
      "format": "image|carousel|video",
      "topic": "...",
      "hook": "scroll-stopping â‰¤8 words",
      "news_url": "https://...",
      "news_title": "exact title",
      "news_category": "ai",
      "why_it_matters": "...",
      "key_fact": "one concrete fact",
      "creative_direction": "1-2 sentence art direction",
      "layout": "...",
      "palette_name": "...",
      "palette": ["#...", "#..."],
      "typography": "...",
      "background_style": "...",
      "illustration_style": "...",
      "aspect": "square|portrait",
      "image_prompt": "detailed cinematic scene WITHOUT any text overlays...",
      "visual_brief": "short overlay caption for design system (1 sentence)",
      "video_style": "...",
      "source_refs": ["news_title"],
      "slides": [
        {"title": "...", "body": "...", "role": "hook|what|why|stats|insight|future|cta", "image_prompt": "optional"}
      ],
      "video_script": [
        {"beat": "hook", "on_screen": "...", "voiceover": "...", "visual": "...", "motion": "punch_in", "seconds": 2.5}
      ],
      "platforms": {
        "linkedin": {"post": "...", "hashtags": ["AI"]},
        "instagram": {"post": "...", "hashtags": ["AI"]},
        "x": {"post": "...", "hashtags": ["AI"]},
        "threads": {"post": "...", "hashtags": ["Tech"]},
        "facebook": {"post": "...", "hashtags": ["AI"]}
      },
      "quality_checks": {
        "hook_strength_1to10": 9,
        "specificity_1to10": 9,
        "visual_uniqueness_1to10": 9,
        "factual_confidence_1to10": 9
      }
    }
  ]
}
ià.  )Ú
max_tokensÚideasz)LLM ideation did not return an ideas listrš   )r�   )ÚrangeÚappendr‰   Úchrr,   Ú	enumerateÚ_briefs_jsonÚcomplete_jsonÚIDEATION_SYSTEMÚ
isinstancer–   r   rŠ   ÚRuntimeErrorr<   r!   rF   rH   rI   rK   r�   rM   rO   rR   rT   )ÚllmÚ
brand_nameÚprofilesÚ
news_blockÚ
batch_sizeÚenable_videoÚcreative_briefsÚrecent_stylesÚformatsÚformat_planÚcycler›   Úuserr   Ú	raw_ideasrž   Úitemr�   Úideas                      r    Úgenerate_ideasr·   Ë   s  € ñ +7Ñ&Ð<M€Gà€KÙ.:Ó*ÀÈ*Ð@U€EÜ�:ÖˆØ×Ñ˜5 ¤S¨£Z¡Ñ0Õ1ð ð �z�lð #ð €ð ô €Rƒ‡�ñ  Zô  Hð  IXô  Yó  Zó  Zð  [ð [ô ˆoÓÐ ð  ð 
€
ð ð €ð àˆ|ð Ø$˜ð &Ø"˜)ð 9$ð'L€DðZ ×Ñœ_¨d¸uÐÓE€DÜ%/°´dÔ%;�—‘˜Ô!À€IÜ�i¤Ô&ÜÐFÓGÐGà!€EÜ˜Y {¨
Ð3Ö4‰ˆˆ4Ø&'¬#¨oÓ*>Ò&>� Ò"ÀDˆÜ×$Ñ$ T¨1¨q©5¸Ð$Ó>ˆáØŸ,™,ˆDŒKÜ §¡Ó.ˆDŒLØ %× 2Ñ 2ˆDÔØ#×.Ñ.ˆDŒOØ$)×$4Ñ$4ˆDÔ!Ø&+×&>Ñ&>ˆDÔ#Ø$×0Ñ0ˆDÔØŸ,™,ˆDŒKØ�‰�TÕð 5ð €Lr:   c                óJ  — g }t        | d«      D ]‚  \  }}|j                  d|d›d|j                  › d|j                  › d|j                  › d|j
                  › d|j                  › d	|j                  › d
|j                  › d|j                  › �«       Œ„ dj                  |«      S )Nrš   r†   r‡   z	: layout=z; typography=z; background=z; palette_name=z
; palette=z; illustration_style=z; video_style=z	; aspect=r#   )r¢   r    rF   rK   r�   rI   rH   rO   rR   rT   r,   )Úbriefsr0   r›   rœ   s       r    r£   r£   A  s¯   € Ø€EÜ˜& !Ö$‰ˆˆ1Ø�‰Ø�A�c�7˜) A§H¡H :¨]¸1¿<¹<¸.ð IØŸ,™,˜ °q·~±~Ð6FÀjÐQR×QZÑQZÐP[ð \"Ø"#×"6Ñ"6Ð!7°~ÀaÇmÁmÀ_ÐT]Ð^_×^fÑ^fÐ]gðiõ	
ð %ð �9‰9�UÓÐr:   N)r¨   r	   r©   r   rª   r   r«   r   r¬   r•   r­   Úboolr®   úlist[CreativeBrief]r¯   r   r3   zlist[ContentIdea])r¹   r»   r3   r   )Ú
__future__r   Údataclassesr   r   Útypingr   Úsrc.services.creativer   r   Úsrc.services.llmr	   r‹   r   r<   r¥   r·   r£   r&   r:   r    Ú<module>rÁ      sÄ   ðÝ "ç (Ý ç 8Ý 'àA€	ð ÷=ð =ó ð=ð( ÷k
ð k
ó ðk
ð\8€ðvsØ	ðsð ðsð ð	sð
 ðsð ðsð ðsð )ðsð ðsð ósôlr:   