MOOON-agent发布:MOOON-agent系统设计与使用说明

简介:  MOOON-agent系统设计与使用说明.pdf   MOOON-agent系统设计与使用说明易剑 2012/6/16目录1. 设计目标 12. 应用场景 23. 主要功能 24. 系统骨架 35. 资源接口 36. 内置CommandProcessor 37. 编程接口 37.1. agent.h 47.2. message.h 57.3. message_command.h 57.4. command_processor.h 68. 编程示例 71. 设计目标一个通用的agent框架,提供编程接口,并内置通用的功能。
    

1.  设计目标

一个通用的agent框架,提供编程接口,并内置通用的功能。

2.  应用场景

3.  主要功能

1) 自动上报心跳

2) 支持以域名方式指定center或者IP列表方式指定center

3) center断开后自动重连接

4) 支持多种重连接center策略,如轮询方式

5) 自动上报数据到center

6) 可选多种心跳方式,简单心跳不附带数据,富心跳可携带系统状态数据,如CPU使用率、内存使用情况等

7) 提供获取CPU使用率、内存使用情况和流量等接口

8) 内置配置等CommandProessor,常用需求不用编程直接使用

9) 非单例,单个进程可创建多个agent实例

4.  系统骨架

5.  资源接口

暂略。

6.  内置 CommandProcessor

暂略。

7.  编程接口

除宏外,所以内容均位于agent名字空间内。

7.1.  agent.h

/***

  * 常量定义

  */

enum

{

REPORT_MAX = 10240 /** 一次report的最大字节数 */

};

class IAgent

{

public:

    virtual ~IAgent() {}

    virtual void set_center(const std::string& domainname_or_iplist, uint16_t port) = 0;  


    /***

      * 上报数据给center,report调用只是将数据存放上报队列中,由agent异步上报

      * @data 需要上报的数据

      * @data_size 需要上报的数据字节数

      * @timeout_millisecond 超时毫秒数,

      *  当队列满时,如果超时毫秒数为0,则直接返回,数据不会被放入上报队列中;

      *  当队列满时,如果timeout_millisecond不为0,则等待指定的时长,如果在指定的时长内,

      *  上报队列一直是满的,则返回,并且数据不会被放入上报队列中

      */

    virtual bool report(const char* data, size_t data_size, uint32_t timeout_millisecond=0) = 0;

    virtual bool report(uint32_t timeout_millisecond, const char* format, ...) = 0;


    virtual bool register_command_processor(ICommandProcessor* processor) = 0;

    virtual void deregister_command_processor(ICommandProcessor* processor) = 0;

};

/***

  * 日志器,所以分发器实例共享

  * 如需要记录日志,则在调用create之前,应当先设置好日志器

  */

extern sys::ILogger* logger;

/***

  * 用来创建agent实例,注意agent不是单例,允许一个进程内有多个实例

  * @queue_size 上报队列大小,如果队列满,会导致消息丢失或report调用阻塞

  * @connect_timeout_milliseconds 与center连接的超时毫秒数,如果在这个时间内没有数据上报,

  *                               则会自动发送心跳消息,否则不会发送心跳消息

  */

extern IAgentcreate(uint32_t queue_size, uint32_t connect_timeout_milliseconds);

/** 销毁一个agent实例 */

extern void destroy(IAgent* agent);

7.2. message.h

#pragma pack(4) // 网络消息按4字节对齐

/***

  * Agent消息头

  */

typedef struct TAgentMessageHeader

{

    NUInt32 size;     /** 消息包字节数 */

    NUInt32 command;  /** 消息的命令字 */

}agent_message_header_t;

/***

  * 简单的心跳消息,仅一个消息头

  */

typedef struct TSimpleHeartbeatMessage

{

    agent_message_header_t header;

}simple_heartbeat_message_t;

/***

  * 上报消息

  */

typedef struct TReportMessage

{

    agent_message_header_t header;

    char data[0]; /** 需要上报的内容 */

}report_message_t;

#pragma pack()

7.3. message_command.h

/***

  * 上行消息命令字

  */

typedef enum TUplinkMessageCommand

{

    U_SIMPLE_HEARTBEAT_MESSAGE = 1, /** 简单心跳消息 */

    U_REPORT_MESSAGE           = 2  /** 上报消息 */

}uplink_message_command_t;

/***

  * 下行消息命令字,由ICommandProcessor处理

  */

typedef enum TDownlinkMessageCommand

{

}downlink_message_command_t;

7.4. command_processor.h

/***

  * 消息上下文结构

  * 由于是异步接收消息的,所以需要一个上下文结构来保存最新状态

  */

typedef struct TMessageContext

{

    size_t total_size;   /** 消息体的字节数 */

    size_t finished_size/** 已经收到的消息体字节数 */

    

    TMessageContext(size_t total_size_, size_t finished_size_)

     :total_size(total_size_)

     ,finished_size(finished_size_)

    {

    }

}message_context_t;

class ICommandProcessor

public:

    virtual ~ICommandProcessor() {}

    /***

      * 返回该CommandProcessor处理的命令字

      */

    virtual uint32_t get_command() const = 0;

    /***

  * 有消息需要处理时的回调函数

  * 请注意消息的接收是异步的,每收到一点消息数据,都会回调on_message

  * 整个消息包接收完成的条件是msg_ctx.total_size和msg_ctx.finished_size+buffer_size两者相等

  * @buffer 当前收到的消息体数据

  * @buffer_size 当前收到的消息体数据字节数

  * @return 如果消息处理成功,则返回true,否则返回false,当返回false时,会导致连接被断开进行重连接

  */

    virtual bool on_message(const TMessageContext& msg_ctx, const char* buffer, size_t buffer_size) = 0;

};

8. 编程示例

// 命令字1的CommandProcessor

class CCommandProcessor1public ICommandProcessor

private:

    virtual uint32_t get_command() const

    {

        return 1;

    }

    

    virtual bool on_message(const TMessageContext& msg_ctx, const char* buffer, size_t buffer_size)

    {

        fprintf(stdout, "[%zu:%zu] %.*s\n", msg_ctx.total_size, msg_ctx.finished_size, (int)buffer_size, buffer);

        return true;

    }

};

// 命令字2的CommandProcessor

class CCommandProcessor2public CCommandProcessor1

{

private:

    virtual uint32_t get_command() const

    {

        return 2;

    }

};

// 命令字3的CommandProcessor

class CCommandProcessor3public CCommandProcessor1

{

private:

    virtual uint32_t get_command() const

    {

        return 3;

    }

};

class CMainHelperpublic sys::IMainHelper

{

public:

    CMainHelper()

     :_agent(NULL)

    {

    }

    

private:

    virtual bool init(int argc, char* argv[])

    {

        uint32_t queue_size = 100;

        uint32_t connect_timeout_milliseconds = 2000;

        

        _agent = agent::create(queue_size, connect_timeout_milliseconds);

        if (NULL == _agent)

        {

            return false;

        }

        

        _agent->register_command_processor(&_command_processor1);

        _agent->register_command_processor(&_command_processor2);

        _agent->register_command_processor(&_command_processor3);

        _agent->set_center(ArgsParser::center_ip->get_value(), 

                           ArgsParser::center_port->get_value());

        std::string report("test");

        while (true)

        {

            sys::CUtil::millisleep(3000);

            _agent->report(report.data(), report.size());

        }

        

        return true;

    }

    

    virtual void fini()

    {

        agent::destroy(_agent);

        _agent = NULL;

    }

    

    virtual int get_exit_signal() const

{

return SIGTERM;

}

private:

    agent::IAgent_agent;

    CCommandProcessor1 _command_processor1;

    CCommandProcessor2 _command_processor2;

    CCommandProcessor3 _command_processor3;

};

// 入口函数

extern "C" int main(int argc, char* argv[])

{

    if (!ArgsParser::parse(argc, argv))

    {

        fprintf(stderr, "Args error: %s.\n"ArgsParser::g_error_message.c_str());

        exit(1);

    }

    

    CMainHelper main_helper;

    return sys::main_template(&main_helper, argc, argv);

}

相关文章
|
数据采集 存储 自然语言处理
基于Qwen2.5的大规模ESG数据解析与趋势分析多Agent系统设计
2022年中国上市企业ESG报告数据集,涵盖制造、能源、金融、科技等行业,通过Qwen2.5大模型实现报告自动收集、解析、清洗及可视化生成,支持单/多Agent场景,大幅提升ESG数据分析效率与自动化水平。
759 0
|
存储 人工智能 自然语言处理
AI经营|多Agent择优生成商品标题
商品标题中关键词的好坏是商品能否被主搜检索到的关键因素,使用大模型自动优化标题成为【AI经营】中的核心能力之一,本文讲述大模型如何帮助商家优化商品素材,提升商品竞争力。
1307 62
AI经营|多Agent择优生成商品标题
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
Gemini 2.0:谷歌推出的原生多模态输入输出 + Agent 为核心的 AI 模型
谷歌最新推出的Gemini 2.0是一款原生多模态输入输出的AI模型,以Agent技术为核心,支持多种数据类型的输入与输出,具备强大的性能和多语言音频输出能力。本文将详细介绍Gemini 2.0的主要功能、技术原理及其在多个领域的应用场景。
1121 20
Gemini 2.0:谷歌推出的原生多模态输入输出 + Agent 为核心的 AI 模型
|
11月前
|
人工智能 自然语言处理 前端开发
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
Director 是一个构建视频智能体的 AI 框架,用户可以通过自然语言命令执行复杂的视频任务,如搜索、编辑、合成和生成视频内容。该框架基于 VideoDB 的“视频即数据”基础设施,集成了多个预构建的视频代理和 AI API,支持高度定制化,适用于开发者和创作者。
590 9
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
|
11月前
|
机器学习/深度学习 人工智能 算法
Meta Motivo:Meta 推出能够控制数字智能体动作的 AI 模型,提升元宇宙互动体验的真实性
Meta Motivo 是 Meta 公司推出的 AI 模型,旨在控制数字智能体的全身动作,提升元宇宙体验的真实性。该模型通过无监督强化学习算法,能够实现零样本学习、行为模仿与生成、多任务泛化等功能,适用于机器人控制、虚拟助手、游戏角色动画等多个应用场景。
321 4
Meta Motivo:Meta 推出能够控制数字智能体动作的 AI 模型,提升元宇宙互动体验的真实性
|
11月前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
895 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
11月前
|
人工智能 自然语言处理 数据挖掘
田渊栋团队新作祭出Agent-as-a-Judge!AI智能体自我审判,成本暴跌97%
田渊栋团队提出Agent-as-a-Judge框架,利用智能体自身评估其他智能体的性能,不仅关注最终结果,还能提供中间反馈,更全面准确地反映智能体的真实能力。该框架在DevAI基准测试中表现出色,成本效益显著,为智能体的自我改进提供了有力支持。
327 7
|
人工智能 自然语言处理 搜索推荐
🤖【多Agent大爆炸】——灵活调用与实践指南,解锁AI协作新技能!
本文深入探讨了单Agent与多Agent在不同场景下的应用及优势,通过实例讲解多Agent如何实现高效协作,涵盖智能物流、教育、医疗等多个领域的实际应用,旨在帮助开发者掌握多Agent系统的调用与实践技巧。
1071 5
|
Python 机器学习/深度学习 人工智能
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣
【10月更文挑战第1天】本文通过构建一个简单的强化学习环境,演示了如何创建和训练智能体以完成特定任务。我们使用Python、OpenAI Gym和PyTorch搭建了一个基础的智能体,使其学会在CartPole-v1环境中保持杆子不倒。文中详细介绍了环境设置、神经网络构建及训练过程。此实战案例有助于理解智能体的工作原理及基本训练方法,为更复杂应用奠定基础。首先需安装必要库: ```bash pip install gym torch ``` 接着定义环境并与之交互,实现智能体的训练。通过多个回合的试错学习,智能体逐步优化其策略。这一过程虽从基础做起,但为后续研究提供了良好起点。
1908 4
手把手教你从零开始构建并训练你的第一个强化学习智能体:深入浅出Agent项目实战,带你体验编程与AI结合的乐趣

热门文章

最新文章