@cicctencent/agent-core 0.1.18 → 0.1.20
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/README.md +70 -1
- package/dist/cjs/agent/engine.d.ts +23 -0
- package/dist/cjs/agent/engine.d.ts.map +1 -1
- package/dist/cjs/agent/engine.js +88 -9
- package/dist/cjs/agent/engine.js.map +1 -1
- package/dist/cjs/agent/history-manager.d.ts +66 -1
- package/dist/cjs/agent/history-manager.d.ts.map +1 -1
- package/dist/cjs/agent/history-manager.js +232 -0
- package/dist/cjs/agent/history-manager.js.map +1 -1
- package/dist/cjs/agent/llm-caller.d.ts +4 -1
- package/dist/cjs/agent/llm-caller.d.ts.map +1 -1
- package/dist/cjs/agent/llm-caller.js +25 -19
- package/dist/cjs/agent/llm-caller.js.map +1 -1
- package/dist/cjs/agent/profile-loader.d.ts +56 -0
- package/dist/cjs/agent/profile-loader.d.ts.map +1 -0
- package/dist/cjs/agent/profile-loader.js +145 -0
- package/dist/cjs/agent/profile-loader.js.map +1 -0
- package/dist/cjs/agent/types.d.ts +32 -3
- package/dist/cjs/agent/types.d.ts.map +1 -1
- package/dist/cjs/agent/types.js.map +1 -1
- package/dist/cjs/calendar/types.d.ts +41 -0
- package/dist/cjs/calendar/types.d.ts.map +1 -0
- package/dist/cjs/calendar/types.js +6 -0
- package/dist/cjs/calendar/types.js.map +1 -0
- package/dist/cjs/context/types.d.ts +3 -3
- package/dist/cjs/context/types.d.ts.map +1 -1
- package/dist/cjs/email/types.d.ts +46 -0
- package/dist/cjs/email/types.d.ts.map +1 -0
- package/dist/cjs/email/types.js +6 -0
- package/dist/cjs/email/types.js.map +1 -0
- package/dist/cjs/index.d.ts +28 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +42 -11
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/kb/in-memory-kb.d.ts +29 -0
- package/dist/cjs/kb/in-memory-kb.d.ts.map +1 -0
- package/dist/cjs/kb/in-memory-kb.js +210 -0
- package/dist/cjs/kb/in-memory-kb.js.map +1 -0
- package/dist/cjs/kb/rag-middleware.d.ts +31 -0
- package/dist/cjs/kb/rag-middleware.d.ts.map +1 -0
- package/dist/cjs/kb/rag-middleware.js +94 -0
- package/dist/cjs/kb/rag-middleware.js.map +1 -0
- package/dist/cjs/kb/types.d.ts +63 -0
- package/dist/cjs/kb/types.d.ts.map +1 -0
- package/dist/cjs/kb/types.js +6 -0
- package/dist/cjs/kb/types.js.map +1 -0
- package/dist/cjs/llm/anthropic-provider.d.ts +7 -0
- package/dist/cjs/llm/anthropic-provider.d.ts.map +1 -1
- package/dist/cjs/llm/anthropic-provider.js +84 -9
- package/dist/cjs/llm/anthropic-provider.js.map +1 -1
- package/dist/cjs/llm/ollama-provider.d.ts +18 -0
- package/dist/cjs/llm/ollama-provider.d.ts.map +1 -1
- package/dist/cjs/llm/ollama-provider.js +41 -0
- package/dist/cjs/llm/ollama-provider.js.map +1 -1
- package/dist/cjs/llm/openai-provider.d.ts +39 -2
- package/dist/cjs/llm/openai-provider.d.ts.map +1 -1
- package/dist/cjs/llm/openai-provider.js +302 -1
- package/dist/cjs/llm/openai-provider.js.map +1 -1
- package/dist/cjs/llm/pricing.d.ts +26 -0
- package/dist/cjs/llm/pricing.d.ts.map +1 -0
- package/dist/cjs/llm/pricing.js +86 -0
- package/dist/cjs/llm/pricing.js.map +1 -0
- package/dist/cjs/llm/provider.d.ts +2 -1
- package/dist/cjs/llm/provider.d.ts.map +1 -1
- package/dist/cjs/llm/provider.js +6 -1
- package/dist/cjs/llm/provider.js.map +1 -1
- package/dist/cjs/llm/types.d.ts +139 -0
- package/dist/cjs/llm/types.d.ts.map +1 -1
- package/dist/cjs/llm/types.js +74 -0
- package/dist/cjs/llm/types.js.map +1 -1
- package/dist/cjs/llm/usage-tracker.d.ts +119 -0
- package/dist/cjs/llm/usage-tracker.d.ts.map +1 -0
- package/dist/cjs/llm/usage-tracker.js +105 -0
- package/dist/cjs/llm/usage-tracker.js.map +1 -0
- package/dist/cjs/memory/extractor.js +1 -1
- package/dist/cjs/memory/extractor.js.map +1 -1
- package/dist/cjs/memory/persona.js +1 -1
- package/dist/cjs/memory/persona.js.map +1 -1
- package/dist/cjs/memory/scene.js +1 -1
- package/dist/cjs/memory/scene.js.map +1 -1
- package/dist/cjs/middleware/types.d.ts +2 -4
- package/dist/cjs/middleware/types.d.ts.map +1 -1
- package/dist/cjs/middleware/workspace-notes.d.ts +36 -0
- package/dist/cjs/middleware/workspace-notes.d.ts.map +1 -0
- package/dist/cjs/middleware/workspace-notes.js +53 -0
- package/dist/cjs/middleware/workspace-notes.js.map +1 -0
- package/dist/cjs/observability/logger.d.ts +1 -0
- package/dist/cjs/observability/logger.d.ts.map +1 -1
- package/dist/cjs/observability/logger.js.map +1 -1
- package/dist/cjs/observability/trace.d.ts +45 -0
- package/dist/cjs/observability/trace.d.ts.map +1 -0
- package/dist/cjs/observability/trace.js +59 -0
- package/dist/cjs/observability/trace.js.map +1 -0
- package/dist/cjs/runtime/run-registry-interface.d.ts +42 -0
- package/dist/cjs/runtime/run-registry-interface.d.ts.map +1 -0
- package/dist/cjs/runtime/run-registry-interface.js +7 -0
- package/dist/cjs/runtime/run-registry-interface.js.map +1 -0
- package/dist/cjs/runtime/run-registry.d.ts +15 -2
- package/dist/cjs/runtime/run-registry.d.ts.map +1 -1
- package/dist/cjs/runtime/run-registry.js +43 -1
- package/dist/cjs/runtime/run-registry.js.map +1 -1
- package/dist/cjs/sandbox/code-sandbox.d.ts +42 -0
- package/dist/cjs/sandbox/code-sandbox.d.ts.map +1 -0
- package/dist/cjs/sandbox/code-sandbox.js +59 -0
- package/dist/cjs/sandbox/code-sandbox.js.map +1 -0
- package/dist/cjs/skill/router.d.ts +20 -1
- package/dist/cjs/skill/router.d.ts.map +1 -1
- package/dist/cjs/skill/router.js +39 -1
- package/dist/cjs/skill/router.js.map +1 -1
- package/dist/cjs/skill/types.d.ts +1 -1
- package/dist/cjs/skill/types.d.ts.map +1 -1
- package/dist/cjs/skill/vector-index.d.ts +50 -0
- package/dist/cjs/skill/vector-index.d.ts.map +1 -0
- package/dist/cjs/skill/vector-index.js +57 -0
- package/dist/cjs/skill/vector-index.js.map +1 -0
- package/dist/cjs/store/history-persistence.d.ts +36 -0
- package/dist/cjs/store/history-persistence.d.ts.map +1 -0
- package/dist/cjs/store/history-persistence.js +142 -0
- package/dist/cjs/store/history-persistence.js.map +1 -0
- package/dist/cjs/types.d.ts +40 -1
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/types.js +34 -0
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/token-counter.d.ts.map +1 -1
- package/dist/cjs/utils/token-counter.js +33 -1
- package/dist/cjs/utils/token-counter.js.map +1 -1
- package/dist/esm/agent/engine.d.ts +23 -0
- package/dist/esm/agent/engine.d.ts.map +1 -1
- package/dist/esm/agent/engine.js +88 -9
- package/dist/esm/agent/engine.js.map +1 -1
- package/dist/esm/agent/history-manager.d.ts +66 -1
- package/dist/esm/agent/history-manager.d.ts.map +1 -1
- package/dist/esm/agent/history-manager.js +232 -0
- package/dist/esm/agent/history-manager.js.map +1 -1
- package/dist/esm/agent/llm-caller.d.ts +4 -1
- package/dist/esm/agent/llm-caller.d.ts.map +1 -1
- package/dist/esm/agent/llm-caller.js +25 -19
- package/dist/esm/agent/llm-caller.js.map +1 -1
- package/dist/esm/agent/profile-loader.d.ts +56 -0
- package/dist/esm/agent/profile-loader.d.ts.map +1 -0
- package/dist/esm/agent/profile-loader.js +108 -0
- package/dist/esm/agent/profile-loader.js.map +1 -0
- package/dist/esm/agent/types.d.ts +32 -3
- package/dist/esm/agent/types.d.ts.map +1 -1
- package/dist/esm/agent/types.js.map +1 -1
- package/dist/esm/calendar/types.d.ts +41 -0
- package/dist/esm/calendar/types.d.ts.map +1 -0
- package/dist/esm/calendar/types.js +5 -0
- package/dist/esm/calendar/types.js.map +1 -0
- package/dist/esm/context/types.d.ts +3 -3
- package/dist/esm/context/types.d.ts.map +1 -1
- package/dist/esm/email/types.d.ts +46 -0
- package/dist/esm/email/types.d.ts.map +1 -0
- package/dist/esm/email/types.js +5 -0
- package/dist/esm/email/types.js.map +1 -0
- package/dist/esm/index.d.ts +28 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/kb/in-memory-kb.d.ts +29 -0
- package/dist/esm/kb/in-memory-kb.d.ts.map +1 -0
- package/dist/esm/kb/in-memory-kb.js +206 -0
- package/dist/esm/kb/in-memory-kb.js.map +1 -0
- package/dist/esm/kb/rag-middleware.d.ts +31 -0
- package/dist/esm/kb/rag-middleware.d.ts.map +1 -0
- package/dist/esm/kb/rag-middleware.js +91 -0
- package/dist/esm/kb/rag-middleware.js.map +1 -0
- package/dist/esm/kb/types.d.ts +63 -0
- package/dist/esm/kb/types.d.ts.map +1 -0
- package/dist/esm/kb/types.js +5 -0
- package/dist/esm/kb/types.js.map +1 -0
- package/dist/esm/llm/anthropic-provider.d.ts +7 -0
- package/dist/esm/llm/anthropic-provider.d.ts.map +1 -1
- package/dist/esm/llm/anthropic-provider.js +84 -9
- package/dist/esm/llm/anthropic-provider.js.map +1 -1
- package/dist/esm/llm/ollama-provider.d.ts +18 -0
- package/dist/esm/llm/ollama-provider.d.ts.map +1 -1
- package/dist/esm/llm/ollama-provider.js +41 -0
- package/dist/esm/llm/ollama-provider.js.map +1 -1
- package/dist/esm/llm/openai-provider.d.ts +39 -2
- package/dist/esm/llm/openai-provider.d.ts.map +1 -1
- package/dist/esm/llm/openai-provider.js +302 -1
- package/dist/esm/llm/openai-provider.js.map +1 -1
- package/dist/esm/llm/pricing.d.ts +26 -0
- package/dist/esm/llm/pricing.d.ts.map +1 -0
- package/dist/esm/llm/pricing.js +81 -0
- package/dist/esm/llm/pricing.js.map +1 -0
- package/dist/esm/llm/provider.d.ts +2 -1
- package/dist/esm/llm/provider.d.ts.map +1 -1
- package/dist/esm/llm/provider.js +1 -0
- package/dist/esm/llm/provider.js.map +1 -1
- package/dist/esm/llm/types.d.ts +139 -0
- package/dist/esm/llm/types.d.ts.map +1 -1
- package/dist/esm/llm/types.js +70 -1
- package/dist/esm/llm/types.js.map +1 -1
- package/dist/esm/llm/usage-tracker.d.ts +119 -0
- package/dist/esm/llm/usage-tracker.d.ts.map +1 -0
- package/dist/esm/llm/usage-tracker.js +101 -0
- package/dist/esm/llm/usage-tracker.js.map +1 -0
- package/dist/esm/memory/extractor.js +1 -1
- package/dist/esm/memory/extractor.js.map +1 -1
- package/dist/esm/memory/persona.js +1 -1
- package/dist/esm/memory/persona.js.map +1 -1
- package/dist/esm/memory/scene.js +1 -1
- package/dist/esm/memory/scene.js.map +1 -1
- package/dist/esm/middleware/types.d.ts +2 -4
- package/dist/esm/middleware/types.d.ts.map +1 -1
- package/dist/esm/middleware/workspace-notes.d.ts +36 -0
- package/dist/esm/middleware/workspace-notes.d.ts.map +1 -0
- package/dist/esm/middleware/workspace-notes.js +49 -0
- package/dist/esm/middleware/workspace-notes.js.map +1 -0
- package/dist/esm/observability/logger.d.ts +1 -0
- package/dist/esm/observability/logger.d.ts.map +1 -1
- package/dist/esm/observability/logger.js.map +1 -1
- package/dist/esm/observability/trace.d.ts +45 -0
- package/dist/esm/observability/trace.d.ts.map +1 -0
- package/dist/esm/observability/trace.js +55 -0
- package/dist/esm/observability/trace.js.map +1 -0
- package/dist/esm/runtime/run-registry-interface.d.ts +42 -0
- package/dist/esm/runtime/run-registry-interface.d.ts.map +1 -0
- package/dist/esm/runtime/run-registry-interface.js +6 -0
- package/dist/esm/runtime/run-registry-interface.js.map +1 -0
- package/dist/esm/runtime/run-registry.d.ts +15 -2
- package/dist/esm/runtime/run-registry.d.ts.map +1 -1
- package/dist/esm/runtime/run-registry.js +43 -1
- package/dist/esm/runtime/run-registry.js.map +1 -1
- package/dist/esm/sandbox/code-sandbox.d.ts +42 -0
- package/dist/esm/sandbox/code-sandbox.d.ts.map +1 -0
- package/dist/esm/sandbox/code-sandbox.js +56 -0
- package/dist/esm/sandbox/code-sandbox.js.map +1 -0
- package/dist/esm/skill/router.d.ts +20 -1
- package/dist/esm/skill/router.d.ts.map +1 -1
- package/dist/esm/skill/router.js +37 -0
- package/dist/esm/skill/router.js.map +1 -1
- package/dist/esm/skill/types.d.ts +1 -1
- package/dist/esm/skill/types.d.ts.map +1 -1
- package/dist/esm/skill/vector-index.d.ts +50 -0
- package/dist/esm/skill/vector-index.d.ts.map +1 -0
- package/dist/esm/skill/vector-index.js +53 -0
- package/dist/esm/skill/vector-index.js.map +1 -0
- package/dist/esm/store/history-persistence.d.ts +36 -0
- package/dist/esm/store/history-persistence.d.ts.map +1 -0
- package/dist/esm/store/history-persistence.js +105 -0
- package/dist/esm/store/history-persistence.js.map +1 -0
- package/dist/esm/types.d.ts +40 -1
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +32 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/token-counter.d.ts.map +1 -1
- package/dist/esm/utils/token-counter.js +33 -1
- package/dist/esm/utils/token-counter.js.map +1 -1
- package/package.json +1 -1
package/dist/esm/skill/router.js
CHANGED
|
@@ -132,4 +132,41 @@ export class SkillRouter {
|
|
|
132
132
|
};
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
+
export class VectorRouteStrategy {
|
|
136
|
+
name = 'vector';
|
|
137
|
+
index;
|
|
138
|
+
embedFn;
|
|
139
|
+
topK;
|
|
140
|
+
minScore;
|
|
141
|
+
constructor(index, embedFn, options) {
|
|
142
|
+
this.index = index;
|
|
143
|
+
this.embedFn = embedFn;
|
|
144
|
+
this.topK = options?.topK ?? 5;
|
|
145
|
+
this.minScore = options?.minScore ?? 0.5;
|
|
146
|
+
}
|
|
147
|
+
async match(message, skills) {
|
|
148
|
+
if (this.index.size() === 0 || skills.length === 0)
|
|
149
|
+
return null;
|
|
150
|
+
// 将消息转换为向量
|
|
151
|
+
const queryVector = await this.embedFn(message);
|
|
152
|
+
// 向量搜索 top-K 候选
|
|
153
|
+
const results = await this.index.search(queryVector, this.topK);
|
|
154
|
+
if (results.length === 0)
|
|
155
|
+
return null;
|
|
156
|
+
// 取最佳匹配
|
|
157
|
+
const best = results[0];
|
|
158
|
+
if (best.score < this.minScore)
|
|
159
|
+
return null;
|
|
160
|
+
// 在 skills 列表中查找对应的 Skill
|
|
161
|
+
const skill = skills.find((s) => s.id === best.item.id);
|
|
162
|
+
if (!skill)
|
|
163
|
+
return null;
|
|
164
|
+
return {
|
|
165
|
+
skill,
|
|
166
|
+
message,
|
|
167
|
+
matchType: 'vector',
|
|
168
|
+
confidence: best.score,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
135
172
|
//# sourceMappingURL=router.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/skill/router.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,mCAAmC;AACnC,+DAA+D;AAC/D,kDAAkD;AAClD,2CAA2C;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/skill/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ export interface Skill extends SkillManifest {
|
|
|
35
35
|
/** Skill 正文内容(懒加载时可能为空,需通过 SkillManager.get() 触发加载) */
|
|
36
36
|
content: string;
|
|
37
37
|
}
|
|
38
|
-
export type MatchType = 'explicit' | 'keyword' | 'custom';
|
|
38
|
+
export type MatchType = 'explicit' | 'keyword' | 'custom' | 'vector';
|
|
39
39
|
export interface RouteResult {
|
|
40
40
|
/** 匹配到的 Skill(null 表示无匹配,使用裸 Agent) */
|
|
41
41
|
skill: Skill | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/skill/types.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS;IACT,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qCAAqC;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,KAAM,SAAQ,aAAa;IAC1C,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/skill/types.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS;IACT,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qCAAqC;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,KAAM,SAAQ,aAAa;IAC1C,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,gBAAgB;AAChB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACtE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 向量索引项
|
|
3
|
+
*/
|
|
4
|
+
export interface VectorItem {
|
|
5
|
+
/** 唯一 ID */
|
|
6
|
+
id: string;
|
|
7
|
+
/** 向量数据 */
|
|
8
|
+
vector: number[];
|
|
9
|
+
/** 关联的元数据 */
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 向量检索结果
|
|
14
|
+
*/
|
|
15
|
+
export interface VectorSearchResult {
|
|
16
|
+
/** 匹配项 */
|
|
17
|
+
item: VectorItem;
|
|
18
|
+
/** 相似度分数(0-1,越高越相关) */
|
|
19
|
+
score: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 向量索引接口 — Core 定义接口,App 可提供 embedding 增强版
|
|
23
|
+
*/
|
|
24
|
+
export interface VectorIndex {
|
|
25
|
+
/** 构建索引(替换已有数据) */
|
|
26
|
+
build(items: VectorItem[]): Promise<void>;
|
|
27
|
+
/** 添加单个项 */
|
|
28
|
+
add(item: VectorItem): Promise<void>;
|
|
29
|
+
/** 搜索最相似的 topK 个项 */
|
|
30
|
+
search(query: number[], topK?: number): Promise<VectorSearchResult[]>;
|
|
31
|
+
/** 清空索引 */
|
|
32
|
+
clear(): void;
|
|
33
|
+
/** 索引大小 */
|
|
34
|
+
size(): number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 内存向量索引 — 纯 JS 余弦相似度实现,零外部依赖
|
|
38
|
+
*
|
|
39
|
+
* 适合中小规模(<10000 项)场景。
|
|
40
|
+
* 大规模场景应由 App 层替换为基于 embedding 的持久化实现。
|
|
41
|
+
*/
|
|
42
|
+
export declare class InMemoryVectorIndex implements VectorIndex {
|
|
43
|
+
private items;
|
|
44
|
+
build(items: VectorItem[]): Promise<void>;
|
|
45
|
+
add(item: VectorItem): Promise<void>;
|
|
46
|
+
search(query: number[], topK?: number): Promise<VectorSearchResult[]>;
|
|
47
|
+
clear(): void;
|
|
48
|
+
size(): number;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=vector-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-index.d.ts","sourceRoot":"","sources":["../../../src/skill/vector-index.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU;IACV,IAAI,EAAE,UAAU,CAAC;IACjB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,YAAY;IACZ,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,qBAAqB;IACrB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACtE,WAAW;IACX,KAAK,IAAI,IAAI,CAAC;IACd,WAAW;IACX,IAAI,IAAI,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,KAAK,CAAoB;IAE3B,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAavE,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// VectorIndex — 向量索引接口与内存默认实现
|
|
3
|
+
// ============================================================
|
|
4
|
+
/**
|
|
5
|
+
* 内存向量索引 — 纯 JS 余弦相似度实现,零外部依赖
|
|
6
|
+
*
|
|
7
|
+
* 适合中小规模(<10000 项)场景。
|
|
8
|
+
* 大规模场景应由 App 层替换为基于 embedding 的持久化实现。
|
|
9
|
+
*/
|
|
10
|
+
export class InMemoryVectorIndex {
|
|
11
|
+
items = [];
|
|
12
|
+
async build(items) {
|
|
13
|
+
this.items = [...items];
|
|
14
|
+
}
|
|
15
|
+
async add(item) {
|
|
16
|
+
this.items.push(item);
|
|
17
|
+
}
|
|
18
|
+
async search(query, topK = 10) {
|
|
19
|
+
if (this.items.length === 0 || query.length === 0)
|
|
20
|
+
return [];
|
|
21
|
+
const results = [];
|
|
22
|
+
for (const item of this.items) {
|
|
23
|
+
const score = cosineSimilarity(query, item.vector);
|
|
24
|
+
results.push({ item, score });
|
|
25
|
+
}
|
|
26
|
+
results.sort((a, b) => b.score - a.score);
|
|
27
|
+
return results.slice(0, topK);
|
|
28
|
+
}
|
|
29
|
+
clear() {
|
|
30
|
+
this.items = [];
|
|
31
|
+
}
|
|
32
|
+
size() {
|
|
33
|
+
return this.items.length;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 计算两个向量的余弦相似度
|
|
38
|
+
*/
|
|
39
|
+
function cosineSimilarity(a, b) {
|
|
40
|
+
if (a.length !== b.length || a.length === 0)
|
|
41
|
+
return 0;
|
|
42
|
+
let dot = 0;
|
|
43
|
+
let magA = 0;
|
|
44
|
+
let magB = 0;
|
|
45
|
+
for (let i = 0; i < a.length; i++) {
|
|
46
|
+
dot += a[i] * b[i];
|
|
47
|
+
magA += a[i] * a[i];
|
|
48
|
+
magB += b[i] * b[i];
|
|
49
|
+
}
|
|
50
|
+
const denom = Math.sqrt(magA) * Math.sqrt(magB);
|
|
51
|
+
return denom === 0 ? 0 : dot / denom;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=vector-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-index.js","sourceRoot":"","sources":["../../../src/skill/vector-index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,8BAA8B;AAC9B,+DAA+D;AAwC/D;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IACtB,KAAK,GAAiB,EAAE,CAAC;IAEjC,KAAK,CAAC,KAAK,CAAC,KAAmB;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAgB;QACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAe,EAAE,IAAI,GAAG,EAAE;QACrC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE7D,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Message } from '../types.js';
|
|
2
|
+
import type { HistoryPersistence } from '../agent/types.js';
|
|
3
|
+
export interface JsonlHistoryPersistenceOptions {
|
|
4
|
+
/** 存储目录(相对于 data 目录),默认 'history' */
|
|
5
|
+
dir?: string;
|
|
6
|
+
/** 使用项目级目录({cwd}/data)而非全局目录(~/.agent/data) */
|
|
7
|
+
projectLocal?: boolean;
|
|
8
|
+
/** 直接使用绝对路径(忽略 projectLocal 和 dir) */
|
|
9
|
+
absoluteDir?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Append-only JSONL 会话历史持久化
|
|
13
|
+
*
|
|
14
|
+
* 文件路径:{dataDir}/{dir}/{sessionId}.jsonl
|
|
15
|
+
*
|
|
16
|
+
* 特点:
|
|
17
|
+
* - Append-only:只追加不修改,保证审计完整性
|
|
18
|
+
* - JSONL 格式:每行一条 JSON,人类可读,可用 jq/grep 查询
|
|
19
|
+
* - 异步写入:不阻塞 Agent Loop
|
|
20
|
+
* - 容错:损坏行跳过,不中断加载
|
|
21
|
+
*/
|
|
22
|
+
export declare class JsonlHistoryPersistence implements HistoryPersistence {
|
|
23
|
+
private dir;
|
|
24
|
+
private projectLocal;
|
|
25
|
+
private absoluteDir?;
|
|
26
|
+
constructor(options?: JsonlHistoryPersistenceOptions);
|
|
27
|
+
/** 获取会话历史文件路径 */
|
|
28
|
+
private getFilePath;
|
|
29
|
+
/** 确保目录存在 */
|
|
30
|
+
private ensureDir;
|
|
31
|
+
save(sessionId: string, message: Message): Promise<void>;
|
|
32
|
+
load(sessionId: string): Promise<Message[] | null>;
|
|
33
|
+
delete(sessionId: string): Promise<void>;
|
|
34
|
+
exists(sessionId: string): Promise<boolean>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=history-persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-persistence.d.ts","sourceRoot":"","sources":["../../../src/store/history-persistence.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,MAAM,WAAW,8BAA8B;IAC7C,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,uBAAwB,YAAW,kBAAkB;IAChE,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAS;gBAEjB,OAAO,GAAE,8BAAmC;IAMxD,iBAAiB;IACjB,OAAO,CAAC,WAAW;IASnB,aAAa;YACC,SAAS;IAOjB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IA+BlD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CASlD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// JsonlHistoryPersistence — Append-only JSONL 会话历史持久化
|
|
3
|
+
// ============================================================
|
|
4
|
+
//
|
|
5
|
+
// 每个 session 一个 .jsonl 文件,每行一条 Message JSON。
|
|
6
|
+
// - save(): 追加一行(append-only,不覆盖已有内容)
|
|
7
|
+
// - load(): 逐行读取重建 Message[]
|
|
8
|
+
// - delete(): 删除文件
|
|
9
|
+
//
|
|
10
|
+
// 设计参考:Claude Code 的 append-only JSONL 转录
|
|
11
|
+
import * as fsp from 'fs/promises';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { getDataPath } from "../utils/data-dir.js";
|
|
14
|
+
/**
|
|
15
|
+
* Append-only JSONL 会话历史持久化
|
|
16
|
+
*
|
|
17
|
+
* 文件路径:{dataDir}/{dir}/{sessionId}.jsonl
|
|
18
|
+
*
|
|
19
|
+
* 特点:
|
|
20
|
+
* - Append-only:只追加不修改,保证审计完整性
|
|
21
|
+
* - JSONL 格式:每行一条 JSON,人类可读,可用 jq/grep 查询
|
|
22
|
+
* - 异步写入:不阻塞 Agent Loop
|
|
23
|
+
* - 容错:损坏行跳过,不中断加载
|
|
24
|
+
*/
|
|
25
|
+
export class JsonlHistoryPersistence {
|
|
26
|
+
dir;
|
|
27
|
+
projectLocal;
|
|
28
|
+
absoluteDir;
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
this.dir = options.dir || 'history';
|
|
31
|
+
this.projectLocal = options.projectLocal ?? false;
|
|
32
|
+
this.absoluteDir = options.absoluteDir;
|
|
33
|
+
}
|
|
34
|
+
/** 获取会话历史文件路径 */
|
|
35
|
+
getFilePath(sessionId) {
|
|
36
|
+
// 防止路径遍历:只允许字母数字和 -_
|
|
37
|
+
const safeId = sessionId.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
38
|
+
if (this.absoluteDir) {
|
|
39
|
+
return path.join(this.absoluteDir, `${safeId}.jsonl`);
|
|
40
|
+
}
|
|
41
|
+
return getDataPath(`${this.dir}/${safeId}.jsonl`);
|
|
42
|
+
}
|
|
43
|
+
/** 确保目录存在 */
|
|
44
|
+
async ensureDir() {
|
|
45
|
+
const dirPath = this.absoluteDir
|
|
46
|
+
? this.absoluteDir
|
|
47
|
+
: path.dirname(getDataPath(`${this.dir}/.placeholder`));
|
|
48
|
+
await fsp.mkdir(dirPath, { recursive: true });
|
|
49
|
+
}
|
|
50
|
+
async save(sessionId, message) {
|
|
51
|
+
await this.ensureDir();
|
|
52
|
+
const filePath = this.getFilePath(sessionId);
|
|
53
|
+
const line = JSON.stringify(message) + '\n';
|
|
54
|
+
await fsp.appendFile(filePath, line, 'utf-8');
|
|
55
|
+
}
|
|
56
|
+
async load(sessionId) {
|
|
57
|
+
const filePath = this.getFilePath(sessionId);
|
|
58
|
+
try {
|
|
59
|
+
await fsp.access(filePath);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const raw = await fsp.readFile(filePath, 'utf-8');
|
|
66
|
+
const lines = raw.split('\n').filter(line => line.trim());
|
|
67
|
+
const messages = [];
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
try {
|
|
70
|
+
const msg = JSON.parse(line);
|
|
71
|
+
messages.push(msg);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// 跳过损坏行(如写入中断导致的不完整 JSON)
|
|
75
|
+
console.warn(`[JsonlHistoryPersistence] Skipped malformed line in ${filePath}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return messages;
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.error(`[JsonlHistoryPersistence] load error: ${filePath}`, e);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async delete(sessionId) {
|
|
86
|
+
const filePath = this.getFilePath(sessionId);
|
|
87
|
+
try {
|
|
88
|
+
await fsp.unlink(filePath);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// 文件不存在时静默忽略
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async exists(sessionId) {
|
|
95
|
+
const filePath = this.getFilePath(sessionId);
|
|
96
|
+
try {
|
|
97
|
+
await fsp.access(filePath);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=history-persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-persistence.js","sourceRoot":"","sources":["../../../src/store/history-persistence.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -1,3 +1,30 @@
|
|
|
1
|
+
/** 文本内容部分 */
|
|
2
|
+
export interface TextPart {
|
|
3
|
+
type: 'text';
|
|
4
|
+
text: string;
|
|
5
|
+
}
|
|
6
|
+
/** 图片内容部分 */
|
|
7
|
+
export interface ImagePart {
|
|
8
|
+
type: 'image';
|
|
9
|
+
/** 图片来源:URL(http/https)或 base64 data URI(data:image/png;base64,...) */
|
|
10
|
+
source: string;
|
|
11
|
+
/** 图片 MIME 类型(如 image/png, image/jpeg),base64 时可从 data URI 推断 */
|
|
12
|
+
mimeType?: string;
|
|
13
|
+
/** 图片详情级别(OpenAI: low/high/auto),默认 auto */
|
|
14
|
+
detail?: 'low' | 'high' | 'auto';
|
|
15
|
+
}
|
|
16
|
+
/** 文件内容部分(PDF、文档等,由上层解析为文本后注入) */
|
|
17
|
+
export interface FilePart {
|
|
18
|
+
type: 'file';
|
|
19
|
+
/** 文件名 */
|
|
20
|
+
filename: string;
|
|
21
|
+
/** 文件内容(文本形式,已由上层解析提取) */
|
|
22
|
+
content: string;
|
|
23
|
+
/** 文件 MIME 类型 */
|
|
24
|
+
mimeType?: string;
|
|
25
|
+
}
|
|
26
|
+
/** 多模态内容部分(discriminated union) */
|
|
27
|
+
export type ContentPart = TextPart | ImagePart | FilePart;
|
|
1
28
|
/** 消息角色 */
|
|
2
29
|
export type MessageRole = 'system' | 'user' | 'assistant' | 'tool';
|
|
3
30
|
/** LLM 发起的工具调用 */
|
|
@@ -12,7 +39,8 @@ export interface ToolCall {
|
|
|
12
39
|
/** LLM 消息 */
|
|
13
40
|
export interface Message {
|
|
14
41
|
role: MessageRole;
|
|
15
|
-
|
|
42
|
+
/** 消息内容:纯文本字符串、多模态内容部分数组、或 null(无内容) */
|
|
43
|
+
content: string | ContentPart[] | null;
|
|
16
44
|
/** assistant 消息中的工具调用请求 */
|
|
17
45
|
tool_calls?: ToolCall[];
|
|
18
46
|
/** tool 消息对应的 tool_call id */
|
|
@@ -24,6 +52,17 @@ export interface Message {
|
|
|
24
52
|
/** 扩展字段,上层可附加任意元数据 */
|
|
25
53
|
metadata?: Record<string, unknown>;
|
|
26
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* 从 Message.content 中提取纯文本(用于 Skill 路由、去重检测等场景)
|
|
57
|
+
* - string 直接返回
|
|
58
|
+
* - ContentPart[] 拼接所有 TextPart 和 FilePart 的文本
|
|
59
|
+
* - null 返回空字符串
|
|
60
|
+
*/
|
|
61
|
+
export declare function extractTextFromContent(content: string | ContentPart[] | null): string;
|
|
62
|
+
/**
|
|
63
|
+
* 判断消息内容是否为多模态(包含非文本部分)
|
|
64
|
+
*/
|
|
65
|
+
export declare function isMultimodalContent(content: string | ContentPart[] | null): boolean;
|
|
27
66
|
/** 所有事件的公共基座 */
|
|
28
67
|
export interface BaseEvent {
|
|
29
68
|
/** 事件时间戳(毫秒) */
|
package/dist/esm/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAMA,WAAW;AACX,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAEnE,kBAAkB;AAClB,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,aAAa;AACb,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/types.js
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
// ============================================================
|
|
2
2
|
// Core 全局共享类型
|
|
3
3
|
// ============================================================
|
|
4
|
-
|
|
4
|
+
// ---- ContentPart 辅助函数 ----
|
|
5
|
+
/**
|
|
6
|
+
* 从 Message.content 中提取纯文本(用于 Skill 路由、去重检测等场景)
|
|
7
|
+
* - string 直接返回
|
|
8
|
+
* - ContentPart[] 拼接所有 TextPart 和 FilePart 的文本
|
|
9
|
+
* - null 返回空字符串
|
|
10
|
+
*/
|
|
11
|
+
export function extractTextFromContent(content) {
|
|
12
|
+
if (content == null)
|
|
13
|
+
return '';
|
|
14
|
+
if (typeof content === 'string')
|
|
15
|
+
return content;
|
|
16
|
+
return content
|
|
17
|
+
.map(part => {
|
|
18
|
+
if (part.type === 'text')
|
|
19
|
+
return part.text;
|
|
20
|
+
if (part.type === 'file')
|
|
21
|
+
return `[file: ${part.filename}]\n${part.content}`;
|
|
22
|
+
if (part.type === 'image')
|
|
23
|
+
return `[image: ${part.source.slice(0, 80)}]`;
|
|
24
|
+
return '';
|
|
25
|
+
})
|
|
26
|
+
.join('\n');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 判断消息内容是否为多模态(包含非文本部分)
|
|
30
|
+
*/
|
|
31
|
+
export function isMultimodalContent(content) {
|
|
32
|
+
if (content == null || typeof content === 'string')
|
|
33
|
+
return false;
|
|
34
|
+
return content.some(part => part.type === 'image' || part.type === 'file');
|
|
35
|
+
}
|
|
5
36
|
//# sourceMappingURL=types.js.map
|
package/dist/esm/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,cAAc;AACd,+DAA+D"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,cAAc;AACd,+DAA+D;AAmE/D,6BAA6B;AAE7B;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC3E,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,OAAO,OAAO;SACX,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,UAAU,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7E,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,WAAW,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;QACzE,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsC;IACxE,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjE,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../../src/utils/token-counter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../../src/utils/token-counter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AA6BxD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBhD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAiC9D;AA0BD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD"}
|
|
@@ -67,7 +67,15 @@ export function countMessageTokens(messages) {
|
|
|
67
67
|
total += countTokens(msg.role || '');
|
|
68
68
|
// content
|
|
69
69
|
if (msg.content) {
|
|
70
|
-
|
|
70
|
+
if (typeof msg.content === 'string') {
|
|
71
|
+
total += countTokens(msg.content);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// ContentPart[]:逐部分计算
|
|
75
|
+
for (const part of msg.content) {
|
|
76
|
+
total += countContentPartTokens(part);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
71
79
|
}
|
|
72
80
|
// tool_calls (序列化后的 token 数)
|
|
73
81
|
if (msg.tool_calls) {
|
|
@@ -85,6 +93,30 @@ export function countMessageTokens(messages) {
|
|
|
85
93
|
total += 2;
|
|
86
94
|
return total;
|
|
87
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* 计算单个 ContentPart 的 token 估算值
|
|
98
|
+
* - TextPart: 精确计数
|
|
99
|
+
* - ImagePart: 按详情级别估算(参考 OpenAI Vision 定价)
|
|
100
|
+
* - low: ~85 tokens(512x512 固定)
|
|
101
|
+
* - high: ~170 tokens/tile(最多 4 tiles → ~680)
|
|
102
|
+
* - auto: 默认按 low 估算
|
|
103
|
+
* - FilePart: 计数文本内容
|
|
104
|
+
*/
|
|
105
|
+
function countContentPartTokens(part) {
|
|
106
|
+
switch (part.type) {
|
|
107
|
+
case 'text':
|
|
108
|
+
return countTokens(part.text);
|
|
109
|
+
case 'image':
|
|
110
|
+
// OpenAI Vision: low=85, high=170*tiles(1-4), auto≈85
|
|
111
|
+
if (part.detail === 'high')
|
|
112
|
+
return 680;
|
|
113
|
+
return 85;
|
|
114
|
+
case 'file':
|
|
115
|
+
return countTokens(part.content) + countTokens(part.filename);
|
|
116
|
+
default:
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
88
120
|
/**
|
|
89
121
|
* 估算文本 token 数(快速估算,不加载 tiktoken)
|
|
90
122
|
* 适用于对精度要求不高的场景,约 4 字符 = 1 token
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../../src/utils/token-counter.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,uCAAuC;AACvC,+DAA+D;AAE/D,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGzD,iDAAiD;AACjD,IAAI,OAAO,GAAoB,IAAI,CAAC;AAEpC;;;GAGG;AACH,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE7C;;GAEG;AACH,SAAS,UAAU;IACjB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC;YACH,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;YAC9B,OAAO,GAAG,IAAI,QAAQ,CACpB,OAAO,CAAC,+BAA+B,CAAC,CACzC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,OAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IAEpB,OAAO;IACP,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,qBAAqB;QACrB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAE/C,cAAc;IACd,IAAI,UAAU,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;QACvC,2BAA2B;QAC3B,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACjD,IAAI,SAAS,KAAK,SAAS;YAAE,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IACD,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE5B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAmB;IACpD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,mCAAmC;QACnC,KAAK,IAAI,CAAC,CAAC;QACX,OAAO;QACP,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACrC,UAAU;QACV,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,
|
|
1
|
+
{"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../../src/utils/token-counter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cicctencent/agent-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.20",
|
|
4
4
|
"description": "Core engine for AI agent — LLM orchestration, tool execution, MCP, skill routing, security, and memory pipeline.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|