Skip to content

第 2 章 · 环境搭建与第一个 Agent

本章目标:搭好可复用的开发环境,跑通第一个接入 DeepSeek 的 Agent,并学会排查三类最常见的连接错误。

2.1 安装 Agno

推荐始终在虚拟环境中开发,避免污染系统 Python:

bash
python -m venv .venv
source .venv/bin/activate        # Windows: .venv\Scripts\activate
pip install -U agno python-dotenv

验证安装:

bash
python -c "import agno; print(agno.__version__)"
# 2.9.x(教程编写时的最新大版本为 2.x)

版本提示

Agno 2.x 相比 1.x 有大量破坏性变更(如存储类从 agno.storage.sqlite.SqliteStorage 迁移到 agno.db.sqlite.SqliteDb)。网上大量旧教程基于 1.x,请以本课程和官方文档为准。

2.2 用 .env 管理 API Key

永远不要把 Key 写死在代码里。项目根目录创建 .env 文件:

text
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxx

再创建 .gitignore 把它排除出版本库。代码中用 python-dotenv 加载:

python
# load_env.py
import os
from dotenv import load_dotenv

load_dotenv()  # 读取当前目录的 .env 并注入环境变量

key = os.getenv("DEEPSEEK_API_KEY")
print("Key 已加载:" + key[:6] + "..." if key else "未找到 DEEPSEEK_API_KEY!")

2.3 第一个 Agent:完整拆解

python
# agent_01.py —— 你的第一个 Agno Agent
import os
from dotenv import load_dotenv
from agno.agent import Agent
from agno.models.openai import OpenAIChat

load_dotenv()

agent = Agent(
    model=OpenAIChat(
        id="deepseek-chat",                              # 三方模型的模型 ID
        api_key=os.getenv("DEEPSEEK_API_KEY"),           # 从环境变量读取密钥
        base_url="https://api.deepseek.com/v1",          # OpenAI 兼容端点
    ),
    instructions=["用简洁的中文回答", "不确定时要明说"],
    markdown=True,
)

agent.print_response("一句话介绍什么是 AI Agent")

运行 python agent_01.py,你会看到 DeepSeek 的回答被打印出来。逐个参数理解:

  • id:模型名称,由三方服务商定义(DeepSeek 还有思考模型 deepseek-reasoner);
  • base_url:兼容端点地址。换成 OpenRouter、通义、Kimi 等只需改这一行;
  • instructions:行为指令列表,Agno 会把它们组装进 system 消息;
  • markdown=True:让输出按 Markdown 渲染,终端里表格和代码块更易读。

如果不想记 base_url,也可以使用 Agno 提供的通用类 OpenAILike(位于 agno.models.openai.like),参数完全一致。

2.4 常见连接错误排查

初学者九成的报错集中在这三种情况:

python
# debug_connection.py —— 三种典型错误的复现与自查
import os
from agno.agent import Agent
from agno.models.openai import OpenAIChat

def make_agent(base_url):
    return Agent(model=OpenAIChat(
        id="deepseek-chat",
        api_key=os.getenv("DEEPSEEK_API_KEY"),
        base_url=base_url,
    ))

# 错误一:401 Unauthorized → Key 未加载或拼写错误
# 自查:os.getenv("DEEPSEEK_API_KEY") 是否为 None?

# 错误二:404 Not Found → base_url 少了或多了路径
# DeepSeek 正确写法以 /v1 结尾;写成 https://api.deepseek.com 会 404

# 错误三:model not found → id 与服务商提供的名称不一致
# 例如把 "deepseek-chat" 误写成 "deepseek_v3"

try:
    make_agent("https://api.deepseek.com/v1").run("ping")
    print("连接成功")
except Exception as e:
    print("失败原因:", e)

排查口诀:先查 Key(401),再查 URL(404),最后查模型名(400)

2.5 让第一个 Agent 更有用:加一个工具

不带工具的 Agent 只能靠模型内部知识回答。加上搜索工具后,它能获取实时信息——这是 Agent 与普通聊天机器人的分水岭:

python
# agent_search.py —— 带搜索工具的 Agent
import os
from dotenv import load_dotenv
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools

load_dotenv()

news_agent = Agent(
    model=OpenAIChat(
        id="deepseek-chat",
        api_key=os.getenv("DEEPSEEK_API_KEY"),
        base_url="https://api.deepseek.com/v1",
    ),
    tools=[DuckDuckGoTools()],            # 注入 DuckDuckGo 搜索能力
    instructions=["先搜索最新信息再回答", "答案末尾列出参考链接"],
    markdown=True,
    show_tool_calls=True,                 # 在输出中展示工具调用过程
)

news_agent.print_response("今天有哪些关于 AI 的新闻?", stream=True)

观察输出你会发现多了一段工具调用记录:模型先请求调用搜索工具,Agno 执行后把结果回传给模型生成最终答案——这正是第 1 章讲的运行循环。工具的原理与自定义方法在第 7、8 章展开。

2.6 本章小结

  • 虚拟环境 + pip install -U agno 是标准起手式;注意区分 Agno 2.x 与旧版 API;
  • API Key 一律走 .env + python-dotenv,严禁硬编码;
  • 接入三方模型 = OpenAIChat(id, api_key, base_url),换服务商只改 base_url
  • 连接错误排查顺序:401 查 Key → 404 查 URL → 400 查模型名;
  • 加上 tools=[...] 后,Agent 就从"聊天"升级为"行动"。

🧪 随堂测验

点击你认为正确的选项。答错时会展示正确答案与原因解析。

1. 请求 DeepSeek 时收到 404 Not Found,最可能的原因是?

2. show_tool_calls=True 的作用是?

3. 以下哪种做法符合教程的安全约定?

4. 想让 Agent 回答前先联网查资料,最少需要改动什么?

🛠️ 动手实践

  1. 申请一个 DeepSeek API Key,配置好 .env,运行 agent_01.py 并截图保存第一次成功的输出。
  2. 故意把 base_url 改错(去掉 /v1),观察报错信息,然后修复——把报错和原因写进你的学习笔记。
  3. 把 2.5 的 Agent 换成一个你感兴趣的中文问题(如"最近的 Python 版本有什么新特性"),对比加工具前后答案的质量差异。

能稳定跑通带工具的 Agent 后,进入第 3 章:运行 Agent 与 RunOutput 解析