设置代理
duckduckgo运行速度慢,可以在windows环境,需要打开科学上网,7899为设置的代理端口,自行设置
set HTTP_PROXY=http://127.0.0.1:7899
set HTTPS_PROXY=https://127.0.0.1:7899
主要逻辑
利用自带的duckduckgo网络搜索工具和本地自己写的文件保存函数,实现将搜索到的关于奥运会的信息保存到本地的PDF文件中。
代码
from phi.agent import Agent
from phi.model.openai import OpenAIChat
from phi.tools.duckduckgo import DuckDuckGo
from phi.model.openai.like import OpenAILike
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from dotenv import load_dotenv
import os
load_dotenv()
# 使用openai接口定义模型
llm = OpenAILike(
id="deepseek-chat",
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com",
)
# 自定义phidata函数工具
def write_text_to_pdf(file_name, text_content):
"""这个函数可以将文本内容写入到PDF文件中,并把文件保存在本地
Args:
file_name (str): 文件的名称,定义名字的时候文件的后缀必须为.pdf
text_content (str): 文本的内容
Returns:
str: 返回一个文件保存成功的字符串提示,提示文件已经保存和文件保存的路径
"""
# 注册中文字体 # 使用 SIMSUNB.TTF 字体文件
font_path = os.path.abspath('./phi_data_study/font/SIMSUN.TTC')
pdfmetrics.registerFont(TTFont("SimSun", font_path)) # 注册字体并命名为 SimSunB
# 创建一个 PDF 画布对象
pdf_canvas = canvas.Canvas(file_name, pagesize=letter)
# 获取页面宽度和高度
width, height = letter
# 设置字体和字号(使用支持中文的字体)
pdf_canvas.setFont("SimSun", 12) # 使用 SimSun 字体
# 将文本写入 PDF
text_lines = text_content.split('\n') # 按行分割文本
y = height - 50 # 从页面顶部开始写入
for line in text_lines:
pdf_canvas.drawString(50, y, line) # 在 (50, y) 位置写入文本
y -= 15 # 每行文本之间的间距
if y <= 50: # 如果接近页面底部,创建新页面
pdf_canvas.showPage()
y = height - 50
# 保存 PDF 文件
pdf_canvas.save()
return f"文件已经保存在了 {file_name} 中,请查看"
## 定义AGENT
web_agent = Agent(
name="Web Agent",
model=llm,
# 定义函数
tools=[DuckDuckGo(),write_text_to_pdf ],
instructions=["总结一下搜索到的内容,并根据搜索的结果生成一个pdf文件,文件的名称必须和回答的内容相关,最后保存数据"],
show_tool_calls=True,
markdown=True,
)
web_agent.print_response("关于2008年奥运会相关的信息?", stream=False)
运行结果
生成的pdf文件
PDF文件内容