#ifndef LLMAGENT_H
#define LLMAGENT_H

#include "agent.h"
#include "model/abstractchatmodel.h"

#include <QObject>
#include <QString>
#include <QJsonArray>
#include <QJsonObject>
#include <QSharedPointer>

namespace uos_ai {

class LlmAgent : public QObject, public Agent
{
    Q_OBJECT
public:
    explicit LlmAgent(QObject *parent = nullptr);
    ~LlmAgent() override;

    /**
     * 初始化智能体
     * @returns {bool} 是否成功
     */
    virtual bool initialize();

    /**
     * 设置模型服务
     * @param {QSharedPointer<AbstractChatModel>} llm - 模型服务的共享指针
     */
    virtual void setModel(QSharedPointer<AbstractChatModel> llm);

    /**
     * 设置模型参数
     * @param {QVariantHash} params - 模型原生参数，包含模型的配置信息
     */
    virtual void setModelParams(const QVariantHash &params);

    /**
     * 处理用户请求
     * 处理来自用户的请求，包括文本对话和工具调用
     * @param {ModelMessage} question - 当前请求内容，包含用户的问题和相关参数
     * @param {QList<ModelMessage>} history - 聊天消息记录，包含之前的对话历史
     * @param {QVariantHash} params - 扩展参数，包含额外的配置信息
     * @returns {QVariantHash} 智能体工作流输出的消息记录
     */
    QVariantHash processRequest(const ModelMessage &question, const QList<ModelMessage> &history, const QVariantHash &agentParams = {}) override;

    /**
     * 获取最后一次错误信息
     * @returns {QVariantHash} 包含错误类型和错误消息的哈希表
     */
    virtual QVariantHash lastError() const;

Q_SIGNALS:
    /**
     * 当有新的聊天增量内容可读时发出此信号
     * @param {RenderessageList} msgs - 增量消息列表，包含新的文本或工具调用结果
     */
    void messageReceived(const RenderMessageList &msgs);

public Q_SLOTS:
    /**
     * 取消当前请求
     * 中断正在进行的LLM请求处理
     */
    virtual void cancel();

    /**
     * 执行回调
     * 处理agent工作流中需要用户介入的回调的请求
     * @param {QJsonObject} action - 回调请求的JSON对象，包含请求类型和参数
     */
    virtual void invokeAction(const QJsonObject &action);
protected:
    /**
     * 初始化聊天记录
     * 将用户请求和历史记录整合成完整的聊天消息数组
     * @param {ModelMessage} question - 当前请求内容
     * @param {QList<ModelMessage>} history - 历史消息记录
     * @returns {QList<ModelMessage>} 初始化后的消息数组，包含系统提示、历史记录和当前请求
     */
    virtual QList<ModelMessage> initChatMessages(const ModelMessage &question, const QList<ModelMessage> &history) const;

    /**
     * 处理模型流式输出的内容
     * 解析模型的流式输出，识别文本内容和工具调用
     * @param {OutputCtx *} ctx - 上下文
     * @returns {bool} 处理是否成功，true表示成功处理，false表示处理失败
     */
    virtual bool handleStreamOutput(const MetaMessageList &msgs);

    /**
     * 调用工具
     * 执行指定的工具调用，传递相应的参数
     * @param {QString} toolName - 要调用的工具名称
     * @param {QJsonObject} params - 工具调用所需的参数
     * @returns {QPair<int, QString>} 工具调用的结果，包含状态码和返回内容
     *          状态码：0表示成功，非0表示错误
     *          QString：工具调用的返回内容或错误信息
     */
    virtual QPair<int, QString> callTool(const QString &toolName, const QJsonObject &params);
protected:
    bool canceled = false; // 是否取消
    QSharedPointer<AbstractChatModel> m_llm; // 模型服务
    QVariantHash m_modelParams; // 模型原生参数
};

} // namespace uos_ai

#endif // LLMAGENT_H 
