
     h;                     n   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"m#Z# d d
l$m%Z% d dl&m'Z' e'd        Z( e)dd       dZ* e+ e jX                  dd            Z-de+de.fdZ/ e jX                  dd      ja                  d      Z1d Z2da3defdZ4 e)d e jX                  d              dD ]G  Z5 e jX                  e5      s ejl                         jo                  de5 e jX                  e5             I  e
e8      Z9 e        de:de:fd Z;d!e<de:fd"Z=e9j}                  d      d#        Z?e9j}                  d$d%g&      d'        Z@e9j}                  d(d%g&      d)        ZAe9j}                  d*d+g&      d,        ZBe9j}                  d-d%g&      d.        ZCd;d/e:d0e+de:fd1ZDe9j}                  d2d%g&      d3        ZEe9j}                  d4d+g&      d5        ZFe8d6k(  re9j                  d7d8d9d:       yy)<    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Tenant)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-p
SUMMARY_AT2turnreturnc                     | t         k\  S )N)r    )r"   s    r   is_summary_turnr%   )   s    :    CANONICAL_BASE_URLzhttps://ai-1a.com/c                  ~    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_keyr2   .   s;     
#	$	A(;	ArHHJAeffHr&   c                      t         =t               } t        j                         j	                  d| dd         t        |       a t         S )Nu$   🔑 OPENAI_API_KEY ends with: ...%sapi_key)_clientr2   logging	getLoggerinfor   r5   s    r   get_openai_clientr;   7   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)r@   s    r   _slugrN   K   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">rF   content_htmlz <section class="ref-section ref-z">z
</section>z</div>)getappendrN   join)rO   partssecnamehtmls        r   render_referenzstory_htmlrZ   Q   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   indexr]   c   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)re   ra   usernameemail)ra   rc   rd   )ra   rc   
session_id)rh   rd   case_id)r
   r   get_jsonrS   struuiduuid4queryr   	filter_byfirstaddcommitChatSessionrefreshr   re   closer   )	dbdatara   rc   rd   usernew_sessioncaseresponses	            r   init_sessionr|   g   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 )Nra   rb   titler+   ra   r~   ri      )r
   r   jsonrS   r   rq   rr   rt   ru   r   re   )rv   ra   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ri   messages)rolecontent	timestamp)r
   rn   r   ro   order_byr   allru   r   r   r   	isoformat)ri   rv   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}      }tY        |      } |  xr tG        |      dk(  }!|!r	 t        d?|      5  |j[                         |j%                          d d d        |g g d@|dA}t        |      }t        t	               |z
  dz        }dBj_                  |ja                         D "#cg c]  \  }"}#|" dC|#  c}#}"      }$|$r|$ d| ndD| |j                  d<   |df|j                          S d}%| r4t        dE|      5  |jM                  tb              jO                  |dFG      je                         }&|jM                  tb              jO                  |dHG      jU                         }'|&r|&j>                  nd}(|'rtI        jf                  |'      j>                  nd}%|D cg c]  }|jV                  d!k(  s|jh                    })}|(xs djk                  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_                  |ja                         D "#cg c]  \  }"}#|" dC|#  c}#}"      }$|$r|$ d| ndD| |j                  d<   ||j                          S # t        $ r d}
d|d<   Y {w xY w# 1 sw Y   xY w# t        $ r d}d|d<   Y 2w xY w# 1 sw Y   8xY w# 1 sw Y   xxY w# 1 sw Y   cxY w# 1 sw Y   xY wc c}w # 1 sw Y   [xY w# t        $ r |j]                          Y zw 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        dPtm        |,      d
      dQfcY d },~,|j                          S d },~,ww xY w# |j                          w xY w)RNmodeprimaryr   button_choicer+   ra   rb   bad_requestz Missing 'content' or 'tenant_id')errordetaili  ragrag_addendum   )ra   top_kaddendum	rag_errorreferenzstoryr   story_idr~   score)r   r~   r   referenz_error)replyreferenzstory_htmlr   timingsr   zrag_addendum;dur=z, referenzstory;dur=z, total;dur=zServer-Timing   db_store_userrx   )ri   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)rX   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_1r   quote   )
iteration1
iteration2
iteration3

db_store_ai	assistant)ri   r   r   )r   r   r   r   footer_quoter   server_errori  )7r   argsrS   r
   r   rj   r   ru   r   r	   r/   	Exceptionr   rZ   r   headersr   rq   rr   rt   r   r;   chatcompletionscreater   getattrr   r   loadsr   r   truncate_numbered_blocksrK   findalllenrandomsamplern   ro   r   r   r   r   r%   deleterollbackrU   r   r   rp   choicer   formatrk   )-ri   r   rv   r   t_allrw   	user_textr   ra   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   r"   r   	off_topicr1   vserver_timing
quote_text	intro_docquotes
intro_textbutton_choicesintro_filledai_msges-                                                r   post_messager      ss   <<FI.D	BGNEq!'RHHY'	"5HH[!,		]>`abdggT 	
Q 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)
 9z 	
u ?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$T*
 $^<#g,!*;	4g>  IIh'IIK  !#"G 7#D%/478E II'--/&R$!Q!E!~&RSMUb}o\%,Qjtuzt{h|DLL)9d 	
] 
~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_%
 	
E ! -#%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]:A.`" `" &A^(`" <^+
`" (?^8'E`" __'`" _ "_
1_ 9A
`" _7
&`" `" B `<_=_=A`9;`" 4A`5A`" `
!$`" ]*&]-)]**]--]72`" :^
^^^^`" ^(#`" +^50`" 8_=`" 
__ _40`" 3_44	`" =```" ``" "	a+aaa! aa! !a3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)rb   )startz. r   r+   )	rK   searchr   rstripr   	enumeraterT   r/   rU   )r   r   rK   r   headbodyblocksoutidx_numr   s              r   r   r   b  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 )NrX   )rX   ra   r   )r
   r   r   modelsr   rq   rr   rt   ru   r   re   )rv   rX   ts      r   create_tenantr  {  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 )Nrb   )ra   r   z{topic})topicquestion)r
   rn   r   ro   r   r   r   limitr   r  replacer  rT   ru   r   )rv   ra   
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   )Hr,   rK   rG   rl   r8   r   sysr   pprintflaskr   r   r   r   sqlalchemy.sqlr   r   r   rag_servicer	   rv   r
   r   utils.prompt_managerr   services.referenzr   r  r   rs   r   r   r   r   r   r   timer   
contextlibr   r   printr.   r   r-   r    boolr%   r  r'   r2   r7   r;   varr9   warning__name__apprk   rN   dictrZ   router]   r|   r   r   r   r   r  r  runr\   r&   r   <module>r.     s   	     
   : :   - $ 7 /    %7 7  &   <-.
# $  RYY35HIPPQTU  6  yryy+,- .3 dCryy~##$MsT]TVT]T]^aTbcd Ho 	S S T c $ 3) ) ?VH-+ .+\ 8fX&- '- )E7; < *VH=v >vp>3 >3 >s >2 :x(- )- eW- ., zGG
    r&   