
    >h;                        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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 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 jZ                  d              dD ]G  Z. e jZ                  e.      s ej^                         ja                  de. e jZ                  e.             I  e
e1      Z2 e        de3de3fdZ4de5de3fdZ6e2jo                  d      d        Z8e2jo                  ddg       d!        Z9e2jo                  d"dg       d#        Z:e2jo                  d$d%g       d&        Z;e2jo                  d'dg       d(        Z<d5d)e3d*e=de3fd+Z>e2jo                  d,dg       d-        Z?e2jo                  d.d%g       d/        Z@e1d0k(  re2j                  d1d2d3d4       yy)6    N)Flaskrequestjsonifyrender_template)func)OpenAI)generate_rag_addendum)SessionLocalinit_db)build_messages_payload)get_referenzstory)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_clientr3   6   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sc                     t        j                  d|       j                  dd      j                  d      } t	        j
                  dd|       j                  d      j                         } | xs dS )NNFKDasciiignorez[^a-zA-Z0-9]+-section)unicodedata	normalizeencodedecoderesubr%   lower)r8   s    r   _slugrF   J   s]    fa(//BII'RA
a(..s399;A>	r)   matchc                    | r| j                  d      sydg}| d   D ]M  }|j                  d      xs d}|j                  d      xs d}|j                  dt        |       d| d       O |j                  d	       dj                  |      S )
u   
    match = {
      "story_id": int, "title": "Referenzstory_XX", "score": float,
      "sections": [{"section": "Titel", "content_html": "<p>…</p>"}, ...]
    }
    sectionsr!   z<div class="ref-story">r>   content_htmlz <section class="ref-section ref-z">z
</section>z</div>)getappendrF   join)rG   partssecnamehtmls        r   render_referenzstory_htmlrR   P   s     		*-&'EZ  Ywwy!'Rww~&,"7d}BtfJWXY 
LL775>r)   /c                      t        d      S )Nz
index.html)r    r)   r   indexrV   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)r^   rZ   usernameemail)rZ   r\   r]   )rZ   r\   
session_id)ra   r]   case_id)r
   r   get_jsonrK   struuiduuid4queryr   	filter_byfirstaddcommitChatSessionrefreshr   r^   closer   )	dbdatarZ   r\   r]   usernew_sessioncaseresponses	            r   init_sessionru   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 )NrZ   r[   titler!   rZ   rw   rb      )r
   r   jsonrK   r   rj   rk   rm   rn   r   r^   )ro   rZ   news      r   create_caser|      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rb   messages)rolecontent	timestamp)r
   rg   r   rh   order_byr   allrn   r   r   r   	isoformat)rb   ro   msgsms       r   get_historyr      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(  r+t        d|      5  	 t        ||d      }	|	j                  d      xs dj                         }
d d d        d}i }t        d|      5  	 t        ||d      }|rC|d   }t        |      }|j                  d      |j                  d      |j                  d      d}d d d        
|||d}t        |      }t        t	               |z
  dz        }d|j                  dd       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.                  j1                  d%d&d'd(d)d*d+d,d-d.id/id+gd0d1d2gd34      }d d d        j2                  d   }t5        |d5d       }t5        |d6d       }|d7k(  ro|rmt5        |d7d       r`|j6                  d   }t9        j:                  t5        |j<                  d8d9      xs d9      }|j                  d+g       }|j>                  xs d:}ng }|r|j>                  ndxs d;}tA        |d<      }tC        jD                  d=|      }tG        |      dkD  rtI        jJ                  |d      }|jM                  t               jO                  | >      jQ                  t         jR                        jU                         }tG        |D cg c]  }|jV                  d!k(  s| c}      }|dk(  } |  xr tG        |      dk(  }!|!r	 t        d?|      5  |jY                         |j%                          d d d        |g g d@|dA}t        |      }t        t	               |z
  dz        }dBj]                  |j_                         D "#cg c]  \  }"}#|" dC|#  c}#}"      }$|$r|$ d| ndD| |j                  d<   |df|j                          S | r4t        dE|      5  |jM                  t`              jO                  |dFG      jc                         }%|jM                  t`              jO                  |dHG      jU                         }&|%r|%j>                  nd}'|&rtI        jd                  |&      j>                  nd}(|D cg c]  }|jV                  d!k(  s|jf                    })}|'xs dji                  tG        |)      dkD  r|)d   ndtG        |)      dkD  r|)d   ndtG        |)      dIkD  r|)dI   ndJ      }*|* dK| }d d d        g }n$tG        |      dkD  rtI        jJ                  |d      }t        dL|      5  t!        | dM|N      }+|j#                  |+       |j%                          |j'                  |+       d d d        ||| rg n|| | r(nd|dO}t        |      }t        t	               |z
  dz        }dBj]                  |j_                         D "#cg c]  \  }"}#|" dC|#  c}#}"      }$|$r|$ d| ndD| |j                  d<   ||j                          S # t        $ r d}
d|d<   Y sw xY w# 1 sw Y   yxY w# t        $ r d}d|d<   Y *w xY w# 1 sw Y   0xY w# 1 sw Y   pxY w# 1 sw Y   [xY w# 1 sw Y   xY wc c}w # 1 sw Y   YxY w# t        $ r |j[                          Y xw 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        dPtk        |,      d
      dQfcY d },~,|j                          S d },~,ww xY w# |j                          w xY w)RNmodeprimaryr   button_choicer!   rZ   r[   bad_requestz Missing 'content' or 'tenant_id')errordetaili  ragrag_addendum   )rZ   top_kaddendum	rag_errorreferenzstoryr   story_idrw   score)r   rw   r   referenz_error)replyreferenzstory_htmlr   timingsr   zrag_addendum;dur=z, referenzstory;dur=z, total;dur=zServer-Timing   db_store_userrq   )rb   r   r   r   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)rP   description
parameters)r   r   auto)modeltemperaturer   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\*\*(.*?)\*\*r   db_delete_offtopic_userF)r   	followupschoices
is_summaryr   z, z;dur=z
total;dur=summary_prepsummary_intro_1rx   quote   )
iteration1
iteration2
iteration3

db_store_ai	assistant)rb   r   r   )r   r   r   r   footer_quoter   server_errori  )6r   argsrK   r
   r   rc   r   rn   r   r	   r%   	Exceptionr   rR   r   headersr   rj   rk   rm   r   r3   chatcompletionscreater   getattrr   rz   loadsr   r   truncate_numbered_blocksrC   findalllenrandomsamplerg   rh   r   r   r   r   deleterollbackrM   r   r   ri   choicer   formatrd   )-rb   r   ro   r   t_allrp   	user_textr   rZ   rag_resr   r   referenzstory_metamatchestoppayloadresptotaluser_msgmessages_payloadopenai_clientr   msgfinish	tool_callr   r   ai_textr   past_messagesr   turnr   	off_topicr'   vserver_timing	intro_docquotes
intro_text
quote_textbutton_choicesintro_filledai_msges-                                                r   post_messager      sm   <<FI.D	BGNEn!'RHHY'	"5HH[!,		]>`abdggN 	
K 5=~w/ --3IZ[\G$+KK
$;$Ar#H#H#JL- "$!#0 22/	YVWXG%aj-Fs-K* ),
(;%(WWW%5%(WWW%5.*2$ &&8!3"	G 7#D%/478E#GKKq$A#B C%%,[[%C$D E"G% LL)
 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_%
 	
 ! -#%L+,GK(-	- -. ! 2)+&01G,-22 2B	@ 	@	N 	N	 	J B      'S "^9 9,	< 	< #N  I3q6BCSHH

I 	
s  A ` )` ;]%=1].` ^	A]2A.` ` &A^(` <^#
` (?^0'E` ^=^=!` =_ 	"_+_ 3A
` =_/
&` ` B _:4_5	_5A_:1;` ,A`-A` `
$` ]"]%!]""]%%]/*` 2^^	^^		^` ^ ` #^-(` 0^:5` __ _,(` +_,,	` 5_::`?` `` 	a#a;a<a aa a+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!   )	rC   searchr   rstripr   	enumeraterL   r%   rM   )r   r   rC   r   headbodyblocksoutidx_numr   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 )NrP   )rP   rZ   ry   )r
   r   rz   modelsTenantrj   rk   rm   rn   r   r^   )ro   rP   ts      r   create_tenantr  w  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[   )rZ   r   z{topic})topicquestion)r
   rg   r   rh   r   r   r   limitr   r  replacer
  rL   rn   r   )ro   rZ   
raw_topicsresultsr  filled_questions         r   get_random_topicsr    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)r   )Br"   rC   r?   re   r0   rz   sysr   pprintflaskr   r   r   r   sqlalchemy.sqlr   r   r   rag_servicer	   ro   r
   r   utils.prompt_managerr   services.referenzr   r  r   rl   r   r   r   r   r   timer   
contextlibr   r   printr$   r(   r/   r3   r#   varr1   warning__name__apprd   rF   dictrR   routerV   ru   r|   r   r   r   r   r  r  runrU   r)   r   <module>r(     sd   	     
   : :   - $ 7 /   %7 7  &   6  yryy+,- .3 dCryy~##$MsT]TVT]T]^aTbcd Ho 	S S T c $ 3) ) ?VH-+ .+\ 8fX&- '- )E7; < *VH=s >sj>3 >3 >s >2 :x(- )- eW- ., zGG
    r)   