从零搭建 LangGraph Agent(适配 DeepSeek-Chat):可运行模板 + 全坑点复盘

LangGraph 1.0.0+ 版本对配置规范、依赖管理、模型调用的要求较旧版有大幅调整,旧教程中的配置写法、依赖选择几乎全量过时。本文先提供开箱即用的极简可运行项目模板(无冗余目录 / 文件),再系统复盘核心坑点,重点强调 .src 目录的强制规范,兼顾实用性与严谨性。

一、可运行项目模板(极致精简版)

1. 项目目录结构(强制规范,无任何冗余)

LangGraph 1.0.0+ 对核心代码目录有硬编码的命名要求,以下是满足运行的最小必要结构,所有目录 / 文件均为功能必需:

Agent-Learning/          # 项目根目录(名称可自定义,如 "my-langgraph-agent")
├─ .src/                 # 【核心强制】LangGraph 官方约定的核心代码目录(名称不可改、不可删)
│  └─ agent.py           # Agent 核心逻辑文件(名称可改,需与 langgraph.json 配置匹配)
├─ .env                  # 密钥配置文件(必加,避免 API Key 硬编码,.gitignore 需排除)
└─ langgraph.json        # LangGraph 核心配置文件(名称、格式不可错,新版强制校验)
关键强调:.src 目录的不可替代性

.src(前缀带英文句点)是 LangGraph 底层源码中硬编码的默认核心代码读取目录

  • 未在 langgraph.json 显式指定代码路径时,LangGraph 会自动扫描 .src/agent.py
  • 即使显式指定路径,.src 目录本身也需保留(仅需确保配置路径与文件位置匹配);
  • 若改名(如改为 src/source)或删除,会直接触发「未找到代码文件」「graph 加载失败」等核心报错,无任何兼容方案。

2. 核心文件内容

(1).env:DeepSeek API 密钥配置
# 替换为你的 DeepSeek API Key(从 DeepSeek 官网申请,免费额度可满足测试)
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(2)langgraph.json:LangGraph 新版标准配置(适配硬编码目录)
{
  "graphs": {
    "agent": ".src/agent.py:graph"  // 路径必须指向 .src 目录下的文件,格式为「文件路径:变量名」
  },
  "dependencies": ["."]  // 新版强制非空,"." 表示依赖当前项目根目录
}

配置与 .src 目录的关联说明

  • ".src/agent.py:graph" 明确指定 LangGraph 读取 .src 目录下的 agent.py 文件,并加载其中的 graph 变量;
  • .src 目录改名,需同步修改此路径(如 src/agent.py:graph),但不建议这么做(违背官方约定,易踩版本兼容坑)。
(3).src/agent.py:Agent 核心逻辑(适配 DeepSeek-Chat)
# 基础依赖导入(仅保留核心必需)
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI  # 兼容 DeepSeek-Chat 的核心依赖
from langchain.tools import tool
import os
from dotenv import load_dotenv

# 1. 加载环境变量(读取 .env 中的 DeepSeek API Key)
load_dotenv()  # 自动读取项目根目录的 .env 文件,无需指定路径

# 2. 初始化 DeepSeek-Chat 模型(OpenAI 兼容模式,稳定性最优)
llm = ChatOpenAI(
    model="deepseek-chat",  # DeepSeek 官方固定模型名
    api_key=os.getenv("DEEPSEEK_API_KEY"),  # 从 .env 读取密钥,避免硬编码
    base_url="https://api.deepseek.com/v1",  # DeepSeek 官方 API 端点(强制指定)
    temperature=0.1,  # 低随机性适配工具调用场景
    max_tokens=2048   # 最大生成长度,按需调整
)

# 3. 定义工具函数(必须包含完整 docstring,LangChain 强制要求)
@tool
def send_email(to: str, subject: str, body: str):
    """
    邮件发送工具函数,处理用户的邮件发送指令。
    
    参数:
        to: 收件人邮箱地址,字符串类型,示例:"zhangsan@example.com"
        subject: 邮件主题,字符串类型,示例:"周末聚餐通知"
        body: 邮件正文内容,字符串类型,示例:"周六晚7点XX餐厅聚餐"
    
    返回:
        str: 邮件发送成功的提示信息
    """
    return f"✅ 邮件发送成功!收件人:{to},主题:{subject},正文:{body}"

# 4. 创建 Agent 实例(LangGraph 可识别格式)
agent = create_agent(
    model=llm,
    tools=[send_email],
    system_prompt="你是专业的邮件助手,仅使用 send_email 工具完成邮件发送任务,不执行其他操作。"
)

# 5. 暴露 graph 变量(新版 LangGraph 优先识别该变量名,与配置文件路径匹配)
graph = agent

# 可选:本地测试代码(直接运行该文件验证功能,无需启动 LangGraph 服务)
if __name__ == "__main__":
    test_input = {
        "input": "帮我给张三发送邮件,主题是周末聚餐,正文是周六晚上7点在XX餐厅聚餐"
    }
    result = graph.invoke(test_input)
    print("Agent 执行结果:\n", result["output"])

3. 快速启动与测试(全程无坑)

(1)安装核心依赖(国内源加速)
# 仅需安装 3 个核心依赖,无冗余
pip install langgraph>=1.0.0 langchain-openai>=0.1.0 python-dotenv>=1.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/
(2)启动 LangGraph 调试服务(依赖 .src 目录)
# 进入项目根目录执行(确保 .src 目录存在且路径正确)
cd F:\workbench\Agent-Learning
langgraph dev
(3)验证方式(3 种可选)
  • 方式 1:本地代码测试直接运行 .src/agent.py,终端输出:
    Agent 执行结果:
     ✅ 邮件发送成功!收件人:张三,主题:周末聚餐,正文:周六晚上7点在XX餐厅聚餐
    
  • 方式 2:可视化调试界面浏览器访问官方 Studio UI(连接本地 .src 目录下的 Agent):
    https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
    
  • 方式 3:API 调试页访问 http://127.0.0.1:2024/docs,通过「Try it out」测试 Agent 接口。

二、核心坑点复盘(重点强调 .src 相关)

1. 致命坑:混淆 .srcsrc 目录

错误操作 报错信息 核心原因 解决方案
删除 .src 目录 Failed to load graph 'agent': no such file or directory LangGraph 硬编码读取 .src,无此目录直接无法加载代码 重建 .src 目录,将 agent.py 放入其中
改为 src 目录(无句点) ValueError: Invalid path 'src/agent.py:graph' 官方约定的核心目录是 .srcsrc 仅为通用规范,无 LangGraph 适配 改回 .src 目录,同步更新 langgraph.json 路径
拼写错误(如 .source/.sr ImportError: cannot import name 'graph' from '.source' 目录名与硬编码不匹配,LangGraph 无法扫描到代码文件 严格按 .src 命名,无任何容错空间

2. 配置文件 langgraph.json 格式陷阱

坑点类型 过时写法 报错信息 适配方案(关联 .src 目录)
graphs 字段为列表 [{"id":"agent","path":".src/agent.py"}] AttributeError: 'list' has no 'values' 字典格式 {"agent": ".src/agent.py:graph"}
路径缺少变量名 ".src/agent.py" not enough values to unpack (expected 2) 补充变量名 ".src/agent.py:graph"
Windows 编码问题 GBK 编码保存 langgraph.json UnicodeDecodeError: 'gbk' codec 记事本另存为 UTF-8 编码,确保 .src 路径解析正常

3. 模型调用:避开小众适配包

  • 过时方案:导入 from langchain_deepseek import ChatDeepseek
  • 核心问题langchain-deepseek 为第三方包,版本迭代慢,易出现「模块找不到」问题;
  • 最优适配:利用 DeepSeek 对 OpenAI API 的兼容特性,通过 langchain_openai.ChatOpenAI 调用,仅需指定 base_url,与 .src 目录无关联,但稳定性更高。

4. 工具函数:docstring 强制校验

  • 错误写法@tool 装饰的函数无文档字符串;
  • 报错ValueError: Function must have a docstring if description not provided
  • 适配逻辑:LangChain 需通过 docstring 生成工具描述,与 .src 目录无关,但为 Agent 运行的必要条件。

三、关键原则总结(聚焦 .src 核心)

  1. .src 目录是强制项:名称不可改(必须带句点)、不可删,是 LangGraph 读取核心代码的唯一默认路径,任何拼写 / 命名错误都会导致 Agent 加载失败;
  2. 配置与目录强绑定:langgraph.json 中的 graphs 路径必须指向 .src 目录下的文件,格式为「.src/ 文件名:变量名」;
  3. 冗余目录可删除src(无句点)、source 等目录均为通用规范,在 LangGraph 场景中完全冗余,删除后不影响任何功能;
  4. 极简结构最优:仅保留 .src/agent.py.envlanggraph.json 三个核心文件,无冗余是避免版本兼容坑的最佳方式。

四、扩展建议

  1. 多工具扩展:在 .src/agent.py 中新增 @tool 装饰的函数,添加到 tools 列表即可,无需修改 .src 目录结构;
  2. 多 Agent 管理:在 .src 目录下新增文件(如 .src/file_agent.py),在 langgraph.json 中新增 graphs 项即可;
  3. 生产环境部署:固化依赖版本(requirements.txt),保留 .src 目录结构,仅需调整启动命令为 langgraph serve

本模板已验证适配 LangGraph 1.0.0+、Python 3.10+ 环境,核心规范聚焦 .src 目录的强制要求,无任何冗余配置,可直接复用至文件操作、数据查询等其他工具调用场景。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐