@h-ai/cli 0.1.0-alpha.33 → 0.1.0-alpha.35
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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ai/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.0-alpha.
|
|
4
|
+
"version": "0.1.0-alpha.35",
|
|
5
5
|
"description": "Hai Framework CLI for project scaffolding and code generation.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"keywords": [
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"ora": "^9.1.0",
|
|
35
35
|
"prompts": "^2.4.2",
|
|
36
36
|
"yaml": "^2.7.0",
|
|
37
|
-
"@h-ai/core": "0.1.0-alpha.
|
|
37
|
+
"@h-ai/core": "0.1.0-alpha.35"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/fs-extra": "^11.0.4",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "{{projectName}}",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.35",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "{{#if_eq appType 'admin'}}Enterprise management system built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'website'}}Enterprise website built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'h5'}}Mobile H5 app built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'api'}}REST API service built with hai Agent Framework{{/if_eq}}{{#if_eq appType 'mobile-app'}}Mobile app built with hai Agent Framework{{/if_eq}}",
|
|
6
6
|
"keywords": ["hai", {{#unless isSvelteOnlyApp}}"sveltekit", {{/unless}}"svelte5", "{{appType}}"],
|
|
@@ -49,8 +49,11 @@ llm:
|
|
|
49
49
|
apiKey: ${HAI_AI_LLM_API_KEY:}
|
|
50
50
|
baseUrl: ${HAI_AI_LLM_BASE_URL:https://api.openai.com/v1}
|
|
51
51
|
model: ${HAI_AI_LLM_MODEL:gpt-4o-mini}
|
|
52
|
+
api: chat # chat(默认)| responses | anthropic——底层协议,对使用方透明
|
|
52
53
|
timeout: 60000
|
|
53
54
|
tempModelCacheTtl: 600000 # 临时模型客户端缓存 TTL(毫秒,默认 10 分钟)
|
|
55
|
+
models: # 可为单个模型指定协议(responses / anthropic)
|
|
56
|
+
- { id: claude, model: claude-3-5-sonnet-latest, api: anthropic }
|
|
54
57
|
scenarios:
|
|
55
58
|
chat: fast
|
|
56
59
|
reasoning: strong
|
|
@@ -67,6 +70,11 @@ knowledge:
|
|
|
67
70
|
mode: markdown
|
|
68
71
|
maxSize: 1500
|
|
69
72
|
overlap: 200
|
|
73
|
+
|
|
74
|
+
# 可选:真·mem0ai/oss 引擎(嵌入式,LLM/Embedder 从 llm 配置提取,向量库复用底层 vecdb 后端或退回 mem0 自带存储)
|
|
75
|
+
memory:
|
|
76
|
+
provider: mem0
|
|
77
|
+
defaultTopK: 10
|
|
70
78
|
```
|
|
71
79
|
|
|
72
80
|
`ai.config` 是脱敏快照;`apiKey`、`privateKey`、URL 内嵌凭证会被隐藏。
|
|
@@ -77,15 +85,18 @@ knowledge:
|
|
|
77
85
|
| --- | --- | --- |
|
|
78
86
|
| 非流式对话 | `ai.llm.chat({ messages })` | OpenAI 兼容 Chat Completion |
|
|
79
87
|
| 流式对话 | `ai.llm.chatStream({ messages })` | 返回 `AsyncIterable` |
|
|
88
|
+
| 多协议 | 模型 `api: chat/responses/anthropic` | 底层走 Chat Completions / Responses / Anthropic,公共形状不变 |
|
|
89
|
+
| 请求取消 | `ai.llm.chat({ messages, signal })` | 传 `AbortSignal`,`abort()` 立即停上游生成 |
|
|
80
90
|
| 临时模型 | `ai.llm.chat({ messages, tempModel })` | 单次请求级临时端点,客户端按 TTL 缓存 |
|
|
81
91
|
| 工具定义 | `ai.tools.define(...)` | Zod schema 转 JSON Schema |
|
|
82
92
|
| 工具执行 | `registry.executeAll(toolCalls)` | 支持并行执行 |
|
|
83
93
|
| MCP 服务 | `createMcpServer(...)` | 按需连接 HTTP/SSE/Stdio transport |
|
|
84
94
|
| Embedding | `ai.embedding.embedText(text)` | 批量用 `embedBatch` |
|
|
85
|
-
| 记忆 | `ai.memory.extract/recall/injectMemories` | 用 `objectId`
|
|
95
|
+
| 记忆 | `ai.memory.extract/recall/injectMemories` | 用 `objectId` 做主体隔离,`scope` 做业务作用域隔离;scope 隔离越细,`candidateMultiplier` 调大以防漏召回 |
|
|
96
|
+
| 角色人格 | `ai.persona.save/get/compose` | 定义 AI 身份(systemPrompt + traits),`compose` 组合系统提示词,`scope: { personaId }` 关联长期记忆 |
|
|
86
97
|
| Retrieval/RAG | `ai.retrieval.retrieve` / `ai.rag.query` | Retrieval source 先注册或由配置预置 |
|
|
87
98
|
| Knowledge | `ai.knowledge.setup/ingest/ask` | 入库前会调用 datapipe 清洗分块 |
|
|
88
|
-
| Context | `ai.context.createManager` | 编排 LLM + Memory + RAG +
|
|
99
|
+
| Context | `ai.context.createManager` | 编排 LLM + Memory + RAG + 压缩;`manager.consolidate()` 把会话固化为长期记忆 |
|
|
89
100
|
| A2A | `ai.a2a.registerExecutor/handleRequest` | 延迟初始化 SDK handler |
|
|
90
101
|
|
|
91
102
|
## LLM + 工具调用
|
|
@@ -168,6 +179,8 @@ await server.connect(new StreamableHTTPServerTransport({ sessionIdGenerator: cry
|
|
|
168
179
|
|
|
169
180
|
## 记忆、RAG 与知识库
|
|
170
181
|
|
|
182
|
+
`memory.provider` 默认为 `native`(推荐):HAI 原生引擎,复用 vecdb/reldb/LLM/Embedding,`extract` 采用 **Mem0 式批量合并**(一次 LLM 调用对整批事实与相关既有记忆做 ADD/UPDATE/DELETE/NONE,支持 `category`)。`mem0` 则直接使用 `mem0ai/oss` 的 `Memory` 引擎:LLM/Embedder 从 `llm` 配置提取(OpenAI 兼容),向量库从底层 vecdb 后端提取(qdrant/pgvector 复用,lancedb/chroma 退回 mem0 自带 in-memory 存储)。两者对外 `ai.memory.*` API 完全一致。
|
|
183
|
+
|
|
171
184
|
```ts
|
|
172
185
|
const enriched = await ai.memory.injectMemories(messages, { objectId: 'user-001', topK: 5 })
|
|
173
186
|
if (!enriched.success) return enriched
|
|
@@ -210,6 +223,25 @@ const reply = await managerResult.data.chat('你好')
|
|
|
210
223
|
await managerResult.data.save()
|
|
211
224
|
```
|
|
212
225
|
|
|
226
|
+
### 真实对话状态(Conversation Commit Layer)
|
|
227
|
+
|
|
228
|
+
`turnCommit: 'manual'` 时,`chat` / `chatStream` 不自动写入生成文本,只返回 `turnId`;由调用方提交**实际发生的内容**(TTS 播放 / 主持人打断等场景):
|
|
229
|
+
|
|
230
|
+
```ts
|
|
231
|
+
const m = ai.context.createManager({ turnCommit: 'manual', scope }).data
|
|
232
|
+
for await (const ev of m.chatStream('展开讲讲')) {
|
|
233
|
+
if (ev.type === 'delta') feedTts(ev.text)
|
|
234
|
+
else if (ev.type === 'done') {
|
|
235
|
+
interrupted
|
|
236
|
+
? await m.interruptTurn(ev.turnId, { text: spokenSoFar }) // 只提交播放出去的部分
|
|
237
|
+
: await m.commitTurn(ev.turnId) // 完整提交
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
- 只有 `committed` 的内容进入上下文与记忆;`getTurns()` 可观测 `generated` / `committed` / `status`。
|
|
243
|
+
|
|
244
|
+
|
|
213
245
|
## SvelteKit API 端点模式
|
|
214
246
|
|
|
215
247
|
```ts
|
|
@@ -100,6 +100,12 @@ Embedding OpenAI 客户端按 `apiKey + baseURL + timeout` 缓存;同一 key
|
|
|
100
100
|
|
|
101
101
|
推荐所有记忆操作带 `objectId`,避免不同用户或 Agent 混写。
|
|
102
102
|
|
|
103
|
+
Memory 后端通过 `memory.provider` 选择:
|
|
104
|
+
|
|
105
|
+
- `native`(默认):HAI 原生引擎,复用 vecdb/reldb/LLM/Embedding。`extract` 采用 Mem0 式批量合并(ADD/UPDATE/DELETE/NONE + `category`);`maxEntriesPerObject`(单主体配额)/`maxEntriesGlobal`(全局上限)/`recencyDecay`/`embeddingEnabled`/`writebackRelatedTopK` 作用于此后端;淘汰按 `objectId` 分区。
|
|
106
|
+
- `mem0`:直接使用 `mem0ai/oss` 的 `Memory` 引擎(嵌入式)。LLM/Embedder 从 `llm` 配置提取(OpenAI 兼容,场景模型 `extraction` / `embedding`);向量库从底层 vecdb 后端提取(`storeProvider.getVectorBackend()`),qdrant/pgvector 复用同一后端,lancedb/chroma 退回 mem0 自带 in-memory 存储;历史默认禁用。
|
|
107
|
+
- 两者对外 API(extract/recall/injectMemories/add/update/get/remove/list/listPage/clear)完全一致;`objectId` 隔离不同主体的记忆,`scope`(key-value)用于业务作用域隔离(recall/list/listPage/clear 均严格过滤)。mem0 后端 `update` 涉及 type/importance/metadata 时会重建记忆并重新分配 `id`。
|
|
108
|
+
|
|
103
109
|
## Retrieval / RAG
|
|
104
110
|
|
|
105
111
|
```ts
|
|
@@ -144,11 +150,11 @@ const result = await ai.rag.query('核心架构是什么?', {
|
|
|
144
150
|
- `scope: { objectId, sessionId }`
|
|
145
151
|
- `systemPrompt`
|
|
146
152
|
- `compress: { auto, strategy, maxTokens, preserveLastN }`
|
|
147
|
-
- `memory: { enable, enableExtract, topK }
|
|
153
|
+
- `memory: { enable, enableExtract, scope, types, minImportance, topK, position, extractionModel, extractionSystemPrompt }`(scope/types 等完整透传给 Memory 的 recall/extract)
|
|
148
154
|
- `rag: { enable, sources, topK, minScore }`
|
|
149
155
|
- `tools`
|
|
150
156
|
|
|
151
|
-
常用方法:`addMessage`、`getMessages`、`getTokenUsage`、`chat`、`chatStream`、`save`、`reset
|
|
157
|
+
常用方法:`addMessage`、`getMessages`、`getTokenUsage`、`chat`、`chatStream`、`save`、`reset`、`flush`(等待后台记忆提取完成,`save` 前自动调用)、`pendingMemoryTasks`(挂起提取任务数)。`chat/chatStream` 支持 `signal` 取消。
|
|
152
158
|
|
|
153
159
|
## File / Rerank / Reasoning
|
|
154
160
|
|
|
@@ -413,6 +413,25 @@ const p = usePlatform()
|
|
|
413
413
|
/>
|
|
414
414
|
```
|
|
415
415
|
|
|
416
|
+
#### Charts 图表
|
|
417
|
+
|
|
418
|
+
`Chart type='line'` 默认使用 LayerChart 原生折线图;监控看板类场景需要“分段线 + 圆点 + 最近点 hover + 竖向参考线”时,使用 `lineVariant='segmented-point'`:
|
|
419
|
+
|
|
420
|
+
```svelte
|
|
421
|
+
<Chart
|
|
422
|
+
type='line'
|
|
423
|
+
data={trendData}
|
|
424
|
+
x='label'
|
|
425
|
+
y={['rateLimit', 'circuitBreak']}
|
|
426
|
+
series={trendSeries}
|
|
427
|
+
lineVariant='segmented-point'
|
|
428
|
+
tooltipMode='nearest'
|
|
429
|
+
showCrosshair
|
|
430
|
+
legend
|
|
431
|
+
grid
|
|
432
|
+
/>
|
|
433
|
+
```
|
|
434
|
+
|
|
416
435
|
#### CRUD 场景组件
|
|
417
436
|
|
|
418
437
|
| 组件 | 说明 |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hai-vecdb
|
|
3
|
-
description: 使用 @h-ai/vecdb 进行向量数据库操作(LanceDB/pgvector/Qdrant)的集合管理与向量增删改查;当需求涉及向量存储、相似度搜索、嵌入检索或语义搜索时使用。
|
|
3
|
+
description: 使用 @h-ai/vecdb 进行向量数据库操作(LanceDB/pgvector/Qdrant/Chroma)的集合管理与向量增删改查;当需求涉及向量存储、相似度搜索、嵌入检索或语义搜索时使用。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# hai-vecdb
|
|
7
7
|
|
|
8
|
-
> `@h-ai/vecdb` 提供统一的向量数据库操作接口,支持 LanceDB、pgvector、Qdrant,包含集合管理和向量 CRUD/搜索。
|
|
8
|
+
> `@h-ai/vecdb` 提供统一的向量数据库操作接口,支持 LanceDB、pgvector、Qdrant、Chroma,包含集合管理和向量 CRUD/搜索。
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -18,7 +18,7 @@ description: 使用 @h-ai/vecdb 进行向量数据库操作(LanceDB/pgvector/Q
|
|
|
18
18
|
## 适用场景
|
|
19
19
|
|
|
20
20
|
- 新增或修改向量数据库访问逻辑(集合管理/向量插入/搜索)
|
|
21
|
-
- 接入不同向量数据库后端(LanceDB / pgvector / Qdrant)
|
|
21
|
+
- 接入不同向量数据库后端(LanceDB / pgvector / Qdrant / Chroma)
|
|
22
22
|
- 基于 `HaiVecdbError` 做错误分支处理
|
|
23
23
|
- 构建 RAG、语义搜索、知识库等 AI 场景
|
|
24
24
|
|
|
@@ -45,6 +45,16 @@ path: ./data/vecdb
|
|
|
45
45
|
# type: qdrant
|
|
46
46
|
# url: ${HAI_VECDB_QDRANT_URL:http://localhost:6333}
|
|
47
47
|
# apiKey: ${HAI_VECDB_QDRANT_API_KEY:}
|
|
48
|
+
|
|
49
|
+
# Chroma(嵌入式:提供 path 且无 url 时自动拉起本地 `chroma run` 服务并持久化)
|
|
50
|
+
# type: chroma
|
|
51
|
+
# path: ./data/chroma
|
|
52
|
+
# Chroma(直连已有服务,不拉起进程)
|
|
53
|
+
# type: chroma
|
|
54
|
+
# url: ${HAI_VECDB_CHROMA_URL:http://localhost:8000}
|
|
55
|
+
# apiKey: ${HAI_VECDB_CHROMA_API_KEY:}
|
|
56
|
+
# serverCommand: chroma # 嵌入式模式拉起服务的可执行命令(默认 chroma,来自 chromadb 包)
|
|
57
|
+
# startupTimeout: 30000 # 嵌入式服务就绪等待超时(毫秒)
|
|
48
58
|
operationLog:
|
|
49
59
|
read: false # collection.exists/info/list, vector.search/count
|
|
50
60
|
write: false # collection.create/drop, vector.insert/upsert/delete
|
|
@@ -158,6 +168,8 @@ await vecdb.vector.delete('docs', ['doc-1', 'doc-2'])
|
|
|
158
168
|
|
|
159
169
|
> 空批量 `insert/upsert/delete` 会被视为 no-op;写入与搜索会校验向量维度,不匹配时返回 `HaiVecdbError.DIMENSION_MISMATCH`。Qdrant `collection.exists()` 仅在 404 时返回 `false`,网络异常会返回查询错误而不是误判不存在。
|
|
160
170
|
|
|
171
|
+
> Chroma 在 Node 端只有 HTTP 客户端(无进程内嵌入式)。嵌入式模式(提供 `path` 且无 `url`)下 `vecdb.init` 通过 `serverCommand`(默认 `chroma`,来自可选依赖 `chromadb`)拉起本地服务,`vecdb.close` 时关闭进程;服务命令不可用或就绪超时时 `init` 返回 `HaiVecdbError.CONNECTION_FAILED`。直连模式提供 `url` 即可,不拉起进程。
|
|
172
|
+
|
|
161
173
|
**VectorDocument**:
|
|
162
174
|
|
|
163
175
|
```typescript
|