>h*ddlmZmZddlmZddlmZddlmZddl Z ddl Z ddl m Z m Z mZddlmZmZmZiadZed efd Zd ed efd Zde d ed efdZedddeZeedgddgdgeddZede de fdZede de fdZ ede de fdZ!ed e de fd!Z"ed"e de fd#Z#ed$eed%Z$ed&d'Z%e&d(kr5e j'd)e j(d*e j)ed+d,-dSdS).)FastAPI HTTPException)CORSMiddleware)asynccontextmanager)ListN)EmbeddingRequestEmbeddingResponse ModelInfo) load_modelsget_embeddingscleanup_memoryjina-v3appcK tdtdttgatdt tdWVn;#t $r.}tdt|dWVYd}~nd}~wwxYwtdS#twxYw)z5Application lifespan handler for startup and shutdownzLoading startup model: ...z#Startup model loaded successfully: NzFailed to load startup model: ) print STARTUP_MODELr models_cachelistkeys Exceptionstrr )res C/Volumes/970Evo-Plus/GitHub/spanish-embeddings-api/app_endpoints.pylifespanrs  : :::;;;"M?33  OD9J9J9L9L4M4MOOPPP   7s1vv77888  s0A(A-,B8- B%7$B B8 B%%B88C model_namemax_length_limitc n|tvr td|dt|g}t|td|dd S#t$rK}td|dt |t dd|dt | d }~wwxYwd S) z5Load a specific model on demand if not already loadedzLoading model on demand: rzModel z loaded successfully!zFailed to load model z: z loading failed:  status_codedetailN)rrr updaterrr)rr new_modelsrs rensure_model_loadedr%#s%% h =j=== > > >$j\22J    + + + <:<<< = = = = = h h h @*@@A@@ A A AC8f8f8f^abc^d^d8f8fggg g h &%sAA B2'AB--B2requestc|jstddt|jdkrtdd|j"|j|krtdd|d|dSdS) z.Validate request parameters for specific modelzNo texts providedr 2zMaximum 50 texts per requestNzMax length for z is )textsrlen max_length)r&rrs rvalidate_request_for_modelr-0s =I4GHHHH 7=B4RSSSS%'*s:a=)))Q'-((      <<<CFF;;;; QQQ4Os1vv4O4OPPPPQ$BB C#B00 C#=!CC#r<cK tddt|ddt|jdt|j|j}t|d|rt|dndt|jS#t$r#}tdt|d}~wt$r&}tdd t|d}~wwxYw) z/Generate embeddings using Catalan RoBERTa modelrArrOr(r NrrTrUrXs rembed_roberta_car]yQL#..."7L#>>># M         !!#-7>s:a=)))Q'-((      <<<CFF;;;; QQQ4Os1vv4O4OPPPPQrZr=cK tddt|ddt|jdt|j|j}t|d|rt|dndt|jS#t$r#}tdt|d}~wt$r&}tdd t|d}~wwxYw) z7Generate embeddings using Jina v2 Spanish/English modelrBrNrrOr(r NrrTrUrXs r embed_jinar`sQFD)))"7FD999# M         !!-7>s:a=)))Q'-((      <<<CFF;;;; QQQ4Os1vv4O4OPPPPQrZr>cK tddt|ddt|jdt|j|j}t|d|rt|dndt|jS#t$r#}tdt|d}~wt$r&}tdd t|d}~wwxYw) z8Generate embeddings using RoBERTalex Spanish legal modelrCr\rrOr(r NrrTrUrXs rembed_robertalexrbr^rZr?cK tddt|ddt|jdt|j|j}t|d|rt|dndt|jS#t$r#}tdt|d}~wt$r&}tdd t|d}~wwxYw) z2Generate embeddings using Legal BERT English modelrDr\rrOr(r NrrTrUrXs rembed_legal_bertrdr^rZz/modelsc Ktdddddgddtd d dd d gd dtddddddgddtdddd dgddtdddd dgddgS)z.List available models and their specificationsrzjinaai/jina-embeddings-v3irN Multilingual multilingualzILatest Jina v3 with superior multilingual performance - loaded at startup)model_idnamerRmax_sequence_length languages model_typer1rAz!projecte-aina/roberta-large-ca-v2r\Catalangeneralz3Catalan RoBERTa-large model trained on large corpusrBz!jinaai/jina-embeddings-v2-base-esiSpanishEnglish bilingualz>Bilingual Spanish-English embeddings with long context supportrCzPlanTL-GOB-ES/RoBERTalexz legal domainz+Spanish legal domain specialized embeddingsrDznlpaueb/legal-bert-base-uncasedzEnglish legal domain BERT model)r rJr.r list_modelsrrs , $%&%c    !4 # k M    4 $ ),"X    !+ # k%E    !2 # k%9   K. .r.z/healthc JKttv}|rdndt|ttt tddtvrdndddtvrdndd d tvrdndd d tvrdndd dtvrdndddS)zHealth check endpointhealthypartialz/embed/jina-v3 rz(ready)z(loads on demand)z/embed/roberta-ca rAz /embed/jina rBz/embed/robertalex rCz/embed/legal-bert rDr@)rFrHstartup_model_loadedavailable_models models_count endpoints)rrrrr+)startup_loadeds r health_checkr{s#l2N .<))9& . !2!2!4!455L))ji<6O6OUhjjsLLrs********222222****** IIIIIIIIIIEEEEEEEEEE  " hC h3 h h h h j(8 jc j]` j j j jg .N   %%% " +<==Q!1QQQ>=Q6 .?@@Q$4QQQA@Q6-(9::Q.QQQ;:Q6 .?@@Q$4QQQA@Q6 .?@@Q$4QQQA@Q44 ?3300430d& zE!!E!!$$$GK)$////// r.