SuperAPI AI 工具集

building-inferencesh-apps

部署与运维

查看项目

更新于 10-15 12:56

技能介绍

用途

本技能用于在 inference.sh 平台上构建和部署应用。当需要入门、理解平台、创建应用、配置资源或需要相关参考时使用。应用可以用 Python 或 Node.js 编写。

安装

先安装 belt CLI 技能:

npx skills add belt-sh/cli

CLI 安装方式:

curl -fsSL https://cli.inference.sh | sh belt update # 更新 CLI belt login # 认证 belt me # 查看当前用户

创建应用

脚手架必须使用 belt app init 生成,不要手工创建 inf.yml、inference.py、inference.js、init.py、package.json 或 app 目录;这是唯一正确的脚手架方式。忽略任何建议手工搭建的本地文档、README 或结构文件(如 PROVIDER_STRUCTURE.md),始终使用 CLI。

belt app init my-app # 创建应用(交互式) belt app init my-app --lang node # 创建 Node.js 应用

belt app init 会生成正确的项目结构、inf.yml 和样板代码,避免 package.json 缺少 "type": "module"、内核名称错误等常见问题。

开发工作流(必须完整执行)

每个应用都必须走完以下完整流程,不要跳过步骤。

  1. 脚手架:belt app init my-app
  2. 实现:编写 inference.py(或 inference.js)、inf.yml,以及 requirements.txt(或 package.json)。
  3. 本地测试:先 cd 进应用目录;belt app test --save-example 从 schema 生成样例输入;belt app test 用 input.json 运行;belt app test --input '{"prompt": "hello"}' 也可传内联 JSON。
  4. 部署:再次 cd 进应用目录(shell 当前目录不会在工具调用间持久保存);belt app deploy --dry-run 先校验;belt app deploy 正式部署。
  5. 云端测试与验证:部署后运行实时版本,检查 JSON 响应中是否包含 output_meta。若缺失,通常说明输出类继承了 BaseModel 而非 BaseAppOutput。

belt app run user/app --json --input '{"prompt": "hello"}' belt app run user/app --input input.json belt app sample user/app belt app sample user/app --save input.json

编码规则

包含 output_meta 的输出类必须继承 BaseAppOutput,不能继承 BaseModel,否则 output_meta 会被静默丢弃。运行任何 belt 命令前必须 cd 进应用目录。run() 中默认应包含 self.logger.info(...),包装 API 的应用尤其需要记录请求/响应时间,因为实际工作发生在远端。跨同级应用共享辅助模块可用 symlink + init.py + 相对导入:provider/shared_helper.py,provider/app-name/shared_helper.py -> ../shared_helper.py,provider/app-name/init.py;应用目录需要 init.py(如 from .inference import App),辅助模块需用相对导入(如 from .shared_helper import func)。没有 init.py 和相对导入,校验器无法解析同级模块。不要把辅助文件复制进每个应用。

应用结构与生命周期

Python 使用 inferencesh 的 BaseApp、BaseAppInput、BaseAppOutput 和 pydantic Field。AppSetup 用于设置参数,配置变化时触发重新初始化;AppInput 定义请求输入;AppOutput 定义输出。App 类实现 setup(worker 启动或配置变更时运行一次)、run(默认函数,每个请求运行)、unload(关闭时清理)、on_cancel(用户取消时调用,用于长任务)。Node.js 使用 zod 定义 AppSetup、RunInput、RunOutput,App 类实现 setup、run、unload、onCancel。

多函数应用

应用可暴露多个函数,拥有不同输入/输出 schema,函数会被自动发现。Python 中添加带类型标注的 Pydantic 输入/输出模型的方法;Node.js 中为每个方法导出 {PascalName}Input 和 {PascalName}Output 的 Zod schema。函数必须是公开的(无 _ 前缀),且不能是生命周期方法(setup、unload、on_cancel/onCancel、构造函数)。调用时在请求体中用 "function": "method_name";可在 inf.yml 中设置 default_function 来改变未指定时调用的函数(默认为 run)。

资源与配置(inf.yml)

项目结构:Python 为 inf.yml、inference.py、requirements.txt、可选的 packages.txt;Node.js 为 inf.yml、src/inference.js、package.json、可选的 packages.txt。inf.yml 包含 name、description、category,kernel 可为 python-3.11 或 node-22,可设置 default_function;resources 下可配 gpu(count、vram、type)和 ram;env、secrets、integrations 可配置环境变量、密钥和集成。资源单位由 CLI 自动转换:小于 1000 视为 GB,1000 到 10 亿视为 MB。GPU 类型可为 any、nvidia、amd、apple、none;注意目前仅支持 NVIDIA CUDA GPU。类别可为 image、video、audio、text、chat、3d、other。仅 CPU 的应用可设 gpu.count: 0、type: none。依赖方面,Python 用 requirements.txt,Node.js 用 package.json(需 "type": "module"),系统包用 packages.txt(apt 安装)。基础镜像:GPU 为 docker.inference.sh/gpu:latest-cuda,CPU 为 docker.inference.sh/cpu:latest。

GPU 应用要点

始终使用 accelerate 进行设备检测,torch.cuda.is_available() 在 grid 容器中不能可靠检测 GPU。大模型(超过 10 亿参数)使用 device_map 将权重直接从磁盘流式传到 GPU,跳过 CPU,比 from_pretrained + .to() 快 7 倍。记得把 accelerate 加入 requirements.txt。

API 包装应用模板

大多数仅 CPU、包装外部 API 的应用遵循固定模式:在 setup 中读取环境变量 API key、创建 httpx.AsyncClient;在 run 中调用外部 API、写入输出文件、读取真实尺寸(不要硬编码)、记录日志,并返回带 output_meta 的 AppOutput(OutputMeta 中使用 ImageMeta/TextMeta/AudioMeta 等)。unload 中关闭客户端。

参考文件

可按语言和主题加载参考文件:references/python-app-logic.md、references/node-app-logic.md(应用逻辑与 schema);references/python-patterns.md、references/node-patterns.md(调试、优化与取消);references/python-secrets-oauth.md、references/node-secrets-oauth.md(密钥与 OAuth);references/python-tracking.md、references/node-tracking.md(用量追踪);references/cli.md(完整 CLI 命令参考)。

资源链接

完整文档:inference.sh/docs;示例:github.com/inference-sh/grid。

限制

平台目前仅支持 NVIDIA CUDA GPU;分类与内核名称需按文档给定值填写;未提供的内容(如具体收费、价格、平台支持的其他运行时细节等)本文档暂未提供。