
    Fh	                     h   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m	Z	 d dl
mZ d dlZd dlZddlmZ d dlmZ  e	             dZd	Zd
Z e j        d          Zd ddg fdedej        dedefdZefdedefdZ	 d!dedej        dedededefdZefdedefdZd Zeddfdededededef
d Z dS )"    N)display)load_dotenv)spatial   )get_openai_client)datetimeztext-embedding-3-smallcl100k_basei@  	GPT_MODELc                 H    dt           j                            | |          z
  S Nr   )r   distancecosine)xys     K/Users/gualin/Documents/wsky_tg_auto_maintain/openai_config/openai_utils.py<lambda>r      s    Q)9)@)@1)E)E%E     d   Fquerydftop_nshow_relatednessesc           	         t                      }|j                            | gt                    }|j        d         j        fd|                                D             }d |D             }	|	                    d d           |	s6t          d t          d	t                    z             D                       S t          |	 }
t          |
          }
t          d
 t          |
d         |
d                   D                       |
d<   t          d|
d                     t          fd|
D                       S )Ninputmodelr   c                     g | ];\  }d           d                   ft          fdD                       z   <S )combinedada_embeddingc              3   (   K   | ]}|         V  d S N ).0colrows     r   	<genexpr>z;strings_ranked_by_relatedness.<locals>.<listcomp>.<genexpr>(   s+      V~V~dgWZ[^W_V~V~V~V~V~V~r   )tuple)r#   ir%   additional_columnsquery_embeddingrelatedness_fns     @r   
<listcomp>z1strings_ranked_by_relatedness.<locals>.<listcomp>'   sl     ! ! !
!S :O8LMMNQVV~V~V~V~k}V~V~V~Q~Q~~! ! !r   c                 *    g | ]}|d          dk    |S )r   g333333?r"   )r#   items     r   r,   z1strings_ranked_by_relatedness.<locals>.<listcomp>,   s(     * * *d1gnnnnnr   c                     | d         S r   r"   r   s    r   r   z/strings_ranked_by_relatedness.<locals>.<lambda>0   s
    1 r   T)keyreversec              3      K   | ]}g V  d S r!   r"   )r#   _s     r   r&   z0strings_ranked_by_relatedness.<locals>.<genexpr>3   s"      DDARDDDDDDr      c              3   F   K   | ]\  }}| d t          |d           V  dS )u    相關係數:    N)round)r#   qrels      r   r&   z0strings_ranked_by_relatedness.<locals>.<genexpr>8   s<      hhC1<<U3]]<<hhhhhhr   r      相關係數: c              3   ,   K   | ]}|d          V  d S r!   r"   )r#   resultr   s     r   r&   z0strings_ranked_by_relatedness.<locals>.<genexpr><   s+      66F666666r   )r   
embeddingscreateEMBEDDING_MODELdata	embeddingiterrowssortr'   rangelenziplistprint)r   r   r+   r   r   r)   clientquery_embedding_responsestrings_and_relatednesses"filtered_strings_and_relatednessesresultsr*   s     `` `     @r   strings_ranked_by_relatednessrP      s      F%077  8     /3A6@O! ! ! ! ! !KKMM! ! !
* *2* * *& '++d+KKK- EDDq3/A+B+B'B!C!CDDDDDD56G7mmGhh3wWY{\cde\fKgKghhhhhGBK	
'71:
'
'((( 6666g666666r   textr   c                 n    t          j        |          }t          |                    |                     S r!   )tiktokenencoding_for_modelrG   encode)rQ   r   encodings      r   
num_tokensrW   ?   s,    *511Hxt$$%%%r    token_budgetintroductionreturnc                     t          | |dd          \  }}|}|  }|}t          d|            t          |          dk    rdS |D ]*}	d|	 d}
t          ||
z   |z   |	          |k    r n||
z  }+||z   S )
N   T)r   r   r<   r      無法辨識z!

Wikipedia article section:
"""
z
""")r   )rP   rJ   rG   rW   )r   r   r   rY   rZ   stringsrelatednessesquestionmessagestringnext_articles              r   query_messagere   C   s     ;5"AaefffG]LzHG	
*=
*
*+++
7||q $ $LvLLLw-8FFF  E|#GGXr   c                     t                      }|                     dd          } |j                            | g|          j        d         j        S )N
 r   r   )r   replacer?   r@   rB   rC   )rQ   r   rK   s      r   get_embeddingrj   ^   sY      F<<S!!D## $   1 r   c                     t           j                            d          r=t          j        d          } | j                            t          j                  | d<   | S t          j        d          } | g d         } d| d         z   dz   dz   | d	         z   dz   d
z   | d         z   | d<   d}t          j
        t                    | j                            fd          | d<   | | j        t          k                                 |          } | j                            d           | d<   |                     dd           t#          d           | S )Nu   data/維護訊息_embedding.csvr   u   data/維護訊息22.csv)   類型   訊息內容   遊戲平台u   問題類型為: rl   z



u   內容訊息為: rm   u   遊戲平台為: rn   r   r   c                 H    t                              |                     S r!   )rG   rU   )r   rV   s    r   r   z3load_or_create_maintain_embedding.<locals>.<lambda>v   s    S9K9K5L5L r   n_tokensc                 ,    t          | t                    S r!   )rj   rA   r0   s    r   r   z3load_or_create_maintain_embedding.<locals>.<lambda>x   s    -/:Z:Z r   F)indexz!!)ospathexistspdread_csvr   applyastliteral_evalrS   rT   rA   r   rp   
MAX_TOKENStailto_csvrJ   )r   r   rV   s     @r   !load_or_create_maintain_embeddingr~   f   sY   	w~~788 [:;; .44S5EFF?	[2338889"X,.; "$^"457AB "$^"45 	: .??**+L+L+L+LMM:z)*//66 k//0Z0Z[[?
		3%	@@@d	r   i  print_messagec                    t                      }t                      }t          j                    }|                    d          }|                    d          }t          |            t          | |||d|  d| d| d| d| d|  d	
          }	|rt          |	           |	dk    rd}	dddd|	dg}
|j        j        	                    ||
d          }|j
        d         j        j        }t          |           |S )Nz%Y-%m-%dz%H:%M:%Su  
            使用這份csv的“訊息內容”，
            先判斷出“訊息內容”的類型是什麼，
            訊息內沒有提及”維護“，以及符合”遊戲平台“的字眼的話，那他通常不是維護訊息，
            請你自行判斷u  裡面的維護時間，不要直接回傳csv檔案裡面的訊息，那只是給你參考用的
            而不是csv裡面的時間，
            如果類型為“維護訊息”請遵循以下規定：
                找出使用者回傳最相關的那列，
                並且將“訊息內容”整理出一個資訊：遊戲平台
                請注意，
                我要你自己從用戶傳的訊息判斷出“開始維護”和“結束維護”是什麼時候，
                如果內容有多個時間的話，關鍵字要找“遊戲”之類的，
                我提供你一些建議：
                    1. 03:00 a.m. - 12:00 p.m. 的維護時間代表 03:00:00 - 12:00:00
                    2. 05/02 (一) 1:00 的維護時間代表 2025-05-02 01:00:00
                ----    
                如果內容沒有開始日期的資訊，
                請自動將時間設為u   ，格式為YYYY-MM-DD
                如果內容沒有結束日期的資訊，且訊息內容沒有描述結束時間的資訊，
                請自動將時間設為u  +1天，格式為YYYY-MM-DD，
                請注意，如果有明確的結束時間，通常結束日期會跟開始日期相同，
                例如：
                ※ 5/2 星期一 02:00-20:30，那麼結束日期就是2025-05-02
                ※ 5/2(一) 05:00AM-14:30PM，那麼結束日期就是2025-05-02
                ----
                如果內容沒有開始時間的資訊，
                請自動將時間設為ux   ，格式為HH:mm:ss
                如果內容沒有結束時間的資訊，
                請自動將時間設為uv  +1天，格式為HH:mm:ss
                                
                回傳“類型”,“遊戲平台”,“開始日期”,“開始時間”,“結束日期“,”結束時間“,“用戶傳過來的訊息”
                例如:
                    訊息種類：[類型]

                    遊戲平台：ATG

                    開始日期：2025-10-01

                    開始時間：00:00:00

                    結束日期：2025-10-02

                    結束時間：00:00:00

                                
                    ----------------------------
                    原始訊息：ur  
                            
            如果類型為你沒有看過的資訊請遵循以下規定：
                回傳
                例如:
                    訊息種類：未知

                                
                    ----------------------------
                    原始訊息：[“用戶回傳的訊息”]           
                )r   rY   rZ   r^   u   無法回答systemu   
            請根據使用者送出的訊息回答最相關的答案，
            如果訊息相關度不高或是具有冒犯性的話，
            請回覆“無法回答”。
       )rolecontentuserr   )r   messagestemperature)r~   r   r   nowstrftimerJ   re   chatcompletionsr@   choicesrb   r   )r   r   rY   r   r   rK   r   fmt_time_datefmt_time_timerb   r   responseresponse_messages                r   askr   ~   s    
+	,	,B  F
,..CLL,,MLL,,M	%LLLE"5l 1Y  %	1Y 1Y" *7#1Y 1Y& *7'1Y 1Y4 *751Y 1Y8 *791Y 1YP %*Q1Y 1Y 1Y 1 1 1Gd  Gnnn.    %  
 '**H {&-- .  H
  '*2:	
r   )rX   )!rs   sysry   csvnumpynpIPython.displayr   dotenvr   scipyr   pandasrv   rS   openai_connectr   r   rA   EMBEDDING_ENCODINGr{   getenvr
   str	DataFrameintboolrP   rW   re   rj   r~   r   r"   r   r   <module>r      sI   				 



 



 



     # # # # # #                  - - - - - -       *" 
BIk""	 FE"'$7 $7$7<$7 	$7
  $7 $7 $7 $7N %. & &C &c & & & &  
	|  	
  	   6 (7  s       4 "	R R
R
R R 	R
 	R R R R R Rr   