package com.qmth.boot.core.ai.client;

import com.qmth.boot.core.ai.config.LlmApiConfiguration;
import com.qmth.boot.core.ai.model.AiConstants;
import com.qmth.boot.core.ai.model.llm.*;
import com.qmth.boot.core.retrofit.annotatioin.RetrofitClient;
import com.qmth.boot.core.retrofit.utils.SignatureInfo;
import retrofit2.http.Body;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Tag;

/**
 * 大模型应用服务接口
 */
@RetrofitClient(configuration = LlmApiConfiguration.class)
public interface LlmApiClient {

    /**
     * 大模型chat类型请求
     *
     * @param baseUrl   接口前缀地址，默认取配置文件的值（选填）
     * @param signature 使用机构AK构造Secret类型签名
     * @param type      大模型应用类型
     * @param request   标准chat请求对象
     * @return
     */
    @POST(AiConstants.LLM_CHAT_PATH)
    ChatResult chat(@Header(AiConstants.BASE_URL) String baseUrl, @Tag SignatureInfo signature,
                    @Header(AiConstants.LLM_APP_TYPE) LlmAppType type,
                    @Body ChatRequest request);

    /**
     * 基于Prompt模版的大模型chat类型请求
     *
     * @param baseUrl   接口前缀地址，默认取配置文件的值（选填）
     * @param signature 使用机构AK构造Secret类型签名
     * @param type      大模型应用类型
     * @param param     模版变量
     * @return
     */
    @POST(AiConstants.LLM_CHAT_TEMPLATE_PATH)
    ChatResult chatTemplate(@Header(AiConstants.BASE_URL) String baseUrl, @Tag SignatureInfo signature,
                            @Header(AiConstants.LLM_APP_TYPE) LlmAppType type,
                            @Body Object param);

    /**
     * 大模型接口余额查询
     *
     * @param baseUrl   接口前缀地址，默认取配置文件的值（选填）
     * @param signature 使用机构AK构造Secret类型签名
     * @param type      大模型应用类型
     * @return
     */
    @POST(AiConstants.LLM_BALANCE_PATH)
    LlmAppBalance getBalance(@Header(AiConstants.BASE_URL) String baseUrl, @Tag SignatureInfo signature,
                             @Header(AiConstants.LLM_APP_TYPE) LlmAppType type);

    /**
     * 大模型提示词模版获取
     *
     * @param baseUrl   接口前缀地址，默认取配置文件的值（选填）
     * @param signature 使用机构AK构造Secret类型签名
     * @param type      大模型应用类型
     * @return
     */
    @POST(AiConstants.LLM_PROMPT_TEMPLATE_PATH)
    PromptTemplate getPromptTemplate(@Header(AiConstants.BASE_URL) String baseUrl, @Tag SignatureInfo signature,
                                     @Header(AiConstants.LLM_APP_TYPE) LlmAppType type);

}
