
    io                     	   d dl mZ d dlZd dlmZ d dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZmZ d dlZd dlmZmZ d dlmZ d dlmZmZmZ d d	lmZmZm Z m!Z! d d
l"m#Z#m$Z$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9m:Z: d dl;m<Z<m=Z=m>Z>  e       Z?de9de9fdZ@de9dedefdZAde9deBde9fdZCdeDeBeBf   fdZEdeBfdZFdeddfdZGdedej                  deDeBeBf   deBdeDeBeIf   f
dZJde9deBfd ZKd!eDeBeIf   deBfd"ZLd!eDeBeIf   deBfd#ZMdeDeBeBf   fd$ZNde#fd%ZOd&d&dd'de9de%d(eBdz  d)eBd*eBd+ePdz  de&fd,ZQde9de&fd-ZRde9deSeBeDeBeIf   f   fd.ZTdd/de9dedeBd0eBd1eDeBeIf   dz  defd2ZUde9d3eDeBeIf   deBfd4ZVde9ddfd5ZWdfde9dz  deBfd6ZXd7dd8de9deBd9eBdz  de!fd:ZYe?j                  d;       ee      fd<e9deDeBeIf   fd=       Z[e?j                  d>       ee      fd<e9deDeBeIf   fd?       Z\e?j                  d@       ee      fd<e9deDeBeIf   fdA       Z]e?j                  dB       ee      fde9dz  deDeBeIf   fdC       Z^e?j                  dDe!E       edF       ed7dGH       ee      fd9eBdz  deBde9de!fdI       Z_e?j                  dDej                  J       edF       ed7dGH       ee      fd9eBdz  deBde9defdK       Zbe?j                  dL       edMdNdOP       ee      fd9eBdQecde9deDeBeIf   fdR       Zde?j                  dSe&E       ee      fde9de&fdT       Zee?j                  dSe&E       ee      fde%de9de&fdU       Zge?j                  dVe&E       e	dW       ee      fdXePe   de9de&fdY       Zie?j                  dZe&E       ee      fd[eBde$de9de&fd\       Zke?j                  dZe&E       ee      fd[eBde9de&fd]       Zle?j                  d^       ee      fd[eBde9fd_       Zme?j                  d`      defda       Zne?j                  dbeE       ee      fdede9defdc       Zoe?j                  ddeE       ee      fdede9defde       Zpy)g    )AsyncIteratorN)Path)		APIRouterDependsFileHTTPExceptionQueryRequestResponse
UploadFilestatus)FileResponseStreamingResponse)get_optional_sessionrequire_session)get_settings)MOCK_TENANTMOCK_VENUESTENANT_MODULES)AssistantChatRequestAssistantChatResponseAssistantMessageAssistantThreadResponse)MenuAssetReadMenuAssetRenamePayloadMenuPromptSettingsPayloadMenuPromptSettingsResponse)build_llm_headersbuild_llm_timeoutdescribe_llm_http_errorrequest_llm_chat_completionresolve_llm_model)build_menu_assets_contextingest_menu_assetnormalize_asset_name)$run_operational_assistant_with_trace)DEFAULT_MENU_BASE_PROMPTGENERIC_OPERATIONAL_CONTEXTS build_menu_assistant_descriptionbuild_menu_prompt_preview)SessionIdentityget_tenant_store)compose_assistant_promptget_assistant_profilelist_assistant_profilessessionreturnc                 p    t               j                  | d      st        t        j                  d      | S )Nmenuz&Questo account non puo accedere a Menustatus_codedetail)r,   session_has_permissionr   r   HTTP_403_FORBIDDENr0   s    &apps/backend-hub/app/api/routes/llm.py_require_menu_accessr;   %   s.    44WfE(A(AJrssN    payloadc                    d}t               }|j                  | d|j                        }|j                  |j                  d|j
                  j                         dd|dg      \  }}|j                  |j                  | ddd|j
                  j                         |dd	d
       t        t               j                  |dd|j                  |j                        S )NzNon possiedi l'autorizzazione per usare questo strumento. Chiedi all'amministratore del locale di abilitare l'Assistente dal pannello Account.homesurface	thread_iduserrolecontent	assistantzhome-access-deniedpolicyassistant_permission_missing)rA   reasonrB   r0   rA   routemodeluser_messageassistant_replytraceassistant_namereplyrM   assistant_surfacerB   
updated_at)r,   ensure_assistant_threadrB   append_assistant_messagesidmessagestripcreate_assistant_runr   r   assistant_display_namerU   )r0   r=   rS   storethread_s         r:   !_assistant_access_denied_responser`   +   s    
 ]EE**7FgN_N_*`F//		(=(=(?@ U3	
IFA 
))"__**, ,JK  	 !#~<< ))$$ r<   rA   c                 &    |dk(  rt        |       S | S Nr3   )r;   )r0   rA   s     r:   _require_surface_accessrc   N   s    &#G,,Nr<   c                      t               S N)r    r<   r:   _headersrg   T   s    r<   c                  H    t               j                  j                  d      S )N/)r   llm_base_urlrstriprf   r<   r:   	_base_urlrl   X   s    >&&--c22r<   requestc                 J   t               j                  xs dj                         }|st        t        j
                  d      | j                  j                  d      xs dj                         }|rt        j                  ||      st        t        j                  d      y )N z!Proxy LLM interno non configurator4   zX-Internal-API-TokenzToken proxy LLM non valido)r   llm_proxy_internal_tokenrZ   r   r   HTTP_503_SERVICE_UNAVAILABLEheadersgetsecretscompare_digestHTTP_401_UNAUTHORIZED)rm   expected_tokenprovided_tokens      r:   "_require_internal_llm_proxy_accessry   \   s    "n==CJJLN(K(KTwxxoo))*@AGRNNPN!7!7!W(D(DMijj "Xr<   clientrr   base_urlc                2  K   	 | j                          d {   }t        |t              st        dd      t	        |      }|j                  d      }|st        |||       d {   |d<   |S 7 Y# t        $ r}t        dd|       |d }~ww xY w7 -w)N  zPayload JSON non valido: r4   z*Il payload LLM deve essere un oggetto JSONrM   )json	Exceptionr   
isinstancedictrs   r"   )rm   rz   rr   r{   r=   excnormalized_payloadrM   s           r:   _resolve_proxy_payloadr   f   s     `& gt$4`aag""7+E,=fhPW,X&X7# ' `6OPSu4UV\__` 'YsD   BA3 A1A3 AB'B(	B1A3 3	B<BBBc                     t               j                  | j                        }|d   }|r|d   j                  S |d   j                  S )Nvenuesr   tenant)r,   get_tenant_context	tenant_idname)r0   contextr   s      r:   _resolve_venue_namer   }   sG     33G4E4EFGXFay~~8!!!r<   stored_payloadc                 h    | j                  d      }t        |t              r|j                         S dS )Nuploaded_assets_contextro   rs   r   strrZ   r   	raw_values     r:   #_read_menu_generated_assets_contextr      s.    ""#<=I *9c :9??BBr<   c                 h    | j                  d      }t        |t              r|j                         S dS )N uploaded_assets_context_overridero   r   r   s     r:   "_read_menu_assets_context_overrider      s.    ""#EFI *9c :9??BBr<   c                      t               } | j                  j                  d      }| d| d| j                  | j                  | j
                  | ddS )Nri   z
/dashboardz
/documentsz/modules/homemade)dashboard_urldocuments_url
ordini_urlprenotazioni_urlmenu_urlhomemade_url)r   portal_public_urlrk   ordini_frontend_public_url prenotazioni_frontend_public_urlmenu_legacy_public_url)settingsportal_bases     r:   _build_menu_navigation_urlsr      sc    ~H,,33C8K'=
3'=
399$EE33&-'89 r<   c                 
   t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                        S )N)rX   original_namedisplay_name	mime_typekindfile_size_bytesr   error_detailanalysis_text
created_atrU   )r   rX   r   r   r   r   r   r   r   r   r   rU   )assets    r:   _serialize_menu_assetr      sj    88))''//ZZ--||''))#### r<   ro   )!uploaded_assets_context_generatedr   assetsrU   r   r   r   c                4   t        |       }|xs g D cg c]  }t        |       }}t        |j                  j	                         dd|j
                  j	                               }	|	j
                  xs |j	                         }
t               }t        d| j                  | j                  |t        t        ||	j                  |
      |
|j	                         t        |      |t        |      t        d |D              |d||	j                         S c c}w )Nro   sales_focus	menu_textcocktail_list_textr   
venue_namer   r   c              3   @   K   | ]  }|j                   d k(  sd  yw)ready   N)r   ).0r   s     r:   	<genexpr>z+_serialize_menu_settings.<locals>.<genexpr>   s     ZE%,,RYBYaZs   )tenant_nametenant_slugr   base_promptprompt_previewr   r   assistant_descriptionr   asset_total_countasset_ready_countrU   rf   )r   r   r   r   rZ   r   r   r   r   r   r'   r*   r)   lensum
model_dump)r0   r=   rU   r   r   r   r   r   serialized_assetsr   !effective_uploaded_assets_contextnavigation_urlss               r:   _serialize_menu_settingsr      s&    %W-JCI<RP%.u5PP2''--/)0)Q)Q)W)W)Y	 	;;h?`?f?f?h & 23O% '''',0!*66$E

 !B*K*Q*Q*S>zJ /0Z->ZZ!" #$ 
'
'
)%  Qs   Dc           
          t               }|j                  | j                  d      \  }}t        j                  |      }t        | ||t        |      t        |      |j                  | j                              S )Nr3   )rU   r   r   r   )	r,   get_llm_settingsr   r   model_validater   r   r   list_menu_assets)r0   r]   r   rU   r=   s        r:   _load_menu_settingsr      sq    E!&!7!78I8I6!RNJ'66~FG#*Mn*])KN)[%%g&7&78 r<   c                    t               }|j                  | j                  d      \  }}t        j                  |      }t        |      }t        |      }|xs |}|j                  | j                        }t        t        |       |j                  |      }	dt        |       t        |j                  j                               t        |      t        |j                               d}
|	|
fS )Nr3   r   )rA   r   sales_focus_configuredassets_countuploaded_assets_context_present)r,   r   r   r   r   r   r   r   r*   r   r   boolrZ   r   )r0   r]   r   r_   r=   r   r   r   r   prompttrace_contexts              r:   _build_menu_chat_promptr      s    E..w/@/@&INA'66~FG(KN([%'I.'Y$(H(mLm%##G$5$56F&&w/'' AF )'2"&w':':'@'@'B"CF+/0Q0W0W0Y+Z(M =  r<   )r   system_promptr   c           
        K   t               }|j                  | ||j                        }|j                  |j                  d      }|sr|j
                  rf|j
                  dd  D cg c]  }|j                          }	}|j                  |j                  |	      \  }}
|j                  |j                  d      }d|dg}|j                  d |dd  D               |j                  j                         }|j                  d|d       t        |       d {   \  }}|j                  |j                  d|dd	|dg      \  }}
|t        |      d
|xs i }|j                  |j                  | || d||||       t        t!               j"                  ||||j                  |j$                        S c c}w 7 w)Nr@   (   limitsystemrD   c              3   N   K   | ]  }|j                   |j                  d   yw)rD   NrD   )r   rY   s     r:   r   z(_run_surface_llm_chat.<locals>.<genexpr>  s     l7W\\gooFls   #%rC   rG   )rA   message_count_beforez	-llm-chatrK   rQ   )r,   rV   rB   list_assistant_messagesrX   conversationr   rW   extendrY   rZ   appendr!   r   r[   r   r   r\   rU   )r0   r=   rA   r   r   r]   r^   stored_messagesrY   seed_messagesr_   messagesrN   rS   rM   rP   s                   r:   _run_surface_llm_chatr      s     E**7GwO`O`*aF33FIIR3HOw33=D=Q=QRURV=WX'++-XX33FII}M	77		7L!m<=HOOlVefifjVkll??((*LOOV=>4X>>LE5//		5 U3	
IFA  #O 4 BE
 
))	#!  	 !#~<<!))$$ A Y ?s    A%G 'F9>BG F>B%G updatesc                     t               }|j                  | j                  d      \  }}t        |      }|j	                  |       |j                  | j                  d|      S rb   )r,   r   r   r   updateupsert_llm_settings)r0   r   r]   current_payloadr_   merged_payloads         r:   _merge_menu_settingsr   2  sZ    E//0A0A6JOQ/*N'"$$W%6%6OOr<   c                 R  K   t               }t        t        |       |j                  | j                               d {   }|j                  | j                  d      \  }}t        |      }|r||d<   n|j                  dd        |j                  | j                  d|       y 7 fw)Nr3   r   )	r,   r#   r   r   r   r   r   popr   )r0   r]   r   r   r_   r   s         r:   _refresh_menu_assets_contextr   :  s     E-.A'.JELbLbcjctctLuvvG//0A0A6JOQ/*N4;014d;	g//H ws   <B'B%A'B'c                 0   t               }t        d      }|j                  j                         }|xs |j                  }|dk(  r|j                  }|j
                  j                         }d}|r|t        vrd|ff}t        d| t        |       nd ||      S )Nr?   z|Sei l'assistente operativo interno del locale. Rispondi sempre in italiano, con tono sobrio, pratico e orientato all'azione.rf   zContesto operativo aggiuntivo)r   extra_sectionsoverride_base_prompt)	r   r.   assistant_system_promptrZ   r   assistant_operational_contextr(   r-   r   )r0   r   home_profileconfigured_system_promptr   operational_contextr   s          r:   build_assistant_promptr   F  s    ~H(0L'??EEG,H0H0HM  $b  b$00"@@FFH24N2:VV:<OPR#3:3F&w/D%*	 r<   r?   r@   rB   c                P   t               }|r|j                  |      n|j                  | |      }|P|j                  dk7  sA|j                  | j                  k7  s(|j
                  | j
                  k7  s|j                  |k7  r"t        t               j                  |d d g       S |j                  |j                  d      D cg c]#  }t        |j                  |j                        % }}t        t               j                  ||j                  |j                  |      S c c}w )Nactive)rR   rT   rB   rU   r   r   r   rD   )r,   get_assistant_threadget_active_assistant_threadr   r   user_idrA   r   r   r\   r   rX   r   rE   rF   rU   )r0   rA   rB   r]   r^   rY   r   s          r:   _serialize_assistant_threadr  Z  s    E6?U''	2UEfEfgnpwExF==H$w000>>W__,>>W$&'>@@%
 	
 44VYYb4I 	gllGOODH  ##~<<!))$$ 	s   (D#z/configr_   c                     t               }t               }|| d| dt        |j                        |j                  |j
                  dS )N/models/chat/completions)r{   
models_urlchat_completions_urlapi_key_configuredrR   assistant_model)r   rl   r   llm_api_keyr\   r
  )r_   r   r{   s      r:   
llm_configr  ~  sR    ~H{H!
'*#+*,= >"8#7#78"99#33 r<   z	/profilesc           
          t               }d|D cg c]:  }|j                  |j                  |j                  t	        |j
                        d< c}iS c c}w )Nitems)keylabelsummaryallowed_tools)r/   r  r  r  listr  )r_   profilesprofiles      r:   assistant_profilesr    s[    &(H $
  {{ "??!%g&;&;!<	

 

s   ?Az/upstream-healthc                   K   t               }t               }t               }	 t        j                  t                     4 d {   }|j                  | d|       d {   }|j                          |j                         }d d d       d {    j                  dg       }|D 	cg c]6  }	t        |	t              s|	j                  d      s&|	j                  d      8 }
}	d|t        |
      |
d d	 d
S 7 7 7 n# 1 d {  7  sw Y   ~xY w# t        j                  $ r}d|t        |      dcY d }~S d }~ww xY wc c}	w w)Ntimeoutr  )rr   F)	reachabler{   r6   datarX   T
   )r  r{   model_countmodels)r   rl   rg   httpxAsyncClientr   rs   raise_for_statusr~   	HTTPErrorr    r   r   r   )r_   r   r{   rr   rz   responser=   r   r  item	model_idss              r:   llm_upstream_healthr&    s4    ~H{HjG

$$->-@A 	& 	&V#ZZ8*G(<gZNNH%%'mmoG	& 	& [[$F,2`Djt6LQUQYQYZ^Q_$`I` 9~CR.	 	&N	& 	& 	& 	& ?? 
 -c2
 	

 as   E"D C=D D"C?#$DD DD E-EEE(E=D ?DD D	D
DD E+D?9E:E?EEz/assistant-profilec           	         t               }t        d      }| t               j                  | j                        }|j
                  |j                  |j                  |d   j                  |d   D cg c]  }|j                   c}|d   D cg c]  }|j                  s|j                   c}dS |j
                  |j                  |j                  t        j                  t        D cg c]  }|j                   c}t        D cg c]  }|j                  s|j                   c}dS c c}w c c}w c c}w c c}w )Nr?   r   r   tenant_modules)rR   rT   assistant_summaryr   venue_namesenabled_modules)r   r.   r,   r   r   r\   r  r  slugr   enabled
module_keyr   r   r   )r0   r   r   r   venueentrys         r:   assistant_profiler1    s   ~H(0L"$778I8IJ&==!-!1!1!-!5!5"8,114;H4EF5EJJF>EFV>WiU[`[h[h 0 0i
 	
 #99)--)11"''0;<u

<:HZEMME,,Z 	 Gi =Zs$   1D,D1D1*D6D;D;z/chat/thread)response_model)defaultz^(home|documents|menu)$)r3  patternc                 6    t        ||      }t        |||       S )Nr@   )rc   r  rB   rA   r0   s      r:   assistant_chat_threadr7    s     &gw7G&w9UUr<   r5   c                     t        ||      }t               j                  |||        t        t        j
                        S )Nr@   r8  )rc   r,   archive_assistant_threadr   r   HTTP_204_NO_CONTENTr6  s      r:   clear_assistant_chat_threadr<    s:     &gw7G//T]/^ : :;;r<   z/chat/thread/runsr  r   2   )r3  geler   c                    t               j                  |       }|2|j                  |j                  k7  s|j                  |j                  k7  rt	        dd      t               j                  | |      }| |D cg c]p  }|j                  |j                  |j                  |j                  |j                  |j                  t        j                  |j                        |j                  dr c}dS c c}w )N  zThread assistente non trovato.r4   r   )rX   rA   rL   rM   rN   rO   rP   r   )rB   r  )r,   r   r   r  r   list_assistant_runsrX   rA   rL   rM   rN   rO   r~   loads
trace_jsonr   )rB   r   r0   r^   runsruns         r:   assistant_chat_thread_runsrG    s     44Y?F~))W->->>&..T[TcTcBc4TUU11)51ID 
  ff;; # 0 0#&#6#6CNN3!nn	
 
s   ;A5C5z/menu-settingsc                 *    t        t        |             S re   )r   r;   r9   s    r:   menu_settingsrI    s    3G<==r<   c                     t        |      }t        | j                  j                         dd| j                  j                               }t        ||j                                t        |      S )Nro   r   )r;   r   r   rZ   r   r   r   r   )r=   r0   r   s      r:   update_menu_settingsrK  	  sd    
 #7+G2''--/)0)Q)Q)W)W)Y	 "4"?"?"ABw''r<   z/menu-settings/assets.filesc                    K   t        |      }| st        dd      t        |      }| D ]  }t        |||       d {     t	        |       d {    t        |      S 7 $7 w)Nr}   z%Seleziona almeno un file da caricare.r4   )r   )r;   r   r   r$   r   r   )rL  r0   r   uploads       r:   upload_menu_assetsrO    su     
 #7+G4[\\$W-J HJGGGH 'w
///w'' 	H/s!   <A'A#A'A%A'%A'z /menu-settings/assets/{asset_id}asset_idc                 
   t        |      }t        |j                        }t               j	                  |j
                  |       }|t        dd      t               j                  |j
                  | |       t        |      S )NrA  File menu non trovato.r4   )r   )	r;   r%   r   r,   get_menu_assetr   r   update_menu_assetr   )rP  r=   r0   normalized_namer   s        r:   rename_menu_assetrV  *  sv     #7+G*7+?+?@O--g.?.?JE}4LMM(():):HSb(cw''r<   c                 0  K   t        |      }t               j                  |j                  |       }|t	        dd      t        |j                        }|j                         r|j                          t        |       d {    t        |      S 7 w)NrA  rR  r4   )r;   r,   delete_menu_assetr   r   r   storage_pathexistsunlinkr   r   rP  r0   r   rY  s       r:   rX  rX  :  s     
 #7+G001B1BHME}4LMM**+L
&w
///w'' 0s   BBBBz)/menu-settings/assets/{asset_id}/downloadc                 &   t        |      }t               j                  |j                  |       }|t	        dd      t        |j                        }|j                         st	        dd      t        ||j                  |j                        S )NrA  rR  r4   z3Il file caricato non e' piu disponibile sul server.)
media_typefilename)r;   r,   rS  r   r   r   rY  rZ  r   r   r   r\  s       r:   download_menu_assetr`  L  s    
 #7+G--g.?.?JE}4LMM**+L 4ijj5K]K]^^r<   z/openai/chat/completionsc                   K   t        |        t               }t               }| j                  j	                  dd      j                         j                  d      dk7  rd|d<   t        j                  t                     4 d {   t        | ||       d {   }d d d       d {    t        j	                  d            }| d	}|r4t        j                  d       j                  d
|||      }	 j                  |d       d {   j$                  rj'                          d {   }j                          d {    j                          d {    |j)                  dd      j+                         xs j,                  }	t!        ddj.                   d|	       dt0        t2           ffd}
j                  j	                  dd      }t5         |
       j.                  |      S 	 t        j                  t                     4 d {   j7                  |||       d {   }|j9                          d d d       d {    j;                         S 7 7 7 # 1 d {  7  sw Y   xY w7 # t        j                  $ r8}j                          d {  7   t!        ddt#        |             |d }~ww xY w7 7 7 7 7 7 # 1 d {  7  sw Y   xY w# t        j                  $ r}t!        ddt#        |             |d }~ww xY ww)Nacceptro   ztext/event-streamAcceptr  )rz   rr   r{   streamr  POST)rr   r~   T)re  i  zErrore comunicazione LLM: r4   zutf-8ignore)errors r1   c                 .  K   	 j                         2 3 d {   } | s|  7 6 	 j                          d {  7   j                          d {  7   y # j                          d {  7   j                          d {  7   w xY wwre   )aiter_bytesaclose)chunkrz   upstream_responses    r:   stream_upstreamz4llm_openai_chat_completions.<locals>.stream_upstream  s|     &#4#@#@#B $ $%#$#B (..000mmo%% (..000mmo%%sh   BA )')A A )A BABABB2A53BBBBzcontent-type)r5   r^  )ry   rl   rg   rr   rs   lowerfindr  r   r   r   r   build_requestsendr"  rl  r   r    is_errorareaddecoderZ   reason_phraser5   r   bytesr   postr!  r~   )rm   r{   rr   r=   wants_streamendpointupstream_requestr   
error_textr6   ro  r^  r#  rz   rn  s                @@r:   llm_openai_chat_completionsr~  ]  s    &w/{HjG8R(..0556IJbP/  ):)<= k k.wvwaijjk k H-.L,-H""40!//	 0 
	~&,kk2B4k&P P
 %%06688J#**,,,--/!!&&wx&@FFHkL]LkLkF34E4Q4Q3RRSTZS[\ 
	&}U'; 	& '..22>CVW
 !2@Q@]@]jtuuz$$->-@A 	( 	(V#[[7[QQH%%'	( 	( ==?ckjk k k k !Q 	~--/!!C:TUlmpUqTr8stz}}	~
 9,!(	(Q	( 	( 	( 	( ?? z6PQhilQmPn4opvyyzsL  BMI=MJJ J#M.J/AMJ JJ M;K-<MK0M+K3,BM
"L ,K6-L 0K<K8	K<L (K:)L -M JMJJJMJ K*2K%KK%%K**M0M3M6L 8K<:L <LLL
L M$L>>MMz/chatc           
        K   t               j                  |d      st        ||       S t               }|j                  |d| j                        }|j                  |j                  d      }|j                  |j                        }|sr| j                  rf| j                  dd  D cg c]  }|j                          }}|j                  |j                  |      \  }}|j                  |j                  d      }t        || j                  j                         |dd  D cg c]  }|j                  |j                  d c}|	       d {   }	|j                  |j                  d
| j                  j                         dd|	j                   dg      \  }}|	j"                  &|j%                  |j                  |	j"                        }|j'                  |j                  |d|	j(                  |	j*                  | j                  j                         |	j                   |	j,                         t/        t1               j2                  |	j                   |	j*                  d|j                  |j4                        S c c}w c c}w 7 8w)NrG   )r0   r=   r?   r@   r   r   r   rD   )r0   rY   r   thread_staterC   rK   rQ   )r,   r7   r`   rV   rB   r   rX   get_assistant_thread_stater   r   rW   r&   rY   rZ   rE   rF   rS   r  update_assistant_thread_stater[   rL   rM   rP   r   r   r\   rU   )
r=   r0   r]   r^   r   stored_thread_staterY   r   r_   outcomes
             r:   assistant_chatr    s2    
 44WkJ0'RRE**7FgN_N_*`F33FIIR3HO::699Ew33=D=Q=QRURV=WX'++-XX33FII}M	77		7L8%%'XghkhlXmnWw||Hn(	 G //		(=(=(?@ W]];	
IFA '44VYY@T@TU	))mmmm__**,mm  	 !#~<<mmmm ))$$ ; Y os,   B'J)I> A$J$ JJJD8Jz
/menu-chatc                 p   K   t        |      }t        |      \  }}t        || d||       d {   S 7 w)Nr3   )r0   r=   rA   r   r   )r;   r   r   )r=   r0   r   r   s       r:   	menu_chatr    sG     
 #7+G#:7#C M=&##   s   -646re   )qcollections.abcr   r~   pathlibr   rt   fastapir   r   r   r   r	   r
   r   r   r   fastapi.responsesr   r   r  app.api.depsr   r   app.core.configr   app.core.mock_stater   r   r   app.models.assistantr   r   r   r   app.models.llm_settingsr   r   r   r   app.services.llm_clientr   r   r    r!   r"   app.services.menu_asset_servicer#   r$   r%   *app.services.operational_assistant_servicer&   app.services.venue_promptr'   r(   r)   r*   app.services.tenant_storer+   r,   shared.assistant_profilesr-   r.   r/   routerr;   r`   r   rc   r   rg   rl   ry   r   objectr   r   r   r   r   r   r  r   r   tupler   r   r   r   r   r  rs   r  r  r&  r1  r7  deleter;  r<  intrG  rI  putrK  ry  rO  patchrV  rX  r`  r~  r  r  rf   r<   r:   <module>r     s   )    i i i =  > ( H H w w A  A  o n [  H n n 
/ o    "  	 F_ s  $sCx. 33 3k kD k  #s(^	
  
#v+." "S "CS&[8I Cc C
CtCK7H CS C

T#s(^ 
M * .0,.((&( d
	(
 (+( '*( 4K(  (V 5O !_ !sDfDU?U9V !: /333 "3 	3
 3 V$t+3 3lP/ PDf<M PRU P	I 	ID 	IOd$: c .  	!! ! Tz	!
 !H I$+O$< 
/ 
c6kAR 
 
 K,3O,D / cSYkIZ   3:?3K  PTUXZ`U`Pa   8  !8?@T8U 5 Z^_bdj_jZk  "0 N+BC!$/1JK&7VTzVV V 	V DV ~6+E+EF!$/1JK&7<Tz<< < 	< G<   raB/&7  
#v+	 !8 -GH-4_-E >? >Jd > I> -GH  '7(&((  ( I( $5OP"3i&7(
((  ( Q(  0A[\  '7((#( (  	( ]( 1B\]  '7(((  ( ^(" 78  '7___ 9_  '(9w 9 )9x W%:;  '7/!// / </d \*?@  '7!  Ar<   