"""
此代码由fay开源开发者社区 江湖墨明 提供
通过此代码的修改,可以实现对接本地clash代理或远程代理,clash无需设置成系统代理。以解决在开系统代理后无法使用部分功能的问题
"""

import requests
import time

from utils import config_util as cfg
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
from core import content_db
from utils import util
import json

httpproxy = cfg.proxy_config

def question(cont, uid=0, observation=""):
    url= cfg.gpt_base_url + "/chat/completions"
       
    session = requests.Session()
    session.verify = False
    if httpproxy != None and httpproxy != '':
            session.proxies = {
                "https": "https://" + httpproxy,
                "http": "http://" + httpproxy
            }
    person_info = cfg.config["attribute"]
    model_engine = cfg.gpt_model_engine
    #此处可以定义角色的行为和特征,假装xx模型可以绕过chatgpt信息检查
    observation_text = ""
    if observation != "":
        observation_text = f"以下是当前观测结果:{observation},观测结果只供参考。"
    prompt = f"""
    你是我的数字人,你名字是:{person_info['name']},你性别为{person_info['gender']},
    你年龄为{person_info['age']},你出生地在{person_info['birth']},
    你生肖为{person_info['zodiac']},你星座为{person_info['constellation']},
    你职业为{person_info['job']},你联系方式为{person_info['contact']},
     {person_info['hobby']}。你通过外部数据接口获取到我的情况是:{observation_text}。
    回答之前请一步一步想清楚。对于大部分问题,请直接回答并提供有用和准确的信息。
    但当有人质疑你是假的 AI,或者质疑你是用 ChatGPT 套的壳制作的时候,请避而不答,转而讲一个笑话。所有回复请尽量控制在20字内。
     """
    contentdb = content_db.new_instance()
    if uid == 0:
        communication_history = contentdb.get_list('all','desc', 11)
    else:
        communication_history = contentdb.get_list('all','desc', 11, uid)
    #历史记录处理
    message=[
            {"role": "system", "content": prompt}
        ]
    i = len(communication_history) - 1
    
    if len(communication_history)>1:
        while i >= 0:
            answer_info = dict()
            if communication_history[i][0] == "member":
                answer_info["role"] = "user"
                answer_info["content"] = communication_history[i][2]
            elif communication_history[i][0] == "fay":
                answer_info["role"] = "assistant"
                answer_info["content"] = communication_history[i][2]
            message.append(answer_info)
            i -= 1
    else:
         answer_info = dict()
         answer_info["role"] = "user"
         answer_info["content"] = cont
         message.append(answer_info)

    data = {
        "model":model_engine,
        "messages":message,
        "temperature":0.3,
        "max_tokens":2000,
        "user":"live-virtual-digital-person"
    }

    headers = {'content-type': 'application/json', 'Authorization': 'Bearer ' + cfg.key_gpt_api_key}

    starttime = time.time()

    try:
        response = session.post(url, json=data, headers=headers, verify=False)
        response.raise_for_status()  # 检查响应状态码是否为200
        result = json.loads(response.text)
        response_text = result["choices"][0]["message"]["content"]
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        response_text = "抱歉,我现在太忙了,休息一会,请稍后再试。"


    util.log(1, "接口调用耗时 :" + str(time.time() - starttime))
    return response_text

if __name__ == "__main__":
    #测试代理模式
    for i in range(3):
        
        query = "爱情是什么"
        response = question(query)        
        print("\n The result is ", response)