跳到主要内容

本地开发与发布指南

本指南将带您深入了解 AgentRun 应用的完整开发生命周期。从本地环境搭建到云端部署,再到版本管理和灰度发布,您将掌握构建生产级 Agent 应用所需的全部技能。我们将循序渐进地介绍每个环节的原理和最佳实践,帮助您在实际项目中游刃有余。

理解开发工作流程​

在开始配置环境之前,让我们先了解 AgentRun 的开发工作流程。整个流程可以分为四个阶段:首先在本地环境中开发和调试 Agent 逻辑,这个阶段您可以快速迭代和验证想法;然后通过 Serverless Devs 工具构建部署包,确保代码与云端运行环境兼容;接着将应用部署到 AgentRun 平台,享受平台提供的弹性伸缩和高可用能力;最后通过版本管理和端点配置实现灰度发布,确保新功能平稳上线。

这种工作流程的设计充分考虑了开发效率和生产稳定性的平衡。本地开发环境让您能够快速验证想法,而云端部署则提供了企业级的可靠性保障。两者之间通过 Serverless Devs 工具无缝衔接,最大限度降低了从开发到生产的摩擦。

准备开发环境​

开发 AgentRun 应用需要准备三个关键组件:Serverless Devs 部署工具、Python 运行时环境和 Docker 容器引擎。这些工具各司其职,共同构成了完整的开发工具链。

安装 Serverless Devs 工具​

Serverless Devs 是阿里云提供的 Serverless 应用开发平台,它为 AgentRun 提供了项目脚手架、本地调试和云端部署能力。作为命令行工具,它通过简洁的命令抽象了复杂的云端操作,让您能够专注于业务逻辑而非基础设施管理。

使用 npm 全局安装 Serverless Devs 是最推荐的方式,因为 npm 会自动处理依赖关系并将命令添加到系统路径:

npm install -g @serverless-devs/s

安装完成后,验证工具是否可用:

s --version

如果命令正常输出版本号,说明 Serverless Devs 已成功安装。这个工具将贯穿整个开发流程,从项目初始化到部署上线都离不开它。

配置 Python 环境​

AgentRun 支持 Python 3.10 及以上版本作为运行时。Python 是 AI 开发的首选语言,拥有丰富的机器学习和 Agent 开发框架。确保您的系统安装了合适的 Python 版本:

python3 --version

如果版本低于 3.10,建议通过系统包管理器或 pyenv 升级到最新版本。此外,我们强烈推荐安装 uv 工具来管理 Python 依赖。uv 是新一代的 Python 包管理器,它使用 Rust 编写,比传统的 pip 快数十倍,能够显著提升依赖安装速度:

curl -LsSf https://astral.sh/uv/install.sh | sh

当然,如果您更习惯使用 pip,它同样可以胜任依赖管理工作。选择哪种工具取决于您的个人偏好和团队规范。

准备 Docker 环境​

Docker 在 AgentRun 开发流程中扮演着重要角色。当您执行 s build 命令时,Serverless Devs 会在 Docker 容器中安装项目依赖。这种方式确保了本地构建的代码包与云端运行环境完全一致,避免了"在我机器上可以运行"的经典问题。

验证 Docker 是否正常运行:

docker --version
docker ps

如果 Docker 尚未安装,请访问 Docker 官网下载适合您操作系统的版本。安装完成后,确保 Docker 服务处于运行状态。

配置云端访问凭证​

与 AgentRun 平台交互需要两组不同的访问凭证,理解它们的区别很重要。第一组是部署凭证,用于 Serverless Devs 工具调用阿里云 API 执行部署操作,包括创建 Agent Runtime、配置端点、管理版本等。第二组是运行时凭证,嵌入到 Agent 应用中,用于运行时访问 AgentRun 的服务资源,如调用模型服务、创建沙箱实例、使用工具集等。

首先配置部署凭证。在终端执行配置命令:

s config add

这个命令会启动交互式配置向导,按照提示依次输入您的阿里云账号信息。为这组凭证设置一个有意义的别名,例如 agentrun-deploy,这样在多账号或多环境场景下可以轻松切换。配置完成后,可以通过 s config get 命令查看已保存的凭证列表。

运行时凭证的配置稍后会在项目初始化章节中介绍,因为它们需要写入到项目的环境变量文件中。

初始化项目结构​

环境准备就绪后,就可以创建您的第一个 AgentRun 项目了。AgentRun 提供了精心设计的项目模板,包含了开箱即用的代码结构和配置文件,可以帮助您快速启动开发工作。

使用脚手架生成项目​

执行项目初始化命令:

s init agentrun-quick-start-langchain

这个命令从官方模板仓库下载 LangChain 框架的快速启动模板。模板选择取决于您偏好的 AI 开发框架,AgentRun 支持 LangChain、AgentScope、LangGraph、CrewAI 等多个主流框架。对于初学者,LangChain 是最佳选择,因为它拥有最完善的文档和最活跃的社区。

命令执行后会在当前目录创建 agentrun-quick-start-langchain 文件夹。进入项目目录并安装依赖:

cd agentrun-quick-start-langchain/code

如果您安装了 uv 工具,使用以下命令创建虚拟环境并安装依赖:

uv venv && uv pip install -r requirements.txt

uv 会在几秒钟内完成依赖安装,速度远超传统的 pip。如果您使用 pip,则执行:

python3 -m venv venv
source venv/bin/activate # Windows 系统使用 venv\Scripts\activate
pip install -r requirements.txt

虚拟环境的使用是 Python 开发的最佳实践,它将项目依赖与系统 Python 环境隔离,避免了版本冲突问题。

理解项目的组织结构​

让我们深入了解项目模板的结构设计。项目根目录包含两个核心部分:

agentrun-quick-start-langchain/
├── code/ # Agent 应用代码目录
│ ├── app.py # 应用程序主入口
│ ├── requirements.txt # Python 依赖声明文件
│ └── .env # 运行时环境变量配置(需要手动创建)
└── s.yaml # Serverless Devs 部署配置文件

code 目录是您编写业务逻辑的地方。app.py 文件定义了 Agent 的核心行为,包括模型配置、工具加载、请求处理等。打开这个文件,您会看到清晰的代码结构:

from agentrun.integration.langchain import model, sandbox_toolset
from agentrun.sandbox import TemplateType
from agentrun.server import AgentRequest, AgentRunServer
from agentrun.utils.log import logger

# 配置模型和沙箱资源
MODEL_NAME = "<your-model-name>"
SANDBOX_NAME = "<your-sandbox-name>"

# 验证配置有效性
if MODEL_NAME.startswith("<"):
raise ValueError("请将 MODEL_NAME 替换为您已经创建的模型名称")

# 加载沙箱工具集
code_interpreter_tools = []
if SANDBOX_NAME and not SANDBOX_NAME.startswith("<"):
code_interpreter_tools = sandbox_toolset(
template_name=SANDBOX_NAME,
template_type=TemplateType.CODE_INTERPRETER,
sandbox_idle_timeout_seconds=300,
)
else:
logger.warning("SANDBOX_NAME 未设置或未替换,跳过加载沙箱工具。")

# 启动 HTTP 服务器监听请求
AgentRunServer(invoke_agent=invoke_agent).start()

这段代码完成了三个关键任务。首先从 AgentRun 平台获取模型和沙箱资源,并将它们转换为 LangChain 框架所需的格式。然后定义 Agent 的处理逻辑,决定如何响应用户请求。最后启动一个 HTTP 服务器,在 9000 端口监听外部请求,提供 OpenAI 兼容的 API 接口。

requirements.txt 文件声明了项目的 Python 依赖,包括 AgentRun SDK、LangChain 框架等。s.yaml 则是 Serverless Devs 的配置文件,定义了如何将应用部署到云端,包括资源规格、环境变量、网络配置等。

创建和配置云端资源​

在本地运行 Agent 之前,您需要在 AgentRun 控制台创建必要的云端资源。这些资源为 Agent 提供了实际的计算能力,本地开发时通过 API 调用它们,部署到云端后同样使用这些资源。

创建模型服务​

模型是 Agent 的"大脑",负责理解用户意图、规划执行步骤、生成回复内容。登录 AgentRun 控制台,进入模型管理页面,根据您的需求选择创建模型服务或模型代理。

模型服务用于接入您自己部署的模型,这种方式给予您完全的控制权,适合有特殊定制需求或数据安全要求的场景。模型代理则用于接入第三方模型 API,如 OpenAI GPT-4、阿里云通义千问、百度文心一言等,这种方式配置简单,可以快速开始开发。

创建完成后,记录下模型的名称,例如 my-model。这个名称将在代码中用于引用该模型资源。

创建沙箱模板​

沙箱为 Agent 提供了安全的代码执行环境。在代码解释器场景下,Agent 可以编写 Python 代码并在沙箱中运行,从而具备数据计算、文件处理等能力。在浏览器场景下,Agent 可以控制无头浏览器访问网页、提取信息,实现网页自动化操作。

在控制台创建沙箱模板时,选择 Python 3.10 或更高版本作为运行时,确保与您的本地开发环境版本一致。配置合适的资源规格,通常 1 核 2GB 内存足以应对大多数任务。根据 Agent 的需求决定是否允许沙箱访问公网,如果需要调用外部 API 或下载数据,则需要开启网络访问。

创建完成后,记录沙箱模板的名称,例如 my-sandbox。

配置项目代码​

现在将云端资源名称填入项目代码。打开 code/app.py 文件,找到模型和沙箱配置部分:

MODEL_NAME = "my-model"      # 替换为您创建的模型名称
SANDBOX_NAME = "my-sandbox" # 替换为您创建的沙箱模板名称

这些配置告诉 AgentRun SDK 使用哪些云端资源。SDK 会自动处理与这些资源的交互细节,您只需关注业务逻辑即可。

接下来配置运行时凭证。在 code 目录下创建 .env 文件:

AGENTRUN_ACCESS_KEY_ID=your-access-key-id
AGENTRUN_ACCESS_KEY_SECRET=your-access-key-secret
AGENTRUN_ACCOUNT_ID=your-account-id
AGENTRUN_REGION=cn-hangzhou

将其中的值替换为您的实际凭证信息。这些环境变量在本地开发时由 .env 文件提供,部署到云端后则通过 s.yaml 的配置注入。需要特别注意的是,.env 文件包含敏感信息,绝不应该提交到 Git 仓库。建议在 .gitignore 文件中明确排除它,并创建一个 .env.example 文件作为模板,只包含配置项的名称而不包含实际值。

本地开发和调试​

配置完成后,就可以在本地启动 Agent 服务进行开发和测试了。本地开发环境的优势在于快速反馈,您可以立即看到代码修改的效果,无需等待漫长的部署过程。

启动本地服务​

在 code 目录下,首先激活虚拟环境(如果使用):

source venv/bin/activate  # Windows 系统使用 venv\Scripts\activate

然后启动应用:

python app.py

程序启动后,会输出类似以下的日志信息:

INFO:     Started server process
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:9000

这表示 HTTP 服务器已成功启动,正在 9000 端口监听请求。AgentRun SDK 使用 Uvicorn 作为 ASGI 服务器,它是 Python 异步 Web 应用的标准选择,性能优异且稳定可靠。

服务运行在前台,您可以实时看到所有的请求日志和错误信息。这对于开发调试非常有帮助,您能够清楚地了解 Agent 的思考过程、工具调用情况和执行结果。

测试 Agent 功能​

打开另一个终端窗口,使用 curl 命令测试 Agent。这里我们使用 OpenAI 兼容的 Chat Completions API,这是业界标准接口,大多数 AI 客户端库都支持它:

curl 127.0.0.1:9000/openai/v1/chat/completions \
-XPOST \
-H "content-type: application/json" \
-d '{"messages": [{"role": "user", "content": "通过代码查询现在是几点?"}], "stream":true}'

这个请求模拟用户提问"现在是几点"。Agent 收到请求后,会经历一系列的推理过程。首先分析问题,判断需要使用代码工具来获取当前时间;然后生成一段 Python 代码,例如 import datetime; print(datetime.datetime.now());接着将代码提交到沙箱执行;最后获取执行结果,并将其转换为自然语言回复返回给用户。

由于请求中设置了 "stream":true,响应会以流式方式返回。您可以看到 Agent 的思考过程逐步展开,就像与人类专家对话一样。这种流式输出大大改善了用户体验,避免了长时间等待的焦虑感。

您可以尝试更多样化的测试来验证 Agent 的能力。例如测试数学计算:

curl 127.0.0.1:9000/openai/v1/chat/completions \
-XPOST \
-H "content-type: application/json" \
-d '{"messages": [{"role": "user", "content": "帮我计算斐波那契数列的第20项"}], "stream":true}'

或者测试数据处理能力:

curl 127.0.0.1:9000/openai/v1/chat/completions \
-XPOST \
-H "content-type: application/json" \
-d '{"messages": [{"role": "user", "content": "生成一个包含10个随机数的列表并计算平均值"}], "stream":true}'

这些测试帮助您验证 Agent 是否能够正确理解问题、选择合适的工具、生成可执行的代码,并将结果清晰地呈现给用户。

调试技巧和最佳实践​

在本地开发过程中,您可能会遇到各种问题。掌握一些调试技巧可以大大提高效率。

如果需要查看更详细的日志信息,可以在 .env 文件中设置日志级别:

LOG_LEVEL=DEBUG

DEBUG 级别会输出 SDK 内部的详细执行信息,包括 API 调用参数、响应内容等,这对于诊断问题非常有帮助。但在生产环境中应该使用 INFO 或 WARNING 级别,避免产生过多的日志数据。

对于复杂的逻辑问题,Python 的内置调试器 pdb 是强大的工具。在需要暂停执行的地方插入断点:

import pdb; pdb.set_trace()

程序运行到这里会暂停,您可以交互式地检查变量值、执行表达式、单步执行代码等。

如果怀疑环境变量配置有问题,可以快速验证:

python -c "import os; print(os.environ.get('AGENTRUN_ACCESS_KEY_ID'))"

这个命令会输出当前环境中的 AccessKey ID,帮助您确认环境变量是否正确加载。

本地测试通过后,就可以准备将 Agent 部署到云端了。但在部署之前,让我们先深入理解部署配置文件的结构。

配置部署参数​

项目根目录的 s.yaml 文件是 Serverless Devs 的配置文件,它定义了 Agent Runtime 的所有部署参数。理解这个文件的结构对于自定义部署非常重要。

理解基础配置结构​

一个典型的 s.yaml 文件包含以下几个部分:

edition: 3.0.0
name: my-agentrun-app
access: default # 引用 s config add 配置的凭证别名

resources:
my-agent:
component: agentrun
props:
region: cn-hangzhou

agent:
name: my-agent-runtime
description: "My Agent Runtime"

code:
src: ./code
language: python3.12
command:
- python3
- app.py

cpu: 1.0
memory: 2048
port: 9000

role: acs:ram::{your-account-id}:role/agentRunRole

配置文件采用 YAML 格式,层次清晰且易于理解。edition 指定配置文件的格式版本,name 是应用的标识符。access 字段引用之前通过 s config add 配置的凭证,Serverless Devs 会使用这组凭证来调用阿里云 API。

resources 部分定义了要部署的资源,可以包含多个 Agent Runtime。每个 Resource 需要指定 component: agentrun,表示使用 AgentRun 组件进行部署。

props.agent 部分定义了 Agent Runtime 的具体配置。code 字段有三种配置方式:从本地目录部署(src)、从 OSS 代码包部署(ossBucketName 和 ossObjectName)、或使用自定义容器镜像(customContainerConfig)。对于大多数场景,从本地目录部署是最简单直接的方式。

资源配置(cpu、memory)决定了 Agent 实例的计算能力。合理配置这些参数很重要:配置过低会导致性能问题,配置过高则会增加成本。建议从较小的配置开始,根据实际运行情况逐步调整。

配置 RAM 角色权限​

role 字段指定 Agent Runtime 运行时使用的 RAM 角色。这个角色需要具备访问 AgentRun 服务的权限,包括调用模型、创建沙箱、使用工具集等。AgentRun 提供了快速授权链接,可以自动创建具有合适权限的角色。

点击快速授权链接后,系统会引导您创建名为 agentRunRole 的角色,并自动附加必要的权限策略。

创建完成后,将角色 ARN 填入配置文件:

role: acs:ram::123456789:role/agentRunRole  # 将 123456789 替换为您的阿里云账号 ID

角色 ARN 的格式固定为 acs:ram::{账号ID}:role/{角色名称}。您可以在 RAM 控制台查看角色的完整 ARN。

高级配置选项详解​

除了基础配置,AgentRun 还支持许多高级特性,适用于更复杂的部署场景。

如果您的 Agent 需要定制的系统依赖或特殊的运行环境,可以使用容器镜像部署:

agent:
name: my-container-agent

customContainerConfig:
image: registry.cn-hangzhou.aliyuncs.com/namespace/my-agent:latest
command:
- python3
- app.py
port: 9000

cpu: 2.0
memory: 4096

这种方式下,您需要先构建 Docker 镜像并推送到阿里云容器镜像服务。镜像中应该包含完整的运行环境,包括 Python 运行时、依赖包、应用代码等。容器模式提供了最大的灵活性,但也增加了维护复杂度。

对于需要访问数据库或其他内网资源的 Agent,可以配置 VPC 网络:

agent:
name: my-vpc-agent

code:
src: ./code
language: python3.12
command: [python3, app.py]

vpcConfig:
vpcId: vpc-bp1234567890abcdef
vSwitchIds:
- vsw-bp1111111111111111
- vsw-bp2222222222222222
securityGroupId: sg-bp1234567890abcdef

internetAccess: true

VPC 配置将 Agent 实例部署到您的虚拟私有网络中,实现网络隔离和安全访问控制。vSwitchIds 可以配置多个交换机,平台会在这些交换机中均匀分配实例,实现高可用部署。internetAccess: true 表示实例同时具有公网和内网访问能力,如果设为 false 则只能访问内网资源。

如果需要持久化日志并进行分析,可以配置 SLS 日志服务:

agent:
name: my-agent

logConfig:
project: my-sls-project
logstore: agentrun-logs

role: acs:ram::123456789:role/agentRunRole

配置日志服务后,Agent 的所有输出都会自动采集到 SLS,您可以使用 SLS 的强大分析能力进行日志查询、统计、告警等操作。这对于生产环境的可观测性至关重要。

多环境配置策略​

在实际项目中,通常需要维护多个部署环境,例如开发环境用于日常开发和测试,生产环境用于正式服务用户。为每个环境创建独立的配置文件是最佳实践。

创建开发环境配置文件 s.dev.yaml:

edition: 3.0.0
name: dev-agentrun-app
access: default

vars:
region: cn-hangzhou
env: dev

resources:
my-agent:
component: agentrun
props:
region: ${vars.region}
agent:
name: agent-${vars.env}

code:
src: ./code
language: python3.12
command: [python3, app.py]

cpu: 1.0
memory: 2048

environmentVariables:
ENVIRONMENT: ${vars.env}
LOG_LEVEL: debug

role: acs:ram::123456789:role/agentRunRole

开发环境通常使用较低的资源配置,启用详细的日志级别,方便调试问题。vars 部分定义的变量可以在配置中通过 ${vars.变量名} 引用,避免重复配置。

生产环境配置文件 s.prod.yaml 则需要更高的资源规格和更严格的安全配置:

edition: 3.0.0
name: prod-agentrun-app
access: production

vars:
region: cn-hangzhou
env: prod

resources:
my-agent:
component: agentrun
props:
region: ${vars.region}
agent:
name: agent-${vars.env}

code:
src: ./code
language: python3.12
command: [python3, app.py]

cpu: 2.0
memory: 4096
instanceConcurrency: 50

vpcConfig:
vpcId: ${env(VPC_ID)}
vSwitchIds: [${env(VSWITCH_ID)}]
securityGroupId: ${env(SECURITY_GROUP_ID)}
internetAccess: true

environmentVariables:
ENVIRONMENT: ${vars.env}
LOG_LEVEL: info

logConfig:
project: prod-logs
logstore: agentrun-runtime

role: acs:ram::123456789:role/agentRunRole

注意生产环境使用了 VPC 配置实现网络隔离,配置了日志服务实现可观测性,并且使用 ${env()} 语法从环境变量读取敏感配置,避免将它们硬编码到配置文件中。

通过 -t 参数可以指定使用哪个配置文件部署:

s deploy -t s.dev.yaml   # 部署到开发环境
s deploy -t s.prod.yaml # 部署到生产环境

这种多环境配置策略既保证了环境隔离,又便于统一管理。

构建和部署应用​

配置文件准备就绪后,就可以开始构建和部署流程了。构建过程会将您的代码和依赖打包成可部署的格式,部署过程则将包上传到 AgentRun 平台并创建运行时实例。

构建部署包​

在项目根目录执行构建命令:

s build

这个命令的执行过程比较复杂但非常重要。Serverless Devs 首先拉取一个与云端运行环境相同的 Docker 镜像,然后在容器中安装 requirements.txt 中声明的所有依赖包。这种方式确保了构建产物与云端环境完全兼容,避免了因本地环境差异导致的部署失败。

构建过程可能需要几分钟,具体时间取决于依赖包的数量和大小。构建产物会保存在 .s 目录中,包含了代码文件和所有依赖的二进制文件。您可以查看这个目录了解构建结果,但通常不需要手动修改它。

构建成功后,终端会输出确认信息:

Building agent: my-agent-runtime
✅ Build completed successfully

如果构建失败,请仔细阅读错误信息。常见的问题包括:Docker 服务未启动、requirements.txt 中的包不存在或版本冲突、网络连接问题导致包下载失败等。

部署到云端环境​

构建完成后,执行部署命令:

s deploy

如果您配置了多个凭证,需要通过 -a 参数指定使用哪一个:

s deploy -a agentrun-deploy

或者使用特定的配置文件:

s deploy -t s.prod.yaml -a production

部署过程包含多个步骤:首先上传构建产物到云端存储,然后调用 AgentRun API 创建或更新 Agent Runtime,配置网络和权限,最后创建默认端点并等待实例就绪。整个过程通常需要几分钟,您可以在终端看到实时的进度信息。

如果遇到问题,可以添加 --debug 参数查看详细的 API 调用日志:

s deploy --debug

这会输出每个 API 请求的 URL、参数、响应等详细信息,帮助您诊断问题。

部署成功后,终端会显示完整的输出信息:

agent:
id: abc123-def456-ghi789
arn: acs:agentrun:cn-hangzhou:123456789:runtimes/my-agent-runtime
name: my-agent-runtime
description: My Agent Runtime
status: READY
region: cn-hangzhou

endpoints:
- id: ep-abc123
name: production
url: https://12345.agentrun-data.cn-hangzhou.aliyuncs.com/agent-runtimes/my-agent-runtime/endpoints/production/invocations

输出中最重要的信息是 endpoint URL,这是您的 Agent 在云端的访问地址。将 API 路径拼接到这个 URL 后面,即可调用云端 Agent。

验证部署结果​

部署完成后,使用 curl 命令测试云端 Agent 是否正常工作:

ENDPOINT_URL="https://12345.agentrun-data.cn-hangzhou.aliyuncs.com/agent-runtimes/my-agent-runtime/endpoints/production/invocations"

curl ${ENDPOINT_URL}/openai/v1/chat/completions \
-XPOST \
-H "content-type: application/json" \
-d '{"messages": [{"role": "user", "content": "通过代码查询现在是几点?"}], "stream":true}'

这个请求与本地测试时完全相同,只是 URL 指向了云端服务。如果返回了正确的响应,说明部署成功。此时您的 Agent 已经在 AgentRun 平台上运行,享受平台提供的弹性伸缩、负载均衡、监控告警等企业级能力。

云端 Agent 会根据请求量自动扩缩容。当没有请求时,实例会自动缩减为零,不产生任何费用。当请求到来时,平台会在毫秒级别启动实例处理请求。这种 Serverless 架构极大地降低了运维成本,让您能够专注于业务逻辑而非基础设施管理。

管理运行中的 Agent​

部署成功只是开始,持续的运维和管理同样重要。AgentRun 提供了丰富的管理命令,帮助您监控 Agent 的运行状态、查看日志、调整配置等。

查看 Agent 详细信息​

使用 info 命令查看 Agent Runtime 的完整配置:

s info

这个命令会输出 Agent 的所有属性,包括资源配置、网络设置、环境变量、端点列表等:

agent: 
id: 1062cdd0-042e-407b-8a3f-234370c2c68c
arn: acs:agentrun:cn-hangzhou:1583208943291465:runtimes/my-agent-runtime
name: my-runtime
description: My Agent Runtime
artifactType: Code
status: READY
resources:
cpu: 1
memory: 2048
port: 9000
timestamps:
createdAt: 2025-01-01T00:00:00.000000Z
lastUpdatedAt: 2025-01-01T01:00:00.000000Z
region: cn-hangzhou
endpoints:
- id: ep-abc123
name: production
url: https://12345.agentrun-data.cn-hangzhou.aliyuncs.com/...

status: READY 表示 Agent 处于就绪状态,可以正常处理请求。如果状态为其他值(如 CREATING、UPDATING、FAILED),说明 Agent 正在进行某项操作或遇到了问题。

查询和分析日志​

日志是诊断问题和了解 Agent 行为的重要工具。使用 logs 命令可以查询各种维度的日志:

# 查看最近的日志
s logs

# 实时监控日志流
s logs --tail

# 指定时间范围查询
s logs --start-time "2024-01-01 00:00:00" --end-time "2024-01-01 23:59:59"

# 根据请求 ID 查询完整调用链路
s logs --request-id 1-63f9c123-xxxx

# 根据实例 ID 查询特定实例的日志
s logs --instance-id c-63f9c123-xxxx

# 搜索包含特定关键词的日志
s logs --search "error"

# 只查看失败的请求
s logs --type fail

# 高亮显示匹配的文本
s logs --search "error" --match "error"

--tail 模式特别适合实时监控,它会持续输出新产生的日志,类似于 Unix 的 tail -f 命令。当您需要观察 Agent 对特定请求的响应时,这个模式非常有用。

日志内容包含了请求的完整上下文:用户输入、Agent 的推理过程、工具调用参数和结果、最终的响应内容、执行时间等。通过分析日志,您可以了解 Agent 的决策逻辑是否符合预期,发现性能瓶颈,定位错误原因。

更新 Agent 配置​

当您修改了代码或配置后,需要重新部署才能让更改生效。AgentRun 支持热更新,部署过程中不会中断服务:

s build
s deploy

平台会创建新版本的实例,待新实例就绪后再将流量切换过去,然后销毁旧实例。整个过程对用户透明,不会造成服务中断。

如果只是修改了某些配置参数而没有改动代码,可以直接部署而无需重新构建:

s deploy

Serverless Devs 会智能判断哪些部分发生了变化,只更新必要的资源,从而加快部署速度。

删除 Agent Runtime​

如果不再需要某个 Agent,可以使用 remove 命令删除:

s remove

系统会要求确认操作,因为删除是不可逆的。如果确定要删除,输入 y 确认。也可以使用 -y 参数跳过确认:

s remove -y

删除操作会清理 Agent Runtime 及其所有关联资源,包括端点、实例、配置等。但不会删除您在控制台创建的模型和沙箱资源,这些资源可能被其他 Agent 使用。

版本管理和灰度发布​

在生产环境中,直接用新代码替换旧代码是有风险的。如果新版本存在 bug,可能会影响所有用户。AgentRun 提供了版本管理和灰度发布机制,让您能够安全地推出新功能。

理解版本系统​

AgentRun 的版本系统将每次部署产生的 Agent 配置保存为一个不可变的版本。版本用整数标识,从 1 开始递增。此外还有一个特殊的 LATEST 版本,始终指向最新的部署。

当您执行 s deploy 时,如果代码或配置发生了变化,系统会自动创建新版本。您可以将某个稳定的版本发布为正式版本,并通过端点将流量路由到特定版本。

版本的不可变性是其核心优势。一旦创建,版本的内容永远不会改变,这保证了版本的可追溯性。如果新版本出现问题,可以立即切换回旧版本,实现快速回滚。

发布正式版本​

通过 version publish 命令将当前部署发布为正式版本:

s version publish --description "Production release v1.0"

描述信息应该清晰地说明这个版本的主要变更和特性,方便日后查询。发布成功后,系统会为这个版本分配一个编号,例如版本 1、版本 2 等。

查看所有已发布的版本:

s version list

输出会显示每个版本的编号、发布时间、描述信息等。通过这些信息,您可以了解 Agent 的演进历史,在需要时快速定位特定版本。

使用端点管理流量​

端点是 Agent 的访问入口,每个端点可以指向特定的版本。通过配置多个端点并设置流量权重,可以实现灰度发布。

在 s.yaml 中配置端点:

agent:
endpoints:
- name: production
version: "1"
description: "稳定版本"

- name: canary
version: "2"
description: "灰度版本"
weight: 0.2

这个配置创建了两个端点:production 端点指向版本 1,接收 80% 的流量;canary 端点指向版本 2,接收 20% 的流量。通过逐步增加 canary 的权重,可以平滑地将流量迁移到新版本。

部署配置后,端点会立即生效:

s deploy

您也可以通过命令行动态调整端点配置:

# 创建或更新端点,指向特定版本
s endpoint publish --endpoint-name prod-v2 --target-version 2 --description "Production v2"

# 调整灰度比例
s endpoint publish --endpoint-name canary --target-version 2 --weight 0.5

查看所有端点的配置:

s endpoint list

查看特定端点的详细信息:

s endpoint get --endpoint-name production

灰度发布完整流程​

让我们通过一个完整的案例来理解灰度发布的最佳实践。假设您开发了一个新特性,需要在不影响现有用户的前提下逐步推广。

第一步是部署新代码并发布为正式版本:

# 修改代码后构建和部署
s build
s deploy

# 发布为版本 2
s version publish --description "Added new feature X"

第二步是创建灰度端点,将 10% 的流量导入新版本:

s endpoint publish --endpoint-name canary --target-version 2 --weight 0.1 --description "Canary 10%"

此时 production 端点仍然指向版本 1,大部分用户不受影响。只有 10% 的流量会体验到新特性,您可以通过监控日志和指标来验证新版本的稳定性。

第三步是观察一段时间后逐步增加流量。如果新版本运行正常,将灰度比例提高到 50%:

s endpoint publish --endpoint-name canary --target-version 2 --weight 0.5

继续观察,如果没有问题,最终将 production 端点切换到新版本:

s endpoint publish --endpoint-name production --target-version 2

现在所有流量都已迁移到版本 2,灰度发布完成。如果在任何阶段发现问题,可以立即将端点切回旧版本,实现快速回滚:

s endpoint publish --endpoint-name production --target-version 1

这个流程既保证了新功能的充分验证,又最大限度降低了故障影响范围,是生产环境推荐的发布策略。

实例管理和诊断​

在某些情况下,您需要深入到运行实例内部进行诊断。AgentRun 提供了实例管理命令,允许您查看实例状态、执行调试命令等。

查看运行实例列表​

使用 instance list 命令查看当前运行的所有实例:

s instance list

输出会显示每个实例的 ID、状态、创建时间等信息。实例的生命周期由平台自动管理,当有请求需要处理时创建实例,空闲一段时间后自动回收。

在实例中执行命令​

instance exec 命令允许您在运行的实例中执行任意命令,这对于调试问题非常有用:

# 执行单个命令
s instance exec --instance-id c-xxxx --cmd "ls -lh"

# 查看进程列表
s instance exec --instance-id c-xxxx --cmd "ps aux"

# 查看环境变量
s instance exec --instance-id c-xxxx --cmd "env"

# 读取文件内容
s instance exec --instance-id c-xxxx --cmd "cat /app/app.py"

您还可以打开交互式 Shell,就像 SSH 登录到实例一样:

s instance exec --instance-id c-xxxx

这会启动一个交互式终端,您可以执行多个命令、查看文件、检查进程状态等。退出时输入 exit 即可。

如果需要在特定目录执行命令,使用 --workdir 参数:

s instance exec --instance-id c-xxxx --workdir /app --cmd "pwd"

需要注意的是,对实例的修改不会持久化。实例重启后会恢复到部署时的状态。如果需要永久性修改,应该修改代码并重新部署。

并发控制和性能优化​

AgentRun 的弹性伸缩机制可以根据负载自动调整实例数量,但有时您需要更精细的控制。并发配置允许您设置预留并发和最大并发,优化成本和性能的平衡。

理解并发模型​

AgentRun 的并发控制有两个维度。实例级并发(instanceConcurrency)决定了单个实例能同时处理多少个请求。账户级并发则决定了您的 Agent 总共能启动多少个实例。

默认情况下,实例级并发为 10,这适合大多数场景。如果您的 Agent 逻辑非常轻量,可以提高这个值以减少实例数量,降低冷启动的影响。如果 Agent 需要大量计算资源,则应该降低这个值,避免实例过载。

账户级并发包括预留并发和最大并发。预留并发是平台保证始终可用的实例数量,即使在高峰期也能立即响应请求。最大并发则是实例数量的上限,防止失控的流量耗尽您的配额。

配置并发参数​

在 s.yaml 中设置实例级并发:

agent:
instanceConcurrency: 20 # 单实例可同时处理 20 个请求

设置预留并发通过命令行完成:

s concurrency put --reserved-concurrency 10

这个命令预留了 10 个并发额度,平台会保证始终有足够的实例来处理这个并发量。预留并发适合有稳定基线流量的应用,可以消除冷启动延迟。

查看当前的并发配置:

s concurrency get

移除并发配置,恢复为完全弹性模式:

s concurrency remove

系统会要求确认操作,因为移除预留并发后,实例可能会被回收,导致后续请求遇到冷启动。

生产环境最佳实践​

在实际项目中积累的经验教训往往比文档更有价值。以下是一些经过验证的最佳实践,可以帮助您避免常见的陷阱,构建更稳定、更安全的 Agent 应用。

项目组织建议​

良好的项目结构是可维护性的基础。推荐的目录组织如下:

my-agentrun-project/
├── .git/
├── .gitignore
├── README.md
├── s.yaml # 默认配置
├── s.dev.yaml # 开发环境配置
├── s.prod.yaml # 生产环境配置
└── code/
├── app.py
├── requirements.txt
├── .env # 本地环境变量(不提交到 Git)
├── .env.example # 环境变量模板
├── agent/ # Agent 业务逻辑
│ ├── __init__.py
│ ├── handler.py
│ └── tools.py
└── utils/ # 通用工具函数
├── __init__.py
└── logger.py

将业务逻辑分散到多个模块中,每个模块负责特定的功能。app.py 作为入口文件应该保持简洁,主要负责初始化和启动服务。具体的 Agent 逻辑放在 agent 目录中,工具函数放在 utils 目录中。

创建 .env.example 文件作为环境变量模板,列出所有需要的配置项但不包含实际值:

AGENTRUN_ACCESS_KEY_ID=
AGENTRUN_ACCESS_KEY_SECRET=
AGENTRUN_ACCOUNT_ID=
AGENTRUN_REGION=cn-hangzhou

团队成员可以复制这个文件为 .env 并填入自己的凭证。这种方式既方便了新成员上手,又避免了泄露敏感信息。

Git 忽略配置​

.gitignore 文件应该排除所有不应该提交到版本控制的内容:

# 环境变量和敏感信息
.env
.env.local
*.key
*.pem

# Serverless Devs 构建产物
.s/
.serverless/

# Python 运行时文件
__pycache__/
*.py[cod]
*$py.class
*.so
venv/
env/
ENV/

# IDE 和编辑器文件
.idea/
.vscode/
.DS_Store
*.swp
*.swo

# 日志文件
*.log
logs/

确保在项目初始化时就创建这个文件,避免意外提交敏感信息。

环境隔离策略​

为开发、测试、生产环境创建完全独立的配置,包括:

  • 不同的 Agent Runtime 名称(如 agent-dev、agent-prod)
  • 不同的模型和沙箱资源
  • 不同的资源配置(开发环境用小规格,生产环境用大规格)
  • 不同的网络配置(开发环境可以公网访问,生产环境使用 VPC)
  • 不同的日志级别(开发环境用 DEBUG,生产环境用 INFO)

理想情况下,为不同环境使用不同的阿里云账号或 RAM 用户,实现权限和资源的完全隔离。这样即使开发环境出现问题,也不会影响生产环境。

安全加固建议​

安全性应该贯穿开发的每个环节。以下是关键的安全实践:

首先,绝对不要在代码中硬编码密钥或密码。所有敏感信息都应该通过环境变量传递。使用 .gitignore 确保 .env 文件不会被提交到 Git。

其次,为不同环境使用不同的 API Key 和访问凭证。这样即使某个环境的凭证泄露,也不会影响其他环境。定期轮换凭证也是好习惯,建议至少每季度更换一次。

第三,生产环境应该启用 VPC 网络隔离。将 Agent 实例部署在虚拟私有网络中,只暴露必要的端点,所有内网资源(如数据库)都不应该直接暴露在公网上。

第四,配置 RAM 角色时遵循最小权限原则。只授予 Agent 必需的权限,不要为了方便而使用管理员权限。定期审计角色权限,移除不再需要的策略。

第五,启用日志服务并配置日志分析和告警。及时发现异常访问模式,例如频繁的失败请求可能意味着有人在尝试攻击。

监控和告警策略​

可观测性是生产系统的生命线。配置全面的监控指标和告警规则,在问题影响用户之前发现并解决它们。

关键的监控指标包括:

  • 请求量和 QPS:了解流量模式,为扩容决策提供依据
  • 响应时间(P50、P90、P99):识别性能问题
  • 错误率:及时发现功能故障
  • 实例数量和并发度:评估资源利用效率
  • 模型调用延迟和成本:优化模型使用策略

在 AgentRun 控制台或 SLS 中配置告警规则。例如,当错误率超过 5% 时发送告警,当 P99 响应时间超过 30 秒时发送告警,当单小时成本超过阈值时发送告警等。

告警应该分级处理。紧急告警(如服务完全不可用)应该立即通知值班人员,可以通过短信或电话。普通告警(如某个端点的错误率略有上升)可以通过邮件或钉钉通知,在工作时间处理即可。

持续监控日志,寻找优化机会。例如,如果发现某个工具的调用延迟很高,可以考虑优化实现或缓存结果;如果发现用户经常问同类问题,可以针对性地优化提示词或添加专门的处理逻辑。

常见问题和解决方案​

在实际使用中,您可能会遇到一些常见的问题。以下是这些问题的诊断方法和解决方案。

问题:部署时报错 "agent configuration is required"

这个错误表示配置文件格式有问题。检查 s.yaml 文件,确保 props 下有 agent 字段,并且缩进正确。YAML 对缩进非常敏感,使用空格而非制表符,每级缩进两个空格。

问题:本地测试正常,部署后无法访问

这种情况通常有几个原因。首先检查端口配置是否一致,确保 s.yaml 中的 port 与代码中 AgentRunServer 监听的端口相同。其次检查环境变量,本地通过 .env 文件加载的变量在云端需要配置在 s.yaml 的 environmentVariables 中。第三检查 RAM 角色权限,确保角色有访问模型和沙箱的权限。最后查看日志,通过 s logs --type fail 查看失败请求的详细信息。

问题:如何回滚到之前的版本

如果新版本出现问题,通过端点切换快速回滚。首先查看版本列表 s version list,找到稳定版本的编号,然后更新端点指向该版本 s endpoint publish --endpoint-name production --target-version 1。切换会立即生效,新的请求会路由到旧版本。

问题:构建失败,提示 "Docker is not running"

这表示本地 Docker 服务未启动。运行 docker ps 测试 Docker 是否正常。如果提示连接错误,启动 Docker Desktop(Mac/Windows)或 Docker 守护进程(Linux)。确认 Docker 运行后重新执行 s build。

问题:如何查看 Agent 运行时使用的环境变量

环境变量通过 s.yaml 的 environmentVariables 配置注入到实例中。要查看实例中的实际值,使用实例执行命令:s instance list 获取实例 ID,然后 s instance exec --instance-id c-xxxx --cmd "env | grep AGENTRUN" 查看所有 AGENTRUN 相关的环境变量。

问题:实例频繁冷启动,如何优化

冷启动是 Serverless 架构的常见挑战。优化方法包括:配置预留并发保持实例常驻,优化代码减少启动时间(例如延迟加载大型依赖),使用更轻量的基础镜像,或者通过定时任务定期发送请求保持实例温暖。根据业务特点选择合适的策略。

问题:日志查询很慢或查不到

如果配置了 SLS 日志服务,日志可能需要几秒钟才能被采集和索引。查询历史日志时,尽量缩小时间范围,使用 --start-time 和 --end-time 参数。如果通过 --request-id 查询,确保 ID 完全正确。如果仍然查不到,检查日志配置是否正确,role 是否有写入 SLS 的权限。

至此,您已经掌握了 AgentRun 应用开发的完整流程,从环境搭建到本地开发,从云端部署到生产运维。这些知识和实践将帮助您构建稳定、高效、安全的生产级 Agent 应用。随着对平台的深入使用,您会发现更多优化和定制的机会,不断提升 Agent 的能力和用户体验。