02_规范AutoGen写法

22 阅读2分钟

前景

在上一篇文章里面我们是把所有的代码都写到了一起,美观性和后续迭代性较差,因此我们需要对上述代码拆分

env文件

首先是配置.env文件写入我们需要的值,如MODEL,BASE_URL,API_KEY等示例

代码如下
API_KEY=****
MODEL=gpt-5-nano
BASE_URL=https://api.openai.com/v1 #注意在env文件配置的数据都需要大写

model文件

代码如下
from autogen_ext.models.openai import OpenAIChatCompletionClient
from dotenv import load_dotenv
import os

load_dotenv()#加载.env文件方便后续读取


def get_model_client():
    return OpenAIChatCompletionClient(
        model=os.getenv("MODEL"),
        base_url=os.getenv("BASE_URL"),
        api_key=os.getenv("API_KEY"),
    )


model_client = get_model_client() #单例模式,统一调用好管理

在model文件里我们总共是进行了几件事

  1. 使用load_dotenv()方法加载.env文件方便后续读取
  2. 实例化OpenAIChatCompletionClient创建模型
  3. 统一使用单例模式,方便好管理后续数据

agent文件

agent文件总共有2个点 分别是流式输出和非流式输出
  1. 流式输出
    代码如下
    import asyncio
    from autogen_agentchat.agents import AssistantAgent
    from ai_example2.ai_client import client
    
    ag = AssistantAgent(
        name="AssistantAgent",
        model_client=client,
        description="严谨的数学家",
        system_message="你是一个严谨的数学家",
       
    )
    
    # 非流式输出
    async def run():
        result = await ag.run(
            task="告诉我1+2+3+4+5+6是多少"
        )
        print(result)
        
    # 执行调用
    if __name__ == "__main__":
        asyncio.run(run())
    
    
    输出结果

image.png 可以看到结果是整体输出的,如果返回的数据很多,那么前端也会就会等待很久,所以这个方式我们基本不会用

  1. 非流式输出
    代码如下
    
    import asyncio
    
    from autogen_agentchat.agents import AssistantAgent
    from autogen_agentchat.messages import ModelClientStreamingChunkEvent
    
    from ai_example2.ai_client import client
    
    ag = AssistantAgent(
        name="AssistantAgent",
        model_client=client,
        description="严谨的数学家",
        system_message="你是一个严谨的数学家",
        model_client_stream=True #流式输出配置项开关
    )
    
    
    
    
    # 流式输出
    
    async def stream_run_ag():
        result = ag.run_stream(
            task="告诉我1+2+3+4+5+6是多少"
        )
        async for msg in result: #
            if isinstance(msg, ModelClientStreamingChunkEvent):
                print(msg.content)
    # 执行调用
    if __name__ == "__main__":
        asyncio.run(stream_run_ag())
    
    代码解释
    首先我们在AssistantAgent配置了一个流式输出的开关即model_client_stream=True 接着定义了一个执行方法,主要功能是执行ag.run_stream方法,这个方法的返回值是一个async generate,即协程生成器,(协程生成器遍历需要用async for,且for循环内部无需再写await,这个是python语法的规定,)
然后先在if上面打印一下msg发现得到的数据是

image.png

整体的返回结果是切割成了一个字一个字的返回,但是我们只需要typeModelClientStreamingChunkEventcontent数据,所以就有了如下代码进行判断

if isinstance(msg, ModelClientStreamingChunkEvent):
   print(msg.content)

所以最终结果就是

image.png

完整项目结构

image.png