前景
在上一篇文章里面我们是把所有的代码都写到了一起,美观性和后续迭代性较差,因此我们需要对上述代码拆分
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文件里我们总共是进行了几件事
- 使用load_dotenv()方法加载.env文件方便后续读取
- 实例化OpenAIChatCompletionClient创建模型
- 统一使用单例模式,方便好管理后续数据
agent文件
agent文件总共有2个点 分别是流式输出和非流式输出
- 流式输出
代码如下
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())输出结果
可以看到结果是整体输出的,如果返回的数据很多,那么前端也会就会等待很久,所以这个方式我们基本不会用
- 非流式输出
代码如下
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发现得到的数据是
整体的返回结果是切割成了一个字一个字的返回,但是我们只需要type为ModelClientStreamingChunkEvent的content数据,所以就有了如下代码进行判断
if isinstance(msg, ModelClientStreamingChunkEvent):
print(msg.content)
所以最终结果就是