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 signature 使用机构AK构造Secret类型签名
     * @param type      大模型应用类型
     * @param request   标准chat请求对象
     * @return
     */
    @POST(AiConstants.LLM_CHAT_PATH)
    ChatResult chat(@Tag SignatureInfo signature, @Header(AiConstants.LLM_APP_TYPE_HEADER) LlmAppType type,
            @Body ChatRequest request);

    /**
     * 基于Prompt模版的大模型chat类型请求
     *
     * @param signature 使用机构AK构造Secret类型签名
     * @param type      大模型应用类型
     * @param param     模版变量
     * @return
     */
    @POST(AiConstants.LLM_CHAT_TEMPLATE_PATH)
    ChatResult chatTemplate(@Tag SignatureInfo signature, @Header(AiConstants.LLM_APP_TYPE_HEADER) LlmAppType type,
            @Body Object param);

    /**
     * 大模型接口余额查询
     *
     * @param signature 使用机构AK构造Secret类型签名
     * @param type      大模型应用类型
     * @return
     */
    @POST(AiConstants.LLM_BALANCE_PATH)
    LlmAppBalance getBalance(@Tag SignatureInfo signature, @Header(AiConstants.LLM_APP_TYPE_HEADER) LlmAppType type);

    /**
     * 大模型提示词模版获取
     *
     * @param signature 使用机构AK构造Secret类型签名
     * @param type      大模型应用类型
     * @return
     */
    @POST(AiConstants.LLM_PROMPT_TEMPLATE_PATH)
    PromptTemplate getPromptTemplate(@Tag SignatureInfo signature,
            @Header(AiConstants.LLM_APP_TYPE_HEADER) LlmAppType type);

}
