
    Mi$                     N   S SK Jr  S SKJr  S SKrS SKrS SKrSSK7  S SKrS SK	J
r
  \R                  R                  \R                  R                  \R                  " 5       \R                  R                  \5      5      5      r\" 5       S 5       r\" 5       S 5       r\" 5       S	 5       rS
 r\" 5       S 5       r\" 5       S 5       r\" 5       SS\4S jj5       r\" 5       S 5       r\" 5       S 5       r\" 5       S 5       r\" 5       S 5       rSS jrS r\ S:X  a  \" 5         gg)    )	lru_cache)PathN   )*)MODEL_REPO_BRANCHc                     SS K nU R                  S:X  a%  UR                  R                  U 5      R                  $ U R                  S:X  a  gg)Nr   cudampsl       0 )torchtyper	   get_device_propertiestotal_memory)devicer   s     o/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/crawl4ai/model_loader.pyget_available_memoryr      s>    {{fzz//7DDD		    c                     [        U 5      nU R                  S:X  a  gU R                  S;   a  US:  a  gUS:  a  gUS:  a  g	g
g)Ncpu   )r	   r
   l           l           l        @       )r   r   )r   available_memorys     r   calculate_batch_sizer      sO    +F3{{e		'|+-,r   c                     SS K n U R                  R                  5       (       a  U R                  S5      nU$ U R                  R
                  R                  5       (       a  U R                  S5      nU$ U R                  S5      nU$ )Nr   r	   r
   r   )r   r	   is_availabler   backendsr
   )r   r   s     r   
get_devicer   ,   sr    zz  f%
 M	 
			(	(	*	*e$ M e$Mr   c                 >    [        5       nU R                  U5        X4$ )N)r   to)modelr   s     r   set_model_devicer#   9   s    \F	HHV=r   c                      [         R                  R                  [         R                  " S[        R
                  " 5       5      S5      n [         R                  " U SS9  [         R                  " U  S3SS9  [         R                  " U  S3SS9  U $ )NCRAWL4_AI_BASE_DIRECTORYz	.crawl4aiT)exist_okz/cachez/models)ospathjoingetenvr   homemakedirs)home_folders    r   get_home_folderr.   ?   sk    '',,
		,diik:KK KKd+KK;-v&6KK;-w'$7r   c                      SSK Jn Jn  U R                  SS S9nUR                  SS S9nUR	                  5         [        U5      u  p4X#4$ )Nr   )BertTokenizer	BertModelzbert-base-uncasedresume_download)transformersr0   r1   from_pretrainedevalr#   )r0   r1   	tokenizerr"   r   s        r   load_bert_base_uncasedr8   J   sP    5--.ASW-XI%%&94%PE	JJL$U+MEr   returnc                     SSK JnJn  UR                  U SS9nUR                  U SS9nUR	                  5         [        U5      u  pEX44$ )zLoad the Hugging Face model for embedding.

Args:
    model_name (str, optional): The model name to load. Defaults to "BAAI/bge-small-en-v1.5".

Returns:
    tuple: The tokenizer and model.
r   )AutoTokenizer	AutoModelNr2   )r4   r;   r<   r5   r6   r#   )
model_namer;   r<   r7   r"   r   s         r   load_HF_embedding_modelr>   U   sO     6--j$-OI%%j$%GE	JJL$U+MEr   c                      SSK Jn Jn  SSK Jn  U R	                  S5      nUR	                  S5      nUR                  5         [        U5      u  pEU" SXCS9nU$ )Nr   )r;   "AutoModelForSequenceClassification)pipelinez1dstefa/roberta-base_topic_classification_nyt_newsztext-classification)r"   r7   )r4   r;   r@   rA   r5   r6   r#   )r;   r@   rA   r7   r"   r   pipes          r   load_text_classifierrC   h   sY    N%--;I />>;E 
JJL$U+ME)LDKr   c                     ^^^^^^	 SSK Jn Jn  SSKJm  SS Km	SnUR                  US S9mU R                  US S9mTR                  5         [        T5      u  mmTR                  R                  mSUUUUUU	4S jjnUT4$ )Nr   )r@   r;   )expitzcardiffnlp/tweet-topic-21-multir2   c                   > T" U SSSUS9nUR                  5        VVs0 s H  u  pEXER                  T5      _M     nnnTR                  5          T" S0 UD6nS S S 5        WR                  R	                  5       R                  5       R                  5       nT" U5      nXq:  S-  n/ n	U H>  n
[        U
5       VVs/ s H  u  pUS:X  d  M  TU   PM     nnnU	R                  U5        M@     U	$ s  snnf ! , (       d  f       N= fs  snnf )NptT)return_tensorspadding
truncation
max_lengthr    )	itemsr!   no_gradlogitsdetachr   numpy	enumerateappend)texts	thresholdrK   tokenskeyvaloutputscorespredictionsbatch_labels
predictionivaluelabelsclass_mappingr   rE   r"   r7   r   s                 r   _classifier4load_text_multilabel_classifier.<locals>._classifier   s   !
 17
0>HCC 	 
 ]]__V_F  %%'++-335v*a/%J1::1F1FXQ%ST* a 1F   '	 & %
 _s   C-	C3:D
	D3
D)g      ?r   )r4   r@   r;   scipy.specialrE   r   r5   r6   r#   configid2label)
r@   r;   MODELrb   ra   r   rE   r"   r7   r   s
       @@@@@@r   load_text_multilabel_classifierrh   y   s    N# .E--eT-JI.>>t ? E 
JJL$U+ME6LL))M 8 r   c                      SS K n  U R                  R                  S5        U R                  R                  S5      $ ! [         a    U R	                  S5         N8f = f)Nr   ztokenizers/punktpunkt)nltkdatafindLookupErrordownload)rk   s    r   load_nltk_punktrp      sN    		)* 99>>,--  gs   < AAc            
      `   SS K n Sn[        5       n[        U5      U-  nUR                  5       (       a  [	        UR                  5       5      (       Gd  Sn[        n[        U5      S-  n[        S5        UR                  5       (       aB   [        R                  " U5        UR                  5       (       a  [        R                  " U5         [        R                  " SS	S
XT[        U5      /[        R                  [        R                  SS9  [        U5      S-  nUR                  SSS9  US-  S-  n[        R                   " X5        [        R                  " U5        [        S5         U R'                  [        U5      5      $ ! [         a*    [        S5        [        SU 35        [        SU 35         g f = f! [        R"                   a  n	[        SU	 35         S n	A	g S n	A	f[$         a  n	[        SU	 35         S n	A	g S n	A	ff = f! [$         a  n	[        SU	 35         S n	A	g S n	A	ff = f)Nr   models/reutersz)https://github.com/unclecode/crawl4ai.gitcrawl4aiu7   [LOG] ⏬ Downloading Spacy model for the first time...zh[WARNING] Unable to remove existing folders. Please manually delete the following folders and try again:z- gitclonez-bT)stdoutstderrcheckmodels)parentsr&   reutersu-   [LOG] ✅ Spacy Model downloaded successfullyz0An error occurred while cloning the repository: zAn error occurred: zError loading spacy model: )spacyr.   r   existsanyiterdirr   printshutilrmtreePermissionError
subprocessrunstrDEVNULLmkdircopytreeCalledProcessError	Exceptionload)
r|   namer-   model_folderrepo_urlbranchrepo_foldermodels_foldersource_folderes
             r   load_spacy_modelr      s   D!#K$t+L !!c,*>*>*@&A&A>";'*4GH 
k*&&((MM,/	NNv[9IJ!))!))	 !-8Mt< ((2Y>MOOM8 MM+&ABzz#l+,,K # ~ ;-()<.)*: ,, 	DQCHI 	's+,	  +A3/0sP   
AF BF< +H 1F98F9<HG##H0HH
H-H((H-c                    U (       a  [        S5        [        5       n[        R                  R	                  US5      [        R                  R	                  US5      /nU H9  n[        U5      R                  5       (       d  M#  [        R                  " U5        M;     [        S5        [        S5        [        5       u  pE[        SU 35        [        S5        [        5         [        S5        g	)
z*Download all models required for Crawl4AI.z![LOG] Removing existing models...rr   ry   z[LOG] Existing models removed.z$[LOG] Downloading text classifier...z [LOG] Text classifier loaded on z,[LOG] Downloading custom NLTK Punkt model...u-   [LOG] ✅ All models downloaded successfully.N)r   r.   r'   r(   r)   r   r}   r   r   rh   rp   )remove_existingr-   model_foldersfolder_r   s         r   download_all_modelsr      s    12%'GGLL&67GGLLh/
 $FF|""$$f% $ 	./ 

01/1IA	,VH
56	
89	
9:r   c                      [        S5        [        S5        [        R                  " SS9n U R                  SSSS9  U R	                  5       n[        UR                  S	9  g )
Nz/[LOG] Welcome to the Crawl4AI Model Downloader!zE[LOG] This script will download all the models required for Crawl4AI.zCrawl4AI Model Downloader)descriptionz--remove-existing
store_truez)Remove existing models before downloading)actionhelp)r   )r   argparseArgumentParseradd_argument
parse_argsr   r   )parserargss     r   mainr     s_    	
;<	
QR$$1LMF
8  
 D(<(<=r   __main__)zBAAI/bge-small-en-v1.5)F)!	functoolsr   pathlibr   r   r'   r   model_loaderr   crawl4ai.configr   r(   realpathr)   getcwddirname__file____location__r   r   r   r#   r.   r8   tupler>   rC   rh   rp   r   r   r   __name__rL   r   r   <module>r      sX         -wwRYY["''//(:S TU    & 	 	     E  $    3 3l . . = =@;:> zF r   