Ë
    §‘ˆj  ã                   óú   — d Z ddlZddlZddlmZ ddlmZ ddlmZ  ej                  e
«      ZdZdZdZd	Zd
ZdZdZdZeeedœZ ej*                  eeeee¬«      Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zy)aG  One model call per batch of products, producing validated attributes.

The model's output is never trusted: anything outside the declared schema, or
outside a closed set, is discarded rather than stored. Two of these fields reach
columns a later phase filters on, and one bad value there makes a filter silently
miss products.
é    N)Úsettings)Úclient)ÚATTRIBUTE_EXTRACTION_PROMPTé   i�  é   é   )ÚmaleÚfemaleÚunisexÚkids)ÚalphaÚnumericÚukÚeuÚusÚvolume)ÚbudgetÚmidÚpremium)ÚcolorÚmaterialÚstyleÚuse_case)ÚgenderÚsize_systemÚ
price_tier)ÚgendersÚsize_systemsÚprice_tiersÚmax_key_featuresÚmax_accessory_targetsÚproductsÚreturnc                 ó�  — | D ��cg c]’  }|d   |j                  d«      |j                  d«      xs dd t         |j                  d«      dj                  |j                  d«      xs g «      |j                  d«      xs g D �cg c]  }|d	   |d
   dœ‘Œ c}dœ‘Œ” }}}t        j                  d|it
        ¬«      S c c}w c c}}w )NÚproduct_keyÚnameÚdescriptionÚ Úbrandz > Útaxonomy_pathÚ
attributesÚkeyÚvalue)r,   r-   )r%   Útitler'   r)   ÚcategoryÚknown_attributesr"   )Údefault)ÚgetÚDESCRIPTION_CHARSÚjoinÚjsonÚdumpsÚstr)r"   ÚpÚaÚpayloads       ú@/var/www/html/strategist-ai/app/services/enrichment/extractor.pyÚbuild_promptr<   $   sÎ   € ð ÷ð ð ˜]Ñ+Ø—U‘U˜6“]ð ŸE™E -Ó0Ò6°BÐ8JÔ9JÐKØ—U‘U˜7“^ØŸ
™
 1§5¡5¨Ó#9Ò#?¸RÓ@ð Ÿ%™% Ó-Ò3°ö!àð ˜%™¨1¨W©:Ó6ò!ó	
ð€Gñ ô  �:‰:�z 7Ð+´SÔ9Ð9ùò!ùós   †A>CÂB=ÂCÂ=CÚrawc                 óF  — i }t        | t        «      s|S t        D ]V  }| j                  |«      }t        |t        «      sŒ%|j                  «       sŒ6|j                  «       j                  «       ||<   ŒX t        j                  «       D ]i  \  }}| j                  |«      }t        |t        «      sŒ(|j                  «       j                  «       |v sŒI|j                  «       j                  «       ||<   Œk | j                  d«      }t        |t        «      r||d<   | j                  d«      }t        |t        «      rNt        d„ |D «       «      r<|D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|r|d t         |d<   | j                  d«      }	|j                  d«      rlt        |	t        «      r\t        d„ |	D «       «      rJ|	D �
cg c]1  }
|
j                  «       sŒ|
j                  «       j                  «       ‘Œ3 }}
|r|d t         |d<   |S c c}w c c}
w )NÚis_accessoryÚkey_featuresc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­w©N©Ú
isinstancer7   )Ú.0Úfs     r;   ú	<genexpr>zvalidate_one.<locals>.<genexpr>L   s   è ø€ Ò)OÀ¬*°Q¼×*<Ñ)Oùó   ‚Úaccessory_forc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wrB   rC   )rE   Úts     r;   rG   zvalidate_one.<locals>.<genexpr>U   s   è ø€ Ò4 q”
˜1œc×"Ñ4ùrH   )rD   ÚdictÚSTRING_FIELDSr2   r7   ÚstripÚlowerÚCLOSED_SETSÚitemsÚboolÚlistÚallÚMAX_KEY_FEATURESÚMAX_ACCESSORY_TARGETS)r=   ÚoutÚfieldr-   ÚallowedÚ	accessoryÚfeaturesrF   ÚcleanedÚtargetsrK   s              r;   Úvalidate_oner^   8   sÀ  € Ø
€CÜ�cœ4Ô Øˆ
äò /ˆØ—‘˜“ˆÜ�eœSÕ! e§k¡k¥mØŸ™›×,Ñ,Ó.ˆC�ŠJð/ô
 &×+Ñ+Ó-ò /‰ˆˆwØ—‘˜“ˆÜ�eœSÕ! e§k¡k£m×&9Ñ&9Ó&;¸wÒ&FØŸ™›×,Ñ,Ó.ˆC�ŠJð/ð
 —‘˜Ó'€IÜ�)œTÔ"Ø'ˆˆNÑà�w‰w�~Ó&€HÜ�(œDÔ!¤cÑ)OÀhÔ)OÔ&OØ&.Ö< °!·'±'µ)�1—7‘7•9Ð<ˆÐ<ÙØ")Ð*;Ô+;Ð"<ˆC�Ñð �g‰g�oÓ&€GØ
‡w�wˆ~Ô¤:¨g´tÔ#<ÜÑ4¨GÔ4Ô4Ø.5ÖC¨¸¿¹½�1—7‘7“9—?‘?Õ$ÐCˆÐCÙØ#*Ð+AÔ,AÐ#BˆC�Ñ à€Jùò =ùò Ds   ÅHÅ'HÇHÇ' HÚpromptc                 óþ   — t         j                  j                  j                  t        j
                  ddidt        dœd| dœg¬«      }t        j                  |j                  d   j                  j                  «      S )NÚtypeÚjson_objectÚsystem)ÚroleÚcontentÚuser)ÚmodelÚresponse_formatÚmessagesr   )r   ÚchatÚcompletionsÚcreater   Ú	LLM_MODELÚ_SYSTEMr5   ÚloadsÚchoicesÚmessagere   )r_   Úresponses     r;   Ú	_call_llmrs   ]   so   € Ü�{‰{×&Ñ&×-Ñ-Ü× Ñ Ø Ð/Ø#´Ñ8Ø!¨fÑ5ð7ð .ó €Hô �:‰:�h×&Ñ& qÑ)×1Ñ1×9Ñ9Ó:Ð:ó    c                 óâ  — | si S 	 t        t        | «      «      }t        |t        «      rt        |j                  d«      t        «      st        j                  d«       i S | D �ch c]  }|d   ’Œ	 }}i }|d   D ]<  }t        |t        «      sŒ|j                  d«      }||vrŒ*t        |«      }|sŒ8|||<   Œ> |S # t        $ r& t        j	                  dt        | «      d¬«       i cY S w xY wc c}w )z‘Returns {product_key: attributes}. An empty dict on any failure, so one
    bad batch degrades to "not extracted" rather than aborting a catalog.z-Attribute extraction failed for a batch of %dT)Úexc_infor"   z1Attribute extraction returned an unexpected shaper%   )rs   r<   Ú	ExceptionÚloggerÚerrorÚlenrD   rL   r2   rS   Úwarningr^   )r"   r=   r8   ÚaskedrW   Úitemr,   Ú	validateds           r;   Úextract_batchr   g   sú   € ñ Øˆ	ðÜœ XÓ.Ó/ˆô �cœ4Ô ¬
°3·7±7¸:Ó3FÌÔ(MÜ�‰ÐJÔKØˆ	à'/Ö0 !ˆQˆ}ÓÐ0€EÐ0Ø
€CØ�J‘ò 	!ˆÜ˜$¤Ô%ØØ�h‰h�}Ó%ˆà�eÑØÜ  Ó&ˆ	ÚØ ˆC�ŠHð	!ð €Jøô+ ò Ü�‰ÐDÜ˜“]¨Tð 	ô 	3àŠ	ðüò 1s   †B: Á$C,Â:,C)Ã(C))Ú__doc__r5   ÚloggingÚapp.core.configr   Úapp.core.llm_clientr   Úapp.core.promptsr   Ú	getLoggerÚ__name__rx   Ú
BATCH_SIZEr3   rU   rV   ÚGENDERSÚSIZE_SYSTEMSÚPRICE_TIERSrM   rP   Úformatrn   rS   r7   r<   rL   r^   rs   r   © rt   r;   ú<module>r�      sÖ   ðñó Û å $Ý &Ý 8à	ˆ×	Ñ	˜8Ó	$€à€
ØÐ ØÐ ØÐ à
.€Ø?€Ø*€à:€Ø °Ø(ñ*€ð -Ð
%×
,Ñ
,Ø ,¸KØ%Ø/ô1€ð:˜4ð : Có :ð("�dð "˜tó "ðJ;�cð ;˜dó ;ð˜Dð  Tô rt   