---
title: 基于openJiuwen的自然语言生成Agent功能尝鲜-官方技术文章-昇腾社区
description: 本文介绍了基于openJiuwen框架的智能Agent自动生成系统，该系统采用多Agent协作架构，支持三种生成模式：ReAct Agent、Workflow 和 Multi-Agent，并且提供了独立的前端界面方便用户快速构建Agent应用，用户可以通过自然语言描述自动生成完整的、可运行的基于openJiuwen框架的代码来构建智能体，降低智能体开发技术门槛的同时提升了开发效率。
keywords: Jiuwen,Agent,的自然语言生,功能尝鲜,官方技术文章,昇腾社区,非商用声明,自动生成系统
url: https://www.hiascend.com/developer/techArticles/20260323-1?envFlag=1
section: (其他)
---

# 基于openJiuwen的自然语言生成Agent功能尝鲜-官方技术文章-昇腾社区

URL: https://www.hiascend.com/developer/techArticles/20260323-1?envFlag=1
描述: 本文介绍了基于openJiuwen框架的智能Agent自动生成系统，该系统采用多Agent协作架构，支持三种生成模式：ReAct Agent、Workflow 和 Multi-Agent，并且提供了独立的前端界面方便用户快速构建Agent应用，用户可以通过自然语言描述自动生成完整的、可运行的基于openJiuwen框架的代码来构建智能体，降低智能体开发技术门槛的同时提升了开发效率。
关键词: Jiuwen,Agent,的自然语言生,功能尝鲜,官方技术文章,昇腾社区,非商用声明,自动生成系统

官方技术文章 [了解详情](https://www.hiascend.com/zh/developer/techArticles)

基于openJiuwen的自然语言生成Agent功能尝鲜

基于openJiuwen的自然语言生成Agent功能尝鲜

人工智能AIAgent

发表于: 2026/03/23

# 1 非商用声明

该文档提供的内容为参考实践，仅供用户参考使用，用户可参考实践文档构建自己的软件，按需进行安全、可靠性加固，但不建议直接将相关Demo或镜像文件集成到商用产品中。

# 2 基于openJiuwen的Agent自动生成系统

## 2.1 简介

VibeAgent是基于openJiuwen框架的智能Agent自动生成系统，该系统采用多Agent协作架构，支持三种生成模式：ReAct Agent、Workflow 和 Multi-Agent，并且提供了独立的前端界面方便用户快速构建Agent应用，其系统架构图如下所示：

用户可以通过自然语言描述自动生成完整的、可运行的基于openJiuwen框架的代码来构建智能体，降低智能体开发技术门槛的同时提升了开发效率。

## 2.2 安装部署

1、conda 创建环境

```
conda create --name vibe_agent python=3.11 
conda activate vibe_agent
```

如未安装conda可参考如下命令安装：

```
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh  
chmod +x Miniconda3-latest-Linux-aarch64.sh    
bash Miniconda3-latest-Linux-aarch64.sh
```

2、克隆仓库并进入相应目录

仓库地址：openJiuwen-vibeCoding - AtomGit | GitCode [了解详情](https://gitcode.com/taojianjun/openJiuwen-vibeCoding)

```
git clone https://gitcode.com/taojianjun/openJiuwen-vibeCoding.git
```

3、安装后端依赖

```
#进入./backend目录 
pip install -r requirements.txt
```

4、安装前端依赖

```
#前端依赖Node.js 18+，如未安装，可参考如下命令安装Node.js 18.x，已安装可跳过 
conda install -c conda-forge nodejs=18 -y 
#进入./frontend目录
npm install
```

5、配置 LLM 服务

进入 /backend/ 目录，在 .env中配置API Key、模型服务地址和模型名称等，由于自然语言构建Agent依赖LLM能力，建议使用编程能力较强的模型，如Qwen3-Coder系列或其他旗舰模型。

```
# 模型提供商：openai / dashscope / others 
MODEL_PROVIDER=dashscope 
 
# API 服务地址 
API_BASE=https://dashscope.aliyuncs.com/compatible-mode/v1 
 
# API Key（请替换为你的实际密钥） 
API_KEY=your_api_key_here 
 
# 默认使用的模型名称 
MODEL_NAME=qwen3-coder-plus
```

6、修改/backend目录下的start.sh脚本

将"#加载 .env 文件（如果存在）"后的代码做如下修改，否则不能成功加载环境变量

```
# 加载 .env 文件（如果存在）
if [ -f ".env" ]; then
    echo "发现 .env 文件，将加载环境变量"
    while IFS= read -r line; do
        # 跳过注释行（以 # 开头）和空行
        if [[ "$line" =~ ^# || -z "$line" ]]; then
            continue
        fi
        # 导出变量到当前环境
        export "$line"
    done < ".env"
else
    echo "警告: 未找到 .env 文件，请复制 .env.example 为 .env 并配置"
    exit 1
fi
```

7、启动后端服务

```
#进入/backend目录 
bash start.sh
```

8、另起一个终端启动前端服务

```
#进入/frontend目录
npm run dev
```

启动成功后可以看到如下输出：

访问Network相应地址地址后可见如下可视化界面：

注意：如果端口被占用可修改前后端的端口

1、后端：修改 vibeAgent/backend/.env 中的 PORT=8000 ，修改端口后需修改 vibeAgent/frontend/vite.config.ts中target参数的端口，与后端端口保持一致。

2、前端：修改 vibeAgent/frontend/vite.config.ts 中的 port: 3000。如前端访问失败可将vibeAgent/frontend/vite.config.ts中target参数的 http://localhost:8000 改为 http://127.0.0.1:8000 。

## 2.3 添加自定义工具

vibeAgent/backend/app/config/available_tools_info.json文件中定义了系统可以使用的工具，系统默认包括了MockWeatherQuery、MovieQuery、MovieList三个工具。

可以参照默认工具的格式来添加自定义工具，扩充VibeAgent系统生成Agent时的可用工具列表，例如可添加自定义的搜索与预问诊报告生成工具，response可为空。

## 2.4 自然语言生成ReAct Agent

### 构建提示词

以构建的预问诊助手智能体为例，可将智能体规划阶段设计的智能体主要功能、核心能力、可用工具等组装成提示词用于生成Agent，参考提示词如下所示：

```
Agent名称： 
预问诊助手Agent 
主要功能： 
面向普通用户提供健康咨询、症状初步自查与就医流程指引，仅做健康指引/辅助参考，不替代临床面诊、不提供确诊结论、不开具处方。 
核心能力： 
1、精准识别用户症状描述，对模糊的症状描述主动追问关键信息； 
2、结合用户问题与网络搜索结果给出科学、合规的解答； 
3、根据用户基础信息、症状信息等给出就诊建议，最终输出预问诊报告指导用户就医。 
可以使用如下工具： 
1、用于联网检索专业知识的搜索工具、 
2、用于根据用户信息输出预问诊报告的工具。
```

### 生成Agent

选择Agent模式，输入相应提示词后点击生成Agent即可一键式自动生成指定Agent。

接收生成Agent指令后，VibeAgent系统首先会进行任务规划，之后按照规划的步骤依次生成配置文件、 tools_analysis 文件、Agent逻辑文件、主执行文件，在页面中代码文件部分可以查看生成的相应代码，其中：

1、config.py主要为相应LLM的配置信息；

2、tools_analysis.py定义ReAct Agent使用的工具；

3、local_agent.py为ReAct Agent实现，核心为工具绑定和思考执行逻辑；

4、main.py为主执行文件，作为整个ReAct Agent的入口；

生成完相应的代码文件后会自动进行测试，测试通过后即完成智能体的构建。

查看tools_analysis.py文件，可以看到VibeAgent成功定义了我们自行添加的搜索工具和预问诊报告生成工具。

### 试运行

点击试运行按钮即可与Agent进行对话，Agent按预期引导用户描述详细症状信息。

收到报告生成指令后可正常调用工具生成预问诊报告。

## 2.5 自然语言生成工作流

## 2.5.1 工作流生成与修改

### 构建提示词

以预问诊报告生成工作流为例，提示词中建议描述工作流包含的具体步骤，参考提示词如下所示：

```
创建一个预问诊工作流，用户输入为症状描述，步骤如下：
1、采集用户基础信息（姓名、性别、年龄、身高、体重）；
2、进行症状初步分析；
3、给出就诊建议与就医流程指引；
```

### 生成工作流

选择Workflow工作流模式，输入相应提示词后点击生成工作流即可一键式自动生成指定工作流。

接收生成工作流指令后，VibeAgent系统首先会进行任务规划，之后按照规划的步骤依次生成配置文件、组件文件、工作流连接文件、主执行文件，在页面中代码文件部分可以查看生成的相应代码，其中：

1、config.py主要为相应LLM、工作流的配置信息；

2、components.py实现所有组件的创建函数；

3、workflow_builder.py为工作流构建器，用于组装和连接工作流组件；

4、main.py执行和测试工作流；

生成完相应的代码文件后会自动进行测试，若测试不通过则自动进入修复阶段，修复完成并测试通过后即完成工作流的构建。

点击流程图按钮即可查看工作流对应的流程图，显示了各个组件的链接关系，如未显示可点击刷新按钮，亦可点击下载按钮下载流程图。

### 试运行

点击试运行按钮即可在右侧对话框进行测试，当输入用户症状时，工作流首先会调用提问组件收集用户信息，可在对话框中填入相应信息进行回复。

工作流完成后给出相应的就诊建议与就医流程指引。

### 修改工作流

VibeAgent支持通过自然语言对工作流进行修改，可在左侧对话框中输入自然语言描述想要的修改，系统会自动进行修改与测试，如输入“最终总结所有内容给用户一个格式化的美观的回答“优化工作流回复的格式。

修改完成后可以看到流程图上新增一个节点用于格式化最终回答，试运行后可看到工作流回复格式更加美观。

## 2.5.2 工作流部署与调用

工作流试运行通过后可点击一键部署按钮进行部署，可通过相应接口进行访问，系统提供了详细的使用文档。

根据使用文档可以编写简单的python脚本在本地服务器上调用工作流，如下所示，参考python脚本见3.1-工作流服务化调用参考脚本。

# 2.6 自然语言生成Multi-Agent

### 构建提示词

构建一个医疗多Agent系统，参考提示词如下所示：

```
创建医疗多Agent系统，具备以下功能：
- 预问诊：根据用户提供的症状，初步判断可能的疾病，并推荐合适的科室或医生。
- 随访：对已就诊患者进行定期健康状况跟踪，提醒复诊或用药。
- 病理分析：根据提供的检查报告或病理数据，提供初步分析和建议。
- 健康咨询：解答用户关于健康、营养、运动、疾病预防等方面的问题。
```

### 生成Multi-Agent

选择Multi-Agent多智能体模式，输入相应提示词后点击生成Agent即可一键式自动生成指定Agent，我们使用与上文中相似的提示词，由于当前Multi-Agent不支持使用工具，因此提示词中去掉了工具的相应描述。

接收生成Agent指令后，VibeAgent系统首先会进行任务规划，之后按照规划的步骤依次生成配置文件、Leader Agent文件、Worker Agents文件、主执行文件，在页面中代码文件部分可以查看生成的相应代码，其中：

1、config.py主要为相应LLM模型配置和Group 配置；

2、leader_agent.py定义了Leader Agent，负责任务分解和协调Worker；

3、worker_agents.py定义多个Worker Agents，每个专注特定任务；

4、main.py为主执行文件，作为整个MultiAgent的入口；

生成完相应的代码文件后会自动进行测试，测试通过后即完成智能体的构建。

查看worker_agents.py文件可以看到系统创建了四个worker agents，分别对应我们定义的四个功能。

### 试运行

点击试运行按钮即可与Agent进行对话，Agent按预期进行回复。

# 2.7 调用系统生成的Agent

VibeAgent系统生成的代码保存在./experiments文件夹下，experiments文件夹下的每个文件夹对应一个生成的Agent/工作流，可以直接使用相应的代码来调用相应的Agent/工作流。

以新闻推荐工作流为例：

1、在相应Agent/工作流目录内新增python脚本用于调用工作流

直接执行main.py文件仅会进行测试，需自行编写脚本调用工作流，参考脚本test_workflow.py见附录3.2-工作流本地调用参考脚本

2、修改config.py文件

在import os后添加如下加载环境变量的代码

```
from dotenv import load_dotenv  
# 加载 .env 文件（如果存在）
load_dotenv()
```

3、复制/backend目录中的.env文件到/experiments文件夹下目标Agent/工作流文件夹内

复制.env文件后的参考目录结构如下所示：

4、执行工作流调用脚本

```
#可直接在上文创建的vibe_agent环境中执行测试
#或者可自行安装相应依赖包后进行测试
conda activate vibe_agent
python test_workflow.py
```

执行结果如下所示：

可以参考上述流程自行编写相应脚本来调用系统生成的ReAct Agent或Multi-Agent。

# 3 附录

## 3.1 工作流服务化调用参考脚本

该脚本可用于调用服务化部署的工作流，实现在终端中与工作流进行交互，注意需修改base_url为实际的服务地址。

```
import requests 
import json 
import os 
class WorkflowClient: 
    def __init__(self, base_url): 
        self.base_url = base_url 
        self.conversation_id = f"user_{os.getpid()}" 
        self.execution_id = None 
        self.component_id = None 
        self.auto_reply = False  # 默认自动回复 
    def start_chat(self, query): 
        """初始请求""" 
        payload = { 
            "query": query, 
            "conversation_id": self.conversation_id, 
            "auto_reply": self.auto_reply 
        } 
        response = requests.post(f"{self.base_url}/chat", json=payload) 
        return response.json() 
    def continue_execution(self, reply_value): 
        """继续执行（人机交互）""" 
        payload = { 
            "execution_id": self.execution_id, 
            "reply_value": reply_value, 
            "component_id": self.component_id, 
            "auto_reply": self.auto_reply 
        } 
        response = requests.post(f"{self.base_url}/chat", json=payload) 
        return response.json() 
    def format_response(self, response): 
        """精确提取混合格式响应中的JSON内容""" 
        if "content" not in response: 
            return "无返回内容" 
         
        content = response["content"] 
         
        try: 
            # 查找result={开头的部分 
            result_start = content.find("result={") 
            if result_start == -1: 
                return content  # 如果没有result=，返回原始内容 
             
            # 提取大括号内的JSON部分 
            json_str = content[result_start + len("result="):] 
            json_end = json_str.find(" ", json_str.find("}"))  # 找到第一个}后的空格 
            json_str = json_str[:json_end] if json_end != -1 else json_str 
             
            # 安全解析JSON字符串 
            import ast 
            result_dict = ast.literal_eval(json_str) 
             
            if isinstance(result_dict, dict) and "responseContent" in result_dict: 
                return result_dict["responseContent"] 
            return content  # 如果没有responseContent，返回原始内容 
         
        except (SyntaxError, ValueError): 
            return content  # 解析失败返回原始内容 
    def chat_with_user(self): 
        """与用户交互的主循环""" 
        print("工作流已启动，输入'exit'退出") 
        while True: 
            user_input = input("用户: ") 
            if user_input.lower() == 'exit': 
                print("退出工作流") 
                break 
            if not self.execution_id: 
                # 初始请求 
                response = self.start_chat(user_input) 
            else: 
                # 继续执行 
                response = self.continue_execution(user_input) 
             
            # 处理响应 
            if response.get("interaction_required"): 
                # 需要用户输入 
                self.execution_id = response["execution_id"] 
                self.component_id = response["component_id"] 
                print(f"系统: {response['question']}") 
             
            if response["success"]: 
                formatted = self.format_response(response) 
                print(f"系统: \n {formatted}") 
                self.execution_id = None 
                self.component_id = None 
             
            if not response["success"] and not response.get("interaction_required"): 
                print(f"错误: {response.get('error', '未知错误')}") 
                continue 
if __name__ == "__main__": 
    # 需修改base_url为实际的服务地址 
    base_url="http://localhost:8460" 
    client = WorkflowClient(base_url) 
    client.chat_with_user()
```

## 3.2 工作流本地调用参考脚本

该脚本可用于本地调用工作流，实现在终端中与工作流进行交互，test_workflow.py代码如下所示：

```
import asyncio
import os
import sys
import io
from typing import List
# 设置标准输出编码（解决Windows控制台乱码）
if sys.platform == "win32":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
from config import create_llm_client
from workflow_builder import build_workflow_agent
from openjiuwen.core.runtime.interaction.interactive_input import InteractiveInput
from openjiuwen.core.stream.base import OutputSchema
# 配置工作流超时（5分钟）
os.environ["WORKFLOW_EXECUTE_TIMEOUT"] = "300"
llm_client = create_llm_client()
async def handle_user_input(user_query: str, conversation_id: str):
    """处理用户输入的主逻辑"""
    workflow_agent = build_workflow_agent()
    response = await workflow_agent.invoke({"query": user_query, "conversation_id": conversation_id})
    
    # 处理人机交互循环
    while isinstance(response, List):
        interactive_input = InteractiveInput()
        for item in response:
            if isinstance(item, OutputSchema) and item.type == '__interaction__':
                component_id = item.payload.id
                question = item.payload.value
                
                # 显示问题并获取用户输入
                print(f"系统问题: {question}")
                user_reply = input("您的回答: ")
                
                interactive_input.update(component_id, user_reply)
        response = await workflow_agent.invoke({"conversation_id": conversation_id, "query": interactive_input})
    
    print(f"执行结果: {response}")
    return response
async def interactive_mode():
    """交互式主循环"""
    print("工作流交互模式已启动（输入 'exit' 退出）")
    conversation_id = f"user_{id(asyncio.get_event_loop())}"  # 生成唯一会话ID
    
    while True:
        user_input = input("\n请输入您的问题（或 'exit' 退出）: ")
        if user_input.lower() == 'exit':
            print("工作流结束")
            break
        await handle_user_input(user_input, conversation_id)
if __name__ == "__main__":
    asyncio.run(interactive_mode())
```

本页内容
