ai-world-sdk 1.0.17 → 1.1.0
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/README.md +106 -1
- package/dist/__tests__/example.test.js +10 -29
- package/dist/auth.d.ts +48 -0
- package/dist/auth.js +89 -0
- package/dist/base.js +6 -0
- package/dist/config.d.ts +36 -3
- package/dist/config.js +115 -8
- package/dist/doubao-image-generation.js +2 -0
- package/dist/download.js +4 -0
- package/dist/gemini-image-generation.js +2 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +8 -2
- package/dist/video_generation.js +6 -0
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ TypeScript SDK for AI World Platform - 一个功能完整的 AI 应用开发 SDK
|
|
|
11
11
|
- 🎨 **图像生成**: 支持豆包 Seedream 和 Google Gemini
|
|
12
12
|
- 🎬 **视频生成**: 支持豆包 Seedance
|
|
13
13
|
- 📥 **下载代理**: 支持流式下载和普通下载任意 URL 的二进制文件
|
|
14
|
+
- 🔐 **用户认证**: 支持获取当前登录用户信息
|
|
14
15
|
- ⚙️ **全局配置**: 自动从浏览器环境获取配置,简化初始化
|
|
15
16
|
- 🐛 **调试模式**: 支持详细的请求/响应日志
|
|
16
17
|
|
|
@@ -135,7 +136,29 @@ if (result.status === 'succeeded') {
|
|
|
135
136
|
}
|
|
136
137
|
```
|
|
137
138
|
|
|
138
|
-
### 5.
|
|
139
|
+
### 5. 用户认证
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { getCurrentUserInfo, AuthClient } from 'ai-world-sdk';
|
|
143
|
+
|
|
144
|
+
// 方式1: 使用便捷函数(推荐)
|
|
145
|
+
const userInfo = await getCurrentUserInfo();
|
|
146
|
+
console.log('用户信息:', userInfo);
|
|
147
|
+
console.log('用户ID:', userInfo.id);
|
|
148
|
+
console.log('用户名:', userInfo.full_name);
|
|
149
|
+
console.log('邮箱:', userInfo.email);
|
|
150
|
+
|
|
151
|
+
// 方式2: 使用 AuthClient 类
|
|
152
|
+
const authClient = new AuthClient({
|
|
153
|
+
baseUrl: 'http://localhost:8000', // 可选,默认使用全局配置
|
|
154
|
+
token: 'your-token', // 可选,默认使用全局配置
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
const userInfo2 = await authClient.getCurrentUserInfo();
|
|
158
|
+
console.log('用户信息:', userInfo2);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 6. 下载代理
|
|
139
162
|
|
|
140
163
|
```typescript
|
|
141
164
|
import { DownloadClient } from 'ai-world-sdk';
|
|
@@ -998,6 +1021,47 @@ const result4 = await client.generate({
|
|
|
998
1021
|
console.log('4K 图像:', result4.data[0]?.b64_json ? 'Base64 编码' : result4.data[0]?.url);
|
|
999
1022
|
```
|
|
1000
1023
|
|
|
1024
|
+
### 用户认证工作流
|
|
1025
|
+
|
|
1026
|
+
```typescript
|
|
1027
|
+
import { getCurrentUserInfo, AuthClient } from 'ai-world-sdk';
|
|
1028
|
+
|
|
1029
|
+
// 1. 获取当前用户信息(使用便捷函数)
|
|
1030
|
+
try {
|
|
1031
|
+
const userInfo = await getCurrentUserInfo();
|
|
1032
|
+
console.log('用户ID:', userInfo.id);
|
|
1033
|
+
console.log('用户名:', userInfo.full_name);
|
|
1034
|
+
console.log('邮箱:', userInfo.email);
|
|
1035
|
+
console.log('是否超级用户:', userInfo.is_superuser);
|
|
1036
|
+
} catch (error) {
|
|
1037
|
+
console.error('获取用户信息失败:', error);
|
|
1038
|
+
// 可能需要重新登录
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
// 2. 使用 AuthClient 类(需要自定义配置时)
|
|
1042
|
+
const authClient = new AuthClient({
|
|
1043
|
+
baseUrl: 'http://localhost:8000',
|
|
1044
|
+
token: 'your-jwt-token',
|
|
1045
|
+
});
|
|
1046
|
+
|
|
1047
|
+
const userInfo = await authClient.getCurrentUserInfo();
|
|
1048
|
+
|
|
1049
|
+
// 3. 检查用户权限
|
|
1050
|
+
if (userInfo.is_superuser) {
|
|
1051
|
+
console.log('用户是超级管理员');
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
if (userInfo.is_active) {
|
|
1055
|
+
console.log('用户账户已激活');
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
// 4. 显示用户信息
|
|
1059
|
+
console.log(`欢迎, ${userInfo.full_name || userInfo.email || '用户'}`);
|
|
1060
|
+
if (userInfo.avatar_url) {
|
|
1061
|
+
console.log('头像:', userInfo.avatar_url);
|
|
1062
|
+
}
|
|
1063
|
+
```
|
|
1064
|
+
|
|
1001
1065
|
### 视频生成工作流
|
|
1002
1066
|
|
|
1003
1067
|
```typescript
|
|
@@ -1029,6 +1093,47 @@ if (result.status === 'succeeded') {
|
|
|
1029
1093
|
}
|
|
1030
1094
|
```
|
|
1031
1095
|
|
|
1096
|
+
### 用户认证工作流
|
|
1097
|
+
|
|
1098
|
+
```typescript
|
|
1099
|
+
import { getCurrentUserInfo, AuthClient } from 'ai-world-sdk';
|
|
1100
|
+
|
|
1101
|
+
// 1. 获取当前用户信息(使用便捷函数)
|
|
1102
|
+
try {
|
|
1103
|
+
const userInfo = await getCurrentUserInfo();
|
|
1104
|
+
console.log('用户ID:', userInfo.id);
|
|
1105
|
+
console.log('用户名:', userInfo.full_name);
|
|
1106
|
+
console.log('邮箱:', userInfo.email);
|
|
1107
|
+
console.log('是否超级用户:', userInfo.is_superuser);
|
|
1108
|
+
} catch (error) {
|
|
1109
|
+
console.error('获取用户信息失败:', error);
|
|
1110
|
+
// 可能需要重新登录
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
// 2. 使用 AuthClient 类(需要自定义配置时)
|
|
1114
|
+
const authClient = new AuthClient({
|
|
1115
|
+
baseUrl: 'http://localhost:8000',
|
|
1116
|
+
token: 'your-jwt-token',
|
|
1117
|
+
});
|
|
1118
|
+
|
|
1119
|
+
const userInfo = await authClient.getCurrentUserInfo();
|
|
1120
|
+
|
|
1121
|
+
// 3. 检查用户权限
|
|
1122
|
+
if (userInfo.is_superuser) {
|
|
1123
|
+
console.log('用户是超级管理员');
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
if (userInfo.is_active) {
|
|
1127
|
+
console.log('用户账户已激活');
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
// 4. 显示用户信息
|
|
1131
|
+
console.log(`欢迎, ${userInfo.full_name || userInfo.email || '用户'}`);
|
|
1132
|
+
if (userInfo.avatar_url) {
|
|
1133
|
+
console.log('头像:', userInfo.avatar_url);
|
|
1134
|
+
}
|
|
1135
|
+
```
|
|
1136
|
+
|
|
1032
1137
|
### 下载代理工作流
|
|
1033
1138
|
|
|
1034
1139
|
```typescript
|
|
@@ -39,6 +39,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
40
|
const dotenv = __importStar(require("dotenv"));
|
|
41
41
|
const index_1 = require("../index");
|
|
42
|
+
const fs_1 = require("fs");
|
|
42
43
|
// Load environment variables from .env file
|
|
43
44
|
dotenv.config();
|
|
44
45
|
index_1.sdkConfig.setBaseUrl("http://localhost:8000");
|
|
@@ -611,33 +612,18 @@ describe("Langchain SDK Tests", () => {
|
|
|
611
612
|
}, 120000);
|
|
612
613
|
test("GeminiImageGenerationClient - 多图输入图像生成", async () => {
|
|
613
614
|
const imageClient = new index_1.GeminiImageGenerationClient({});
|
|
614
|
-
// 先生成两张基础图片
|
|
615
|
-
const
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
aspect_ratio: '1:1',
|
|
619
|
-
response_modalities: ['IMAGE'],
|
|
620
|
-
});
|
|
621
|
-
const baseResult2 = await imageClient.generate({
|
|
622
|
-
prompt: 'A simple, modern logo with the letters G and A in a white circle',
|
|
623
|
-
model: 'gemini-2.5-flash-image',
|
|
624
|
-
aspect_ratio: '1:1',
|
|
625
|
-
response_modalities: ['IMAGE'],
|
|
626
|
-
});
|
|
627
|
-
expect(baseResult1.data.length).toBeGreaterThan(0);
|
|
628
|
-
expect(baseResult2.data.length).toBeGreaterThan(0);
|
|
629
|
-
const image1 = baseResult1.data[0]?.b64_json || baseResult1.data[0]?.url;
|
|
630
|
-
const image2 = baseResult2.data[0]?.b64_json || baseResult2.data[0]?.url;
|
|
631
|
-
expect(image1).toBeDefined();
|
|
632
|
-
expect(image2).toBeDefined();
|
|
633
|
-
// 使用多张图片作为输入(gemini-2.5-flash-image 最多支持 3 张)
|
|
615
|
+
const image1 = "data:image/png;base64,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";
|
|
616
|
+
const image2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAJCAIAAACAMfp5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFgmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB0aWZmOk9yaWVudGF0aW9uPSIxIiBleGlmOkNvbG9yU3BhY2U9IjEiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI4IiBleGlmOlBpeGVsWURpbWVuc2lvbj0iOSIgeG1wOkNyZWF0ZURhdGU9IjIwMjUtMTItMTlUMTI6MDY6MDMrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI1LTEyLTE5VDEyOjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1LTEyLTE5VDEyOjA2OjM1KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5Y2IwNmRjYi04MmI0LTQ3ODctYmQ1Ny1lYWI5MzE5MzkyYzUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OWNiMDZkY2ItODJiNC00Nzg3LWJkNTctZWFiOTMxOTM5MmM1IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6OWNiMDZkY2ItODJiNC00Nzg3LWJkNTctZWFiOTMxOTM5MmM1Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OWNiMDZkY2ItODJiNC00Nzg3LWJkNTctZWFiOTMxOTM5MmM1IiBzdEV2dDp3aGVuPSIyMDI1LTEyLTE5VDEyOjA2OjM1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6KNh+8AAAAEElEQVQIHWNgYPiPAw0PCQA/Vke5jW7wRQAAAABJRU5ErkJggg==";
|
|
617
|
+
const image3 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAJCAIAAACAMfp5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGUWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0xMi0xOVQxMjowNjowMyswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMTItMTlUMTI6MDY6NTUrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMTItMTlUMTI6MDY6NTUrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjkxMDMwZWU4LWVmNDQtNDE3My1iNjI4LTRiZTAzODg0YTkxNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5Y2IwNmRjYi04MmI0LTQ3ODctYmQ1Ny1lYWI5MzE5MzkyYzUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5Y2IwNmRjYi04MmI0LTQ3ODctYmQ1Ny1lYWI5MzE5MzkyYzUiIHRpZmY6T3JpZW50YXRpb249IjEiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjgiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSI5Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OWNiMDZkY2ItODJiNC00Nzg3LWJkNTctZWFiOTMxOTM5MmM1IiBzdEV2dDp3aGVuPSIyMDI1LTEyLTE5VDEyOjA2OjM1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTEwMzBlZTgtZWY0NC00MTczLWI2MjgtNGJlMDM4ODRhOTE2IiBzdEV2dDp3aGVuPSIyMDI1LTEyLTE5VDEyOjA2OjU1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6l1N8jAAAAEElEQVQIHWP8z4AdMA4TCQBdJgkB37cJ2wAAAABJRU5ErkJggg==";
|
|
618
|
+
// 使用多张图片作为输入
|
|
634
619
|
const result = await imageClient.generate({
|
|
635
|
-
prompt: '
|
|
636
|
-
image: [image1, image2],
|
|
637
|
-
model: 'gemini-
|
|
620
|
+
prompt: '将图1上半部分换成图3颜色,下半部分换成图2颜色',
|
|
621
|
+
image: [image1, image2, image3],
|
|
622
|
+
model: 'gemini-3-pro-image-preview',
|
|
638
623
|
aspect_ratio: '1:1',
|
|
639
624
|
response_modalities: ['IMAGE'],
|
|
640
625
|
});
|
|
626
|
+
(0, fs_1.writeFileSync)(__dirname + "/test_1.json", JSON.stringify(result.data));
|
|
641
627
|
expect(result).toBeDefined();
|
|
642
628
|
expect(result.data).toBeDefined();
|
|
643
629
|
expect(result.data.length).toBeGreaterThan(0);
|
|
@@ -864,12 +850,7 @@ describe("Langchain SDK Tests", () => {
|
|
|
864
850
|
expect(index_1.sdkConfig.getDebug()).toBe(true);
|
|
865
851
|
index_1.sdkConfig.setDebug(false);
|
|
866
852
|
expect(index_1.sdkConfig.getDebug()).toBe(false);
|
|
867
|
-
//
|
|
868
|
-
index_1.sdkConfig.reset();
|
|
869
|
-
expect(index_1.sdkConfig.getServerUrl()).toBeNull();
|
|
870
|
-
expect(index_1.sdkConfig.getToken()).toBeNull();
|
|
871
|
-
expect(Object.keys(index_1.sdkConfig.getHeaders()).length).toBe(0);
|
|
872
|
-
expect(index_1.sdkConfig.getDebug()).toBe(false);
|
|
853
|
+
// 注意: reset 方法已被移除,不再测试
|
|
873
854
|
// 恢复原始配置
|
|
874
855
|
if (originalBaseUrl)
|
|
875
856
|
index_1.sdkConfig.setBaseUrl(originalBaseUrl);
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Client
|
|
3
|
+
* 认证客户端
|
|
4
|
+
* 提供用户认证相关的 API
|
|
5
|
+
*/
|
|
6
|
+
export interface AuthConfig {
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
token?: string;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* User information interface
|
|
13
|
+
* 用户信息接口
|
|
14
|
+
*/
|
|
15
|
+
export interface UserInfo {
|
|
16
|
+
id: number;
|
|
17
|
+
email?: string;
|
|
18
|
+
full_name?: string;
|
|
19
|
+
avatar_url?: string;
|
|
20
|
+
feishu_user_id: string;
|
|
21
|
+
is_active: boolean;
|
|
22
|
+
is_superuser: boolean;
|
|
23
|
+
created_at: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Auth Client
|
|
27
|
+
* 认证客户端类
|
|
28
|
+
*/
|
|
29
|
+
export declare class AuthClient {
|
|
30
|
+
private baseUrl;
|
|
31
|
+
private headers;
|
|
32
|
+
constructor(config?: AuthConfig);
|
|
33
|
+
/**
|
|
34
|
+
* Get current user information
|
|
35
|
+
* 获取当前用户信息
|
|
36
|
+
*
|
|
37
|
+
* @returns Promise that resolves to UserInfo
|
|
38
|
+
*/
|
|
39
|
+
getCurrentUserInfo(): Promise<UserInfo>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get current user information (convenience function)
|
|
43
|
+
* 获取当前用户信息(便捷函数)
|
|
44
|
+
*
|
|
45
|
+
* @param config - Optional auth configuration
|
|
46
|
+
* @returns Promise that resolves to UserInfo
|
|
47
|
+
*/
|
|
48
|
+
export declare function getCurrentUserInfo(config?: AuthConfig): Promise<UserInfo>;
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auth Client
|
|
4
|
+
* 认证客户端
|
|
5
|
+
* 提供用户认证相关的 API
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.AuthClient = void 0;
|
|
9
|
+
exports.getCurrentUserInfo = getCurrentUserInfo;
|
|
10
|
+
const config_1 = require("./config");
|
|
11
|
+
const log_1 = require("./log");
|
|
12
|
+
/**
|
|
13
|
+
* Auth Client
|
|
14
|
+
* 认证客户端类
|
|
15
|
+
*/
|
|
16
|
+
class AuthClient {
|
|
17
|
+
constructor(config = {}) {
|
|
18
|
+
// 使用配置的 baseUrl 或全局配置
|
|
19
|
+
this.baseUrl =
|
|
20
|
+
config.baseUrl ||
|
|
21
|
+
config_1.sdkConfig.getServerUrl() ||
|
|
22
|
+
(typeof window !== "undefined" ? window.location.origin : "");
|
|
23
|
+
// 合并 headers
|
|
24
|
+
const globalHeaders = config_1.sdkConfig.getHeaders();
|
|
25
|
+
const globalToken = config_1.sdkConfig.getToken() || config.token;
|
|
26
|
+
this.headers = {
|
|
27
|
+
"Content-Type": "application/json",
|
|
28
|
+
...globalHeaders,
|
|
29
|
+
...config.headers,
|
|
30
|
+
};
|
|
31
|
+
// 如果有 token,添加到 Authorization header
|
|
32
|
+
if (globalToken) {
|
|
33
|
+
this.headers["Authorization"] = `Bearer ${globalToken}`;
|
|
34
|
+
}
|
|
35
|
+
else if (config.token) {
|
|
36
|
+
this.headers["Authorization"] = `Bearer ${config.token}`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get current user information
|
|
41
|
+
* 获取当前用户信息
|
|
42
|
+
*
|
|
43
|
+
* @returns Promise that resolves to UserInfo
|
|
44
|
+
*/
|
|
45
|
+
async getCurrentUserInfo() {
|
|
46
|
+
// 检查版本兼容性
|
|
47
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
48
|
+
const url = `${this.baseUrl}/api/auth/me`;
|
|
49
|
+
(0, log_1.debugLog)("Get current user info request:", { url });
|
|
50
|
+
(0, log_1.logRequest)("GET", url, this.headers);
|
|
51
|
+
try {
|
|
52
|
+
const response = await fetch(url, {
|
|
53
|
+
method: "GET",
|
|
54
|
+
headers: this.headers,
|
|
55
|
+
});
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
const errorText = await response.text();
|
|
58
|
+
let errorMessage = `Get user info failed: ${response.status} ${response.statusText}`;
|
|
59
|
+
try {
|
|
60
|
+
const errorJson = JSON.parse(errorText);
|
|
61
|
+
errorMessage = errorJson.detail || errorMessage;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
errorMessage = errorText || errorMessage;
|
|
65
|
+
}
|
|
66
|
+
throw new Error(errorMessage);
|
|
67
|
+
}
|
|
68
|
+
const data = (await response.json());
|
|
69
|
+
(0, log_1.logResponse)(response.status, response.statusText, response.headers, data);
|
|
70
|
+
return data;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
(0, log_1.debugLog)("Get current user info error:", error);
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.AuthClient = AuthClient;
|
|
79
|
+
/**
|
|
80
|
+
* Get current user information (convenience function)
|
|
81
|
+
* 获取当前用户信息(便捷函数)
|
|
82
|
+
*
|
|
83
|
+
* @param config - Optional auth configuration
|
|
84
|
+
* @returns Promise that resolves to UserInfo
|
|
85
|
+
*/
|
|
86
|
+
async function getCurrentUserInfo(config) {
|
|
87
|
+
const client = new AuthClient(config);
|
|
88
|
+
return client.getCurrentUserInfo();
|
|
89
|
+
}
|
package/dist/base.js
CHANGED
|
@@ -33,6 +33,8 @@ class BaseChatModel {
|
|
|
33
33
|
* 遵循标准 LangChain API
|
|
34
34
|
*/
|
|
35
35
|
async invoke(messages) {
|
|
36
|
+
// 检查版本兼容性
|
|
37
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
36
38
|
const options = this._mergeOptions({});
|
|
37
39
|
const requestBody = {
|
|
38
40
|
messages,
|
|
@@ -82,6 +84,8 @@ class BaseChatModel {
|
|
|
82
84
|
* 遵循标准 LangChain API,返回 AIMessageChunk
|
|
83
85
|
*/
|
|
84
86
|
async *stream(messages) {
|
|
87
|
+
// 检查版本兼容性
|
|
88
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
85
89
|
const options = this._mergeOptions({});
|
|
86
90
|
const requestBody = {
|
|
87
91
|
messages,
|
|
@@ -153,6 +157,8 @@ class BaseChatModel {
|
|
|
153
157
|
* 遵循标准 LangChain API
|
|
154
158
|
*/
|
|
155
159
|
async batch(messagesList) {
|
|
160
|
+
// 检查版本兼容性
|
|
161
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
156
162
|
const requestBody = {
|
|
157
163
|
messages_list: messagesList,
|
|
158
164
|
config: {
|
package/dist/config.d.ts
CHANGED
|
@@ -2,11 +2,20 @@
|
|
|
2
2
|
* Global SDK Configuration
|
|
3
3
|
* 全局 SDK 配置
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* 版本兼容性错误
|
|
7
|
+
*/
|
|
8
|
+
export declare class VersionCompatibilityError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
5
11
|
declare class SDKConfig {
|
|
6
12
|
private _baseUrl;
|
|
7
13
|
private _token;
|
|
8
14
|
private _headers;
|
|
9
15
|
private _debug;
|
|
16
|
+
private _pluginId;
|
|
17
|
+
private _versionCompatible;
|
|
18
|
+
private _versionCheckPromise;
|
|
10
19
|
constructor();
|
|
11
20
|
/**
|
|
12
21
|
* Set global base URL
|
|
@@ -49,10 +58,34 @@ declare class SDKConfig {
|
|
|
49
58
|
*/
|
|
50
59
|
getDebug(): boolean;
|
|
51
60
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
61
|
+
* Set plugin ID
|
|
62
|
+
* 设置插件 ID
|
|
63
|
+
*/
|
|
64
|
+
setPluginId(pluginId: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get plugin ID
|
|
67
|
+
* 获取插件 ID(从 window.__INITIAL_DATA__ 自动获取或手动设置)
|
|
68
|
+
*/
|
|
69
|
+
getPluginId(): string | null;
|
|
70
|
+
/**
|
|
71
|
+
* Check version compatibility with backend
|
|
72
|
+
* 检查与后端的版本兼容性
|
|
73
|
+
*/
|
|
74
|
+
checkVersionCompatibility(): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* 执行版本兼容性检查
|
|
77
|
+
*/
|
|
78
|
+
private _performVersionCheck;
|
|
79
|
+
/**
|
|
80
|
+
* Get version compatibility status
|
|
81
|
+
* 获取版本兼容性状态
|
|
82
|
+
*/
|
|
83
|
+
isVersionCompatible(): boolean | null;
|
|
84
|
+
/**
|
|
85
|
+
* Ensure version is compatible, throw error if not
|
|
86
|
+
* 确保版本兼容,如果不兼容则抛出错误
|
|
54
87
|
*/
|
|
55
|
-
|
|
88
|
+
ensureVersionCompatible(): void;
|
|
56
89
|
}
|
|
57
90
|
export declare const sdkConfig: SDKConfig;
|
|
58
91
|
export {};
|
package/dist/config.js
CHANGED
|
@@ -4,13 +4,29 @@
|
|
|
4
4
|
* 全局 SDK 配置
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.sdkConfig = void 0;
|
|
7
|
+
exports.sdkConfig = exports.VersionCompatibilityError = void 0;
|
|
8
|
+
// SDK 版本号(构建时自动从 package.json 更新)
|
|
9
|
+
// 此版本号会在运行 npm run build 时自动从 package.json 读取并更新
|
|
10
|
+
const SDK_VERSION = "1.1.0";
|
|
11
|
+
/**
|
|
12
|
+
* 版本兼容性错误
|
|
13
|
+
*/
|
|
14
|
+
class VersionCompatibilityError extends Error {
|
|
15
|
+
constructor(message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = "VersionCompatibilityError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.VersionCompatibilityError = VersionCompatibilityError;
|
|
8
21
|
class SDKConfig {
|
|
9
22
|
constructor() {
|
|
10
23
|
this._baseUrl = null;
|
|
11
24
|
this._token = null;
|
|
12
25
|
this._headers = {};
|
|
13
26
|
this._debug = false;
|
|
27
|
+
this._pluginId = null;
|
|
28
|
+
this._versionCompatible = null; // null 表示未检查,true/false 表示检查结果
|
|
29
|
+
this._versionCheckPromise = null; // 版本检查的 Promise,避免重复请求
|
|
14
30
|
// 通过cookie获取token
|
|
15
31
|
try {
|
|
16
32
|
const cookieString = typeof document !== 'undefined' ? document.cookie : '';
|
|
@@ -27,6 +43,23 @@ class SDKConfig {
|
|
|
27
43
|
// 通过cookie获取baseUrl
|
|
28
44
|
const baseUrl = typeof window !== 'undefined' ? window.location.origin : '';
|
|
29
45
|
this._baseUrl = baseUrl;
|
|
46
|
+
// 从 window.__INITIAL_DATA__ 获取 plugin_id(SSR 插件环境)
|
|
47
|
+
try {
|
|
48
|
+
if (typeof window !== 'undefined' && window.__INITIAL_DATA__) {
|
|
49
|
+
const initialData = window.__INITIAL_DATA__;
|
|
50
|
+
if (initialData.plugin_id) {
|
|
51
|
+
this._headers['X-Plugin-Id'] = this._pluginId = initialData.plugin_id;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.warn('Failed to read plugin_id from __INITIAL_DATA__:', error);
|
|
57
|
+
}
|
|
58
|
+
this._headers['X-SDK-Version'] = SDK_VERSION;
|
|
59
|
+
// 自动检查版本兼容性(异步,不阻塞初始化)
|
|
60
|
+
this.checkVersionCompatibility().catch((error) => {
|
|
61
|
+
console.warn('版本兼容性检查失败:', error);
|
|
62
|
+
});
|
|
30
63
|
}
|
|
31
64
|
/**
|
|
32
65
|
* Set global base URL
|
|
@@ -85,14 +118,88 @@ class SDKConfig {
|
|
|
85
118
|
return this._debug;
|
|
86
119
|
}
|
|
87
120
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
121
|
+
* Set plugin ID
|
|
122
|
+
* 设置插件 ID
|
|
90
123
|
*/
|
|
91
|
-
|
|
92
|
-
this.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
124
|
+
setPluginId(pluginId) {
|
|
125
|
+
this._pluginId = pluginId;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get plugin ID
|
|
129
|
+
* 获取插件 ID(从 window.__INITIAL_DATA__ 自动获取或手动设置)
|
|
130
|
+
*/
|
|
131
|
+
getPluginId() {
|
|
132
|
+
return this._pluginId;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check version compatibility with backend
|
|
136
|
+
* 检查与后端的版本兼容性
|
|
137
|
+
*/
|
|
138
|
+
async checkVersionCompatibility() {
|
|
139
|
+
// 如果已经有检查结果,直接返回
|
|
140
|
+
if (this._versionCompatible !== null) {
|
|
141
|
+
return this._versionCompatible;
|
|
142
|
+
}
|
|
143
|
+
// 如果正在检查中,返回现有的 Promise
|
|
144
|
+
if (this._versionCheckPromise) {
|
|
145
|
+
return this._versionCheckPromise;
|
|
146
|
+
}
|
|
147
|
+
// 开始新的检查
|
|
148
|
+
this._versionCheckPromise = this._performVersionCheck();
|
|
149
|
+
const result = await this._versionCheckPromise;
|
|
150
|
+
this._versionCheckPromise = null;
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 执行版本兼容性检查
|
|
155
|
+
*/
|
|
156
|
+
async _performVersionCheck() {
|
|
157
|
+
const baseUrl = this._baseUrl || (typeof window !== 'undefined' ? window.location.origin : '');
|
|
158
|
+
if (!baseUrl) {
|
|
159
|
+
this._versionCompatible = true;
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const response = await fetch(`${baseUrl}/api/sdk/version-check`, {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers: {
|
|
166
|
+
'Content-Type': 'application/json',
|
|
167
|
+
'X-SDK-Version': SDK_VERSION,
|
|
168
|
+
},
|
|
169
|
+
body: JSON.stringify({ sdk_version: SDK_VERSION }),
|
|
170
|
+
});
|
|
171
|
+
if (!response.ok) {
|
|
172
|
+
this._versionCompatible = true;
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
const data = await response.json();
|
|
176
|
+
this._versionCompatible = data.compatible;
|
|
177
|
+
if (!data.compatible) {
|
|
178
|
+
console.error(`SDK 版本不兼容: ${data.message}`);
|
|
179
|
+
}
|
|
180
|
+
return data.compatible;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
console.warn('版本兼容性检查失败:', error);
|
|
184
|
+
this._versionCompatible = false;
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get version compatibility status
|
|
190
|
+
* 获取版本兼容性状态
|
|
191
|
+
*/
|
|
192
|
+
isVersionCompatible() {
|
|
193
|
+
return this._versionCompatible;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Ensure version is compatible, throw error if not
|
|
197
|
+
* 确保版本兼容,如果不兼容则抛出错误
|
|
198
|
+
*/
|
|
199
|
+
ensureVersionCompatible() {
|
|
200
|
+
if (this._versionCompatible === false) {
|
|
201
|
+
throw new VersionCompatibilityError('请更新 ai-world-sdk 到最新版本, 当前版本: ' + SDK_VERSION);
|
|
202
|
+
}
|
|
96
203
|
}
|
|
97
204
|
}
|
|
98
205
|
// 导出单例实例
|
package/dist/download.js
CHANGED
|
@@ -43,6 +43,8 @@ class DownloadClient {
|
|
|
43
43
|
* @returns Promise that resolves to a Blob
|
|
44
44
|
*/
|
|
45
45
|
async download(options) {
|
|
46
|
+
// 检查版本兼容性
|
|
47
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
46
48
|
const { url, filename } = options;
|
|
47
49
|
if (!url) {
|
|
48
50
|
throw new Error("URL is required");
|
|
@@ -104,6 +106,8 @@ class DownloadClient {
|
|
|
104
106
|
* ```
|
|
105
107
|
*/
|
|
106
108
|
async *streamDownload(options) {
|
|
109
|
+
// 检查版本兼容性
|
|
110
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
107
111
|
const { url, filename } = options;
|
|
108
112
|
if (!url) {
|
|
109
113
|
throw new Error("URL is required");
|
|
@@ -36,6 +36,8 @@ class GeminiImageGenerationClient {
|
|
|
36
36
|
* - response_modalities: 响应模态,["TEXT", "IMAGE"] 或 ["IMAGE"]
|
|
37
37
|
*/
|
|
38
38
|
async generate(request) {
|
|
39
|
+
// 检查版本兼容性
|
|
40
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
39
41
|
const requestBody = {
|
|
40
42
|
prompt: request.prompt,
|
|
41
43
|
model: request.model || "gemini-2.0-flash-exp-image-generation",
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { DoubaoImageGenerationClient, DoubaoImageSize, type DoubaoImageGeneratio
|
|
|
9
9
|
import { GeminiImageGenerationClient, type GeminiImageGenerationConfig, type GeminiImageGenerationRequest, type GeminiImageGenerationResponse } from "./gemini-image-generation";
|
|
10
10
|
import { VideoGenerationClient, type VideoGenerationConfig, type VideoGenerationRequest, type ContentGenerationTaskID, type ContentGenerationTask } from "./video_generation";
|
|
11
11
|
import { DownloadClient, type DownloadConfig, type DownloadOptions, type StreamDownloadOptions } from "./download";
|
|
12
|
-
import {
|
|
12
|
+
import { AuthClient, getCurrentUserInfo, type AuthConfig, type UserInfo } from "./auth";
|
|
13
13
|
export { BaseMessage, HumanMessage, AIMessage, SystemMessage, AIMessageChunk, type MessageContent, type AIMessageChunkData, } from "./messages";
|
|
14
14
|
export { BaseChatModel, type BaseChatModelParams, type AIModelProvider, type ToolDefinition, type BindOptions, } from "./base";
|
|
15
15
|
export { ChatOpenAI } from "./chat_models/openai";
|
|
@@ -24,7 +24,8 @@ export { DoubaoImageGenerationClient, type DoubaoImageGenerationConfig, type Dou
|
|
|
24
24
|
export { GeminiImageGenerationClient, type GeminiImageGenerationConfig, type GeminiImageGenerationRequest, type GeminiImageGenerationResponse, };
|
|
25
25
|
export { VideoGenerationClient, type VideoGenerationConfig, type VideoGenerationRequest, type ContentGenerationTaskID, type ContentGenerationTask, };
|
|
26
26
|
export { DownloadClient, type DownloadConfig, type DownloadOptions, type StreamDownloadOptions, };
|
|
27
|
-
export {
|
|
27
|
+
export { AuthClient, getCurrentUserInfo, type AuthConfig, type UserInfo, };
|
|
28
|
+
export { sdkConfig, VersionCompatibilityError } from "./config";
|
|
28
29
|
/**
|
|
29
30
|
* Create a chat model instance based on model name
|
|
30
31
|
*/
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @see https://github.com/langchain-ai/langchainjs
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.sdkConfig = exports.DownloadClient = exports.VideoGenerationClient = exports.GeminiImageGenerationClient = exports.DoubaoImageGenerationClient = exports.ChatAnthropic = exports.ChatGoogleGenerativeAI = exports.ChatOpenAI = exports.BaseChatModel = exports.AIMessageChunk = exports.SystemMessage = exports.AIMessage = exports.HumanMessage = void 0;
|
|
9
|
+
exports.VersionCompatibilityError = exports.sdkConfig = exports.getCurrentUserInfo = exports.AuthClient = exports.DownloadClient = exports.VideoGenerationClient = exports.GeminiImageGenerationClient = exports.DoubaoImageGenerationClient = exports.ChatAnthropic = exports.ChatGoogleGenerativeAI = exports.ChatOpenAI = exports.BaseChatModel = exports.AIMessageChunk = exports.SystemMessage = exports.AIMessage = exports.HumanMessage = void 0;
|
|
10
10
|
exports.createChatModel = createChatModel;
|
|
11
11
|
const openai_1 = require("./chat_models/openai");
|
|
12
12
|
const google_1 = require("./chat_models/google");
|
|
@@ -18,8 +18,10 @@ const video_generation_1 = require("./video_generation");
|
|
|
18
18
|
Object.defineProperty(exports, "VideoGenerationClient", { enumerable: true, get: function () { return video_generation_1.VideoGenerationClient; } });
|
|
19
19
|
const download_1 = require("./download");
|
|
20
20
|
Object.defineProperty(exports, "DownloadClient", { enumerable: true, get: function () { return download_1.DownloadClient; } });
|
|
21
|
+
const auth_1 = require("./auth");
|
|
22
|
+
Object.defineProperty(exports, "AuthClient", { enumerable: true, get: function () { return auth_1.AuthClient; } });
|
|
23
|
+
Object.defineProperty(exports, "getCurrentUserInfo", { enumerable: true, get: function () { return auth_1.getCurrentUserInfo; } });
|
|
21
24
|
const config_1 = require("./config");
|
|
22
|
-
Object.defineProperty(exports, "sdkConfig", { enumerable: true, get: function () { return config_1.sdkConfig; } });
|
|
23
25
|
// Re-export types and classes
|
|
24
26
|
var messages_1 = require("./messages");
|
|
25
27
|
Object.defineProperty(exports, "HumanMessage", { enumerable: true, get: function () { return messages_1.HumanMessage; } });
|
|
@@ -34,6 +36,10 @@ var google_2 = require("./chat_models/google");
|
|
|
34
36
|
Object.defineProperty(exports, "ChatGoogleGenerativeAI", { enumerable: true, get: function () { return google_2.ChatGoogleGenerativeAI; } });
|
|
35
37
|
var anthropic_1 = require("./chat_models/anthropic");
|
|
36
38
|
Object.defineProperty(exports, "ChatAnthropic", { enumerable: true, get: function () { return anthropic_1.ChatAnthropic; } });
|
|
39
|
+
// Export global configuration
|
|
40
|
+
var config_2 = require("./config");
|
|
41
|
+
Object.defineProperty(exports, "sdkConfig", { enumerable: true, get: function () { return config_2.sdkConfig; } });
|
|
42
|
+
Object.defineProperty(exports, "VersionCompatibilityError", { enumerable: true, get: function () { return config_2.VersionCompatibilityError; } });
|
|
37
43
|
/**
|
|
38
44
|
* Create a chat model instance based on model name
|
|
39
45
|
*/
|
package/dist/video_generation.js
CHANGED
|
@@ -24,6 +24,8 @@ class VideoGenerationClient {
|
|
|
24
24
|
* 创建视频生成任务
|
|
25
25
|
*/
|
|
26
26
|
async create(request) {
|
|
27
|
+
// 检查版本兼容性
|
|
28
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
27
29
|
const url = `${config_1.sdkConfig.getServerUrl()}/api/video-proxy/generate`;
|
|
28
30
|
(0, log_1.logRequest)("POST", url, this.headers, request);
|
|
29
31
|
const response = await fetch(url, {
|
|
@@ -45,6 +47,8 @@ class VideoGenerationClient {
|
|
|
45
47
|
* 查询视频生成任务状态
|
|
46
48
|
*/
|
|
47
49
|
async get(taskId) {
|
|
50
|
+
// 检查版本兼容性
|
|
51
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
48
52
|
const url = `${config_1.sdkConfig.getServerUrl()}/api/video-proxy/${taskId}`;
|
|
49
53
|
(0, log_1.logRequest)("GET", url, this.headers);
|
|
50
54
|
const response = await fetch(url, {
|
|
@@ -65,6 +69,8 @@ class VideoGenerationClient {
|
|
|
65
69
|
* 轮询视频生成任务直到完成
|
|
66
70
|
*/
|
|
67
71
|
async poll(taskId, options) {
|
|
72
|
+
// 检查版本兼容性
|
|
73
|
+
config_1.sdkConfig.ensureVersionCompatible();
|
|
68
74
|
const interval = options?.interval || 5000;
|
|
69
75
|
const timeout = options?.timeout || 300000;
|
|
70
76
|
const startTime = Date.now();
|
package/package.json
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-world-sdk",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "TypeScript SDK for AI World Platform - Chat Models, Image Generation, and Video Generation",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"
|
|
8
|
+
"update-version": "node scripts/update-version.js",
|
|
9
|
+
"build": "npm run update-version && rm -rf dist && tsc",
|
|
9
10
|
"prepublishOnly": "npm run build",
|
|
11
|
+
"publish": "npm run build && npm publish --access public",
|
|
10
12
|
"test": "jest",
|
|
11
13
|
"test:watch": "jest --watch",
|
|
12
14
|
"test:genimi-non-stream": "jest -t 'ChatGoogleGenerativeAI - 非流式调用'",
|