从零搭建 LangGraph Agent(适配 DeepSeek-Chat):1.x 版本详解
本文提供LangGraph 1.0.0+版本的极简项目模板,重点解析核心配置规范与常见坑点。关键点包括:1)强制使用.src目录存放核心代码(名称不可更改);2)langgraph.json必须指向.src目录下的文件;3)适配DeepSeek-Chat时推荐使用OpenAI兼容模式调用。项目仅需保留.src/agent.py、.env和langgraph.json三个核心文件,通过@tool装饰
·
从零搭建 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. 致命坑:混淆 .src 与 src 目录
| 错误操作 | 报错信息 | 核心原因 | 解决方案 |
|---|---|---|---|
删除 .src 目录 |
Failed to load graph 'agent': no such file or directory |
LangGraph 硬编码读取 .src,无此目录直接无法加载代码 |
重建 .src 目录,将 agent.py 放入其中 |
改为 src 目录(无句点) |
ValueError: Invalid path 'src/agent.py:graph' |
官方约定的核心目录是 .src,src 仅为通用规范,无 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 核心)
- .src 目录是强制项:名称不可改(必须带句点)、不可删,是 LangGraph 读取核心代码的唯一默认路径,任何拼写 / 命名错误都会导致 Agent 加载失败;
- 配置与目录强绑定:langgraph.json 中的
graphs路径必须指向.src目录下的文件,格式为「.src/ 文件名:变量名」; - 冗余目录可删除:
src(无句点)、source等目录均为通用规范,在 LangGraph 场景中完全冗余,删除后不影响任何功能; - 极简结构最优:仅保留
.src/agent.py、.env、langgraph.json三个核心文件,无冗余是避免版本兼容坑的最佳方式。
四、扩展建议
- 多工具扩展:在
.src/agent.py中新增@tool装饰的函数,添加到tools列表即可,无需修改.src目录结构; - 多 Agent 管理:在
.src目录下新增文件(如.src/file_agent.py),在 langgraph.json 中新增graphs项即可; - 生产环境部署:固化依赖版本(
requirements.txt),保留.src目录结构,仅需调整启动命令为langgraph serve。
本模板已验证适配 LangGraph 1.0.0+、Python 3.10+ 环境,核心规范聚焦 .src 目录的强制要求,无任何冗余配置,可直接复用至文件操作、数据查询等其他工具调用场景。
更多推荐


所有评论(0)