@dangao/bun-server 1.12.1 → 2.0.1

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 (214) hide show
  1. package/README.md +32 -0
  2. package/dist/ai/ai-module.d.ts +24 -0
  3. package/dist/ai/ai-module.d.ts.map +1 -0
  4. package/dist/ai/decorators.d.ts +25 -0
  5. package/dist/ai/decorators.d.ts.map +1 -0
  6. package/dist/ai/errors.d.ts +39 -0
  7. package/dist/ai/errors.d.ts.map +1 -0
  8. package/dist/ai/index.d.ts +12 -0
  9. package/dist/ai/index.d.ts.map +1 -0
  10. package/dist/ai/providers/anthropic-provider.d.ts +23 -0
  11. package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
  12. package/dist/ai/providers/google-provider.d.ts +20 -0
  13. package/dist/ai/providers/google-provider.d.ts.map +1 -0
  14. package/dist/ai/providers/ollama-provider.d.ts +17 -0
  15. package/dist/ai/providers/ollama-provider.d.ts.map +1 -0
  16. package/dist/ai/providers/openai-provider.d.ts +28 -0
  17. package/dist/ai/providers/openai-provider.d.ts.map +1 -0
  18. package/dist/ai/service.d.ts +40 -0
  19. package/dist/ai/service.d.ts.map +1 -0
  20. package/dist/ai/tools/tool-executor.d.ts +15 -0
  21. package/dist/ai/tools/tool-executor.d.ts.map +1 -0
  22. package/dist/ai/tools/tool-registry.d.ts +39 -0
  23. package/dist/ai/tools/tool-registry.d.ts.map +1 -0
  24. package/dist/ai/types.d.ts +134 -0
  25. package/dist/ai/types.d.ts.map +1 -0
  26. package/dist/ai-guard/ai-guard-module.d.ts +18 -0
  27. package/dist/ai-guard/ai-guard-module.d.ts.map +1 -0
  28. package/dist/ai-guard/decorators.d.ts +16 -0
  29. package/dist/ai-guard/decorators.d.ts.map +1 -0
  30. package/dist/ai-guard/detectors/content-moderator.d.ts +26 -0
  31. package/dist/ai-guard/detectors/content-moderator.d.ts.map +1 -0
  32. package/dist/ai-guard/detectors/injection-detector.d.ts +13 -0
  33. package/dist/ai-guard/detectors/injection-detector.d.ts.map +1 -0
  34. package/dist/ai-guard/detectors/pii-detector.d.ts +11 -0
  35. package/dist/ai-guard/detectors/pii-detector.d.ts.map +1 -0
  36. package/dist/ai-guard/index.d.ts +8 -0
  37. package/dist/ai-guard/index.d.ts.map +1 -0
  38. package/dist/ai-guard/service.d.ts +21 -0
  39. package/dist/ai-guard/service.d.ts.map +1 -0
  40. package/dist/ai-guard/types.d.ts +59 -0
  41. package/dist/ai-guard/types.d.ts.map +1 -0
  42. package/dist/conversation/conversation-module.d.ts +25 -0
  43. package/dist/conversation/conversation-module.d.ts.map +1 -0
  44. package/dist/conversation/decorators.d.ts +28 -0
  45. package/dist/conversation/decorators.d.ts.map +1 -0
  46. package/dist/conversation/index.d.ts +8 -0
  47. package/dist/conversation/index.d.ts.map +1 -0
  48. package/dist/conversation/service.d.ts +43 -0
  49. package/dist/conversation/service.d.ts.map +1 -0
  50. package/dist/conversation/stores/database-store.d.ts +46 -0
  51. package/dist/conversation/stores/database-store.d.ts.map +1 -0
  52. package/dist/conversation/stores/memory-store.d.ts +17 -0
  53. package/dist/conversation/stores/memory-store.d.ts.map +1 -0
  54. package/dist/conversation/stores/redis-store.d.ts +39 -0
  55. package/dist/conversation/stores/redis-store.d.ts.map +1 -0
  56. package/dist/conversation/types.d.ts +64 -0
  57. package/dist/conversation/types.d.ts.map +1 -0
  58. package/dist/embedding/embedding-module.d.ts +20 -0
  59. package/dist/embedding/embedding-module.d.ts.map +1 -0
  60. package/dist/embedding/index.d.ts +6 -0
  61. package/dist/embedding/index.d.ts.map +1 -0
  62. package/dist/embedding/providers/ollama-embedding-provider.d.ts +18 -0
  63. package/dist/embedding/providers/ollama-embedding-provider.d.ts.map +1 -0
  64. package/dist/embedding/providers/openai-embedding-provider.d.ts +18 -0
  65. package/dist/embedding/providers/openai-embedding-provider.d.ts.map +1 -0
  66. package/dist/embedding/service.d.ts +27 -0
  67. package/dist/embedding/service.d.ts.map +1 -0
  68. package/dist/embedding/types.d.ts +25 -0
  69. package/dist/embedding/types.d.ts.map +1 -0
  70. package/dist/index.d.ts +8 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +2638 -1
  73. package/dist/mcp/decorators.d.ts +42 -0
  74. package/dist/mcp/decorators.d.ts.map +1 -0
  75. package/dist/mcp/index.d.ts +6 -0
  76. package/dist/mcp/index.d.ts.map +1 -0
  77. package/dist/mcp/mcp-module.d.ts +22 -0
  78. package/dist/mcp/mcp-module.d.ts.map +1 -0
  79. package/dist/mcp/registry.d.ts +23 -0
  80. package/dist/mcp/registry.d.ts.map +1 -0
  81. package/dist/mcp/server.d.ts +29 -0
  82. package/dist/mcp/server.d.ts.map +1 -0
  83. package/dist/mcp/types.d.ts +60 -0
  84. package/dist/mcp/types.d.ts.map +1 -0
  85. package/dist/prompt/index.d.ts +6 -0
  86. package/dist/prompt/index.d.ts.map +1 -0
  87. package/dist/prompt/prompt-module.d.ts +23 -0
  88. package/dist/prompt/prompt-module.d.ts.map +1 -0
  89. package/dist/prompt/service.d.ts +47 -0
  90. package/dist/prompt/service.d.ts.map +1 -0
  91. package/dist/prompt/stores/file-store.d.ts +36 -0
  92. package/dist/prompt/stores/file-store.d.ts.map +1 -0
  93. package/dist/prompt/stores/memory-store.d.ts +17 -0
  94. package/dist/prompt/stores/memory-store.d.ts.map +1 -0
  95. package/dist/prompt/types.d.ts +68 -0
  96. package/dist/prompt/types.d.ts.map +1 -0
  97. package/dist/rag/chunkers/markdown-chunker.d.ts +11 -0
  98. package/dist/rag/chunkers/markdown-chunker.d.ts.map +1 -0
  99. package/dist/rag/chunkers/text-chunker.d.ts +11 -0
  100. package/dist/rag/chunkers/text-chunker.d.ts.map +1 -0
  101. package/dist/rag/decorators.d.ts +24 -0
  102. package/dist/rag/decorators.d.ts.map +1 -0
  103. package/dist/rag/index.d.ts +7 -0
  104. package/dist/rag/index.d.ts.map +1 -0
  105. package/dist/rag/rag-module.d.ts +23 -0
  106. package/dist/rag/rag-module.d.ts.map +1 -0
  107. package/dist/rag/service.d.ts +36 -0
  108. package/dist/rag/service.d.ts.map +1 -0
  109. package/dist/rag/types.d.ts +56 -0
  110. package/dist/rag/types.d.ts.map +1 -0
  111. package/dist/vector-store/index.d.ts +6 -0
  112. package/dist/vector-store/index.d.ts.map +1 -0
  113. package/dist/vector-store/stores/memory-store.d.ts +17 -0
  114. package/dist/vector-store/stores/memory-store.d.ts.map +1 -0
  115. package/dist/vector-store/stores/pinecone-store.d.ts +27 -0
  116. package/dist/vector-store/stores/pinecone-store.d.ts.map +1 -0
  117. package/dist/vector-store/stores/qdrant-store.d.ts +29 -0
  118. package/dist/vector-store/stores/qdrant-store.d.ts.map +1 -0
  119. package/dist/vector-store/types.d.ts +60 -0
  120. package/dist/vector-store/types.d.ts.map +1 -0
  121. package/dist/vector-store/vector-store-module.d.ts +20 -0
  122. package/dist/vector-store/vector-store-module.d.ts.map +1 -0
  123. package/docs/ai.md +500 -0
  124. package/docs/best-practices.md +83 -8
  125. package/docs/database.md +23 -0
  126. package/docs/guide.md +90 -27
  127. package/docs/migration.md +81 -7
  128. package/docs/security.md +23 -0
  129. package/docs/zh/ai.md +441 -0
  130. package/docs/zh/best-practices.md +43 -0
  131. package/docs/zh/database.md +23 -0
  132. package/docs/zh/guide.md +40 -1
  133. package/docs/zh/migration.md +39 -0
  134. package/docs/zh/security.md +23 -0
  135. package/package.json +3 -3
  136. package/src/ai/ai-module.ts +62 -0
  137. package/src/ai/decorators.ts +30 -0
  138. package/src/ai/errors.ts +71 -0
  139. package/src/ai/index.ts +11 -0
  140. package/src/ai/providers/anthropic-provider.ts +190 -0
  141. package/src/ai/providers/google-provider.ts +179 -0
  142. package/src/ai/providers/ollama-provider.ts +126 -0
  143. package/src/ai/providers/openai-provider.ts +242 -0
  144. package/src/ai/service.ts +155 -0
  145. package/src/ai/tools/tool-executor.ts +38 -0
  146. package/src/ai/tools/tool-registry.ts +91 -0
  147. package/src/ai/types.ts +145 -0
  148. package/src/ai-guard/ai-guard-module.ts +50 -0
  149. package/src/ai-guard/decorators.ts +21 -0
  150. package/src/ai-guard/detectors/content-moderator.ts +80 -0
  151. package/src/ai-guard/detectors/injection-detector.ts +48 -0
  152. package/src/ai-guard/detectors/pii-detector.ts +64 -0
  153. package/src/ai-guard/index.ts +7 -0
  154. package/src/ai-guard/service.ts +100 -0
  155. package/src/ai-guard/types.ts +61 -0
  156. package/src/conversation/conversation-module.ts +63 -0
  157. package/src/conversation/decorators.ts +47 -0
  158. package/src/conversation/index.ts +7 -0
  159. package/src/conversation/service.ts +133 -0
  160. package/src/conversation/stores/database-store.ts +125 -0
  161. package/src/conversation/stores/memory-store.ts +57 -0
  162. package/src/conversation/stores/redis-store.ts +101 -0
  163. package/src/conversation/types.ts +68 -0
  164. package/src/embedding/embedding-module.ts +52 -0
  165. package/src/embedding/index.ts +5 -0
  166. package/src/embedding/providers/ollama-embedding-provider.ts +39 -0
  167. package/src/embedding/providers/openai-embedding-provider.ts +47 -0
  168. package/src/embedding/service.ts +55 -0
  169. package/src/embedding/types.ts +27 -0
  170. package/src/index.ts +10 -0
  171. package/src/mcp/decorators.ts +60 -0
  172. package/src/mcp/index.ts +5 -0
  173. package/src/mcp/mcp-module.ts +58 -0
  174. package/src/mcp/registry.ts +72 -0
  175. package/src/mcp/server.ts +164 -0
  176. package/src/mcp/types.ts +63 -0
  177. package/src/prompt/index.ts +5 -0
  178. package/src/prompt/prompt-module.ts +61 -0
  179. package/src/prompt/service.ts +93 -0
  180. package/src/prompt/stores/file-store.ts +135 -0
  181. package/src/prompt/stores/memory-store.ts +82 -0
  182. package/src/prompt/types.ts +84 -0
  183. package/src/rag/chunkers/markdown-chunker.ts +40 -0
  184. package/src/rag/chunkers/text-chunker.ts +30 -0
  185. package/src/rag/decorators.ts +26 -0
  186. package/src/rag/index.ts +6 -0
  187. package/src/rag/rag-module.ts +78 -0
  188. package/src/rag/service.ts +134 -0
  189. package/src/rag/types.ts +47 -0
  190. package/src/vector-store/index.ts +5 -0
  191. package/src/vector-store/stores/memory-store.ts +69 -0
  192. package/src/vector-store/stores/pinecone-store.ts +123 -0
  193. package/src/vector-store/stores/qdrant-store.ts +147 -0
  194. package/src/vector-store/types.ts +77 -0
  195. package/src/vector-store/vector-store-module.ts +50 -0
  196. package/tests/ai/ai-module.test.ts +46 -0
  197. package/tests/ai/ai-service.test.ts +91 -0
  198. package/tests/ai/tool-registry.test.ts +57 -0
  199. package/tests/ai-guard/ai-guard-module.test.ts +23 -0
  200. package/tests/ai-guard/content-moderator.test.ts +65 -0
  201. package/tests/ai-guard/pii-detector.test.ts +41 -0
  202. package/tests/conversation/conversation-module.test.ts +26 -0
  203. package/tests/conversation/conversation-service.test.ts +64 -0
  204. package/tests/conversation/memory-store.test.ts +68 -0
  205. package/tests/embedding/embedding-service.test.ts +55 -0
  206. package/tests/mcp/mcp-server.test.ts +85 -0
  207. package/tests/prompt/prompt-module.test.ts +30 -0
  208. package/tests/prompt/prompt-service.test.ts +74 -0
  209. package/tests/rag/chunkers.test.ts +58 -0
  210. package/tests/rag/rag-service.test.ts +66 -0
  211. package/tests/vector-store/memory-vector-store.test.ts +84 -0
  212. package/tests/interceptor/perf/interceptor-performance.test.ts +0 -340
  213. package/tests/perf/optimization.test.ts +0 -182
  214. package/tests/perf/regression.test.ts +0 -120
package/docs/zh/ai.md ADDED
@@ -0,0 +1,441 @@
1
+ # AI 模块
2
+
3
+ [English](../ai.md) | **中文**
4
+
5
+ `@dangao/bun-server` v2.0.0 引入 **9 个官方 AI 模块**,为构建 LLM 驱动应用提供生产级基础设施。
6
+
7
+ 所有 Provider 通过 Bun 原生 `fetch()` 调用 REST API,框架包不增加任何第三方 AI SDK 依赖。
8
+
9
+ ---
10
+
11
+ ## 快速开始 — 5 分钟聊天 API
12
+
13
+ ```bash
14
+ ollama pull llama3.2 # 免费本地模型
15
+ ```
16
+
17
+ ```typescript
18
+ import {
19
+ Application, Controller, Module, Injectable, Inject,
20
+ POST, Body, AiModule, AiService, OllamaProvider, AI_SERVICE_TOKEN,
21
+ } from '@dangao/bun-server';
22
+
23
+ AiModule.forRoot({
24
+ providers: [{ name: 'ollama', provider: OllamaProvider, config: {}, default: true }],
25
+ });
26
+
27
+ @Injectable()
28
+ class ChatService {
29
+ constructor(@Inject(AI_SERVICE_TOKEN) private ai: AiService) {}
30
+ async chat(msg: string) {
31
+ return this.ai.complete({ messages: [{ role: 'user', content: msg }] });
32
+ }
33
+ }
34
+
35
+ @Controller('/chat')
36
+ class ChatController {
37
+ constructor(private svc: ChatService) {}
38
+ @POST('/') async post(@Body() b: { message: string }) { return this.svc.chat(b.message); }
39
+ }
40
+
41
+ @Module({ imports: [AiModule], controllers: [ChatController], providers: [ChatService] })
42
+ class AppModule {}
43
+
44
+ const app = new Application({ port: 3000 });
45
+ app.registerModule(AppModule);
46
+ app.listen();
47
+ ```
48
+
49
+ ---
50
+
51
+ ## 模块概览
52
+
53
+ | 模块 | Token | 功能 |
54
+ |------|-------|------|
55
+ | `AiModule` | `AI_SERVICE_TOKEN` | LLM Provider + Tool Calling + 流式响应 |
56
+ | `ConversationModule` | `CONVERSATION_SERVICE_TOKEN` | 多轮会话历史管理 |
57
+ | `PromptModule` | `PROMPT_SERVICE_TOKEN` | Prompt 模板 + 版本管理 |
58
+ | `EmbeddingModule` | `EMBEDDING_SERVICE_TOKEN` | 文本向量嵌入 |
59
+ | `VectorStoreModule` | `VECTOR_STORE_TOKEN` | 向量相似度搜索 |
60
+ | `RagModule` | `RAG_SERVICE_TOKEN` | RAG 管道(摄取 → 检索) |
61
+ | `McpModule` | `MCP_SERVER_TOKEN` | MCP 协议服务端 |
62
+ | `AiGuardModule` | `AI_GUARD_SERVICE_TOKEN` | 内容安全防护 |
63
+
64
+ ---
65
+
66
+ ## AiModule — LLM 统一接入
67
+
68
+ ### 配置
69
+
70
+ ```typescript
71
+ import { AiModule, OpenAIProvider, AnthropicProvider, OllamaProvider, GoogleProvider } from '@dangao/bun-server';
72
+
73
+ AiModule.forRoot({
74
+ providers: [
75
+ { name: 'openai', provider: OpenAIProvider, config: { apiKey: process.env.OPENAI_API_KEY! }, default: true },
76
+ { name: 'claude', provider: AnthropicProvider, config: { apiKey: process.env.ANTHROPIC_API_KEY! } },
77
+ { name: 'ollama', provider: OllamaProvider, config: { baseUrl: 'http://localhost:11434' } },
78
+ { name: 'gemini', provider: GoogleProvider, config: { apiKey: process.env.GOOGLE_API_KEY! } },
79
+ ],
80
+ fallback: true, // 主 Provider 失败时自动切换
81
+ timeout: 30000, // 请求超时(毫秒)
82
+ tools: {
83
+ autoDiscover: true, // 自动注册 @AiTool() 标注的方法
84
+ maxIterations: 10, // Tool Calling 最大循环次数
85
+ },
86
+ });
87
+ ```
88
+
89
+ ### 使用
90
+
91
+ ```typescript
92
+ @Injectable()
93
+ class ChatService {
94
+ constructor(@Inject(AI_SERVICE_TOKEN) private ai: AiService) {}
95
+
96
+ // 非流式对话
97
+ async complete(messages: AiMessage[]) {
98
+ return this.ai.complete({ messages });
99
+ }
100
+
101
+ // 流式响应(SSE)
102
+ stream(messages: AiMessage[]): ReadableStream<Uint8Array> {
103
+ return this.ai.stream({ messages });
104
+ }
105
+
106
+ // 指定 Provider
107
+ async withClaude(messages: AiMessage[]) {
108
+ return this.ai.complete({ messages, provider: 'claude' });
109
+ }
110
+ }
111
+ ```
112
+
113
+ ### 流式响应集成
114
+
115
+ ```typescript
116
+ @GET('/stream')
117
+ public streamChat(@Query('message') message: string): Response {
118
+ const stream = this.aiService.stream({
119
+ messages: [{ role: 'user', content: message }],
120
+ });
121
+ return new Response(stream, {
122
+ headers: {
123
+ 'Content-Type': 'text/event-stream',
124
+ 'Cache-Control': 'no-cache',
125
+ },
126
+ });
127
+ }
128
+ ```
129
+
130
+ 每个 SSE 块格式:`data: {"content":"...","done":false}\n\n`
131
+
132
+ ### Tool Calling — @AiTool() 装饰器
133
+
134
+ ```typescript
135
+ @Injectable()
136
+ class MyTools {
137
+ @AiTool({
138
+ name: 'get_weather',
139
+ description: '获取城市当前天气',
140
+ parameters: {
141
+ type: 'object',
142
+ properties: { city: { type: 'string' } },
143
+ required: ['city'],
144
+ },
145
+ })
146
+ async getWeather({ city }: { city: string }): Promise<string> {
147
+ return `${city} 天气:22°C,晴天`;
148
+ }
149
+ }
150
+
151
+ // 注册工具:
152
+ const registry = container.resolve<ToolRegistry>(AI_TOOL_REGISTRY_TOKEN);
153
+ registry.scanAndRegister(new MyTools());
154
+
155
+ // 带工具的对话(自动循环):
156
+ const response = await aiService.complete({
157
+ messages: [{ role: 'user', content: '东京今天天气如何?' }],
158
+ tools: registry.getDefinitions(),
159
+ });
160
+ ```
161
+
162
+ ---
163
+
164
+ ## ConversationModule — 多轮会话记忆
165
+
166
+ ### 配置
167
+
168
+ ```typescript
169
+ import { ConversationModule, MemoryConversationStore } from '@dangao/bun-server';
170
+
171
+ ConversationModule.forRoot({
172
+ store: new MemoryConversationStore(), // 或 RedisConversationStore / DatabaseConversationStore
173
+ maxMessages: 50,
174
+ autoTrim: true,
175
+ summaryThreshold: 40, // 超过 40 条时触发摘要压缩
176
+ summarizer: async (messages) => {
177
+ // 注入 AiService 进行摘要——避免循环依赖
178
+ return await aiService.complete({ messages: [...messages, summaryPrompt] }).then(r => r.content);
179
+ },
180
+ });
181
+ ```
182
+
183
+ ### 使用
184
+
185
+ ```typescript
186
+ @POST('/chat')
187
+ async chat(@Body() body: { message: string; conversationId?: string }) {
188
+ let convId = body.conversationId;
189
+ if (!convId) {
190
+ const conv = await this.conversations.create();
191
+ convId = conv.id;
192
+ }
193
+
194
+ const history = await this.conversations.getHistory(convId);
195
+ const response = await this.ai.complete({
196
+ messages: [...history, { role: 'user', content: body.message }],
197
+ });
198
+
199
+ await this.conversations.appendMessage(convId, { role: 'user', content: body.message });
200
+ await this.conversations.appendMessage(convId, { role: 'assistant', content: response.content });
201
+
202
+ return { conversationId: convId, reply: response.content };
203
+ }
204
+ ```
205
+
206
+ ### 存储方案
207
+
208
+ | 存储 | 适用场景 |
209
+ |------|---------|
210
+ | `MemoryConversationStore` | 开发环境、单实例(默认) |
211
+ | `RedisConversationStore` | 生产环境、多实例 |
212
+ | `DatabaseConversationStore` | 持久化存储、历史查询 |
213
+
214
+ ---
215
+
216
+ ## PromptModule — Prompt 模板管理
217
+
218
+ ### 配置
219
+
220
+ ```typescript
221
+ import { PromptModule, FilePromptStore } from '@dangao/bun-server';
222
+
223
+ PromptModule.forRoot({
224
+ store: new FilePromptStore({ promptsDir: './.prompts' }), // 从 .prompts/*.json 加载
225
+ });
226
+ ```
227
+
228
+ ### 使用
229
+
230
+ ```typescript
231
+ // 创建模板
232
+ await promptService.create({
233
+ id: 'system-assistant',
234
+ name: '系统提示:助手',
235
+ content: '你是 {{role}},{{company}} 的专业助手。',
236
+ });
237
+
238
+ // 渲染模板
239
+ const prompt = await promptService.render('system-assistant', {
240
+ role: '数据分析师',
241
+ company: '某科技公司',
242
+ });
243
+ // "你是数据分析师,某科技公司的专业助手。"
244
+
245
+ // 更新自动创建新版本
246
+ await promptService.update('system-assistant', { content: '你是 {{role}},在 {{company}} 工作。' });
247
+
248
+ // 获取特定版本
249
+ const v1 = await promptService.getVersion('system-assistant', 1);
250
+ ```
251
+
252
+ ---
253
+
254
+ ## EmbeddingModule + VectorStoreModule
255
+
256
+ ### 配置
257
+
258
+ ```typescript
259
+ EmbeddingModule.forRoot({
260
+ provider: { name: 'openai', provider: OpenAIEmbeddingProvider, config: { apiKey: '...' } },
261
+ });
262
+
263
+ VectorStoreModule.forRoot({
264
+ store: new MemoryVectorStore(), // 或 PineconeVectorStore / QdrantVectorStore
265
+ });
266
+ ```
267
+
268
+ ### 使用
269
+
270
+ ```typescript
271
+ // 生成嵌入向量
272
+ const vector = await embeddingService.embed('Hello world');
273
+
274
+ // 向量存储操作
275
+ await vectorStore.upsert({ id: 'doc1', vector, content: '文档内容', collection: 'docs' });
276
+ const results = await vectorStore.search(queryVector, { topK: 5, collection: 'docs', minScore: 0.7 });
277
+ ```
278
+
279
+ ---
280
+
281
+ ## RagModule — RAG 检索增强管道
282
+
283
+ ### 配置
284
+
285
+ ```typescript
286
+ // 需要先配置 EmbeddingModule 和 VectorStoreModule
287
+ RagModule.forRoot({
288
+ collection: 'my-kb',
289
+ chunkSize: 512,
290
+ chunkOverlap: 50,
291
+ topK: 5,
292
+ minScore: 0.5,
293
+ });
294
+ ```
295
+
296
+ ### 文档摄取与检索
297
+
298
+ ```typescript
299
+ // 摄取文档(三种来源)
300
+ await ragService.ingest({ type: 'text', content: 'Bun 是一个快速的 JS 运行时。' });
301
+ await ragService.ingest({ type: 'file', path: './docs/manual.md' });
302
+ await ragService.ingest({ type: 'url', url: 'https://bun.sh/docs' });
303
+
304
+ // 检索相关上下文
305
+ const context = await ragService.retrieve('Bun 使用什么引擎?');
306
+ // context.formatted = "[1] Bun 使用...\n\n[2] ..."
307
+
308
+ // 构建增强 Prompt
309
+ const systemPrompt = await ragService.buildContextPrompt(question);
310
+ ```
311
+
312
+ ---
313
+
314
+ ## McpModule — MCP 协议服务端
315
+
316
+ MCP(Model Context Protocol)让 AI 客户端(Cursor、Claude Desktop 等)能够调用你的 API 方法作为工具。
317
+
318
+ ### 配置
319
+
320
+ ```typescript
321
+ McpModule.forRoot({
322
+ transport: 'sse',
323
+ path: '/mcp',
324
+ serverInfo: { name: 'my-api', version: '1.0.0' },
325
+ });
326
+ ```
327
+
328
+ ### 定义 MCP 工具
329
+
330
+ ```typescript
331
+ @McpTool({
332
+ name: 'search_products',
333
+ description: '按关键词搜索商品',
334
+ inputSchema: {
335
+ type: 'object',
336
+ properties: { query: { type: 'string' } },
337
+ required: ['query'],
338
+ },
339
+ })
340
+ async searchProducts({ query }: { query: string }) {
341
+ return this.productService.search(query);
342
+ }
343
+ ```
344
+
345
+ ---
346
+
347
+ ## AiGuardModule — 内容安全防护
348
+
349
+ ### 配置
350
+
351
+ ```typescript
352
+ AiGuardModule.forRoot({
353
+ piiDetection: { redact: true }, // 检测并脱敏 PII
354
+ promptInjection: { sensitivity: 'medium' }, // 检测 Prompt 注入
355
+ moderation: {
356
+ openaiApiKey: process.env.OPENAI_API_KEY, // 使用 OpenAI Moderation API
357
+ blockCategories: ['hate', 'violence'],
358
+ },
359
+ });
360
+ ```
361
+
362
+ ### 使用
363
+
364
+ ```typescript
365
+ // 手动检查
366
+ const result = await guardService.check(userInput);
367
+ if (!result.allowed) throw new HttpException(400, '内容不符合规范');
368
+ const safeInput = result.sanitizedInput; // PII 已脱敏的版本
369
+
370
+ // 或直接 throw 方式:
371
+ const safeInput = await guardService.checkOrThrow(userInput);
372
+ ```
373
+
374
+ ---
375
+
376
+ ## 最佳实践
377
+
378
+ ### 1. 本地开发使用 Ollama(零费用)
379
+
380
+ ```typescript
381
+ AiModule.forRoot({
382
+ providers: [
383
+ { name: 'ollama', provider: OllamaProvider, config: {}, default: true },
384
+ { name: 'openai', provider: OpenAIProvider, config: { apiKey: env.OPENAI_API_KEY! } },
385
+ ],
386
+ fallback: true, // Ollama 不可用时自动切换 OpenAI
387
+ });
388
+ ```
389
+
390
+ ### 2. 缓存 AI 响应节省费用
391
+
392
+ ```typescript
393
+ const result = await cacheService.getOrSet(
394
+ `ai:${hash(messages)}`,
395
+ () => aiService.complete({ messages }),
396
+ 60_000, // 60 秒缓存
397
+ );
398
+ ```
399
+
400
+ ### 3. 追踪 Token 用量和成本
401
+
402
+ 每个 `AiResponse` 包含 `usage`:
403
+
404
+ ```typescript
405
+ const response = await aiService.complete({ messages });
406
+ console.log(response.usage);
407
+ // { promptTokens: 120, completionTokens: 50, totalTokens: 170, estimatedCostUsd: 0.00043 }
408
+ ```
409
+
410
+ ### 4. 生产环境始终检查用户输入
411
+
412
+ ```typescript
413
+ const safeMessage = await guardService.checkOrThrow(userInput);
414
+ ```
415
+
416
+ ---
417
+
418
+ ## AI 能力覆盖
419
+
420
+ | 能力项 | 官方模块 |
421
+ |---|---|
422
+ | 多 LLM Provider | `AiModule` |
423
+ | 文本嵌入 | `EmbeddingModule` |
424
+ | 知识库/向量搜索 | `VectorStoreModule` |
425
+ | RAG 检索管道 | `RagModule` |
426
+ | 会话记忆 | `ConversationModule` |
427
+ | Prompt 模板管理 | `PromptModule` |
428
+ | Tool/Function Calling | `AiModule`(ToolRegistry + @AiTool()) |
429
+ | 内容安全 | `AiGuardModule` |
430
+ | MCP 协议服务端 | `McpModule` |
431
+ | AI 工作流编排 | Demo 层(ai-platform-mvp 示例) |
432
+
433
+ ---
434
+
435
+ ## 相关资源
436
+
437
+ - [AI 模块示例](../examples/05-ai/README_ZH.md)
438
+ - [AI 中台 MVP Demo](../examples/05-ai/ai-platform-mvp/README.md)
439
+ - [Ollama 官方文档](https://ollama.ai)
440
+ - [OpenAI API 文档](https://platform.openai.com/docs)
441
+ - [MCP 协议规范](https://modelcontextprotocol.io)
@@ -36,3 +36,46 @@
36
36
  - **可观测**:建议接入健康检查路由(GET `/health`)以及基础指标导出(如 Prometheus)。
37
37
  - **灰度发布**:合理配置中间件,使得灰度流量可按 Header/Token 进行分流。
38
38
 
39
+ ---
40
+
41
+ ## AI 模块最佳实践(v2.0.0)
42
+
43
+ ### 本地开发使用 Ollama(零费用)
44
+
45
+ ```typescript
46
+ AiModule.forRoot({
47
+ providers: [
48
+ { name: 'ollama', provider: OllamaProvider, config: {}, default: true },
49
+ { name: 'openai', provider: OpenAIProvider, config: { apiKey: env.OPENAI_API_KEY! } },
50
+ ],
51
+ fallback: true,
52
+ });
53
+ ```
54
+
55
+ ### 缓存 AI 响应降低费用
56
+
57
+ ```typescript
58
+ const key = `ai:${hash(messages)}`;
59
+ return cacheService.getOrSet(key, () => aiService.complete({ messages }), 300_000);
60
+ ```
61
+
62
+ ### 追踪 Token 用量
63
+
64
+ ```typescript
65
+ const res = await aiService.complete({ messages });
66
+ metricsService.increment('ai.tokens', res.usage.totalTokens);
67
+ metricsService.gauge('ai.cost_usd', res.usage.estimatedCostUsd ?? 0);
68
+ ```
69
+
70
+ ### 生产环境必须检查输入
71
+
72
+ ```typescript
73
+ const safeInput = await guardService.checkOrThrow(userMessage);
74
+ ```
75
+
76
+ ### RAG 分块策略
77
+
78
+ - 纯文本 → `TextChunker`(chunkSize: 512,chunkOverlap: 50)
79
+ - Markdown → `MarkdownChunker`(按标题分割)
80
+ - topK 建议 3-5,minScore 建议 0.5
81
+
@@ -0,0 +1,23 @@
1
+ # 数据库(Database)
2
+
3
+ 本页用于汇总 Bun Server Framework 的数据库相关文档入口。
4
+
5
+ ## 核心数据库能力
6
+
7
+ - `DatabaseModule`:连接管理、健康检查、SQL 访问。
8
+ - ORM 支持:实体元数据、Repository、查询辅助能力。
9
+ - 事务支持:声明式事务边界与回滚处理。
10
+
11
+ ## 推荐阅读
12
+
13
+ - [API 参考](./api.md)
14
+ - [最佳实践](./best-practices.md)
15
+ - [测试指南](./testing.md)
16
+ - [迁移指南](./migration.md)
17
+
18
+ ## 常见接入步骤
19
+
20
+ 1. 在根模块配置 `DatabaseModule.forRoot(...)`。
21
+ 2. 按业务模块定义实体与仓储。
22
+ 3. 多步骤写操作使用事务保证一致性。
23
+ 4. 配置健康检查并监控连接池指标。
package/docs/zh/guide.md CHANGED
@@ -911,7 +911,46 @@ class OrderService {
911
911
 
912
912
  详细文档请参阅 [微服务架构](./microservice.md)。
913
913
 
914
- ## 13. 测试建议
914
+ ## 13. AI 模块(v2.0.0)
915
+
916
+ v2.0.0 起,框架内置 9 个官方 AI 模块,提供构建 LLM 应用所需的完整基础设施。
917
+
918
+ ### 快速配置
919
+
920
+ ```typescript
921
+ import {
922
+ AiModule, OllamaProvider,
923
+ ConversationModule, MemoryConversationStore,
924
+ AiGuardModule,
925
+ } from '@dangao/bun-server';
926
+
927
+ AiModule.forRoot({
928
+ providers: [{ name: 'ollama', provider: OllamaProvider, config: {}, default: true }],
929
+ fallback: true,
930
+ });
931
+
932
+ ConversationModule.forRoot({ store: new MemoryConversationStore(), maxMessages: 50 });
933
+ AiGuardModule.forRoot({ piiDetection: true, promptInjection: { sensitivity: 'medium' } });
934
+ ```
935
+
936
+ 详细文档请参阅 [AI 模块指南](./ai.md)。
937
+
938
+ ### AI 模块一览
939
+
940
+ | 模块 | 功能 |
941
+ |------|------|
942
+ | `AiModule` | LLM Provider、流式响应、Tool Calling |
943
+ | `ConversationModule` | 多轮会话历史管理 |
944
+ | `PromptModule` | Prompt 模板 + 版本管理 |
945
+ | `EmbeddingModule` | 文本向量嵌入 |
946
+ | `VectorStoreModule` | 向量相似度搜索 |
947
+ | `RagModule` | 完整 RAG 管道 |
948
+ | `McpModule` | MCP 协议服务端 |
949
+ | `AiGuardModule` | PII 检测、内容审核 |
950
+
951
+ ---
952
+
953
+ ## 14. 测试建议
915
954
 
916
955
  - 使用 `tests/utils/test-port.ts` 获取自增端口,避免本地冲突。
917
956
  - 在 `afterEach` 钩子中调用 `RouteRegistry.getInstance().clear()` 和
@@ -85,3 +85,42 @@
85
85
 
86
86
  完成以上步骤即可平滑过渡到最新的 Bun Server Framework。若遇到破坏性变更,可查阅 changelog 或提交 issue。
87
87
 
88
+ ---
89
+
90
+ ## v1.x → v2.0 迁移说明
91
+
92
+ **v2.0.0 完全向后兼容**,无破坏性变更。升级只需:
93
+
94
+ ```bash
95
+ bun add @dangao/bun-server@2.0.0
96
+ ```
97
+
98
+ ### 新增内容
99
+
100
+ v2.0.0 以**纯追加**方式新增 9 个官方 AI 模块:
101
+
102
+ ```typescript
103
+ // 新增导入(按需使用,不影响现有代码)
104
+ import {
105
+ AiModule, // LLM 统一接入
106
+ ConversationModule, // 会话记忆
107
+ PromptModule, // Prompt 模板
108
+ EmbeddingModule, // 文本嵌入
109
+ VectorStoreModule, // 向量存储
110
+ RagModule, // RAG 管道
111
+ McpModule, // MCP 服务端
112
+ AiGuardModule, // 内容安全
113
+ } from '@dangao/bun-server';
114
+ ```
115
+
116
+ 详细使用方法参阅 [AI 模块指南](./ai.md)。
117
+
118
+ ### 各版本破坏性变更说明
119
+
120
+ | 版本 | 破坏性变更 |
121
+ |------|----------|
122
+ | v2.0.0 | 无 |
123
+ | v1.9.0 | EventModule:`@OnEvent()` 监听类现在在 `app.listen()` 时自动扫描,删除手动调用 `EventModule.initializeListeners()` |
124
+ | v1.8.0 | ClusterManager:`start()` 接受选项对象参数 |
125
+ | v1.2.0 | `ContextService.getContext()` 返回 `Context \| undefined`,不再抛出异常 |
126
+
@@ -0,0 +1,23 @@
1
+ # 安全(Security)
2
+
3
+ 本页用于汇总 Bun Server Framework 的安全相关文档入口。
4
+
5
+ ## 核心安全能力
6
+
7
+ - `SecurityModule`:认证流程、鉴权检查、Guard 集成。
8
+ - `auth` 模块:JWT/OAuth2 提供器与令牌处理能力。
9
+ - Guards:路由级访问控制与角色校验。
10
+
11
+ ## 推荐阅读
12
+
13
+ - [API 参考](./api.md)
14
+ - [Guards](./guards.md)
15
+ - [最佳实践](./best-practices.md)
16
+ - [错误处理](./error-handling.md)
17
+
18
+ ## 常见接入步骤
19
+
20
+ 1. 在根模块配置 `SecurityModule.forRoot(...)`。
21
+ 2. 在受保护路由上使用 `@Auth()` 或 Guard。
22
+ 3. 密钥放入环境变量,不要写入源码。
23
+ 4. 对敏感接口开启请求日志与限流。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dangao/bun-server",
3
- "version": "1.12.1",
3
+ "version": "2.0.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  ],
34
34
  "author": "dangaogit",
35
35
  "license": "MIT",
36
- "homepage": "https://github.com/dangaogit/bun-server",
36
+ "homepage": "https://bun-server.dangaogm.workers.dev/",
37
37
  "bugs": {
38
38
  "url": "https://github.com/dangaogit/bun-server/issues"
39
39
  },
@@ -57,7 +57,7 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "reflect-metadata": "^0.2.2",
60
- "@dangao/logsmith": "0.1.1",
60
+ "@dangao/logsmith": "0.2.0",
61
61
  "@dangao/nacos-client": "0.1.1"
62
62
  }
63
63
  }