
    fhm1                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZmZmZmZmZ d d	l m!Z! d d
l"m#Z# e#d        Z$ e%dd       dZ&d Z'da(defdZ) e%d e jT                  d              dD ]G  Z+ e jT                  e+      s ejX                         j[                  de+ e jT                  e+             I  e	e.      Z/ e        e/ja                  d      d        Z1e/ja                  ddg      d        Z2e/ja                  ddg      d        Z3e/ja                  dd g      d!        Z4e/ja                  d"dg      d#        Z5d0d$e6d%e7de6fd&Z8e/ja                  d'dg      d(        Z9e/ja                  d)d g      d*        Z:e.d+k(  re/jw                  d,d-d.d/       yy)1    N)Flaskrequestjsonifyrender_template)func)OpenAI)generate_rag_addendum)SessionLocalinit_db)build_messages_payload)SessionUserCaseMessageDocumentTopic)perf_counter)contextmanagerc              #      K   t               }	 d  t        t               |z
  dz        || <   y # t        t               |z
  dz        || <   w xY ww)N  )r   int)labelbagt0s      /var/www/html/dynbot/app.pytimedr      sI     	B7,.2-56E
S,.2-56E
s   A/ AAAu   📍 being here 1T)flushzsk-pc                  ~    t        j                  d      xs
 t        xs dj                         } | st	        d      | S )NOPENAI_API_KEY zHNo API key available (OPENAI_API_KEY and FALLBACK_OPENAI_KEY are empty).)osgetenvFALLBACK_OPENAI_KEYstripRuntimeError)ks    r   _resolve_api_keyr'   %   s;     
#	$	A(;	ArHHJAeffH    returnc                      t         =t               } t        j                         j	                  d| dd         t        |       a t         S )Nu$   🔑 OPENAI_API_KEY ends with: ...%sapi_key)_clientr'   logging	getLoggerinfor   r,   s    r   get_openai_clientr2   .   s@    "$  !GQSQTV)Nr(   u   🗄 DB user: DB_USER)
HTTP_PROXYHTTPS_PROXY	ALL_PROXYz'Proxy var %s is set; may cause 401s: %s/c                      t        d      S )Nz
index.html)r    r(   r   indexr:   B   s    <((r(   z/init-sessionPOST)methodsc                  (   t               } t        j                         }|j                  dd      }|j                  dd      }|j                  dt	        t        j                                     }| j                  t              j                  |      j                         }|s0t        ||dd      }| j                  |       | j                          t        |||	      }| j                  |       | j                          | j                  |       t        |||j                   
      }| j                  |       | j                          | j                  |       |j                   ||j                   d}| j#                          t%        |      S )N	tenant_id   user_idsession_token)idzDefault Userzdefault@example.com)rB   r>   usernameemail)r>   r@   rA   )r>   r@   
session_id)rE   rA   case_id)r
   r   get_jsongetstruuiduuid4queryr   	filter_byfirstaddcommitChatSessionrefreshr   rB   closer   )	dbdatar>   r@   rA   usernew_sessioncaseresponses	            r   init_sessionrZ   F   sC   	BDa(Ihhy!$GHH_c$**,.?@M 88D>##w#/557Dw)nTij
t
		 #K
 FF;IIKJJ{ >>D
 FF4LIIKJJt "nn&77H HHJ8r(   z/casesc                  b   t               } t        j                  j                  dd      }t	        |t        j                  j                  dd            }| j                  |       | j                          | j                  |       | j                          t        d|j                  i      dfS )Nr>   r?   titler    r>   r\   rF      )r
   r   jsonrH   r   rO   rP   rR   rS   r   rB   )rT   r>   news      r   create_casera   u   s{    	B  a0I
',,*:*:72*F
GCFF3KbjjoHHJIsvv&',,r(   z/cases/<int:case_id>/historyGETc           
      v   t               }|j                  t              j                  |       j	                  t        j
                        j                         }|j                          t        d|D cg c]4  }|j                  |j                  |j
                  j                         d6 c}i      S c c}w )NrF   messages)rolecontent	timestamp)r
   rL   r   rM   order_byrh   allrS   r   rf   rg   	isoformat)rF   rT   msgsms       r   get_historyrn   ~   s    	B88G&&w&7@@ARARSWWYDHHJfjkabQVVaiiAKKDYDYD[\k  ks   59B6
z/cases/<int:case_id>/messagesc                    t         j                  j                  dd      }t               }i }t	               }	 t        j
                         xs i }|j                  d      }|j                  dd      }|j                  dd      }|r|s t        dd	d
      df|j                          S |dk(  rt        d|      5  	 t        ||d      }	|	j                  d      xs dj                         }
d d d        t        
|d      }t        t	               |z
  dz        }d|j                  dd       d| |j                  d<   |df|j                          S t        d|      5  t        | d||      }|j                  |       |j!                          |j#                  |       d d d        t        d|      5  t%        || |      }d d d        t'               }t        d|      5  |j(                  j*                  j-                  ddd d!d"d#d$d%d&d'id(id$gd)d*d+gd,-      }d d d        j.                  d   }t1        |d.d       }t1        |d/d       }|d0k(  ro|rmt1        |d0d       r`|j2                  d   }t5        j6                  t1        |j8                  d1d2      xs d2      }|j                  d$g       }|j:                  xs d3}ng }|r|j:                  ndxs d4}t=        |d5      }t?        j@                  d6|      }tC        |      dkD  rtE        jF                  |d      }|jI                  t              jK                  | 7      jM                  t        jN                        jQ                         }tC        |D cg c]  }|jR                  dk(  s| c}      }|dk(  }| xr tC        |      dk(  }|r	 t        d8|      5  |jU                         |j!                          d d d        |g g d9|d:}t        |      }t        t	               |z
  dz        }d;jY                  |j[                         D  cg c]  \  }} | d<|   c} }      }!|!r|! d| nd=| |j                  d<   |df|j                          S |r4t        d>|      5  |jI                  t\              jK                  |d?@      j_                         }"|jI                  t\              jK                  |dA@      jQ                         }#|"r|"j:                  nd}$|#rtE        j`                  |#      j:                  nd}%|D cg c]  }|jR                  dk(  s|jb                    }&}|$xs dje                  tC        |&      dkD  r|&d   ndtC        |&      dkD  r|&d   ndtC        |&      dBkD  r|&dB   ndC      }'|' dD| }d d d        g }n$tC        |      dkD  rtE        jF                  |d      }t        dE|      5  t        | dF|G      }(|j                  |(       |j!                          |j#                  |(       d d d        |||rg n|||r%nd|dH}t        |      }t        t	               |z
  dz        }d;jY                  |j[                         D  cg c]  \  }} | d<|   c} }      }!|!r|! d| nd=| |j                  d<   ||j                          S # t        $ r}d}
d|d<   Y d }~d }~ww xY w# 1 sw Y   xY w# 1 sw Y   SxY w# 1 sw Y   >xY w# 1 sw Y   xY wc c}w # 1 sw Y   <xY w# t        $ r |jW                          Y [w xY wc c} }w c c}w # 1 sw Y   xY w# 1 sw Y   ?xY wc c} }w # t        $ r3}t        dItg        |      d
      dJfcY d }~|j                          S d }~ww xY w# |j                          w xY w)KNmodeprimaryrg   button_choicer    r>   r?   bad_requestz Missing 'content' or 'tenant_id')errordetaili  ragrag_addendum   )r>   top_kaddendum	rag_error)replytimingsr   zrag_addendum;dur=r   z, total;dur=zServer-Timing   db_store_userrV   )rF   rf   rg   rr   build_payloadopenaizgpt-4o-minig333333?functionextract_followupsuA   Suggest 6–8 follow-up questions based on the assistant's reply.object	questionsarraytypestring)r   items)r   
propertiesrequired)namedescription
parameters)r   r   auto)modeltemperaturere   toolstool_choicemessagefinish_reason
tool_calls	argumentsz{}u\   Vielen Dank für Ihre Auswahl. Hier sind mögliche nächste Schritte oder Zusammenfassungen.z(no text reply provided))	max_itemsz\*\*(.*?)\*\*rd   db_delete_offtopic_userF)r|   	followupschoices
is_summaryr}   z, z;dur=z
total;dur=summary_prepsummary_intro_1r]   quote   )
iteration1
iteration2
iteration3

db_store_ai	assistant)rF   rf   rg   )r|   r   r   r   footer_quoter}   server_errori  )4r   argsrH   r
   r   rG   r   rS   r   r	   r$   	Exceptionr   headersr   rO   rP   rR   r   r2   chatcompletionscreater   getattrr   r_   loadsr   rg   truncate_numbered_blocksrefindalllenrandomsamplerL   rM   ri   rh   rj   rf   deleterollbackjoinr   r   rN   choicerr   formatrI   ))rF   rp   rT   r}   t_allrU   	user_textrr   r>   rag_resrw   eresptotaluser_msgmessages_payloadopenai_clientr   msgfinish	tool_callr   r   ai_textr   past_messagesrm   turnr   	off_topicpayloadr&   vserver_timing	intro_docquotes
intro_text
quote_textbutton_choicesintro_filledai_msgs)                                            r   post_messager      s   <<FI.D	BGNEN!'RHHY'	"5HH[!,		]>`abdggN 	
K 5=~w/ --3IZ[\G$+KK
$;$Ar#H#H#JL- \gFGD%/478E.?N[\@]?^^jkpjq,rDLL)9t 	
o ?G, 	@wVY^klHFF8biik2::h+?	@ ?G, 	N5b'9M	N *+8W% 	 %%1188#)& 3'j/7]dntu}m~U  HA  P[  O\  ']!  # 9 D	  afi.$7\!cgc<.Nq)I::gi&8&8+tLTPTUDb1Ikk  D  &DGI&)s{{rP6PG +7a@**-w7w<!mmGQ/G )33G3DMMgN_N_`ddf}A!&0@AABai
 $^<#g,!*;	4g>  IIh'IIK  !#"G 7#D%/478E II'--/&R$!Q!E!~&RSMUb}o\%,Qjtuzt{h|DLL)9^ 	
Y ~w/ 9HHX.889Te8flln	(+55	QX5Y]]_2;Y..
>DV]]62::"
;H!]aAFFV\L\!//!]!] * 0b88585H15Lq 1RT585H15Lq 1RT585H15Lq 1RT  9   *N$wi89  G7|a --3 ='* 	<W;PFFF6NBIIKF);	<
 "(g$+5Z2
 w\^e+t34		W]]_"McaaSaS>"MNQ^=/eW(Mfpqvpwdx_%
 	
A ! -#%L+,GK(-	- -	@ 	@	N 	N	 	J B      'S "^9 9,	< 	< #N  I3q6BCSHH

I 	
s|  A ]8 )]8 :['<1[	-A]8 ]8 !A[4#]8 7\]8 #?\"E]8 =\\!]8 8\- "\ &\- .A
]8 8]
	&]8  ]8 B ]/]]A],;]8 'A]%(A]8 ]2
$]8 		[$[['[$$[''[1,]8 4[>9]8 \]8 \]8  \*%\- -]
]8 	]

	]8 ]]"]8 %]/*]8 8	^4^/^4^7 /^44^7 7_	textr   c                    dd l } |j                  d|       }|s| S | d |j                          j                  d      }| |j                         d  } |j                  d|      }|s| S g }t        |d | d      D ],  \  }\  }	}
|j                  | d|
j                                 . |r|dz   nd	dj                  |      z   S )
Nr   z(?m)^\s*\d+\.\s+
z((?ms)^\s*(\d+)\.\s+(.*?)(?=^\s*\d+\.|\Z)r?   )startz. r   r    )	r   searchr   rstripr   	enumerateappendr$   r   )r   r   r   rm   headbodyblocksoutidx_numrg   s              r   r   r     s    		%t,A
""4(D	
D RZZCTJF C )&)*<A F 0_dG

cU"W]]_-./0 "D6MrV[[-===r(   z/tenantsc                     t               } t        j                  d   }t        j	                  |      }| j                  |       | j                          | j                  |       | j                          t        d|j                  i      dfS )Nr   )r   r>   r^   )r
   r   r_   modelsTenantrO   rP   rR   rS   r   rB   )rT   r   ts      r   create_tenantr   7  sf    	B<<D4 AFF1Iryy{BJJqMHHJK&',,r(   z/topics/randomc                     t               } d}| j                  t              j                  |      j	                  t        j                               j                  d      j                         }g }|D ]F  }|j                  j                  d|j                        }|j                  |j                  |d       H | j                          t        |      S )Nr?   )r>   rx   z{topic})topicquestion)r
   rL   r   rM   ri   r   r   limitrj   r   replacer   r   rS   r   )rT   r>   
raw_topicsresultsr   filled_questions         r   get_random_topicsr   A  s    	BI%	Y	'	$++-	 	q		  G **,,Y@WW'
 	 HHJ7r(   __main__z0.0.0.0i  )z//var/www/html/decompression/certs/fullchain.pemz-/var/www/html/decompression/certs/privkey.pem)hostportssl_contextdebug)rx   )<r!   r   rJ   r/   r_   sysr   pprintflaskr   r   r   r   sqlalchemy.sqlr   r   r   rag_servicer	   rT   r
   r   utils.prompt_managerr   r   r   rQ   r   r   r   r   r   timer   
contextlibr   r   printr#   r'   r.   r2   r"   varr0   warning__name__approuter:   rZ   ra   rn   r   rI   r   r   r   r   runr9   r(   r   <module>r     s;   	 	    
   : :   - $ 7   %7 7  &   6  yryy+,- .3 dCryy~##$MsT]TVT]T]^aTbcd Ho 	 3) ) ?VH-+ .+\ 8fX&- '- )E7; < *VH=S >Sj>3 >3 >s >2 :x(- )- eW- ., zGG
    r(   