Deep Agents Template 的高级功能**(规划、委派、批评子智能体、写文件等)和前端 HTTP 调用的能力

下面我为你整合一个完整的项目,基于 deepagents 库(LangChain 的深度智能体模板),外加 Flask 包装层和前端聊天界面。这样你既得到了 deep agent 的强大工作流,又能通过浏览器与它交互。


最终项目结构

my_deep_agent/
├── .env                      # API Key 配置
├── requirements.txt          # 依赖列表
├── app.py                    # Flask 后端 + deep agent 逻辑
├── static/
│   └── index.html            # 前端聊天界面
└── README.md                 # 运行说明

1. 后端代码 (app.py)

这里使用 deepagentscreate_deep_agent,保留其内置的 plandelegatecritiquefinalize 流程,并添加两个默认子智能体(研究员和批评家)。然后通过 Flask 暴露 /chat 接口供前端调用。

import os
from dotenv import load_dotenv
from flask import Flask, request, jsonify
from flask_cors import CORS
from langchain_openai import ChatOpenAI  # 如果你用其他模型,可改为 ChatAnthropic
from deepagents import create_deep_agent
from deepagents.middleware import SubAgentMiddleware
from langchain_core.tools import tool

load_dotenv()

# ---------- 配置模型(使用通义千问或 OpenAI 兼容服务)----------
api_key = os.getenv("DASHSCOPE_API_KEY")
base_url = os.getenv("DASHSCOPE_BASE_URL")
if not api_key or not base_url:
    # 如果没有配置 DashScope,尝试用 Anthropic
    api_key = os.getenv("ANTHROPIC_API_KEY")
    if not api_key:
        raise ValueError("请设置 DASHSCOPE_API_KEY 或 ANTHROPIC_API_KEY")

# 模型初始化(这里以 DashScope 兼容 OpenAI 为例)
llm = ChatOpenAI(
    model="qwen-plus",
    temperature=0.7,
    api_key=api_key,
    base_url=base_url,
    model_kwargs={"extra_body": {"enable_thinking": False}}
)
# 如果你使用 Anthropic Claude,改为:
# from langchain_anthropic import ChatAnthropic
# llm = ChatAnthropic(model="claude-3-5-sonnet-20241022", temperature=0.7)

# ---------- 自定义工具(类似 get_weather)----------
@tool
def get_weather(city: str) -> str:
    """获取指定城市的天气(模拟)"""
    return f"🌤️ {city} 今天天气晴朗,气温 22°C,适合出行。"

# ---------- 构建 Deep Agent ----------
# create_deep_agent 会自动包含:计划、委派、批评、最终确定四步流程
# 同时内置了 execute 和 write_file 工具,并自动添加了两个子智能体:researcher 和 critic
deep_agent = create_deep_agent(
    model=llm,
    tools=[get_weather],           # 你可以添加更多自定义工具
    system_prompt="""你是一个智能助手,负责计划、委派、批评并最终回答用户问题。
    如果用户询问需要搜索或分析的信息,可以委派给 researcher 子智能体;
    如果用户询问需要批判性分析,可以委派给 critic 子智能体。
    你也可以直接调用 get_weather 工具回答天气问题。""",
    # 可选:自定义子智能体
    # sub_agents=[...]
)

# ---------- Flask 应用 ----------
app = Flask(__name__)
CORS(app)  # 允许前端跨域

@app.route("/chat", methods=["POST"])
def chat():
    data = request.get_json()
    user_message = data.get("message", "")
    if not user_message:
        return jsonify({"error": "消息不能为空"}), 400

    try:
        # 调用 deep agent(使用 invoke,它会完整执行 plan->delegate->...->finalize)
        response = deep_agent.invoke({"messages": [("user", user_message)]})
        # 提取最后一条 AI 消息的内容
        final_message = response["messages"][-1].content
        return jsonify({"response": final_message})
    except Exception as e:
        return jsonify({"error": str(e)}), 500

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

注意deepagents 库需要单独安装,它依赖 langgraph 和一些中间件。如果 create_deep_agent 的签名与上述不同,请查阅 deepagents 文档。上面的代码假设 create_deep_agent 接受 model, tools, system_prompt 等参数,并内置子智能体。


2. 前端代码 (static/index.html)

与之前相似,提供简洁的聊天界面。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深度智能体助手</title>
    <style>
        body { font-family: system-ui; max-width: 800px; margin: 2rem auto; padding: 0 1rem; background: #f5f7fb; }
        .chat-container { background: white; border-radius: 1rem; box-shadow: 0 4px 12px rgba(0,0,0,0.1); display: flex; flex-direction: column; height: 70vh; overflow: hidden; }
        .messages { flex: 1; padding: 1.5rem; overflow-y: auto; display: flex; flex-direction: column; gap: 1rem; }
        .message { display: flex; gap: 0.5rem; }
        .user-message { justify-content: flex-end; }
        .assistant-message { justify-content: flex-start; }
        .bubble { max-width: 70%; padding: 0.75rem 1rem; border-radius: 1.5rem; line-height: 1.4; }
        .user-bubble { background: #007aff; color: white; border-bottom-right-radius: 0.25rem; }
        .assistant-bubble { background: #e9e9ef; color: black; border-bottom-left-radius: 0.25rem; }
        .input-area { display: flex; gap: 0.5rem; padding: 1rem; border-top: 1px solid #ddd; background: white; }
        input { flex: 1; padding: 0.75rem; border: 1px solid #ccc; border-radius: 2rem; font-size: 1rem; }
        button { background: #007aff; color: white; border: none; border-radius: 2rem; padding: 0 1.25rem; cursor: pointer; }
        button:hover { background: #005fc1; }
        .loading { text-align: center; color: #666; font-style: italic; margin: 0.5rem 0; }
    </style>
</head>
<body>
    <div class="chat-container">
        <div class="messages" id="messages">
            <div class="message assistant-message">
                <div class="bubble assistant-bubble">👋 你好!我是深度智能体,支持计划、委派、批评和最终解答。试试问我“西安天气”或“分析一下人工智能的未来趋势”。</div>
            </div>
        </div>
        <div class="input-area">
            <input type="text" id="userInput" placeholder="输入消息..." onkeypress="handleKeyPress(event)">
            <button id="sendBtn">发送</button>
        </div>
    </div>
    <script>
        const messagesDiv = document.getElementById('messages');
        const userInput = document.getElementById('userInput');
        const sendBtn = document.getElementById('sendBtn');
        const API_URL = 'http://127.0.0.1:5000/chat';

        function addMessage(content, isUser) {
            const messageDiv = document.createElement('div');
            messageDiv.className = `message ${isUser ? 'user-message' : 'assistant-message'}`;
            const bubble = document.createElement('div');
            bubble.className = `bubble ${isUser ? 'user-bubble' : 'assistant-bubble'}`;
            bubble.textContent = content;
            messageDiv.appendChild(bubble);
            messagesDiv.appendChild(messageDiv);
            messagesDiv.scrollTop = messagesDiv.scrollHeight;
        }

        function showLoading() {
            const loadingDiv = document.createElement('div');
            loadingDiv.id = 'loading';
            loadingDiv.className = 'loading';
            loadingDiv.textContent = '🤔 深度思考中(计划→委派→批评→最终回答)...';
            messagesDiv.appendChild(loadingDiv);
            messagesDiv.scrollTop = messagesDiv.scrollHeight;
        }

        function hideLoading() {
            const loadingDiv = document.getElementById('loading');
            if (loadingDiv) loadingDiv.remove();
        }

        async function sendMessage() {
            const message = userInput.value.trim();
            if (!message) return;
            userInput.value = '';
            addMessage(message, true);
            showLoading();
            try {
                const response = await fetch(API_URL, {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ message: message }),
                });
                hideLoading();
                if (!response.ok) {
                    const errorData = await response.json();
                    addMessage(`❌ 错误: ${errorData.error || '请求失败'}`, false);
                    return;
                }
                const data = await response.json();
                addMessage(data.response, false);
            } catch (error) {
                hideLoading();
                addMessage(`❌ 网络错误: ${error.message}`, false);
            }
        }

        function handleKeyPress(event) {
            if (event.key === 'Enter') sendMessage();
        }
        sendBtn.addEventListener('click', sendMessage);
    </script>
</body>
</html>

3. 环境变量 (.env)

根据你使用的模型提供者填写:

# 使用阿里云 DashScope(兼容 OpenAI)
DASHSCOPE_API_KEY=sk-xxxxxx
DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1

# 或者使用 Anthropic
# ANTHROPIC_API_KEY=sk-ant-xxxxxx

4. 依赖文件 (requirements.txt)

flask==3.0.3
flask-cors==4.0.1
python-dotenv==1.0.1
langchain-openai==0.1.20   # 如果用 dashscope
# langchain-anthropic==0.1.20   # 如果用 anthropic
deepagents>=0.1.0          # 这个包可能还在开发,请使用最新版
# 注意:deepagents 会自动安装 langgraph 等依赖

安装命令pip install -r requirements.txt

如果 deepagents 包尚未在 PyPI 发布,你可能需要从 GitHub 安装:

pip install git+https://github.com/langchain-ai/deepagents.git

(具体请查阅 deepagents 官方文档)


5. 运行说明 (README.md)

# 深度智能体 + 前端调用

本整合项目基于 Deep Agents Template,通过 Flask 提供 HTTP API,前端可以聊天调用深度智能体(计划→委派→批评→最终回答)。

## 快速开始
1. 安装依赖
   ```bash
   pip install -r requirements.txt
  1. 配置 API Key
    .env 中填入你的 DASHSCOPE_API_KEY 或 ANTHROPIC_API_KEY。

  2. 启动后端

    python app.py
    

    服务运行在 http://0.0.0.0:5000

  3. 打开前端
    用浏览器打开 static/index.html 文件。

  4. 测试
    在聊天框输入问题,例如“西安天气怎么样?”或“分析一下人工智能对教育的影响”。

注意事项

  • 第一次调用可能较慢,因为 deep agent 会进行多轮内部推理。
  • 你可以修改 app.py 中的 get_weather 工具,或添加更多自定义工具。
  • 该模板继承了 deep agent 的 executewrite_file 能力,可以在对话中让 agent 执行代码或写入文件。

---

## 6. 验证工作

1. **启动后端**后,打开前端,输入“西安天气”。
   - 预期:智能体会调用 `get_weather` 工具,返回天气信息。
2. 输入“写一个 Python 脚本打印 hello world”。
   - 预期:deep agent 可能会使用 `execute` 工具运行代码(取决于模型决策)。
3. 输入“研究一下 LangChain 的最新进展”。
   - 预期:agent 可能会委派给 `researcher` 子智能体,然后返回总结。

---

## 如果 `deepagents` 包不可用怎么办?

如果 `deepagents` 库尚未公开或安装失败,你可以退而使用 `langgraph` 的 `create_react_agent` 并手动实现“计划-委派-批评”流程。但为了体验模板的完整功能,建议先去 [LangChain Deep Agents 官方仓库](https://github.com/langchain-ai/deepagents) 查看最新安装方式。

---

## 总结

- 你得到一个**独立的项目**,不是覆盖原有 README,而是新建一个基于 deep agent 的完整应用。
- 后端使用 `create_deep_agent`,保留了模板的规划、委派、批评、最终确定能力。
- 前端通过 HTTP 调用,与深度智能体对话。
- 你可以在此基础上任意扩展工具和子智能体。

如果你在安装 `deepagents` 时遇到问题,或者希望我提供一个**纯 `langgraph` 版本**(手动模拟计划-委派-批评流程),请告诉我,我可以再给你一套备选方案。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐