
    BiO                     B   d dl Z d dlmZmZm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 d dlZd dlmZ d dlmZ d dlmZ d dlZd dlmZ d dlZd ZdMd
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 m!Z! d dl"m#Z#m$Z$ d dl%m&Z&  e&e'          Z( ede'          Z) ede'          Z* e            Z+ e            Z,d Z- ej.        d          Z/ ej.        dd          Z0 e- ej.        dd                    Z1dZ2dZ3g dZ4d dlZ ej5        ej6        d ej7        ej8                  gd            ej9        e'          Z(e(:                    ej6                   e(j;        sM ej7        ej8                  Z<e<=                     ej>        d                     e(?                    e<            ej9        e'          Z(i a@daAdaBdaCi ZDd ZEd! ZFe(G                    d"           	  eF             e(G                    d#           n?# eH$ r7ZIe(J                    d$eI            e(K                    d%           Y dZI[IndZI[Iww xY wd& ZLd' ZMdNd)ZNdNd*ZOd+ ZPdOd-ZQd. ZRe*S                    d/d0g1          d2             ZTe)S                    d3d0g1           e            d4                         ZUd5eVd6eVd7eVfd8ZWd5eVfd9ZXdPd;eVd<eYd=eVfd>ZZe)S                    d?d0g1           e            d@                         Z[e)S                    dAdBg1          dC             Z\e)S                    dAd0g1          dD             Z]e)S                    dEdFg1          dG             Z^e)S                    dHdIg1          dJ             Z_e)S                    dKd0g1          dL             Z`dS )Q    N)	Blueprintrequestjsonify)load_dotenv)embedding_functions)OpenAI)cross_origin)datetimec                 &    t          |           dz  S )u6   대략적인 토큰 수 계산 (1 토큰 ≈ 4 문자)   )lentexts    K/var/www/html/web/mlink/mlink_AI_Server/mlink-backend/src/routes/chatbot.pycount_tokensr      s    t99>      c                 L    t          |           |k    r| S | d|dz           dz   S )u%   문서를 최대 토큰 수로 제한Nr   ...)r   )doc
max_tokenss     r   truncate_documentr      s2    CJ&&

Q%''r   )r   )SmalltalkPatternManager)InappropriateQuestionFilter)analyze_gif_contentgenerate_contextual_response)is_emoji_only_messagehandle_emoji_message)ValidationErrorExternalAPIError)StructuredLoggerchatbotchatbot2c           	         | rt           j                            |           r| S t           j                            t           j                            t           j                            t           j                            t
                                                  }t           j                            t           j                            t           j                            ||                               S N)ospathisabsdirnameabspath__file__normpathjoin)r'   backend_roots     r   _resolve_pathr/   2   s     27==&& 7??27??27??27??S[C\C\3]3]#^#^__L7??27++BGLLt,L,LMMNNNr   OPENAI_API_KEYFINE_TUNE_MODELzgpt-3.5-turboCHROMA_DB_PATHz./output_final0718/chroma_dbmlink_knowledgeu'   공지 내용을 요약해 주세요.  )u	   엠링크u   엘림u   상품등록u   주문연동u   자동등록MLINKYellimz=%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)sT)levelformathandlersforce   c                     t           s)t                              d           t          d          t	          t           d          at          j        t           d          a	 t          j
        t                    } 	 |                     t                    at                              dt           d	           nu# t           $ rh}t                              d
t           d           |                     t          t                    at                              d           Y d}~nd}~ww xY wn0# t           $ r#}t                              d|             d}~ww xY wt%          t'          j        dd                    }t                              d|            t&          j                            |          st                              d|            dS 	 d}t1          |d          5 }t3          |d          D ]\  }}	 t5          j        |          }n># t4          j        $ r, t                              d| d|dd          d           Y Uw xY w|                    d          }|                    d          }	||		 t=          |          }n# t          t>          f$ r Y nw xY w|	t@          |<   |dz  }|dz  dk    rt                              d | d!           	 ddd           n# 1 swxY w Y   t                              d"| d#           dS # t           $ r#}t                              d$|             d}~ww xY w)%u=   챗봇 초기화 함수 - 모듈 로딩 시 한 번만 실행u/   OPENAI_API_KEY가 설정되지 않았습니다.u0   OPENAI_API_KEY 환경 변수가 필요합니다.g      N@)api_keytimeouttext-embedding-ada-002)r<   
model_name)r'   u   ChromaDB 컬렉션 'u   ' 로드 성공u   새 컬렉션 'u   ' 생성 중...)nameembedding_functionu    ChromaDB 컬렉션 생성 완료Nu   ChromaDB 연결 실패: METADATA_FILE_PATHz*./output_final0718/org_metadata_data.jsonlu   메타데이터 파일 경로: u3   메타데이터 파일을 찾을 수 없습니다: r   zutf-8)encoding   )startu   JSON 파싱 오류 (라인 z): 2   r   
article_idoriginal_contentr   u    원문 데이터 로딩 진행: u
   개 완료u$   원문 데이터 로드 완료: 총 u
   개 항목u    원문 데이터 로드 실패: )!r0   loggererror
ValueErrorr   clientr   OpenAIEmbeddingFunction	openai_efchromadbPersistentClientr2   get_collectionRAG_COLLECTION_NAME
collectioninfo	Exceptioncreate_collectionr/   r&   getenvr'   existswarningopen	enumeratejsonloadsJSONDecodeErrorgetint	TypeErrororiginal_contents)
chroma_clientemetadata_file_pathloaded_countfline_numlineentryrG   contents
             r   initialize_chatbotrl   Y   s   
  MFGGGKLLL ND999F#;N_wxxxI 1~FFF		<&556IJJJKKS/BSSSTTTT 	< 	< 	<KKN*=NNNOOO&88(#, 9  J KK:;;;;;;;;	<    333444
 'ry1EGs't'tuu
KKF2DFFGGG7>>,-- aM_aabbb$w777 	]1"+AQ"7"7"7 ] ]$ Jt,,EE+   NN#\#\#\dSVTVSVi#\#\#\]]]H #YY|44
))$677%!$ZJJ"I.   D 18!*-!  $&!++KK [< [ [ [\\\-]	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	]2 	S<SSSTTTTT   ;;;<<<s   #D2 >=B< ;D2 <
D.AD)$D2 )D..D2 2
E<EE L$ 3K9H K9 8IK9I2K9JK9J2/K91J22:K9-L$ 9K==L$  K=!L$ $
M.MMu!   챗봇 모듈 초기화 시작...u   챗봇 모듈 초기화 완료u    챗봇 모듈 초기화 실패: uM   챗봇 기능이 비활성화됩니다. OPENAI_API_KEY를 설정해주세요.c                 F     t           fdt          D                        S )Nc              3   h   K   | ],}|                                                                  v V  -d S r%   )lower).0kwr   s     r   	<genexpr>zneeds_prefix.<locals>.<genexpr>   s8      &U&UbrxxzzTZZ\\'A&U&U&U&U&U&Ur   )anyKEYWORDSr   s   `r   needs_prefixru      s(    3&U&U&U&UH&U&U&U#U#UUUr   c                 8    t          |           r
t          | z   n| S r%   )ru   PREFIXr   s    r   apply_prefixrx      s    T0B0BLv}}Lr      c                    	 t           j                            d|           j        d         j        }t
                              |g|ddiddg          }|                    d          }|                    d          }|rt          |t                    r|d         st                              d	           g g fS |rt          |t                    r|d         st                              d
           g g fS |d         |d         fS # t          $ r+}t                              d|            g g fcY d }~S d }~ww xY w)Nr>   modelinputr   
chunk_typefaq	documents	metadatasquery_embeddings	n_resultswhereincludeu)   RAG 검색 결과 문서가 없습니다.u2   RAG 검색 결과 메타데이터가 없습니다.   RAG 검색 실패: )rL   
embeddingscreatedata	embeddingrS   queryr_   
isinstancelistrI   rY   rU   rJ   )r   top_kembresultsdocsmetasrd   s          r   
rag_searchr      se   &&-EU&SSXYZ[e""!U' +.	 # 0 0
 {{;''K(( 	:dD11 	a 	NNFGGGr6M 	Jud33 	58 	NNOPPPr6MAwa     .1..///2vs*   B:D
 =<D
 :D
 

D? D:4D?:D?c                    	 t           j                            d|           j        d         j        }t
                              |g|ddiddg          }g g }}|d         r|d         d         }|d         d         }t
                              |g|dd	iddg          }g g }}|d         r|d         d         }|d         d         }d
}	|rCt          t          d |D                                 }
|
rt
          	                    |
          }	|||||	fS # t          $ r.}t                              d|            g g g g d
fcY d
}~S d
}~ww xY w)u   
    FAQ(Excel 기반) + PDF 매뉴얼(paragraph-level + page-level) 동시 검색
    반환: faq_docs, faq_metas, para_docs, para_metas, page_results
    r>   r{   r   r~   r   r   r   r   	paragraphNc                 &    g | ]}d |v |d          S )page_id rp   ms     r   
<listcomp>zrag_search2.<locals>.<listcomp>   s"     T T T!YRS^^9^^^r   )idsr   )rL   r   r   r   r   rS   r   r   setr_   rU   rI   rJ   )
user_queryr   r   faq_resultsfaq_docs	faq_metaspara_results	para_docs
para_metaspage_resultspage_idsrd   s               r   rag_search2r      s   
($&&* ' 
 
 q  	 !&&!U' +.	 ' 
 
 !"){# 	4";/2H#K03I "''!U- +.	 ( 
 
 !#B:	$ 	6$[1!4I%k215J  	<C T Tz T T TUUVVH <)~~(~;;Iz<GG $ $ $.1..///2r2t#######$s   DD 
E!#E
E
Ec                 t    	 dddd dg}t           j        j                            t          |d          }|j        d         j        j                                        }g d}t           fd	|D                       rd
S |S # t          $ r(}t                              d|            Y d}~dS d}~ww xY w)uI   Fine-tuned 모델 답변만 생성 (원문은 hybrid_answer에서 제어)systemuT   너는 MLink 공지/FAQ 전문가다. 친근하고 이해하기 쉽게 답변해라.rolerk   userg        r|   messagestemperaturer   )u	   대통령u   대한민국u   노벨u   정치u   역사u   인물u	   세계사c              3       K   | ]}|v V  	d S r%   r   )rp   kr   s     r   rr   z#fine_tune_answer.<locals>.<genexpr>  s'      ;;1qJ;;;;;;r   +   제가 학습하지 않은 질문입니다.u    Fine-tune 답변 생성 실패: NT   ⚠️ 답변을 생성하지 못했습니다. 다른 질문을 시도해 주세요.)rL   chatcompletionsr   r1   choicesmessagerk   striprs   rU   rI   rJ   )r   r   respanswerunrelated_keywordsrd   s   `     r   fine_tune_answerr      s   f  +A  B  B
33
 {&--! . 
 

 a(06688ooo;;;;(:;;;;; 	A@@ f f f;;;<<<eeeeeefs   A>B B 
B7B22B7 c                 8   	 t                               |           \  }}}|r$t                               ||          g g ddddddS t                              |           \  }}|r,ddddddd	d
d}	|	                    |d          }
|
g g ddddddS t          | |          \  }}}}}d |D             }d |D             }|s|sdg g ddddddS t          |           }|dk    r|g g ddddddS g }t          |d|dz                      D ]\  }}|s)t          d| d           |
                    d           0|                    d          }|s+t          d| d|            |
                    d           rt                              |          }|r|
                    |           t          d| d           |
                    d           t          |          |k    r|}g }n|d|         }||d         }d}t          t          |dd         |dd                             D ]K\  }\  }}|d|dz    d|                    d            d!|                    d"           d#|dd$          d%	z  }Ld&| d'}|r|d(d)                    |          z   d'z   z  }|r&|d*d)                    |dd+                   z   d'z   z  }t          |          d,k    r|dd,         d-z   }d.d/d0d1d2| d0d1d3|  d4d0g}t          j        j                            d5|d67          }|j        d8         j        j                                        }|||d9d:|d;d<dS # t.          $ r2}t0                              d=|            d>g g ddddddcY d}~S d}~ww xY w)?u   FAQ + 원문(문단 단위, 토글) + 매뉴얼을 합쳐 하나의 응답 생성
       출처(page/paragraph)는 '참고자료 보기' 버튼을 눌러야 표시됨
    r   )final_answeroriginal_paragraphs_openoriginal_paragraphs_collapsedcollapsed_labelexpanded_label
referencesreference_labelreference_hide_labelu6   천만에요! 도움이 되셨다니 기쁩니다 😊u.   안녕하세요! 무엇을 도와드릴까요?u7   안녕히 가세요. 다음에 또 뵙겠습니다 👋u   네, 알겠습니다.u6   알겠습니다. 다시 말씀해 주셔도 됩니다.u<   응원해 주셔서 감사합니다! 힘내겠습니다 💪u7   괜찮습니다. 함께 해결해 나가면 돼요 🙂u)   네, 이해해 주셔서 감사합니다.)thanksgreetingfarewell	agreementdisagreementencouragementapologyconfirmationuQ   네, 감사합니다. 도움이 필요하시면 언제든 말씀해주세요 😊)r   c                 0    g | ]}t          |d           S i,  )r   r   rp   r   s     r   r   z!hybrid_answer.<locals>.<listcomp>B  s&    OOOs%cc:::OOOr   c                 0    g | ]}t          |d           S r   r   r   s     r   r   z!hybrid_answer.<locals>.<listcomp>C  s&    QQQ&ss;;;QQQr   r   Nry   u   ⚠️ metas[   ] 항목이 None입니다.   메타데이터 없음rG   u
   ❓ metas[   ]에 'article_id' 없음:    article_id 누락u   ❓ article_id    에 해당하는 원문 없음"   원문을 찾을 수 없습니다.u   [출처 rD   z - para_idz (page=r   z)]
i   z...

u   📌 FAQ 응답:
z

u    FAQ 원문 일부:

u    매뉴얼 내용:
   i N  u0   

...(내용 생략됨: 길이 제한 초과)...r   u   너는 MLink 고객지원 전문가다. FAQ와 매뉴얼 내용을 참고해 사용자의 질문에 자연스럽고 정확하게 답변해라. 출처는 답변에 직접 포함하지 마라.r   r   u   [참고자료]
u   위 내용을 종합해서 'u   '에 답변해줘.zgpt-4333333?r   r   u0   … 여기를 눌러 나머지 원문 보기 ▾u   원문 접기 ▴u   📖 참고자료 보기 ▾u    참고자료 접기 ▴u&   하이브리드 답변 생성 실패: h   ⚠️ AI 서비스에 일시적인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.)inappropriate_filter_manageris_inappropriateget_appropriate_responsesmalltalk_manageris_smalltalkr_   r   r   r[   printappendrb   r   zipr-   rL   r   r   r   r   r   rk   r   rU   rI   rJ   )r   r   default_open	user_namer   categoryseverityr   st_categorysmalltalk_responsesresponse_textr   r   r   r   r   
faq_answeroriginal_paragraphsimetarG   originalopen_paragraphscollapsed_paragraphsrag_contextr   combined_contextr   r   r   rd   s                                  r   hybrid_answerr     s   ]
/K/\/\]g/h/h,(H 
	 < U UV^`h i i,.13#%"$ #%(*	 	 	 %6$B$B:$N$N!k 	RLU4 X!_T K	# 	# 033K  BU  V  VM !.,.13#%"$ #%(*	 	 	 DOzafCgCgCg@)Y
L POhOOOQQyQQQ	  
		 
	 M,.13#%"$ #%(*	 	 	 &j11
 FFF *,.13#%"$ #%(*	 	 	 ! ?LN?!;<< 	Q 	QGAt CaCCCDDD#**+CDDD,//J F1FFFFGGG#**+>???(,,Z88H Q#**84444R
RRRSSS#**+OPPPP "##|331O#%  1-<-@O#6|}}#E  'IbqbM:bqb>(J(JKK 	v 	vNA{Tuacuudhhy.A.Auu$((S\J]J]uucfgkhkgkcluuuuKK A
@@@ 	^ 7$))O:T:T TW] ]] 	[ 69RaR=9Q9Q QTZ ZZ   5((/7:nn   +k  l  l(M;K(M(MNN(ez(e(e(eff

 {&-- . 
 

 |A.6<<>> )(7-AQ1%=$>	
 	
 		
  
 
 
AaAABBB G(*-/! !$&	
 	
 		
 		
 		
 		
 		
 		

s8   AM A
M =M M /I-M 
N''NNNc                 ~   	 dd|  ddt          |          dg}t          j        j                            t
          |d          }|j        d         j        j        	                                sdS |j        d         j        j        S # t          $ r(}t                              d|            Y d }~d	S d }~ww xY w)
Nr   u   [참고지식]
r   r   r   r   r   u   OpenAI API 호출 실패: r   )rx   rL   r   r   r   r1   r   r   rk   r   rU   rI   rJ   )contextr   r   responserd   s        r   generate_answerr     s    z(D7(D(DEEZ(@(@AA
 ;*11! 2  
 "*288:: 	jii"*22 z z z5!55666yyyyyyzs   A/B
 3B
 

B<B77B<z/api/chatbot/ask2POST)methodsc                     	 t           t          t          ddg d          dfS t          j                    } | st          ddi          dfS |                     dd	          }|                                st          dd
i          dfS t                              d|d d          d           t          |          \  }}t          d                    |          |          }g }t          |          D ]\  }}|s4t                              d| d           |                    d           ;|                    d          }|s6t                              d| d|            |                    d           t                              |          }	|	r|                    |	           t                              d| d           |                    d           t                              dt!          |           d           t          ||d          S # t"          $ r<}
t                              d|
            t          ddg d          dfcY d }
~
S d }
~
ww xY w)N4   챗봇 서비스가 초기화되지 않았습니다.k   죄송합니다. 챗봇 서비스가 현재 사용할 수 없습니다. 관리자에게 문의해주세요.rJ   r   rH     rJ   !   요청 데이터가 없습니다.  questionr   u   질문 내용이 없습니다.   챗봇 질문 수신: rF   r   r   zmetas[r   r   rG   r   r   zarticle_id r   r   u   챗봇 응답 완료: u
   개 원문)r   rH   !   챗봇 처리 중 오류 발생: +   서버 내부 오류가 발생했습니다.b   죄송합니다. 일시적인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.  )rL   rS   r   r   get_jsonr_   r   rI   rT   r   r   r-   r[   rY   r   rb   r   rU   rJ   )r   
user_inputr   r   r   original_textsr   r   rG   r   rd   s              r   ask_chatbot2r    s   6>Z/O H$&    	  !! 	PG%HIJJCOOXXj"--
!! 	MG%EFGGLLAZ_AAABBB ,,e 4*== '' 	L 	LGAt EEEEFFF%%&>???,//J KKKTKKLLL%%&9:::(,,Z88H L%%h////WZWWWXXX%%&JKKKKLS-@-@LLLMMM .
 
   	
    <<<===Bz "
 
   	 	 	 	 	 	 	s/   "H! 'H! <H! 
FH! !
I'+1I"I'"I'z/api/chatbot/askc                     t          j                     } t          j                            dd          }|s t	          t          j                              }	 t                              d|            t          t          t          ddg d          dfS t          j                    }|st          d          |                    d	d
          }|                    dd
          }|                    dd
          }|                    d|          }|                                st          d          t                              d|d d          d| d           t          |          rt                              d|            t!          |d|           t#          |          }t!          |d|d                    t                              d           t          i |dt%          |          i          S t!          |d|           |                                }|r|d|d d         z   z  }t'          |d|          }t!          |d|d                    t                              dt)          t%          |                     d           t          j                     | z
  }	t                              d|	            t                              d | d!|d          d"|            t          i |dt%          |          i          S # t*          $ rP}
t                              d#|
            t          d$d%g g d
d
d
d
d
t%          |          d&
          d'fcY d }
~
S d }
~
ww xY w)(NzX-Session-IDunknownu0   API 요청: POST /api/chatbot/chat, session_id: r   r  r  r  r  r  r   file_contentr   
session_idu    메시지가 비어있습니다.r  rF   u   ... (사용자: )u   이모티콘 메시지 감지: r   	assistantr   u   이모티콘 응답 완료historyu   
[첨부파일 내용]
r   rD   )r   r   u$   챗봇 응답 완료 (대화 이력 u   개)zPOST /api/chatbot/chat, 200, zUser Input: z, Assistant Response: z, Session ID: r  r	  r
  )
rJ   r   r   r   r   r   r   r   r   r  r  )timer   headersr_   struuiduuid4rI   rT   rL   rS   r   r  r   r   r   add_message_to_historyr   get_message_historyr   r   rU   rJ   )
start_timer  r   r  r  r   emoji_answercombined_inputr   response_timerd   s              r   ask_chatbotr"     s    J$$^Y??J '&&
MSzSSTTT >Z/O H$&    	  !! 	G!"EFFFXXj"--
xx33HH["--	XXlI66
!! 	G"#EFFFZZ_ZZiZZZ[[[ !,, 		KKF*FFGGG":vzBBB/
;;L":{L<XYYYKK4555 .z::     	z6:>>> $))++ 	P9L$<OOON~Q)LLL 	z;~8NOOOe3?RS]?^?^;_;_eeefff	j0 	CMCCDDDw:wwVNE[wwkuwwyyy 

*:66
 
   	
    <<<===B A(*-/! !$&*:66
 
    	 	 	 	 	 	s-   ?L E&L >DL 
M.AM)#M.)M.user_idr   rk   c                 
   | sd} | t           vr
g t           | <   t           |                              ||d           t          t           |                    t          k    r%t           |          t           d         t           | <   dS dS )uF   사용자별 메시지 이력에 추가 (최근 MAX_HISTORY만 유지)	anonymousr   N)user_message_historyr   r   MAX_HISTORY)r#  r   rk   s      r   r  r  X  s     ***(*W%!(($7)K)KLLL ())K77(<W(E{lmm(TW%%% 87r   c                 8    t                               | g           S )u*   사용자별 메시지 이력 가져오기)r&  r_   )r#  s    r   r  r  g  s    ##GR000r      r  nreturnc                     t                               | g           | d          }d                    d |D                       S )N c              3   B   K   | ]}|                     d d          V  dS )rk   r   N)r_   r   s     r   rr   z*get_recent_context_text.<locals>.<genexpr>m  s0      77QAEE)R((777777r   )r&  r_   r-   )r  r*  msgss      r   get_recent_context_textr0  k  sC    ##J33QBCC8D8877$777777r   z/api/chatbot/gif-responsec            	      ~   	 t          j                    } d| vsd| vrt          ddi          dfS | d         }| d         }|                     dd          }t	          |          }|                     d          p|                     d	          pd
}t          |d          }t          |||          }	 t          ||||                     d	          |                     d          dd          }t          j	        
                    |           t          j	                                         n.# t          $ r!}	t          j        d|	            Y d}	~	nd}	~	ww xY wt          |||d          dfS # t          $ rA}	t          j        dt!          |	                      t          ddi          dfcY d}	~	S d}	~	ww xY w)u"   GIF에 대한 자동 응답 생성gif_id	gif_titlerJ   '   필수 필드가 누락되었습니다.r  gif_urlr   r  r#  r%     )conversation_contextsentr   )r2  r3  r5  r#  r  
usage_typer   u   GIF 사용 추적 실패: N)r   analysisr2     u   GIF 응답 생성 실패: u(   GIF 응답 생성에 실패했습니다.r  )r   r  r   r_   r   r0  r   GifUsagedbsessionaddcommitrU   loggingrY   rJ   r  )
r   r2  r3  r5  r:  r  context_textr   usagerd   s
             r   generate_gif_responserD  o  s    -S!! 4;d#:#:G%NOPPRUUUh%	((9b)) 'y11XXl++Qtxx	/B/BQk
.z1== 5Xy_klll	>#++88L11!  E JNN5!!!J 	> 	> 	>O<<<========	> % 
 
   	 	  S S S;3q66;;<<<!KLMMsRRRRRRRSsN   -E1 BE1 4A9D. -E1 .
E8EE1 EE1 1
F<;6F71F<7F<z/api/chatbot/smalltalk/patternsGETc                     	 t           j                            d          } | rt                              |           }nd t          j        D             }t          d |D             t          t                                                    t          	                                d          S # t          $ r:}t                              d|            t          ddi          dfcY d	}~S d	}~ww xY w)
u!   스몰토크 패턴 목록 조회r   c                      g | ]}|j         	|S r   )enabledrp   ps     r   r   z*get_smalltalk_patterns.<locals>.<listcomp>  s    KKKaKKKKr   c                 D    g | ]}|j         |j        |j        |j        d S )patternr   descriptionrH  rL  rI  s     r   r   z*get_smalltalk_patterns.<locals>.<listcomp>  sE          !y !
#$= y	   r   )patterns
categories
statisticsu#   스몰토크 패턴 조회 실패: rJ   u$   패턴 조회에 실패했습니다.r  N)r   argsr_   r   get_patterns_by_categoryrO  r   r   get_all_categoriesget_statisticsrU   rI   rJ   )r   rO  rd   s      r   get_smalltalk_patternsrV    s   O<##J// 	L(AA(KKHHKK#4#=KKKH  "   0CCEEFF+::<<
 
   	  O O O>1>>???!GHII3NNNNNNNOs   B)B, ,
C06/C+%C0+C0c                  v   	 t          j                    } | rd| vrt          ddi          dfS | d         }|                     dd          }|                     dd          }|                     d	d
          }	 t	          j        |           n2# t          j        $ r }t          dd| i          dfcY d}~S d}~ww xY wt                              ||||           t          d||||dd          S # t          $ r:}t                              d|            t          ddi          dfcY d}~S d}~ww xY w)u   새 스몰토크 패턴 추가rM  rJ   r4  r  r   customrN  u   사용자 정의 패턴rH  Tu   잘못된 정규식 패턴: Nu0   패턴이 성공적으로 추가되었습니다.rL  )r   rM  u#   스몰토크 패턴 추가 실패: u$   패턴 추가에 실패했습니다.r  )r   r  r   r_   recompilerJ   r   add_patternrU   rI   )r   rM  r   rN  rH  rd   s         r   add_smalltalk_patternr\    s   O!! 	Vy,,G%NOPPRUUUy/88J11hh}.GHH((9d++	OJwx 	O 	O 	OG%GA%G%GHII3NNNNNNN	O 	%%gxgNNNI"$*"	 
 
   	  O O O>1>>???!GHII3NNNNNNNOsS   +C4 A
C4 9B C4 B=B82B=3C4 8B==6C4 4
D8>/D3-D83D8z)/api/chatbot/smalltalk/patterns/<pattern>DELETEc                    	 t                               |           rt          ddi          S t          ddi          dfS # t          $ r:}t                              d|            t          ddi          dfcY d	}~S d	}~ww xY w)
u   스몰토크 패턴 제거r   u0   패턴이 성공적으로 제거되었습니다.rJ   "   패턴을 찾을 수 없습니다.  u#   스몰토크 패턴 제거 실패: u$   패턴 제거에 실패했습니다.r  N)r   remove_patternr   rU   rI   rJ   )rM  rd   s     r   remove_smalltalk_patternrb    s    O++G44 	QI'YZ[[[G%IJKKSPP O O O>1>>???!GHII3NNNNNNNOs"   *A  A   
B
/A?9B?Bz0/api/chatbot/smalltalk/patterns/<pattern>/togglePUTc                 t   	 t          j                    }|                    dd          }t                              | |          rt          d|rdnd d|d          S t          dd	i          d
fS # t          $ r:}t                              d|            t          ddi          dfcY d}~S d}~ww xY w)u*   스몰토크 패턴 활성화/비활성화rH  Tu
   패턴이 u	   활성화u   비활성화u   되었습니다.)r   rH  rJ   r_  r`  u#   스몰토크 패턴 토글 실패: u$   패턴 토글에 실패했습니다.r  N)	r   r  r_   r   toggle_patternr   rU   rI   rJ   )rM  r   rH  rd   s       r   toggle_smalltalk_patternrf    s    O!!((9d++++GW== 	Qdw(RNddd"    
 G%IJKKSPP O O O>1>>???!GHII3NNNNNNNOs$   AA3  A3 3
B7=/B2,B72B7z/api/chatbot/smalltalk/testc                     	 t          j                    } | rd| vrt          ddi          dfS | d         t                                        \  }}t          ||fdt          j        D             d          S # t          $ r:}t                              d|            t          ddi          d	fcY d
}~S d
}~ww xY w)u   스몰토크 패턴 테스트r   rJ   u'   테스트할 쿼리가 필요합니다.r  c                     g | ]\}|j         	t          j        |j                                                                                  G|j        |j        |j        d ]S ))rM  r   rN  )rH  rY  matchrM  r   ro   r   rN  )rp   rJ  r   s     r   r   z*test_smalltalk_pattern.<locals>.<listcomp>  su     ! ! ! 9! "$!)U[[]]5H5H5J5J!K!K! y !
#$= ! ! !r   )r   r   r   matched_patternsu&   스몰토크 패턴 테스트 실패: u'   패턴 테스트에 실패했습니다.r  N)	r   r  r   r   r   rO  rU   rI   rJ   )r   r   r   rd   r   s       @r   test_smalltalk_patternrk     s   R!! 	Vwd**G%NOPPRUUUW!2!?!?!F!Fh( ! ! ! ! +3! ! !	
 
   	  R R RAaAABBB!JKLLcQQQQQQQRs#   +A> AA> >
C/B=7C=C)r   )ry   )ry   ry   r   )r)  )ar  flaskr   r   r   r&   sysr\   rY  unicodedatadotenvr   rO   chromadb.utilsr   openair   
flask_corsr	   rA  r
   r  r   r   src.routes.smalltalk_managerr   src.routes.inappropriate_filterr   src.routes.gif_managerr   r   src.routes.emoji_managerr   r   src.utils.error_handlersr   r    src.config.logging_configr!   __name__rI   
chatbot_bpchatbot_bp2r   r   r/   rW   r0   r1   r2   rR   rw   rt   basicConfigINFOStreamHandlerstdout	getLoggersetLevelr8   handlersetFormatter	Formatter
addHandlerrb   rS   rL   rN   r&  r'  rl   rT   rU   rd   rJ   rY   ru   rx   r   r   r   r   r   router  r"  r  r  r  r`   r0  rD  rV  r\  rb  rf  rk  r   r   r   <module>r     s    - - - - - - - - - - 				 



  				            . . . . . .       # # # # # #          ( ( ( (
       @ @ @ @ @ @ G G G G G G T T T T T T T T P P P P P P P P F F F F F F F F 6 6 6 6 6 6 
	(	#	#Yy(++
i
H--
 ,+-- ::<< 
O O O +,,")-??yry)9;YZZ[[' 	2eee 


  
,J#g#CJ//0
	    
	8	$	$     #g#CJ//G**+jkklll
g		8	$	$  
		  D D DN / 0 0 0	
KK01111 	 	 	
LL7A77888
NNbcccDDDD		 V U U L L L   0-$ -$ -$ -$^f f f2a
 a
 a
 a
Fz z z$ &997 7 :97r $vh77T T  87TlUC Us US U U U U1 1 1 1 18 8 8 8C 8 8 8 8 -x@@/S /S  A@/Sh 3eWEEO O FEO4 3fXFFO O GFOB =zRR	O 	O SR	O DugVVO O WVO" /&BBR R CBR R Rs   %H I
-H<<I