Skip to content

共享类型

@nimiplatform/sdk/types 承载所有其他 SDK 子路径都用到的共享公开类型。它是小而稳的构建块层;SDK 中跨子路径的内容,凡是 types 已经导出的,就不再自己创建一套。

这里放什么

types 子路径导出使用方在不导入私有内部的前提下谈论 Nimi 所需要的跨切面符号。

符号用途
NimiErrorSDK 调用方面对的强类型错误 surface
ScopeName强类型作用域标识
ExternalPrincipalId强类型外部 Principal 标识
Runtime idsWorldIdCharacterIdLocalAgentIdConversationIdJobId
流式基础协议四种流式模式对应的强类型形状
多模态基础协议ArtifactId、规范产物字段类型

确切清单由 SDK 内核 surface 契约准入;新增类型需要内核准入。

集中类型为什么重要

没有共享类型,每个子路径都可能用相似形状重声明 Character 与 LocalAgent reference,强类型系统会因此意外退化成弱类型。

@nimiplatform/sdk/types 集中类型,能在所有公开 surface 之间保留同一个名义类型。Realm 的 Character reference 与 Runtime 的 LocalAgent reference 保持为不同的强类型身份,不会变成凑巧形状一致的双胞胎。

边界规则

规则原因
其他子路径不重声明 types 中的类型防漂移
types 不从其他子路径导入处在依赖图的最底层
types 不依赖传输(@nimiplatform/sdk/runtime)或适配(@nimiplatform/sdk/realm保持类型可移植
新增类型需要内核准入与其他 surface 同样的准入纪律

读者场景:保持身份 owner 分离

App 通过 Realm surface 读取 Character reference,随后使用 Runtime 返回的 LocalAgent reference 执行。

  1. Realm 读取。 App 收到 CharacterId
  2. Runtime 物化。 Runtime 解析或物化对应 LocalAgent,并返回 LocalAgentId
  3. Conversation 调用。 App 把 LocalAgentIdConversationId 一起使用。
  4. 无静默强转。 编译器不会让 Character id 冒充 LocalAgent id。

共享类型层保留 Realm/Runtime owner 边界。

读者场景:强类型错误传到 App 代码

一次 runtime 调用以契约失败告终。

  1. Runtime 发出强类型错误。 通过 SDK 错误转换,错误成为带 reason code 的 NimiError
  2. App 导入 NimiError 来自 @nimiplatform/sdk/types
  3. 类型收窄。 App 在 reason code 上做模式匹配以决定 UX 行为。
ts
import { NimiError } from '@nimiplatform/sdk/types';

try {
  await model.generateText(...);
} catch (err) {
  if (err instanceof NimiError) {
    // typed reason code
    if (err.reasonCode === 'AUTH_TOKEN_EXPIRED') { ... }
    if (err.reasonCode === 'AUTH_UNSUPPORTED_PROOF_TYPE') { ... }
  }
}

错误是强类型的,因为它来自 @nimiplatform/sdk/types,不是因为 App 自己猜出来的。具体的 reason code 清单由 SDK 内核准入。

读者场景:库作者新增 helper

一位库作者想写一个接受任意 Nimi 标识的 helper。

  1. @nimiplatform/sdk/types 导入。 依赖 @nimiplatform/sdk/types,不依赖 @nimiplatform/sdk/runtime@nimiplatform/sdk/realm
  2. Helper 接受 CharacterId | LocalAgentId | WorldId | ConversationId 这是来自 @nimiplatform/sdk/types 的强类型联合。
  3. 库可编译。 没有传输依赖;不会引入 runtime;可移植。

如果一个库为了类型信息去依赖 @nimiplatform/sdk/runtime,就会把整个传输层拖进它的使用者。从 @nimiplatform/sdk/types 引入,能让依赖图保持轻薄。

types 的排除项

不收录原因
方法函数那些在 @nimiplatform/sdk/runtime@nimiplatform/sdk/realm 等子路径
传输内部信息(例如 gRPC 元数据)归传输层所有,不属于 App 请求类型
Provider 名是 catalog 数据,不是类型系统
世界内容(规则、Character 等)是内容,不是类型

来源依据

Nimi 文档:可安装、开源、本地优先的个人 AI 产品。