Ë
    €Jqjl  ã                   ór  — d dl Z d dlmZmZmZ d dlmZmZ d dlm	Z	  ed¬«      Z
 G d„ de«      Z G d	„ d
e«      Z G d„ de«      Zdedz  fd„Zd„ Ze
j#                  d«      d„ «       Ze
j'                  d«       ed«      fdededz  fd„«       Ze
j'                  d«       ed«      fdededz  fd„«       Zy)é    N)ÚFastAPIÚHeaderÚHTTPException)Ú	BaseModelÚField)ÚsettingszAI Restaurant Menu Service)Útitlec                   ó|   — e Zd ZU dZedz  ed<   eed<   dZedz  ed<   dZe	dz  ed<   dZ
edz  ed<   dZedz  ed<   y)ÚAnalyzeNÚmenu_item_idÚnameÚdescriptionÚpriceÚcategoryÚ	photo_url)Ú__name__Ú
__module__Ú__qualname__r   ÚintÚ__annotations__Ústrr   r   Úfloatr   r   © ó    ú2/var/www/html/ai-menu-system/python-ai/app/main.pyr   r      sc   … Ø€ˆc�$‰hÓ #›X¸D {°3°t±8Ó'@ÐSWÀ%ÈÈdÉ
ÓBWÐkoÐYaÐbeÐfjÑbjÓYoð  EIÐqzÐ{~ð  @Dñ  |Dô  rIr   r   c                   óÌ   — e Zd ZU eed<   eed<   dZedz  ed<   dZedz  ed<   eed<   dZ	edz  ed<   dZ
edz  ed<   dZedz  ed	<   g Zee   ed
<   g Zee   ed<   g Zee   ed<   y)ÚItemÚidr   Nr   r   r   Úcalories_minÚcalories_maxÚproteinÚingredientsÚ	allergensÚdietary_tags)r   r   r   r   r   r   r   r   r   r   r    r!   r"   Úlistr#   r$   r   r   r   r   r      s  … Øƒˆc‹¨�;˜s 4™xÓ,À¨h°s¸4±xÓ.DÈEÃkÐimÐS_Ð`cÐdhÑ`hÓSmð  FJÐo{Ð|ð  AEñ  }Eó  pJð  _cð  LSð  TYð  Z^ñ  T^ó  Lcð  {}ð  epð  quð  vyñ  qzó  e}ð  SUð  Hð  IMð  NQñ  IRó  Uð  npð  Wcð  dhð  ilñ  dmô  Wpr   r   c                   óF   — e Zd ZU eed<    edd¬«      Zeed<   ee	   ed<   y)ÚSearchÚrestaurant_idé   iX  )Ú
min_lengthÚ
max_lengthÚmessageÚitemsN)
r   r   r   r   r   r   r,   r   r%   r   r   r   r   r'   r'   
   s!   … ØÓ¡°¸cÔ B�G˜CÓBÈ$ÈtÉ*ÔDTr   r'   Úauthorizationc                 óH   — | dt         j                  › �k7  rt        dd«      ‚y )NzBearer i‘  zInvalid token)r   Úai_service_tokenr   )r.   s    r   Úauthr1      s(   € Ø�WœX×6Ñ6Ð7Ð8Ò8ÄÈcÐRaÓ@bÐ:bÐ8r   c           
      ó`   — ddddddddd	d
œ	}|j                  «       D ]  \  }}|| v sŒ||fc S  y)N)é  é(   é   é   )i0  é-   r7   é   )iŠ  é*   r4   é    )iJ  é   r:   é   )i¨  r6   é_   r6   )il  é   éB   é   )éŒ   é   r:   r   )ià  é   éA   r6   )iš  é   r9   é   )	ÚsalmonÚchickenÚbeefÚsaladÚpastaÚsandwichÚjuiceÚcakeÚtofu)Ú )r3   é   é7   r6   )r-   )ÚtextÚmÚkÚvs       r   ÚbaserW      s^   € Ø n¸NÐSaÐjxð  ESð  \hð  p}ð  ESñ  T€Ø�G‰G‹Iò �S€Q€qØˆ$‚Y�a˜�cŠzðàr   z/healthc                  ó
   — ddiS )NÚstatusÚokr   r   r   r   Úhealthr[      s   € Ø˜d�OÐ#r   z/v1/menu/analyzeÚpc                 óð  — t        |«       | j                  › d| j                  xs d› d| j                  xs d› �j	                  «       }t        |«      \  }\  }}}}t        dt        |dz  «      «      }dD �	cg c]	  }	|	|v sŒ|	‘Œ }
}	ddddddd	d
ddœ	}t        |j                  «       D ��ch c]  \  }}||v sŒ|’Œ c}}«      }g }|dk  r|j                  d«       |dk\  r|j                  d«       d|v sd|v r|j                  d«       | j                  xs | j                  j                  d«      dz   t        d||z
  «      ||z   ||||
xs |r|gng ||| j                  rddœ
S ddœ
S c c}	w c c}}w )Nú rP   é2   g¸…ëQ¸¾?)rG   rH   rI   rO   ÚricerK   ÚbreadÚlettuceÚtomatoÚcheeseÚmilkÚbutterÚeggÚnutsÚlemonÚ
vegetablesÚsaucere   ÚeggsÚwheatÚfishÚ	shellfishz	tree nuts)	re   rf   rd   rg   ra   rK   rG   Úshrimprh   iô  úlow calorier5   úhigh proteinÚ
vegetarianrO   ú.u8    â€” prepared as a flavorful restaurant-style selection.r   ÚmediumÚlow)
Úimproved_descriptionr   r    r!   ÚcarbohydratesÚfatr"   r#   r$   Ú
confidence)r1   r   r   r   ÚlowerrW   ÚmaxÚroundÚsortedr-   ÚappendÚrstrip)r\   r.   ÚtrU   ÚcÚprÚcarbry   ÚsÚxr"   ÚamapÚwÚar#   Útagss                   r   Úanalyzer‹      sœ  € ä€mÔ˜!Ÿ&™&˜  1§=¡=Ò#6°BÐ"7°q¸¿¹Ò9IÀrÐ8JÐK×QÑQÓS�QÔfjÐklÓfmÑTeÐTUÑVeÐWXÐY[Ð\`ÐadÔpsÐtvÔw|Ð}~ð  @Cñ  ~Có  xDó  qEÐnoð iö  t�Að  mnð  rsò  msŠað  t€ð  tØ˜f¨f¸6È'ÐZaÐkqð  |Gð  OZñ  [€ô  flð  {÷  {Eñ  {Eó  {G÷  mRñ  twð  tuð  vwð  KLð  PQò  KQò  noó  mRó  fSð  \eð  Y[ð  TXØ€s‚Fˆ4�;‰;�}Ô%Øˆ‚Fˆ4�;‰;�~Ô&Ø�AÑ˜ 1™ T§[¡[°Ô%>Ø!"§¡Ò!8°!·&±&× @Ñ @ÀÓ Eð  GAñ  !Aô  QTð  UVð  WXð  YZñ  WZó  Q[ð  klð  mnñ  knð  y{ð  LPð  WZð  itò  iJñ  @Að  z{ñ  y|ð  GIð  W`ð  ptð  NO÷  N[ò  N[ð  BJñ  	gð  gð  afñ  	gð  gùò tùó mRs   Á9	E-ÂE-Â-E2
Â:E2
z/v1/menu/searchc           
      óÖ  ‡‡— t        |«       | j                  j                  «       Št        j                  d‰«      }t        j                  d‰«      }|rt        |j                  d«      «      nd }|rt        |j                  d«      «      nd }t        j                  d‰«      }g }| j                  D �]ž  }dj                  |j                  |j                  xs d|j                  xs ddj                  |j                  «      dj                  |j                  «      g«      j                  «       Š|�|j                   |kD  rŒ’|�|j"                  r|j"                  |kD  rŒ°t%        ˆfd„|D «       «      rŒÅd‰v rt%        d	„ |j                  D «       «      sŒæd
}	t%        ˆfd„dD «       «      r+|j"                  r|	t'        d
d|j"                  z
  «      dz  z  }	t%        ˆfd„dD «       «      r|	t'        d
d|j                   z
  «      z  }	d‰v r|j(                  r|	|j(                  z  }	dD ]  }
|
‰v sŒ|
‰v sŒ|	dz  }	Œ |j+                  |	|f«       �Œ¡ |j-                  d„ d¬«       |d d D ��cg c]  \  }}|‘Œ	 }}}|D �cg c]'  }|j.                  |j                  |j                   ddœ‘Œ) }}|rdt1        |«      › d�nd|D �cg c]  }|d   ‘Œ	 c}|dœS c c}}w c c}w c c}w ) Nz1(?:under|below|less than)\s*\$?\s*(\d+(?:\.\d+)?)zJ(?:under|below|less than|max(?:imum)?)\s*(\d{2,4})\s*(?:cal|calories|kcal)r)   zE(?:without|no|exclude)\s+([a-z\- ]+?)(?:,|\.| and | under | below |$)r^   rP   c              3   óB   •K  — | ]  }|j                  «       ‰v –— Œ y ­w©N)Ústrip)Ú.0r†   Úhs     €r   ú	<genexpr>zsearch.<locals>.<genexpr>%   s   øè ø€ Ò$˜Aˆ�‰‹�aŒÑ$ùs   ƒrs   c              3   ó@   K  — | ]  }|j                  «       d v –— Œ y­w)>   Úveganrs   N)r{   )r�   r†   s     r   r’   zsearch.<locals>.<genexpr>&   s   è ø€ Ò"_È1 1§7¡7£9Ð0FÔ#FÑ"_ùs   ‚r   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrŽ   r   ©r�   r†   Úqs     €r   r’   zsearch.<locals>.<genexpr>(   s   øè ø€ Ò8�AˆˆaŒÑ8ùó   ƒ)rq   ÚlightÚdieti„  é
   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrŽ   r   r–   s     €r   r’   zsearch.<locals>.<genexpr>)   s   øè ø€ Ò/�AˆˆaŒÑ/ùr˜   )Úcheapz	low pricer_   rr   )rG   rI   rH   rJ   rL   ÚdrinkÚdessertÚspicyr<   c                 ó   — | d   S )Nr   r   )r†   s    r   ú<lambda>zsearch.<locals>.<lambda>.   s
   € ˜˜!™€ r   T)ÚkeyÚreverseé   z$This item best matches your request.)r   r   r   ÚreasonzI found z matching option(s).z I could not find an exact match.r   )ÚanswerÚrecommended_item_idsÚrecommendations)r1   r,   r{   ÚreÚsearchr   Úgroupr   Úfindallr-   Újoinr   r   r   r"   r$   r   r    Úanyr|   r!   r   Úsortr   Úlen)r\   r.   ÚpmÚcmÚmxpÚmxcÚexÚrowsÚiÚscorerˆ   Ú_ÚselÚrecr†   r‘   r—   s                  @@r   r«   r«      s{  ù€ ä€mÔ�q—y‘y—‘Ó(�Q¬B¯I©IÐ6jÐklÓ,m¨Ôqs×qzÑqzð  |Ið  JKó  rLÐnpñ  giô  QVð  WY÷  W_ñ  W_ð  `aó  Wbô  Qcð  osð  MPñ  LNô  x{ð  |~÷  |Dñ  |Dð  EFó  |Gô  xHð  TXð  twô  \^÷  \fñ  \fð  goð  pqó  \rð  Y[ð  xzð  swØ
�'‰'ó €QØ‡H�Hˆa�f‰f�Q—]‘]Ò( b¨¯©Ò)9°r¸#¿(¹(À1Ç=Á=Ó:QÐRU×RZÑRZÐ[\×[iÑ[iÓRjÐkÓl×rÑrÓt€!Ø€_˜Ÿ™ š XØ€_˜Ÿš¨A¯N©N¸3Ò,>¸xÜÓ$ Ô$Ô$ XØ�QÑœsÑ"_ÐPQ×P^ÑP^Ô"_Ô_Ð`hØ	€%ÜÓ8Ð7Ô8Ô8¸Q¿^º^ÈEÔSVÐWXÐY\Ð]^×]kÑ]kÑYkÓSlÐmoÑSoÑLoÈEÜÓ/Ð.Ô/Ô/°¼¸A¸bÀÇÁ¹jÓ8IÑ1I°Ø�qÑ˜QŸYšY u¨a¯i©iÑ'7 uØSò "€aØˆ1‚f��a’˜˜r™	™ð"à‡+�+ˆu�QˆiÖðð ‡�‰} T€Ô*¸TÀ"À1¸X×/F±c°a¸²Ð/F¨3Ñ/Fð  psö  Ltð  klÐRS×RVÑRVÐ^_×^dÑ^dÐmn×mtÑmtð  eó  Mfð  LtÀsð  LtÙ?B�HœS ›X˜JÐ&:Ñ;ÐHjð  UXö  CYð  PQð  DEð  FJó  DKò  CYð  loñ  	pð  pùó 0Gùò  Ltùò CYs   É2KÊ,K!Ë	K&)rª   Úfastapir   r   r   Úpydanticr   r   Ú
app.configr   Úappr   r   r'   r   r1   rW   Úgetr[   Úpostr‹   r«   r   r   r   ú<module>rÃ      sí   ðÛ 	ß 0Ñ 0ß $Ý ÙÐ.Ô/€ôIˆiô Iôpˆ9ô pôUˆYô Uðc�s˜4‘xó còð
 ‡�ˆÓÙ #ó Ø #Ø‡�Ð
ÓÙ-3°D«\ñ gˆgð g C¨¡Hò gó ðgð ‡�Ð
ÓÙ+1°$«<ñ pˆVð p # d¡(ò pó ñpr   