跳到主要内容

部署并调用推理端点

推理通过项目所属 endpoint 提供已训练 LoRA。你可以直接部署已有 checkpoint,无需再次训练。Endpoint 有独立的就绪、缩容和计费生命周期。

Job 推理 API​

推理部署是 type=inference 的 Job。一个 Trial 记录一个 worker 进程实例的生命周期; 请求复用进程,实际进程重启才产生新 Trial。零 worker 时没有运行中的 Trial。 OpenAI 兼容 Base URL 为 https://api.envloop.ai/v1/job/YOUR_JOB_ID/Inference,I 大写。

方法路径
GET/v1/job/{job_id}/Inference/models
POST/v1/job/{job_id}/Inference/chat/completions
POST/v1/job/{job_id}/Inference/completions

路径确定服务,model 必须是该 Job 返回的模型,其他 Job 的 model 会被拒绝。 平台选择 worker,调用方不能传 trial_id、worker_id 或 upstream 选路字段。 认证后的旧 /inference/v1/* 返回 410 INFERENCE_ROUTE_RETIRED,不会重定向 POST。 平台与客户端需配套升级。Endpoint 管理 SDK/API 保留并返回 job_id, endpoints.generate() 必须显式传入该 Job ID。顶层 el inference 已移除。 本地地址保留 /api:http://127.0.0.1:5173/api/v1/job/YOUR_JOB_ID/Inference。

开始前​

需要已授权项目 Key、已注册训练 checkpoint,以及匹配基座模型和 revision 的可部署 serving profile。先按安装指南安装公开包 envloop-cli,获得 CLI 与 Python SDK。目录中存在 profile 不代表任意 checkpoint 都兼容,注册时会检查实际产物。

el auth status --check
el checkpoint list --limit 25
el job serving-profile list --json

Serving profile 描述基座模型/revision、支持的 adapter 格式和 rank、可选硬件、默认硬件,以及可用时的价格。使用实际返回值,不要猜测硬件名、把缺失价格视为免费,或仅凭模型名认定可部署。

控制台只读查看​

Jobs 的 Inference 类型视图只读展示 endpoints、adapters、硬件、副本、费率、校验结果和活动。使用下方 CLI 命令注册 adapter、创建和管理 endpoint;网页不提供部署或生命周期按钮。详情的 Connect 可复制 Base URL、Model 与调用示例。

用 Python 部署​

下例假设已有核验过的 checkpoint,会启动推理计算,并保留 endpoint,直到你主动暂停或删除:

from envloop import Client

with Client.remote() as client:
profiles = client.endpoints.profiles()["items"]
profile = next(p for p in profiles
if p["name"] == "qwen38-27b@1" and p["deployable"])
adapter = client.adapters.register(
"YOUR_CHECKPOINT_PATH", serving_profile=profile["name"])
endpoint = client.endpoints.create(
name="support-chat", serving_profile=profile["name"],
adapters=[{"alias": "sft", "adapter_id": adapter["adapter_id"]}],
scaling={"min_replicas": 0, "max_replicas": 1,
"scale_to_zero_after_s": 300})
print({"job_id": endpoint["job_id"], "endpoint_id": endpoint["endpoint_id"],
"model": endpoint["model"] + "/sft"})
client.endpoints.wake(endpoint["endpoint_id"])
ready = client.endpoints.wait(endpoint["endpoint_id"], timeout=2400)
print(ready["status"])

新建时使用新名称;重试前先查看已有 endpoint。wait() 只观察就绪,不会唤醒零副本端点。需要失败自动清理保护的实验,使用训练并部署。

CLI 接受相同公共注册/创建请求的 JSON 文件:

el job adapter register --file adapter.json
el job submit --type inference --file endpoint.json
el job get YOUR_JOB_ID
el job wake YOUR_JOB_ID
el job event YOUR_JOB_ID --json

adapter.json 包含 request_id、serving_profile 和 source: {"type":"train_checkpoint","tinker_path":"YOUR_CHECKPOINT_PATH"}。endpoint.json 使用 request_id 和 spec,将部署配置放在 spec 中: request_id、name、serving_profile、该 profile 返回的 hardware、adapters 和 scaling。新操作用新 request ID,仅对完全相同的重试复用它。

从 Python 调用​

在应用环境安装 OpenAI Python 客户端,通过常用秘密管理方式设置 ENVLOOP_API_KEY。从端点详情复制完整模型名:

import os
from openai import OpenAI

client = OpenAI(
base_url="https://api.envloop.ai/v1/job/YOUR_JOB_ID/Inference",
api_key=os.environ["ENVLOOP_API_KEY"],
timeout=120,
)
response = client.chat.completions.create(
model="YOUR_ENDPOINT_MODEL/sft",
messages=[{"role": "user", "content": "Explain gravity in one sentence."}],
max_tokens=128,
temperature=0,
)
print(response.choices[0].message.content)

YOUR_ENDPOINT_MODEL/sft 是占位符。实际 model 为 endpoint 返回的 model 前缀加别名,不能用 endpoint_id、adapter_id、基座模型仓库名或 checkpoint URI 代替。自建部署使用其控制台显示的 Base URL。

API 提供 OpenAI 兼容的 chat completions、text completions 和模型发现。支持流式请求,但 tools、图片输入、结构化输出和额外生成参数等能力,取决于所选 profile 与模型。兼容不代表包含全部 OpenAI 产品 API。

流式文本示例:

stream = client.chat.completions.create(
model="YOUR_ENDPOINT_MODEL/sft",
messages=[{"role": "user", "content": "Say hello."}],
max_tokens=64,
stream=True,
)
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)

发送 HTTP 请求​

把 ENVLOOP_MODEL 设置成 endpoint 显示的完整模型别名。请求读取环境中的 Key,不要在文档或共享脚本中写入真实 Key。

curl --fail-with-body https://api.envloop.ai/v1/job/YOUR_JOB_ID/Inference/chat/completions \
-H "Authorization: Bearer $ENVLOOP_API_KEY" \
-H 'Content-Type: application/json' \
--data "{\"model\":\"$ENVLOOP_MODEL\",\"messages\":[{\"role\":\"user\",\"content\":\"Say hello.\"}],\"max_tokens\":64}"

成功的 HTTP 响应与非空 assistant 内容证明请求的 endpoint 回答了。若要判断训练效果,用相同生成设置在留出提示词上比较 /sft 与 /base。

Anthropic Messages API​

同一个端点也接受 Anthropic Messages 请求:POST https://api.envloop.ai/v1/job/YOUR_JOB_ID/Inference/v1/messages,因此 Anthropic SDK 和 Claude Code 可以直接使用你训练的模型。Base URL 设为 https://api.envloop.ai/v1/job/YOUR_JOB_ID/Inference(客户端会自动追加 /v1/messages),用 EnvLoop Key 作为 X-API-Key 或 Authorization: Bearer 认证,二者不能同时使用。

import os
from anthropic import Anthropic

client = Anthropic(base_url="https://api.envloop.ai/v1/job/YOUR_JOB_ID/Inference",
api_key=os.environ["ENVLOOP_API_KEY"])
message = client.messages.create(model="YOUR_ENDPOINT_MODEL/sft", max_tokens=128,
messages=[{"role": "user", "content": "用一句话解释重力。"}])
print(message.content[0].text)

流式输出和工具调用取决于推理 profile 的能力。将 ANTHROPIC_BASE_URL、ANTHROPIC_API_KEY、ANTHROPIC_MODEL(以及 ANTHROPIC_DEFAULT_*_MODEL 别名)指向该端点,并把 CLAUDE_CODE_EFFORT_LEVEL 设为模型接受的级别(如 medium),即可在端点上运行 Claude Code。不提供 token 计数接口(/v1/messages/count_tokens)。在模型上运行 Claude Code,见用 Agent benchmark 评测训练后的模型。

理解冷启动​

状态如何处理
SCALED_TO_ZERO无运行副本,请求或 Start 可分配副本
PROVISIONING等待模型准备,请求可能返回冷启动响应
READY可以发起请求,失败时检查 ready replica
PAUSED先显式恢复,请求才可启动计算
SUSPENDED先解决显示的错误或账单条件,再恢复
FAILED查看错误和活动,可能需要创建替代端点
DELETING删除与资源释放仍在进行

冷端点可能返回 HTTP 503、ENDPOINT_COLD_STARTING 和 Retry-After。至少等待指定时间,在有总截止时间的情况下重试。立即重复请求不会加速模型启动。endpoints.generate() 会暴露冷启动失败,不会用无限重试隐藏它。

暂停、恢复和删除​

el job pause YOUR_JOB_ID
el job get YOUR_JOB_ID
el job resume YOUR_JOB_ID

暂停阻止新请求启动副本,运行中的副本异步释放。最小副本为零时,resume 允许请求,但端点可能保持零副本直到被使用。要提前预热,调用 wake 后观察就绪。

空闲缩容到零允许未来请求再次启动计算;若要阻止这种自动重启,应暂停端点。GPU 在副本运行期间计费,包括启动阶段,释放后才停止。显示费率不是最终账单。

永久不再使用时,按依赖顺序删除:

el job stop YOUR_JOB_ID
el job adapter delete YOUR_ADAPTER_ID --wait
el checkpoint delete YOUR_CHECKPOINT_RESOURCE_ID --wait

仅删除你确实想移除的资源。Endpoint 删除会保留 adapter 和 checkpoint;共享或被依赖资源可能阻止后续删除。清理返回持久化 Operation,应检查完成状态与错误,不能把请求成功视为资源已释放。计划重新部署或恢复训练时请保留 checkpoint。

排查调用失败​

错误或现象检查
401EnvLoop Key 与 API 地址
403项目成员关系、Key 范围与推理权限
Model not found完整 model 前缀/alias、正确项目,以及 endpoint 是否仍存在
Adapter 校验失败Checkpoint 可用性、模型 revision、rank、格式和校验详情
503 冷启动Retry-After、准备状态与有界重试
暂停/挂起显式 resume 和显示的原因
回答为空或被截断max_tokens、模板和返回的 finish reason
行为像基座模型确认所选 alias 是训练 adapter,而非 /base

下一步:Checkpoint 管理或 SDK 参考。

停止 Job 是永久操作:资源释放确认前为 cancelling,确认后为 cancelled。用 el setting operation get 查询 inference.cleanup_operation_id。Adapter 与 checkpoint 保留;pause 和缩至零均允许后续恢复。