
    &jl                        S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJr  S SK	J
r
  S SKrS SKrS SKJr  S SKJr  S SKJr  S SKJr  S SKrS SKJr  S S	KJrJr  S S
KJr  S SKJrJrJ r J!r!  S SK"J#r#  S SK$J%r%  S SK&J'r'J(r(  S SK)J*r*J+r+J,r,  S SK-J.r.  S SK)J/r/J,r,  S SKJ0r0  S SK1r1S SK2J3r3  S SKJ4r4  S SKJ5r5  S SK6J7r7  S SK8J9r9  S SK:J;r;  S SK<J=r=  S SK>J?r?  S SK@JArA  S SKBJCrC  SrD " S S\'5      rE " S  S!\'5      rF " S" S#\'5      rG " S$ S%\'5      rH " S& S'\'5      rIS( rJS) rKS* rLS+ rMS, rNS- rOS. rPS/ rQS0 rRS1 rSS6S2 jrTS3\U4S4 jrVS7S5 jrWg)8    N)validateValidationError)	AIMessage)OllamaEmbeddings)FAISS)ChatPromptTemplate)AsyncWebCrawler)PromptTemplate)StrOutputParserPydanticOutputParser)RunnablePassthrough)PyPDFLoader
TextLoaderDocx2txtLoaderUnstructuredPowerPointLoader)	PdfReader)SemanticChunker)	BaseModelField)ListOptionalDict)urlparse)Unionr   )RunnableLambda)Presentation)	OllamaLLM)
ChatOllama)PdfConverter)create_model_dict)text_from_rendered)Path)MarkdownHeaderTextSplitter)YouTubeTranscriptApi)fetch_image_for_slidenomic-embed-textc                       \ rS rSr% \" S5      r\\S'   \" SSS9r\	\   \S'   \" SS	S9r
\\   \S
'   \" SSS9r\\S'   \" SSS9r\	\   \S'   Srg)SlideContent+   flashtypeNz$An optional subheading for the slidedescription
subheading.z(List of paragraphs for the slide content
paragraphsz^A detailed suggestion for a relevant visualization or image (5-8 words with specific elements)visualization_suggestionzURL of the image for the slideimage )__name__
__module____qualname____firstlineno__r   r+   str__annotations__r.   r   r/   r   r0   r1   __static_attributes__r2       N/var/www/eduai.edurigo.com/storigo/testing/generate_storigo_content_youtube.pyr(   r(   +   sn    gD# %d8^ _J_!#3]^JS	^$)#  <\  %]c  ] 3STE8C=Tr:   r(   c                   ~    \ rS rSr% \" S5      r\\S'   \" SSS9r\\S'   \" SSS9r	\
\   \S	'   \" SS
S9r\\S'   Srg)
MCQContent2   Questionr+   .zThe multiple-choice questionr,   questionzA list of 4 answer optionsoptionsz0The correct answer (e.g., 'a', 'b', 'c', or 'd')correct_answerr2   N)r3   r4   r5   r6   r   r+   r7   r8   r@   rA   r   rB   r9   r2   r:   r;   r=   r=   2   sK    j!D#!#+IJHcJs0LMGT#YM1cdNCdr:   r=   c                   P    \ rS rSr% \" SSS9r\\\4   \	S'   \" SSS9r
\\	S'   S	rg
)StorigoContent8   .7Dictionary of slide contents with slide numbers as keysr,   slidesr   /Total token count for all the generated contenttoken_countr2   N)r3   r4   r5   r6   r   rG   r   r7   r(   r8   rI   intr9   r2   r:   r;   rD   rD   8   s0    &+C=v&wFDl"#wQ,]^K^r:   rD   c                   r    \ rS rSr% \" SSS9r\\\4   \	S'   \" SSS9r
\\\4   \	S'   \" SS	S9r\\	S
'   Srg)StorigoContentMCQ<   .rF   r,   rG   z8Dictionary of MCQs with identifiers like 'mcq_1' as keysmcqsr   rH   rI   r2   N)r3   r4   r5   r6   r   rG   r   r7   r(   r8   rN   r=   rI   rJ   r9   r2   r:   r;   rL   rL   <   sK    &+C=v&wFDl"#w"'9s"tD$sJ
tQ,]^K^r:   rL   c                   Z    \ rS rSr% \" SSS9r\\\\	\
4   4   \S'   \" SSS9r\\S'   S	rg
)StorigoContentMCQMidA   .zYDictionary of slide contents with slide numbers as keys and MCQs with MCQ numbers as keysr,   rG   r   rH   rI   r2   N)r3   r4   r5   r6   r   rG   r   r7   r   r(   r=   r8   rI   rJ   r9   r2   r:   r;   rP   rP   A   sD    9>s  Ql  :mFDeL*4556  mQ,]^K^r:   rP   c                 F    [         R                  " SU 5      n[        U5      $ )Nz\w+)refindalllen)texttokenss     r;   count_tokensrX   E   s    ZZ%Fv;r:   c                   #    [        SS9 IS h  vN nUR                  U S9I S h  vN n[        U 5      nUR                  UR                  R                  SS5      -   nUR                  S5      (       d  US-  n[        US5       nUR                  UR                  5        S S S 5        UsS S S 5      IS h  vN   $  N N! , (       d  f       N%= f N! , IS h  vN  (       d  f       g = f7f)NT)verbose)url/_z.txtw)
r	   arunr   netlocpathreplaceendswithopenwritemarkdown)filecrawlerresult
parsed_urlfilenametxt_files         r;   	crawlerrrrm   I   s     t,,|||--d^
$$z'>'>sC'HH  ((H(C HNN6??+ ! -,,-
 !  -,,,sm   C/B>C/CC ACC#	C,C/8C9C/ C
C	CC/C,CC,(C/c                     U (       a$  [         R                  R                  U 5      (       d  g[        U SSS9 nUR	                  5       nS S S 5        W(       a  U$ S$ ! , (       d  f       N= f)N rutf-8encoding)osra   isfilerd   read)inputrg   contents      r;   read_file_urlry   T   sN    u--	eS7	+t))+ 
,7%2% 
,	+s   A
A*c           	         SU ;   a'  U R                  S5      S   R                  S5      S   nO8SU ;   a'  U R                  S5      S   R                  S5      S   nO[        S5      e [        5       nUR                  U5      nS	nU H  nUS
UR                  -   -  nM     [        USSS9 nUR                  U5        S S S 5        U$ ! , (       d  f       U$ = f! [         a  n[        SU S[        U5       35      eS nAff = f)Nz	youtu.be/   ?r   zyoutube.com/watch?v=zv=&zInvalid YouTube URL formatro    r^   rq   rr   z0Unable to retrieve transcript for YouTube video z	. Error: )	split
ValueErrorr$   fetchrV   rd   re   	Exceptionr7   )youtube_video_urlvideo_idapitranscript_text
transcriptitemfes           r;   
transcriber   [   s   ''$**;7:@@EaH	#4	4$**40399#>qA566h"$))H-
#D#		/)J $ (C'2aGGJ 3  32  hJ8*T]^abc^d]efgghs7   'AC *C<	C 
CC C 
D"C<<Dc                 8    [        U 5      nUR                  5       $ N)r   load)	file_pathloaders     r;   load_txtr   s   s    	"F;;=r:   c                 z    [        USS9nUR                  U  Vs/ s H  o3R                  PM     sn5      nU$ s  snf )N
percentilebreakpoint_threshold_type)r   create_documentspage_contentdocs
embeddingstext_splitterdoc	documentss        r;    split_text_with_semantic_chunkerr   w   sB    #lM ..D/QDS0@0@D/QRI 0Rs   8c                 z    Sn[        SSS9n[        S/US9nX2-  nUR                  SU 05      nUR                  nU$ )Nak  
    Extract only the meaningful content from the text below. Focus on descriptions, value propositions, mission statements,
    features, and anything that provides valuable information about the company, products, or services. Ignore any URLs,
    navigation links, contact forms, or irrelevant sections.

    Here is the content to process:

    {context}
    http://127.0.0.1:11434
gemma3:12b)base_urlmodelcontext)input_variablestemplate)r   r
   invokerx   )rx   prompt_templatellmpromptrunnablefiltered_contents         r;   clean_using_llmr   ~   sX    O )C YK/RF|H	7';<'//r:   c                 0   [        USS9n[        U [        5      (       a  U /n [        U S   [        5      (       a  U  Vs/ s H  nSU0PM	     n n[        S U  5       5      (       d  / $ UR	                  U  Vs/ s H  o3S   PM	     sn5      nU$ s  snf s  snf )Nr   r   r   r   c              3   Z   #    U  H!  n[        U[        5      =(       a    S U;   v   M#     g7f)r   N)
isinstancedict.0r   s     r;   	<genexpr>;split_text_with_semantic_chunker_for_url.<locals>.<genexpr>   s$     O$3z#t$>3)>>$s   )+)r   r   r7   allr   r   s        r;   (split_text_with_semantic_chunker_for_urlr      s    #lM $v$q'3156#%6O$OOO	..t/TtN0Ct/TUI	 7 0Us   B7Bc                    [        U5      n[        R                  R                  SU5      n[        R                  " USS9  [        SS9n[        U SS9 H  u  pE[        R                  R                  U5      n[        R                  " USS9  [        R                  " U/US9n[        R                  R                  US	U 35      nUR                  U5        M     g )
Nmy_embeddingsT)exist_okr&   r   r{   start	embeddingfaiss_index)
r7   rt   ra   joinmakedirsr   	enumerater   from_documents
save_local)	split_documents	client_idembedding_folder_baser   idxr   embedding_foldertemp_dbembedding_file_paths	            r;   create_and_save_embeddingsr      s    IIGGLL)DKK%5!(:;JoQ777<<(=>
$t4&&u
C ggll+;{3%=PQ./ 8r:   c                 f    [        SS9n[        R                  " XS9nSnUR                  U5        U$ )Nr&   r   r   faiss_supplier_index)r   r   r   r   )r   r   r   vectorstorefaiss_index_paths        r;   create_embeddingsr      s8    !(:;J&&MK-+,r:   c                 N   [        SS9nS nU SU  3n[        R                  " U5       Vs/ s H@  nUR                  S5      (       d  M  U[	        S5      S  R                  5       (       d  M>  UPMB     nn[        US S9nU H  n[        R                  R                  XH5      n	[        R                  " XSS9n
U
R                  R                  5        Vs/ s H(  nU
R                  R                  U5      R                  PM*     nnUc  U
nM  UR!                  U5        M     Ub  UR#                  U S	35        U H9  n[        R                  R                  XH5      n	 [$        R&                  " U	5        M;     U$ s  snf s  snf ! [(         a     MV  [*         a  n S nAMe  S nAff = f)
Nr&   r   r\   r   c                 8    [        U R                  SS5      5      $ )Nr   ro   )rJ   rb   xs    r;   <lambda>!merge_all_faiss.<locals>.<lambda>   s    S=RT9U5Vr:   keyT)allow_dangerous_deserializationz/merged_faiss)r   rt   listdir
startswithrU   isdigitsortedra   r   r   
load_localindex_to_docstore_idvaluesdocstoresearchr   	add_textsr   shutilrmtreeFileNotFoundErrorOSError)r   	base_pathr   merged_faissfolder_pathfolderfaiss_filessorted_filesrg   
faiss_pathcurrent_faissdoc_idcurrent_textsr   s                 r;   merge_all_faissr      s   !(:;JLKq,KZZ446]+ 	06s=7I7J0K0S0S0U 	4   ++VWLWW\\+4
((aef'4'I'I'P'P'RT'RV '//66v>KK'R 	 T(L""=1  ;-} =>WW\\+4
	MM*%  1T ! 	 		s/   E9	E9,E9/E>F
F$	F$F$returnc                 Z   [        U S5      (       a  U R                  nO[        U 5      nUR                  5       nSU;   aA  [        R
                  " SSU5      n[        R
                  " SSU5      nUR                  5       nO.SU;   a(  [        R
                  " SSU5      nUR                  5       nSU;   d  S	U;   d  S
U;   a5  UR                  S5      nUR                  S5      S-   nUS:w  a
  US:w  a  XU nUR                  S5      (       d5  UR                  S5      nUR                  S5      S-   nUS:w  a
  US:w  a  XU n[        R
                  " SSU5      n [        R                  " U5      nSU;   a  [        R                  " US   5      $ [        R                  " U5      $ !    U$ = f)Nrx   z```jsonz
```json\s*ro   z```\s*$z```z```\s*zHere's another attemptzI apologizezHere is the content{}r{   r   z	'(\w+)\":z"\1":
properties)hasattrrx   r7   striprS   subfindrfindr   jsonloadsdumps)
ai_messagerV   r   endparseds        r;   quick_json_fixr     s   z9%%!!:::<D DvvmR.vvj"d+zz|	$vviT*zz|  4'=D+@DY]aDa		#jjo!B;3!8c?D ??3		#jjo!B;3!8c?D66,$/DD!6!::f\233zz&!!Ks   4F% F% %F*c	                   ^^^E^F^G^H^I^J^K#      T(       a  T" SSSS.5        [        U 5      n	[        SS9n
[        U	5      nT(       a  T" SSSS.5        [        X5      nT(       a  T" SS	S
S.5        [	        U5      n[        X5      nT(       a  T" SSSS.5        [        X5        [        U5      n[        SSSS9n[        UR                  R                   R#                  5       5      n[%        U5      nSRS jmG['        UG4S jU 5       5      n/ nUU::  a5  [(        R*                  " SUS-
  U[,        S9nU Vs/ s H  nUU   PM
     nnGOU Vs/ s H&  n[%        UR.                  R1                  5       5      PM(     nn['        U5      nU Vs/ s H  nUU-  U-  PM     nnU Vs/ s H  n[3        S[5        U5      5      PM     n nU['        U 5      -
  n!SnU!S:w  aJ  U!S:  a  U U==   S-  ss'   U!S-  n!O!U!S:  a  U U   S:  a  U U==   S-  ss'   U!S-  n!US-   U-  nU!S:w  a  MJ  [7        UU 5       H  u  n"n#UR9                  U"/U#-  5        M     SR;                  S US U  5       5      mESn$[=        [>        S 9n%U%mJ[@        RB                  " U$5      n&[E        [F        5      n'UE4S! jS" UJ4S# jS$.U&-  U-  U'-  TJ-  n(T(       a  T" SS%S&S.5        S'n)S n*S n+[I        U)5       HX  n, U(RK                  S(US).5      n*U*(       a$  [M        U*S*5      (       a  U*RN                  (       a    O[        S+U,S-    S,U) S-35        MZ     U*b"  [M        U*S*5      (       a+  U*RN                  (       d  [        S/U) S0[        U+5       35      e[M        U*S*5      (       a  U*RN                  n.O5[M        U*S15      (       a  U*RQ                  5       OU*n/U/RS                  S*0 5      n.[U        U.[        5      (       a   0 n0[W        U.SS29 H  u  nn1U1U0S3U 3'   M     U0n.T(       a  U.RY                  5        H  u  n2n3T" S4U2[M        U3S55      (       a  U3RZ                  OU3RS                  S55      [M        U3S65      (       a  U3R\                  OU3RS                  S65      [M        U3S75      (       a  U3R^                  OU3RS                  S75      U2 S83S9.5        M     S:[        4S; jmF[a        [c        U.RY                  5       UF4S< jS=95      mI[U        U[,        5      (       a  US:H  n4O9[U        U[        5      (       a"  URe                  5       Rg                  5       S>;   n4OS?n4U4(       a  T(       a  T" SS@SAS.5        TIRY                  5        H  u  n2n3U3R^                  (       aa  [i        U2U3R^                  5      n5U5(       a"  U5U3l5        T(       a  T" SBU2U5U2 SC3SD.5        MT  MV  S U3l5        T(       a  T" SBU2S U2 SE3SD.5        Mv  Mx  S U3l5        M     OTIR#                  5        H
  n3S U3l5        M     Sn6TIR#                  5        HH  n1U1RZ                   SFSFR;                  U1R\                  5       SFU1R^                   3n7U6[m        U75      -  n6MJ     U(       Ga@  T(       a  T" SSGSHT SI3S.5        SJmH[        TIRo                  5       5      mKUHUUIUUK4SK jn8U8" 5       I S h  vN n9U9R#                  5        H3  n:U:SL    SFSFR;                  U:SM   5       SFU:SN    3n7U6[m        U75      -  n6M5     0 n;Sn<Un=Tn>US:X  aa  U>S:  a  U=U>-  OU=n?[W        TK5       H9  u  n@n2TIU2   U;U2'   U@S-   U?-  S:X  d  M  U<U>:  d  M$  SOU<S-    3nAU9UA   U;UA'   U<S-  n<M;     [q        U;U6SP9nBUB$ TK H  n2TIU2   U;U2'   M     [I        U>5       H  n<SOU<S-    3nAU9UA   U;UA'   M     [q        U;U6SP9nBUB$ [?        TIU6SP9nCUC$ ! [         a  n[        SU  S[        U5       35        T(       a  T" SSS.5        [        U 5      I S h  vN  n[        U5      nU(       d  [        S5      eT(       a  T" SSS.5        [	        U5      n[        SS9n
[        X5      n S nAGNS nAff = fs  snf s  snf s  snf s  snf ! [         a>  n-U-n+[        S+U,S-    S,U) S.[        U-5       35        U,U)S-
  :  a   S n-A-GM   S n-A-GM  S n-A-ff = f GN! [         a  nD[        SQ[        UD5       35      eS nDADff = f7f)SNstagetranscriptionzTranscribing YouTube video...)r+   r  messager&   r   semantic_splittingzSplitting text semantically...cleaningzCleaning content with LLM...zTranscript not available for z2, falling back to page content extraction. Error: statusz2Transcript not available, crawling YouTube page...)r+   r
  z+Failed to retrieve content from YouTube URLzCleaning crawled content...r   zSaving embeddings...r   r   ffffff?r   r   temperaturec           	      `    [        S[        [        U R                  5       5      U-  5      5      $ )Nr{   )maxroundrU   r   )rV   words_per_slides     r;   estimate_slides7generate_slide_content_youtube.<locals>.estimate_slides'  s$    q%DJJL 1O CDEEr:   c              3   H   >#    U  H  nT" UR                   5      v   M     g 7fr   r   )r   r   r  s     r;   r   1generate_slide_content_youtube.<locals>.<genexpr>*  s     U*3_S-=-=>>*s   "r   r{   )numdtypez

c              3   8   #    U  H  oR                   v   M     g 7fr   r  r   s     r;   r   r  B  s     "\?[#3#3?[s   u  
Based on the following context, generate professional and engaging content for exactly {num_slides} slides in a Storigos presentation.

STRICT RULES:
- ❗ ONLY use the content provided in the 'context' below.
- ❌ DO NOT introduce any external knowledge, definitions, or examples not present in the context.
- ⚠️ Do not assume common sense or use general facts. Stick to the exact information given.
- ⚠️ Avoid generic phrases like "as we know", "in general", or "in this video".

Each slide must include:
- A clear and concise **sub-heading**
- **Exactly 2–4 concise paragraphs** derived solely from the context
- A **detailed visualization suggestion** (5-8 words, specific to the content with concrete elements)
- Include specific details: people, objects, actions, settings to make it highly unique
- CRITICAL: Each slide's visualization suggestion MUST BE COMPLETELY UNIQUE across all slides - no overlapping concepts, objects, or scenes
- If slides are related, vary all elements (people, objects, actions, settings) significantly to ensure completely different images

Important: Only output the final JSON object. No additional text, markdown, or explanation should be included.

Context:
{context}

{format_instructions}

The final output must be a valid JSON object where each slide is represented as "slide_1", "slide_2", ..., up to "slide_{num_slides}".
Each slide must contain:
- "subheading"
- "paragraphs"
- "visualization_suggestion"
)pydantic_objectc                    > T$ r   r2   )r   context_texts    r;   r   0generate_slide_content_youtube.<locals>.<lambda>l  s    \r:   c                     U S   $ )N
num_slidesr2   r   s    r;   r   r   m  s    ,r:   c                 $   > TR                  5       $ r   )get_format_instructions)r   parsers    r;   r   r   n  s    1O1O1Qr:   )r   r"  format_instructions
slide_textz$Generating slide content with LLM...   ro   )queryr"  rG   z[STORIGO] Attempt r\   z: Empty result, retrying...z	 failed: z-Failed to generate valid slide content after z attempts. Last error: 
model_dumpr   slide_slider.   r/   r0   z	 prepared)r+   	slide_keyr.   r/   r0   r
  item_keyc                     U R                  SS5      u  pUS:X  a  SnOUS:X  a  SnOSnUR                  5       (       a  [        U5      OSnX44$ )Nr]   r{   r,  r   mcqi  )r   r   rJ   )r.  prefixnum_strgroupnumbers        r;   custom_slide_sort_key=generate_slide_content_youtube.<locals>.custom_slide_sort_key  sQ    &nnS!4OF 5%,__%6%6S\CF?"r:   c                    > T" U S   5      $ )Nr   r2   )kvr5  s    r;   r   r     s    I^_abc_dIer:   r   )1trueyesFimagesz Fetching visualization images...r1   z image ready)r+   r-  r1   r
  z image not foundr~   r0  zGenerating z MCQs...ur  
Based on the following context from the last two slides, generate one multiple-choice question (MCQ). The question should be relevant to the content and designed to test comprehension.

**Context**: {context}

The MCQ must include:
- A **question** related to the context
- Exactly **4 answer options**
- A clear indication of the **correct answer** as a single letter: 'a', 'b', 'c', or 'd'

⚠️ **Critical Requirements**:
- ✅ Return **only valid JSON** — no explanations, headers, or extra text.
- ✅ Ensure all fields and options are enclosed in **double quotes (`"`)**.
- ✅ Do **not** use letters like "A.", "B." in the options — just the plain text.
- Dont give Here is the MCQ while generating MCQ
- Directly follow the format given below

The final output **must strictly follow** this format:
```json
{{
    "question": "<The MCQ question>",
    "options": [
        "<Option 1>",
        "<Option 2>",
        "<Option 3>",
        "<Option 4>"
    ],
    "correct_answer": "<Correct option (e.g., 'a', 'b', 'c', or 'd')>"

    Always give "question","options","correct_answer" these labels in double quotes only
}}
c            
      b  >^^#    [         R                  " T5      m[        SSSS9m0 n / n[        S[	        T5      S5       H  n[	        U 5      T:  a    O/ n[        U[        US-   [	        T5      5      5       HD  nTTU      nUR                  UR                   SSR                  UR                  5       35        MF     S	R                  U5      nUU4S
 jn[	        U5      T:  d  M  U" Xb5      nUR                  U5        M     [        R                  " USS06I S h  vN n	U	 H  n
[        U
[        5      (       d  M  U
(       d  M#  S[	        U 5      S-    3nXU'   T(       d  MA  T" SUU
R                  S5      U
R                  S5      U
R                  S5      U S3S.5        M     U $  N7f)Nr   r   r  r  r      z: r~   
c                   >^ #     [         R                  " 5       R                  S U UU4S j5      I S h  vN n[        US5      (       a  UR                  nO[        U5      nUR                  S5      nUS:w  ab  SnSn[        X4S  US9 H)  u  pxUS:X  a  US-  nM  US:X  d  M  US-  nUS:X  d  M'  Un  O   US:w  a  X4US-    n	[        R                  " U	5      n
Og g U	(       a  U	R                  5       (       d  g U
R                  S	S
5      U
R                  S/ 5      U
R                  SS
5      S.nUS	   (       a  [        US   5      S:X  a  US   (       a  U$ g  GN$! [         a
  n S nAg S nAff = f7f)Nc                  L   > [        U 4S j5      T-  T-  R                  0 5      $ )Nc                    > ST0$ )Nr   r2   )r   ctx_texts    r;   r   |generate_slide_content_youtube.<locals>.generate_mcqs_async.<locals>.generate_single_mcq.<locals>.<lambda>.<locals>.<lambda>  s
    i=Rr:   )r   r   )rC  mcq_llm
mcq_prompts   r;   r   jgenerate_slide_content_youtube.<locals>.generate_mcqs_async.<locals>.generate_single_mcq.<locals>.<lambda>  s,    $23R$S&0%1&-%. #)&*	)-r:   rx   r   r   r   r   r{   r   r@   ro   rA   rB   )r@   rA   rB      )asyncioget_event_looprun_in_executorr   rx   r7   r   r   r   r  r   getrU   r   )rC  r   
mcq_resultrx   r   open_bracesr  idx_charcharcontent_onlyjson_objectformatted_mcqr   rE  rF  s   `            r;   generate_single_mcqXgenerate_slide_content_youtube.<locals>.generate_mcqs_async.<locals>.generate_single_mcq  s{    3(/6/E/E/G/W/W $!-0 *J  'z9==*4*<*<*-j/$+LL$5E${./&(6?W\6]NH'+s{(3q(8)-(3q(8+6!+;2:C,1 7^ $'"93:Q3GL26**\2JK+/'+#/|7I7I7K7K'+ -8OOJ,K+6??9b+I2=//BRTV2W-M !.j 9 #M)$< = B -.> ?'4 4#'a*b  ) (#'(s^   E2.E EA*E #	E 0*E E2E 8E29AE E2E 
E/%E2*E//E2return_exceptionsTmcq_r{   r0  r@   rA   rB   z ready)r+   mcq_keyr@   rA   rB   r
  )r   from_templater   rangerU   minappendr.   r   r/   rI  gatherr   r   rL  )rN   tasksicontext_slidesjr,  r  rT  taskresultsri   rX  rE  rF  mcq_templatenum_mcqsordered_slidesprogress_cb
slide_keyss               @@r;   generate_mcqs_async;generate_slide_content_youtube.<locals>.generate_mcqs_async  s    /==lK
$5& # q#j/15A4yH,%'N"1c!a%Z&AB .z!} =&--1A1A0B"SXXeN^N^E_D`.ab C $(99^#<L4(l 5zH,2<CT*E 6H !( N NN%F!&$//FF$(TQ"8(.W&;'(-+2,2JJz,B+1::i+@28**=M2N.5Yf+=)  & ! Os+   C!F/*6F/ F-!F/F/
F/(AF/r@   rA   rB   rW  )rG   rI   z Error generating slide content: )r>   )9r   r   r   r   r   r   r   printr7   rm   ry   r   r   r   listr   _dictr   rU   sumnplinspacerJ   r   r   r  r  zipextendr   r   rD   r   rY  r   r  rZ  r   r   rG   r*  rL  r   r   itemsr.   r/   r0   r   r   r   lowerr%   r1   rX   keysrP   )Ldocument_urlr   r"  re  is_imageis_questionquestion_positionGPUrg  r   r   rV   split_documents1meaningful_contentr   transcript_errorrk   raw_contentmerge_embeddingsr   
all_chunkstotal_chunkstotal_possibleselected_chunksindicesr_  cword_countstotal_wordsr^   	raw_allocr   allocdiffchunkcountslide_content_template
raw_parserslide_content_prompt
json_fixerslide_content_chainmax_retriesri   
last_errorattempt	parse_errslides_datarawslides_dictr,  r-  slide_contentis_image_bool
image_pathrI   text_contentri  rN   r0  interleaved_contentmcq_countertotal_slides
total_mcqsintervalr   rX  storigo_contentstorigo_content_without_mcr   r  r5  r  rd  rf  r%  rh  sL      `    `                                                            @@@@@@@r;   generate_slide_content_youtuber     s	    BE	gK?_~(  A"<0I)0BCJI&DKCW  eE  )F  G?QK:Zx(yz!01A!BFGYfO" W|Xn$op"?>*95 -
 *3399@@BC
:	F U*UU%kk!\A%5:SQG6=>gz!}gO>O@JK
13q~~3356
KKk*K?JK{![:5{IK/89y!SE!H%yE9E
*DA!)!8!HMHAIDAX%(Q,!HMHAIDUl* !) !$J 6u&&w7 !7 {{"\{PZ?["\\"< *.I
 1??@VW#N3
 27'Q
 ##    	 W|X~$  A
[)G	,33bPZ4[\gfh77FMM*7Q;-qE`ab * >gfh77KK=Xopst~p  pA  B  C  C 68$$ --K)0)F)F&##%FC''(B/Kk4((K%k;5,1fQCL) <%K ,7,=,=,?(	=#!*>EmUa>b>b-":":huhyhy  {G  iH>EmUa>b>b-":":huhyhy  {G  iHZabo  rL  [M  [M0V0V  S`  Sd  Sd  e  S@"+I6  -@		#C 		# f[%6%6%8>efgh$$$MM#&&$NN,2248LLM!MK8Xz({|,:,@,@,B(	= 99!6!%>>"J ".8+&'y[eu~t  @L  sM  )N  O ' /3+&'y[_oxny  zJ  mK  )L  M ' +/M' -C" "0!6!6!8&*# "9 #**,E#../q%:J:J1K0LAeNlNlMmnL<55K - K5WbckblltUu(vwL@ n1134J_ _B -..D{{}"%j/!2!CHHS^4L3MQsScOdNef|L99 % #%K%L!J A%9Ca<:5\&/
&;NC5CI5N'	2a8+q0[:5M$(q(9":7;G}+G4#q( '< #7>Q_j"k&& ",I5CI5N'	2 ", $)#4K $[1_$56G37='0 $5 #7>Q_j"k&&)7~[f)g&--g  	g1,?qru  wG  sH  rI  J  KKFz({|&|444H'1K MNN KFc(de!0!=)0BCJFGYfO	gL ?KK9Z  &
*7Q;-qYsS\~N^_`[1_, -l /N  E:3q6(CDDEs   c-A9^< B0c 7a"c -a';c a,c $a1A c %B>c $=a6!c #a68M>c 6c7B	c c $c 0c-1>c /c-0c ;c-<
a:a `Aac ac 6
b> +b9+c 9b>>c 
c*c%%c**c-)r   r   )Xrt   timerandomrS   r   heapq
jsonschemar   r   langchain_core.messagesr   requestsnumpyro  langchain_ollamar    langchain_community.vectorstoresr   langchain_core.promptsr   crawl4air	   rI  r
   langchain_core.output_parsersr   r   langchain_core.runnablesr   $langchain_community.document_loadersr   r   r   r   PyPDF2r   $langchain_experimental.text_splitterr   pydanticr   r   typingr   r   r   urllib.parser   r   r   r   pptxr   r   r   marker.converters.pdfr   marker.modelsr    marker.outputr!   pathlibr"   langchain_text_splittersr#   youtube_transcript_apir$   storigo_image_generatorr%   OLLAMA_MODELr(   r=   rD   rL   rP   rX   rm   ry   r   r   r   r   r   r   r   r   r7   r  r  r2   r:   r;   <module>r     s   	   	   0 -   - 2 5 $  1 O 8 v v  @ % ' ' !  3   & ' . + ,  ? 7 :!U9 Ue e_Y __	 _
_9 _	&h0*
0<)# )VCEr:   