ai-world-sdk 1.3.3 → 1.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin.d.ts +121 -0
- package/dist/admin.js +297 -0
- package/dist/chrome-extension.d.ts +54 -0
- package/dist/chrome-extension.js +124 -0
- package/dist/config.d.ts +3 -3
- package/dist/config.js +2 -2
- package/dist/index.d.ts +6 -1
- package/dist/index.js +20 -4
- package/dist/llm.js +4 -0
- package/dist/plugin-management.d.ts +144 -0
- package/dist/plugin-management.js +333 -0
- package/dist/provider_config.d.ts +1 -1
- package/dist/provider_config.js +1 -0
- package/dist/shared-resource.d.ts +61 -0
- package/dist/shared-resource.js +133 -0
- package/dist/stats.d.ts +60 -0
- package/dist/stats.js +172 -0
- package/dist/versioned-resource.d.ts +114 -0
- package/dist/versioned-resource.js +209 -0
- package/package.json +1 -1
- package/skills/ai-world-sdk/SKILL.md +54 -6
- package/skills/ai-world-sdk/docs/admin-api.md +133 -0
- package/skills/ai-world-sdk/docs/auth-and-download.md +87 -0
- package/skills/ai-world-sdk/docs/common-mistakes.md +23 -2
- package/skills/ai-world-sdk/docs/platform-api.md +186 -0
- package/skills/ai-world-sdk/docs/provider-and-models.md +14 -1
- package/skills/ai-world-sdk/docs/versioned-resource.md +64 -0
- package/dist/database-requests.d.ts +0 -151
- package/dist/database-requests.js +0 -242
- package/skills/ai-world-sdk/docs/database-requests.md +0 -68
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ai-world-sdk
|
|
3
|
-
description: Use when initializing ai-world-sdk or calling AI models in ai-world projects. Covers sdkConfig initialization, createProvider with Vercel AI SDK (generateText, streamText, generateImage), Doubao image/video generation/understanding, MinIO object storage (MinioStorageClient), resource management with ACL (ResourceClient),
|
|
3
|
+
description: Use when initializing ai-world-sdk or calling AI models in ai-world projects. Covers sdkConfig initialization, createProvider with Vercel AI SDK (generateText, streamText, generateImage), Doubao image/video generation/understanding, MinIO object storage (MinioStorageClient), resource management with ACL (ResourceClient), versioned resource management (VersionedResourceClient), agent skills management (AgentSkillClient), VSCode extension login (initAIWorld), user auth (AuthClient, getCurrentUserInfo), download proxy (DownloadClient), admin management (AdminClient for user/role/database), plugin management (PluginManagementClient), statistics (StatsClient, DashboardClient), shared resources (SharedResourceClient), and chrome extensions (ChromeExtensionClient). Triggers on ai-world-sdk, createProvider, sdkConfig, generateText, streamText, generateImage, doubao, video understanding, VideoUnderstandingClient, MinioStorageClient, minio, ResourceClient, resource management, access control, file sharing, VersionedResourceClient, versioned resource, version management, AgentSkillClient, agent skill, vscode extension, initAIWorld, AuthClient, getCurrentUserInfo, DownloadClient, AdminClient, admin API, user management, role management, database management, PluginManagementClient, plugin management, StatsClient, DashboardClient, statistics, SharedResourceClient, shared resources, ChromeExtensionClient, chrome extension, or any AI model integration.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# AI World SDK
|
|
@@ -18,7 +18,7 @@ ai-world-sdk 是 AI World 平台的 TypeScript SDK,通过 `createProvider` 创
|
|
|
18
18
|
- 使用 Doubao 豆包图像/视频生成
|
|
19
19
|
- 使用 MinIO 对象存储(文件上传/下载/管理)
|
|
20
20
|
- 使用资源管理系统(权限控制: private/specific_users/public)
|
|
21
|
-
-
|
|
21
|
+
- 使用版本化资源管理(资源名称+版本号管理)
|
|
22
22
|
- 管理 Agent Skills(上传/下载/删除/列表)
|
|
23
23
|
- **开发 VSCode 扩展**时集成 AI World 登录和 SDK 功能
|
|
24
24
|
|
|
@@ -129,8 +129,9 @@ sdkConfig.setPluginId('my-plugin');
|
|
|
129
129
|
### Provider 与模型 → `docs/provider-and-models.md`
|
|
130
130
|
|
|
131
131
|
- `createProvider(provider, endpointType, pluginId)` 创建 Vercel AI SDK Provider
|
|
132
|
-
- Provider 对照表:`api2img`(推荐) / `gemini` / `aihubmix` / `shubiaobiao` / `aiping` / `openrouter`
|
|
132
|
+
- Provider 对照表:`api2img`(推荐) / `gemini` / `aihubmix` / `shubiaobiao` / `aiping` / `openrouter` / `kunpo`
|
|
133
133
|
- **OpenRouter**:使用专用代理端点 `/api/llm/openrouter`,模型 ID 格式为 `provider/model`(如 `openai/gpt-4o-mini`、`anthropic/claude-sonnet-4-20250514`、`google/gemini-2.5-flash-preview`)
|
|
134
|
+
- **KUNPO API**:统一 LLM 网关(https://llm.ziy.cc),兼容 OpenAI 接口,使用专用代理端点 `/api/llm/kunpo`,一个 Key 访问 150+ 模型
|
|
134
135
|
- 常用模型列表和 AI SDK 函数速查
|
|
135
136
|
|
|
136
137
|
#### OpenRouter 快速示例
|
|
@@ -158,6 +159,31 @@ for await (const chunk of stream.textStream) {
|
|
|
158
159
|
}
|
|
159
160
|
```
|
|
160
161
|
|
|
162
|
+
#### KUNPO API 快速示例
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { createProvider } from 'ai-world-sdk';
|
|
166
|
+
import { generateText, streamText } from 'ai';
|
|
167
|
+
|
|
168
|
+
// KUNPO API(endpointType 传 'openai',兼容 OpenAI 接口)
|
|
169
|
+
const provider = createProvider('kunpo', 'openai', 'my-plugin');
|
|
170
|
+
|
|
171
|
+
// 非流式
|
|
172
|
+
const result = await generateText({
|
|
173
|
+
model: provider.languageModel('google/gemini-3.1-pro-preview'),
|
|
174
|
+
prompt: '你好',
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// 流式
|
|
178
|
+
const stream = streamText({
|
|
179
|
+
model: provider.languageModel('anthropic/claude-haiku-4.5'),
|
|
180
|
+
prompt: '请介绍人工智能',
|
|
181
|
+
});
|
|
182
|
+
for await (const chunk of stream.textStream) {
|
|
183
|
+
process.stdout.write(chunk);
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
161
187
|
### 文本生成 → `docs/text-generation.md`
|
|
162
188
|
|
|
163
189
|
- `generateText` / `streamText` / `generateObject` / `streamObject`
|
|
@@ -185,16 +211,23 @@ for await (const chunk of stream.textStream) {
|
|
|
185
211
|
- 三级权限: `private` / `specific_users` / `public`
|
|
186
212
|
- 插件隔离与跨插件访问
|
|
187
213
|
|
|
188
|
-
###
|
|
214
|
+
### 版本化资源 → `docs/versioned-resource.md`
|
|
189
215
|
|
|
190
|
-
- `
|
|
191
|
-
-
|
|
216
|
+
- `VersionedResourceClient` — 全局版本化资源管理
|
|
217
|
+
- 资源名称为唯一 ID,支持语义化版本号
|
|
218
|
+
- 支持 `latest` 别名获取/下载最新版本
|
|
192
219
|
|
|
193
220
|
### Agent Skills → `docs/agent-skills.md`
|
|
194
221
|
|
|
195
222
|
- `AgentSkillClient` — Skills 上传/下载/删除/列表
|
|
196
223
|
- Skill 名称全小写,zip 必须包含 SKILL.md
|
|
197
224
|
|
|
225
|
+
### 认证与下载 → `docs/auth-and-download.md`
|
|
226
|
+
|
|
227
|
+
- `AuthClient` / `getCurrentUserInfo()` — 获取当前用户信息(id / email / full_name / is_superuser 等)
|
|
228
|
+
- `DownloadClient` — 经后端代理下载任意 URL 文件,支持流式下载和浏览器下载
|
|
229
|
+
- HTTP 通用代理 `/api/http-proxy/{path}`(`X-Target-URL` 头指定目标)
|
|
230
|
+
|
|
198
231
|
### VSCode 扩展登录 → `docs/vscode-login.md`
|
|
199
232
|
|
|
200
233
|
- `initAIWorld(context)` 一步初始化(登录 + sdkConfig + 状态栏 + 命令)
|
|
@@ -203,6 +236,21 @@ for await (const chunk of stream.textStream) {
|
|
|
203
236
|
- `pluginId` 默认取扩展 `package.json` 的 `name` 字段
|
|
204
237
|
- 完整示例见 `examples/vscode-test-extension/`
|
|
205
238
|
|
|
239
|
+
### 管理员 API → `docs/admin-api.md`
|
|
240
|
+
|
|
241
|
+
- `AdminClient` — 用户管理、角色管理、数据库表管理(需管理员权限)
|
|
242
|
+
- 用户: `listUsers` / `getUser` / `activateUser` / `deactivateUser` / `makeAdmin` / `removeAdmin` / `setUserRole` / `batchSetRole`
|
|
243
|
+
- 角色: `listRoles` / `getRole` / `createRole` / `updateRole` / `deleteRole` / `getRoleUserCounts`
|
|
244
|
+
- 数据库表: `listTables` / `getTableSchema` / `getTableData` / `insertRow` / `updateRow` / `deleteRow`
|
|
245
|
+
|
|
246
|
+
### 平台通用 API → `docs/platform-api.md`
|
|
247
|
+
|
|
248
|
+
- `PluginManagementClient` — 插件 CRUD、启用/禁用/重载/重启、模板管理
|
|
249
|
+
- `StatsClient` — AI 接口调用统计/趋势、插件访问统计(管理员)
|
|
250
|
+
- `DashboardClient` — 当前用户统计(无需管理员权限)
|
|
251
|
+
- `SharedResourceClient` — 平台级文件共享(与 `ResourceClient` 的插件级 ACL 不同)
|
|
252
|
+
- `ChromeExtensionClient` — Chrome 插件管理
|
|
253
|
+
|
|
206
254
|
### 常见错误 → `docs/common-mistakes.md`
|
|
207
255
|
|
|
208
256
|
- endpointType 匹配规则、AI SDK v6 用法变更、MinIO 路径规范等
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# 管理员 API
|
|
2
|
+
|
|
3
|
+
通过 `AdminClient` 管理用户、角色和数据库表。所有接口需管理员权限。
|
|
4
|
+
|
|
5
|
+
## 基本用法
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { AdminClient } from 'ai-world-sdk';
|
|
9
|
+
|
|
10
|
+
const admin = new AdminClient();
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 用户管理
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// 列出用户(分页 + 搜索 + 角色过滤)
|
|
19
|
+
const users = await admin.listUsers({ page: 1, pageSize: 20, search: '张三' });
|
|
20
|
+
// users.items, users.total, users.page, users.page_size
|
|
21
|
+
|
|
22
|
+
// 按角色过滤
|
|
23
|
+
const devs = await admin.listUsers({ roleId: 2 });
|
|
24
|
+
const noRole = await admin.listUsers({ noRole: true });
|
|
25
|
+
|
|
26
|
+
// 获取用户详情
|
|
27
|
+
const user = await admin.getUser(42);
|
|
28
|
+
|
|
29
|
+
// 激活 / 停用用户
|
|
30
|
+
await admin.activateUser(42);
|
|
31
|
+
await admin.deactivateUser(42);
|
|
32
|
+
|
|
33
|
+
// 设置/移除管理员
|
|
34
|
+
await admin.makeAdmin(42);
|
|
35
|
+
await admin.removeAdmin(42);
|
|
36
|
+
|
|
37
|
+
// 设置用户角色
|
|
38
|
+
await admin.setUserRole(42, 2); // roleId=2
|
|
39
|
+
|
|
40
|
+
// 批量设置角色(roleId 为 null 则移除角色)
|
|
41
|
+
await admin.batchSetRole([1, 2, 3], 2);
|
|
42
|
+
await admin.batchSetRole([4, 5], null); // 移除角色
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### ListUsersOptions
|
|
46
|
+
|
|
47
|
+
| 参数 | 类型 | 说明 |
|
|
48
|
+
|------|------|------|
|
|
49
|
+
| `page` | number? | 页码(默认 1) |
|
|
50
|
+
| `pageSize` | number? | 每页数量(1-100,默认 20) |
|
|
51
|
+
| `search` | string? | 搜索用户名/邮箱 |
|
|
52
|
+
| `roleId` | number? | 按角色 ID 过滤 |
|
|
53
|
+
| `noRole` | boolean? | 仅无角色用户 |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 角色管理
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// 列出所有角色
|
|
61
|
+
const roles = await admin.listRoles();
|
|
62
|
+
|
|
63
|
+
// 获取角色详情
|
|
64
|
+
const role = await admin.getRole(1);
|
|
65
|
+
|
|
66
|
+
// 获取每个角色的用户数
|
|
67
|
+
const counts = await admin.getRoleUserCounts();
|
|
68
|
+
// [{ role_id, role_name, user_count }, ...]
|
|
69
|
+
|
|
70
|
+
// 创建角色(仅超级用户)
|
|
71
|
+
const newRole = await admin.createRole({
|
|
72
|
+
name: 'developer',
|
|
73
|
+
description: '开发者角色',
|
|
74
|
+
permissions: { can_upload_shared_resources: true },
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// 更新角色(仅超级用户,所有字段可选)
|
|
78
|
+
await admin.updateRole(newRole.id, { description: '更新描述' });
|
|
79
|
+
|
|
80
|
+
// 删除角色(仅超级用户)
|
|
81
|
+
await admin.deleteRole(newRole.id);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### RoleInfo 字段
|
|
85
|
+
|
|
86
|
+
| 字段 | 类型 | 说明 |
|
|
87
|
+
|------|------|------|
|
|
88
|
+
| `id` | number | 角色 ID |
|
|
89
|
+
| `name` | string | 角色名称 |
|
|
90
|
+
| `description` | string? | 描述 |
|
|
91
|
+
| `permissions` | Record<string, boolean> | 权限映射 |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 数据库表管理
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// 列出所有表
|
|
99
|
+
const tables = await admin.listTables(); // string[]
|
|
100
|
+
|
|
101
|
+
// 获取表结构
|
|
102
|
+
const schema = await admin.getTableSchema('users');
|
|
103
|
+
// [{ name, type, nullable, default, primary_key }, ...]
|
|
104
|
+
|
|
105
|
+
// 查询表数据(分页 + 搜索 + 排序)
|
|
106
|
+
const data = await admin.getTableData('users', {
|
|
107
|
+
page: 1,
|
|
108
|
+
pageSize: 50,
|
|
109
|
+
sortBy: 'created_at',
|
|
110
|
+
sortOrder: 'desc',
|
|
111
|
+
search: 'test',
|
|
112
|
+
});
|
|
113
|
+
// data.data: Record[], data.total, data.page, data.page_size
|
|
114
|
+
|
|
115
|
+
// 插入行
|
|
116
|
+
await admin.insertRow('users', { name: '张三', email: 'zhang@example.com' });
|
|
117
|
+
|
|
118
|
+
// 更新行
|
|
119
|
+
await admin.updateRow('users', { id: 1 }, { name: '李四' });
|
|
120
|
+
|
|
121
|
+
// 删除行
|
|
122
|
+
await admin.deleteRow('users', { id: 1 });
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### ListTableDataOptions
|
|
126
|
+
|
|
127
|
+
| 参数 | 类型 | 说明 |
|
|
128
|
+
|------|------|------|
|
|
129
|
+
| `page` | number? | 页码(默认 1) |
|
|
130
|
+
| `pageSize` | number? | 每页数量(1-200,默认 20) |
|
|
131
|
+
| `search` | string? | 全文搜索 |
|
|
132
|
+
| `sortBy` | string? | 排序字段 |
|
|
133
|
+
| `sortOrder` | "asc" \| "desc"? | 排序方向 |
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# 认证与下载
|
|
2
|
+
|
|
3
|
+
## AuthClient — 用户认证
|
|
4
|
+
|
|
5
|
+
通过 `AuthClient` 或便捷函数 `getCurrentUserInfo()` 获取当前登录用户信息。
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { AuthClient, getCurrentUserInfo } from 'ai-world-sdk';
|
|
9
|
+
|
|
10
|
+
// 方式1: 便捷函数(自动从 sdkConfig 读取 token)
|
|
11
|
+
const user = await getCurrentUserInfo();
|
|
12
|
+
console.log(user.id, user.full_name, user.email);
|
|
13
|
+
|
|
14
|
+
// 方式2: 实例化(可传自定义 config)
|
|
15
|
+
const auth = new AuthClient({ token: 'custom-token' });
|
|
16
|
+
const user2 = await auth.getCurrentUserInfo();
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### UserInfo 字段
|
|
20
|
+
|
|
21
|
+
| 字段 | 类型 | 说明 |
|
|
22
|
+
|------|------|------|
|
|
23
|
+
| `id` | `number` | 用户 ID |
|
|
24
|
+
| `email` | `string?` | 邮箱 |
|
|
25
|
+
| `full_name` | `string?` | 全名 |
|
|
26
|
+
| `avatar_url` | `string?` | 头像 URL |
|
|
27
|
+
| `feishu_user_id` | `string` | 飞书用户 ID |
|
|
28
|
+
| `is_active` | `boolean` | 是否激活 |
|
|
29
|
+
| `is_superuser` | `boolean` | 是否超级管理员 |
|
|
30
|
+
| `created_at` | `string` | 创建时间 |
|
|
31
|
+
|
|
32
|
+
### API 端点
|
|
33
|
+
|
|
34
|
+
| 方法 | 路径 | 说明 |
|
|
35
|
+
|------|------|------|
|
|
36
|
+
| GET | `/api/auth/me` | 获取当前用户信息(需 Bearer token) |
|
|
37
|
+
| POST | `/api/auth/logout` | 登出(需 Bearer token) |
|
|
38
|
+
| GET | `/api/auth/login` | SDK/Vite 登录入口(需 `redirect` 参数) |
|
|
39
|
+
| GET | `/api/auth/feishu/login` | 前端飞书登录 URL |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## DownloadClient — 下载代理
|
|
44
|
+
|
|
45
|
+
通过 `DownloadClient` 经后端代理下载任意 URL 文件,解决前端跨域限制。
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { DownloadClient } from 'ai-world-sdk';
|
|
49
|
+
|
|
50
|
+
const dl = new DownloadClient();
|
|
51
|
+
|
|
52
|
+
// 普通下载(返回 Blob)
|
|
53
|
+
const blob = await dl.download({ url: 'https://example.com/file.zip' });
|
|
54
|
+
|
|
55
|
+
// 流式下载(AsyncGenerator,适合大文件)
|
|
56
|
+
let totalSize = 0;
|
|
57
|
+
for await (const chunk of dl.streamDownload({ url: 'https://example.com/big.zip' })) {
|
|
58
|
+
totalSize += chunk.length;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// 触发浏览器下载对话框
|
|
62
|
+
await dl.downloadAsFile(
|
|
63
|
+
{ url: 'https://example.com/report.pdf' },
|
|
64
|
+
'report.pdf'
|
|
65
|
+
);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## HTTP 通用代理
|
|
71
|
+
|
|
72
|
+
后端提供通用 HTTP 代理,支持所有 HTTP 方法。SDK 未封装此接口,需手动调用。
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
const resp = await fetch(`${baseUrl}/api/http-proxy/your/path`, {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: {
|
|
78
|
+
'X-Target-URL': 'https://external-api.com/api/endpoint',
|
|
79
|
+
'Content-Type': 'application/json',
|
|
80
|
+
},
|
|
81
|
+
body: JSON.stringify({ key: 'value' }),
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
| 方法 | 路径 | 说明 |
|
|
86
|
+
|------|------|------|
|
|
87
|
+
| * | `/api/http-proxy/{path}` | 通用代理,`X-Target-URL` 头指定目标 URL |
|
|
@@ -1,18 +1,39 @@
|
|
|
1
1
|
# 常见错误与正确做法
|
|
2
2
|
|
|
3
|
+
## SDK 使用
|
|
4
|
+
|
|
3
5
|
| 错误 | 正确做法 |
|
|
4
6
|
|------|---------|
|
|
5
|
-
| endpointType 与 provider 不匹配 | `gemini`→`gemini`,其余→`openai` |
|
|
7
|
+
| endpointType 与 provider 不匹配 | `gemini`→`gemini`,其余→`openai`;仅 api2img/shubiaobiao/aiping 支持 `anthropic` |
|
|
6
8
|
| 手动传 API Key | 不需要,自动经后端代理鉴权 |
|
|
7
9
|
| `result.usage.promptTokens` | AI SDK v6 改为 `inputTokens` / `outputTokens` |
|
|
8
10
|
| `provider.image()` 类型报错 | 用 `(provider as any).image()` |
|
|
9
11
|
| 忘装 `ai` 包 | 需同时装 `ai-world-sdk` 和 `ai` |
|
|
10
12
|
| Vite dev 时调不通 | 在 `vite.config.ts` 中使用 `aiWorldPlugin()` 自动登录 |
|
|
11
13
|
| 用 `createProvider` 调豆包 | 豆包用专用客户端 `DoubaoImageGenerationClient` / `VideoGenerationClient` |
|
|
14
|
+
|
|
15
|
+
## 存储与资源
|
|
16
|
+
|
|
17
|
+
| 错误 | 正确做法 |
|
|
18
|
+
|------|---------|
|
|
12
19
|
| MinIO 操作缺少 `X-Plugin-Id` | 先调 `sdkConfig.setPluginId('xxx')` 或在构造函数传入 `pluginId` |
|
|
13
20
|
| MinIO 路径包含前导斜杠 | 路径不要以 `/` 开头,如 `docs/file.txt` 而非 `/docs/file.txt` |
|
|
14
21
|
| 资源管理与 MinIO 混用 | `MinioStorageClient` 是原始存储(无权限控制),`ResourceClient` 带 ACL |
|
|
15
22
|
| 资源管理忘记权限 | 上传默认 `private`,需显式设 `accessLevel: 'public'` 才能被他人访问 |
|
|
16
|
-
|
|
|
23
|
+
| 混淆四种资源系统 | `MinioStorageClient`=原始存储、`ResourceClient`=插件级ACL、`VersionedResourceClient`=全局版本化、`SharedResourceClient`=平台级共享 |
|
|
24
|
+
|
|
25
|
+
## Agent Skills
|
|
26
|
+
|
|
27
|
+
| 错误 | 正确做法 |
|
|
28
|
+
|------|---------|
|
|
17
29
|
| Agent Skill 名称含大写 | Skill 名称只允许 `[a-z0-9-]`,全小写 |
|
|
18
30
|
| Agent Skill zip 缺 SKILL.md | zip 中必须包含 `SKILL.md` 文件(含 YAML frontmatter) |
|
|
31
|
+
|
|
32
|
+
## Admin 与平台 API
|
|
33
|
+
|
|
34
|
+
| 错误 | 正确做法 |
|
|
35
|
+
|------|---------|
|
|
36
|
+
| 用普通用户调 AdminClient | `AdminClient` 需管理员权限(`is_superuser=true` 或对应角色权限) |
|
|
37
|
+
| HTTP 代理忘设目标 URL | `/api/http-proxy/{path}` 需通过 `X-Target-URL` 请求头指定目标 URL |
|
|
38
|
+
| 统计 API 权限不足 | `StatsClient` 仅管理员可用;普通用户用 `DashboardClient.getMyStats()` 查看个人统计 |
|
|
39
|
+
| 插件模板权限不足 | `createRegisteredTemplate` / `updateRegisteredTemplate` / `deleteRegisteredTemplate` 仅超级用户 |
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# 平台通用 API
|
|
2
|
+
|
|
3
|
+
## 插件管理 — PluginManagementClient
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { PluginManagementClient } from 'ai-world-sdk';
|
|
7
|
+
|
|
8
|
+
const plugins = new PluginManagementClient();
|
|
9
|
+
|
|
10
|
+
// 列出插件(分页 + 搜索 + 排序)
|
|
11
|
+
const list = await plugins.list({
|
|
12
|
+
page: 1, pageSize: 20, sortBy: 'updated_at', sortOrder: 'desc', enabledOnly: true,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// 获取 ID 列表
|
|
16
|
+
const ids = await plugins.listIds(true); // string[]
|
|
17
|
+
|
|
18
|
+
// 获取插件信息 / 状态
|
|
19
|
+
const info = await plugins.get('my-plugin');
|
|
20
|
+
const status = await plugins.getStatus('my-plugin');
|
|
21
|
+
|
|
22
|
+
// 创建插件
|
|
23
|
+
await plugins.create({
|
|
24
|
+
pluginId: 'new-plugin',
|
|
25
|
+
name: '新插件',
|
|
26
|
+
description: '描述',
|
|
27
|
+
staticZip: someZipFile, // 可选,含 index.html 的 zip
|
|
28
|
+
serverZip: serverZipFile, // 可选,JS 后端 zip
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// 启用 / 禁用 / 重载 / 重启后端
|
|
32
|
+
await plugins.enable('my-plugin');
|
|
33
|
+
await plugins.disable('my-plugin');
|
|
34
|
+
await plugins.reload('my-plugin');
|
|
35
|
+
await plugins.restartServer('my-plugin');
|
|
36
|
+
|
|
37
|
+
// 获取后端日志
|
|
38
|
+
const logs = await plugins.getServerLogs('my-plugin', 200);
|
|
39
|
+
|
|
40
|
+
// 删除插件(管理员或创建者)
|
|
41
|
+
await plugins.delete('my-plugin');
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 模板管理
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// 列出可用模板
|
|
48
|
+
const templates = await plugins.listTemplates();
|
|
49
|
+
const detail = await plugins.getTemplate('vue-starter');
|
|
50
|
+
|
|
51
|
+
// 从模板生成插件 zip
|
|
52
|
+
const zip = await plugins.generateFromTemplate('new-plugin', 'vue-starter', {
|
|
53
|
+
name: '新插件', author: '作者',
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// 模板注册表 CRUD(超级用户)
|
|
57
|
+
const regList = await plugins.listRegisteredTemplates({ page: 1, name: 'vue' });
|
|
58
|
+
await plugins.createRegisteredTemplate({
|
|
59
|
+
pluginId: 'tpl-vue', name: 'Vue 模板', gitUrl: 'https://github.com/...',
|
|
60
|
+
category: 'frontend',
|
|
61
|
+
});
|
|
62
|
+
await plugins.updateRegisteredTemplate(1, { description: '更新描述' });
|
|
63
|
+
await plugins.deleteRegisteredTemplate(1);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 统计 API — StatsClient(管理员)
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { StatsClient } from 'ai-world-sdk';
|
|
72
|
+
|
|
73
|
+
const stats = new StatsClient();
|
|
74
|
+
|
|
75
|
+
// AI 接口调用统计
|
|
76
|
+
const calls = await stats.getAiApiCalls({ provider: 'api2img', page: 1, pageSize: 50 });
|
|
77
|
+
const summary = await stats.getAiApiCallsSummary();
|
|
78
|
+
const trend = await stats.getAiApiCallsTrend({ period: 'daily', days: 30 });
|
|
79
|
+
const byUser = await stats.getAiApiCallsTrendByUser({ period: 'daily', limit: 10 });
|
|
80
|
+
|
|
81
|
+
// 插件访问统计
|
|
82
|
+
const access = await stats.getPluginAccess({ pluginId: 'my-plugin' });
|
|
83
|
+
const accessSummary = await stats.getPluginAccessSummary();
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 参数说明
|
|
87
|
+
|
|
88
|
+
| 参数 | 类型 | 说明 |
|
|
89
|
+
|------|------|------|
|
|
90
|
+
| `period` | "daily" \| "weekly" \| "monthly" | 统计周期 |
|
|
91
|
+
| `days` | number? | 统计天数 |
|
|
92
|
+
| `userId` | number? | 按用户筛选 |
|
|
93
|
+
| `apiType` | string? | API 类型(llm / image / video) |
|
|
94
|
+
| `provider` | string? | 提供商 |
|
|
95
|
+
| `model` | string? | 模型 |
|
|
96
|
+
| `pluginId` | string? | 插件 ID |
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Dashboard — DashboardClient
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
import { DashboardClient } from 'ai-world-sdk';
|
|
104
|
+
|
|
105
|
+
const dashboard = new DashboardClient();
|
|
106
|
+
const myStats = await dashboard.getMyStats(); // 无需管理员权限
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 共享资源 — SharedResourceClient
|
|
112
|
+
|
|
113
|
+
平台级文件共享,与 `ResourceClient`(插件级 ACL)不同。
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { SharedResourceClient } from 'ai-world-sdk';
|
|
117
|
+
|
|
118
|
+
const shared = new SharedResourceClient();
|
|
119
|
+
|
|
120
|
+
// 列出(分页 + 搜索 + 分类/标签过滤)
|
|
121
|
+
const list = await shared.list({ page: 1, search: 'config', tag: 'tools' });
|
|
122
|
+
|
|
123
|
+
// 上传
|
|
124
|
+
const file = new File(['content'], 'data.json', { type: 'application/json' });
|
|
125
|
+
const res = await shared.upload(file, { name: '配置文件', description: '描述', tags: 'config,tools' });
|
|
126
|
+
|
|
127
|
+
// 获取详情
|
|
128
|
+
const info = await shared.get(res.id);
|
|
129
|
+
|
|
130
|
+
// 更新元数据(owner 或超级用户)
|
|
131
|
+
await shared.update(res.id, { name: '新名称', tags: ['updated'] });
|
|
132
|
+
|
|
133
|
+
// 下载
|
|
134
|
+
const blob = await shared.download(res.id);
|
|
135
|
+
|
|
136
|
+
// 删除
|
|
137
|
+
await shared.delete(res.id);
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Chrome 插件 — ChromeExtensionClient
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { ChromeExtensionClient } from 'ai-world-sdk';
|
|
146
|
+
|
|
147
|
+
const chrome = new ChromeExtensionClient();
|
|
148
|
+
|
|
149
|
+
// 列出
|
|
150
|
+
const list = await chrome.list({ page: 1, name: 'adblock' });
|
|
151
|
+
|
|
152
|
+
// 获取详情
|
|
153
|
+
const ext = await chrome.get('my-ext');
|
|
154
|
+
|
|
155
|
+
// 创建/更新
|
|
156
|
+
await chrome.create({
|
|
157
|
+
extensionId: 'my-ext',
|
|
158
|
+
name: '我的扩展',
|
|
159
|
+
description: '描述',
|
|
160
|
+
version: '1.0.0',
|
|
161
|
+
extensionZip: zipFile, // 可选,更新时可省略仅修改元数据
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// 下载
|
|
165
|
+
const zip = await chrome.download('my-ext');
|
|
166
|
+
|
|
167
|
+
// 删除
|
|
168
|
+
await chrome.delete('my-ext');
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 其他接口
|
|
174
|
+
|
|
175
|
+
### 文档下载(无需 SDK 封装,直接 GET)
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
GET /api/docs/ai-world-sdk-skill → 下载 SDK Skill zip
|
|
179
|
+
GET /api/docs/http-proxy-usage-guide → HTTP 代理使用指南
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### SDK 版本检查(SDK 内部自动调用)
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
POST /api/sdk/version-check
|
|
186
|
+
```
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
| `aiping` | `anthropic` | 平音 Claude |
|
|
16
16
|
| `gemini` | `gemini` | Google 原生,仅限 Gemini 系列模型 |
|
|
17
17
|
| `openrouter` | `openai` | OpenRouter 聚合服务,SDK 内部自动使用 `createOpenRouter` 和专用代理端点 `/api/llm/openrouter`。模型 ID 格式为 `provider/model`(如 `openai/gpt-4o-mini`、`anthropic/claude-sonnet-4-20250514`) |
|
|
18
|
+
| `kunpo` | `openai` | KUNPO API 统一 LLM 网关(https://llm.ziy.cc),兼容 OpenAI 接口,一个 Key 访问 150+ 模型。SDK 内部使用 `createOpenAI` 并路由到专用代理 `/api/llm/kunpo` |
|
|
18
19
|
|
|
19
20
|
## EndpointType 与模型对应关系
|
|
20
21
|
|
|
@@ -25,7 +26,7 @@
|
|
|
25
26
|
| `openai` | OpenAI 兼容 | 模型兼容 OpenAI 格式,可包括 GPT、以及经聚合的 Gemini/Claude 等(视 provider 能力) |
|
|
26
27
|
| `openai` | OpenRouter 兼容 | 当 provider 为 `openrouter` 时,`endpointType` 传 `openai`,SDK 内部自动切换到 `createOpenRouter` 和专用代理端点 |
|
|
27
28
|
|
|
28
|
-
规则:**anthropic 不是 provider**,仅 **api2img**、**shubiaobiao**、**aiping** 支持 EndpointType 为 `anthropic`(调用 Claude);`gemini` provider 用 `gemini` endpoint;`openrouter` provider 的 `endpointType` 传 `openai`,SDK 内部会自动使用 `@openrouter/ai-sdk-provider` 的 `createOpenRouter` 并路由到专用代理 `/api/llm/openrouter
|
|
29
|
+
规则:**anthropic 不是 provider**,仅 **api2img**、**shubiaobiao**、**aiping** 支持 EndpointType 为 `anthropic`(调用 Claude);`gemini` provider 用 `gemini` endpoint;`openrouter` provider 的 `endpointType` 传 `openai`,SDK 内部会自动使用 `@openrouter/ai-sdk-provider` 的 `createOpenRouter` 并路由到专用代理 `/api/llm/openrouter`;`kunpo` provider 的 `endpointType` 传 `openai`,SDK 内部使用 `createOpenAI` 并路由到专用代理 `/api/llm/kunpo`;其余按上表组合。
|
|
29
30
|
|
|
30
31
|
> `doubao` 不通过 `createProvider` 使用,豆包有专用客户端(见 image-generation.md / video-generation.md)。
|
|
31
32
|
|
|
@@ -60,6 +61,13 @@ const or = createProvider('openrouter', 'openai', 'my-plugin');
|
|
|
60
61
|
or.languageModel('openai/gpt-4o-mini');
|
|
61
62
|
or.languageModel('anthropic/claude-sonnet-4-20250514');
|
|
62
63
|
or.languageModel('google/gemini-2.5-flash-preview');
|
|
64
|
+
|
|
65
|
+
// KUNPO API(endpointType 传 'openai',SDK 内部使用 createOpenAI + 专用代理 /api/llm/kunpo)
|
|
66
|
+
// 兼容 OpenAI Chat Completions 格式,支持 150+ 模型
|
|
67
|
+
const kp = createProvider('kunpo', 'openai', 'my-plugin');
|
|
68
|
+
kp.languageModel('google/gemini-3.1-pro-preview');
|
|
69
|
+
kp.languageModel('anthropic/claude-haiku-4.5');
|
|
70
|
+
kp.languageModel('GLM-5.1');
|
|
63
71
|
```
|
|
64
72
|
|
|
65
73
|
### 检测模型可用性
|
|
@@ -80,6 +88,11 @@ const ok = await checkModel('api2img', 'openai', 'gpt-4o-mini', 'my-plugin');
|
|
|
80
88
|
| `openai/gpt-4o-mini` / `openai/gpt-4o` | 文本 | `openrouter` | `openai`(SDK 自动处理) |
|
|
81
89
|
| `anthropic/claude-sonnet-4-20250514` | 文本 | `openrouter` | `openai`(SDK 自动处理) |
|
|
82
90
|
| `google/gemini-2.5-flash-preview` | 文本 | `openrouter` | `openai`(SDK 自动处理) |
|
|
91
|
+
| `google/gemini-3.1-pro-preview` | 文本 | `kunpo` | `openai`(KUNPO API) |
|
|
92
|
+
| `anthropic/claude-haiku-4.5` | 文本 | `kunpo` | `openai`(KUNPO API) |
|
|
93
|
+
| `GLM-5.1` / `z-ai/glm-5v-turbo` | 文本 | `kunpo` | `openai`(KUNPO API) |
|
|
94
|
+
| `x-ai/grok-4.20` | 文本 | `kunpo` | `openai`(KUNPO API) |
|
|
95
|
+
| `google/gemma-4-26b-a4b-it` | 文本 | `kunpo` | `openai`(KUNPO API) |
|
|
83
96
|
| `doubao-seedream-4-5-251128` | 图像 | — | 专用客户端 |
|
|
84
97
|
|
|
85
98
|
## AI SDK 函数速查
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 版本化资源管理
|
|
2
|
+
|
|
3
|
+
独立于 SharedResource 的版本化资源系统。资源名称为全局唯一标识(不区分用户),支持语义化版本号管理。
|
|
4
|
+
存储在 MinIO `ai-world-res` bucket 的 `resources/{name}/{version}/{filename}` 路径下。
|
|
5
|
+
|
|
6
|
+
## 基本用法
|
|
7
|
+
|
|
8
|
+
```typescript
|
|
9
|
+
import { VersionedResourceClient } from 'ai-world-sdk';
|
|
10
|
+
|
|
11
|
+
const vr = new VersionedResourceClient();
|
|
12
|
+
|
|
13
|
+
// 上传新版本(版本号必须高于当前最新版本)
|
|
14
|
+
const file = new File(['{"key": "value"}'], 'config.json', { type: 'application/json' });
|
|
15
|
+
const res = await vr.upload('my-config', '1.0.0', file, '初始版本');
|
|
16
|
+
|
|
17
|
+
// 上传更高版本
|
|
18
|
+
const file2 = new File(['{"key": "new"}'], 'config.json', { type: 'application/json' });
|
|
19
|
+
await vr.upload('my-config', '1.1.0', file2, '更新配置');
|
|
20
|
+
|
|
21
|
+
// 获取最新版本信息
|
|
22
|
+
const latest = await vr.getLatest('my-config');
|
|
23
|
+
console.log(latest.version); // "1.1.0"
|
|
24
|
+
|
|
25
|
+
// 获取指定版本信息
|
|
26
|
+
const v1 = await vr.getVersion('my-config', '1.0.0');
|
|
27
|
+
|
|
28
|
+
// 列出所有版本(按版本号降序)
|
|
29
|
+
const versions = await vr.listVersions('my-config');
|
|
30
|
+
|
|
31
|
+
// 下载指定版本
|
|
32
|
+
const blob = await vr.download('my-config', '1.0.0');
|
|
33
|
+
|
|
34
|
+
// 下载最新版本(使用 "latest" 别名)
|
|
35
|
+
const latestBlob = await vr.download('my-config', 'latest');
|
|
36
|
+
|
|
37
|
+
// 列出所有资源(分页,聚合最新版本信息)
|
|
38
|
+
const list = await vr.list({ page: 1, pageSize: 20, search: 'config' });
|
|
39
|
+
|
|
40
|
+
// 删除指定版本
|
|
41
|
+
await vr.deleteVersion('my-config', '1.0.0');
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 版本号规则
|
|
45
|
+
|
|
46
|
+
| 规则 | 说明 |
|
|
47
|
+
|------|------|
|
|
48
|
+
| 格式 | 语义化版本号(semver),如 `1.0.0`、`2.1.3` |
|
|
49
|
+
| 唯一性 | 同一资源名称下版本号唯一 |
|
|
50
|
+
| 递增约束 | 上传新版本时,版本号必须高于当前最新版本 |
|
|
51
|
+
| latest 别名 | 获取/下载时可使用 `latest` 代替具体版本号 |
|
|
52
|
+
|
|
53
|
+
## 权限模型
|
|
54
|
+
|
|
55
|
+
| 操作 | 权限要求 |
|
|
56
|
+
|------|----------|
|
|
57
|
+
| 上传/删除 | `can_upload_shared_resources` 权限 |
|
|
58
|
+
| 查看/下载 | 所有已登录用户 |
|
|
59
|
+
|
|
60
|
+
## 与 SharedResource / ResourceClient 的区别
|
|
61
|
+
|
|
62
|
+
- `SharedResource` — 平台级文件共享,按用户上传,无版本概念
|
|
63
|
+
- `ResourceClient` — 插件级资源管理,按 plugin_id 隔离,三级 ACL
|
|
64
|
+
- `VersionedResourceClient` — 全局版本化资源,资源名称为唯一 ID,支持多版本管理
|