@zhin.js/ai 1.0.1 → 1.0.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/CHANGELOG.md +6 -0
- package/README.md +198 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
package/README.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# @zhin.js/ai
|
|
2
|
+
|
|
3
|
+
框架无关的 AI 引擎,提供 LLM Provider 抽象、Agent 循环、会话管理、记忆与压缩等能力。
|
|
4
|
+
|
|
5
|
+
不依赖任何 IM/Bot 概念,可独立用于 Web 后端、CLI 工具、自动化脚本等任意 Node.js 应用。
|
|
6
|
+
|
|
7
|
+
## 核心模块
|
|
8
|
+
|
|
9
|
+
### Provider(LLM 提供者)
|
|
10
|
+
|
|
11
|
+
统一的 LLM 提供者接口,内置多种主流模型支持:
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { OpenAIProvider, OllamaProvider, AnthropicProvider } from '@zhin.js/ai'
|
|
15
|
+
|
|
16
|
+
const provider = new OpenAIProvider({
|
|
17
|
+
apiKey: 'sk-...',
|
|
18
|
+
baseUrl: 'https://api.openai.com/v1',
|
|
19
|
+
model: 'gpt-4o',
|
|
20
|
+
contextWindow: 128000,
|
|
21
|
+
models: ['gpt-4o', 'gpt-4o-mini'],
|
|
22
|
+
capabilities: { vision: true, streaming: true, toolCalling: true },
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const response = await provider.chat({
|
|
26
|
+
model: 'gpt-4o',
|
|
27
|
+
messages: [{ role: 'user', content: '你好' }],
|
|
28
|
+
})
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
内置 Provider:
|
|
32
|
+
|
|
33
|
+
| Provider | 说明 |
|
|
34
|
+
|----------|------|
|
|
35
|
+
| `OpenAIProvider` | OpenAI 及兼容 API |
|
|
36
|
+
| `DeepSeekProvider` | DeepSeek(继承 OpenAI) |
|
|
37
|
+
| `MoonshotProvider` | Moonshot / Kimi(继承 OpenAI) |
|
|
38
|
+
| `ZhipuProvider` | 智谱 GLM(继承 OpenAI) |
|
|
39
|
+
| `AnthropicProvider` | Anthropic Claude |
|
|
40
|
+
| `OllamaProvider` | Ollama 本地模型 |
|
|
41
|
+
|
|
42
|
+
### Agent(Agent 引擎)
|
|
43
|
+
|
|
44
|
+
无状态的多轮 tool-calling 循环引擎:
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { Agent, createAgent } from '@zhin.js/ai'
|
|
48
|
+
|
|
49
|
+
const agent = createAgent(provider, logger, {
|
|
50
|
+
maxIterations: 5,
|
|
51
|
+
timeout: 60000,
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
const result = await agent.run({
|
|
55
|
+
messages: [
|
|
56
|
+
{ role: 'system', content: '你是一个助手' },
|
|
57
|
+
{ role: 'user', content: '今天天气怎么样?' },
|
|
58
|
+
],
|
|
59
|
+
tools: [weatherTool],
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### SessionManager(会话管理)
|
|
64
|
+
|
|
65
|
+
管理对话会话的创建、检索和过期:
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { createMemorySessionManager, createDatabaseSessionManager } from '@zhin.js/ai'
|
|
69
|
+
|
|
70
|
+
// 内存模式
|
|
71
|
+
const sessionManager = createMemorySessionManager({
|
|
72
|
+
maxHistory: 50,
|
|
73
|
+
expireMs: 3600000,
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
// 数据库持久化模式
|
|
77
|
+
const dbSessionManager = createDatabaseSessionManager(databaseModel, {
|
|
78
|
+
maxHistory: 50,
|
|
79
|
+
expireMs: 3600000,
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### ContextManager(上下文管理)
|
|
84
|
+
|
|
85
|
+
管理消息记录和上下文摘要:
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { createContextManager } from '@zhin.js/ai'
|
|
89
|
+
|
|
90
|
+
const contextManager = createContextManager(logger, {
|
|
91
|
+
enabled: true,
|
|
92
|
+
maxMessagesBeforeSummary: 100,
|
|
93
|
+
summaryRetentionDays: 30,
|
|
94
|
+
})
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### ConversationMemory(对话记忆)
|
|
98
|
+
|
|
99
|
+
双层记忆系统:短期滑动窗口 + 长期链式摘要。
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { ConversationMemory } from '@zhin.js/ai'
|
|
103
|
+
|
|
104
|
+
const memory = new ConversationMemory(provider, logger, {
|
|
105
|
+
shortTermWindow: 5,
|
|
106
|
+
minTopicRounds: 3,
|
|
107
|
+
topicChangeThreshold: 0.5,
|
|
108
|
+
})
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Compaction(上下文压缩)
|
|
112
|
+
|
|
113
|
+
管理上下文窗口,防止 token 超限:
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import {
|
|
117
|
+
estimateTokens,
|
|
118
|
+
evaluateContextWindowGuard,
|
|
119
|
+
pruneHistoryForContext,
|
|
120
|
+
compactSession,
|
|
121
|
+
} from '@zhin.js/ai'
|
|
122
|
+
|
|
123
|
+
const guard = evaluateContextWindowGuard({
|
|
124
|
+
messages: history,
|
|
125
|
+
maxContextTokens: 128000,
|
|
126
|
+
maxHistoryShare: 0.5,
|
|
127
|
+
})
|
|
128
|
+
// guard.status: 'ok' | 'warning' | 'critical'
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Output(输出解析)
|
|
132
|
+
|
|
133
|
+
将 AI 文本回复解析为结构化元素:
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { parseOutput, renderToPlainText } from '@zhin.js/ai'
|
|
137
|
+
|
|
138
|
+
const elements = parseOutput(aiResponse)
|
|
139
|
+
const text = renderToPlainText(elements)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
支持的元素类型:`TextElement`、`ImageElement`、`AudioElement`、`VideoElement`、`CardElement`、`FileElement`。
|
|
143
|
+
|
|
144
|
+
### RateLimiter(速率限制)
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
import { RateLimiter } from '@zhin.js/ai'
|
|
148
|
+
|
|
149
|
+
const limiter = new RateLimiter({
|
|
150
|
+
maxRequests: 10,
|
|
151
|
+
windowMs: 60000,
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
const result = limiter.check('user-123')
|
|
155
|
+
if (!result.allowed) {
|
|
156
|
+
console.log(`请等待 ${result.retryAfterMs}ms`)
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Storage(存储抽象)
|
|
161
|
+
|
|
162
|
+
统一存储后端,支持内存和数据库模式,可在运行时热切换:
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { MemoryStorageBackend, createSwappableBackend } from '@zhin.js/ai'
|
|
166
|
+
|
|
167
|
+
const backend = createSwappableBackend(new MemoryStorageBackend())
|
|
168
|
+
|
|
169
|
+
// 运行时切换到数据库
|
|
170
|
+
backend.swap(new DatabaseStorageBackend(model))
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## 主要导出
|
|
174
|
+
|
|
175
|
+
| 导出 | 说明 |
|
|
176
|
+
|------|------|
|
|
177
|
+
| `OpenAIProvider` / `AnthropicProvider` / `OllamaProvider` | LLM 提供者 |
|
|
178
|
+
| `Agent` / `createAgent` | Agent 引擎 |
|
|
179
|
+
| `SessionManager` | 会话管理 |
|
|
180
|
+
| `ContextManager` | 上下文管理 |
|
|
181
|
+
| `ConversationMemory` | 对话记忆 |
|
|
182
|
+
| `compactSession` / `pruneHistoryForContext` | 上下文压缩 |
|
|
183
|
+
| `parseOutput` / `renderToPlainText` | 输出解析 |
|
|
184
|
+
| `RateLimiter` | 速率限制 |
|
|
185
|
+
| `detectTone` | 情绪检测 |
|
|
186
|
+
| `MemoryStorageBackend` / `createSwappableBackend` | 存储抽象 |
|
|
187
|
+
|
|
188
|
+
## 安装
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
pnpm add @zhin.js/ai
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
> 也可通过 `zhin.js` 或 `@zhin.js/agent` 间接引入。
|
|
195
|
+
|
|
196
|
+
## 许可证
|
|
197
|
+
|
|
198
|
+
MIT License
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/ai",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Framework-agnostic AI engine: providers, agent loop, sessions, memory, compaction",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@zhin.js/logger": "0.1.
|
|
16
|
+
"@zhin.js/logger": "0.1.25"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/node": "^24.3.0",
|