@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.
Files changed (49) hide show
  1. package/dist/cjs/index.d.ts +2 -0
  2. package/dist/cjs/index.d.ts.map +1 -1
  3. package/dist/cjs/index.js +23 -1
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/spi/adapters.d.ts +111 -0
  6. package/dist/cjs/spi/adapters.d.ts.map +1 -0
  7. package/dist/cjs/spi/adapters.js +285 -0
  8. package/dist/cjs/spi/adapters.js.map +1 -0
  9. package/dist/cjs/spi/examples/typeorm-example.d.ts +208 -0
  10. package/dist/cjs/spi/examples/typeorm-example.d.ts.map +1 -0
  11. package/dist/cjs/spi/examples/typeorm-example.js +274 -0
  12. package/dist/cjs/spi/examples/typeorm-example.js.map +1 -0
  13. package/dist/cjs/spi/index.d.ts +110 -0
  14. package/dist/cjs/spi/index.d.ts.map +1 -0
  15. package/dist/cjs/spi/index.js +143 -0
  16. package/dist/cjs/spi/index.js.map +1 -0
  17. package/dist/cjs/spi/storage.d.ts +109 -0
  18. package/dist/cjs/spi/storage.d.ts.map +1 -0
  19. package/dist/cjs/spi/storage.js +344 -0
  20. package/dist/cjs/spi/storage.js.map +1 -0
  21. package/dist/cjs/spi/types.d.ts +317 -0
  22. package/dist/cjs/spi/types.d.ts.map +1 -0
  23. package/dist/cjs/spi/types.js +6 -0
  24. package/dist/cjs/spi/types.js.map +1 -0
  25. package/dist/esm/index.d.ts +2 -0
  26. package/dist/esm/index.d.ts.map +1 -1
  27. package/dist/esm/index.js +8 -0
  28. package/dist/esm/index.js.map +1 -1
  29. package/dist/esm/spi/adapters.d.ts +111 -0
  30. package/dist/esm/spi/adapters.d.ts.map +1 -0
  31. package/dist/esm/spi/adapters.js +273 -0
  32. package/dist/esm/spi/adapters.js.map +1 -0
  33. package/dist/esm/spi/examples/typeorm-example.d.ts +208 -0
  34. package/dist/esm/spi/examples/typeorm-example.d.ts.map +1 -0
  35. package/dist/esm/spi/examples/typeorm-example.js +315 -0
  36. package/dist/esm/spi/examples/typeorm-example.js.map +1 -0
  37. package/dist/esm/spi/index.d.ts +110 -0
  38. package/dist/esm/spi/index.d.ts.map +1 -0
  39. package/dist/esm/spi/index.js +131 -0
  40. package/dist/esm/spi/index.js.map +1 -0
  41. package/dist/esm/spi/storage.d.ts +109 -0
  42. package/dist/esm/spi/storage.d.ts.map +1 -0
  43. package/dist/esm/spi/storage.js +301 -0
  44. package/dist/esm/spi/storage.js.map +1 -0
  45. package/dist/esm/spi/types.d.ts +317 -0
  46. package/dist/esm/spi/types.d.ts.map +1 -0
  47. package/dist/esm/spi/types.js +5 -0
  48. package/dist/esm/spi/types.js.map +1 -0
  49. 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":"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"}
@@ -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