@lovrabet/sdk 1.1.12 → 1.1.13
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/LICENSE +58 -0
- package/README.md +312 -233
- package/dist/index.js +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,339 +1,418 @@
|
|
|
1
|
-
# Lovrabet
|
|
1
|
+
# Lovrabet SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
强大且灵活的 Lovrabet 数据平台 SDK,支持多种认证模式,适用于 Node.js 和浏览器环境。
|
|
4
4
|
|
|
5
|
-
## 特性
|
|
5
|
+
## ✨ 特性
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
- 📦 **TypeScript** -
|
|
11
|
-
-
|
|
7
|
+
- 🔐 **三种认证模式** - OpenAPI(服务端)、OpenAPI(浏览器)、WebAPI(Cookie)
|
|
8
|
+
- 🎯 **环境自适应** - 根据运行环境自动选择最佳认证方式
|
|
9
|
+
- 🔑 **Token 生成** - 内置 Token 生成器,支持批量生成
|
|
10
|
+
- 📦 **TypeScript** - 完整的类型定义和智能提示
|
|
11
|
+
- 🚀 **简洁 API** - 基于 `createClient()` 的现代化设计
|
|
12
|
+
- 🌍 **多环境支持** - 轻松切换生产、测试环境
|
|
12
13
|
- 🔄 **向后兼容** - 保持对旧版 API 的兼容
|
|
13
|
-
- ⚡ **动态实体** - 通过 Proxy 实现动态实体访问
|
|
14
14
|
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
### 安装
|
|
15
|
+
## 📦 安装
|
|
18
16
|
|
|
19
17
|
```bash
|
|
20
18
|
npm install @lovrabet/sdk
|
|
19
|
+
# 或
|
|
20
|
+
bun add @lovrabet/sdk
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
## 🚀 快速开始
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
### 服务端使用(Node.js)
|
|
26
26
|
|
|
27
27
|
```typescript
|
|
28
|
-
import {
|
|
28
|
+
import { createClient } from "@lovrabet/sdk";
|
|
29
29
|
|
|
30
|
-
//
|
|
31
|
-
|
|
30
|
+
// 使用 accessKey 认证(推荐)
|
|
31
|
+
const client = createClient({
|
|
32
32
|
appCode: "your-app-code",
|
|
33
|
+
accessKey: process.env.LOVRABET_ACCESS_KEY,
|
|
33
34
|
models: {
|
|
34
|
-
|
|
35
|
-
tableName: "
|
|
36
|
-
|
|
37
|
-
},
|
|
38
|
-
Projects: {
|
|
39
|
-
tableName: "projects",
|
|
40
|
-
datasetCode: "your-project-dataset-code",
|
|
35
|
+
users: {
|
|
36
|
+
tableName: "users",
|
|
37
|
+
datasetId: "your-dataset-id",
|
|
41
38
|
},
|
|
42
39
|
},
|
|
43
40
|
});
|
|
44
41
|
|
|
45
|
-
//
|
|
46
|
-
const
|
|
42
|
+
// CRUD 操作
|
|
43
|
+
const users = await client.models.users.getList();
|
|
44
|
+
const user = await client.models.users.getOne("user-id");
|
|
45
|
+
const newUser = await client.models.users.create({ name: "John" });
|
|
46
|
+
```
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
### 浏览器端使用
|
|
49
|
+
|
|
50
|
+
#### 方式 1:使用预生成 Token(推荐)
|
|
51
|
+
|
|
52
|
+
**服务端生成 Token:**
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// app/api/token/route.ts (Next.js)
|
|
56
|
+
import { generateOpenApiToken } from "@lovrabet/sdk";
|
|
57
|
+
|
|
58
|
+
export async function GET() {
|
|
59
|
+
const result = await generateOpenApiToken({
|
|
60
|
+
appCode: process.env.LOVRABET_APP_CODE!,
|
|
61
|
+
datasetCode: process.env.DATASET_ID!,
|
|
62
|
+
accessKey: process.env.LOVRABET_ACCESS_KEY!,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return Response.json(result);
|
|
66
|
+
}
|
|
53
67
|
```
|
|
54
68
|
|
|
55
|
-
|
|
69
|
+
**浏览器使用 Token:**
|
|
56
70
|
|
|
57
71
|
```typescript
|
|
58
72
|
import { createClient } from "@lovrabet/sdk";
|
|
59
73
|
|
|
74
|
+
// 获取 token
|
|
75
|
+
const { token, timestamp } = await fetch('/api/token').then(r => r.json());
|
|
76
|
+
|
|
60
77
|
// 创建客户端
|
|
61
78
|
const client = createClient({
|
|
62
79
|
appCode: "your-app-code",
|
|
63
|
-
|
|
64
|
-
|
|
80
|
+
token: token,
|
|
81
|
+
timestamp: timestamp,
|
|
65
82
|
models: {
|
|
66
|
-
|
|
67
|
-
tableName: "
|
|
68
|
-
|
|
83
|
+
users: {
|
|
84
|
+
tableName: "users",
|
|
85
|
+
datasetId: "your-dataset-id",
|
|
69
86
|
},
|
|
70
87
|
},
|
|
71
88
|
});
|
|
72
89
|
|
|
73
|
-
//
|
|
74
|
-
const
|
|
75
|
-
const newReq = await client.models.Requirements.create({
|
|
76
|
-
title: "New Requirement",
|
|
77
|
-
});
|
|
90
|
+
// 使用
|
|
91
|
+
const users = await client.models.users.getList();
|
|
78
92
|
```
|
|
79
93
|
|
|
80
|
-
|
|
94
|
+
#### 方式 2:使用 Cookie(已登录用户)
|
|
81
95
|
|
|
82
96
|
```typescript
|
|
83
|
-
import {
|
|
84
|
-
registerModels,
|
|
85
|
-
createClient,
|
|
86
|
-
CONFIG_NAMES,
|
|
87
|
-
ENVIRONMENTS,
|
|
88
|
-
} from "@lovrabet/sdk";
|
|
97
|
+
import { createClient } from "@lovrabet/sdk";
|
|
89
98
|
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
tableName: "requirements",
|
|
98
|
-
datasetCode: "prod-dataset-code",
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
},
|
|
102
|
-
CONFIG_NAMES.PROD
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
// 注册开发环境配置
|
|
106
|
-
registerModels(
|
|
107
|
-
{
|
|
108
|
-
appCode: "app-dev-123",
|
|
109
|
-
env: ENVIRONMENTS.DAILY,
|
|
110
|
-
models: {
|
|
111
|
-
Requirements: {
|
|
112
|
-
tableName: "requirements",
|
|
113
|
-
datasetCode: "dev-dataset-code",
|
|
114
|
-
},
|
|
99
|
+
// 不提供认证信息,自动使用 Cookie
|
|
100
|
+
const client = createClient({
|
|
101
|
+
appCode: "your-app-code",
|
|
102
|
+
models: {
|
|
103
|
+
users: {
|
|
104
|
+
tableName: "users",
|
|
105
|
+
datasetId: "your-dataset-id",
|
|
115
106
|
},
|
|
116
107
|
},
|
|
117
|
-
|
|
118
|
-
);
|
|
108
|
+
});
|
|
119
109
|
|
|
120
|
-
//
|
|
121
|
-
const
|
|
122
|
-
const devClient = createClient(CONFIG_NAMES.DEV);
|
|
110
|
+
// 请求会自动带上 Cookie
|
|
111
|
+
const users = await client.models.users.getList();
|
|
123
112
|
```
|
|
124
113
|
|
|
125
|
-
|
|
114
|
+
## 🔑 Token 管理
|
|
126
115
|
|
|
127
|
-
|
|
116
|
+
### 生成单个 Token
|
|
128
117
|
|
|
129
|
-
```
|
|
130
|
-
|
|
118
|
+
```typescript
|
|
119
|
+
import { generateOpenApiToken } from "@lovrabet/sdk";
|
|
131
120
|
|
|
132
|
-
const
|
|
121
|
+
const result = await generateOpenApiToken({
|
|
122
|
+
appCode: "your-app-code",
|
|
123
|
+
datasetCode: "your-dataset-id",
|
|
124
|
+
accessKey: process.env.LOVRABET_ACCESS_KEY!,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
console.log(result.token); // 生成的 token
|
|
128
|
+
console.log(result.timestamp); // 时间戳
|
|
129
|
+
console.log(result.expiresAt); // 过期时间
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 批量生成 Token
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
import { TokenGenerator } from "@lovrabet/sdk";
|
|
136
|
+
|
|
137
|
+
const generator = new TokenGenerator(process.env.LOVRABET_ACCESS_KEY!);
|
|
138
|
+
|
|
139
|
+
const tokens = await generator.generateBatch({
|
|
140
|
+
appCode: "your-app-code",
|
|
141
|
+
datasets: [
|
|
142
|
+
{ name: "users", code: "dataset-001" },
|
|
143
|
+
{ name: "posts", code: "dataset-002" },
|
|
144
|
+
],
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// 使用生成的 tokens
|
|
148
|
+
console.log(tokens.users.token);
|
|
149
|
+
console.log(tokens.posts.token);
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Token 有效期管理
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { isTokenExpiring, getTokenRemainingTime } from "@lovrabet/sdk";
|
|
156
|
+
|
|
157
|
+
// 检查 token 是否即将过期
|
|
158
|
+
if (isTokenExpiring(timestamp)) {
|
|
159
|
+
// 刷新 token
|
|
160
|
+
const newToken = await fetchNewToken();
|
|
161
|
+
client.setToken(newToken.token, newToken.timestamp);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// 获取剩余时间
|
|
165
|
+
const remaining = getTokenRemainingTime(timestamp);
|
|
166
|
+
console.log(`Token 剩余 ${remaining / 1000} 秒`);
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 🔧 高级用法
|
|
170
|
+
|
|
171
|
+
### 预注册配置
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { registerModels, createClient } from "@lovrabet/sdk";
|
|
175
|
+
|
|
176
|
+
// 注册配置
|
|
177
|
+
registerModels({
|
|
133
178
|
appCode: "your-app-code",
|
|
134
|
-
env: "online",
|
|
135
179
|
models: {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
datasetCode: "your-dataset-code",
|
|
139
|
-
},
|
|
180
|
+
users: { tableName: "users", datasetId: "ds-001" },
|
|
181
|
+
posts: { tableName: "posts", datasetId: "ds-002" },
|
|
140
182
|
},
|
|
141
|
-
};
|
|
183
|
+
});
|
|
142
184
|
|
|
143
|
-
//
|
|
144
|
-
|
|
185
|
+
// 创建客户端(无参数)
|
|
186
|
+
const client = createClient();
|
|
145
187
|
|
|
146
|
-
|
|
188
|
+
// 使用
|
|
189
|
+
const users = await client.models.users.getList();
|
|
147
190
|
```
|
|
148
191
|
|
|
149
|
-
|
|
192
|
+
### 多环境管理
|
|
150
193
|
|
|
151
194
|
```typescript
|
|
152
|
-
|
|
153
|
-
require("./lovrabet.config.js");
|
|
195
|
+
import { registerModels, createClient } from "@lovrabet/sdk";
|
|
154
196
|
|
|
197
|
+
// 注册不同环境的配置
|
|
198
|
+
registerModels({
|
|
199
|
+
appCode: "prod-app",
|
|
200
|
+
models: { /* ... */ },
|
|
201
|
+
}, "prod");
|
|
202
|
+
|
|
203
|
+
registerModels({
|
|
204
|
+
appCode: "dev-app",
|
|
205
|
+
models: { /* ... */ },
|
|
206
|
+
}, "dev");
|
|
207
|
+
|
|
208
|
+
// 创建不同环境的客户端
|
|
209
|
+
const prodClient = createClient("prod");
|
|
210
|
+
const devClient = createClient("dev");
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 动态更新 Token
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
155
216
|
// 创建客户端
|
|
156
|
-
const client = createClient(
|
|
217
|
+
const client = createClient({
|
|
218
|
+
appCode: "your-app-code",
|
|
219
|
+
models: { /* ... */ },
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// 后续更新 token
|
|
223
|
+
client.setToken(newToken, newTimestamp);
|
|
224
|
+
|
|
225
|
+
// 切换环境
|
|
226
|
+
client.switchEnv("daily");
|
|
157
227
|
```
|
|
158
228
|
|
|
159
|
-
## API 文档
|
|
229
|
+
## 📖 API 文档
|
|
160
230
|
|
|
161
|
-
###
|
|
231
|
+
### 主要导出
|
|
162
232
|
|
|
163
233
|
```typescript
|
|
164
|
-
import {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
//
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
};
|
|
234
|
+
import {
|
|
235
|
+
// 客户端
|
|
236
|
+
createClient,
|
|
237
|
+
|
|
238
|
+
// Token 生成
|
|
239
|
+
generateOpenApiToken,
|
|
240
|
+
TokenGenerator,
|
|
241
|
+
isTokenExpiring,
|
|
242
|
+
getTokenRemainingTime,
|
|
243
|
+
|
|
244
|
+
// 配置管理
|
|
245
|
+
registerModels,
|
|
246
|
+
getRegisteredModels,
|
|
247
|
+
getRegisteredConfigNames,
|
|
248
|
+
unregisterModels,
|
|
249
|
+
clearAllRegistrations,
|
|
250
|
+
|
|
251
|
+
// 环境配置
|
|
252
|
+
getApiEndpoint,
|
|
253
|
+
getAvailableEnvironments,
|
|
254
|
+
|
|
255
|
+
// 错误处理
|
|
256
|
+
LovrabetError,
|
|
257
|
+
|
|
258
|
+
// TypeScript 类型
|
|
259
|
+
type ClientConfig,
|
|
260
|
+
type TokenResult,
|
|
261
|
+
type ListResponse,
|
|
262
|
+
type ListParams,
|
|
263
|
+
} from "@lovrabet/sdk";
|
|
194
264
|
```
|
|
195
265
|
|
|
196
|
-
###
|
|
266
|
+
### 客户端配置
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
interface ClientConfig {
|
|
270
|
+
appCode?: string; // 应用代码
|
|
271
|
+
accessKey?: string; // OpenAPI 密钥(服务端)
|
|
272
|
+
secretKey?: string; // 密钥(可选)
|
|
273
|
+
token?: string; // 预生成 token(浏览器)
|
|
274
|
+
timestamp?: number; // token 时间戳
|
|
275
|
+
env?: 'online' | 'daily'; // 环境
|
|
276
|
+
models?: ModelsConfig; // 模型配置
|
|
277
|
+
}
|
|
278
|
+
```
|
|
197
279
|
|
|
198
|
-
|
|
280
|
+
### CRUD 操作
|
|
199
281
|
|
|
200
282
|
```typescript
|
|
201
283
|
// 查询列表
|
|
202
|
-
await client.models.
|
|
203
|
-
currentPage
|
|
204
|
-
pageSize
|
|
205
|
-
|
|
284
|
+
const response = await client.models.users.getList({
|
|
285
|
+
currentPage: 1,
|
|
286
|
+
pageSize: 20,
|
|
287
|
+
// 其他查询参数
|
|
206
288
|
});
|
|
207
289
|
|
|
208
|
-
//
|
|
209
|
-
await client.models.
|
|
290
|
+
// 获取单条记录
|
|
291
|
+
const user = await client.models.users.getOne("user-id");
|
|
210
292
|
|
|
211
293
|
// 创建
|
|
212
|
-
await client.models.
|
|
294
|
+
const newUser = await client.models.users.create({
|
|
295
|
+
name: "John Doe",
|
|
296
|
+
email: "john@example.com",
|
|
297
|
+
});
|
|
213
298
|
|
|
214
299
|
// 更新
|
|
215
|
-
await client.models.
|
|
300
|
+
const updated = await client.models.users.update("user-id", {
|
|
301
|
+
name: "Jane Doe",
|
|
302
|
+
});
|
|
216
303
|
|
|
217
304
|
// 删除
|
|
218
|
-
await client.models.
|
|
305
|
+
await client.models.users.delete("user-id");
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## 🛡️ 安全最佳实践
|
|
219
309
|
|
|
220
|
-
|
|
221
|
-
|
|
310
|
+
### ❌ 错误做法
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// 绝不要在客户端代码中硬编码 accessKey
|
|
314
|
+
const client = createClient({
|
|
315
|
+
accessKey: "sk_live_xxx", // 危险!会暴露密钥
|
|
316
|
+
});
|
|
222
317
|
```
|
|
223
318
|
|
|
224
|
-
###
|
|
319
|
+
### ✅ 正确做法
|
|
320
|
+
|
|
321
|
+
**服务端:**
|
|
225
322
|
|
|
226
323
|
```typescript
|
|
227
|
-
//
|
|
228
|
-
client
|
|
324
|
+
// 使用环境变量存储敏感信息
|
|
325
|
+
const client = createClient({
|
|
326
|
+
accessKey: process.env.LOVRABET_ACCESS_KEY,
|
|
327
|
+
});
|
|
328
|
+
```
|
|
229
329
|
|
|
230
|
-
|
|
231
|
-
client.getConfig(): ClientConfig;
|
|
330
|
+
**客户端:**
|
|
232
331
|
|
|
233
|
-
|
|
234
|
-
|
|
332
|
+
```typescript
|
|
333
|
+
// 使用服务端生成的 token
|
|
334
|
+
const { token } = await fetch('/api/token').then(r => r.json());
|
|
335
|
+
const client = createClient({ token });
|
|
336
|
+
```
|
|
235
337
|
|
|
236
|
-
|
|
237
|
-
client.setEnvironment(env: 'online' | 'daily');
|
|
338
|
+
## 🎯 选择正确的认证模式
|
|
238
339
|
|
|
239
|
-
|
|
240
|
-
|
|
340
|
+
| 环境 | 认证方式 | 使用场景 |
|
|
341
|
+
|------|---------|---------|
|
|
342
|
+
| **Node.js 服务端** | `accessKey` | SSR、API 路由、后端服务 |
|
|
343
|
+
| **浏览器(未登录)** | `token` | 公开数据访问、匿名用户 |
|
|
344
|
+
| **浏览器(已登录)** | Cookie | 已认证用户、私有数据 |
|
|
241
345
|
|
|
242
|
-
|
|
243
|
-
client.getAvailableModels(): string[];
|
|
346
|
+
## 📚 文档
|
|
244
347
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
348
|
+
- **[文档中心](./docs/README.md)** - 完整的文档导航
|
|
349
|
+
- **[OpenAPI 完整指南](./docs/openapi-guide.md)** - OpenAPI 实现原理和使用案例 ⭐
|
|
350
|
+
- [使用指南](./docs/usage-guide.md) - 详细的使用文档和示例
|
|
351
|
+
- [API 参考](./docs/api-reference.md) - 完整的 API 文档
|
|
352
|
+
- [架构分析](./docs/architecture-analysis.md) - SDK 内部架构说明
|
|
248
353
|
|
|
249
|
-
##
|
|
354
|
+
## 📝 What's New
|
|
250
355
|
|
|
251
|
-
|
|
252
|
-
import { createClient, LovrabetError } from "@lovrabet/sdk";
|
|
253
|
-
|
|
254
|
-
try {
|
|
255
|
-
const data = await client.models.Requirements.getList();
|
|
256
|
-
} catch (error) {
|
|
257
|
-
if (error instanceof LovrabetError) {
|
|
258
|
-
console.log("Status:", error.status);
|
|
259
|
-
console.log("Code:", error.code);
|
|
260
|
-
console.log("Message:", error.message);
|
|
261
|
-
console.log("Data:", error.data);
|
|
262
|
-
|
|
263
|
-
// 根据错误类型处理
|
|
264
|
-
if (error.status === 401) {
|
|
265
|
-
console.log("需要重新登录");
|
|
266
|
-
// 跳转到登录页
|
|
267
|
-
} else if (error.status === 403) {
|
|
268
|
-
console.log("权限不足");
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
356
|
+
### v1.1.11 (2025-10-09)
|
|
272
357
|
|
|
273
|
-
|
|
274
|
-
const client = createClient({
|
|
275
|
-
// ... 其他配置
|
|
276
|
-
options: {
|
|
277
|
-
onError: (error) => {
|
|
278
|
-
console.error("Lovrabet SDK Error:", error.message);
|
|
279
|
-
// 全局错误处理逻辑
|
|
280
|
-
},
|
|
281
|
-
onRedirectToLogin: () => {
|
|
282
|
-
console.log("跳转到登录页");
|
|
283
|
-
// window.location.href = '/login';
|
|
284
|
-
},
|
|
285
|
-
},
|
|
286
|
-
});
|
|
287
|
-
```
|
|
358
|
+
**新增功能 (New Features):**
|
|
288
359
|
|
|
289
|
-
|
|
360
|
+
- ✨ **后端 Token 生成器** - 新增 `generateOpenApiToken()` 函数,支持服务端生成 Token
|
|
361
|
+
```typescript
|
|
362
|
+
import { generateOpenApiToken } from "@lovrabet/sdk";
|
|
290
363
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
364
|
+
const { token, timestamp } = await generateOpenApiToken({
|
|
365
|
+
appCode: "your-app",
|
|
366
|
+
datasetCode: "ds-001",
|
|
367
|
+
accessKey: process.env.ACCESS_KEY,
|
|
368
|
+
});
|
|
369
|
+
```
|
|
294
370
|
|
|
295
|
-
|
|
371
|
+
---
|
|
296
372
|
|
|
297
|
-
###
|
|
373
|
+
### v1.1.8 (2025-09-30)
|
|
298
374
|
|
|
299
|
-
|
|
300
|
-
import {
|
|
301
|
-
ENVIRONMENTS, // 环境常量
|
|
302
|
-
CONFIG_NAMES, // 配置名称常量
|
|
303
|
-
DEFAULTS, // 默认值常量
|
|
304
|
-
} from "@lovrabet/sdk";
|
|
375
|
+
**新增功能 (New Features):**
|
|
305
376
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
377
|
+
- 🛡️ **浏览器安全警告** - 新增浏览器环境 accessKey 使用安全警告机制
|
|
378
|
+
- 在浏览器中使用 accessKey 会触发明确的错误提示
|
|
379
|
+
- 引导开发者使用正确的 Token 认证方式
|
|
309
380
|
|
|
310
|
-
|
|
311
|
-
CONFIG_NAMES.DEFAULT; // 'default'
|
|
312
|
-
CONFIG_NAMES.PROD; // 'prod'
|
|
313
|
-
CONFIG_NAMES.DEV; // 'dev'
|
|
381
|
+
**改进 (Improvements):**
|
|
314
382
|
|
|
315
|
-
|
|
316
|
-
DEFAULTS.TIMEOUT; // 10000
|
|
317
|
-
DEFAULTS.RETRY_COUNT; // 3
|
|
318
|
-
```
|
|
383
|
+
- 📚 **文档优化** - 修正浏览器安全警告中的文档链接地址
|
|
319
384
|
|
|
320
|
-
|
|
385
|
+
---
|
|
321
386
|
|
|
322
|
-
```typescript
|
|
323
|
-
import {
|
|
324
|
-
getRegisteredConfigNames, // 获取所有已注册的配置名称
|
|
325
|
-
getRegisteredModels, // 获取指定配置的模型信息
|
|
326
|
-
} from "@lovrabet/sdk";
|
|
327
387
|
|
|
328
|
-
|
|
329
|
-
const configNames = getRegisteredConfigNames();
|
|
330
|
-
console.log("已注册的配置:", configNames);
|
|
388
|
+
### v1.1.5 (2025-09-27)
|
|
331
389
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
390
|
+
**重大变更 (Breaking Changes):**
|
|
391
|
+
|
|
392
|
+
- 🔴 **统一认证架构** - 重构认证系统,实现 OpenAPI 双模式支持(AccessKey + Token)
|
|
393
|
+
|
|
394
|
+
**新增功能 (New Features):**
|
|
395
|
+
|
|
396
|
+
- ✨ **OpenAPI 双模式** - 支持服务端 AccessKey 和浏览器 Token 两种认证方式
|
|
397
|
+
- 🔑 **Token 管理工具** - 新增 Token 生命周期管理相关工具函数
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
## 🤝 反馈
|
|
403
|
+
|
|
404
|
+
如遇到问题或有功能建议,欢迎提交 Issue!
|
|
405
|
+
|
|
406
|
+
## 📄 许可证
|
|
407
|
+
|
|
408
|
+
**专有软件(Proprietary)** - 详见 [LICENSE](./LICENSE) 文件
|
|
336
409
|
|
|
337
|
-
|
|
410
|
+
本 SDK 为 Lovrabet 开放平台的专有组件:
|
|
411
|
+
- ✅ **允许使用** - 可以安装并在项目中集成本 SDK
|
|
412
|
+
- ✅ **应用分发** - 可以分发包含本 SDK 的应用程序
|
|
413
|
+
- ✅ **商业使用** - 可用于个人和商业项目
|
|
414
|
+
- ❌ **不得修改** - 不得修改、反编译或逆向工程
|
|
415
|
+
- ❌ **不得单独分发** - 不得单独复制或分发本 SDK
|
|
416
|
+
- ❌ **源代码不公开** - 本 SDK 为闭源软件
|
|
338
417
|
|
|
339
|
-
|
|
418
|
+
如需商业授权或有疑问,请访问 [lovrabet.com](https://www.lovrabet.com)
|