o
    ?Gh	                     @   s@  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 dZdd ddg fdedejdedefddZefdedefddZ	d(dedejdedededefddZefdedefd d!Zd"d# Zed$dfdededed%edef
d&d'Z dS ))    N)display)load_dotenv)spatial   )get_openai_client)datetimeztext-embedding-3-smallcl100k_basei@  	GPT_MODELc                 C   s   dt j| | S Nr   )r   distancecosine)xy r   ;/var/www/html/tg_maintain_bot/openai_config/openai_utils.py<lambda>   s    r   d   Fquerydftop_nshow_relatednessesc                    s   t  }|jj| gtd}|jd j fdd| D }dd |D }	|	jdd dd	 |	s@td
d t	dt
  D S t|	 }
t|
}
tdd t|
d |
d D |
d< td|
d   tfdd|
D S )Ninputmodelr   c                    s<   g | ]\}  d   d ft  fddD  qS )combinedada_embeddingc                 3   s    | ]} | V  qd S Nr   ).0colrowr   r   	<genexpr>(   s    z;strings_ranked_by_relatedness.<locals>.<listcomp>.<genexpr>)tuple)r   i)additional_columnsquery_embeddingrelatedness_fnr   r   
<listcomp>'   s    *z1strings_ranked_by_relatedness.<locals>.<listcomp>c                 S   s   g | ]
}|d  dkr|qS )r   g333333?r   )r   itemr   r   r   r'   ,   s    c                 S   s   | d S r
   r   r   r   r   r   r   0   s    z/strings_ranked_by_relatedness.<locals>.<lambda>T)keyreversec                 s   s    | ]}g V  qd S r   r   )r   _r   r   r   r!   3   s    z0strings_ranked_by_relatedness.<locals>.<genexpr>   c                 s   s(    | ]\}}| d t |d V  qdS )u    相關係數:    N)round)r   qrelr   r   r   r!   8   s   & r      相關係數: c                 3   s    | ]	}|d   V  qd S r   r   )r   result)r   r   r   r!   <   s    )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   )r$   r%   r&   r   r   strings_ranked_by_relatedness   s(   $rF   textr   c                 C   s   t |}t|| S r   )tiktokenencoding_for_modelr=   encode)rG   r   encodingr   r   r   
num_tokens?   s   
rL    token_budgetintroductionreturnc                 C   s   t | |ddd\}}|}|  }|}td|  t|dkr dS |D ]}	d|	 d}
t||
 | |d	|kr; || S ||
7 }q"|| S )
N   T)r   r   r3   r      無法辨識z!

Wikipedia article section:
"""
z
""")r   )rF   r@   r=   rL   )r   r   r   rN   rO   stringsrelatednessesquestionmessagestringnext_articler   r   r   query_messageC   s    
rY   c                 C   s,   t  }| dd} |jj| g|djd jS )N
 r   r   )r   replacer5   r6   r8   r9   )rG   r   rA   r   r   r   get_embedding^   s   r]   c                     s   t jdrtd} | jtj| d< | S td} | g d } d| d  d d | d	  d d
 | d  | d< d}t	
t | j fdd| d< | | jtk |} | jdd | d< | jddd td | S )Nu   data/維護訊息_embedding.csvr   u   data/維護訊息22.csv)   類型   訊息內容   遊戲平台u   問題類型為: r^   z



u   內容訊息為: r_   u   遊戲平台為: r`   r   r   c                    s   t  | S r   )r=   rJ   r)   rK   r   r   r   v   s    z3load_or_create_maintain_embedding.<locals>.<lambda>n_tokensc                 S   s
   t | tS r   )r]   r7   r)   r   r   r   r   x   s   
 F)indexz!!)ospathexistspdread_csvr   applyastliteral_evalrH   rI   r7   r   rb   
MAX_TOKENStailto_csvr@   )r   r   r   ra   r   !load_or_create_maintain_embeddingf   s4   


ro   i  print_messagec                 C   s   t  }t }t }|d}|d}t|  t| |||d|  d| d| d| d| d|  d	d
}	|r:t|	 |	dkr@d}	dddd|	dg}
|jjj	||
d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   rN   rO   rR   u   無法回答systemu   
            請根據使用者送出的訊息回答最相關的答案，
            如果訊息相關度不高或是具有冒犯性的話，
            請回覆“無法回答”。
       )rolecontentuserr   )r   messagestemperature)ro   r   r   nowstrftimer@   rY   chatcompletionsr6   choicesrV   rs   )r   r   rN   rp   r   rA   rw   fmt_time_datefmt_time_timerV   ru   responseresponse_messager   r   r   ask~   sD   

(2r   )rM   )!rd   sysrj   csvnumpynpIPython.displayr   dotenvr   scipyr   pandasrg   rH   openai_connectr   r   r7   EMBEDDING_ENCODINGrl   getenvr	   str	DataFrameintboolrF   rL   rY   r]   ro   r   r   r   r   r   <module>   sz    

'	
