# 样板应用

公开的样板，用来演示 SDK 怎么组合成一个能用的应用。它们都是 AIDC 官方公开应用（`namespace: public`）：登录的成员都可以打开（一律登录：至少是一家公司的 member），不存储任何数据；模型用量记在 AIDC 名下，并受每日额度保护。源码在 aidc-cloud 仓库的 `developer/apps/`，用 `aidc app deploy` / `aidc app publish` 发布——和客户开发者走同一条发布流程。每个样板都照 [应用（Apps）](apps.md) 的标准带了 Skills（`skills/<名字>/SKILL.md`）、示例说法与介绍：打开应用页（`…/about`）点「复制给智能体」就能让智能体用它。

| 应用 | 用到的 SDK | Developer（test） | Nexus（production） |
| --- | --- | --- | --- |
| 瑕疵检测 | 视觉 + 模型（`gpt-6-luna`） | [/developer/apps/defect-inspection](https://www.ai-dc.ai/developer/apps/defect-inspection) | [/nexus/apps/defect-inspection](https://www.ai-dc.ai/nexus/apps/defect-inspection) |
| 会议纪要 | 语音（实时转写）+ 模型（翻译、纪要）+ 连接（智能体） | [/developer/apps/meeting-minutes](https://www.ai-dc.ai/developer/apps/meeting-minutes) | [/nexus/apps/meeting-minutes](https://www.ai-dc.ai/nexus/apps/meeting-minutes) |
| ERP 数据自动分析 | 连接（数据集）+ 数据 + 模型 | [/developer/apps/erp-analysis](https://www.ai-dc.ai/developer/apps/erp-analysis) | [/nexus/apps/erp-analysis](https://www.ai-dc.ai/nexus/apps/erp-analysis) |
| 世界模型 · 空间建模 | 建模（世界模型、查看器、锚点）+ 界面；只看不生成 | [/developer/apps/world-model](https://www.ai-dc.ai/developer/apps/world-model) | [/nexus/apps/world-model](https://www.ai-dc.ai/nexus/apps/world-model) |

## 瑕疵检测

用摄像头（或上传照片）拍一件产品，视觉模型判断制作工艺有没有瑕疵——污渍、油渍、破洞、划痕、跳线、色差、缺料——给出合格 / 不合格 / 拿不准，并在图上框出每一处问题的位置与严重程度。检查项可以切换（纺织成衣、注塑件、包装、自定义）。

```js
const camera = await vision.openCamera({ video, facingMode: "environment" });
const photo = await camera.capture();
const result = await vision.inspect(photo, { task, criteria, model: "gpt-6-luna" });
const annotated = await vision.annotate(photo, result.findings);
```

## 物体检测（视觉 SDK · Semantic 登录绑定）

源码：`developer/apps/object-detect/`。上传或拍一张照片，`vision.detect`（缺省 GPT-6 Luna）找出画面里的物体，`vision.annotate` 画框，表格列出类别、把握与归一化位置。清单 `auth.publicLink: "members"`：发公开链接出去，访客要先用 AIDC 账号（邮箱验证码）登录，只有应用所在公司的人才能用；应用里用 `auth.me()` 的 `member` / `signedIn` 给没登录或不是本公司的人不同的提示。

```bash
aidc app deploy developer/apps/object-detect --namespace <你的 cell> && aidc app publish object-detect
aidc share object-detect --public --days 30     # 公开链接：只给本公司成员（登录后判定）
aidc vision detect photo.jpg --labels 人,叉车,托盘   # 不写应用，直接在命令行检测
```

## 自进化演示

源码：`developer/apps/evolve-demo/`（智能问答台）。一个真能用的问答页（DeepSeek Flash 流式回答），页面各区域都用 `data-evolve` 标成槽位（顶栏、标题、侧边栏、介绍卡片、对话框、消息区、气泡、输入框、发送按钮…），清单 `evolve` 给它们起了名字，并把对话框宽高、侧边栏宽度、对话字号、气泡圆角、强调色做成带范围的可调参数。右下角「// 改进」：说「对话框变大」「隐藏侧边栏」「标题改成客服工作台」「发送按钮改成深蓝色，气泡圆一点」——页面马上变；「只给我保留」或「提交给所有人」。部署在客户命名空间（AIDC 自己是 `cell-aidc`），因为保存改进要知道是谁在改：`/nexus/cell-aidc/apps/evolve-demo`（AIDC 成员登录后打开），公开链接要求先登录（`auth.publicLink: "signin"`）。

```bash
aidc app deploy developer/apps/evolve-demo && aidc app publish evolve-demo
aidc evolve list evolve-demo              # 大家在应用里提的改进
aidc evolve bake evolve-demo --dir developer/apps/evolve-demo   # 全员改进固化进代码，版本 +1
```

## 会议纪要

点「开始」后边说边出字（实时转写），每一句定稿后同时译成所选语言——日语、英语、埃及阿拉伯语、孟加拉语。结束后一键整理成纪要（议题、决议、待办），可以复制、下载，或者用你自己的 Agent Key 发给指定的智能体归档与跟进。

```js
const session = await voice.startTranscription({ languages: ["zh", "en", "ja", "ar", "bn"], onPartial, onFinal });
const translations = await voice.translate(sentence, ["ja", "en", "ar-EG", "bn"]);
const minutes = await voice.minutes(transcript);
await model.agent(agentKey).send(minutes.markdown);
```

每场实时转写最长 5 分钟，到点自动续开下一场，逐字稿不中断。

## ERP 数据自动分析

连接 AIDC 数据库里的合成 ERP 演示库（`aidc-demo-erp`，虚构企业 12 个月的经营数据），拉取固定口径的经营报告：营收与毛利趋势、客户集中度、应收账龄、库存风险、采购结构，以及规则化的经营信号；最后由模型把报告写成一段管理层摘要（数字一律以报告为准）。

```js
const report = await connect.datasets.report("aidc-demo-erp", "overview");
el.innerHTML = data.barChartSvg(report.monthly.map((m) => ({ label: m.month.slice(5), value: m.revenue })));
const summary = await model.text({ model: "deepseek-flash", messages: [...] });
```

数据全部为虚构，客户与供应商名称均为示例。客户自己的 ERP 接入后，报告形状不变。

## 企业数据（语义层浏览器，部署到你的公司）

Nexus 上的「数据模块」：公司语义层的通用浏览器——左边是对象类型（带数据源健康），中间是对象表（搜索、按列排序、实时更新、改过的属性打点），右边是详情：每个属性的显示名 / 单位 / 同义词、被语义层改过的值与「数据源现为 …」、沿链接找相关对象、变化记录（谁、何时、做了什么），以及按权限出现的 Action 按钮（表单由 Action 定义自动生成）。完全由 `semantic.describe()` 驱动，不写死任何业务，换一家公司直接能用；ERP / MES 只读。

它不是公开应用（公开命名空间没有语义层），源码在 `developer/apps/data-explorer/`，清单不写 `namespace`——用你公司的开发者 Key 部署，就挂在你公司下：

```bash
aidc app deploy developer/apps/data-explorer      # → /developer/<cellId>/apps/data
aidc app publish data                             # → /nexus/<cellId>/apps/data（本公司成员可用）
```

```js
const space = await semantic.describe();                                   // 类型、属性、链接、Action（含我能不能执行）
const page = await data.table(type.apiName).list({ where, sort, limit: 100 });
data.watch({ types: [type.apiName], after: page.seq }, { onChange: reload });
const { object, history } = await data.table(type.apiName).get(pk, { history: true });
await semantic.action(a.apiName).apply(params, { object: pk });
```

## 从模板开始一个语义层应用

```bash
aidc app init my-board --template semantic        # 读一个对象类型（live）+ 一个 Action 按钮；清单登记好 sdk 与 semantic
```

把模板里的 `production.order_line` / `production.flag_issue` 换成你公司语义层里的类型与 Action（`aidc semantic describe`），同时改清单的 `semantic`。完整走一遍见 [闭环](loop.md)。


## Semantic · Ontology 示例（语义 SDK · 示例）

一套用 AIDC Semantic 建的示例本体：Demo Company（一家虚构的企业 AI 公司），管理它的客户公司、智能体、应用、模型用量与云费用。名字和结构照 Palantir Ontology——5 个 Object Type、4 个 Link Type（`applicationAgents` 是多对多）、2 个 Interface（`Billable` 继承 `Monthly`）、5 个 Value Type、2 个 Shared Property、6 个 Action Type（带提交条件与 Action Log）。数据全部虚构，放在只装示例数据的 Demo Company（`cell-demo`）里，不进任何真实公司；对外的示例一律只用 Demo Company。

打开：[Semantic · Ontology 示例](https://www.ai-dc.ai/nexus/s/cQjivrjhrGGGbOMurJ-4HR3OSiAW0wln)（要先登录 AIDC 账号，只读；不对互联网匿名开放）。

- **本体**：Object Type 卡片（主键、标题属性、链接、实现的接口、对象数），Link Type 两端的名字与基数，Interface、Value Type（约束）、Shared Property。
- **对象**：Object Explorer（按类型浏览、搜索、排序，每一步附上对应的 OSDK 写法）+ Object View（全部属性、派生属性、沿每条链接走一步、编辑历史、时序属性的曲线）。
- **分析**：对象集与聚合——按月汇总 Billable 接口的成本、客户阶段分布、付费客户的全部智能体（`pivotTo`）、每家客户的应用数与费用（`withProperties`）、云费用按厂商、向量近邻（`nearestNeighbors`）。
- **Action**：参数、规则与 Action Log；本公司成员可以「只校验」（不执行），公开链接的访客只能看。

源码：应用在 `developer/apps/ontology-demo/`，定义、示例数据与灌数脚本在 `developer/apps/ontology-demo-data/`。在你自己的公司里照做一遍（空的命名空间）：

```bash
sh developer/apps/ontology-demo-data/seed.sh <你的 cellId>   # define → publish → import → apply-batch → 几次 Action
aidc app deploy developer/apps/ontology-demo && aidc app publish ontology-demo
aidc share ontology-demo --public                              # 可选：公开只读链接
```

## 座位申请（语义 SDK · 会执行的 Action · Academy 教程配套）

一个从零做起、能真的执行的 Action 的完整例子，配 Academy 的课程[《动手：做一个会执行的 Action》](https://www.ai-dc.ai/academy/semantic-action)（7 节：地基、第一个 Action、提交条件、命令行 / SDK / REST、做成应用、自动化与 writeback webhook）。客户公司想把座位数提到新的数目：先**提交申请**，开发者**批准**（申请和公司的座位数在同一个事务里一起改）或**拒绝**（必须写批复意见）；座位数在 50 以内的申请由**自动化**批准。数据全部虚构，放在 Demo Company（`cell-demo`）里。

打开：[座位申请台](https://www.ai-dc.ai/nexus/s/PS2adKHzMIkFXbxG0TM0MKOdY8tZliMl)（要先登录 AIDC 账号，只读；不对互联网匿名开放。Demo Company 之外的账号只能看，执行要在你自己的公司里照下面做一遍）。

- **本体**：Value Type `seatRequestStatus`，Object Type `seatRequest`（`customer` 沿用示例本体里的），Link Type `customerSeatRequests`，四个 Action：`submit-seat-request`（两条提交条件）、`approve-seat-request`（一个事务改两个对象，只给开发者）、`reject-seat-request`（批复意见必填）、`auto-approve-seat-request`（50 座以内；给自动化用，策略写在提交条件里）。
- **应用 `seat-desk`**：Skills + APIs + 界面。每一步先「只校验」、你确认再执行，显示逐项结果、这次改了哪些对象和对应的 SDK / CLI 代码；申请一变就实时更新（对象集订阅）。自带一条 Skill，教智能体先 `--preview` 再执行。
- **应用 `seat-auto-approve`**：没有界面，只有清单。Automate 的「对象新建或修改」条件（`trigger.change`）加一个 Action 效果，判断在触发条件和提交条件两处都做。
- **另一个真实的 writeback 例子**：`developer/apps/aws-servers`（AIDC 自己的 AWS 服务器：关机、开机、自动关机，见[语义 SDK](semantic.md) 的「Action 改源系统」）；课程第 7 课把两者放在一起讲。

源码：定义与灌数脚本在 `developer/apps/seat-desk-data/`（`starter/` 是读者自己公司的起点，`ontology/` 是座位申请本身，`call.mjs` 是 SDK 脚本，`try-writeback.json` 是被拒绝的 writeback 练习），应用在 `developer/apps/seat-desk/` 与 `developer/apps/seat-auto-approve/`；课里的代码块直接取自这些文件，`src/server/modules/semantic/seat-desk-flow.test.ts` 把每个例子（成功的和被拒绝的）在测试库里跑一遍。在你自己的公司里照做一遍（空的命名空间）：

```bash
aidc semantic define developer/apps/seat-desk-data/starter && aidc semantic publish --notes "客户"
aidc semantic define developer/apps/seat-desk-data/ontology && aidc semantic publish --notes "座位申请"
aidc semantic apply register-customer --param customerId=acme-east --param name="ACME East" --param stage=试点 --param seats=20 --param members=14
aidc semantic apply submit-seat-request --param customer=acme-east --param seats=30 --param reason="新开两个仓库" --validate-only
aidc app deploy developer/apps/seat-desk && aidc app publish seat-desk
aidc app deploy developer/apps/seat-auto-approve && aidc app publish seat-auto-approve
aidc share seat-desk --public                                  # 可选：公开只读链接
```

灌 Demo Company：`sh developer/apps/seat-desk-data/seed.sh cell-demo`（要 cell-demo 的 developer 登录；Demo Company 里已经灌好了，这一条只在 Demo 被清空后重建时用——Action 每跑一次都会再记一次账，重跑之前先确认里面还没有这些申请）。

## 跨部门报价工作流（Semantic 自动化 · 公开演示）

一个制造企业的新品报价，要用到好几个部门的数据：营业部收到客户询价，设计中心出初始材料清单（BOM），采购部给原材料行情与物流包装费率，制造部给工艺能力（标准 JPH、OEE、小时费率），财务部给核价口径（管理费率、目标利润率、报价汇率、材占比 / 边利率红线）。这个演示把五个部门各自的应用（各是一个 Nexus 应用，数据在语义层）用工作流串起来：

```
营业 · 询价单 ─┬─▶ 设计 · 初始材料清单 ─┬─▶ 采购 · 原材料行情 ─▶ 采购 · 材料成本 ─┐
               │                        └─▶ 制造 · 工艺能力 ───▶ 制造 · 加工成本 ─┤
               ├─▶ 采购 · 物流包装费率 ─────────────────────────────────────────────┤
财务 · 核价口径 ──────────────────────────────────────────────────────────────────┴─▶ 财务 · 定价与红线
                                                                                        ─▶ 营业 · AI 报价分析 ─▶ 营业 · 报价草稿
```

- 登记一张询价（营业部应用里的「登记询价」Action），工作流**自动运行**：约 2 秒算完材料 / 加工 / 物流 / 管理费、按口径定价并换算成报价币种，对照客户目标价查材占比与边利率，AI 写一段分析，最后在营业部生成待审批的报价草稿。
- 画布（`developer/apps/workflow-canvas`，任何带 `workflow` 的应用都能用）：部门是泳道，连线上的字是传过去的参数，点任意一步看用了谁的能力、公式、输出与提供方的[应用卡片](app-card)；运行实时推送，结束后可以回放。
- 公开演示：**[打开报价工作流](https://www.ai-dc.ai/nexus/s/Pgt0J0kdQT--X-jOrTgqxMWjKNR0BOlQ)**（AIDC 自己公司下的演示应用，公开只读分享）。访客可以对任意一张询价**预演**——读取各部门应用的数据、计算、AI 分析都真的跑，不写入；运行记录只显示「公司成员 / 访客 / 数据变化」，不显示是谁。数据全部为虚构。

源码：`developer/apps/quote-demo/`——`ontology/`（`demo.*` 语义定义）、`seed/`（演示数据）、`apps/<slug>/aidc.app.json`（五个部门应用 + 报价工作流），部门看板复用企业数据浏览器的代码、工作流复用画布的代码，由 `build.mjs` 组装：

```bash
aidc semantic define developer/apps/quote-demo/ontology && aidc semantic publish --notes "报价演示"
aidc data import demo.commodity_price developer/apps/quote-demo/seed/demo.commodity_price.json   # 其他类型同理；询价用 --layer edits
node developer/apps/quote-demo/build.mjs                  # → developer/apps/quote-demo/dist/<slug>/
aidc app deploy developer/apps/quote-demo/dist/quote-sales && aidc app publish quote-sales   # 先发布五个部门应用
aidc app deploy developer/apps/quote-demo/dist/quote-workflow && aidc app publish quote-workflow
aidc workflow run quote-workflow --param rfq_no=RFQ-2609-002 --preview
```

## 世界模型 · 空间建模（建模 SDK · 公开展示）

[打开 /nexus/apps/world-model](https://www.ai-dc.ai/nexus/apps/world-model)：用 World Labs Marble 世界模型生成的 3D 世界，在浏览器里实时渲染（高斯溅射），叠加数字孪生锚点。

- **世界**：`public` 命名空间里登记的世界（现在是一个文字生成的森林，2026-09-14 实验的文字基线，Marble 1.1、1,580 credits）；点列表切换，精度 10 万 / 50 万 / 完整。
- **坐标系**：米、Y 向上、地面 y = 0；「初始视角」就是生成视点。
- **锚点**：五个演示锚点放在世界里真实可见的发光蘑菇群与地面上（位置取自高斯中心），传感器读数是**模拟**的；点锚点镜头飞过去。在公司的世界里，锚点绑到语义层对象（设备、工位），读数来自语义层与数据流。
- **报价**：选模型与输入，按当前策略算最多花多少、会不会被拦下——和服务端预留用的是同一张价目表。
- **只看不生成**：平台对官方公开应用写死了不接受生成 / 上传 / 导出 / 改锚点请求；页面上的「生成世界」按钮是禁用的。

源码：`developer/apps/world-model/`（`sdk: ["modeling", "ui"]`、`cdn: ["cdn.jsdelivr.net"]`，页面头部放 import map）；展示用的世界快照与锚点在 `developer/apps/world-model-data/`（出处与重新登记步骤见其 README）。

## 从模板开始一个 3D 世界应用（数字孪生）

```bash
aidc modeling generate --text "一个整洁的汽车零部件装配工位…" --dry-run   # 先看估价与额度
aidc modeling generate --text "一个整洁的汽车零部件装配工位…"             # 缺省试稿模型，约 5 分钟
aidc app init my-twin --template modeling       # 查看器 + 锚点列表 + 估价；清单已接 modeling / ui / jsDelivr
aidc modeling anchors <世界 id> --file anchors.json   # 把设备、工位的位置（米）绑到语义层对象
```

应用里要生成世界，在清单 `limits` 里写 `worldCreditsPerDay`（每天最多花多少 credits）；不写就只能看。

## 从模板开始一个工作流

```bash
aidc app init my-flow --template workflow         # 计算 + AI 分析两步起步；再用 aidc workflow capabilities 找能力，加 use 步骤
```
