package cn.teammodel.ai.domain;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Builder.Default;
import lombok.Data;

import java.util.List;

/**
 * 调用星火大模型需要向其 endpoint 传递的参数
 * @author winter
 * @create 2023-12-15 16:04
 */
@Data
@Builder
// 注意这两个注解一起使用会让无参构造丢失
public class SparkChatRequestParam {
    //应用appid，从开放平台控制台创建的应用中获取
    private String appId;
    //每个用户的id，用于区分不同用户
    private String uid;
    //指定访问的领域,general指向V1.5版本 generalv2指向V2版本。注意：不同的取值对应的url也不一样！
    @Default
    private String domain = "generalv3";
    //核采样阈值。用于决定结果随机性，取值越高随机性越强即相同的问题得到的不同答案的可能性越高
    @Default
    private Float temperature = 0.5F;
    //模型回答的tokens的最大长度
    @Default
    private Integer maxTokens = 2048;
    //从k个候选中随机选择⼀个（⾮等概率）
    @Default
    private Integer top_k = 4;
    /**
    * 用于关联用户会话 (sessionId)
    */
    private String chatId;
    private List<Message> messageList;


    @Data
    @AllArgsConstructor
    public static class Message {
        private String role;
        private String content;
        private String model;
       
        /**
        * 一个类下面有两种类型的对象,使用静态的对象产生方法,好思路
        */
        public static Message ofUser(String content,String model){
            return new Message("user",content,model);
        }

        public static Message ofAssistant(String content, String model){
            return new Message("assistant",content,model);
        }
    }

    public String toJsonParams(){
        ObjectMapper om = new ObjectMapper();
        ObjectNode root = om.createObjectNode();
        ObjectNode header = om.createObjectNode();
        header.put("app_id",appId);
        header.put("uid",uid);
        ObjectNode parameter = om.createObjectNode();
        ObjectNode chat = om.createObjectNode();
        chat.put("domain", domain);
        chat.put("temperature", temperature);
        chat.put("max_tokens", maxTokens);
        chat.put("top_k", top_k);
        chat.put("chat_id", chatId);
        parameter.set("chat", chat);

        ObjectNode payload = om.createObjectNode();
        payload.set("message", om.createObjectNode().putPOJO("text", messageList));

        root.set("header", header);
        root.set("parameter", parameter);
        root.set("payload", payload);
        return root.toString();
    }

}
