@zooique/memora 0.1.0 → 0.2.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.
- package/dist/agent/agent.d.ts +155 -23
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +386 -124
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +8 -2
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +17 -6
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +1 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +5 -3
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +1 -1
- package/dist/agent/builtinTools.js +2 -2
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/constants.d.ts +27 -6
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +27 -6
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +35 -9
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +138 -25
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/loop.d.ts +41 -11
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +143 -61
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +100 -0
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -0
- package/dist/agent/managers/archiveCoordinator.js +127 -0
- package/dist/agent/managers/archiveCoordinator.js.map +1 -0
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.js +1 -1
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
- package/dist/agent/managers/configManager.d.ts +13 -2
- package/dist/agent/managers/configManager.d.ts.map +1 -1
- package/dist/agent/managers/configManager.js +13 -5
- package/dist/agent/managers/configManager.js.map +1 -1
- package/dist/agent/managers/insightExtractor.d.ts +36 -3
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +48 -11
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/memoryAdvisor.d.ts +4 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +6 -4
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +113 -0
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -0
- package/dist/agent/managers/memoryDecayScheduler.js +134 -0
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +70 -10
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +97 -23
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +77 -0
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -0
- package/dist/agent/managers/sessionArchiver.js +175 -0
- package/dist/agent/managers/sessionArchiver.js.map +1 -0
- package/dist/agent/managers/sessionManager.d.ts +10 -0
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +26 -5
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/workProjection.d.ts +1 -1
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +13 -10
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +1 -22
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +3 -19
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/toolExecutor.d.ts +5 -18
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +7 -7
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +8 -1
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +8 -1
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +29 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/{managers/userFactExtractor.d.ts → userFactExtractor.d.ts} +2 -2
- package/dist/agent/userFactExtractor.d.ts.map +1 -0
- package/dist/agent/userFactExtractor.js.map +1 -0
- package/dist/config/loader.d.ts +12 -4
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +13 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalTypes.js +1 -1
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +8 -6
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +2 -1
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +9 -0
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +77 -33
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +17 -3
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +6 -2
- package/dist/llm/provider.js.map +1 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +25 -9
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/hybridMerge.d.ts +54 -0
- package/dist/memory/hybridMerge.d.ts.map +1 -0
- package/dist/memory/hybridMerge.js +36 -0
- package/dist/memory/hybridMerge.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +90 -15
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +179 -28
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/loader.js +1 -1
- package/dist/memory/loader.js.map +1 -1
- package/dist/memory/projectManager.d.ts +34 -5
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +98 -62
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/recall.d.ts +7 -18
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +14 -19
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +81 -14
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/store.js +1 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +7 -1
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +5 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/userProfile.d.ts +6 -6
- package/dist/memory/userProfile.d.ts.map +1 -1
- package/dist/memory/userProfile.js +20 -15
- package/dist/memory/userProfile.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +35 -0
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +111 -2
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +17 -4
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +44 -12
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/security/pathGuard.d.ts +29 -7
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +148 -81
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillManager.d.ts +15 -0
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +25 -3
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/types.d.ts +7 -1
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/utils/errors.d.ts +26 -7
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +10 -18
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +9 -2
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +1 -1
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +8 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +14 -3
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/path.d.ts +5 -1
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +5 -1
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/safeTimer.d.ts +19 -0
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +27 -0
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/segmenter.d.ts +0 -12
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +8 -3
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +1 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +4 -2
- package/dist/utils/strings.js.map +1 -1
- package/package.json +1 -1
- package/dist/agent/managers/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/managers/userFactExtractor.js.map +0 -1
- /package/dist/agent/{managers/userFactExtractor.js → userFactExtractor.js} +0 -0
package/dist/config/loader.d.ts
CHANGED
|
@@ -18,15 +18,19 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
18
18
|
model: z.ZodString;
|
|
19
19
|
baseUrl: z.ZodOptional<z.ZodString>;
|
|
20
20
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
21
|
+
/** 该 Provider 的 temperature,未配置时回退到全局 llm.temperature */
|
|
22
|
+
temperature: z.ZodOptional<z.ZodNumber>;
|
|
21
23
|
}, "strip", z.ZodTypeAny, {
|
|
22
24
|
model: string;
|
|
23
25
|
provider: string;
|
|
24
26
|
apiKey?: string | undefined;
|
|
27
|
+
temperature?: number | undefined;
|
|
25
28
|
baseUrl?: string | undefined;
|
|
26
29
|
}, {
|
|
27
30
|
model: string;
|
|
28
31
|
provider: string;
|
|
29
32
|
apiKey?: string | undefined;
|
|
33
|
+
temperature?: number | undefined;
|
|
30
34
|
baseUrl?: string | undefined;
|
|
31
35
|
}>>>;
|
|
32
36
|
/**
|
|
@@ -74,14 +78,15 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
74
78
|
baseUrl?: string | undefined;
|
|
75
79
|
} | undefined;
|
|
76
80
|
apiKey?: string | undefined;
|
|
81
|
+
active?: string | undefined;
|
|
77
82
|
baseUrl?: string | undefined;
|
|
78
83
|
providers?: Record<string, {
|
|
79
84
|
model: string;
|
|
80
85
|
provider: string;
|
|
81
86
|
apiKey?: string | undefined;
|
|
87
|
+
temperature?: number | undefined;
|
|
82
88
|
baseUrl?: string | undefined;
|
|
83
89
|
}> | undefined;
|
|
84
|
-
active?: string | undefined;
|
|
85
90
|
}, {
|
|
86
91
|
background?: {
|
|
87
92
|
model: string;
|
|
@@ -93,15 +98,16 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
93
98
|
apiKey?: string | undefined;
|
|
94
99
|
temperature?: number | undefined;
|
|
95
100
|
model?: string | undefined;
|
|
101
|
+
active?: string | undefined;
|
|
96
102
|
provider?: string | undefined;
|
|
97
103
|
baseUrl?: string | undefined;
|
|
98
104
|
providers?: Record<string, {
|
|
99
105
|
model: string;
|
|
100
106
|
provider: string;
|
|
101
107
|
apiKey?: string | undefined;
|
|
108
|
+
temperature?: number | undefined;
|
|
102
109
|
baseUrl?: string | undefined;
|
|
103
110
|
}> | undefined;
|
|
104
|
-
active?: string | undefined;
|
|
105
111
|
}>;
|
|
106
112
|
memory: z.ZodObject<{
|
|
107
113
|
dataDir: z.ZodDefault<z.ZodString>;
|
|
@@ -157,14 +163,15 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
157
163
|
baseUrl?: string | undefined;
|
|
158
164
|
} | undefined;
|
|
159
165
|
apiKey?: string | undefined;
|
|
166
|
+
active?: string | undefined;
|
|
160
167
|
baseUrl?: string | undefined;
|
|
161
168
|
providers?: Record<string, {
|
|
162
169
|
model: string;
|
|
163
170
|
provider: string;
|
|
164
171
|
apiKey?: string | undefined;
|
|
172
|
+
temperature?: number | undefined;
|
|
165
173
|
baseUrl?: string | undefined;
|
|
166
174
|
}> | undefined;
|
|
167
|
-
active?: string | undefined;
|
|
168
175
|
};
|
|
169
176
|
security: {
|
|
170
177
|
permission: "owner" | "guest";
|
|
@@ -193,15 +200,16 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
193
200
|
apiKey?: string | undefined;
|
|
194
201
|
temperature?: number | undefined;
|
|
195
202
|
model?: string | undefined;
|
|
203
|
+
active?: string | undefined;
|
|
196
204
|
provider?: string | undefined;
|
|
197
205
|
baseUrl?: string | undefined;
|
|
198
206
|
providers?: Record<string, {
|
|
199
207
|
model: string;
|
|
200
208
|
provider: string;
|
|
201
209
|
apiKey?: string | undefined;
|
|
210
|
+
temperature?: number | undefined;
|
|
202
211
|
baseUrl?: string | undefined;
|
|
203
212
|
}> | undefined;
|
|
204
|
-
active?: string | undefined;
|
|
205
213
|
};
|
|
206
214
|
security: {
|
|
207
215
|
permission?: "owner" | "guest" | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0BxB,QAAA,MAAM,YAAY;;;;;;;QAQd;;;;;;WAMG;;;;;;YAtBL,yDAAyD;;;;;;;;;;;;;;;QAwBvD;;;;;WAKG;;QAEH;;;;;;WAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuBL;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQH,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAqBlD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BrE"}
|
package/dist/config/loader.js
CHANGED
|
@@ -18,12 +18,23 @@ import { readFile } from 'node:fs/promises';
|
|
|
18
18
|
import { resolve } from 'node:path';
|
|
19
19
|
import { homedir } from 'node:os';
|
|
20
20
|
import { z } from 'zod';
|
|
21
|
+
/**
|
|
22
|
+
* 默认上下文 token 数(120K)
|
|
23
|
+
*
|
|
24
|
+
* 模块级常量,消除 schema default 与 DEFAULT_CONFIG 的重复硬编码。
|
|
25
|
+
* 注意:与 agent/constants.ts 的 AGENT_CONSTANTS.DEFAULT_MAX_CONTEXT_TOKENS 保持一致,
|
|
26
|
+
* 但不跨层引用(config/ 不能反向依赖 agent/,详见 backend_layers_rules.md 依赖方向)。
|
|
27
|
+
* 修改时需同步两处。
|
|
28
|
+
*/
|
|
29
|
+
const DEFAULT_MAX_CONTEXT_TOKENS = 120_000;
|
|
21
30
|
// 单个 Provider 配置 schema(用于 providers 映射表的值)
|
|
22
31
|
const ProviderConfigSchema = z.object({
|
|
23
32
|
provider: z.string(),
|
|
24
33
|
model: z.string(),
|
|
25
34
|
baseUrl: z.string().optional(),
|
|
26
35
|
apiKey: z.string().optional(),
|
|
36
|
+
/** 该 Provider 的 temperature,未配置时回退到全局 llm.temperature */
|
|
37
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
27
38
|
});
|
|
28
39
|
// 配置 schema(运行时校验)
|
|
29
40
|
// provider 允许任意字符串:预设(mock/deepseek/doubao/openai)开箱即用,
|
|
@@ -71,7 +82,7 @@ const ConfigSchema = z.object({
|
|
|
71
82
|
}),
|
|
72
83
|
memory: z.object({
|
|
73
84
|
dataDir: z.string().default('~/.memora'),
|
|
74
|
-
maxContextTokens: z.number().default(
|
|
85
|
+
maxContextTokens: z.number().default(DEFAULT_MAX_CONTEXT_TOKENS),
|
|
75
86
|
}),
|
|
76
87
|
security: z.object({
|
|
77
88
|
permission: z.enum(['owner', 'guest']).default('owner'),
|
|
@@ -103,7 +114,7 @@ const DEFAULT_CONFIG = {
|
|
|
103
114
|
},
|
|
104
115
|
memory: {
|
|
105
116
|
dataDir: '~/.memora',
|
|
106
|
-
maxContextTokens:
|
|
117
|
+
maxContextTokens: DEFAULT_MAX_CONTEXT_TOKENS,
|
|
107
118
|
},
|
|
108
119
|
security: {
|
|
109
120
|
permission: 'owner',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,4CAA4C;AAC5C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/eval/evalTypes.js
CHANGED
|
@@ -29,7 +29,7 @@ export async function collectAgentChunks(chunks) {
|
|
|
29
29
|
for await (const chunk of chunks) {
|
|
30
30
|
switch (chunk.type) {
|
|
31
31
|
case 'recall':
|
|
32
|
-
//
|
|
32
|
+
// recall chunk 携带 memories 数组,count 由数组长度得出
|
|
33
33
|
collected.recallCount = chunk.memories.length;
|
|
34
34
|
break;
|
|
35
35
|
case 'tool_start':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evalTypes.js","sourceRoot":"","sources":["../../src/eval/evalTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA6FH;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAiD;IAEjD,MAAM,SAAS,GAA4B;QACzC,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,CAAC;QACd,gBAAgB,EAAE,KAAK;QACvB,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,
|
|
1
|
+
{"version":3,"file":"evalTypes.js","sourceRoot":"","sources":["../../src/eval/evalTypes.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* 决策追溯:详见 .trae/rules/decisions/ 下的 ADR
|
|
9
9
|
*/
|
|
10
10
|
export { Agent } from './agent/agent.js';
|
|
11
|
-
export type { AgentChunk, ThinkingPhase, UIMessages } from './agent/types.js';
|
|
11
|
+
export type { AgentChunk, ThinkingPhase, UIMessages, ArchiveMode } from './agent/types.js';
|
|
12
12
|
export { AGENT_CONSTANTS, LOOP_CONSTANTS } from './agent/constants.js';
|
|
13
13
|
export type { AgentOptions, AgentContext, AgentProjectEntry, } from './agent/agent.js';
|
|
14
14
|
export { type AgentForkResult } from './agent/managers/sessionManager.js';
|
|
@@ -18,12 +18,15 @@ export type { MemoryKeywords } from './agent/managers/insightExtractor.js';
|
|
|
18
18
|
export type { MemorySnapshot, WorkingMemorySnapshot, BootstrapSnapshot, ArchiveSnapshot, AgentSearchHit, AgentStats, SuggestOptions, SuggestHit, SourceHealthStatus, SourceHealthEntry, SourceHealthReport, } from './agent/managers/memoryInspector.js';
|
|
19
19
|
export type { ConfigSuggestion, ConfigSuggestionHandler } from './agent/managers/configManager.js';
|
|
20
20
|
export type { AutoConfigRefinerOptions } from './agent/managers/autoConfigRefiner.js';
|
|
21
|
+
export type { SessionArchiveResult } from './agent/managers/sessionArchiver.js';
|
|
21
22
|
export type { WorkProjectionEntry } from './agent/managers/workProjection.js';
|
|
22
23
|
export { loadConfig } from './config/loader.js';
|
|
23
24
|
export { createLlmProvider, createProviderFromConfig } from './llm/factory.js';
|
|
24
25
|
export type { ProviderConfig } from './llm/factory.js';
|
|
25
26
|
export type { LlmProvider, ChatOptions } from './llm/provider.js';
|
|
26
27
|
export type { LlmChunk } from './llm/types.js';
|
|
28
|
+
export { OpenAICompatibleProvider } from './llm/openaiCompatible.js';
|
|
29
|
+
export type { OpenAICompatibleConfig } from './llm/openaiCompatible.js';
|
|
27
30
|
export type { Config } from './config/loader.js';
|
|
28
31
|
export { TypedEventEmitter } from './utils/eventEmitter.js';
|
|
29
32
|
export type { AgentEventMap, AgentEventName, AgentEventHandler } from './utils/eventEmitter.js';
|
|
@@ -48,7 +51,7 @@ export { recall, extractKeywords } from './memory/recall.js';
|
|
|
48
51
|
export type { RecallOptions } from './memory/recall.js';
|
|
49
52
|
export type { ILogger } from './logging/loggerInterface.js';
|
|
50
53
|
export { setLogger, logger } from './logging/logger.js';
|
|
51
|
-
export { segmentText
|
|
54
|
+
export { segmentText } from './utils/segmenter.js';
|
|
52
55
|
export { parseFrontmatter, serializeFrontmatter } from './utils/frontmatter.js';
|
|
53
56
|
export { safeSetTimeout, safeSetInterval, clearSafeTimeout, clearSafeInterval } from './utils/safeTimer.js';
|
|
54
57
|
export type { SkillEntry, SkillMatch } from './skill/types.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACvE,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACzG,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE/D,YAAY,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,UAAU,EACV,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACnG,YAAY,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAEtF,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAEhF,YAAY,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGhG,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3F,YAAY,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEhG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE3E,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE9E,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,YAAY,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI/D,YAAY,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAErF,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -12,6 +12,7 @@ export { Agent } from './agent/agent.js';
|
|
|
12
12
|
export { AGENT_CONSTANTS, LOOP_CONSTANTS } from './agent/constants.js';
|
|
13
13
|
export { loadConfig } from './config/loader.js';
|
|
14
14
|
export { createLlmProvider, createProviderFromConfig } from './llm/factory.js';
|
|
15
|
+
export { OpenAICompatibleProvider } from './llm/openaiCompatible.js';
|
|
15
16
|
// 事件系统
|
|
16
17
|
export { TypedEventEmitter } from './utils/eventEmitter.js';
|
|
17
18
|
export { NOOP_TRACER, TRACE_SPANS } from './agent/tracer.js';
|
|
@@ -31,7 +32,7 @@ export { setLogger, logger } from './logging/logger.js';
|
|
|
31
32
|
// ─── 工具导出 ────────────────────────────────────────────
|
|
32
33
|
// 分词工具:宿主项目(如 SqliteStorage)依赖
|
|
33
34
|
// 工具导出
|
|
34
|
-
export { segmentText
|
|
35
|
+
export { segmentText } from './utils/segmenter.js';
|
|
35
36
|
// Frontmatter 解析/序列化:宿主项目(如 skillInstaller)依赖
|
|
36
37
|
export { parseFrontmatter, serializeFrontmatter } from './utils/frontmatter.js';
|
|
37
38
|
// 安全定时器:宿主主进程统一使用 safeSetTimeout/safeSetInterval 跟踪清理
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iDAAiD;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iDAAiD;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA8BvE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAI/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,OAAO;AACP,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7D,uDAAuD;AACvD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE3F,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIrE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,oEAAoE;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,wEAAwE;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAMvD,eAAe;AACf,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAK7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAExD,wDAAwD;AACxD,+BAA+B;AAC/B,OAAO;AACP,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,8CAA8C;AAC9C,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAChF,sDAAsD;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAc5G,sDAAsD;AACtD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACrF,mDAAmD;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAK7C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,mCAAmC;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAE9C,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAExB,MAAM,EAAE,eAAe;IAEpD;;;OAGG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;;;OAIG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,mCAAmC;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAE9C,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAExB,MAAM,EAAE,eAAe;IAEpD;;;OAGG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;;;OAIG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkB5C;;;;;OAKG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAkF7D;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB"}
|
package/dist/llm/embedding.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Embedding Provider — 调用 OpenAI 兼容的 /embeddings 端点
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 语义检索的核心能力:
|
|
5
5
|
* - 将文本转为向量(embedding)
|
|
6
6
|
* - 支持批量嵌入(减少 API 调用次数)
|
|
7
7
|
* - 向量维度由模型决定(如 text-embedding-3-small: 1536 维)
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* 详见 ADR-003 · LLM 适配层使用 OpenAI Chat Completions 兼容协议
|
|
15
15
|
*/
|
|
16
16
|
import { logger } from '../logging/logger.js';
|
|
17
|
-
import { networkError, configError, toError } from '../utils/errors.js';
|
|
17
|
+
import { networkError, configError, llmError, toError } from '../utils/errors.js';
|
|
18
18
|
/**
|
|
19
19
|
* Embedding Provider
|
|
20
20
|
*
|
|
@@ -66,8 +66,10 @@ export class EmbeddingProvider {
|
|
|
66
66
|
return cached;
|
|
67
67
|
const results = await this.batchEmbed([text]);
|
|
68
68
|
const first = results[0];
|
|
69
|
-
if (!first)
|
|
70
|
-
|
|
69
|
+
if (!first) {
|
|
70
|
+
// 错误处理统一:使用 llmError 工厂
|
|
71
|
+
throw llmError('嵌入结果为空', 'batchEmbed 返回空结果', ['请检查 Embedding 模型配置', '确认 API 返回了有效的向量数据']);
|
|
72
|
+
}
|
|
71
73
|
return first.vector;
|
|
72
74
|
}
|
|
73
75
|
/**
|
|
@@ -129,7 +131,7 @@ export class EmbeddingProvider {
|
|
|
129
131
|
const sorted = data.data.sort((a, b) => a.index - b.index);
|
|
130
132
|
// 填充结果 + 更新缓存
|
|
131
133
|
for (let i = 0; i < uncached.length; i++) {
|
|
132
|
-
//
|
|
134
|
+
// 循环条件保证索引有效,null 检查兜底
|
|
133
135
|
const text = uncached[i];
|
|
134
136
|
if (!text)
|
|
135
137
|
continue;
|
|
@@ -139,7 +141,7 @@ export class EmbeddingProvider {
|
|
|
139
141
|
continue;
|
|
140
142
|
}
|
|
141
143
|
this.setCache(text, vector);
|
|
142
|
-
//
|
|
144
|
+
// null 检查兜底
|
|
143
145
|
const idx = uncachedIndices[i];
|
|
144
146
|
if (idx !== undefined)
|
|
145
147
|
results[idx] = { text, vector };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAahD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,cAAc,GAC7B,WAAW,CAiDb;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAyB7D"}
|
package/dist/llm/factory.js
CHANGED
|
@@ -2,6 +2,7 @@ import { LlmProvider } from '../llm/provider.js';
|
|
|
2
2
|
import { OpenAICompatibleProvider } from '../llm/openaiCompatible.js';
|
|
3
3
|
import { logger } from '../logging/logger.js';
|
|
4
4
|
import { configError } from '../utils/errors.js';
|
|
5
|
+
import { safeSetTimeout } from '../utils/safeTimer.js';
|
|
5
6
|
// 预设 Provider 的默认 baseUrl 和 model(开箱即用)
|
|
6
7
|
const presets = {
|
|
7
8
|
deepseek: { baseUrl: 'https://api.deepseek.com/v1', defaultModel: 'deepseek-chat' },
|
|
@@ -100,7 +101,7 @@ class MockProvider extends LlmProvider {
|
|
|
100
101
|
const reply = `Mock 响应:${lastUser?.content ?? '(empty)'}`;
|
|
101
102
|
for (const char of reply) {
|
|
102
103
|
yield { content: char };
|
|
103
|
-
await new Promise((r) =>
|
|
104
|
+
await new Promise((r) => safeSetTimeout(r, 5));
|
|
104
105
|
}
|
|
105
106
|
yield { finishReason: 'stop' };
|
|
106
107
|
}
|
package/dist/llm/factory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,15 @@ export declare class OpenAICompatibleProvider extends LlmProvider {
|
|
|
29
29
|
* 消费并释放 body,根据状态码抛出相应的错误类型。
|
|
30
30
|
*/
|
|
31
31
|
private handleResponseError;
|
|
32
|
+
/**
|
|
33
|
+
* 安全取消 response.body
|
|
34
|
+
*
|
|
35
|
+
* 在 SSE 异常和 HTTP 错误处理路径中均需 cancel response.body 释放底层连接,
|
|
36
|
+
* cancel 本身失败不应阻塞后续错误抛出,仅 debug 记录。
|
|
37
|
+
*
|
|
38
|
+
* @param response - HTTP 响应对象
|
|
39
|
+
*/
|
|
40
|
+
private safeCancelBody;
|
|
32
41
|
/**
|
|
33
42
|
* 格式化消息为 OpenAI 协议格式
|
|
34
43
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openaiCompatible.d.ts","sourceRoot":"","sources":["../../src/llm/openaiCompatible.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,gBAAgB,CAAC;AAIzD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"openaiCompatible.d.ts","sourceRoot":"","sources":["../../src/llm/openaiCompatible.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,gBAAgB,CAAC;AAIzD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAyBD;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,WAAW;IAKrD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAGpB,IAAI,EAAE,MAAM,EACK,MAAM,EAAE,sBAAsB;IAMjD,mBAAmB;IACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAW;IAE9C,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,aAAa,CAAC,QAAQ,CAAC;IAwHjF;;;;OAIG;YACW,mBAAmB;IAmCjC;;;;;;;OAOG;YACW,cAAc;IAQ5B;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;;;;;;;;;OAWG;YACY,cAAc;IA2I7B;;OAEG;IACH,OAAO,CAAC,8BAA8B;IActC;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAQ5B"}
|
|
@@ -7,6 +7,27 @@
|
|
|
7
7
|
import { LlmProvider } from '../llm/provider.js';
|
|
8
8
|
import { llmError, networkError, configError, toError } from '../utils/errors.js';
|
|
9
9
|
import { logger } from '../logging/logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* 错误响应体截断长度(字符数)。
|
|
12
|
+
*
|
|
13
|
+
* handleResponseError 中 4 处 errorText.slice(0, 200) 的统一常量,
|
|
14
|
+
* 避免魔法数字散落,便于后续调整截断策略。
|
|
15
|
+
*/
|
|
16
|
+
const MAX_ERROR_BODY_LEN = 200;
|
|
17
|
+
/**
|
|
18
|
+
* chunk 级读超时区分首 chunk 与 chunk 间(reasoning 模型适配)
|
|
19
|
+
*
|
|
20
|
+
* 背景:reasoning 模型(DeepSeek-R1/o1/QwQ 等)首 chunk 前需完成思维链推理,
|
|
21
|
+
* 可能耗时 30-90s;chunk 间正常停顿 < 10s,但复杂推理节点可能短暂停顿。
|
|
22
|
+
*
|
|
23
|
+
* 策略:
|
|
24
|
+
* - 首 chunk 超时 120s:与请求级超时一致,给 reasoning 模型足够思考时间
|
|
25
|
+
* - chunk 间超时 60s:首 chunk 已到说明连接正常,60s 足以覆盖正常停顿
|
|
26
|
+
*
|
|
27
|
+
* 判定依据:firstChunkReceived 标志位区分两种阶段
|
|
28
|
+
*/
|
|
29
|
+
const FIRST_CHUNK_TIMEOUT_MS = 120_000;
|
|
30
|
+
const INTER_CHUNK_TIMEOUT_MS = 60_000;
|
|
10
31
|
/**
|
|
11
32
|
* 通用 OpenAI 兼容 Provider
|
|
12
33
|
* 通过 baseUrl 适配不同厂商
|
|
@@ -36,7 +57,12 @@ export class OpenAICompatibleProvider extends LlmProvider {
|
|
|
36
57
|
body['tools'] = opts.tools;
|
|
37
58
|
if (opts.maxTokens)
|
|
38
59
|
body['max_tokens'] = opts.maxTokens;
|
|
39
|
-
//
|
|
60
|
+
// 结构化输出约束:透传 response_format 到请求 body
|
|
61
|
+
// 供未来非 tool_call 场景使用(如归档摘要强制 JSON、配置建议提取)
|
|
62
|
+
// 注意:不能与 tools 同时使用(OpenAI 协议限制),调用方需自行保证互斥
|
|
63
|
+
if (opts.response_format)
|
|
64
|
+
body['response_format'] = opts.response_format;
|
|
65
|
+
// 校验 API Key(缺失时给友好提示,不暴露 undefined 报错)
|
|
40
66
|
if (!this.config.apiKey) {
|
|
41
67
|
throw configError('API Key 未配置', `provider: ${this.name},baseUrl: ${this.config.baseUrl}`, [
|
|
42
68
|
'检查 ~/.memora/config.json 的 llm.apiKey 字段',
|
|
@@ -110,19 +136,12 @@ export class OpenAICompatibleProvider extends LlmProvider {
|
|
|
110
136
|
}
|
|
111
137
|
catch (err) {
|
|
112
138
|
// SSE 解析异常时也要 cancel stream(Node 24 + undici 同上)
|
|
113
|
-
|
|
114
|
-
await response.body?.cancel();
|
|
115
|
-
}
|
|
116
|
-
catch (err) {
|
|
117
|
-
logger.debug({ err: toError(err).message }, 'response.body.cancel 失败');
|
|
118
|
-
}
|
|
139
|
+
await this.safeCancelBody(response);
|
|
119
140
|
throw err;
|
|
120
141
|
}
|
|
121
142
|
}
|
|
122
143
|
finally {
|
|
123
144
|
// 统一清理:覆盖 HTTP 错误、空 body、SSE 异常、正常完成所有路径
|
|
124
|
-
// 修复 LLM-01:原实现仅在 fetch 网络异常 catch 移除监听器,
|
|
125
|
-
// handleResponseError/空body/SSE 抛错路径均泄漏监听器与定时器
|
|
126
145
|
clearTimeout(timeoutId);
|
|
127
146
|
if (optsSignal)
|
|
128
147
|
optsSignal.removeEventListener('abort', onOptsAbort);
|
|
@@ -135,39 +154,50 @@ export class OpenAICompatibleProvider extends LlmProvider {
|
|
|
135
154
|
*/
|
|
136
155
|
async handleResponseError(response) {
|
|
137
156
|
const errorText = await response.text().catch(() => '<无法读取响应体>');
|
|
138
|
-
|
|
139
|
-
await response.body?.cancel();
|
|
140
|
-
}
|
|
141
|
-
catch (err) {
|
|
142
|
-
logger.debug({ err: toError(err).message }, 'response.body.cancel 失败');
|
|
143
|
-
}
|
|
157
|
+
await this.safeCancelBody(response);
|
|
144
158
|
const status = response.status;
|
|
145
159
|
if (status === 401 || status === 403) {
|
|
146
|
-
throw configError('LLM API Key 无效', `HTTP ${status}:${errorText.slice(0,
|
|
160
|
+
throw configError('LLM API Key 无效', `HTTP ${status}:${errorText.slice(0, MAX_ERROR_BODY_LEN)}`, [
|
|
147
161
|
'检查 API Key 是否正确(注意 ${MEMORA_LLM_API_KEY} 占位符是否已展开)',
|
|
148
162
|
'确认 Key 未过期',
|
|
149
163
|
'如使用 DeepSeek/豆包,确认 Key 来自对应平台',
|
|
150
164
|
]);
|
|
151
165
|
}
|
|
152
166
|
if (status === 429) {
|
|
153
|
-
throw llmError('LLM 服务限流', `HTTP 429:${errorText.slice(0,
|
|
167
|
+
throw llmError('LLM 服务限流', `HTTP 429:${errorText.slice(0, MAX_ERROR_BODY_LEN)}`, [
|
|
154
168
|
'稍后重试',
|
|
155
169
|
'如频繁触发考虑升级套餐或换用其他 provider',
|
|
156
170
|
]);
|
|
157
171
|
}
|
|
158
172
|
if (status >= 400 && status < 500) {
|
|
159
|
-
throw llmError('LLM 请求格式错误', `HTTP ${status}:${errorText.slice(0,
|
|
173
|
+
throw llmError('LLM 请求格式错误', `HTTP ${status}:${errorText.slice(0, MAX_ERROR_BODY_LEN)}`, [
|
|
160
174
|
'检查消息内容是否含特殊字符',
|
|
161
175
|
'确认 model 名称正确',
|
|
162
176
|
'如使用 tools,确认 tool schema 有效',
|
|
163
177
|
]);
|
|
164
178
|
}
|
|
165
|
-
throw llmError('LLM 服务端错误', `HTTP ${status}:${errorText.slice(0,
|
|
179
|
+
throw llmError('LLM 服务端错误', `HTTP ${status}:${errorText.slice(0, MAX_ERROR_BODY_LEN)}`, [
|
|
166
180
|
'稍后重试',
|
|
167
181
|
'如持续失败,访问厂商状态页确认服务状态',
|
|
168
182
|
'可在 config.json 切换 provider 兜底',
|
|
169
183
|
]);
|
|
170
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* 安全取消 response.body
|
|
187
|
+
*
|
|
188
|
+
* 在 SSE 异常和 HTTP 错误处理路径中均需 cancel response.body 释放底层连接,
|
|
189
|
+
* cancel 本身失败不应阻塞后续错误抛出,仅 debug 记录。
|
|
190
|
+
*
|
|
191
|
+
* @param response - HTTP 响应对象
|
|
192
|
+
*/
|
|
193
|
+
async safeCancelBody(response) {
|
|
194
|
+
try {
|
|
195
|
+
await response.body?.cancel();
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
logger.debug({ err: toError(err).message }, 'response.body.cancel 失败');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
171
201
|
/**
|
|
172
202
|
* 格式化消息为 OpenAI 协议格式
|
|
173
203
|
*
|
|
@@ -212,23 +242,32 @@ export class OpenAICompatibleProvider extends LlmProvider {
|
|
|
212
242
|
// 流式 tool_calls 累积器:按 index 分片累积 name + arguments
|
|
213
243
|
// OpenAI 协议:同一个 tool_call 的 name/arguments 可能跨多个 delta 分片到达
|
|
214
244
|
const toolCallAccumulators = new Map();
|
|
215
|
-
//
|
|
216
|
-
//
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
|
|
245
|
+
// chunk 级读超时区分首 chunk 与 chunk 间
|
|
246
|
+
// reader.read() 阻塞时若无超时,连接半挂(NAT/代理/服务端慢响应不关 TCP)会永久等待
|
|
247
|
+
// 采用 setTimeout + reader.cancel:超时则 cancel reader 让 read() reject 退出
|
|
248
|
+
//
|
|
249
|
+
// 区分首 chunk 与 chunk 间(reasoning 模型适配):
|
|
250
|
+
// - 首 chunk 前 LLM 可能思考数十秒(reasoning 模型),用 FIRST_CHUNK_TIMEOUT_MS(120s)
|
|
251
|
+
// - 首 chunk 到达后连接已正常,chunk 间停顿用 INTER_CHUNK_TIMEOUT_MS(60s)
|
|
252
|
+
let firstChunkReceived = false;
|
|
220
253
|
try {
|
|
221
254
|
while (true) {
|
|
222
255
|
// 检查中止信号:超时或用户取消时立即退出
|
|
223
256
|
if (signal?.aborted) {
|
|
224
257
|
throw new DOMException('LLM 流读取被中止', signal.reason?.name ?? 'AbortError');
|
|
225
258
|
}
|
|
226
|
-
// chunk
|
|
259
|
+
// chunk 级读超时:根据是否收到首 chunk 选择不同超时阈值
|
|
227
260
|
// reader.cancel() 会让 pending 的 reader.read() 抛 AbortError(DOMException)
|
|
261
|
+
const chunkTimeoutMs = firstChunkReceived
|
|
262
|
+
? INTER_CHUNK_TIMEOUT_MS
|
|
263
|
+
: FIRST_CHUNK_TIMEOUT_MS;
|
|
228
264
|
const chunkTimer = setTimeout(() => {
|
|
229
|
-
// cancel 失败也不影响(reader 可能已 done 或被其他路径 cancel
|
|
230
|
-
|
|
231
|
-
|
|
265
|
+
// cancel 失败也不影响(reader 可能已 done 或被其他路径 cancel),记日志便于排查偶发连接泄漏
|
|
266
|
+
const reason = firstChunkReceived ? 'LLM chunk 间读取超时' : 'LLM 首 chunk 读取超时';
|
|
267
|
+
reader.cancel(new DOMException(reason, 'TimeoutError')).catch((err) => {
|
|
268
|
+
logger.debug({ err: toError(err).message }, 'reader.cancel 失败(超时清理路径)');
|
|
269
|
+
});
|
|
270
|
+
}, chunkTimeoutMs);
|
|
232
271
|
let readResult;
|
|
233
272
|
try {
|
|
234
273
|
readResult = await reader.read();
|
|
@@ -240,6 +279,10 @@ export class OpenAICompatibleProvider extends LlmProvider {
|
|
|
240
279
|
const { done, value } = readResult;
|
|
241
280
|
if (done)
|
|
242
281
|
break;
|
|
282
|
+
// 成功读到数据后标记首 chunk 已到,后续 read() 用 chunk 间超时
|
|
283
|
+
if (!firstChunkReceived) {
|
|
284
|
+
firstChunkReceived = true;
|
|
285
|
+
}
|
|
243
286
|
buffer += decoder.decode(value, { stream: true });
|
|
244
287
|
const lines = buffer.split('\n');
|
|
245
288
|
buffer = lines.pop() ?? '';
|
|
@@ -301,15 +344,16 @@ export class OpenAICompatibleProvider extends LlmProvider {
|
|
|
301
344
|
}
|
|
302
345
|
}
|
|
303
346
|
finally {
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
//
|
|
347
|
+
// reader.cancel() 彻底释放底层 TCP 连接(releaseLock 仅释放锁不取消流,
|
|
348
|
+
// 无法避免 generator 提前 break 时底层连接悬挂;也是 CallLlmWithRetry
|
|
349
|
+
// 无 finally 触发 abort 时的兜底)
|
|
307
350
|
// 已 done/cancel 的 reader 调 cancel 是 no-op,安全
|
|
308
351
|
try {
|
|
309
352
|
await reader.cancel();
|
|
310
353
|
}
|
|
311
|
-
catch {
|
|
312
|
-
// cancel 失败不阻塞,reader 会被 GC
|
|
354
|
+
catch (err) {
|
|
355
|
+
// cancel 失败不阻塞,reader 会被 GC 回收;记日志便于排查偶发连接泄漏
|
|
356
|
+
logger.debug({ err: toError(err).message }, 'reader.cancel 失败(finally 清理路径)');
|
|
313
357
|
}
|
|
314
358
|
}
|
|
315
359
|
}
|