文档首页/ 智果(AgentArts)智能体平台/ 高代码开发/ 基础示例:创建基础对话智能体
更新时间:2026-06-04 GMT+08:00
分享

基础示例:创建基础对话智能体

场景概述

传统开发Agent的方式,是用户在本地使用LangChain或 LangGraph等编写智能体脚本,但当需要将其推向生产环境时,往往会卡在繁琐的工程化步骤上:需要手动编写路由、处理请求、构建Docker镜像,并自行寻找服务器部署。

AgentArts提供了一条从代码到生产的完整链路。

本示例作为高代码开发的入门第一课,将暂时剥离复杂的外部工具,带您体验AgentArts最基础但也最核心的“智能体运行时(Runtime)托管能力”。示例中将编写一个纯粹的带有模型的对话智能体,并展示如何通过AgentArts SDK将本地脚本转化为标准的HTTP Web服务,并托管到云端的AgentArts中。

适用场景:

  • 存量代码迁移:学习如何将已有的LangChain/LangGraph本地资产无缝接入AgentArts平台。
  • 熟悉开发链路:跑通“本地代码开发->SDK标准化封装->云端托管部署”的AgentArts高码开发流程。
  • 学习调用MaaS模型:学习如何在智能体中调用华为云MaaS服务提供的模型接口。

环境准备

  • 操作系统:Linux ARM64及X86,服务器可访问公网。
  • 安装Python:请确保Python 3.10及以上版本已安装。

    大多数Linux发行版(如Ubuntu)都预装了Python,您可以先通过python3 --version检查。如未安装,可以使用如下命令安装:

    sudo apt update
    sudo apt install python3
  • 安装Docker:请确保Docker 18.06及以上版本已安装如未安装,可以使用如下命令安装:
    # 查询 Docker 版本
    docker --version
    
    # 安装Docker
    sudo apt update
    sudo apt install docker.io

    华为云SWR基础版不支持OCI镜像格式,如果您使用的是Docker 27及以上版本,并且需要处理OCI镜像,可以通过设置环境变量来关闭OCI支持。

    export DOCKER_BUILDKIT=0
    # 或者
    export BUILDKIT_USE_OCI_MEDIA_TYPES=0
  • 执行以下命令安装SDK(建议在Python虚拟环境中安装,以避免与系统包产生冲突)。
    # 创建并激活虚拟环境 (linux) 
    python3 -m venv venv
    source venv/bin/activate
    
    # 安装sdk
    pip install agentarts-sdk
    • 执行pip install agentarts-sdk命令下载缓慢时可以更改为使用如下命令
      pip install agentarts-sdk -i https://repo.huaweicloud.com/repository/pypi/simple --trusted-host repo.huaweicloud.com
    • 如果系统缺少python3-venv包,导致无法创建虚拟环境,请按照命令回显提示安装python3-venv包。

  • 执行以下命令配置华为云凭证,获取华为云凭证请参考认证鉴权
    export HUAWEICLOUD_SDK_AK="your-access-key"
    export HUAWEICLOUD_SDK_SK="your-secret-key"

核心代码实现

  1. 执行如下命令安装langchain、langgraph、langchain-openai。

    pip install -U langchain langgraph langchain-openai

  2. 在本地创建agent.py文件,编辑代码如下。

    示例代码中创建了一个对话智能体,并对接华为云MaaS服务提供的模型。
    import os
    from typing import List, Dict, Any, TypedDict, Annotated
    from dotenv import load_dotenv
    
    from langgraph.graph import StateGraph, END
    from langgraph.graph.message import add_messages
    from langchain_core.messages import BaseMessage, HumanMessage, SystemMessage
    from langchain_openai import ChatOpenAI
    
    # 从 .env 文件加载环境变量
    load_dotenv()
    
    # ================================================================================
    # 第一部分:状态定义与配置
    # ================================================================================
    class AgentState(TypedDict):
        """
        Agent 状态类型定义
    
        这是 LangGraph 运行时的核心数据结构。
        - messages: 使用 add_messages 确保每次对话的新消息会被安全追加,而不是覆盖。
        """
        messages: Annotated[List[BaseMessage], add_messages]
    
    
    # ================================================================================
    # 第二部分:Agent 主类与工作流构建
    # ================================================================================
    class BasicAgent:
        """
        基础对话智能体类
    
        封装了 LLM 的初始化、LangGraph 工作流的构建与执行。
        """
        def __init__(self):
            # 强校验:没有 API Key 直接报错阻断,避免产生难以排查的网络错误
            api_key = os.getenv("MODEL_API_KEY")
            if not api_key:
                raise ValueError("[错误] 未找到 MODEL_API_KEY!请在 .env 文件中进行配置。")
    
            # 实例化大模型客户端 (对接华为云MaaS服务提供的模型)
            self._llm = ChatOpenAI(
                model=os.getenv("MODEL_NAME", "deepseek-v3.2"),
                base_url=os.getenv("MODEL_URL", "https://api.modelarts-maas.com/openai/v1"),
                api_key=api_key,
                temperature=0.7,
            )
            self.graph = self._build_graph()
            self.system_prompt = "你是一个乐于助人的 AI 助手,请简明扼要地回答问题。"
    
        def _build_graph(self):
            """
            创建 Agent 工作流图
    
            使用 LangGraph 的 StateGraph 构建极简工作流:
            1. 添加 agent 节点(调用 LLM 生成回复)
            2. 设置起点为 agent 节点
            3. 设置终点(执行完 agent 节点后直接结束,无工具循环)
    
            Returns:
                编译后的 LangGraph 图
            """
            def model_node(state: AgentState) -> AgentState:
                response = self._llm.invoke(state["messages"])
                return {"messages": [response]}
    
            workflow = StateGraph(AgentState)
            workflow.add_node("agent", model_node)
            workflow.set_entry_point("agent")
            workflow.add_edge("agent", END) 
            return workflow.compile()
    
        def run(self, user_input: str) -> str:
            """
            执行 Agent 处理用户输入
            """
            messages = [
                SystemMessage(content=self.system_prompt), 
                HumanMessage(content=user_input)
            ]
            result = self.graph.invoke({"messages": messages})
            return result["messages"][-1].content

  3. 创建.env环境变量配置文件。

    # 必填:您的华为云 MaaS API 密钥
    MODEL_API_KEY=xxxxxxxxxxxxxxxxxxxx
    
    # 选填:如果您想使用其他模型,取消下方注释并修改
    # MODEL_NAME=deepseek-v3.2
    # MODEL_URL=https://api.modelarts-maas.com/openai/v1

    获取模型API Key的方法请参考获取华为云MaaS服务模型API Key

    agent.py文件的示例中,使用华为云MaaS服务提供的deepseek-v3.2模型,如果使用其他模型注意MODEL_NAME的值,需填写为模型接口中model参数的值,可以参考如下方式获取。注意需要选择OpenAI兼容接口。

    图1 获取OpenAI兼容接口的model值

  4. 创建main.py文件,用于本地运行智能体,并进行测试。

    from agent import BasicAgent
    
    def main():
        print("正在初始化 Agent...")
        try:
            agent = BasicAgent()
        except Exception as e:
            print(e)
            return
    
        print("=" * 50)
        response = agent.run("你好,请用一句话做个自我介绍。")
        print(f"Agent 回复: \n{response}")
        print("=" * 50)
    
    if __name__ == "__main__":
        main()

  5. 将agent.py、.env、main.py上传至服务器中。

    如果您使用MobaXterm、Xshell这类客户端软件,可以直接在软件界面上拖拽上传。

  6. 执行python main.py命令对智能体进行本地测试。

    由于在main.py文件中已经设置好了问题“你好,请用一句话做个自我介绍。”,智能体本地运行时会调用大模型进行回复。有正常的回复即表示本地测试成功。

  7. 创建app.py文件,并上传至服务器中。该文件会将本地的Agent逻辑封装为符合AgentArts平台规范的Web服务。

    import os
    from typing import Dict, Any
    from agentarts.sdk import AgentArtsRuntimeApp, RequestContext
    from agent import BasicAgent
    
    # 实例化平台运行时应用
    app = AgentArtsRuntimeApp()
    
    try:
        my_agent = BasicAgent()
    except Exception as e:
        print(f"Agent 初始化失败: {e}")
        my_agent = None
    
    # ================================================================================
    # 第三部分:AgentArts 平台标准化接入 (核心)
    # ================================================================================
    @app.entrypoint
    async def handler(payload: Dict[str, Any], context: RequestContext = None) -> Dict[str, Any]:
        """
        AgentArts 平台标准 HTTP 暴露入口
    
        Args:
            payload: 请求载荷,包含用户输入 (如 payload.get("message"))
            context: 请求上下文,包含 session_id 等平台注入信息
        """
        if not my_agent:
            return {"response": "服务未正确初始化,请检查环境变量。", "status": "error"}
    
        query = payload.get("message", "")
        try:
            response = my_agent.run(query)
            return {"response": response, "status": "success"}
        except Exception as e:
            return {"response": f"执行出错: {str(e)}", "status": "error"}
    
    if __name__ == "__main__":
        # 平台托管时,必须读取 AGENT_RUN_PORT 环境变量以匹配容器端口契约
        run_port = int(os.getenv("AGENT_RUN_PORT", 8080))
        app.run(port=run_port)

  8. 执行python app.py启动http server,执行以下命令调用。通过该方法,在将代码真正推送到云端之前,在本地模拟云端环境,验证Agent的HTTP接口是否已经被正确封装且能正常通信。

    执行python app.py回显效果如下。

    打开一个新的终端窗口(保持原窗口运行),使用curl命令进行测试。测试完成后,可以使用Ctrl + C停止运行的进程。
    curl --location --request POST 'http://localhost:8080/invocations' \
    --header 'Content-Type: application/json' \
    --data-raw '{"message": "你好,请用一句话做个自我介绍。"}'

  9. 部署智能体运行时。

    按上述步骤完成后,基本代码开发已经完成,接下来准备将本地创建好的智能体部署托管到AgentArts平台。

    首先准备依赖文件requirements.txt,内容可参考如下:

    # ================================================================================
    # AgentArts LangGraph Agent Demo - 依赖清单
    # ================================================================================
    #
    # 本项目基于 AgentArts 平台,使用 LangGraph 框架构建 AI Agent
    # 依赖分为两部分:基础框架依赖 + 平台 SDK 依赖
    #
    # 安装方式:
    #   pip install -r requirements.txt
    #
    # ================================================================================
    
    
    # ================================================================================
    # 第一部分:LangGraph & LangChain 核心框架
    # ================================================================================
    # LangGraph: AI Agent 工作流编排框架
    # - 状态图定义与执行
    # - Checkpoint 持久化机制
    # - 条件边与节点路由
    langgraph>=0.2.0
    
    
    # LangChain: LLM 应用开发工具链
    # - 消息类型定义 (HumanMessage, AIMessage, SystemMessage)
    # - 工具系统 (@tool 装饰器)
    # - LLM 客户端封装
    langchain>=0.3.0
    langchain-core>=0.3.0
    langchain-community>=0.3.0
    
    
    # ================================================================================
    # 第二部分:LLM Provider 支持
    # ================================================================================
    # OpenAI 兼容接口
    openai>=1.0.0
    langchain-openai>=0.1.0
    
    
    # Anthropic (Claude) 支持
    anthropic>=0.18.0
    langchain-anthropic>=0.1.0
    
    
    # ================================================================================
    # 第三部分:HTTP & 网络
    # ================================================================================
    requests>=2.31.0
    httpx>=0.27.0
    
    
    # ================================================================================
    # 第四部分:工具与配置
    # ================================================================================
    # 环境变量管理
    python-dotenv>=1.0.0
    
    
    # 异步支持
    aiofiles>=23.0.0
    
    
    # JSON/YAML 支持
    pyyaml>=6.0
    
    
    # ================================================================================
    # 第五部分:AgentArts 平台 SDK(核心依赖) 
    # ================================================================================
    agentarts-sdk

  10. 执行如下命令配置智能体。

    agentarts configure --entrypoint app:app

    执行后按照操作指引进行配置。

    配置智能体名称(以小写字母开头,以小写字母或数字结尾,可以包含小写字母、数字和中划线)、服务部署区域(使用cn-southwest-2,仅支持此区域)、requirements.txt依赖文件、SWR Organization镜像组织名称(如果使用自定义的镜像组织名,需要在SWR服务控制台贵阳一region创建)

  11. 执行命令部署智能体。

    agentarts launch

    该命令会自动完成以下步骤:

    1. 本地构建Docker镜像。
    2. 将Docker镜像推送到华为云SWR镜像仓库。
    3. 部署到AgentArts运行时托管环境。

  12. 调用云端Agent进行会话。

    agentarts invoke '{"message": "你好,请用一句话做个自我介绍。"}'

常见问题

  • 执行agentarts launch命令时 出现AK/SK认证报错
    执行以下命令配置华为云凭证,获取华为云凭证请参考认证鉴权
    export HUAWEICLOUD_SDK_AK="your-access-key"
    export HUAWEICLOUD_SDK_SK="your-secret-key"

  • 执行agentarts launch命令出现运行时Runtime名称错误

    智能体的名称需要以小写字母开头,以小写字母或数字结尾,可以包含小写字母、数字和中划线,长度为2-48个字符。

    请重新执行agentarts configure --entrypoint app:app命令进行配置。

  • 执行agentarts launch命令,在执行requirements.txt步骤中出现Read timed out ... files.pythonhosted.org报错。

    问题现象及原因

    Docker镜像在构建过程中,尝试从官方PyPI服务器下载在requirements.txt里写的那些Python包,由于网络环境原因造成超时。

    解决方案

    执行以下命令让其在安装依赖时使用华为云官方的Python镜像加速器。
    sed -i 's|pip install --no-cache-dir -r requirements.txt|pip install --no-cache-dir -r requirements.txt -i https://repo.huaweicloud.com/repository/pypi/simple --trusted-host repo.huaweicloud.com|g' Dockerfile
  • 执行agentarts launch命令,出现failed to resolve reference "docker.io/library/python:3.10-slim"类型报错

    问题现象及原因

    尝试连接Docker官方镜像仓库(docker.io)下载python:3.10-slim基础环境时,网络连接超时(网络连接被阻断或者限速)。

    解决方案

    配置Docker国内镜像加速器

    执行以下命令在系统配置目录下创建一个名为docker的文件夹。

    sudo mkdir -p /etc/docker

    执行以下命令(直接复制下面这段代码并回车执行),更换Docker镜像源,从国内镜像站寻找python:3.10-slim。

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors":[
        "https://docker.m.daocloud.net",
        "https://dockerproxy.net",
        "https://mirror.baidubce.com"
      ]
    }
    EOF

    依次执行下面两条命令,重启Docker服务:

    sudo systemctl daemon-reload
    sudo systemctl restart docker

    Docker配置完成后,再次执行agentarts launch命令进行Agent部署。

  • 执行agentarts launch命令,在执行requirements.txt步骤中出现Read timed out ... files.pythonhosted.org报错。

    问题现象及原因

    Docker镜像在构建过程中,尝试从官方PyPI服务器下载在requirements.txt里写的那些Python包,由于网络环境原因造成超时。

    解决方案

    执行以下命令让其在安装依赖时使用华为云官方的Python镜像加速器。

    sed -i 's|pip install --no-cache-dir -r requirements.txt|pip install --no-cache-dir -r requirements.txt -i https://repo.huaweicloud.com/repository/pypi/simple --trusted-host repo.huaweicloud.com|g' Dockerfile

    配置完成后,再次执行agentarts launch命令进行Agent部署。

  • 执行agentarts launch命令出现Organization 'agentarts-org1' already exists、Failed to create/get organization 'agentarts-org1'报错。

    SWR服务镜像名称已被占用,请重新更换名称,即更换.agentarts_config.yaml文件中swr_config配置中organization参数的值、artifact_source参数中的值(在yaml文件中,该值共有2处需要替换)。

    可依次执行以下命令进行替换,也可以直接手动执行nano .agentarts_config.yaml命令进入到yaml文件中进行修改。

    # 将.agentarts_config.yaml文件中原有的 agentarts-org1 组织名替换为一个不容易重名的名字,比如 org_agent_6731
    sed -i 's/organization: agentarts-org1/organization: org_agent_6731/g' .agentarts_config.yaml
    
    # 修正 artifact_source 里的 URL 中的组织名,这里以 org_agent_6731 为例
    sed -i 's|url: swr.cn-southwest-2.myhuaweicloud.com/agentarts-org1/agent_my-agent:latest|url: swr.cn-southwest-2.myhuaweicloud.com/org_agent_6731/agent_my-agent:latest|g' .agentarts_config.yaml
  • 执行agentarts launch命令出现SVCSCTG.SWR.4030017、403 Insufficient permissions报错。

    如果使用IAM账户执行agentarts launch命令产生该报错,表示IAM用户没有SWR服务中创建组织或管理资源的权限。请联系主账号授予SWRFullAccessPolicy权限(在IAM新版控制台中授权,IAM控制台“总览”页面右上角处可切换至新版)。

相关文档