提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- Agent和OpenClaw的相关概念
-
- [1. 什么是Agent?](#1. 什么是Agent?)
-
- [1.2 Agent的运行原理](#1.2 Agent的运行原理)
- [1.3 WorkFlow和Agent区别](#1.3 WorkFlow和Agent区别)
- [1.4 WorkFlow 和 langgraph 区别?](#1.4 WorkFlow 和 langgraph 区别?)
- 2、AI工具/框架分类
- 3、OpenClaw是什么?
- 4、OpenClaw的影响
- DeepAgents框架的核心
-
- 一、DeepAgent框架的由来和定义
- [二、DeepAgents 的核心能力 + Harness Engineering](#二、DeepAgents 的核心能力 + Harness Engineering)
-
-
- [==什么是 Harness Engineering(驾驭工程==)?](#==什么是 Harness Engineering(驾驭工程==)?)
-
- 三、框架对比
- DeepAgents的Agent案例
-
- 1.创建虚拟环境,并安装依赖库
- 2.创建PyCharm项目
- [3. 复制langgraph本地服务所支持的项目模板](#3. 复制langgraph本地服务所支持的项目模板)
- [4.配置env 调用LLM](#4.配置env 调用LLM)
- 5.创建一个DeepAgent对象
-
-
- [修改配置文件: langgraph.json](#修改配置文件: langgraph.json)
-
- [6. 启动langgraph的本地服务](#6. 启动langgraph的本地服务)
- 7.Agent本地测试并流式输出
Agent和OpenClaw的相关概念
1. 什么是Agent?


LangChain--07智能体----Agent的基本用法




1.2 Agent的运行原理



1.3 WorkFlow和Agent区别


1.4 WorkFlow 和 langgraph 区别?


2、AI工具/框架分类





3、OpenClaw是什么?

Skill: 一个技能是一个目录,其核心是一个 SKILL.md文件。该文件包含元数据(名称、描述)和详细的、循序渐进的指令,并可引用其他脚本、模板等资源。

4、OpenClaw的影响



DeepAgents框架的核心
一、DeepAgent框架的由来和定义


二、DeepAgents 的核心能力 + Harness Engineering
什么是 Harness Engineering(驾驭工程)?













三、框架对比


DeepAgents的Agent案例
1.创建虚拟环境,并安装依赖库
cmd进入命令窗口
bash
#创建一个名为DeepAgents的环境,指定Python版本是3.13.12
conda create --name DeepAgents_study python=3.13.12
#查看anconda安装好的python环境
conda env list
#在命令行窗口切换到某python环境
conda activate DeepAgents_study
#带 --no-user 参数重装(关键!禁止写入用户全局目录)
pip install deepagents dotenv langchain-openai zai-sdk --no-user --no-cache-dir
pip install -U "langgraph-cli[inmem]" --no-user --no-cache-dir
# 检查是否成功安装langchain包
conda list

2.创建PyCharm项目

3. 复制langgraph本地服务所支持的项目模板

4.配置env 调用LLM

env文件
bash
# 从DeepSeek官网获取的配置信息
DEEPSEEK_API_KEY=sk-ae.....
DEEPSEEK_BASE_URL=https://api.deepseek.com
# 从智谱平台获取的配置信息
ZHIPU_API_KEY=1fe5.....
# 从阿里云百炼平台获取的配置信息
ALIBABA_API_KEY=sk-ws-H.........
ALIBABA_BASE_URL=https://ws-djsz46phmbfw9kd4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
env_utils.py
bash
import os
from dotenv import load_dotenv
load_dotenv(override=True)
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
DEEPSEEK_API_KEY = os.getenv('DEEPSEEK_API_KEY')
ZHIPU_API_KEY = os.getenv('ZHIPU_API_KEY')
MINIMAX_API_KEY = os.getenv('MINIMAX_API_KEY')
ALIBABA_API_KEY = os.getenv('ALIBABA_API_KEY')
K2_API_KEY = os.getenv('K2_API_KEY')
K2_BASE_URL = os.getenv('K2_BASE_URL')
ALIBABA_BASE_URL = os.getenv('ALIBABA_BASE_URL')
MINIMAX_BASE_URL = os.getenv('MINIMAX_BASE_URL')
OPENAI_BASE_URL = os.getenv('OPENAI_BASE_URL')
DEEPSEEK_BASE_URL = os.getenv('DEEPSEEK_BASE_URL')
ZHIPU_BASE_URL = os.getenv('ZHIPU_BASE_URL')
LOCAL_BASE_URL = os.getenv('LOCAL_BASE_URL')
DAYTONA_API_KEY = os.getenv('DAYTONA_API_KEY')
DAYTONA_BASE_URL = os.getenv('DAYTONA_BASE_URL')
my_llm.py
python
# 大模型
from langchain.chat_models import init_chat_model
from langchain_openai import ChatOpenAI
from agent.env_utils import ALIBABA_API_KEY, ALIBABA_BASE_URL
import os
llm = ChatOpenAI(
model="glm-5",
temperature=1.0,
openai_api_key=ALIBABA_API_KEY,
openai_api_base=ALIBABA_BASE_URL,
)
5.创建一个DeepAgent对象
my_tools工具
python
from langchain_core.tools import tool
from zai import ZhipuAiClient
from agent.env_utils import ZHIPU_API_KEY
client = ZhipuAiClient(api_key=ZHIPU_API_KEY)
@tool('web_search', parse_docstring=True)
def web_search(query: str) -> str:
"""
使用搜狗的API进行Web搜索
Args:
query: 需要搜索的内容或者关键字。
Returns:
返回搜索之后的结果
"""
try:
response = client.web_search.web_search(
search_engine="search_pro",
search_query=query,
count=3, # 返回结果的条数,范围1-50,默认10
search_recency_filter="noLimit", # 搜索指定日期范围内的内容
)
if response.search_result:
return "\n\n".join([d.content for d in response.search_result])
return '没有搜索到任何内容!'
except Exception as e:
print(e)
return f"搜索失败: {e}"
my_agent1.py
python
from deepagents import create_deep_agent
from agent.my_llm import llm
from agent.my_tools import web_search
agent = create_deep_agent( # create_agent
model=llm,
tools=[web_search],
system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)
修改配置文件: langgraph.json

python
{
"$schema": "https://langgra.ph/schema.json",
"dependencies": ["."],
"graphs": {
"agent": "./src/agent/test1.py:agent"
},
"env": ".env",
}
1."$schema"
•作用:指定用于验证此 JSON 配置文件结构的 JSON Schema 文件的地址。
•解释:它指向一个在线模式定义文件 (https://langgra.ph/schema.json)。支持 JSON Schema 的代码编辑器(如 VS Code)可以利用它来为这个配置文件提供自动完成、语法高亮和错误检查,帮助你更准确、高效地编写配置。
2."dependencies"
•作用:声明此项目运行所依赖的代码路径或包。
•解释:当前配置为 ["."],表示依赖当前目录(即项目根目录)下的所有代码。这意味着当你运行 LangGraph 应用时,框架会将当前目录添加到 Python 的模块搜索路径中,从而能够找到并导入你编写的本地模块(例如 src目录下的文件)。
3."graphs"
•作用:定义本项目中的一个或多个"图"(即智能体工作流),并为每个图指定一个可调用的入口点。
•解释:这是一个键值对对象。在本配置中:
•键 "agent":这是你为这个图定义的名称。你之后可以通过这个名字(例如在命令行中)来引用并运行这个特定的工作流。
•值 "./src/agent/test1.py:agent":这是指向图中入口点的路径,采用 文件路径:可调用对象名的格式。
•./src/agent/test1.py:是包含图定义代码的 Python 文件路径。
•agent:是 test1.py文件中导出的、代表整个图的主要可调用对象(通常是一个已经编译好的 Graph或 StateGraph对象)。
4."env"
•作用:指定项目使用的环境变量文件。
•解释:其值为 ".env",表示在项目根目录下存在一个名为 .env的文件。LangGraph 在运行时会加载这个文件,将其中的键值对设置为环境变量。这通常用于安全地管理 API 密钥、数据库连接字符串等敏感或可配置的信息(例如 OPENAI_API_KEY)。
6. 启动langgraph的本地服务
bash
#第一次启动需要先安装依赖:
pip install -e .
#本地启动命令:
langgraph dev


7.Agent本地测试并流式输出
定义一个函数:负责流式输出
python
import asyncio
from typing import AsyncIterator
from agent.test1 import agent
async def stream_agent_interaction_corrected(agent, thread_id: str) -> AsyncIterator[str]:
"""
使用官方推荐的 `agent.stream()` 方法进行流式交互。
根据调试信息,chunk的结构是 (AIMessageChunk, metadata_dict)
"""
config = {"configurable": {"thread_id": thread_id}}
while True:
try:
user_input = input("\n\n[用户] >>> ").strip()
except (EOFError, KeyboardInterrupt):
print("\n\n对话结束。")
break
if user_input.lower() in ('quit', 'exit', '退出', 'q'):
print("再见!")
break
if not user_input:
continue
print("\n[Agent] ", end="", flush=True)
# 准备输入
inputs = {"messages": [{"role": "user", "content": user_input}]}
# 关键修正:使用 agent.stream() 并设置 stream_mode
stream = agent.stream(inputs, config=config, stream_mode="messages", subgraphs=False)
full_response = ""
try:
# 使用同步 for 循环,因为 agent.stream() 返回的是同步生成器
for chunk in stream: # 移除 async
# 根据调试信息,chunk 的结构是 (AIMessageChunk, metadata_dict)
if isinstance(chunk, tuple) and len(chunk) == 2:
token, metadata = chunk
# 1. 流式输出 AI 生成的文本内容
if hasattr(token, 'content') and token.content is not None:
content_str = str(token.content)
if content_str:
yield content_str # 生成器
full_response += content_str
# 2. 捕获并显示工具调用开始
if hasattr(token, 'tool_call_chunks') and token.tool_call_chunks:
for tool_chunk in token.tool_call_chunks:
if tool_chunk and hasattr(tool_chunk, 'get'):
if tool_chunk.get('name'):
tool_name = tool_chunk['name']
yield f"\n[调用工具: {tool_name}]\n"
# 3. 捕获并显示工具调用结果
# 注意:工具调用结果通常不会出现在同一个 token 中
# 它们通常以独立的 token 形式出现
else:
# 如果 chunk 不是预期的元组结构,打印调试信息
print(f"\n[调试] 意外的 chunk 结构: {type(chunk)}")
continue
except Exception as e:
yield f"\n❌ Agent 执行出错: {e}\n"
import traceback
traceback.print_exc()
continue
async def main_test():
# 测试运行Agent,并且进行交互
thread_id = "demo_thread_01"
async for response in stream_agent_interaction_corrected(agent, thread_id):
print(response, end="", flush=True)
if __name__ == '__main__':
asyncio.run(main_test())
