@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,273 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// 框架适配器 — 支持不同 Web 框架
|
|
3
|
+
// ============================================================
|
|
4
|
+
// ============================================================
|
|
5
|
+
// SSE 响应适配器
|
|
6
|
+
// ============================================================
|
|
7
|
+
/**
|
|
8
|
+
* Express SSE 适配器
|
|
9
|
+
*/
|
|
10
|
+
export class ExpressSSEAdapter {
|
|
11
|
+
res;
|
|
12
|
+
constructor(res) {
|
|
13
|
+
this.res = res;
|
|
14
|
+
}
|
|
15
|
+
write(data) {
|
|
16
|
+
this.res.write(data);
|
|
17
|
+
}
|
|
18
|
+
end() {
|
|
19
|
+
this.res.end();
|
|
20
|
+
}
|
|
21
|
+
get writableEnded() {
|
|
22
|
+
return this.res.writableEnded;
|
|
23
|
+
}
|
|
24
|
+
setHeader(name, value) {
|
|
25
|
+
this.res.setHeader(name, value);
|
|
26
|
+
}
|
|
27
|
+
flushHeaders() {
|
|
28
|
+
this.res.flushHeaders?.();
|
|
29
|
+
}
|
|
30
|
+
status(code) {
|
|
31
|
+
this.res.status(code);
|
|
32
|
+
}
|
|
33
|
+
json(data) {
|
|
34
|
+
this.res.json(data);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Koa/MidwayJS SSE 适配器
|
|
39
|
+
*/
|
|
40
|
+
export class KoaSSEAdapter {
|
|
41
|
+
ctx;
|
|
42
|
+
constructor(ctx) {
|
|
43
|
+
this.ctx = ctx;
|
|
44
|
+
}
|
|
45
|
+
write(data) {
|
|
46
|
+
this.ctx.res.write(data);
|
|
47
|
+
}
|
|
48
|
+
end() {
|
|
49
|
+
this.ctx.res.end();
|
|
50
|
+
}
|
|
51
|
+
get writableEnded() {
|
|
52
|
+
return this.ctx.res.writableEnded;
|
|
53
|
+
}
|
|
54
|
+
setHeader(name, value) {
|
|
55
|
+
this.ctx.set(name, String(value));
|
|
56
|
+
}
|
|
57
|
+
flushHeaders() {
|
|
58
|
+
this.ctx.res.flush?.();
|
|
59
|
+
}
|
|
60
|
+
status(code) {
|
|
61
|
+
this.ctx.status = code;
|
|
62
|
+
}
|
|
63
|
+
json(data) {
|
|
64
|
+
this.ctx.body = data;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Fastify SSE 适配器
|
|
69
|
+
*/
|
|
70
|
+
export class FastifySSEAdapter {
|
|
71
|
+
reply;
|
|
72
|
+
constructor(reply) {
|
|
73
|
+
this.reply = reply;
|
|
74
|
+
}
|
|
75
|
+
write(data) {
|
|
76
|
+
this.reply.raw.write(data);
|
|
77
|
+
}
|
|
78
|
+
end() {
|
|
79
|
+
this.reply.raw.end();
|
|
80
|
+
}
|
|
81
|
+
get writableEnded() {
|
|
82
|
+
return this.reply.raw.writableEnded;
|
|
83
|
+
}
|
|
84
|
+
setHeader(name, value) {
|
|
85
|
+
this.reply.header(name, value);
|
|
86
|
+
}
|
|
87
|
+
flushHeaders() {
|
|
88
|
+
this.reply.raw.flushHeaders?.();
|
|
89
|
+
}
|
|
90
|
+
status(code) {
|
|
91
|
+
this.reply.code(code);
|
|
92
|
+
}
|
|
93
|
+
json(data) {
|
|
94
|
+
this.reply.send(data);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 原生 HTTP SSE 适配器
|
|
99
|
+
*/
|
|
100
|
+
export class NativeHttpSSEAdapter {
|
|
101
|
+
res;
|
|
102
|
+
constructor(res) {
|
|
103
|
+
this.res = res;
|
|
104
|
+
}
|
|
105
|
+
write(data) {
|
|
106
|
+
this.res.write(data);
|
|
107
|
+
}
|
|
108
|
+
end() {
|
|
109
|
+
this.res.end();
|
|
110
|
+
}
|
|
111
|
+
get writableEnded() {
|
|
112
|
+
return this.res.writableEnded;
|
|
113
|
+
}
|
|
114
|
+
setHeader(name, value) {
|
|
115
|
+
this.res.setHeader(name, value);
|
|
116
|
+
}
|
|
117
|
+
flushHeaders() {
|
|
118
|
+
this.res.flushHeaders?.();
|
|
119
|
+
}
|
|
120
|
+
status(code) {
|
|
121
|
+
this.res.statusCode = code;
|
|
122
|
+
}
|
|
123
|
+
json(data) {
|
|
124
|
+
this.res.setHeader('Content-Type', 'application/json');
|
|
125
|
+
this.res.end(JSON.stringify(data));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 自动检测框架类型并创建适配器
|
|
130
|
+
*/
|
|
131
|
+
export function adaptSSE(res) {
|
|
132
|
+
// Express: res.setHeader, res.write, res.end
|
|
133
|
+
if (res && typeof res === 'object' && 'setHeader' in res && 'write' in res) {
|
|
134
|
+
// 检查是否是 Koa Context (有 ctx.res 且 ctx.set)
|
|
135
|
+
if ('ctx' in res || ('req' in res && 'socket' in res.req)) {
|
|
136
|
+
return new KoaSSEAdapter(res);
|
|
137
|
+
}
|
|
138
|
+
// 检查是否是 Fastify Reply (有 .raw)
|
|
139
|
+
if ('raw' in res && 'header' in res) {
|
|
140
|
+
return new FastifySSEAdapter(res);
|
|
141
|
+
}
|
|
142
|
+
// Express 或原生 HTTP
|
|
143
|
+
return new ExpressSSEAdapter(res);
|
|
144
|
+
}
|
|
145
|
+
// Koa Context
|
|
146
|
+
if (res && typeof res === 'object' && 'res' in res && 'set' in res) {
|
|
147
|
+
return new KoaSSEAdapter(res);
|
|
148
|
+
}
|
|
149
|
+
// Fastify Reply
|
|
150
|
+
if (res && typeof res === 'object' && 'raw' in res && 'header' in res) {
|
|
151
|
+
return new FastifySSEAdapter(res);
|
|
152
|
+
}
|
|
153
|
+
// 原生 HTTP Response
|
|
154
|
+
if (res && typeof res === 'object' && 'write' in res && 'end' in res) {
|
|
155
|
+
return new NativeHttpSSEAdapter(res);
|
|
156
|
+
}
|
|
157
|
+
throw new Error('Unsupported response type. Please provide a custom SSE adapter.');
|
|
158
|
+
}
|
|
159
|
+
// ============================================================
|
|
160
|
+
// 请求上下文适配器
|
|
161
|
+
// ============================================================
|
|
162
|
+
/**
|
|
163
|
+
* Express 请求上下文适配器
|
|
164
|
+
*/
|
|
165
|
+
export class ExpressRequestAdapter {
|
|
166
|
+
req;
|
|
167
|
+
constructor(req) {
|
|
168
|
+
this.req = req;
|
|
169
|
+
}
|
|
170
|
+
getUserId() {
|
|
171
|
+
return this.req.user?.id ?? this.req.headers['x-user-id'];
|
|
172
|
+
}
|
|
173
|
+
getWorkspaceId() {
|
|
174
|
+
const ws = this.req.headers['x-workspace-id'] ?? this.req.query.workspaceId;
|
|
175
|
+
return ws ? Number(ws) : undefined;
|
|
176
|
+
}
|
|
177
|
+
getHeader(name) {
|
|
178
|
+
return this.req.headers[name.toLowerCase()];
|
|
179
|
+
}
|
|
180
|
+
hasPermission(permission) {
|
|
181
|
+
return this.req.user?.permissions?.includes(permission) ?? false;
|
|
182
|
+
}
|
|
183
|
+
getRawRequest() {
|
|
184
|
+
return this.req;
|
|
185
|
+
}
|
|
186
|
+
getRawResponse() {
|
|
187
|
+
return this.req.res;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Koa/MidwayJS 请求上下文适配器
|
|
192
|
+
*/
|
|
193
|
+
export class KoaRequestAdapter {
|
|
194
|
+
ctx;
|
|
195
|
+
constructor(ctx) {
|
|
196
|
+
this.ctx = ctx;
|
|
197
|
+
}
|
|
198
|
+
getUserId() {
|
|
199
|
+
return this.ctx.state?.user?.id ?? this.ctx.get('x-user-id');
|
|
200
|
+
}
|
|
201
|
+
getWorkspaceId() {
|
|
202
|
+
const ws = this.ctx.get('x-workspace-id') ?? this.ctx.query.workspaceId;
|
|
203
|
+
return ws ? Number(ws) : undefined;
|
|
204
|
+
}
|
|
205
|
+
getHeader(name) {
|
|
206
|
+
return this.ctx.get(name);
|
|
207
|
+
}
|
|
208
|
+
hasPermission(permission) {
|
|
209
|
+
return this.ctx.state?.user?.permissions?.includes(permission) ?? false;
|
|
210
|
+
}
|
|
211
|
+
getRawRequest() {
|
|
212
|
+
return this.ctx.req;
|
|
213
|
+
}
|
|
214
|
+
getRawResponse() {
|
|
215
|
+
return this.ctx.res;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 自动检测框架类型并创建请求适配器
|
|
220
|
+
*/
|
|
221
|
+
export function adaptRequest(req) {
|
|
222
|
+
// Koa Context
|
|
223
|
+
if (req && typeof req === 'object' && 'state' in req && 'get' in req) {
|
|
224
|
+
return new KoaRequestAdapter(req);
|
|
225
|
+
}
|
|
226
|
+
// Express Request
|
|
227
|
+
if (req && typeof req === 'object' && 'headers' in req && 'query' in req) {
|
|
228
|
+
return new ExpressRequestAdapter(req);
|
|
229
|
+
}
|
|
230
|
+
throw new Error('Unsupported request type. Please provide a custom request adapter.');
|
|
231
|
+
}
|
|
232
|
+
// ============================================================
|
|
233
|
+
// 自定义适配器示例
|
|
234
|
+
// ============================================================
|
|
235
|
+
/**
|
|
236
|
+
* 自定义 SSE 适配器示例
|
|
237
|
+
* 应用层可参考此实现创建自己的适配器
|
|
238
|
+
*/
|
|
239
|
+
export class CustomSSEAdapter {
|
|
240
|
+
onWrite;
|
|
241
|
+
onEnd;
|
|
242
|
+
onFlush;
|
|
243
|
+
_writableEnded = false;
|
|
244
|
+
headers = new Map();
|
|
245
|
+
constructor(onWrite, onEnd, onFlush) {
|
|
246
|
+
this.onWrite = onWrite;
|
|
247
|
+
this.onEnd = onEnd;
|
|
248
|
+
this.onFlush = onFlush;
|
|
249
|
+
}
|
|
250
|
+
write(data) {
|
|
251
|
+
if (this._writableEnded)
|
|
252
|
+
return;
|
|
253
|
+
this.onWrite(data);
|
|
254
|
+
}
|
|
255
|
+
end() {
|
|
256
|
+
this._writableEnded = true;
|
|
257
|
+
this.onEnd();
|
|
258
|
+
}
|
|
259
|
+
get writableEnded() {
|
|
260
|
+
return this._writableEnded;
|
|
261
|
+
}
|
|
262
|
+
setHeader(name, value) {
|
|
263
|
+
this.headers.set(name, String(value));
|
|
264
|
+
}
|
|
265
|
+
flushHeaders() {
|
|
266
|
+
this.onFlush?.();
|
|
267
|
+
}
|
|
268
|
+
/** 获取已设置的响应头 */
|
|
269
|
+
getHeaders() {
|
|
270
|
+
return Object.fromEntries(this.headers);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../../src/spi/adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import type { ChatStoreProvider, BaseThreadEntity, BaseMessageEntity, BaseSettingsEntity, ListStorageAdapter } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* BI 项目的 Thread 实体(TypeORM)
|
|
4
|
+
* 注意:字段可能与 agent-server 默认实体不同
|
|
5
|
+
*/
|
|
6
|
+
interface BIThreadEntity extends BaseThreadEntity {
|
|
7
|
+
id: number;
|
|
8
|
+
workspaceId?: number;
|
|
9
|
+
userId?: number;
|
|
10
|
+
agentType?: string;
|
|
11
|
+
modelConfig?: string;
|
|
12
|
+
createdAt: Date;
|
|
13
|
+
updatedAt: Date;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* BI 项目的 Message 实体(TypeORM)
|
|
17
|
+
*/
|
|
18
|
+
interface BIMessageEntity extends BaseMessageEntity {
|
|
19
|
+
id: number;
|
|
20
|
+
threadId: number;
|
|
21
|
+
tokens?: number;
|
|
22
|
+
latency?: number;
|
|
23
|
+
model?: string;
|
|
24
|
+
createdAt: Date;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* BI 项目的 Settings 实体
|
|
28
|
+
*/
|
|
29
|
+
interface BISettingsEntity extends BaseSettingsEntity {
|
|
30
|
+
id: number;
|
|
31
|
+
userId: number;
|
|
32
|
+
theme: string;
|
|
33
|
+
language: string;
|
|
34
|
+
modelProviders: Array<{
|
|
35
|
+
id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
provider: string;
|
|
38
|
+
model: string;
|
|
39
|
+
apiKey?: string;
|
|
40
|
+
baseUrl?: string;
|
|
41
|
+
}>;
|
|
42
|
+
createdAt: Date;
|
|
43
|
+
updatedAt: Date;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* TypeORM 列表存储适配器
|
|
47
|
+
* 将 TypeORM Repository 包装为 ListStorageAdapter
|
|
48
|
+
*/
|
|
49
|
+
declare class TypeORMListStorage<T extends {
|
|
50
|
+
id: number | string;
|
|
51
|
+
}> implements ListStorageAdapter<T> {
|
|
52
|
+
private data;
|
|
53
|
+
list(): Promise<T[]>;
|
|
54
|
+
findById(id: number | string): Promise<T | null>;
|
|
55
|
+
add(entity: T): Promise<T>;
|
|
56
|
+
update(id: number | string, data: Partial<T>): Promise<T | null>;
|
|
57
|
+
remove(id: number | string): Promise<boolean>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* BI 项目的 ChatStoreProvider 实现
|
|
61
|
+
* 使用 TypeORM Repository 作为底层存储
|
|
62
|
+
*/
|
|
63
|
+
declare class TypeORMChatStoreProvider implements ChatStoreProvider<BIThreadEntity, BIMessageEntity> {
|
|
64
|
+
private threadStorage;
|
|
65
|
+
private messageStorages;
|
|
66
|
+
constructor();
|
|
67
|
+
private getMessageStorage;
|
|
68
|
+
getThreads(workspaceId?: number | string): Promise<BIThreadEntity[]>;
|
|
69
|
+
getThread(id: number | string): Promise<BIThreadEntity | undefined>;
|
|
70
|
+
createThread(data: Partial<BIThreadEntity>): Promise<BIThreadEntity>;
|
|
71
|
+
updateThread(id: number | string, data: Partial<BIThreadEntity>): Promise<BIThreadEntity | undefined>;
|
|
72
|
+
deleteThread(id: number | string): Promise<boolean>;
|
|
73
|
+
getMessages(threadId: number | string, options?: {
|
|
74
|
+
limit?: number;
|
|
75
|
+
offset?: number;
|
|
76
|
+
}): Promise<{
|
|
77
|
+
items: BIMessageEntity[];
|
|
78
|
+
total: number;
|
|
79
|
+
hasMore: boolean;
|
|
80
|
+
}>;
|
|
81
|
+
addMessage(data: Partial<BIMessageEntity> & {
|
|
82
|
+
threadId: number | string;
|
|
83
|
+
role: string;
|
|
84
|
+
content: string;
|
|
85
|
+
}): Promise<BIMessageEntity>;
|
|
86
|
+
updateMessage(threadId: number | string, id: number | string, data: Partial<BIMessageEntity>): Promise<BIMessageEntity | undefined>;
|
|
87
|
+
deleteMessage(threadId: number | string, id: number | string): Promise<boolean>;
|
|
88
|
+
clearThreadMessages(threadId: number | string): Promise<void>;
|
|
89
|
+
buildThreadHistory(threadId: number | string, limit?: number): Promise<any[]>;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* MidwayJS Agent 服务示例
|
|
93
|
+
* 使用 SPI 适配到 MidwayJS + TypeORM
|
|
94
|
+
*
|
|
95
|
+
* 在实际项目中,这会是:
|
|
96
|
+
*
|
|
97
|
+
* @Provide()
|
|
98
|
+
* @Scope(ScopeEnum.Singleton)
|
|
99
|
+
* export class AgentService {
|
|
100
|
+
* @Inject()
|
|
101
|
+
* threadRepository: Repository<BIThreadEntity>;
|
|
102
|
+
*
|
|
103
|
+
* @Inject()
|
|
104
|
+
* messageRepository: Repository<BIMessageEntity>;
|
|
105
|
+
*
|
|
106
|
+
* private server: AgentServer;
|
|
107
|
+
*
|
|
108
|
+
* @Init()
|
|
109
|
+
* async init() {
|
|
110
|
+
* const chatStoreProvider = new TypeORMChatStoreProvider(
|
|
111
|
+
* this.threadRepository,
|
|
112
|
+
* this.messageRepository
|
|
113
|
+
* );
|
|
114
|
+
*
|
|
115
|
+
* this.server = createAgentServer({
|
|
116
|
+
* llmProvider: await this.createLLMProvider(),
|
|
117
|
+
* chatStoreProvider,
|
|
118
|
+
* // 使用 Koa 适配器
|
|
119
|
+
* createSSEResponseAdapter: (ctx) => new KoaSSEAdapter(ctx),
|
|
120
|
+
* });
|
|
121
|
+
* }
|
|
122
|
+
*
|
|
123
|
+
* @Get('/chat/stream')
|
|
124
|
+
* async chatStream(@Ctx() ctx: Context, @Query() query: { message: string }) {
|
|
125
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
126
|
+
* await this.server.runAgentStream(adapter, { content: query.message });
|
|
127
|
+
* }
|
|
128
|
+
* }
|
|
129
|
+
*/
|
|
130
|
+
export { TypeORMListStorage, TypeORMChatStoreProvider, BIThreadEntity, BIMessageEntity, BISettingsEntity, };
|
|
131
|
+
/**
|
|
132
|
+
* ## 使用说明
|
|
133
|
+
*
|
|
134
|
+
* ### 1. 在 MidwayJS 项目中使用 agent-server
|
|
135
|
+
*
|
|
136
|
+
* ```typescript
|
|
137
|
+
* // src/service/agent.service.ts
|
|
138
|
+
* import { Provide, Scope, ScopeEnum, Inject, Init, Get, Ctx, Query } from '@midwayjs/core';
|
|
139
|
+
* import { Context } from '@midwayjs/koa';
|
|
140
|
+
* import { createAgentServer, KoaSSEAdapter, type AgentServer } from '@cicctencent/agent-server';
|
|
141
|
+
* import { TypeORMChatStoreProvider } from './spi/typeorm-chat-provider';
|
|
142
|
+
*
|
|
143
|
+
* @Provide()
|
|
144
|
+
* @Scope(ScopeEnum.Singleton)
|
|
145
|
+
* export class AgentService {
|
|
146
|
+
* @Inject()
|
|
147
|
+
* threadRepository: Repository<ThreadEntity>;
|
|
148
|
+
*
|
|
149
|
+
* @Inject()
|
|
150
|
+
* messageRepository: Repository<MessageEntity>;
|
|
151
|
+
*
|
|
152
|
+
* private server: AgentServer;
|
|
153
|
+
*
|
|
154
|
+
* @Init()
|
|
155
|
+
* async init() {
|
|
156
|
+
* // 使用 TypeORM 存储适配器
|
|
157
|
+
* const chatStoreProvider = new TypeORMChatStoreProvider(
|
|
158
|
+
* this.threadRepository,
|
|
159
|
+
* this.messageRepository
|
|
160
|
+
* );
|
|
161
|
+
*
|
|
162
|
+
* this.server = createAgentServer({
|
|
163
|
+
* llmProvider: await this.createLLMProvider(),
|
|
164
|
+
* chatStoreProvider, // 替换默认 JSON 文件存储
|
|
165
|
+
* });
|
|
166
|
+
* }
|
|
167
|
+
*
|
|
168
|
+
* @Get('/chat/stream')
|
|
169
|
+
* async chatStream(@Ctx() ctx: Context, @Query() query: { message: string }) {
|
|
170
|
+
* // 使用 Koa/MidwayJS SSE 适配器
|
|
171
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
172
|
+
* await this.server.runAgentStream(adapter, { content: query.message });
|
|
173
|
+
* }
|
|
174
|
+
* }
|
|
175
|
+
* ```
|
|
176
|
+
*
|
|
177
|
+
* ### 2. 自定义实体字段
|
|
178
|
+
*
|
|
179
|
+
* agent-server 现在支持泛型实体类型,你可以:
|
|
180
|
+
* - 使用自己的实体结构(如 TypeORM 实体)
|
|
181
|
+
* - 自定义字段(如 userId, modelConfig 等)
|
|
182
|
+
* - 使用不同的 ID 类型(number / string / UUID)
|
|
183
|
+
*
|
|
184
|
+
* ### 3. 组件级使用(不依赖工厂)
|
|
185
|
+
*
|
|
186
|
+
* 如果不想使用 createAgentServer 工厂,可以只导入需要的组件:
|
|
187
|
+
*
|
|
188
|
+
* ```typescript
|
|
189
|
+
* import {
|
|
190
|
+
* MemoryService,
|
|
191
|
+
* writeSSE,
|
|
192
|
+
* createBuiltinTools,
|
|
193
|
+
* KoaSSEAdapter
|
|
194
|
+
* } from '@cicctencent/agent-server';
|
|
195
|
+
*
|
|
196
|
+
* // 只使用需要的组件
|
|
197
|
+
* const memoryService = new MemoryService('./data');
|
|
198
|
+
* const tools = createBuiltinTools();
|
|
199
|
+
*
|
|
200
|
+
* // 在 MidwayJS 中使用 SSE
|
|
201
|
+
* @Get('/stream')
|
|
202
|
+
* async stream(@Ctx() ctx: Context) {
|
|
203
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
204
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
205
|
+
* }
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
//# sourceMappingURL=typeorm-example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm-example.d.ts","sourceRoot":"","sources":["../../../../src/spi/examples/typeorm-example.ts"],"names":[],"mappings":"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"}
|