
    bhA                        S SK JrJr  S SKJrJrJr  S SKJr  S SK	r	S SK
JrJ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  S SKrS SKJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'  S SK(J)r)  S S	K*J+r+  \" S
SSS9r, " S S\5      r- " S S\5      r. " S S\5      r/ " S S\5      r0S r1S r2\,Rg                  S5      S\-4S j5       r4\,Rg                  S5      S\/S\4S j5       r\,Rg                  S5      S\.S\4S j5       r5S S K6J7r7   \7" 5       r6\,Rg                  S!5      S\04S" j5       r:\,Rw                  S#5      S$ 5       r<g! \8 a  r9Sr6 Sr9C9N@Sr9C9ff = f)%    )FastAPIHTTPException)	BaseModelField	validator)ProfessionalImageGeneratorN)JSONResponseFileResponse)Union)load_pdf
transcribeload_txt split_text_with_semantic_chunker	crawlerrrread_file_url(split_text_with_semantic_chunker_for_urlclean_using_llmcount_total_wordssave_documents_to_txtcreate_and_save_embeddingsgenerate_slide_contentmerge_all_faissparsingmarks_splitterallocate_slidescreate_embeddingsgenerate_slide_content_alloc1)"generate_slide_content_from_prompt)OllamaEmbeddingszStorigo Content Generation APIzBAPI for generating professional presentation content using Groq AIz4.0.0)titledescriptionversionc                      \ rS rSr% \" 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SS9r\\S'   \" SSS9r\\S'   \" S	5      S 5       r\" S5      S 5       r\" SS5      S 5       r " S S5      rSrg)ImageRequest#   .z$The text prompt for image generationr!   promptzCategory/style for the imagecategoryz'Model name: flux, nano-banana, or turbo
model_name  zImage width in pixelswidth8  zImage height in pixelsheight   z$Number of images to generate (max 3)image_countc                 R    / SQnX;  a  [        SSR                  U5       35      eU$ )N)fluxznano-bananaturbozmodel_name must be one of: , 
ValueErrorjoinclsvallowed_modelss      X/var/www/eduai.edurigo.com/image_generation/testing/image_generation_fast_api_testing.pyvalidate_model_name ImageRequest.validate_model_name+   s/    9":499^;T:UVWW    c                 :    SUs=::  a  S::  d  O  [        S5      eU$ )Nr.      z#image_count must be between 1 and 3r5   r8   r9   s     r;   validate_image_count!ImageRequest.validate_image_count2   s    Q!BCCr>   c                 (    US::  a  [        S5      eU$ )Nr   z*width and height must be positive integersrA   rB   s     r;   validate_dimensions ImageRequest.validate_dimensions8   s    6IJJr>   c                   *    \ rS rSrSSSSSSSS	.0rS
rg)ImageRequest.Config>   exampleziGenerate a professional online training session with diverse learners interacting through virtual screens	realisticr1   r*   r,   r@   r'   r(   r)   r+   r-   r/    N__name__
__module____qualname____firstlineno__json_schema_extra__static_attributes__rN   r>   r;   ConfigrI   >   s'     F'$ 	
r>   rV   rN   N)rP   rQ   rR   rS   r   r'   str__annotations__r(   r)   r+   intr-   r/   r   r<   rC   rF   rV   rU   rN   r>   r;   r$   r$   #   s    )OPFCP#+IJHcJC-VWJWt)@AE3A*BCFCCQ,RSKS|  } 
 w! "


 

r>   r$   c                       \ rS rSr% \\S'   \\S'   \\S'   \\\4   \S'   \\\4   \S'   \\S'   \\S'   \\\4   \S	'    " S
 S5      r	Sr
g)StorigoContentRequestJ   	client_idr'   
num_slidesis_imageis_questionnum_mcqsquestion_positionisGPUc                   (    \ rS rSr\\\4   S 0rSrg)StorigoContentRequest.ConfigT   c                 F    [        U [        5      (       a  [        U 5      $ U $ )N)
isinstancerY   rW   )r9   s    r;   <lambda>%StorigoContentRequest.Config.<lambda>W   s    As1C1Cs1v'J'Jr>   rN   N)	rP   rQ   rR   rS   r   rY   rW   json_encodersrU   rN   r>   r;   rV   re   T   s     #s(OJ
r>   rV   rN   N)rP   rQ   rR   rS   rY   rX   rW   r   boolrV   rU   rN   r>   r;   r[   r[   J   sQ    NKOCHosCx Ms
 
r>   r[   c                       \ rS rSr% \\S'   \\S'   \\S'   \\\4   \S'   \\S'   \\\4   \S'   \\S'   \\S	'   \\\4   \S
'   Sr	g)DocumentContentRequestZ   r]   r^   document_urlr_   document_typer`   ra   rb   rc   rN   N)
rP   rQ   rR   rS   rW   rX   rY   r   rl   rU   rN   r>   r;   rn   rn   Z   sN    NOCHosCx Msr>   rn   c                       \ rS rSr% \" 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5      S 5       r\" S5      S 5       r\" S5      S 5       r " S S5      rSrg)VideoRequeste   .z$The text prompt for video generationr&   r'   16:9z7Aspect ratio for the video (16:9, 9:16, 1:1, 4:5, 21:9)aspect_ratiov2zModel version to use (v1 or v2)modelrL   z,Video style (realistic, animated, cinematic)stylec                 R    / SQnX;  a  [        SSR                  U5       35      eU$ )N)ru   z9:16z1:1z4:5z21:9zaspect_ratio must be one of: r3   r4   )r8   r9   allowed_ratioss      r;   validate_aspect_ratio"VideoRequest.validate_aspect_ratiok   s/    ?"<TYY~=V<WXYYr>   c                 R    SS/nX;  a  [        SSR                  U5       35      eU$ )Nv1rw   zmodel must be one of: r3   r4   r7   s      r;   validate_modelVideoRequest.validate_modelr   s3    "5dii6O5PQRRr>   c                 R    / SQnX;  a  [        SSR                  U5       35      eU$ )N)rL   animated	cinematiczstyle must be one of: r3   r4   )r8   r9   allowed_styless      r;   validate_styleVideoRequest.validate_styley   s/    ?"5dii6O5PQRRr>   c                   &    \ rS rSrSSSSSS.0rSrg	)
VideoRequest.Config   rK   zBA beautiful sunset over the ocean with waves crashing on the shoreru   rw   rL   )r'   rv   rx   ry   rN   NrO   rN   r>   r;   rV   r      s    ^ &$	
r>   rV   rN   N)rP   rQ   rR   rS   r   r'   rW   rX   rv   rx   ry   r   r|   r   r   rV   rU   rN   r>   r;   rs   rs   e   s    )OPFCPf2klL#lt)JKE3K{0^_E3_~  w  w 
 
r>   rs   c                 z    [         R                  " U 5      nUR                  S:X  a  UR                  $ [	        SSS9e)N   i  zDocument not foundstatus_codedetail)requestsgetr   contentr   )urlresponses     r;   fetch_document_with_curlr      s8    ||C Hs"4HIIr>   c           
      f    [        X5        [        U5      n[        XX#XEXg5      n	[        SU S35        U	R	                  5       n
[        U
S9$ ! [         aX  n[        R                  " S[        U5       35        [        S[        U5       3[        R                  " 5       S.SS9s S nA$ S nAff = f)	NzSlide content generated for z slides.r   Error generating content: Error: errordetails  r   r   )r   r   r   printdictr	   	Exceptionloggingr   rW   	traceback
format_exc)split_documentsr]   r^   ra   r_   r`   rb   rc   merge_embeddingsslide_contentresponse_dataes               r;   process_and_generate_responser      s    
"?>*95 //?Jbj  zK  S,ZLAB &**,M22 
23q6(;<  'Ax0Y=Q=Q=ST
 	

s   AA 
B0AB+%B0+B0z/generate-imagerequestc           	      z  #     [         R                  U R                  U R                  R	                  5       R                  5       U R                  U R                  U R                  U R                  S9nU(       d
  [        SSS9eSU0$ ! [         a    e [         a  n[        SS[        U5       3S9eSnAff = f7f)a  
Generate images based on the provided parameters.

Accepts raw JSON input from Postman.

- **prompt**: The text prompt for image generation
- **category**: Category/style for the image (accepts any category type)
- **model_name**: Model to use (flux, nano-banana, turbo)
- **width**: Image width in pixels
- **height**: Image height in pixels
- **image_count**: Number of images to generate (1-3)

Returns a list of generated images with names and base64 data.
rM   r   zImage generation failedr   imageszError generating image: N)	generatorgenerate_multiple_imagesr'   r(   lowerstripr)   r+   r-   r/   r   r   rW   )r   r   r   s      r;   generate_imager      s      Y33>>%%++-335))-->>++ 4 
 C8QRR&!!  Y6NsSTvh4WXXYs)   B;BB	 B;	B8B33B88B;z/generate-storigo-contentreturnc           
        #     U R                   S:X  Ga  [        SU R                   35        [        U R                  5      n[        S[	        U5       S35        [
        R                  " SSS9 nUR                  U5        UR                  n[        SU 35        S	S	S	5         [        W5      n[        S
SSS9 nUR                  U5        S	S	S	5        SS/n[        S
SSS9 nUR                  5       nS	S	S	5        [        UW5      n[        XR                  SS9n	[        XR                   5      n
[#        XU R                  U R$                  U R&                  U R(                  U R*                  U R,                  5      nUR/                  5       n[1        US9[2        R4                  " U5        $ U R                   S:X  GaL  [        SU R                   35        SU R                  R7                  5       ;   aL  [9        U R                  5      n[;        SS9n
[=        U5      n[?        X5      n[A        U5      n[C        UU
5      nOr[E        U R                  5      I S	h  vN n[        SU 35        [G        U5      nU(       d
  [I        SSS9e[A        U5      n[        S5        [;        SS9n
[C        UU
5      n[K        UU R                   U R                  U R$                  U R&                  U R(                  U R*                  U R,                  5      $ [I        SSS9e! , (       d  f       GN= f! , (       d  f       GNa= f! , (       d  f       GNK= f! [2        R4                  " W5        f = f GN! [L         aX  n[N        RP                  " S [S        U5       35        [1        S![S        U5       3[T        RV                  " 5       S".SS#9s S	nA$ S	nAff = f7f)$aB  
Generate Storigo content from document URL (PDF or HTML).

Accepts raw JSON input from Postman.

- **client_id**: Client identifier
- **num_slides**: Number of slides to generate
- **document_url**: URL of the document to process
- **is_image**: Whether to generate images ("1" or "0")
- **document_type**: Type of document ("pdf" or "html")
- **is_question**: Whether to generate questions ("1" or "0")
- **num_mcqs**: Number of multiple choice questions
- **question_position**: Position of questions ("end" or other)
- **isGPU**: Legacy parameter (always uses Groq API now)
pdfzFetching document from: zDocument fetched, size: z bytesFz.pdf)deletesuffixzTemporary file saved at: Nzparse_data.mdwzutf-8)encoding)#zHeader 1)z##zHeader 2rd   )	min_charsr   htmlzFetching HTML content from: youtubeznomic-embed-text)rx   zCrawled content saved to: r   z0Failed to read content from the URL: RAW CONTENTr   zExtracted meaningful content.i  z4Unsupported source type. Please use 'pdf' or 'html'.r   r   r   r   ),rq   r   rp   r   lentempfileNamedTemporaryFilewritenamer   openreadr   r   r^   r   r]   r   ra   r_   r`   rb   rc   r   r	   osremover   r   r   r   r   r   r   r   r   r   r   r   r   r   rW   r   r   )r   document_content	temp_filetemp_file_path
parse_datafheaders_to_split_onr   chunks
allocation
embeddingsr   r   	file_pathtextsplit_documents1meaningful_contentr   filenameraw_contentr   s                        r;   generate_storigo_contentr      sp    "P
  E),W-A-A,BCD78L8LM,S1A-B,C6JK ,,E&IY 01!*1.1ABC J
*$^4
/3AQGGJ' B &&'# /3AQffhG B'(;WE,V5G5GSVW
.v7H7HI
 =(:(:G<L<L$$g&9&97;T;TV]VcVc!
 !. 2 2 4#M: 		.)""f,01E1E0FGHG006688&w';';<	-4FG
	*#CD#U %45E%F""JK]_i"j "+7+?+?!@@28*=> ,H5"'C@rss &5[%A"56 .4FG
"JK]_i"j 1!2!2G4F4FHXHX  '"5"5w7P7PRYR_R_   C8noo JI BA BA 		.) A2  
23q6(;<  'Ax0Y=Q=Q=ST
 	

s   OA+M( /,LM( $M
 :L&M
 #L84B"M
 M( ,O-B+M( M%B0M( 	O

M( 
L#M( &
L50M
 8
MM
 
M""M( (
O
2AO?O
 OO

Oz%/generate-storigo-content-from-promptc                   #     [        SU R                   SU R                  SS  SU R                   SU R                   S[        U R                  5       SU R                   35        [        U R                  U R                  U R                  U R                  S	:H  =(       d    U R                  S
:H  [        U R                  5      U R                  U R                  5      nUR                  5       n[        US9$ ! [         aX  n[        R                  " S[        U5       35        [        S[        U5       3[         R"                  " 5       S.SS9s SnA$ SnAff = f7f)a  
Generate Storigo content from a text prompt using Groq API.

Accepts raw JSON input from Postman.

- **client_id**: Client identifier
- **prompt**: The main topic prompt for content generation
- **num_slides**: Number of slides to generate
- **is_image**: Whether to generate images (1 or 0)
- **is_question**: Whether to generate questions ("1" or "0")
- **num_mcqs**: Number of multiple choice questions
- **question_position**: Position of questions ("end" or other)
- **isGPU**: Legacy parameter (always uses Groq API now)
zAPI called with: client_id=z	, prompt=N2   z..., num_slides=z, is_image=z, is_question=z, num_mcqs=r.   1r   r   r   r   r   r   )r   r]   r'   r^   r_   rW   r`   ra   r   rb   rc   r   r	   r   r   r   r   r   )r   storigo_contentr   r   s       r;   -generate_storigo_content_from_prompt_endpointr   5  s     
+G,=,=+>iWZXZH[G\\lmtmm  mA  AL  MT  M]  M]  L^  ^l  mp  qx  qD  qD  mE  lF  FQ  RY  Rb  Rb  Qc  d  	e =NNG..0@0@!<W%5%5%<##$g&?&?
 (,,.M22 
23q6(;<  'Ax0Y=Q=Q=ST
 	

s6   E C6C; :E ;
EAEEE EE )ProfessionalVideoGeneratorz/generate-videoc           
        #    [         c
  [        SSS9e [         R                  5       n[        S UR	                  5        5       5      (       d
  [        SSS9e[         R                  U R                  U R                  U R                  SSS9nUS	   (       d  [        SUS
   S9e[        US   SUS   UR                  SS5      [        US   5      S.S9$ ! [         a    e [         a  n[        SS[        U5       3S9eSnAff = f7f)aK  
Generate a video based on the provided prompt using Hunyuan Video API.

Accepts raw JSON input.

- **prompt**: The text prompt for video generation
- **aspect_ratio**: Aspect ratio for the video (16:9, 9:16, 1:1, 4:5, 21:9)
- **model**: Model version to use (v1 or v2) - compatibility parameter

Returns the generated video file.
Nr   z}Video generator not configured. Please set Hunyuan API keys (SEGMIND_API_KEY, NOVITA_API_KEY, FAL_API_KEY, or PIAPI_API_KEY).r   c              3   *   #    U  H	  oS    v   M     g7f)	availableNrN   ).0ss     r;   	<genexpr>!generate_video.<locals>.<genexpr>{  s     C+Ba[>+Bs   zpNo Hunyuan API keys configured. Set at least one: SEGMIND_API_KEY, NOVITA_API_KEY, FAL_API_KEY, or PIAPI_API_KEY   )r'   rv   rx   num_inference_stepsseedsuccessr   
video_pathz	video/mp4video_filenameservice_usedunknownvideo_size_mb)zX-Service-UsedzX-File-Size-MB)path
media_typer   headerszError generating video: )video_generatorr   get_service_statusanyvaluesgenerate_videor'   rv   rx   r
   r   rW   r   )r   service_statusresultr   s       r;   r   r   e  s1      S
 	

#Y(;;=C>+@+@+BCCC J  !//>> ---- " 0 
 i CwHH %",-"(**^Y"G"%f_&=">	
 	
   Y6NsSTvh4WXXYs)   DB?C DD)C??DDz/healthc                     #    SSS.$ 7f)zHealth check endpointhealthyz)Storigo Content Generation API is running)statusmessagerN   rN   r>   r;   health_checkr     s       ,WXXs   )=fastapir   r   pydanticr   r   r   pollinations_image_generatorr   base64fastapi.responsesr	   r
   r   r   r   r   r   typingr   timer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   $generate_storigo_content_from_promptr   langchain_community.embeddingsr   appr$   r[   rn   rs   r   r   postr   r   r   r   r   r   r   r   r   rN   r>   r;   <module>r	     s   * 0 0 C  8   	         T ;
*T%
9 %
N
I 
 	Y 	#
9 #
NJ
4 
"Y, "Y "YH 
%&`
,B `
| `
 '`
D 
12&
AV &
[g &
 3&
P 702O 
5Y, 5Y 5Yr Y Y}  Os   E EEE