DeepAgents--01--Agent和OpenClaw的相关概念

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


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())
相关推荐
c238561 小时前
# Mini OJ — 项目详解文档
开发语言·数据库·c++
DFT计算杂谈2 小时前
C4T交错磁体中的超导交织序向列涨落与自旋流环涨落的选择机制
大数据·数据库·人工智能
2601_965798472 小时前
My Honest Review of Rank Math SEO Pro for Beginner Sites
数据库·人工智能·php
starzy19902 小时前
Soloop 智能视频创作全流程实战指南
数据库·microsoft·音视频
汪海游龙2 小时前
告别 Play Console 手动上传:从模拟器截图到自动发版的完整流水线
android·ci/cd·github
2601_963282772 小时前
极寒场景专网通信技术实践:黑龙江零下 40℃环境数字对讲组网方案落地解析
大数据·运维·数据库
weixin_440784112 小时前
【IntentSeivice实现原理】
android·java·开发语言·intentservice
delta_hell3 小时前
【阅读源码--Android】动画之辅助类
android·源码·animator
聆风吟º4 小时前
【金仓数据库征文】Java 应用接入金仓数据库:从驱动、连接池到存储过程调试的踩坑实录
java·开发语言·数据库