创建 Agent 实例#
功能介绍#
该 API 用于 openYuanrong 集群,创建常驻 agent 实例。agent 实例承载用户业务逻辑,创建后驻留直到显式销毁。
容器元信息支持两种来源:
模式 |
元信息来源 |
适用场景 |
|---|---|---|
inline |
create 请求体 |
单步创建,bypass meta_service |
registered |
注册的 funcMeta,create 传 |
元信息复用,多处创建同一函数 |
两者共存,请求体带 runtime_spec 走 inline,带 urn 走 registered,两者都有以 inline 为准。
前置条件#
openYuanrong 集群已部署并 healthy,按模式启动对应组件:
inline 模式(不注册函数,bypass meta_service):
yr start --master -s 'mode.master.frontend=true'registered 模式(需先注册函数):
yr start --master -s 'mode.master.frontend=true' -s 'mode.master.meta_service=true'
docker / supervisor 服务由用户自行准备:openYuanrong 不代管 docker daemon 或 supervisor 进程。
sandbox_type=docker时宿主须有可用的 docker daemon(镜像已 pull 或可拉取);sandbox_type=supervisor时宿主须有 supervisor 进程。服务不可用会导致 create 失败(如no Docker image specified、容器拉起失败)。镜像要求:docker executor 对 python runtime 启动时插入
yr_runtime_main.py作启动命令,镜像须安装openyuanrongsdk whl 包(自带yr_runtime_main.py、faas_executor、yr runtime),装在镜像默认 python 的 site-packages 下。workspace 与 UID 对齐(提供
workspace时):workspace是宿主机上的目录,系统自动 bind mount 到容器内/home/<rootfs.user>(rootfs.user为空时落/workspace),用户只需提供宿主路径,无需指定容器内挂载点。bind mount 按数字 UID 校验权限(不认用户名),容器内rootfs.user的 UID 必须与宿主 workspace 目录属主的 UID 一致,否则容器进程读 workspace 会Permission denied。例如rootfs.user=agentos:# 宿主 workspace 属主 UID(假设 /home/snuser/workspaceA 由 snuser 持有,UID=1002) stat -c '%u' /home/snuser/workspaceA # 1002 # 容器镜像内 agentos 的 UID(需要一致) docker run --rm yr-docker-runtime:v0 -c 'id -u agentos' # 须为 1002,否则需在镜像 Dockerfile 对齐
若镜像内 UID 与宿主不一致,调整方式:① 镜像 Dockerfile
useradd -u <宿主UID> agentos(推荐,一劳永逸);② 自验阶段chown -R <容器UID> /home/snuser/workspaceA改宿主目录属主;③chmod -R 755放宽权限(仅验证用)。
接口约束#
namespace、name必填。inline 模式必须带
runtime_spec,且runtime与rootfs.imageurl都非空。registered 模式必须先注册函数再 create:先调 注册函数(
POST /serverless/v1/functions,kind填agent)注册 agent 函数,确认注册成功(响应含functionVersionUrn)后,将该functionVersionUrn作为本接口的urn调 create。registered 模式必须带urn,指向该已注册的kind=agent函数;urn指向未注册或不存在的函数时返回 500failed to create agent。workspace可选:非空时 bind mount 到/home/<rootfs.user>(user空时落/workspace),为空则不挂载。bind mount 的source(含workspace与mounts[].source)须为宿主机绝对路径,经安全校验拒绝/、/etc、/proc、/sys、/dev、/boot、docker.sock、含..的路径。mounts[].target(容器内路径)不做校验,由调用方自行确保不覆盖容器内敏感路径(如/etc/passwd、/proc、/sys、/dev)。鉴权:
/api/agent经 frontend 全局GlobalJWTAuthMiddleware中间件,与集群其它 REST 接口一致。enable_func_token_auth关时默认放行(信任调用方),开时须携带有效 JWT。
URI#
POST /api/agent
请求参数#
请求 Header 参数#
参数 |
是否必选 |
参数类型 |
描述 |
|---|---|---|---|
Content-Type |
是 |
string |
消息体类型。建议填写 |
tenantId |
否 |
string |
租户 ID。inline 模式 funcKey 由 tenantID 组成,缺省 |
请求 Body 参数#
公共参数(两种模式)#
名称 |
类型 |
是否必选 |
描述 |
|---|---|---|---|
namespace |
String |
是 |
实例命名空间。 |
name |
String |
是 |
实例名(同一租户 + namespace 下需唯一)。 |
workspace |
String |
否 |
宿主机绝对路径,bind mount 到 |
env_vars |
map |
否 |
注入容器的环境变量。经 |
mounts |
array |
否 |
额外 bind mount。每项见 Mount。 |
inline 模式参数(runtime_spec)#
名称 |
类型 |
是否必选 |
描述 |
|---|---|---|---|
runtime_spec |
Object |
inline 必选 |
inline 容器配置。 |
runtime_spec.runtime |
String |
inline 必选 |
真实语言,映射 faasExecutor。取值见 Runtime 类型。 |
runtime_spec.sandbox_type |
String |
否 |
executor dispatch。取值: |
runtime_spec.rootfs |
Object |
inline 必选 |
容器 rootfs 配置。 |
runtime_spec.rootfs.imageurl |
String |
inline 必选 |
docker 镜像引用(如 |
runtime_spec.rootfs.user |
String |
否 |
容器 run-as 用户(镜像内须存在)。空时以 root 运行,安全风险高(容器内进程具备最高权限),生产环境建议显式指定非 root 用户。 |
runtime_spec.rootfs.ports |
array |
否 |
容器端口转发。格式 |
runtime_spec.cpu |
int |
否 |
CPU 大小,单位 |
runtime_spec.memory |
int |
否 |
内存大小,单位 |
registered 模式参数#
名称 |
类型 |
是否必选 |
描述 |
|---|---|---|---|
urn |
String |
registered 必选 |
函数 URN(如 |
Runtime 类型#
取值 |
映射 faasExecutor |
|---|---|
python3.6 / python3.7 / python3.8 / python3.9 / python3.10 / python3.11 |
Python3.x |
go / http / custom image |
Go1.x |
go为 Go 语言运行时;http指经 HTTP 通道调用(运行时仍为 Go executor);custom image指用户自定义镜像(启动命令由镜像自带,executor 仍映射 Go1.x)。三者复用同一 Go executor。 | java8 / java11 / java17 / java21 | Java8 / Java11 / Java17 / Java21 | | posix-custom-runtime | PosixCustom | | 其它 | PosixCustom(fallback) |
Mount#
名称 |
类型 |
是否必选 |
描述 |
|---|---|---|---|
source |
String |
是 |
宿主机绝对路径。 |
target |
String |
是 |
容器内路径。 |
readonly |
boolean |
否 |
是否只读。默认 |
响应参数#
名称 |
类型 |
描述 |
|---|---|---|
code |
int |
状态码, |
instance_id |
String |
实例 ID(UUID)。 |
示例#
inline 模式#
curl -X POST http://{frontend}:8888/api/agent -H "Content-Type: application/json" -d '{
"name": "agent-001", "namespace": "dev",
"runtime_spec": {
"runtime": "python3.11", "sandbox_type": "docker",
"rootfs": {"imageurl": "yr-docker-runtime:v0", "user": "agentos", "ports": ["tcp:22"]},
"cpu": 600, "memory": 512
},
"workspace": "/home/snuser/workspaceA",
"env_vars": {"AGENT_MODE": "prod", "userid": "u-9f3a"},
"mounts": [{"source": "/home/snuser/workspaceB", "target": "/mnt/workspaceB", "readonly": false}]
}'
响应:
{"code":200,"instance_id":"0b6c6322-6533-4901-8000-00000000bb0b"}
registered 模式#
registered 模式分两步:先注册 kind=agent 函数,确认注册成功(响应 code=0 且含 functionVersionUrn)后,再用该 URN 调 create。
# 1. 注册 agent 函数(一次性,确认 code=0 且响应含 functionVersionUrn)
curl -H "Content-type: application/json" -X POST http://{meta_service}:31182/serverless/v1/functions -d '{
"name": "0@myService@python-agent", "kind": "agent", "runtime": "python3.11",
"cpu": 600, "memory": 512, "timeout": 60,
"storageType": "local", "codePath": "/opt/mycode/service",
"environment": {"AGENT_MODE": "prod"},
"sandboxType": "docker",
"rootfs": {"type": "image", "imageurl": "yr-docker-runtime:v0", "user": "agentos", "ports": ["tcp:22"]}
}'
# 确认注册成功后,取 functionVersionUrn 作 urn
export FUNCTION_VERSION_URN='sn:cn:yrk:default:function:0@myService@python-agent:$latest'
# 2. 创建 agent 实例(带 urn,确认 docker/supervisor 服务已就绪)
curl -X POST http://{frontend}:8888/api/agent -H "Content-Type: application/json" -d '{
"name": "agent-001", "namespace": "dev", "urn": "'"${FUNCTION_VERSION_URN}"'",
"workspace": "/home/snuser/workspaceA",
"env_vars": {"userid": "u-9f3a"},
"mounts": [{"source": "/home/snuser/workspaceB", "target": "/mnt/workspaceB", "readonly": false}]
}'
响应:
{"code":200,"instance_id":"0b6c6322-6533-4901-8000-00000000bb0b"}
注册函数参数#
registered 模式先调 POST /serverless/v1/functions(详见 注册函数)注册 kind=agent 函数,参数如下:
名称 |
类型 |
是否必选 |
描述 |
|---|---|---|---|
name |
String |
是 |
函数名,格式 |
kind |
String |
是 |
函数类别,agent 必须填 |
runtime |
String |
是 |
真实语言,映射 faasExecutor;取值同 Runtime 类型。 |
cpu |
int |
是 |
CPU 大小,单位 |
memory |
int |
是 |
内存大小,单位 |
timeout |
int |
否 |
函数调用超时秒数,最大 |
storageType |
String |
否 |
代码包存储类型。 |
codePath |
String |
否 |
代码包本地路径。 |
environment |
map |
否 |
静态环境变量(key-value,均 string)。写入 funcMeta.Environment,create 时与动态 env_vars 合并下沉,agent kind 无 |
sandboxType |
String |
否 |
executor dispatch。取值 |
rootfs.type |
String |
否 |
rootfs 类型,docker 镜像填 |
rootfs.imageurl |
String |
否 |
docker 镜像引用。写入 funcMeta.rootfs.imageurl,create 时合并进 createOptions[“rootfs”] JSON。 |
rootfs.user |
String |
否 |
容器 run-as 用户(镜像内须存在)。create 时透传 createOptions[“host_user”]。 |
rootfs.ports |
array |
否 |
端口转发,格式 |
注册的 funcMeta 经 etcd
/sn/functions→ frontend watcher 加载进 funcSpecMap。create 时applyAgentFuncMeta透传 runtime/sandboxType/rootfs/cpu/memory/environment,无需在 create 请求体重复。
错误码#
响应体 code 字段:200 表示成功,500 表示失败(message 字段含具体错误信息)。
HTTP 状态 |
描述 |
|---|---|
400 |
错误的请求(Bad Request)。 |
500 |
内部服务器错误(Internal Server Error)。 |