
    Ǯh6                        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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$ 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 j^                  d              dD ]G  Z0 e j^                  e0      s ejb                         je                  de0 e j^                  e0             I  e	e3      Z4 e        e4jk                  d      d        Z6e4jk                  ddg      d        Z7e4jk                  ddg      d         Z8e4jk                  d!d"g      d#        Z9d5d$e:d%e:fd&Z;e4jk                  d'dg      d(        Z<d5d)e=d*e:de=fd+Z>e4jk                  d,dg      d-        Z?e4jk                  d.d"g      d/        Z@e3d0k(  re4j                  d1d2d3d4       yy)6    N)Flaskrequestjsonifyrender_templatesession)func)OpenAI)generate_rag_addendum)SessionLocalinit_db)build_messages_payload)SessionUserCaseMessageDocumentTopic)perf_counter)contextmanager)is_pm_relevant)generic_pm_replyc              #      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)flushzsk-proj-aYNZjvWKzXJSdjXEfzovXwYxgihUZNHkmLLdePAwb47bx4w0-2FGr72bW8m3EXmiSlXOjZKxYNT3BlbkFJGvBbDIKPMVT1__byitBJHK6b_Knw8BbANGDh6BcJ6Ym8s7mbisR5rPP5lkrkjBe_KnKStOsjUAc                  ~    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_clientr5   1   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=   E   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_jsonget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]   I   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   jsonrK   r   rR   rS   rU   rV   r   rE   )rW   rA   news      r   create_caserd   x   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   rO   r   rP   order_byrk   allrV   r   ri   rj   	isoformat)rI   rW   msgsms       r   get_historyrq      s    	B88G&&w&7@@ARARSWWYDHHJfjkabQVVaiiAKKDYDYD[\k  ks   59B6
rA   nc                    | j                  t              j                  |      j                  t	        j
                               j                  |      j                         }g }|D ]`  }|j                  xs dj                  d|j                  xs d      }|j                         sB|j                  |j                                b |S )z
    Return a list of 'question' strings derived from Topic rows (randomized),
    with {topic} substituted into the question field (same as /topics/random).
    rA   r#   {topic})rO   r   rP   rl   r   randomlimitrm   questionreplacetopicr'   append)rW   rA   rr   rowsouttqs          r   get_initial_choices_from_dbr      s     	9y9)8DKKM"5835 	 C "ZZ2&&y!''-R@779JJqwwy!" Jr+   z/cases/<int:case_id>/messagesc                 J   t         j                  j                  dd      }t               }i }t	               }	 t        j
                         xs i }|j                  d      xs dj                         }|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 d d        st        d|      5  t        |      }d d d        t!        ||d      }g g d|dd|d}t        |      }t        t	               |z
  dz        }dj#                  |j%                         D cg c]  \  }}| d|  c}}      }|r| d| n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        t1               }t        d%|      5  |j2                  j4                  j7                  d&d'd(d)d*d+d,d-d.d/id0id,gd1d2d3gd45      }d d d        j8                  d   }t;        |d6d       }t;        |d7d       }|d8k(  ro|rmt;        |d8d       r`|j<                  d   }t?        j@                  t;        |jB                  d9d:      xs d:      }|j                  d,g       }|jD                  xs d;}ng }|r|jD                  ndxs d<}tG        |d=      }tI        jJ                  d>|      }|jM                  t&              jO                  | ?      jQ                  t&        jR                        jU                         }tW        |D cg c]  }|jX                  d"k(  s| c}      } | dk(  }!|!r7t        d@|      5  |jM                  tZ              jO                  |dAB      j]                         }"|jM                  tZ              jO                  |dCB      jU                         }#|"r|"jD                  nd}$|#rt_        j`                  |#      jD                  nd}%|D cg c]  }|jX                  d"k(  s|jb                    }&}|$xs dje                  tW        |&      dkD  r|&d   ndtW        |&      dkD  r|&d   ndtW        |&      dDkD  r|&dD   ndE      }'|' dF| dG|% }d d d        g }n$tW        |      dkD  rt_        jf                  |d      }t        dH|      5  t'        | dI|J      }(|j)                  |(       |j+                          |j-                  |(       d d d        ||||!dKdK|dL}t        |      }t        t	               |z
  dz        }dj#                  |j%                         D cg c]  \  }}| d|  c}}      }|r| d| nd | |j                  d<   |df|j                          S # t        $ r d}
d|d<   Y w xY w# 1 sw Y   xY w# 1 sw Y   cxY w# 1 sw Y   NxY wc c}}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 c c}w # 1 sw Y   xY w# 1 sw Y    xY wc c}}w # t        $ r3})t        dMti        |)      d
      dNfcY d })~)|j                          S d })~)ww xY w# |j                          w xY w)ONmodeprimaryrj   r#   button_choicerA   rB   bad_requestz Missing 'content' or 'tenant_id')errordetaili  ragrag_addendum   )rA   top_kaddendum	rag_error)replytimingsr   zrag_addendum;dur=r   z, total;dur=zServer-Timing   pm_classifygeneric_reply)rA   rr   F)r   	followupschoices
is_summaryinitialChoicesshow_ragpm_relevantr   z, z;dur=z
total;dur=db_store_userrY   )rI   ri   rj   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)namedescription
parameters)r   r   auto)modeltemperaturerh   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\*\*(.*?)\*\*rg   summary_prepsummary_intro_1r`   quote   )
iteration1
iteration2
iteration3

z

 db_store_ai	assistant)rI   ri   rj   T)r   r   r   r   r   r   r   server_errori  )5r   argsrK   r   r   rJ   r'   r   rV   r   r
   	Exceptionr   headersr   r   r   joinr   r   rR   rS   rU   r   r5   chatcompletionscreater   getattrr   rb   loadsr   rj   truncate_numbered_blocksrefindallrO   rP   rl   rk   rm   lenri   r   rQ   rv   choicer   formatsamplerL   )*rI   r   rW   r   t_allrX   	user_textr   rA   rag_resr   resptotalpm_okai_textinitial_choicespayloadr)   vserver_timinguser_msgmessages_payloadopenai_clientr   msgfinish	tool_callr   r   r   past_messagesrp   turnr   	intro_docquotes
intro_text
quote_textbutton_choicesintro_filledai_msges*                                             r   post_messager      s   <<FI.D	BGNEX!'RXXi(.B557	"5HH[!,		]>`abdggb 	
Y 5=~w/ --3IZ[\G$+KK
$;$Ar#H#H#JL- \gFGD%/478E.?N[\@]?^^jkpjq,rDLL)9B 	
y ='* 	."9-E	. 
 0 6*956 :"	UVWO !#"1!$"	G 7#D%/478E II'--/&R$!Q!E!~&RSMUb}o\%,Qjtuzt{h|DLL)9| 	
q ?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)33G3DMMgN_N_`ddf}A!&0@AABai
~w/ J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$wiuZLIJ G7|a --3='* 	<W;PFFF6NBIIKF);	<
 "$
 w\^e+t34		gmmo"NdaaSaS>"NOQ^=/eW(Mfpqvpwdx_%Sy
 	
O ! -#%L+,GK(-	- -	. 	.6 6( 'S	@ 	@	N 	N	 	H B "^J J$	< 	< #O  I3q6BCSHH

I 	
sj  A2] ;] [1Z<?A] '] 3[ ?] [-!A#] [:
&] ] A\ ] .\<] ?\D7] \'%\')] B \1$\,9\,A\1$;] A\> A] 4]
&] <[[[[[]  [*%] -[72]  \
] \] \$] ,\11\;6] >]] 	^^2^3^ ^^ ^"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#   )	r   searchr   rstripr   	enumerater{   r'   r   )r   r   r   rp   headbodyblocksr}   idx_numrj   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 )Nr   )r   rA   ra   )r   r   rb   modelsTenantrR   rS   rU   rV   r   rE   )rW   r   r~   s      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   rt   r   ru   )rz   rx   )r   rO   r   rP   rl   r   rv   rw   rm   rx   ry   rz   r{   rV   r   )rW   rA   
raw_topicsresultsr~   filled_questions         r   get_random_topicsr   e  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$   r   rM   r2   rb   sysrv   pprintflaskr   r   r   r   r   sqlalchemy.sqlr   r   r	   rag_servicer
   rW   r   r   utils.prompt_managerr   r   r   rT   r   r   r   r   r   timer   
contextlibr   classifiersr   
respondersr   r   printr&   r*   r1   r5   r%   varr3   warning__name__approuter=   r]   rd   rq   r   r   r   rL   r   r   r   runr<   r+   r   <module>r     sU   	 	    
   C C   - $ 7   % & '7 7  & }  6  yryy+,- .3 dCryy~##$MsT]TVT]T]^aTbcd Ho 	 3) ) ?VH-+ .+\ 8fX&- '- )E7; <s s ( *VH=] >]B>3 >3 >s >2 :x(- )- eW- ., zGG
    r+   