package com.sonic.cow.client.request;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonIgnoreProperties(ignoreUnknown = true)
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ResponseChatCompletionRequest {

    /**
     * 模型的 ID
     */
    private String model;

    /**
     * 输入的内容
     */
    private List<InputRequest> input;

    /**
     * 系统提示词
     */
    private String instructions;

    /**
     * 上一次的响应 ID
     */
    @JsonProperty("previous_response_id")
    private String previousResponseId;

    /**
     * 设置存储的有效期，对 store 和 caching 都生效。需传入 UTC Unix 时间戳（单位：秒）。默认值和最大值都是当前时间加 3 天。
     * 注意：不满 1 小时按 1 小时计费。
     */
    @JsonProperty("expire_at")
    private Integer expireAt;

    /**
     * 模型输出最大 token 数，包含模型回答和思维链内容
     */
    @JsonProperty("max_output_tokens")
    private Integer maxOutputTokens;

    /**
     * 模型是否开启深度思考模式。默认开启深度思考模式，可以手动关闭
     */
    private Thinking thinking;

    /**
     * 是否开启缓存
     */
    private Caching caching;

    /**
     * 是否储存生成的模型响应，以便后续通过 API 检索。
     * false：不储存，对话内容不能被后续的 API 检索到。
     * true：储存当前模型响应，对话内容能被后续的 API 检索到。
     */
    private Boolean store;

    /**
     * 响应内容是否流式返回：
     * false：模型生成完所有内容后一次性返回结果。
     * true：按 SSE 协议逐块返回模型生成内容，并以一条 data: [DONE]消息结束。
     */
    private Boolean stream;

    /**
     * 温度值[0-2],默认 1
     */
    private Float temperature;

    /**
     * 采样概率
     */
    @JsonProperty("top_p")
    private Float topP;

    /**
     * 模型文本输出的格式定义，可以是自然语言，也可以是结构化的 JSON 数据。详情请看结构化输出。
     */
    private Text text;

    /**
     * 模型可以调用的工具列表
     */
    private List<Tools> tools;
}
