@h-ai/cli 0.1.0-alpha.32 → 0.1.0-alpha.34

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.32",
4
+ "version": "0.1.0-alpha.34",
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.32"
37
+ "@h-ai/core": "0.1.0-alpha.34"
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.32",
3
+ "version": "0.1.0-alpha.34",
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,12 +85,14 @@ 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` 做业务作用域隔离 |
86
96
  | Retrieval/RAG | `ai.retrieval.retrieve` / `ai.rag.query` | Retrieval source 先注册或由配置预置 |
87
97
  | Knowledge | `ai.knowledge.setup/ingest/ask` | 入库前会调用 datapipe 清洗分块 |
88
98
  | Context | `ai.context.createManager` | 编排 LLM + Memory + RAG + 压缩 |
@@ -168,6 +178,8 @@ await server.connect(new StreamableHTTPServerTransport({ sessionIdGenerator: cry
168
178
 
169
179
  ## 记忆、RAG 与知识库
170
180
 
181
+ `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 完全一致。
182
+
171
183
  ```ts
172
184
  const enriched = await ai.memory.injectMemories(messages, { objectId: 'user-001', topK: 5 })
173
185
  if (!enriched.success) return enriched
@@ -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
 
@@ -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