
    {Ϥh'                     r   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  e d	d
       dZ!d Z"da#defdZ$ e d e jJ                  d              dD ]G  Z& e jJ                  e&      s ejN                         jQ                  de& e jJ                  e&             I  e	e)      Z* e        e*jW                  d      d        Z,e*jW                  ddg      d        Z-e*jW                  ddg      d        Z.e*jW                  ddg      d        Z/e*jW                  ddg      d         Z0e*jW                  d!dg      d"        Z1e*jW                  d#dg      d$        Z2e)d%k(  re*jg                  d&d'd(d
)       yy)*    N)Flaskrequestjsonifyrender_template)func)OpenAI)generate_rag_addendum)SessionLocalinit_db)build_messages_payload)SessionUserCaseMessageDocumentTopicu   📍 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    /var/www/html/dynbot/app.py_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_clientr)   "   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   indexr1   6   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)r9   r5   usernameemail)r5   r7   r8   )r5   r7   
session_id)r<   r8   case_id)r
   r   get_jsongetstruuiduuid4queryr   	filter_byfirstaddcommitChatSessionrefreshr   r9   closer   )	dbdatar5   r7   r8   usernew_sessioncaseresponses	            r   init_sessionrQ   :   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 )Nr5   r6   titler   r5   rS   r=      )r
   r   jsonr?   r   rF   rG   rI   rJ   r   r9   )rK   r5   news      r   create_caserX   i   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r=   messages)rolecontent	timestamp)r
   rC   r   rD   order_byr_   allrJ   r   r]   r^   	isoformat)r=   rK   msgsms       r   get_historyre   r   s    	B88G&&w&7@@ARARSWWYDHHJfjkabQVVaiiAKKDYDYD[\k  ks   59B6
z/cases/<int:case_id>/messagesc                 
   t               }	 t        j                         xs i }|j                  d      }|j                  dd      }|j                  dd      }|r|s t	        ddd      d	f|j                          S t        | d
||      }|j                  |       |j                          |j                  |       t        || |      }t               }	 |j                  j                  j                  d|ddddddddididgdddgd      }	|	j"                  d   }t%        |dd       }t%        |dd       }|d k(  ro|rmt%        |d d       r`|j&                  d   }t)        j*                  t%        |j,                  d!d"      xs d"      }|j                  dg       }|j.                  xs d#}ng }|r|j.                  ndxs d$}|rq|j1                  d%      }t3        d& t5        |      D        d       }|B|D cg c]  }t7        j8                  d'|      s| }}|d d( }d%j;                  |d | |z         }t7        j<                  d)|      }t?        |      d(kD  rtA        jB                  |d(      }d}	 tE        ||d(*      }|j                  d+      xs djG                         }|r	|d,| d-z  }t        | d.|/      }|j                  |       |j                          |j                  |       |jI                  t              jK                  | 0      jM                  t        jN                        jQ                         }t?        |D cg c]  }|jR                  d
k(  s| c}      }|d(k(  }|r&|jI                  tT              jK                  |d12      jW                         }|jI                  tT              jK                  |d32      jQ                         } |r|j.                  nd}!| rtA        jX                  |       j.                  nd}"|D cg c]  }|jR                  d
k(  s|jZ                    }#}|!xs dj]                  t?        |#      dkD  r|#d   ndt?        |#      dkD  r|#d   ndt?        |#      d4kD  r|#d4   nd5      }$|$ d6| d7|" }|r|d8z  }t	        |||rg n||d9      |j                          S # t        $ r3}
t	        dt!        |
      d      dfcY d }
~
|j                          S d }
~
ww xY wc c}w # t        $ r d}Y hw xY wc c}w c c}w # t        $ r3}
t	        d:t!        |
      d      d;fcY d }
~
|j                          S d }
~
ww xY w# |j                          w xY w)<Nr^   button_choicer   r5   r6   bad_requestz Missing 'content' or 'tenant_id')errordetaili  rM   )r=   r]   r^   rg   zgpt-4o-minifunctionextract_followupsuA   Suggest 2–4 follow-up questions based on the assistant's reply.object	questionsarraytypestring)rp   items)rp   
propertiesrequired)namedescription
parameters)rp   rk   auto)modelr\   toolstool_choiceopenai_call_failedi  r   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)
c              3   T   K   | ]   \  }}t        j                  d |      s| " yw)^\d+\.\sN)rematch).0ilines      r   	<genexpr>zpost_message.<locals>.<genexpr>   s"     _GAt288KY]C^a_s   ((r      z\*\*(.*?)\*\*)r5   top_kaddendumuc   

---

<div class="rag-box">📘 <strong>Empfehlung aus den House of PM Best Practices</strong><br>z</div>	assistant)r=   r]   r^   r[   summary_intro_1rT   quote   )
iteration1
iteration2
iteration3z

z

 z

---

)reply	followupschoices
is_summaryserver_errori  )/r
   r   r>   r?   r   rJ   r   rF   rG   rI   r   r)   chatcompletionscreate	Exceptionr@   r   getattrr   rV   loadsrk   r^   splitnext	enumerater   r   joinfindalllenrandomsampler	   r   rC   rD   r`   r_   ra   r]   r   rE   choicerg   format)%r=   rK   rL   	user_textrg   r5   user_msgmessages_payloadopenai_clientresper   msgfinish	tool_callargsr   ai_textlines	first_idxlnnumbered	truncatedr   rag_addendumrag_resai_msgpast_messagesrd   turnr   	intro_docquotes
intro_text
quote_textbutton_choicesintro_filleds%                                        r   post_messager   |   sT   	Bz!'RHHY'	"5HH[!,		]>`abdggf 	
a 7Zgh
x"))+rzz('; 2"gyI *+	S %%1188#)& 3'j$,+6TZ\dSe8f*g)4'!  # 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 MM$'E_y/?_aefI$).L2"((;2KBLL$RaL	))E*9$5	$AB **-w7w<!mmGQ/G 	+IRSTG#KK
39r@@BL Z  .	G {GL
v		RZZ%7 )33G3DMMgN_N_`ddf}A!&0@AABai
*44yPa4bhhjIXXh'11IW1UYY[F.7**RJ:@v.66bJ7DY!RXHXaooYNY&,"4414^1Dq1HN1-b14^1Dq1HN1-b14^1Dq1HN1-b 5 L &d7)5EG=("(g$	
  	
m  	S%9SVLMsRRj 	
m	S, M  	L	$ B Z&  I3q6BCSHH

I 	
s   A T =AT =R= C(T ;S<S<AT 61T 'B$T T T$B.T T'T5A7T =	S9S4S9T 4S99T TT TT 	U&U>U?U UU U.z/tenantsc                     t               } t        j                  d   }t        j	                  |      }| j                  |       | j                          | j                  |       | j                          t        d|j                  i      dfS )Nru   )ru   r5   rU   )r
   r   rV   modelsTenantrF   rG   rI   rJ   r   r9   )rK   ru   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 )Nr6   )r5   r   z{topic})topicquestion)r
   rC   r   rD   r`   r   r   limitra   r   replacer   appendrJ   r   )rK   r5   
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)4r   r   rA   r&   rV   sysr   pprintflaskr   r   r   r   sqlalchemy.sqlr   openair   rag_servicer	   rK   r
   r   utils.prompt_managerr   r   r   rH   r   r   r   r   r   printr   r   r%   r)   r   varr'   warning__name__approuter1   rQ   rX   re   r   r   r   runr0   r   r   <module>r      s   	 	    
   : :   - $ 7   & }  6  yryy+,- .3 dCryy~##$MsT]TVT]T]^aTbcd Ho 	 3) ) ?VH-+ .+\ 8fX&- '- )E7; < *VH=| >|| :x(- )- eW- ., zGG
    r   