@cicctencent/agent-server 0.1.1 → 0.1.2
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/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +23 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/spi/adapters.d.ts +111 -0
- package/dist/cjs/spi/adapters.d.ts.map +1 -0
- package/dist/cjs/spi/adapters.js +285 -0
- package/dist/cjs/spi/adapters.js.map +1 -0
- package/dist/cjs/spi/examples/typeorm-example.d.ts +208 -0
- package/dist/cjs/spi/examples/typeorm-example.d.ts.map +1 -0
- package/dist/cjs/spi/examples/typeorm-example.js +274 -0
- package/dist/cjs/spi/examples/typeorm-example.js.map +1 -0
- package/dist/cjs/spi/index.d.ts +110 -0
- package/dist/cjs/spi/index.d.ts.map +1 -0
- package/dist/cjs/spi/index.js +143 -0
- package/dist/cjs/spi/index.js.map +1 -0
- package/dist/cjs/spi/storage.d.ts +109 -0
- package/dist/cjs/spi/storage.d.ts.map +1 -0
- package/dist/cjs/spi/storage.js +344 -0
- package/dist/cjs/spi/storage.js.map +1 -0
- package/dist/cjs/spi/types.d.ts +317 -0
- package/dist/cjs/spi/types.d.ts.map +1 -0
- package/dist/cjs/spi/types.js +6 -0
- package/dist/cjs/spi/types.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/spi/adapters.d.ts +111 -0
- package/dist/esm/spi/adapters.d.ts.map +1 -0
- package/dist/esm/spi/adapters.js +273 -0
- package/dist/esm/spi/adapters.js.map +1 -0
- package/dist/esm/spi/examples/typeorm-example.d.ts +208 -0
- package/dist/esm/spi/examples/typeorm-example.d.ts.map +1 -0
- package/dist/esm/spi/examples/typeorm-example.js +315 -0
- package/dist/esm/spi/examples/typeorm-example.js.map +1 -0
- package/dist/esm/spi/index.d.ts +110 -0
- package/dist/esm/spi/index.d.ts.map +1 -0
- package/dist/esm/spi/index.js +131 -0
- package/dist/esm/spi/index.js.map +1 -0
- package/dist/esm/spi/storage.d.ts +109 -0
- package/dist/esm/spi/storage.d.ts.map +1 -0
- package/dist/esm/spi/storage.js +301 -0
- package/dist/esm/spi/storage.js.map +1 -0
- package/dist/esm/spi/types.d.ts +317 -0
- package/dist/esm/spi/types.d.ts.map +1 -0
- package/dist/esm/spi/types.js +5 -0
- package/dist/esm/spi/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// TypeORM SPI 实现示例 — BI 项目可参考此实现
|
|
3
|
+
// ============================================================
|
|
4
|
+
// ============================================================
|
|
5
|
+
// TypeORM 存储适配器实现
|
|
6
|
+
// ============================================================
|
|
7
|
+
/**
|
|
8
|
+
* TypeORM 列表存储适配器
|
|
9
|
+
* 将 TypeORM Repository 包装为 ListStorageAdapter
|
|
10
|
+
*/
|
|
11
|
+
class TypeORMListStorage {
|
|
12
|
+
// 在实际项目中,这里会是 TypeORM Repository
|
|
13
|
+
// constructor(private repository: Repository<T>) {}
|
|
14
|
+
// 模拟 TypeORM Repository(示例)
|
|
15
|
+
data = [];
|
|
16
|
+
async list() {
|
|
17
|
+
// 实际实现: return this.repository.find();
|
|
18
|
+
return this.data;
|
|
19
|
+
}
|
|
20
|
+
async findById(id) {
|
|
21
|
+
// 实际实现: return this.repository.findOne({ where: { id } });
|
|
22
|
+
return this.data.find(item => item.id === id) ?? null;
|
|
23
|
+
}
|
|
24
|
+
async add(entity) {
|
|
25
|
+
// 实际实现: return this.repository.save(entity);
|
|
26
|
+
this.data.push(entity);
|
|
27
|
+
return entity;
|
|
28
|
+
}
|
|
29
|
+
async update(id, data) {
|
|
30
|
+
// 实际实现:
|
|
31
|
+
// const entity = await this.repository.findOne({ where: { id } });
|
|
32
|
+
// if (!entity) return null;
|
|
33
|
+
// Object.assign(entity, data);
|
|
34
|
+
// return this.repository.save(entity);
|
|
35
|
+
const idx = this.data.findIndex(item => item.id === id);
|
|
36
|
+
if (idx === -1)
|
|
37
|
+
return null;
|
|
38
|
+
this.data[idx] = { ...this.data[idx], ...data };
|
|
39
|
+
return this.data[idx];
|
|
40
|
+
}
|
|
41
|
+
async remove(id) {
|
|
42
|
+
// 实际实现:
|
|
43
|
+
// const result = await this.repository.delete(id);
|
|
44
|
+
// return result.affected > 0;
|
|
45
|
+
const idx = this.data.findIndex(item => item.id === id);
|
|
46
|
+
if (idx === -1)
|
|
47
|
+
return false;
|
|
48
|
+
this.data.splice(idx, 1);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ============================================================
|
|
53
|
+
// TypeORM ChatStoreProvider 实现
|
|
54
|
+
// ============================================================
|
|
55
|
+
/**
|
|
56
|
+
* BI 项目的 ChatStoreProvider 实现
|
|
57
|
+
* 使用 TypeORM Repository 作为底层存储
|
|
58
|
+
*/
|
|
59
|
+
class TypeORMChatStoreProvider {
|
|
60
|
+
// 在实际项目中,这里会是 TypeORM Repository
|
|
61
|
+
threadStorage;
|
|
62
|
+
messageStorages = new Map();
|
|
63
|
+
constructor(
|
|
64
|
+
// threadRepository: Repository<BIThreadEntity>,
|
|
65
|
+
// messageRepository: Repository<BIMessageEntity>
|
|
66
|
+
) {
|
|
67
|
+
this.threadStorage = new TypeORMListStorage();
|
|
68
|
+
}
|
|
69
|
+
getMessageStorage(threadId) {
|
|
70
|
+
if (!this.messageStorages.has(threadId)) {
|
|
71
|
+
this.messageStorages.set(threadId, new TypeORMListStorage());
|
|
72
|
+
}
|
|
73
|
+
return this.messageStorages.get(threadId);
|
|
74
|
+
}
|
|
75
|
+
// ===== Thread CRUD =====
|
|
76
|
+
// 注意:TypeORM 实现使用异步方法
|
|
77
|
+
async getThreads(workspaceId) {
|
|
78
|
+
// 实际 TypeORM 实现:
|
|
79
|
+
// if (workspaceId) {
|
|
80
|
+
// return this.threadRepository.find({ where: { workspaceId } });
|
|
81
|
+
// }
|
|
82
|
+
// return this.threadRepository.find();
|
|
83
|
+
const all = await this.threadStorage.list();
|
|
84
|
+
return all;
|
|
85
|
+
}
|
|
86
|
+
async getThread(id) {
|
|
87
|
+
// 实际 TypeORM 实现:
|
|
88
|
+
// return this.threadRepository.findOne({ where: { id } });
|
|
89
|
+
const result = await this.threadStorage.findById(id);
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
async createThread(data) {
|
|
93
|
+
// 实际 TypeORM 实现:
|
|
94
|
+
// const thread = this.threadRepository.create(data);
|
|
95
|
+
// return this.threadRepository.save(thread);
|
|
96
|
+
const now = new Date();
|
|
97
|
+
const thread = {
|
|
98
|
+
id: Date.now(),
|
|
99
|
+
title: data.title || '新对话',
|
|
100
|
+
workspaceId: data.workspaceId,
|
|
101
|
+
userId: data.userId,
|
|
102
|
+
status: 'active',
|
|
103
|
+
createdAt: now,
|
|
104
|
+
updatedAt: now,
|
|
105
|
+
};
|
|
106
|
+
await this.threadStorage.add(thread);
|
|
107
|
+
return thread;
|
|
108
|
+
}
|
|
109
|
+
async updateThread(id, data) {
|
|
110
|
+
// 实际 TypeORM 实现:
|
|
111
|
+
// const thread = await this.threadRepository.findOne({ where: { id } });
|
|
112
|
+
// if (!thread) return null;
|
|
113
|
+
// Object.assign(thread, data, { updatedAt: new Date() });
|
|
114
|
+
// return this.threadRepository.save(thread);
|
|
115
|
+
const result = await this.threadStorage.update(id, { ...data, updatedAt: new Date() });
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
async deleteThread(id) {
|
|
119
|
+
// 实际 TypeORM 实现:
|
|
120
|
+
// const result = await this.threadRepository.delete(id);
|
|
121
|
+
// return result.affected > 0;
|
|
122
|
+
return this.threadStorage.remove(id);
|
|
123
|
+
}
|
|
124
|
+
// ===== Message CRUD =====
|
|
125
|
+
async getMessages(threadId, options) {
|
|
126
|
+
// 实际 TypeORM 实现:
|
|
127
|
+
// const [items, total] = await this.messageRepository.findAndCount({
|
|
128
|
+
// where: { threadId },
|
|
129
|
+
// order: { createdAt: 'DESC' },
|
|
130
|
+
// skip: options?.offset || 0,
|
|
131
|
+
// take: options?.limit || 50,
|
|
132
|
+
// });
|
|
133
|
+
// return { items, total, hasMore: (options?.offset || 0) + items.length < total };
|
|
134
|
+
const storage = this.getMessageStorage(Number(threadId));
|
|
135
|
+
const all = await storage.list();
|
|
136
|
+
const limit = options?.limit || 50;
|
|
137
|
+
const offset = options?.offset || 0;
|
|
138
|
+
const items = all.slice(offset, offset + limit);
|
|
139
|
+
return { items, total: all.length, hasMore: offset + items.length < all.length };
|
|
140
|
+
}
|
|
141
|
+
async addMessage(data) {
|
|
142
|
+
// 实际 TypeORM 实现:
|
|
143
|
+
// const msg = this.messageRepository.create({
|
|
144
|
+
// threadId: data.threadId,
|
|
145
|
+
// role: data.role,
|
|
146
|
+
// content: data.content,
|
|
147
|
+
// createdAt: new Date(),
|
|
148
|
+
// });
|
|
149
|
+
// return this.messageRepository.save(msg);
|
|
150
|
+
const storage = this.getMessageStorage(Number(data.threadId));
|
|
151
|
+
const msg = {
|
|
152
|
+
id: Date.now(),
|
|
153
|
+
threadId: Number(data.threadId),
|
|
154
|
+
role: data.role,
|
|
155
|
+
content: data.content,
|
|
156
|
+
createdAt: new Date(),
|
|
157
|
+
};
|
|
158
|
+
await storage.add(msg);
|
|
159
|
+
return msg;
|
|
160
|
+
}
|
|
161
|
+
async updateMessage(threadId, id, data) {
|
|
162
|
+
// 实际 TypeORM 实现:
|
|
163
|
+
// const msg = await this.messageRepository.findOne({ where: { id, threadId } });
|
|
164
|
+
// if (!msg) return null;
|
|
165
|
+
// Object.assign(msg, data);
|
|
166
|
+
// return this.messageRepository.save(msg);
|
|
167
|
+
const storage = this.getMessageStorage(Number(threadId));
|
|
168
|
+
const result = await storage.update(id, data);
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
async deleteMessage(threadId, id) {
|
|
172
|
+
// 实际 TypeORM 实现:
|
|
173
|
+
// const result = await this.messageRepository.delete({ id, threadId });
|
|
174
|
+
// return result.affected > 0;
|
|
175
|
+
const storage = this.getMessageStorage(Number(threadId));
|
|
176
|
+
return storage.remove(id);
|
|
177
|
+
}
|
|
178
|
+
async clearThreadMessages(threadId) {
|
|
179
|
+
// 实际 TypeORM 实现:
|
|
180
|
+
// await this.messageRepository.delete({ threadId });
|
|
181
|
+
this.messageStorages.delete(Number(threadId));
|
|
182
|
+
}
|
|
183
|
+
// ===== 历史重建 =====
|
|
184
|
+
async buildThreadHistory(threadId, limit) {
|
|
185
|
+
const { items } = await this.getMessages(threadId, { limit: limit || 20 });
|
|
186
|
+
return items.map(msg => ({
|
|
187
|
+
role: msg.role,
|
|
188
|
+
content: msg.content,
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// ============================================================
|
|
193
|
+
// MidwayJS 服务实现示例
|
|
194
|
+
// ============================================================
|
|
195
|
+
/**
|
|
196
|
+
* MidwayJS Agent 服务示例
|
|
197
|
+
* 使用 SPI 适配到 MidwayJS + TypeORM
|
|
198
|
+
*
|
|
199
|
+
* 在实际项目中,这会是:
|
|
200
|
+
*
|
|
201
|
+
* @Provide()
|
|
202
|
+
* @Scope(ScopeEnum.Singleton)
|
|
203
|
+
* export class AgentService {
|
|
204
|
+
* @Inject()
|
|
205
|
+
* threadRepository: Repository<BIThreadEntity>;
|
|
206
|
+
*
|
|
207
|
+
* @Inject()
|
|
208
|
+
* messageRepository: Repository<BIMessageEntity>;
|
|
209
|
+
*
|
|
210
|
+
* private server: AgentServer;
|
|
211
|
+
*
|
|
212
|
+
* @Init()
|
|
213
|
+
* async init() {
|
|
214
|
+
* const chatStoreProvider = new TypeORMChatStoreProvider(
|
|
215
|
+
* this.threadRepository,
|
|
216
|
+
* this.messageRepository
|
|
217
|
+
* );
|
|
218
|
+
*
|
|
219
|
+
* this.server = createAgentServer({
|
|
220
|
+
* llmProvider: await this.createLLMProvider(),
|
|
221
|
+
* chatStoreProvider,
|
|
222
|
+
* // 使用 Koa 适配器
|
|
223
|
+
* createSSEResponseAdapter: (ctx) => new KoaSSEAdapter(ctx),
|
|
224
|
+
* });
|
|
225
|
+
* }
|
|
226
|
+
*
|
|
227
|
+
* @Get('/chat/stream')
|
|
228
|
+
* async chatStream(@Ctx() ctx: Context, @Query() query: { message: string }) {
|
|
229
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
230
|
+
* await this.server.runAgentStream(adapter, { content: query.message });
|
|
231
|
+
* }
|
|
232
|
+
* }
|
|
233
|
+
*/
|
|
234
|
+
// ============================================================
|
|
235
|
+
// 导出示例实现
|
|
236
|
+
// ============================================================
|
|
237
|
+
export { TypeORMListStorage, TypeORMChatStoreProvider, };
|
|
238
|
+
/**
|
|
239
|
+
* ## 使用说明
|
|
240
|
+
*
|
|
241
|
+
* ### 1. 在 MidwayJS 项目中使用 agent-server
|
|
242
|
+
*
|
|
243
|
+
* ```typescript
|
|
244
|
+
* // src/service/agent.service.ts
|
|
245
|
+
* import { Provide, Scope, ScopeEnum, Inject, Init, Get, Ctx, Query } from '@midwayjs/core';
|
|
246
|
+
* import { Context } from '@midwayjs/koa';
|
|
247
|
+
* import { createAgentServer, KoaSSEAdapter, type AgentServer } from '@cicctencent/agent-server';
|
|
248
|
+
* import { TypeORMChatStoreProvider } from './spi/typeorm-chat-provider';
|
|
249
|
+
*
|
|
250
|
+
* @Provide()
|
|
251
|
+
* @Scope(ScopeEnum.Singleton)
|
|
252
|
+
* export class AgentService {
|
|
253
|
+
* @Inject()
|
|
254
|
+
* threadRepository: Repository<ThreadEntity>;
|
|
255
|
+
*
|
|
256
|
+
* @Inject()
|
|
257
|
+
* messageRepository: Repository<MessageEntity>;
|
|
258
|
+
*
|
|
259
|
+
* private server: AgentServer;
|
|
260
|
+
*
|
|
261
|
+
* @Init()
|
|
262
|
+
* async init() {
|
|
263
|
+
* // 使用 TypeORM 存储适配器
|
|
264
|
+
* const chatStoreProvider = new TypeORMChatStoreProvider(
|
|
265
|
+
* this.threadRepository,
|
|
266
|
+
* this.messageRepository
|
|
267
|
+
* );
|
|
268
|
+
*
|
|
269
|
+
* this.server = createAgentServer({
|
|
270
|
+
* llmProvider: await this.createLLMProvider(),
|
|
271
|
+
* chatStoreProvider, // 替换默认 JSON 文件存储
|
|
272
|
+
* });
|
|
273
|
+
* }
|
|
274
|
+
*
|
|
275
|
+
* @Get('/chat/stream')
|
|
276
|
+
* async chatStream(@Ctx() ctx: Context, @Query() query: { message: string }) {
|
|
277
|
+
* // 使用 Koa/MidwayJS SSE 适配器
|
|
278
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
279
|
+
* await this.server.runAgentStream(adapter, { content: query.message });
|
|
280
|
+
* }
|
|
281
|
+
* }
|
|
282
|
+
* ```
|
|
283
|
+
*
|
|
284
|
+
* ### 2. 自定义实体字段
|
|
285
|
+
*
|
|
286
|
+
* agent-server 现在支持泛型实体类型,你可以:
|
|
287
|
+
* - 使用自己的实体结构(如 TypeORM 实体)
|
|
288
|
+
* - 自定义字段(如 userId, modelConfig 等)
|
|
289
|
+
* - 使用不同的 ID 类型(number / string / UUID)
|
|
290
|
+
*
|
|
291
|
+
* ### 3. 组件级使用(不依赖工厂)
|
|
292
|
+
*
|
|
293
|
+
* 如果不想使用 createAgentServer 工厂,可以只导入需要的组件:
|
|
294
|
+
*
|
|
295
|
+
* ```typescript
|
|
296
|
+
* import {
|
|
297
|
+
* MemoryService,
|
|
298
|
+
* writeSSE,
|
|
299
|
+
* createBuiltinTools,
|
|
300
|
+
* KoaSSEAdapter
|
|
301
|
+
* } from '@cicctencent/agent-server';
|
|
302
|
+
*
|
|
303
|
+
* // 只使用需要的组件
|
|
304
|
+
* const memoryService = new MemoryService('./data');
|
|
305
|
+
* const tools = createBuiltinTools();
|
|
306
|
+
*
|
|
307
|
+
* // 在 MidwayJS 中使用 SSE
|
|
308
|
+
* @Get('/stream')
|
|
309
|
+
* async stream(@Ctx() ctx: Context) {
|
|
310
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
311
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
312
|
+
* }
|
|
313
|
+
* ```
|
|
314
|
+
*/
|
|
315
|
+
//# sourceMappingURL=typeorm-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm-example.js","sourceRoot":"","sources":["../../../../src/spi/examples/typeorm-example.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,iCAAiC;AACjC,+DAA+D;AAoE/D,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D;;;GAGG;AACH,MAAM,kBAAkB;IACtB,iCAAiC;IACjC,oDAAoD;IAEpD,4BAA4B;IACpB,IAAI,GAAQ,EAAE,CAAC;IAEvB,KAAK,CAAC,IAAI;QACR,uCAAuC;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAmB;QAChC,2DAA2D;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAS;QACjB,6CAA6C;QAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAmB,EAAE,IAAgB;QAChD,SAAS;QACT,mEAAmE;QACnE,4BAA4B;QAC5B,+BAA+B;QAC/B,uCAAuC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAO,CAAC;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAmB;QAC9B,SAAS;QACT,mDAAmD;QACnD,8BAA8B;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,+DAA+D;AAC/D,+BAA+B;AAC/B,+DAA+D;AAE/D;;;GAGG;AACH,MAAM,wBAAwB;IAC5B,iCAAiC;IACzB,aAAa,CAAqC;IAClD,eAAe,GAAqD,IAAI,GAAG,EAAE,CAAC;IAEtF;IACE,gDAAgD;IAChD,iDAAiD;;QAEjD,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,EAAkB,CAAC;IAChE,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,kBAAkB,EAAmB,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IAC7C,CAAC;IAED,0BAA0B;IAC1B,sBAAsB;IAEtB,KAAK,CAAC,UAAU,CAAC,WAA6B;QAC5C,iBAAiB;QACjB,qBAAqB;QACrB,mEAAmE;QACnE,IAAI;QACJ,uCAAuC;QACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,GAAuB,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAmB;QACjC,kBAAkB;QAClB,2DAA2D;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,MAAoC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAA6B;QAC9C,iBAAiB;QACjB,qDAAqD;QACrD,6CAA6C;QAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAmB;YAC7B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;YAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAmB,EAAE,IAA6B;QACnE,iBAAiB;QACjB,yEAAyE;QACzE,4BAA4B;QAC5B,0DAA0D;QAC1D,6CAA6C;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACvF,OAAO,MAAoC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAmB;QACpC,iBAAiB;QACjB,yDAAyD;QACzD,8BAA8B;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,2BAA2B;IAE3B,KAAK,CAAC,WAAW,CAAC,QAAyB,EAAE,OAA6C;QAKxF,iBAAiB;QACjB,qEAAqE;QACrE,yBAAyB;QACzB,kCAAkC;QAClC,gCAAgC;QAChC,gCAAgC;QAChC,MAAM;QACN,mFAAmF;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAsB,CAAC;QACrE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAA6F;QAC5G,iBAAiB;QACjB,8CAA8C;QAC9C,6BAA6B;QAC7B,qBAAqB;QACrB,2BAA2B;QAC3B,2BAA2B;QAC3B,MAAM;QACN,2CAA2C;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAoB;YAC3B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAuC;YAClD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAyB,EAAE,EAAmB,EAAE,IAA8B;QAChG,iBAAiB;QACjB,iFAAiF;QACjF,yBAAyB;QACzB,4BAA4B;QAC5B,2CAA2C;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,MAAqC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAyB,EAAE,EAAmB;QAChE,iBAAiB;QACjB,wEAAwE;QACxE,8BAA8B;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,QAAyB;QACjD,iBAAiB;QACjB,qDAAqD;QACrD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,mBAAmB;IAEnB,KAAK,CAAC,kBAAkB,CAAC,QAAyB,EAAE,KAAc;QAChE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CAAC;IACN,CAAC;CACF;AAED,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,+DAA+D;AAC/D,SAAS;AACT,+DAA+D;AAE/D,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAIzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export type { BaseThreadEntity, BaseMessageEntity, BaseWorkspaceEntity, BaseAgentProfileEntity, BaseSettingsEntity, KVStorageAdapter, ListStorageAdapter, QueryOptions, SettingsProvider, ChatStoreProvider, AgentProfileProvider, PromptBuilderProvider, ModelConfigResolver, SSEResponseAdapter, RequestContextAdapter, AgentServerSPIOptions, ThreadEntity, MessageEntity, WorkspaceEntity, AgentProfileEntity, SettingsEntity, } from './types.js';
|
|
2
|
+
export { JsonFileKVStorage, JsonFileListStorage, InMemoryKVStorage, InMemoryListStorage, DatabaseListStorage, createJsonFileStorage, createInMemoryStorage, } from './storage.js';
|
|
3
|
+
export { ExpressSSEAdapter, KoaSSEAdapter, FastifySSEAdapter, NativeHttpSSEAdapter, adaptSSE, ExpressRequestAdapter, KoaRequestAdapter, adaptRequest, CustomSSEAdapter, } from './adapters.js';
|
|
4
|
+
/**
|
|
5
|
+
* ## SPI 使用示例
|
|
6
|
+
*
|
|
7
|
+
* ### 1. 使用默认 JSON 文件存储
|
|
8
|
+
*
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { createAgentServer } from '@cicctencent/agent-server';
|
|
11
|
+
*
|
|
12
|
+
* const server = createAgentServer({
|
|
13
|
+
* llmProvider: myProvider,
|
|
14
|
+
* dataDir: './data', // 使用默认 JSON 文件存储
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* ### 2. 自定义存储(数据库)
|
|
19
|
+
*
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { createAgentServer, DatabaseListStorage, type ChatStoreProvider } from '@cicctencent/agent-server';
|
|
22
|
+
*
|
|
23
|
+
* // 实现数据库存储
|
|
24
|
+
* class TypeORMThreadStorage extends DatabaseListStorage<ThreadEntity> {
|
|
25
|
+
* constructor(private repository: Repository<ThreadEntity>) {
|
|
26
|
+
* super();
|
|
27
|
+
* }
|
|
28
|
+
* async list() { return this.repository.find(); }
|
|
29
|
+
* async findById(id) { return this.repository.findOne({ where: { id } }); }
|
|
30
|
+
* async add(entity) { return this.repository.save(entity); }
|
|
31
|
+
* // ...
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // 实现 ChatStoreProvider
|
|
35
|
+
* class TypeORMChatStoreProvider implements ChatStoreProvider {
|
|
36
|
+
* constructor(private threadRepo: Repository<ThreadEntity>, private msgRepo: Repository<MessageEntity>) {}
|
|
37
|
+
* getThreads() { return this.threadRepo.find(); }
|
|
38
|
+
* // ...
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* const server = createAgentServer({
|
|
42
|
+
* llmProvider: myProvider,
|
|
43
|
+
* chatStoreProvider: new TypeORMChatStoreProvider(threadRepo, msgRepo),
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* ### 3. 自定义框架适配(MidwayJS)
|
|
48
|
+
*
|
|
49
|
+
* ```typescript
|
|
50
|
+
* import { createAgentServer, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
51
|
+
*
|
|
52
|
+
* @Provide()
|
|
53
|
+
* @Scope(ScopeEnum.Singleton)
|
|
54
|
+
* export class AgentService {
|
|
55
|
+
* private server: AgentServer;
|
|
56
|
+
*
|
|
57
|
+
* @Init()
|
|
58
|
+
* async init() {
|
|
59
|
+
* this.server = createAgentServer({
|
|
60
|
+
* llmProvider: await this.createProvider(),
|
|
61
|
+
* // 使用 Koa 适配器
|
|
62
|
+
* createSSEResponseAdapter: (ctx) => new KoaSSEAdapter(ctx),
|
|
63
|
+
* });
|
|
64
|
+
* }
|
|
65
|
+
*
|
|
66
|
+
* @Get('/chat/stream')
|
|
67
|
+
* async chatStream(@Ctx() ctx: Context) {
|
|
68
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
69
|
+
* await this.server.runAgentStream(adapter, { content: ctx.query.message });
|
|
70
|
+
* }
|
|
71
|
+
* }
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
74
|
+
* ### 4. 自定义 Prompt 构建
|
|
75
|
+
*
|
|
76
|
+
* ```typescript
|
|
77
|
+
* import { createAgentServer, type PromptBuilderProvider } from '@cicctencent/agent-server';
|
|
78
|
+
*
|
|
79
|
+
* class CustomPromptBuilder implements PromptBuilderProvider {
|
|
80
|
+
* buildDefaultPrompt(profile, tools, memory) {
|
|
81
|
+
* // 自定义 Prompt 构建逻辑
|
|
82
|
+
* return `你是一个专业的 BI 分析助手...\n${memory || ''}`;
|
|
83
|
+
* }
|
|
84
|
+
* // ...
|
|
85
|
+
* }
|
|
86
|
+
*
|
|
87
|
+
* const server = createAgentServer({
|
|
88
|
+
* llmProvider: myProvider,
|
|
89
|
+
* promptBuilder: new CustomPromptBuilder(),
|
|
90
|
+
* });
|
|
91
|
+
* ```
|
|
92
|
+
*
|
|
93
|
+
* ### 5. 组件级使用(不使用工厂)
|
|
94
|
+
*
|
|
95
|
+
* ```typescript
|
|
96
|
+
* import { MemoryService, writeSSE, createBuiltinTools, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
97
|
+
*
|
|
98
|
+
* // 只使用需要的组件,不依赖 createAgentServer
|
|
99
|
+
* const memoryService = new MemoryService('./data');
|
|
100
|
+
* const tools = createBuiltinTools();
|
|
101
|
+
*
|
|
102
|
+
* // 在 MidwayJS 中使用 SSE
|
|
103
|
+
* @Get('/stream')
|
|
104
|
+
* async stream(@Ctx() ctx: Context) {
|
|
105
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
106
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
107
|
+
* }
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spi/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAEV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAElB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EAEZ,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EAEnB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EAErB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAEL,iBAAiB,EACjB,mBAAmB,EAEnB,iBAAiB,EACjB,mBAAmB,EAEnB,mBAAmB,EAEnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,EAER,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EAEZ,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAMvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// SPI 模块导出
|
|
3
|
+
// ============================================================
|
|
4
|
+
// ---- 存储适配器 ----
|
|
5
|
+
export {
|
|
6
|
+
// JSON 文件存储
|
|
7
|
+
JsonFileKVStorage, JsonFileListStorage,
|
|
8
|
+
// 内存存储
|
|
9
|
+
InMemoryKVStorage, InMemoryListStorage,
|
|
10
|
+
// 数据库存储基类
|
|
11
|
+
DatabaseListStorage,
|
|
12
|
+
// 工厂函数
|
|
13
|
+
createJsonFileStorage, createInMemoryStorage, } from "./storage.js";
|
|
14
|
+
// ---- 框架适配器 ----
|
|
15
|
+
export {
|
|
16
|
+
// SSE 适配器
|
|
17
|
+
ExpressSSEAdapter, KoaSSEAdapter, FastifySSEAdapter, NativeHttpSSEAdapter, adaptSSE,
|
|
18
|
+
// 请求适配器
|
|
19
|
+
ExpressRequestAdapter, KoaRequestAdapter, adaptRequest,
|
|
20
|
+
// 自定义适配器示例
|
|
21
|
+
CustomSSEAdapter, } from "./adapters.js";
|
|
22
|
+
// ============================================================
|
|
23
|
+
// SPI 使用指南
|
|
24
|
+
// ============================================================
|
|
25
|
+
/**
|
|
26
|
+
* ## SPI 使用示例
|
|
27
|
+
*
|
|
28
|
+
* ### 1. 使用默认 JSON 文件存储
|
|
29
|
+
*
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { createAgentServer } from '@cicctencent/agent-server';
|
|
32
|
+
*
|
|
33
|
+
* const server = createAgentServer({
|
|
34
|
+
* llmProvider: myProvider,
|
|
35
|
+
* dataDir: './data', // 使用默认 JSON 文件存储
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* ### 2. 自定义存储(数据库)
|
|
40
|
+
*
|
|
41
|
+
* ```typescript
|
|
42
|
+
* import { createAgentServer, DatabaseListStorage, type ChatStoreProvider } from '@cicctencent/agent-server';
|
|
43
|
+
*
|
|
44
|
+
* // 实现数据库存储
|
|
45
|
+
* class TypeORMThreadStorage extends DatabaseListStorage<ThreadEntity> {
|
|
46
|
+
* constructor(private repository: Repository<ThreadEntity>) {
|
|
47
|
+
* super();
|
|
48
|
+
* }
|
|
49
|
+
* async list() { return this.repository.find(); }
|
|
50
|
+
* async findById(id) { return this.repository.findOne({ where: { id } }); }
|
|
51
|
+
* async add(entity) { return this.repository.save(entity); }
|
|
52
|
+
* // ...
|
|
53
|
+
* }
|
|
54
|
+
*
|
|
55
|
+
* // 实现 ChatStoreProvider
|
|
56
|
+
* class TypeORMChatStoreProvider implements ChatStoreProvider {
|
|
57
|
+
* constructor(private threadRepo: Repository<ThreadEntity>, private msgRepo: Repository<MessageEntity>) {}
|
|
58
|
+
* getThreads() { return this.threadRepo.find(); }
|
|
59
|
+
* // ...
|
|
60
|
+
* }
|
|
61
|
+
*
|
|
62
|
+
* const server = createAgentServer({
|
|
63
|
+
* llmProvider: myProvider,
|
|
64
|
+
* chatStoreProvider: new TypeORMChatStoreProvider(threadRepo, msgRepo),
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* ### 3. 自定义框架适配(MidwayJS)
|
|
69
|
+
*
|
|
70
|
+
* ```typescript
|
|
71
|
+
* import { createAgentServer, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
72
|
+
*
|
|
73
|
+
* @Provide()
|
|
74
|
+
* @Scope(ScopeEnum.Singleton)
|
|
75
|
+
* export class AgentService {
|
|
76
|
+
* private server: AgentServer;
|
|
77
|
+
*
|
|
78
|
+
* @Init()
|
|
79
|
+
* async init() {
|
|
80
|
+
* this.server = createAgentServer({
|
|
81
|
+
* llmProvider: await this.createProvider(),
|
|
82
|
+
* // 使用 Koa 适配器
|
|
83
|
+
* createSSEResponseAdapter: (ctx) => new KoaSSEAdapter(ctx),
|
|
84
|
+
* });
|
|
85
|
+
* }
|
|
86
|
+
*
|
|
87
|
+
* @Get('/chat/stream')
|
|
88
|
+
* async chatStream(@Ctx() ctx: Context) {
|
|
89
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
90
|
+
* await this.server.runAgentStream(adapter, { content: ctx.query.message });
|
|
91
|
+
* }
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* ### 4. 自定义 Prompt 构建
|
|
96
|
+
*
|
|
97
|
+
* ```typescript
|
|
98
|
+
* import { createAgentServer, type PromptBuilderProvider } from '@cicctencent/agent-server';
|
|
99
|
+
*
|
|
100
|
+
* class CustomPromptBuilder implements PromptBuilderProvider {
|
|
101
|
+
* buildDefaultPrompt(profile, tools, memory) {
|
|
102
|
+
* // 自定义 Prompt 构建逻辑
|
|
103
|
+
* return `你是一个专业的 BI 分析助手...\n${memory || ''}`;
|
|
104
|
+
* }
|
|
105
|
+
* // ...
|
|
106
|
+
* }
|
|
107
|
+
*
|
|
108
|
+
* const server = createAgentServer({
|
|
109
|
+
* llmProvider: myProvider,
|
|
110
|
+
* promptBuilder: new CustomPromptBuilder(),
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* ### 5. 组件级使用(不使用工厂)
|
|
115
|
+
*
|
|
116
|
+
* ```typescript
|
|
117
|
+
* import { MemoryService, writeSSE, createBuiltinTools, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
118
|
+
*
|
|
119
|
+
* // 只使用需要的组件,不依赖 createAgentServer
|
|
120
|
+
* const memoryService = new MemoryService('./data');
|
|
121
|
+
* const tools = createBuiltinTools();
|
|
122
|
+
*
|
|
123
|
+
* // 在 MidwayJS 中使用 SSE
|
|
124
|
+
* @Get('/stream')
|
|
125
|
+
* async stream(@Ctx() ctx: Context) {
|
|
126
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
127
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
128
|
+
* }
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/spi/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,WAAW;AACX,+DAA+D;AAgC/D,kBAAkB;AAClB,OAAO;AACL,YAAY;AACZ,iBAAiB,EACjB,mBAAmB;AACnB,OAAO;AACP,iBAAiB,EACjB,mBAAmB;AACnB,UAAU;AACV,mBAAmB;AACnB,OAAO;AACP,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,kBAAkB;AAClB,OAAO;AACL,UAAU;AACV,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ;AACR,QAAQ;AACR,qBAAqB,EACrB,iBAAiB,EACjB,YAAY;AACZ,WAAW;AACX,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,+DAA+D;AAC/D,WAAW;AACX,+DAA+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { KVStorageAdapter, ListStorageAdapter, QueryOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* JSON 文件键值存储
|
|
4
|
+
* 适用于小型应用、本地开发
|
|
5
|
+
*/
|
|
6
|
+
export declare class JsonFileKVStorage implements KVStorageAdapter {
|
|
7
|
+
private filePath;
|
|
8
|
+
private cache;
|
|
9
|
+
constructor(filePath: string);
|
|
10
|
+
private load;
|
|
11
|
+
private save;
|
|
12
|
+
get<T>(key: string): Promise<T | null>;
|
|
13
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
14
|
+
delete(key: string): Promise<void>;
|
|
15
|
+
exists(key: string): Promise<boolean>;
|
|
16
|
+
keys(prefix?: string): Promise<string[]>;
|
|
17
|
+
/** 清除缓存(用于重新加载) */
|
|
18
|
+
clearCache(): void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* JSON 文件列表存储
|
|
22
|
+
* 支持实体 CRUD 操作
|
|
23
|
+
*/
|
|
24
|
+
export declare class JsonFileListStorage<T extends {
|
|
25
|
+
id: number | string;
|
|
26
|
+
}> implements ListStorageAdapter<T> {
|
|
27
|
+
private filePath;
|
|
28
|
+
private data;
|
|
29
|
+
constructor(filePath: string);
|
|
30
|
+
private load;
|
|
31
|
+
private save;
|
|
32
|
+
list(): Promise<T[]>;
|
|
33
|
+
findById(id: number | string): Promise<T | null>;
|
|
34
|
+
add(entity: T): Promise<T>;
|
|
35
|
+
update(id: number | string, data: Partial<T>): Promise<T | null>;
|
|
36
|
+
remove(id: number | string): Promise<boolean>;
|
|
37
|
+
batch(operations: Array<{
|
|
38
|
+
type: 'add' | 'update' | 'delete';
|
|
39
|
+
data: T | Partial<T>;
|
|
40
|
+
id?: number | string;
|
|
41
|
+
}>): Promise<void>;
|
|
42
|
+
/** 获取最大 ID */
|
|
43
|
+
maxId(): number;
|
|
44
|
+
/** 清除缓存 */
|
|
45
|
+
clearCache(): void;
|
|
46
|
+
/** 获取文件路径 */
|
|
47
|
+
getPath(): string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 内存键值存储
|
|
51
|
+
* 适用于测试、临时数据
|
|
52
|
+
*/
|
|
53
|
+
export declare class InMemoryKVStorage implements KVStorageAdapter {
|
|
54
|
+
private data;
|
|
55
|
+
get<T>(key: string): Promise<T | null>;
|
|
56
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
57
|
+
delete(key: string): Promise<void>;
|
|
58
|
+
exists(key: string): Promise<boolean>;
|
|
59
|
+
keys(prefix?: string): Promise<string[]>;
|
|
60
|
+
/** 清空所有数据 */
|
|
61
|
+
clear(): void;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 内存列表存储
|
|
65
|
+
*/
|
|
66
|
+
export declare class InMemoryListStorage<T extends {
|
|
67
|
+
id: number | string;
|
|
68
|
+
}> implements ListStorageAdapter<T> {
|
|
69
|
+
private data;
|
|
70
|
+
list(): Promise<T[]>;
|
|
71
|
+
findById(id: number | string): Promise<T | null>;
|
|
72
|
+
add(entity: T): Promise<T>;
|
|
73
|
+
update(id: number | string, data: Partial<T>): Promise<T | null>;
|
|
74
|
+
remove(id: number | string): Promise<boolean>;
|
|
75
|
+
/** 清空所有数据 */
|
|
76
|
+
clear(): void;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 数据库存储基类
|
|
80
|
+
* 应用层继承并实现具体的数据库操作(TypeORM / Prisma / Sequelize 等)
|
|
81
|
+
*/
|
|
82
|
+
export declare abstract class DatabaseListStorage<T extends {
|
|
83
|
+
id: number | string;
|
|
84
|
+
}> implements ListStorageAdapter<T> {
|
|
85
|
+
abstract list(): Promise<T[]>;
|
|
86
|
+
abstract findById(id: number | string): Promise<T | null>;
|
|
87
|
+
abstract add(entity: T): Promise<T>;
|
|
88
|
+
abstract update(id: number | string, data: Partial<T>): Promise<T | null>;
|
|
89
|
+
abstract remove(id: number | string): Promise<boolean>;
|
|
90
|
+
/** 扩展:带查询条件的列表 */
|
|
91
|
+
query(options: QueryOptions): Promise<{
|
|
92
|
+
items: T[];
|
|
93
|
+
total: number;
|
|
94
|
+
hasMore: boolean;
|
|
95
|
+
}>;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 创建 JSON 文件存储
|
|
99
|
+
*/
|
|
100
|
+
export declare function createJsonFileStorage(filePath: string, type: 'kv' | 'list'): KVStorageAdapter | ListStorageAdapter<{
|
|
101
|
+
id: number | string;
|
|
102
|
+
}>;
|
|
103
|
+
/**
|
|
104
|
+
* 创建内存存储
|
|
105
|
+
*/
|
|
106
|
+
export declare function createInMemoryStorage(type: 'kv' | 'list'): KVStorageAdapter | ListStorageAdapter<{
|
|
107
|
+
id: number | string;
|
|
108
|
+
}>;
|
|
109
|
+
//# sourceMappingURL=storage.d.ts.map
|