@cicctencent/agent-server 0.1.1 → 0.2.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 +93 -16
- package/dist/cjs/agent/agent-server.d.ts.map +1 -1
- package/dist/cjs/agent/agent-server.js +50 -15
- package/dist/cjs/agent/agent-server.js.map +1 -1
- 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/service/cache.service.d.ts +69 -0
- package/dist/cjs/service/cache.service.d.ts.map +1 -0
- package/dist/cjs/service/cache.service.js +243 -0
- package/dist/cjs/service/cache.service.js.map +1 -0
- package/dist/cjs/service/engine-pool.d.ts +15 -2
- package/dist/cjs/service/engine-pool.d.ts.map +1 -1
- package/dist/cjs/service/engine-pool.js +15 -4
- package/dist/cjs/service/engine-pool.js.map +1 -1
- package/dist/cjs/spi/adapters.d.ts +163 -0
- package/dist/cjs/spi/adapters.d.ts.map +1 -0
- package/dist/cjs/spi/adapters.js +341 -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 +194 -0
- package/dist/cjs/spi/index.d.ts.map +1 -0
- package/dist/cjs/spi/index.js +227 -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/cjs/types.d.ts +63 -8
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/agent/agent-server.d.ts.map +1 -1
- package/dist/esm/agent/agent-server.js +50 -15
- package/dist/esm/agent/agent-server.js.map +1 -1
- 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/service/cache.service.d.ts +69 -0
- package/dist/esm/service/cache.service.d.ts.map +1 -0
- package/dist/esm/service/cache.service.js +237 -0
- package/dist/esm/service/cache.service.js.map +1 -0
- package/dist/esm/service/engine-pool.d.ts +15 -2
- package/dist/esm/service/engine-pool.d.ts.map +1 -1
- package/dist/esm/service/engine-pool.js +15 -4
- package/dist/esm/service/engine-pool.js.map +1 -1
- package/dist/esm/spi/adapters.d.ts +163 -0
- package/dist/esm/spi/adapters.d.ts.map +1 -0
- package/dist/esm/spi/adapters.js +329 -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 +194 -0
- package/dist/esm/spi/index.d.ts.map +1 -0
- package/dist/esm/spi/index.js +215 -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/dist/esm/types.d.ts +63 -8
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* # agent-server SPI (Service Provider Interface)
|
|
3
|
+
*
|
|
4
|
+
* ## 核心设计原则
|
|
5
|
+
*
|
|
6
|
+
* 1. **接口优先**:agent-server 核心只定义能力接口,不依赖具体实现
|
|
7
|
+
* 2. **参考实现可选**:提供常见框架的参考实现,业务层可选择使用或自己实现
|
|
8
|
+
* 3. **业务层自主**:完全控制实现细节,不受 agent-server 限制
|
|
9
|
+
*
|
|
10
|
+
* ## 使用方式
|
|
11
|
+
*
|
|
12
|
+
* ### 方式 1:直接使用参考实现(最简单)
|
|
13
|
+
*
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { KoaSSEAdapter, createAgentServer } from '@cicctencent/agent-server';
|
|
16
|
+
*
|
|
17
|
+
* const server = createAgentServer({ llmProvider: myProvider });
|
|
18
|
+
*
|
|
19
|
+
* // MidwayJS/Koa 项目
|
|
20
|
+
* @Get('/chat/stream')
|
|
21
|
+
* async chatStream(@Ctx() ctx: Context) {
|
|
22
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
23
|
+
* await server.runAgentStream(adapter, { content: 'Hello' });
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* ### 方式 2:实现 SPI 接口(自定义存储)
|
|
28
|
+
*
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import {
|
|
31
|
+
* createAgentServer,
|
|
32
|
+
* type ChatStoreProvider,
|
|
33
|
+
* type BaseThreadEntity,
|
|
34
|
+
* type BaseMessageEntity,
|
|
35
|
+
* } from '@cicctencent/agent-server';
|
|
36
|
+
*
|
|
37
|
+
* // 定义你的实体类型(可以自定义字段)
|
|
38
|
+
* interface MyThread extends BaseThreadEntity {
|
|
39
|
+
* userId: string;
|
|
40
|
+
* applicationId: number;
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* // 实现 ChatStoreProvider 接口
|
|
44
|
+
* class MyChatStore implements ChatStoreProvider<MyThread, MyMessage> {
|
|
45
|
+
* async getThreads(userId?: string): Promise<MyThread[]> {
|
|
46
|
+
* // 使用任意存储技术:TypeORM / Prisma / Mongoose / ...
|
|
47
|
+
* return this.database.query('SELECT * FROM threads WHERE userId = ?', [userId]);
|
|
48
|
+
* }
|
|
49
|
+
*
|
|
50
|
+
* // ... 实现其他方法
|
|
51
|
+
* }
|
|
52
|
+
*
|
|
53
|
+
* // 注入自定义实现
|
|
54
|
+
* const server = createAgentServer({
|
|
55
|
+
* llmProvider: myProvider,
|
|
56
|
+
* chatStoreProvider: new MyChatStore(),
|
|
57
|
+
* });
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* ### 方式 3:只使用组件(不使用工厂)
|
|
61
|
+
*
|
|
62
|
+
* ```typescript
|
|
63
|
+
* import {
|
|
64
|
+
* KoaSSEAdapter,
|
|
65
|
+
* writeSSE,
|
|
66
|
+
* createBuiltinTools,
|
|
67
|
+
* MemoryService,
|
|
68
|
+
* } from '@cicctencent/agent-server';
|
|
69
|
+
*
|
|
70
|
+
* // 只使用需要的组件,不依赖 createAgentServer
|
|
71
|
+
* const tools = createBuiltinTools();
|
|
72
|
+
* const memoryService = new MemoryService('./data');
|
|
73
|
+
*
|
|
74
|
+
* @Get('/stream')
|
|
75
|
+
* async stream(@Ctx() ctx: Context) {
|
|
76
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
77
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* ## 完整文档
|
|
82
|
+
*
|
|
83
|
+
* 详见 [README.md](./README.md)
|
|
84
|
+
*/
|
|
85
|
+
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';
|
|
86
|
+
export { JsonFileKVStorage, JsonFileListStorage, InMemoryKVStorage, InMemoryListStorage, DatabaseListStorage, createJsonFileStorage, createInMemoryStorage, } from './storage.js';
|
|
87
|
+
export { ExpressSSEAdapter, KoaSSEAdapter, FastifySSEAdapter, NativeHttpSSEAdapter, adaptSSE, ExpressRequestAdapter, KoaRequestAdapter, adaptRequest, CustomSSEAdapter, } from './adapters.js';
|
|
88
|
+
/**
|
|
89
|
+
* ## SPI 使用示例
|
|
90
|
+
*
|
|
91
|
+
* ### 1. 使用默认 JSON 文件存储
|
|
92
|
+
*
|
|
93
|
+
* ```typescript
|
|
94
|
+
* import { createAgentServer } from '@cicctencent/agent-server';
|
|
95
|
+
*
|
|
96
|
+
* const server = createAgentServer({
|
|
97
|
+
* llmProvider: myProvider,
|
|
98
|
+
* dataDir: './data', // 使用默认 JSON 文件存储
|
|
99
|
+
* });
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* ### 2. 自定义存储(数据库)
|
|
103
|
+
*
|
|
104
|
+
* ```typescript
|
|
105
|
+
* import { createAgentServer, DatabaseListStorage, type ChatStoreProvider } from '@cicctencent/agent-server';
|
|
106
|
+
*
|
|
107
|
+
* // 实现数据库存储
|
|
108
|
+
* class TypeORMThreadStorage extends DatabaseListStorage<ThreadEntity> {
|
|
109
|
+
* constructor(private repository: Repository<ThreadEntity>) {
|
|
110
|
+
* super();
|
|
111
|
+
* }
|
|
112
|
+
* async list() { return this.repository.find(); }
|
|
113
|
+
* async findById(id) { return this.repository.findOne({ where: { id } }); }
|
|
114
|
+
* async add(entity) { return this.repository.save(entity); }
|
|
115
|
+
* // ...
|
|
116
|
+
* }
|
|
117
|
+
*
|
|
118
|
+
* // 实现 ChatStoreProvider
|
|
119
|
+
* class TypeORMChatStoreProvider implements ChatStoreProvider {
|
|
120
|
+
* constructor(private threadRepo: Repository<ThreadEntity>, private msgRepo: Repository<MessageEntity>) {}
|
|
121
|
+
* getThreads() { return this.threadRepo.find(); }
|
|
122
|
+
* // ...
|
|
123
|
+
* }
|
|
124
|
+
*
|
|
125
|
+
* const server = createAgentServer({
|
|
126
|
+
* llmProvider: myProvider,
|
|
127
|
+
* chatStoreProvider: new TypeORMChatStoreProvider(threadRepo, msgRepo),
|
|
128
|
+
* });
|
|
129
|
+
* ```
|
|
130
|
+
*
|
|
131
|
+
* ### 3. 自定义框架适配(MidwayJS)
|
|
132
|
+
*
|
|
133
|
+
* ```typescript
|
|
134
|
+
* import { createAgentServer, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
135
|
+
*
|
|
136
|
+
* @Provide()
|
|
137
|
+
* @Scope(ScopeEnum.Singleton)
|
|
138
|
+
* export class AgentService {
|
|
139
|
+
* private server: AgentServer;
|
|
140
|
+
*
|
|
141
|
+
* @Init()
|
|
142
|
+
* async init() {
|
|
143
|
+
* this.server = createAgentServer({
|
|
144
|
+
* llmProvider: await this.createProvider(),
|
|
145
|
+
* // 使用 Koa 适配器
|
|
146
|
+
* createSSEResponseAdapter: (ctx) => new KoaSSEAdapter(ctx),
|
|
147
|
+
* });
|
|
148
|
+
* }
|
|
149
|
+
*
|
|
150
|
+
* @Get('/chat/stream')
|
|
151
|
+
* async chatStream(@Ctx() ctx: Context) {
|
|
152
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
153
|
+
* await this.server.runAgentStream(adapter, { content: ctx.query.message });
|
|
154
|
+
* }
|
|
155
|
+
* }
|
|
156
|
+
* ```
|
|
157
|
+
*
|
|
158
|
+
* ### 4. 自定义 Prompt 构建
|
|
159
|
+
*
|
|
160
|
+
* ```typescript
|
|
161
|
+
* import { createAgentServer, type PromptBuilderProvider } from '@cicctencent/agent-server';
|
|
162
|
+
*
|
|
163
|
+
* class CustomPromptBuilder implements PromptBuilderProvider {
|
|
164
|
+
* buildDefaultPrompt(profile, tools, memory) {
|
|
165
|
+
* // 自定义 Prompt 构建逻辑
|
|
166
|
+
* return `你是一个专业的 BI 分析助手...\n${memory || ''}`;
|
|
167
|
+
* }
|
|
168
|
+
* // ...
|
|
169
|
+
* }
|
|
170
|
+
*
|
|
171
|
+
* const server = createAgentServer({
|
|
172
|
+
* llmProvider: myProvider,
|
|
173
|
+
* promptBuilder: new CustomPromptBuilder(),
|
|
174
|
+
* });
|
|
175
|
+
* ```
|
|
176
|
+
*
|
|
177
|
+
* ### 5. 组件级使用(不使用工厂)
|
|
178
|
+
*
|
|
179
|
+
* ```typescript
|
|
180
|
+
* import { MemoryService, writeSSE, createBuiltinTools, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
181
|
+
*
|
|
182
|
+
* // 只使用需要的组件,不依赖 createAgentServer
|
|
183
|
+
* const memoryService = new MemoryService('./data');
|
|
184
|
+
* const tools = createBuiltinTools();
|
|
185
|
+
*
|
|
186
|
+
* // 在 MidwayJS 中使用 SSE
|
|
187
|
+
* @Get('/stream')
|
|
188
|
+
* async stream(@Ctx() ctx: Context) {
|
|
189
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
190
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
191
|
+
* }
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spi/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AAGH,YAAY,EAEV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAGlB,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EAGZ,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EAGnB,kBAAkB,EAClB,qBAAqB,EAGrB,qBAAqB,EAGrB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAEL,iBAAiB,EACjB,mBAAmB,EAGnB,iBAAiB,EACjB,mBAAmB,EAGnB,mBAAmB,EAGnB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,EAGR,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EAGZ,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAMvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// SPI 模块导出
|
|
3
|
+
// ============================================================
|
|
4
|
+
/**
|
|
5
|
+
* # agent-server SPI (Service Provider Interface)
|
|
6
|
+
*
|
|
7
|
+
* ## 核心设计原则
|
|
8
|
+
*
|
|
9
|
+
* 1. **接口优先**:agent-server 核心只定义能力接口,不依赖具体实现
|
|
10
|
+
* 2. **参考实现可选**:提供常见框架的参考实现,业务层可选择使用或自己实现
|
|
11
|
+
* 3. **业务层自主**:完全控制实现细节,不受 agent-server 限制
|
|
12
|
+
*
|
|
13
|
+
* ## 使用方式
|
|
14
|
+
*
|
|
15
|
+
* ### 方式 1:直接使用参考实现(最简单)
|
|
16
|
+
*
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { KoaSSEAdapter, createAgentServer } from '@cicctencent/agent-server';
|
|
19
|
+
*
|
|
20
|
+
* const server = createAgentServer({ llmProvider: myProvider });
|
|
21
|
+
*
|
|
22
|
+
* // MidwayJS/Koa 项目
|
|
23
|
+
* @Get('/chat/stream')
|
|
24
|
+
* async chatStream(@Ctx() ctx: Context) {
|
|
25
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
26
|
+
* await server.runAgentStream(adapter, { content: 'Hello' });
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* ### 方式 2:实现 SPI 接口(自定义存储)
|
|
31
|
+
*
|
|
32
|
+
* ```typescript
|
|
33
|
+
* import {
|
|
34
|
+
* createAgentServer,
|
|
35
|
+
* type ChatStoreProvider,
|
|
36
|
+
* type BaseThreadEntity,
|
|
37
|
+
* type BaseMessageEntity,
|
|
38
|
+
* } from '@cicctencent/agent-server';
|
|
39
|
+
*
|
|
40
|
+
* // 定义你的实体类型(可以自定义字段)
|
|
41
|
+
* interface MyThread extends BaseThreadEntity {
|
|
42
|
+
* userId: string;
|
|
43
|
+
* applicationId: number;
|
|
44
|
+
* }
|
|
45
|
+
*
|
|
46
|
+
* // 实现 ChatStoreProvider 接口
|
|
47
|
+
* class MyChatStore implements ChatStoreProvider<MyThread, MyMessage> {
|
|
48
|
+
* async getThreads(userId?: string): Promise<MyThread[]> {
|
|
49
|
+
* // 使用任意存储技术:TypeORM / Prisma / Mongoose / ...
|
|
50
|
+
* return this.database.query('SELECT * FROM threads WHERE userId = ?', [userId]);
|
|
51
|
+
* }
|
|
52
|
+
*
|
|
53
|
+
* // ... 实现其他方法
|
|
54
|
+
* }
|
|
55
|
+
*
|
|
56
|
+
* // 注入自定义实现
|
|
57
|
+
* const server = createAgentServer({
|
|
58
|
+
* llmProvider: myProvider,
|
|
59
|
+
* chatStoreProvider: new MyChatStore(),
|
|
60
|
+
* });
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* ### 方式 3:只使用组件(不使用工厂)
|
|
64
|
+
*
|
|
65
|
+
* ```typescript
|
|
66
|
+
* import {
|
|
67
|
+
* KoaSSEAdapter,
|
|
68
|
+
* writeSSE,
|
|
69
|
+
* createBuiltinTools,
|
|
70
|
+
* MemoryService,
|
|
71
|
+
* } from '@cicctencent/agent-server';
|
|
72
|
+
*
|
|
73
|
+
* // 只使用需要的组件,不依赖 createAgentServer
|
|
74
|
+
* const tools = createBuiltinTools();
|
|
75
|
+
* const memoryService = new MemoryService('./data');
|
|
76
|
+
*
|
|
77
|
+
* @Get('/stream')
|
|
78
|
+
* async stream(@Ctx() ctx: Context) {
|
|
79
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
80
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* ## 完整文档
|
|
85
|
+
*
|
|
86
|
+
* 详见 [README.md](./README.md)
|
|
87
|
+
*/
|
|
88
|
+
// ---- 存储适配器(参考实现) ----
|
|
89
|
+
export {
|
|
90
|
+
// JSON 文件存储(默认实现)
|
|
91
|
+
JsonFileKVStorage, JsonFileListStorage,
|
|
92
|
+
// 内存存储(测试用)
|
|
93
|
+
InMemoryKVStorage, InMemoryListStorage,
|
|
94
|
+
// 数据库存储基类(业务层继承)
|
|
95
|
+
DatabaseListStorage,
|
|
96
|
+
// 工厂函数
|
|
97
|
+
createJsonFileStorage, createInMemoryStorage, } from "./storage.js";
|
|
98
|
+
// ---- 框架适配器(参考实现) ----
|
|
99
|
+
export {
|
|
100
|
+
// SSE 适配器
|
|
101
|
+
ExpressSSEAdapter, KoaSSEAdapter, FastifySSEAdapter, NativeHttpSSEAdapter, adaptSSE,
|
|
102
|
+
// 请求适配器
|
|
103
|
+
ExpressRequestAdapter, KoaRequestAdapter, adaptRequest,
|
|
104
|
+
// 自定义适配器基类
|
|
105
|
+
CustomSSEAdapter, } from "./adapters.js";
|
|
106
|
+
// ============================================================
|
|
107
|
+
// SPI 使用指南
|
|
108
|
+
// ============================================================
|
|
109
|
+
/**
|
|
110
|
+
* ## SPI 使用示例
|
|
111
|
+
*
|
|
112
|
+
* ### 1. 使用默认 JSON 文件存储
|
|
113
|
+
*
|
|
114
|
+
* ```typescript
|
|
115
|
+
* import { createAgentServer } from '@cicctencent/agent-server';
|
|
116
|
+
*
|
|
117
|
+
* const server = createAgentServer({
|
|
118
|
+
* llmProvider: myProvider,
|
|
119
|
+
* dataDir: './data', // 使用默认 JSON 文件存储
|
|
120
|
+
* });
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* ### 2. 自定义存储(数据库)
|
|
124
|
+
*
|
|
125
|
+
* ```typescript
|
|
126
|
+
* import { createAgentServer, DatabaseListStorage, type ChatStoreProvider } from '@cicctencent/agent-server';
|
|
127
|
+
*
|
|
128
|
+
* // 实现数据库存储
|
|
129
|
+
* class TypeORMThreadStorage extends DatabaseListStorage<ThreadEntity> {
|
|
130
|
+
* constructor(private repository: Repository<ThreadEntity>) {
|
|
131
|
+
* super();
|
|
132
|
+
* }
|
|
133
|
+
* async list() { return this.repository.find(); }
|
|
134
|
+
* async findById(id) { return this.repository.findOne({ where: { id } }); }
|
|
135
|
+
* async add(entity) { return this.repository.save(entity); }
|
|
136
|
+
* // ...
|
|
137
|
+
* }
|
|
138
|
+
*
|
|
139
|
+
* // 实现 ChatStoreProvider
|
|
140
|
+
* class TypeORMChatStoreProvider implements ChatStoreProvider {
|
|
141
|
+
* constructor(private threadRepo: Repository<ThreadEntity>, private msgRepo: Repository<MessageEntity>) {}
|
|
142
|
+
* getThreads() { return this.threadRepo.find(); }
|
|
143
|
+
* // ...
|
|
144
|
+
* }
|
|
145
|
+
*
|
|
146
|
+
* const server = createAgentServer({
|
|
147
|
+
* llmProvider: myProvider,
|
|
148
|
+
* chatStoreProvider: new TypeORMChatStoreProvider(threadRepo, msgRepo),
|
|
149
|
+
* });
|
|
150
|
+
* ```
|
|
151
|
+
*
|
|
152
|
+
* ### 3. 自定义框架适配(MidwayJS)
|
|
153
|
+
*
|
|
154
|
+
* ```typescript
|
|
155
|
+
* import { createAgentServer, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
156
|
+
*
|
|
157
|
+
* @Provide()
|
|
158
|
+
* @Scope(ScopeEnum.Singleton)
|
|
159
|
+
* export class AgentService {
|
|
160
|
+
* private server: AgentServer;
|
|
161
|
+
*
|
|
162
|
+
* @Init()
|
|
163
|
+
* async init() {
|
|
164
|
+
* this.server = createAgentServer({
|
|
165
|
+
* llmProvider: await this.createProvider(),
|
|
166
|
+
* // 使用 Koa 适配器
|
|
167
|
+
* createSSEResponseAdapter: (ctx) => new KoaSSEAdapter(ctx),
|
|
168
|
+
* });
|
|
169
|
+
* }
|
|
170
|
+
*
|
|
171
|
+
* @Get('/chat/stream')
|
|
172
|
+
* async chatStream(@Ctx() ctx: Context) {
|
|
173
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
174
|
+
* await this.server.runAgentStream(adapter, { content: ctx.query.message });
|
|
175
|
+
* }
|
|
176
|
+
* }
|
|
177
|
+
* ```
|
|
178
|
+
*
|
|
179
|
+
* ### 4. 自定义 Prompt 构建
|
|
180
|
+
*
|
|
181
|
+
* ```typescript
|
|
182
|
+
* import { createAgentServer, type PromptBuilderProvider } from '@cicctencent/agent-server';
|
|
183
|
+
*
|
|
184
|
+
* class CustomPromptBuilder implements PromptBuilderProvider {
|
|
185
|
+
* buildDefaultPrompt(profile, tools, memory) {
|
|
186
|
+
* // 自定义 Prompt 构建逻辑
|
|
187
|
+
* return `你是一个专业的 BI 分析助手...\n${memory || ''}`;
|
|
188
|
+
* }
|
|
189
|
+
* // ...
|
|
190
|
+
* }
|
|
191
|
+
*
|
|
192
|
+
* const server = createAgentServer({
|
|
193
|
+
* llmProvider: myProvider,
|
|
194
|
+
* promptBuilder: new CustomPromptBuilder(),
|
|
195
|
+
* });
|
|
196
|
+
* ```
|
|
197
|
+
*
|
|
198
|
+
* ### 5. 组件级使用(不使用工厂)
|
|
199
|
+
*
|
|
200
|
+
* ```typescript
|
|
201
|
+
* import { MemoryService, writeSSE, createBuiltinTools, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
202
|
+
*
|
|
203
|
+
* // 只使用需要的组件,不依赖 createAgentServer
|
|
204
|
+
* const memoryService = new MemoryService('./data');
|
|
205
|
+
* const tools = createBuiltinTools();
|
|
206
|
+
*
|
|
207
|
+
* // 在 MidwayJS 中使用 SSE
|
|
208
|
+
* @Get('/stream')
|
|
209
|
+
* async stream(@Ctx() ctx: Context) {
|
|
210
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
211
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
212
|
+
* }
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
215
|
+
//# 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;AAC/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AAsCH,wBAAwB;AACxB,OAAO;AACL,kBAAkB;AAClB,iBAAiB,EACjB,mBAAmB;AAEnB,YAAY;AACZ,iBAAiB,EACjB,mBAAmB;AAEnB,iBAAiB;AACjB,mBAAmB;AAEnB,OAAO;AACP,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,wBAAwB;AACxB,OAAO;AACL,UAAU;AACV,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ;AAER,QAAQ;AACR,qBAAqB,EACrB,iBAAiB,EACjB,YAAY;AAEZ,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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/spi/storage.ts"],"names":[],"mappings":"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"}
|