Skip to content

UnityAI 第三方插件开发指南

版本: 5.0
更新日期: 2026-06-16
适用对象: 第三方开发者、社区/官方精选审核员


插件部署模式

UnityAI 插件系统支持两种部署模式,开发者在提交时选择:

模式说明适合场景
托管 (managed)上传代码包,由 UnityAI 平台部署和管理轻量插件、初创开发者
自托管 (self-hosted)开发者自行部署服务,提供访问 URL有独立服务器、需要自主控制

托管模式

  • 提交 .tar.gz / .zip 压缩包 + process_config
  • 平台审核通过后自动部署,分配端口,管理进程生命周期
  • 平台负责健康检查、自动重启、资源限制

自托管模式

  • 开发者自行部署 HTTP 服务到公网
  • 提交时提供 self_hosted_url(HTTPS 生产环境必须)
  • 可选提供 API Key(平台加密存储,运行时解密使用)
  • 平台每 5 分钟做一次可用性检查,状态显示在插件详情页

安全模型(完全隔离)

iframe 第三方插件与 UnityAI 主应用 完全隔离

插件 不能 获得插件 只能 通过宿主代理
Bearer token / plugin_tokenAI_CHAT_REQUEST → 宿主代为调 AI
用户 ID、邮箱、头像等 PIIAI_MODEL_CONFIG_REQUEST → 宿主返回模型列表
API 端点 URLCONFIG → 仅 { ai: true, aiMode: 'host-proxy' }
消息、联系人、日历、存储等数据无其他数据通道

插件在用户打开时才能通过宿主使用 AI;宿主关闭 iframe 后会发送 DESTROY,代理通道终止。


通信协议(postMessage)

插件 → 宿主

typescript
// 1. 就绪
window.parent.postMessage({ type: 'PLUGIN_READY', version: '1.0.0' }, '*');

// 2. 请求 AI(流式)
const requestId = crypto.randomUUID();
window.parent.postMessage({
  type: 'AI_CHAT_REQUEST',
  requestId,
  body: {
    model: 'gpt-4o',
    messages: [{ role: 'user', content: '你好' }],
  },
}, '*');

// 3. 请求可用模型
window.parent.postMessage({ type: 'AI_MODEL_CONFIG_REQUEST', requestId: crypto.randomUUID() }, '*');

宿主 → 插件

typescript
// CONFIG — 无 token、无用户信息
{ type: 'CONFIG', capabilities: { ai: true, aiMode: 'host-proxy' } }

// AI 流式响应(SSE 原文分块)
{ type: 'AI_CHAT_CHUNK', requestId, chunk: 'data: {...}\n\n' }
{ type: 'AI_CHAT_DONE', requestId }
{ type: 'AI_CHAT_ERROR', requestId, code, message }

// 模型列表
{ type: 'AI_MODEL_CONFIG', requestId, config: { default_model, available_models, aiMode: 'host-proxy' } }

// 关闭
{ type: 'DESTROY' }

插件侧监听示例

typescript
window.addEventListener('message', (event) => {
  const data = event.data;
  if (!data?.type) return;

  switch (data.type) {
    case 'CONFIG':
      // capabilities.aiMode === 'host-proxy'
      break;
    case 'AI_CHAT_CHUNK':
      // 解析 SSE chunk,更新 UI
      break;
    case 'AI_CHAT_DONE':
      break;
    case 'AI_MODEL_CONFIG':
      break;
  }
});

提交与上架流程

托管模式提交

bash
# Multipart POST
curl -X POST https://api.unityai.chat/api/plugin-store/submit \
  -H "Authorization: Bearer <your-token>" \
  -F 'metadata={"id":"my-plugin","name":"我的插件","version":"1.0.0","plugin_type":"process","hosting_mode":"managed","process_config":{"runtime":"python","entry_point":"main.py","port":8000,"ui":{"type":"iframe","width":1200,"height":800}}}' \
  -F "file=@my-plugin.tar.gz"

自托管模式提交

bash
curl -X POST https://api.unityai.chat/api/plugin-store/submit \
  -H "Authorization: Bearer <your-token>" \
  -F 'metadata={"id":"my-plugin","name":"我的插件","version":"1.0.0","plugin_type":"process","hosting_mode":"self_hosted","self_hosted_url":"https://my-plugin.example.com","self_hosted_api_key":"sk-optional-key"}'

自托管无需上传代码包

自托管模式下 file 字段可选。如果你有文档/图标等附件可以一并上传,但不强制。

提交字段说明

字段类型必需说明
idstring唯一标识,字母/数字/连字符/下划线
namestring显示名称
versionstringsemver 版本号
plugin_typestring固定为 "process"
hosting_modestring"managed""self_hosted"
process_configobject托管必填runtime / entry_point / port / ui
self_hosted_urlstring自托管必填你的服务访问地址(HTTPS)
self_hosted_api_keystring访问你服务需要的 API Key(加密存储)

审核流程

提交 (pending) → 审核中 (reviewing) → 发布 (published) / 驳回 (rejected)

                                     可下架 (unpublished)
  • 审核通过后:托管模式自动部署;自托管模式做一次连通性验证
  • 驳回后可修改重新提交

自托管插件要求

必须实现的端点

GET /health
Response: 200 OK(任意 body)

平台每 5 分钟检查此端点,超时 3 秒视为 offline。

可用性状态

状态含义
online健康检查通过
offline健康检查失败(超时或非 2xx)
degraded返回 5xx 服务端错误
unknown尚未检查

用户启动 offline 状态的插件时会收到 503 错误提示。

API Key 安全

  • 提交时提供的 API Key 使用 AES-256-GCM 加密存储
  • 运行时解密后仅用于服务端请求你的服务,不会暴露给前端
  • 日志中仅记录前 4 位字符

用户侧 API

操作API
浏览GET /api/plugins/catalog
安装POST /api/plugins/:id/install
启动POST /api/plugin/launch/:id → 返回 iframe URL
卸载DELETE /api/plugins/:id/uninstall

权限与数据

  • Unity Lab 全部插件 permissions = [](零数据权限)
  • 不要尝试直连 https://your-unityai-host/api/* — 无凭证且会被拒绝
  • 本地子进程插件(官方托管)可使用 plugin_token 与本地后端通信;iframe 远程插件不适用

相关文档

HAMA | 蛤蟆数字