# @crvouga/mockingbird-service-prism 中文文档

规范地址：https://npmcn.com/package/%40crvouga/mockingbird-service-prism/

版本：3\.11\.0
npm 元数据更新时间：2026-11-11T02:31:37.874Z
中文译文更新时间：2026-11-11T06:33:18.364Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40crvouga/mockingbird-service-prism
原文对照：https://npmcn.com/package/%40crvouga/mockingbird-service-prism/?lang=original
项目主页：https://github.com/crvouga/mockingbird/tree/main/packages/service/prism#readme
源码仓库：https://github.com/crvouga/mockingbird

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：4.4 MB，18 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：2 个
- 首次发布：2026-09-22T23:57:01.740Z
- 最新版本发布：2026-11-11T02:31:37.490Z
- 近 30 天下载量：2862（2026-10-11 至 2026-11-09，npm 官方下载统计）
- 已发布版本数：42（近 12 个月 42 个）

## 中文简介

Prism Labs body-scan API的状态仿真器:主题,扫描,预先签名的抓取上传,处理阶段到READY,以及确定身体结构,测量,健康报告和资产结果.

## 安装

```sh
npm install @crvouga/mockingbird-service-prism
```

也可以使用：`pnpm add @crvouga/mockingbird-service-prism`、`yarn add @crvouga/mockingbird-service-prism`、`bun add @crvouga/mockingbird-service-prism`

## README

# @crvouga/mockingbird-service-prism (英语)

> 本地模拟器。 真正的API合同. 部分 [嘲笑鸟](https://github.com/crvouga/mockingbird)。 。 。 .

国家模拟器 **棱镜实验室** 测试套件的机身扫描 API:主题提升、扫描 创建, 预签名的抓取将抓取页面 PUT 上传到每个阶段的视频 处理状态, 和ReADY-扫描结果 我们的后端持续(身体组成, 测量、新陈代谢年龄的健康报告、资产URL)。 扫描通过真实 寿命周期(`CREATED` → `PROCESSING` → `READY` 编号 : `FAILED`命令或模拟钟,以及 计算结果要确定对象的身高、体重、性别和年龄.

-   行动范围: [支助](https://github.com/crvouga/mockingbird/blob/main/packages/service/prism/SUPPORT.md)
-   合同`openapi.yaml`由消费者的zod schemas手写 (单位:千美元)`prism-scan.adapter.ts`)和捕获页的上传(`body-scan-capture-page`) (中文(简体) ).

## 安装

```bash
npm install -D @crvouga/mockingbird-service-prism
```

仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务 `npx mockingbird-prism serve`, (中文(简体) ), `createServer` 从 `./server` (节点),或 `createRuntime` 与 任何获取服务器.

## 使用量

点 `PRISM_API_URL` 在模拟器上(允许http)并设定 `PRISM_API_KEY` 给任何东西(或 把它贴上 `--api-key`) (中文(简体) ). 没有两者,我们的适配器报告 `unavailable` 永远不要叫出来.

```bash
npx mockingbird-prism serve --port 8825 --auto-advance 2000
```

```ts
import { createServer } from "@crvouga/mockingbird-service-prism/server"

// Test setup: a local Prism.
const server = await createServer()
const baseUrl = server.url // the app's PRISM_API_URL

// Application code: the requests it sends to Prism.
const prism = async (path: string, body?: unknown) => {
  const response = await fetch(`${baseUrl}${path}`, {
    method: body === undefined ? "GET" : "POST",
    headers: { authorization: "Bearer k", accept: "application/json;v=1", "content-type": "application/json" },
    ...(body === undefined ? {} : { body: JSON.stringify(body) }),
  })
  return (await response.json()) as Record<string, any>
}
await prism("/users", {
  token: "member-1", sex: "female", region: "north_america", birthDate: "1990-04-02",
  weight: { value: 64, unit: "kg" }, height: { value: 1.7, unit: "m" },
  researchConsent: false, termsOfService: { accepted: true, version: "1" },
})
const scan = await prism("/scans", { userToken: "member-1", deviceConfigName: "IPHONE_SCANNER", bodyfatMethod: "coco2" })
const upload = await prism(`/scans/${scan.id}/upload-url`, {})
await fetch(upload.url, { method: "PUT", body: "capture video bytes" }) // the capture page's upload

// Test control: finish processing without waiting.
await fetch(`${baseUrl}/__admin/scans/${scan.id}/advance`, {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({ to: "READY" }),
})

// Application code: the READY scan's results.
const bodyfat = await prism(`/scans/${scan.id}/bodyfat`)
// → {bodyfatMethod: "coco2", bodyfatPercentage: 29.6, leanMass: 45.07, fatMass: 18.93, …}

await server.close()
```

### 路线

所有与 `Authorization: Bearer <key>` 财务报告和审定财务报表 `Accept: application/json;v=1`,但 预签名上传和资产 URL.

| 路线 | 行为 |
| --- | --- |
| `POST /users` | 上调由 `token` (单位:千美元)`sex`, (中文(简体) ), `region`, (中文(简体) ), `birthDate`, (中文(简体) ), `weight {value, unit kg|lb}`, (中文(简体) ), `height {value, unit m|in}`, (中文(简体) ), `researchConsent`, (中文(简体) ), `termsOfService`——201 关于创建,200 关于更新,相同 `id`。 。 。 . |
| `POST /scans` | `{userToken, deviceConfigName: IPHONE_SCANNER|ANDROID_SCANNER, bodyfatMethod, assetConfigId?}` — 201个扫描 `{id, status: "CREATED", weight, height, …}`; 未知用户 404. |
| `GET /scans/{id}?unit-system=metric|imperial` | 该单元系统的状况和主体的重量/身高. |
| `POST /scans/{id}/upload-url` | `{url, expirationTime}`: 模拟器本身预先签名的PUT(模拟器钟上15分钟); `/__admin/ns/<name>` 保存在 URL 中). 409,一旦捕获上传. |
| `PUT /uploads/{id}?expires&signature` | 捕捉上传. 将扫描移动到 `PROCESSING` (单位:千美元)`captureData` 已经成功, `body` 启动); 空出的身体失败 。 过期或被篡改的URL为S3型403 XML. |
| `GET /scans/{id}/scan-assets` | `{captureData, body, fittedBody, measurement}` 每个 `started` 编号 : `succeeded` 编号 : `failed` 编号 : `null`,与 `…UpdatedAt`。 。 。 . |
| `GET /scans/{id}/bodyfat` | 只准备: `{bodyfatMethod, bodyfatPercentage, leanMass, fatMass, skeletalMuscleMass}`。 。 。 . |
| `GET /scans/{id}/measurements?unit-system=` | 只准备: `{waistFit, hipsFit, chestFit, waistToHipRatio, bodyRoundnessIndex, bmiPredicted}` (cm或英寸). |
| `GET /scans/{id}/health-report` | 只准备: `{metabolicAgeReport: {metabolicAgeYears, chronologicalAgeYears, ageDeltaYears, percentile}, bodyShapeReport}`。 。 。 . |
| `GET /scans/{id}/asset-urls` | 只准备: 已签名的 URL `previewImage`, (中文(简体) ), `model`, (中文(简体) ), `canonicalBody`, (中文(简体) ), `texture`, (中文(简体) ), `material`, (中文(简体) ), `stripes`,服务于 `GET /assets/{id}/{file}`。 。 。 . |

ReADY 之前的结果为 404(我们的适配器: `not_found`) (中文(简体) ). 错误是 `{message, errors?}`。 。 。 .

### 管理员(超过标准合同)

| 路线 | 效果 |
| --- | --- |
| `POST /__admin/scans/:id/advance` | 开始一个处理阶段(`{"to": "READY"}` 给所有人。 扫描必须上传 . |
| `POST /__admin/scans/:id/fail` | 启动阶段失败; 扫描变为 `FAILED`。 。 。 . |
| `GET /__admin/scans` | 名字空间的扫描. |
| `GET/PUT /__admin/settings` | `{apiKeys?, uploadUrlTtlMs?, autoAdvance?: {afterMs, failAt?} | null}`; 自动推进行走上传, 扫描每个阶段一个 `afterMs` 模拟时间. |
| `POST /__admin/tick` | 现在应用适当的自动推进步骤(服务仿真器每100毫秒勾出). |

错误预设( E)`POST /__admin/faults {"preset": "<name>", "count"?: n}`: `unauthorized`, (中文(简体) ), `server_error`, (中文(简体) ), `scan_not_found`, (中文(简体) ), `schema_drift` (未知扫描状态), `stage_states_slow` (6s,超过5分超时), `metabolic_age_missing`, (中文(简体) ), `metabolic_age_implausible`, (中文(简体) ), `upload_forbidden`, (中文(简体) ), `connection_drop`。 。 。 .

### 命名空间

`x-mockingbird-namespace`页:1 `/__admin/ns/<name>` 前缀在 `PRISM_API_URL`,或用 API 键: `PUT /__admin/credentials {"credentials": {"<PRISM_API_KEY>": "<namespace>"}}`签署 上传和资产 URL 在路径中包含命名空间, 因为抓取页的 PUT 没有 其他载体.

### 故意不模拟

-   Webhooks:我们的后端民调Prism,它没有接收器.
-   实体重建:结果为标的输入的公式和3D资产 是占位符字节.
-   扫描删除、用户列表和适配器不调用的每一个端点 .

## API 密码

| 导出 | 仁爱 | 说明 |
| --- | --- | --- |
| `PrismAPI` | 类 | 进程模拟器 : `fetch(request)`, (中文(简体) ), `reset()`, (中文(简体) ), `advance(scanId, fail?)`, (中文(简体) ), `tick()`, (中文(简体) ), `scans()`选项: `sqlite`, (中文(简体) ), `now`, (中文(简体) ), `namespace`, (中文(简体) ), `publicNamespace`, (中文(简体) ), `settings`。 。 。 . |
| `createRuntime` | 函数 | 全面服务合同的仿真器(保健、管理员、命名空间、证书、预设)。 选项 : `settings`, (中文(简体) ), `tickMs`, (中文(简体) ), `clock`, (中文(简体) ), `seed`, (中文(简体) ), `adminKey`, (中文(简体) ), `onLog`, (中文(简体) ), `sqlite`。 。 。 . |
| `PRISM_PRESETS` | 对象 | 每个命名的断层预设. |
| `PRISM_NAMESPACE` | 字符串 | 服务名称, `"prism"`。 。 。 . |
| `STAGES` | 数组 | 处理阶段,顺序. |
| `scanResults` | 函数 | 确定性结果 准备扫描答案. |
| `prismError` | 函数 | 构建棱镜错误响应 `{message, errors?}`。 。 。 . |
| `document`, (中文(简体) ), `operationIds`, (中文(简体) ), `supportedOperationIds` | 数值 | OpenAPI合同及其操作代号. |
| `createServer`, (中文(简体) ), `serveTarget`, (中文(简体) ), `DEFAULT_PORT` (单位:千美元)`./server`(中文(简体) ) | 节点 | 服务过来 `node:http` (自动提醒每100米) `serve` CLI目标(`--api-key`, (中文(简体) ), `--auto-advance`; 开口8825. |

部分 [嘲笑鸟](https://github.com/crvouga/mockingbird)。 。 。 .

## 常见问题

### @crvouga/mockingbird-service-prism 是什么？

Prism Labs body-scan API的状态仿真器:主题,扫描,预先签名的抓取上传,处理阶段到READY,以及确定身体结构,测量,健康报告和资产结果\.

### 如何安装 @crvouga/mockingbird-service-prism？

在项目目录运行 npm install @crvouga/mockingbird-service-prism，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 mockingbird-prism，可以用 npx mockingbird-prism 直接运行。

### @crvouga/mockingbird-service-prism 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @crvouga/mockingbird-service-prism 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @crvouga/mockingbird-service-prism 可以商用吗？

@crvouga/mockingbird-service-prism 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @crvouga/mockingbird-service-prism 的下载量有多少？

根据 npm 官方下载统计，@crvouga/mockingbird-service-prism 在 2026/10/11 – 2026/11/09 这 30 天内被下载 2,862 次，日均约 95 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @crvouga/mockingbird-service-prism 还在维护吗？

最新版本 3\.11\.0 发布于 2026/11/11（今天）；至今共发布 42 个版本，其中过去 12 个月发布了 42 个；首次发布于 2026/09/23。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

