
    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& dddddddiddddddgddddg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d0Z;d1e<d$e:fd2Z=e9j}                  d(      d3        Z?e9j}                  d4d5g6      d7        Z@e9j}                  d8d5g6      d9        ZAe9j}                  d:d;g6      d<        ZBe9j}                  d=d5g6      d>        ZCdKd?e:d@e+d$e:fdAZDe9j}                  dBd5g6      dC        ZEe9j}                  dDd;g6      dE        ZFe8dFk(  re9j                  dGdHdIdJ       yy)L    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)contextmanagerfunctionextract_followupszPropose pointed follow-up questions that CLOSE INFORMATION GAPS found in the retrieved context vs. the user's intent. Only include questions that cannot be answered with the provided context.objectarraytypestring)r   itemsz/1-2 sentences explaining the gaps you targeted.)r   description)	questions	rationaler   F)r   
propertiesrequiredadditionalProperties)namer   
parameters)r   r   c              #      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,   7   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.   )r0   s    r+   is_summary_turnr3   F   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_keyr@   K   s;     
#	$	A(;	ArHHJAeffHr4   c                      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   rC   s    r+   get_openai_clientrI   T   s@    "$  !GQSQTV)Nr4   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)rN   s    r+   _slugr\   h   s]    fa(//BII'RA
a(..s399;A>	r4   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>"}, ...]
    }
    sectionsr9   z<div class="ref-story">rT   content_htmlz <section class="ref-section ref-z">z
</section>z</div>)getappendr\   join)r]   partssecr#   htmls        r+   render_referenzstory_htmlrg   n   s     		*-&'EZ  Ywwy!'Rww~&,"7d}BtfJWXY 
LL775>r4   c                      t        d      S )Nz
index.html)r    r4   r+   indexrj      s    <((r4   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)rr   rn   usernameemail)rn   rp   rq   )rn   rp   
session_id)ru   rq   case_id)r
   r   get_jsonra   struuiduuid4queryr   	filter_byfirstaddcommitChatSessionrefreshr   rr   closer   )	dbdatarn   rp   rq   usernew_sessioncaseresponses	            r+   init_sessionr      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r4   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 )Nrn   ro   titler9   rn   r   rv      )r
   r   jsonra   r   r~   r   r   r   r   rr   )r   rn   news      r+   create_caser      s{    	B  a0I
',,*:*:72*F
GCFF3KbjjoHHJIsvv&',,r4   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rv   messages)rolecontent	timestamp)r
   r{   r   r|   order_byr   allr   r   r   r   	isoformat)rv   r   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&t2        d'(      }d d d        j4                  d   }t7        |d)d       }t7        |d*d       }|d+k(  ro|rmt7        |d+d       r`|j8                  d   }t;        j<                  t7        |j>                  d,d-      xs d-      }|j                  d.g       }|j@                  xs d/}ng }|r|j@                  ndxs d0}tC        |d1      }tE        jF                  d2|      }tI        |      dkD  rtK        jL                  |d      }|jO                  t               jQ                  | 3      jS                  t         jT                        jW                         }tI        |D cg c]  }|jX                  d!k(  s| c}      }t[        |      } |  xr tI        |      dk(  }!|!r	 t        d4|      5  |j]                         |j%                          d d d        |g g d5|d6}t        |      }t        t	               |z
  dz        }d7ja                  |jc                         D "#cg c]  \  }"}#|" d8|#  c}#}"      }$|$r|$ d| nd9| |j                  d<   |df|j                          S d}%| r4t        d:|      5  |jO                  td              jQ                  |d;<      jg                         }&|jO                  td              jQ                  |d=<      jW                         }'|&r|&j@                  nd}(|'rtK        jh                  |'      j@                  nd}%|D cg c]  }|jX                  d!k(  s|jj                    })}|(xs djm                  tI        |)      dkD  r|)d   ndtI        |)      dkD  r|)d   ndtI        |)      d>kD  r|)d>   nd?      }*|* d@| }d d d        g }n$tI        |      dkD  rtK        jL                  |d      }t        dA|      5  t!        | dB|C      }+|j#                  |+       |j%                          |j'                  |+       d d d        ||| rg n|| | r|%nd|dD}t        |      }t        t	               |z
  dz        }d7ja                  |jc                         D "#cg c]  \  }"}#|" d8|#  c}#}"      }$|$r|$ d| nd9| |j                  d<   ||j                          S # t        $ r d}
d|d<   Y kw xY w# 1 sw Y   qxY w# t        $ r d}d|d<   Y "w xY w# 1 sw Y   (xY w# 1 sw Y   hxY w# 1 sw Y   Sx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        dEto        |,      d
      dFfcY d },~,|j                          S d },~,ww xY w# |j                          w xY w)GNmodeprimaryr   button_choicer9   rn   ro   bad_requestz Missing 'content' or 'tenant_id')errordetaili  ragrag_addendum   )rn   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_userr   )rv   r   r   r   build_payloadopenaizgpt-4o-minig333333?auto)modeltemperaturer   toolstool_choicemessagefinish_reason
tool_calls	argumentsz{}r   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)rv   r   r   )r   r   r   r   footer_quoter   server_errori  )8r   argsra   r
   r   rw   r   r   r,   r	   r=   	Exceptionr   rg   r'   headersr   r~   r   r   r   rI   chatcompletionscreateTOOLSr   getattrr   r   loadsr   r   truncate_numbered_blocksrY   findalllenrandomsampler{   r|   r   r   r   r   r3   deleterollbackrc   r   r   r}   choicer   formatrx   )-rv   r   r   r   t_allr   	user_textr   rn   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   r0   r   	off_topicr?   vserver_timing
quote_text	intro_docquotes
intro_textbutton_choicesintro_filledai_msges-                                                r+   post_messager      s,   <<FI.D	BGNEj!'RHHY'	"5HH[!,		]>`abdggF 	
C 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)
 9l 	
g ?G, 	@wVY^klHFF8biik2::h+?	@ ?G, 	N5b'9M	N *+8W% 	 %%1188#)" 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_%
 	
w ! -#%L+,GK(-	- -. ! 2)+&01G,-22 2B	@ 	@	N 	N	 	< B      'S "^9 9,	< 	< #N  I3q6BCSHH

I 	
s  A ` )` ;]=1].` ^A]*A.` ` &A^(` <^
` (/^(E` 2^5^5'` 3_ ?"^:!_ )A
` 3_'
&` ;` B _2,_-_-A_2);` $A_?%A`  `
$` ]]]]]'"` *]>:^=]>>^^` ^` ^% ` (^2-` :_?_ _$ ` #_$$	` -_22_<7` ?`	` 	aa	3a4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)ro   )startz. r   r9   )	rY   searchr  rstripr   	enumeraterb   r=   rc   )r   r   rY   r   headbodyblocksoutidx_numr   s              r+   r   r   x  s    		%t,A
""4(D	
D RZZCTJF C )&)*<A F 0_dG

cU"W]]_-./0 "D6MrV[[-===r4   z/tenantsc                  
   t               } t        j                  d   }t        |      }| j	                  |       | j                          | j                  |       | j                          t        d|j                  i      dfS )Nr#   )r#   rn   r   )
r
   r   r   Tenantr~   r   r   r   r   rr   )r   r#   ts      r+   create_tenantr    s`    	B<<DDAFF1Iryy{BJJqMHHJK&',,r4   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 )Nro   )rn   r   z{topic})topicquestion)r
   r{   r   r|   r   r   r   limitr   r  replacer  rb   r   r   )r   rn   
raw_topicsresultsr  filled_questions         r+   get_random_topicsr    s    	BI%	Y	'	$++-	 	q		  G **,,Y@WW'
 	 HHJ7r4   __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:   rY   rU   ry   rF   r   sysr   pprintflaskr   r   r   r   sqlalchemy.sqlr   r   r   rag_servicer	   r   r
   r   utils.prompt_managerr   services.referenzr   modelsr   r   r   r   r   r   r   timer   
contextlibr   r   r,   printr<   r'   r;   r.   boolr3   r  r5   r@   rE   rI   varrG   warning__name__apprx   r\   dictrg   routerj   r   r   r   r   r   r  r  runri   r4   r+   <module>r1     s   	     
   : :   - $ 7 /   % 'E
 ! !("((!3"
 !)'X"	 )M(-
	: 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=o >ob>3 >3 >s >2 :x(- )- eW- ., zGG
    r4   