import json

import openai
from colorama import init, Fore
from loguru import logger
import json
from robowaiter.llm_client.tool_register import get_tools, dispatch_tool
import requests
import json

import urllib3
init(autoreset=True)

########################################
#   该文件实现了与大模型的通信以及工具调用
########################################

# 忽略https的安全性警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

base_url = "https://45.125.46.134:25344" # 本地部署的地址,或者使用你访问模型的API地址

def get_response(**kwargs):
    data = kwargs

    response = requests.post(f"{base_url}/v1/chat/completions", json=data, stream=data["stream"], verify=False)
    decoded_line = response.json()
    return decoded_line

functions = get_tools()




if __name__ == "__main__":
    question = input("\n顾客：")
    data_memory = [{
            "role": "system",
            "content": "你是RoboWaiter,一个由HPCL团队开发的机器人服务员，你在咖啡厅工作。接受顾客的指令并调用工具函数来完成各种服务任务。如果顾客问你们这里有什么，或者想要点单，你说我们咖啡厅提供咖啡，水，点心，酸奶等食物。如果顾客不需要你了，你就回到吧台招待。",
        },]
    n = 1
    max_retry = 5
    params = dict(model="RoboWaiter",messages=data_memory, stream=False)
    params["functions"] = functions

    while question != 'end':
        user_dict = {"role": "user", "content": question}
        params["messages"].append(user_dict)

        # print(data_memory)
        response = get_response(**params)
        for _ in range(max_retry):
            if response["choices"][0]["message"].get("function_call"):
                function_call = response["choices"][0]["message"]["function_call"]
                logger.info(f"Function Call Response: {function_call}")

                function_args = json.loads(function_call["arguments"])
                tool_response = dispatch_tool(function_call["name"], function_args)
                logger.info(f"Tool Call Response: {tool_response}")

                return_message = response["choices"][0]["message"]
                params["messages"].append(return_message)
                t = {
                        "role": "function",
                        "name": function_call["name"],
                        "content": tool_response,  # 调用函数返回结果
                    }
                params["messages"].append(t)
                response = get_response(**params)

            else:
                return_message = response["choices"][0]["message"]
                reply = return_message["content"]
                params["messages"].append(return_message)
                logger.info(f"Final Reply: \n{reply}")
                break

        question = input("\n顾客：")
