
    i~                        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dHd	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, ejZ                  d      Z. ejZ                  dd      Z/ ejZ                  dd      Z0dZ1dZ2g dZ3d dlZ ejh                  ejj                  d ejl                  ejn                        gd        ejp                  e'      Z(e(js                  ejj                         e(jt                  sN ejl                  ejn                        Z;e;jy                   ejz                  d             e(j}                  e;        ejp                  e'      Z(i a?da@daAdaBi ZCdZDd ZEe(j                  d        	  eE        e(j                  d!       d$ ZKd% ZLdId&ZMdId'ZNd( ZOdJd)ZPd* ZQe*j                  d+d,g-      d.        ZSe)j                  d/d,g-       e       d0               ZTd1eUd2eUd3eUfd4ZVd1eUfd5ZWdKd6eUd7eXd8eUfd9ZYe)j                  d:d,g-       e       d;               ZZe)j                  d<d=g-      d>        Z[e)j                  d<d,g-      d?        Z\e)j                  d@dAg-      dB        Z]e)j                  dCdDg-      dE        Z^e)j                  dFd,g-      dG        Z_y# eG$ r0ZHe(j                  d"eH        e(j                  d#       Y dZH[HHdZH[Hww xY w)L    N)	Blueprintrequestjsonify)load_dotenv)embedding_functions)OpenAI)cross_origin)datetimec                     t        |       dz  S )u6   대략적인 토큰 수 계산 (1 토큰 ≈ 4 문자)   )lentexts    G/home/kdj-ubuntu1/mlink_AI_Server/mlink-backend/./src/routes/chatbot.pycount_tokensr      s    t9>    c                 8    t        |       |k  r| S | d|dz   dz   S )u%   문서를 최대 토큰 수로 제한Nr   ...)r   )doc
max_tokenss     r   truncate_documentr      s*    CJ&

Q%''r   )r   )SmalltalkPatternManager)InappropriateQuestionFilter)analyze_gif_contentgenerate_contextual_response)is_emoji_only_messagehandle_emoji_message)ValidationErrorExternalAPIError)StructuredLoggerchatbotchatbot2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        j                  d       t        d      t	        t         d      at        j                  t         d      a	 t        j                  t              } 	 | j                  t              at        j                  dt         d	       t%        j&                  dd      }t        j                  d|        t$        j(                  j+                  |      st        j-                  d|        y	 d}t/        |d      5 }t1        |d      D ]~  \  }}	 t3        j4                  |      }|j9                  d      }|j9                  d      }	||	C	 t;        |      }|	t>        |<   |dz  }|dz  dk(  sft        j                  d | d!        	 ddd       t        j                  d"| d#       y# t         $ rX}t        j                  d
t         d       | j#                  t        t              at        j                  d       Y d}~d}~ww xY w# t         $ r}t        j                  d|         d}~ww xY w# t2        j6                  $ r# t        j-                  d| d|dd  d       Y gw xY w# t        t<        f$ r Y .w xY w# 1 sw Y   xY w# t         $ r}t        j                  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)pathu   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_content  u    원문 데이터 로딩 진행: u
   개 완료u$   원문 데이터 로드 완료: 총 u
   개 항목u    원문 데이터 로드 실패: ) r#   loggererror
ValueErrorr   clientr   OpenAIEmbeddingFunction	openai_efchromadbPersistentClientr%   get_collectionRAG_COLLECTION_NAME
collectioninfo	Exceptioncreate_collectionosgetenvr3   existswarningopen	enumeratejsonloadsJSONDecodeErrorgetint	TypeErrororiginal_contents)
chroma_clientemetadata_file_pathloaded_countfline_numlineentryr;   contents
             r   initialize_chatbotrb   R   s   
 FGKLL ND9F#;;N_wxI 11~F		<&556IJJKK./B.C?ST #79ef
KK12D1EFG77>>,-LM_L`ab$w71"+AQ"7$ JJt,E
 #YY|4
))$67%!$ZJ 18!*-!  $&!+KK"B<.PZ [\- #8 82 	:<.
ST[  	<KK/*=)>oNO&88(#, 9 J KK:;;	<  /s34" ++ NN%@
#dSVTVi[X[#\] #I.  876  7s;<s   H- /2G	 J3 J&,I'J&)J4J&J&'!J3 		H*AH%H- %H**H- -	I6II2J	J&JJ&J#J&"J##J&&J0+J3 3	K<KKu!   챗봇 모듈 초기화 시작...u   챗봇 모듈 초기화 완료u    챗봇 모듈 초기화 실패: uM   챗봇 기능이 비활성화됩니다. OPENAI_API_KEY를 설정해주세요.c                 6     t         fdt        D               S )Nc              3   ^   K   | ]$  }|j                         j                         v  & y wN)lower).0kwr   s     r   	<genexpr>zneeds_prefix.<locals>.<genexpr>   s#     &UHbrxxzTZZ\'AHs   *-)anyKEYWORDSr   s   `r   needs_prefixrl      s    3&UH&U#UUUr   c                 .    t        |       r	t        | z   S | S re   )rl   PREFIXr   s    r   apply_prefixro      s    T0Bv}LLr   c                 ,   	 t         j                  j                  d|       j                  d   j                  }t
        j                  |g|ddiddg      }|j                  d      }|j                  d      }|rt        |t              r|d   st        j                  d	       g g fS |rt        |t              r|d   st        j                  d
       g g fS |d   |d   fS # t        $ r&}t        j                  d|        g g fcY d }~S d }~ww xY w)Nr1   modelinputr   
chunk_typefaq	documents	metadatasquery_embeddings	n_resultswhereincludeu)   RAG 검색 결과 문서가 없습니다.u2   RAG 검색 결과 메타데이터가 없습니다.   RAG 검색 실패: )rA   
embeddingscreatedata	embeddingrH   queryrU   
isinstancelistr>   rO   rJ   r?   )r   top_kembresultsdocsmetasrZ   s          r   
rag_searchr      s   &&-EU&SXXYZ[ee""!U' +.	 # 0
 {{;'K(:dD1aNNFGr6MJud358NNOPr6MAwa   *1#./2vs*   B'C$ */C$ 	C$ $	D-DDDc           	      ^   	 t         j                  j                  d|       j                  d   j                  }t
        j                  |g|ddiddg      }g g }}|d   r|d   d   }|d   d   }t
        j                  |g|dd	iddg      }g g }}|d   r|d   d   }|d   d   }d
}	|rBt        t        |D 
cg c]  }
d|
v s|
d    c}
            }|rt
        j                  |      }	|||||	fS c c}
w # t        $ r)}t        j                  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
    r1   rq   r   rt   ru   rv   rw   rx   	paragraphNpage_id)idsr}   )rA   r~   r   r   r   rH   r   r   setrU   rJ   r>   r?   )
user_queryr   r   faq_resultsfaq_docs	faq_metaspara_results	para_docs
para_metaspage_resultsmpage_idsrZ   s                r   rag_search2r      s   
($&&* ' 
 $q ) 	 !&&!U' +.	 ' 
 !"){#";/2H#K03I "''!U- +.	 ( 
 !#B:	$$[1!4I%k215J Cz Tz!YRS^9z TUVH)~~(~;Iz<GG	 !U
  $*1#./2r2t##$s6   B8C: :	C5C5)C: 5C: :	D,D'!D,'D,c                 n    	 dddd dg}t         j                  j                  j                  t        |d      }|j
                  d   j                  j                  j                         }g d}t         fd	|D              ry
|S # t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)uI   Fine-tuned 모델 답변만 생성 (원문은 hybrid_answer에서 제어)systemuT   너는 MLink 공지/FAQ 전문가다. 친근하고 이해하기 쉽게 답변해라.rolera   userg        rr   messagestemperaturer   )u	   대통령u   대한민국u   노벨u   정치u   역사u   인물u	   세계사c              3   &   K   | ]  }|v  
 y wre    )rg   kr   s     r   ri   z#fine_tune_answer.<locals>.<genexpr>   s     ;(:1qJ(:s   +   제가 학습하지 않은 질문입니다.u    Fine-tune 답변 생성 실패: NT   ⚠️ 답변을 생성하지 못했습니다. 다른 질문을 시도해 주세요.)rA   chatcompletionsr   r$   choicesmessagera   striprj   rJ   r>   r?   )r   r   respanswerunrelated_keywordsrZ   s   `     r   fine_tune_answerr      s    f  +A  B
3
 {{&&--! . 

 a((00668o;(:;;@ f7s;<efs   BB	 B	 		B4B//B4c                 |   	 t         j                  |       \  }}}|rt         j                  ||      g g ddddddS t        j	                  |       \  }}|r(ddddddd	d
d}	|	j                  |d      }
|
g g ddddddS t        | |      \  }}}}}|D cg c]  }t        |d       }}|D cg c]  }t        |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       |j                  d       )|j                  d      }|s#t        d| d|        |j                  d       _t        j                  |      }|r|j                  |       t        d| d       |j                  d        t        |      |k  r|}g }n
|d| }||d }d}t        t        |dd |dd             D ]>  \  }\  }}|d|dz    d|j                  d        d!|j                  d"       d#|dd$  d%	z  }@ d&| d'}|r|d(d)j                  |      z   d'z   z  }|r|d*d)j                  |dd+       z   d'z   z  }t        |      d,kD  r|dd, d-z   }d.d/d0d1d2| d0d1d3|  d4d0g}t         j"                  j$                  j'                  d5|d67      }|j(                  d8   j*                  j,                  j/                         }|||d9d:|d;d<dS c c}w c c}w # t0        $ r-}t2        j5                  d=|        d>g g ddddddcY d}~S d}~ww xY w)?u   FAQ + 원문(문단 단위, 토글) + 매뉴얼을 합쳐 하나의 응답 생성
       출처(page/paragraph)는 '참고자료 보기' 버튼을 눌러야 표시됨
     )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   i,  )r   r   N   u   ⚠️ metas[   ] 항목이 None입니다.   메타데이터 없음r;   u
   ❓ metas[   ]에 'article_id' 없음:    article_id 누락u   ❓ article_id    에 해당하는 원문 없음"   원문을 찾을 수 없습니다.u   [출처 r8   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_smalltalkrU   r   r   r   rQ   printappendrX   r   zipjoinrA   r   r   r   r   r   ra   r   rJ   r>   r?   )r   r   default_open	user_namer   categoryseverityr   st_categorysmalltalk_responsesresponse_textr   r   r   r   r   r   
faq_answeroriginal_paragraphsimetar;   originalopen_paragraphscollapsed_paragraphsrag_contextcombined_contextr   r   r   rZ   s                                  r   hybrid_answerr   
  s   ]
/K/\/\]g/h,(H < U UV^`h i,.13#%"$ #%(*	 	 %6$B$B:$N!kRLU4 X!_T K	# 033K  BU  VM !.,.13#%"$ #%(*	 	 DOzafCg@)Y
L GOOhs%cc:hOGPQy&ss;y	Q 	 M,.13#%"$ #%(*	 	 &j1
 FF *,.13#%"$ #%(*	 	 ! ?LN!;<GAtaS(BCD#**+CD,/J
1#%?vFG#**+>?(,,Z8H#**84
|3QRS#**+OP# =* "#|31O#% 1-<@O#6|}#E  'IbqM:bq>(JKNA{TXacU#dhhy.A-B'$((S\J]I^^bcfgkhkclbmmtuuK L 0
|4@ 7$))O:T TW] ]] 69Ra=9Q QTZ ZZ  5(/7:nn   +k  l*:;K:L(MN*FzlRd(ef

 {{&&-- . 

 ||A..66<<> )(7-AQ1%=$>	
 		
w PQH  
=aSAB G(*-/! !$&	
 		

sT   9L AL >L K;)L /L L L /HL ;
L 	L;"L60L;6L;c                    	 dd|  ddt        |      dg}t        j                  j                  j	                  t
        |d      }|j                  d   j                  j                  j                         sy|j                  d   j                  j                  S # t        $ r"}t        j                  d|        Y d }~y	d }~ww xY w)
Nr   u   [참고지식]
r   r   r   r   r   u   OpenAI API 호출 실패: r   )ro   rA   r   r   r   r$   r   r   ra   r   rJ   r>   r?   )contextr   r   responserZ   s        r   generate_answerr     s    z*:7)(DEZ(@A
 ;;**11! 2 
 "**2288:i"**222 z1!56yzs   A7B :"B 	C&CC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 | j                  dd	      }|j                         st        dd
i      dfS t        j                  d|d d  d       t        |      \  }}t        dj                  |      |      }g }t        |      D ]  \  }}|s+t        j                  d| d       |j                  d       3|j                  d      }|s-t        j                  d| d|        |j                  d       st        j                  |      }	|	r|j                  |	       t        j                  d| d       |j                  d        t        j                  dt!        |       d       t        ||d      S # t"        $ r3}
t        j%                  d|
        t        ddg d      dfcY d }
~
S d }
~
ww xY w)N4   챗봇 서비스가 초기화되지 않았습니다.k   죄송합니다. 챗봇 서비스가 현재 사용할 수 없습니다. 관리자에게 문의해주세요.r?   r   r<     r?   !   요청 데이터가 없습니다.  questionr   u   질문 내용이 없습니다.   챗봇 질문 수신: r:   r   r   zmetas[r   r   r;   r   r   zarticle_id r   r   u   챗봇 응답 완료: u
   개 원문)r   r<   !   챗봇 처리 중 오류 발생: +   서버 내부 오류가 발생했습니다.b   죄송합니다. 일시적인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.  )rA   rH   r   r   get_jsonrU   r   r>   rI   r   r   r   rQ   rO   r   rX   r   rJ   r?   )r   
user_inputr   r   r   original_textsr   r   r;   r   rZ   s              r   ask_chatbot2r     s   6>Z/O H$&  	  !G%HIJCOOXXj"-
!G%EFGLL,Z_,=SAB ,e 4*= 'GAts*DEF%%&>?,/Js*DTFKL%%&9:(,,Z8H%%h/ZL8VWX%%&JK# (& 	,S-@,ALM .
  	
  8<=Bz "
  	 	s/   F? $F? 0F? 5E	F? ?	G;(G60G;6G;z/api/chatbot/askc                     t        j                          } t        j                  j                  dd      }|st	        t        j                               }	 t        j                  d|        t        t        t        ddg d      dfS t        j                         }|st        d      |j                  d	d
      }|j                  dd
      }|j                  dd
      }|j                  d|      }|j                         st        d      t        j                  d|d d  d| d       t        |      rot        j                  d|        t!        |d|       t#        |      }t!        |d|d          t        j                  d       t        i |dt%        |      i      S t!        |d|       |j                         }|r|d|d d z   z  }t'        |d|      }t!        |d|d          t        j                  dt)        t%        |             d       t        j                          | z
  }	t        j                  d|	        t        j                  d | d!|d    d"|        t        i |dt%        |      i      S # t*        $ rC}
t        j-                  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   r:   u   ... (사용자: )u   이모티콘 메시지 감지: r   	assistantr   u   이모티콘 응답 완료historyu   
[첨부파일 내용]
r=   r8   )r   r   u$   챗봇 응답 완료 (대화 이력 u   개)zPOST /api/chatbot/chat, 200, zUser Input: z, Assistant Response: z, Session ID: r   r   r   )
r?   r   r   r   r   r   r   r   r   r  r   )timer   headersrU   struuiduuid4r>   rI   rA   rH   r   r   r   r   r   add_message_to_historyr   get_message_historyr   r   rJ   r?   )
start_timer  r   r   r  r   emoji_answercombined_inputr   response_timerZ   s              r   ask_chatbotr    s    J$$^Y?J&
MFzlST >Z/O H$&  	  !!"EFFXXj"-
xx3HH["-	XXlI6
!"#EFF,Z_,==Mi[XYZ[ !,KK9*FG":vzB/
;L":{L<XYKK45 .z:   	z6:> $))+9L$<OOON~Q)L 	z;~8NO:3?RS]?^;_:``def		j0 	3M?CDl:,.DVNE[D\\jkujvwy 

*:6
  	
  8<=B A(*-/! !$&*:6
   	s,   4J 
DJ 'CJ 	K8KKKuser_idr   ra   c                     | sd} | t         vr	g t         | <   t         |    j                  ||d       t        t         |          t        kD  rt         |    t         d t         | <   yy)uF   사용자별 메시지 이력에 추가 (최근 MAX_HISTORY만 유지)	anonymousr   N)user_message_historyr   r   MAX_HISTORY)r  r   ra   s      r   r  r  Q  si    **(*W%!(($7)KL ()K7(<W(E{lm(TW% 8r   c                 .    t         j                  | g       S )u*   사용자별 메시지 이력 가져오기)r  rU   )r  s    r   r  r  `  s    ##GR00r   r  nreturnc                 f    t         j                  | g       | d  }dj                  d |D              S )N c              3   @   K   | ]  }|j                  d d        yw)ra   r   N)rU   )rg   r   s     r   ri   z*get_recent_context_text.<locals>.<genexpr>f  s     7$QAEE)R($s   )r  rU   r   )r  r  msgss      r   get_recent_context_textr  d  s2    ##J3QBC8D88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   }| j                  dd      }t	        |      }| j                  d      xs | j                  d	      xs d
}t        |d      }t        |||      }	 t        |||| j                  d	      | j                  d      dd      }t        j                  j                  |       t        j                  j                          t        |||d      dfS # t        $ r"}	t        j                  d|	        Y d}	~	7d}	~	ww xY w# t        $ r:}	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_titler?   '   필수 필드가 누락되었습니다.r   gif_urlr   r  r  r     )conversation_contextsentr   )r!  r"  r$  r  r  
usage_typer   u   GIF 사용 추적 실패: N)r   analysisr!     u   GIF 응답 생성 실패: u(   GIF 응답 생성에 실패했습니다.r   )r   r   r   rU   r   r  r   GifUsagedbsessionaddcommitrJ   loggingrO   r?   r	  )
r   r!  r"  r$  r)  r  context_textr   usagerZ   s
             r   generate_gif_responser3  h  s   -S! 4;d#:G%NOPRUUUh%	((9b) 'y1XXl+Qtxx	/BQk
.z1= 5Xy_kl	>#+88L1!E JJNN5!JJ
 % 
  	 		  	>OO8<==	>  S23q6(;<!KLMsRRSsN   *E A)E A-D E 	E D;6E ;E  E 	F/F;FFz/api/chatbot/smalltalk/patternsGETc            
      B   	 t         j                  j                  d      } | rt        j	                  |       }n*t        j
                  D cg c]  }|j                  s| }}t        |D cg c]1  }|j                  |j                  |j                  |j                  d3 c}t        t        j                               t        j                         d      S c c}w c c}w # t        $ r1}t        j!                  d|        t        ddi      dfcY d}~S d}~ww xY w)	u!   스몰토크 패턴 목록 조회r   patternr   descriptionenabled)patterns
categories
statisticsu#   스몰토크 패턴 조회 실패: r?   u$   패턴 조회에 실패했습니다.r   N)r   argsrU   r   get_patterns_by_categoryr:  r9  r   r7  r   r8  r   get_all_categoriesget_statisticsrJ   r>   r?   )r   r:  prZ   s       r   get_smalltalk_patternsrB    s   O<<##J/(AA(KH#4#=#=K#=a#=HK " "A  !yy !

#$== yy	 " 0CCEF+::<
  	 L  O:1#>?!GHI3NNOsB   A	C$ CC!C$ ,6C"7C$ 
C$ $	D-&DDDc                  ,   	 t        j                         } | rd| vrt        ddi      dfS | d   }| j                  dd      }| j                  dd      }| j                  d	d
      }	 t	        j
                  |       t        j                  ||||       t        d||||dd      S # t        j                  $ r}t        dd| i      dfcY d}~S d}~ww xY w# t        $ r1}t        j                  d|        t        ddi      dfcY d}~S d}~ww xY w)u   새 스몰토크 패턴 추가r7  r?   r#  r   r   customr8  u   사용자 정의 패턴r9  Tu   잘못된 정규식 패턴: Nu0   패턴이 성공적으로 추가되었습니다.r6  )r   r7  u#   스몰토크 패턴 추가 실패: u$   패턴 추가에 실패했습니다.r   )r   r   r   rU   recompiler?   r   add_patternrJ   r>   )r   r7  r   r8  r9  rZ   s         r   add_smalltalk_patternrH    s1   O!y,G%NOPRUUUy/88J1hh}.GH((9d+	OJJw 	%%gxgNI"$*"	
  	 xx 	OG'CA3%GHI3NN	O  O:1#>?!GHI3NNOsR   (C ;C 'B' <*C 'C:CCC CC 	D"&DDDz)/api/chatbot/smalltalk/patterns/<pattern>DELETEc                     	 t         j                  |       rt        ddi      S t        ddi      dfS # t        $ r1}t        j                  d|        t        ddi      dfcY d	}~S d	}~ww xY w)
u   스몰토크 패턴 제거r   u0   패턴이 성공적으로 제거되었습니다.r?   "   패턴을 찾을 수 없습니다.  u#   스몰토크 패턴 제거 실패: u$   패턴 제거에 실패했습니다.r   N)r   remove_patternr   rJ   r>   r?   )r7  rZ   s     r   remove_smalltalk_patternrN    sy    O++G4I'YZ[[G%IJKSPP O:1#>?!GHI3NNOs   !3 3 	A-&A("A-(A-z0/api/chatbot/smalltalk/patterns/<pattern>/togglePUTc                 @   	 t        j                         }|j                  dd      }t        j	                  | |      rt        d|rdnd d|d      S t        dd	i      d
fS # t        $ r1}t        j                  d|        t        ddi      dfcY d}~S d}~ww xY w)u*   스몰토크 패턴 활성화/비활성화r9  Tu
   패턴이 u	   활성화u   비활성화u   되었습니다.)r   r9  r?   rK  rL  u#   스몰토크 패턴 토글 실패: u$   패턴 토글에 실패했습니다.r   N)	r   r   rU   r   toggle_patternr   rJ   r>   r?   )r7  r   r9  rZ   s       r   toggle_smalltalk_patternrR    s    O!((9d+++GW='wN'SScd"  
 G%IJKSPP O:1#>?!GHI3NNOs$   AA# A# #	B,&BBBz/api/chatbot/smalltalk/testc                  @   	 t        j                         } | rd| vrt        ddi      dfS | d   }t        j	                  |      \  }}t        |||t        j
                  D cg c]n  }|j                  r`t        j                  |j                  |j                         j                               r$|j                  |j                  |j                  dp c}d      S c c}w # t        $ r1}t        j!                  d|        t        ddi      d	fcY d
}~S d
}~ww xY w)u   스몰토크 패턴 테스트r   r?   u'   테스트할 쿼리가 필요합니다.r   )r7  r   r8  )r   r   r   matched_patternsu&   스몰토크 패턴 테스트 실패: u'   패턴 테스트에 실패했습니다.r   N)r   r   r   r   r   r:  r9  rE  matchr7  r   rf   r   r8  rJ   r>   r?   )r   r   r   r   rA  rZ   s         r   test_smalltalk_patternrV    s   R!wd*G%NOPRUUUW!2!?!?!Fh(  +33! 4A99!))U[[]5H5H5J!K  !yy !

#$==
 4!	
  	!  R=aSAB!JKLcQQRs5   (C# 7C# "A3CC# C# #	D,&DDD)r=   )r   )r   r   r   )   )`r  flaskr   r   r   rL   sysrR   rE  unicodedatadotenvr   rD   chromadb.utilsr   openair   
flask_corsr	   r0  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__r>   
chatbot_bpchatbot_bp2r   r   rM   r#   r$   r%   rG   rn   rk   basicConfigINFOStreamHandlerstdout	getLoggersetLevelr+   handlersetFormatter	Formatter
addHandlerrX   rH   rA   rC   r  r  rb   rI   rJ   rZ   r?   rO   rl   ro   r   r   r   r   r   router   r  r	  r  r  rV   r  r3  rB  rH  rN  rR  rV  r   r   r   <module>rs     s    - - 	 
  	    .  #   (
  @ G T P F 6 
(	#y(+

H-
 ,- :<  +,"))-?+-KL' 	2e    
,,J#g##CJJ/0
	 
		8	$  #g##CJJ/G***+jkl
g			8	$  
		  DN / 0	
KK01 V L0-$^f2a
Fz$ &97 :7r $vh7T  8TlUC Us US U1 18 8 8C 8 -x@/S  A/Sh 3eWEO FO4 3fXFO GOB =zR	O S	O DugVO WO" /&BR CR{  	
LL3A378
NNbc		s   %L M
%MM
