@roarpeng/graphflow 1.3.3 → 1.4.0

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.
Files changed (193) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +93 -111
  3. package/dist/agents/insight.d.ts +1 -1
  4. package/dist/agents/insight.d.ts.map +1 -1
  5. package/dist/agents/insight.js +1 -1
  6. package/dist/agents/insight.js.map +1 -1
  7. package/dist/agents/validator.js +1 -1
  8. package/dist/agents/validator.js.map +1 -1
  9. package/dist/config/defaults.d.ts.map +1 -1
  10. package/dist/config/defaults.js +3 -17
  11. package/dist/config/defaults.js.map +1 -1
  12. package/dist/config/discover-workspace.d.ts +10 -0
  13. package/dist/config/discover-workspace.d.ts.map +1 -1
  14. package/dist/config/discover-workspace.js +77 -1
  15. package/dist/config/discover-workspace.js.map +1 -1
  16. package/dist/config/embedding-factory.d.ts.map +1 -1
  17. package/dist/config/embedding-factory.js +4 -5
  18. package/dist/config/embedding-factory.js.map +1 -1
  19. package/dist/config/llm-availability.d.ts.map +1 -1
  20. package/dist/config/llm-availability.js +0 -8
  21. package/dist/config/llm-availability.js.map +1 -1
  22. package/dist/config/loader.d.ts.map +1 -1
  23. package/dist/config/loader.js +4 -75
  24. package/dist/config/loader.js.map +1 -1
  25. package/dist/config/merge.d.ts.map +1 -1
  26. package/dist/config/merge.js +0 -40
  27. package/dist/config/merge.js.map +1 -1
  28. package/dist/config/schema.d.ts +5 -43
  29. package/dist/config/schema.d.ts.map +1 -1
  30. package/dist/config/workspace-root.d.ts.map +1 -1
  31. package/dist/config/workspace-root.js +11 -1
  32. package/dist/config/workspace-root.js.map +1 -1
  33. package/dist/core/agent-delegation.d.ts +1 -1
  34. package/dist/core/agent-delegation.d.ts.map +1 -1
  35. package/dist/core/orchestrator-context.d.ts.map +1 -1
  36. package/dist/core/orchestrator-context.js +12 -5
  37. package/dist/core/orchestrator-context.js.map +1 -1
  38. package/dist/core/orchestrator.js +8 -2
  39. package/dist/core/orchestrator.js.map +1 -1
  40. package/dist/core/triage.js +2 -2
  41. package/dist/core/triage.js.map +1 -1
  42. package/dist/core/types.d.ts +1 -1
  43. package/dist/core/types.d.ts.map +1 -1
  44. package/dist/graph/context-slicer-types.d.ts +13 -16
  45. package/dist/graph/context-slicer-types.d.ts.map +1 -1
  46. package/dist/graph/context-slicer-types.js.map +1 -1
  47. package/dist/graph/context-slicer.d.ts +4 -5
  48. package/dist/graph/context-slicer.d.ts.map +1 -1
  49. package/dist/graph/context-slicer.js +14 -28
  50. package/dist/graph/context-slicer.js.map +1 -1
  51. package/dist/graph/file-indexer-walker.d.ts.map +1 -1
  52. package/dist/graph/file-indexer-walker.js +9 -6
  53. package/dist/graph/file-indexer-walker.js.map +1 -1
  54. package/dist/graph/file-indexer.d.ts.map +1 -1
  55. package/dist/graph/file-indexer.js +19 -0
  56. package/dist/graph/file-indexer.js.map +1 -1
  57. package/dist/graph/file-watcher.d.ts.map +1 -1
  58. package/dist/graph/file-watcher.js +2 -1
  59. package/dist/graph/file-watcher.js.map +1 -1
  60. package/dist/hooks/post-run-sync.d.ts +1 -1
  61. package/dist/hooks/post-run-sync.d.ts.map +1 -1
  62. package/dist/hooks/post-run-sync.js +3 -14
  63. package/dist/hooks/post-run-sync.js.map +1 -1
  64. package/dist/index.d.ts +2 -4
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +5 -7
  67. package/dist/index.js.map +1 -1
  68. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
  69. package/dist/integrations/agent-mcp-installer.js +6 -17
  70. package/dist/integrations/agent-mcp-installer.js.map +1 -1
  71. package/dist/learning/embeddings.d.ts +0 -1
  72. package/dist/learning/embeddings.d.ts.map +1 -1
  73. package/dist/learning/embeddings.js +0 -15
  74. package/dist/learning/embeddings.js.map +1 -1
  75. package/dist/learning/episodic-memory.d.ts +1 -1
  76. package/dist/learning/episodic-memory.d.ts.map +1 -1
  77. package/dist/learning/episodic-memory.js +38 -1
  78. package/dist/learning/episodic-memory.js.map +1 -1
  79. package/dist/learning/hnsw-index.d.ts +23 -4
  80. package/dist/learning/hnsw-index.d.ts.map +1 -1
  81. package/dist/learning/hnsw-index.js +78 -4
  82. package/dist/learning/hnsw-index.js.map +1 -1
  83. package/dist/learning/nightly-trainer.d.ts +0 -2
  84. package/dist/learning/nightly-trainer.d.ts.map +1 -1
  85. package/dist/learning/nightly-trainer.js +10 -18
  86. package/dist/learning/nightly-trainer.js.map +1 -1
  87. package/dist/learning/skill-flywheel.d.ts +2 -3
  88. package/dist/learning/skill-flywheel.d.ts.map +1 -1
  89. package/dist/learning/skill-flywheel.js +23 -84
  90. package/dist/learning/skill-flywheel.js.map +1 -1
  91. package/dist/learning/skill-store.d.ts +1 -3
  92. package/dist/learning/skill-store.d.ts.map +1 -1
  93. package/dist/learning/skill-store.js +0 -36
  94. package/dist/learning/skill-store.js.map +1 -1
  95. package/dist/learning/skill-types.d.ts +0 -13
  96. package/dist/learning/skill-types.d.ts.map +1 -1
  97. package/dist/learning/skill-types.js.map +1 -1
  98. package/dist/routing/model-router.d.ts +1 -1
  99. package/dist/routing/model-router.d.ts.map +1 -1
  100. package/dist/routing/model-router.js +1 -52
  101. package/dist/routing/model-router.js.map +1 -1
  102. package/dist/routing/provider-executor.d.ts.map +1 -1
  103. package/dist/routing/provider-executor.js +0 -48
  104. package/dist/routing/provider-executor.js.map +1 -1
  105. package/dist/routing/provider-health.d.ts.map +1 -1
  106. package/dist/routing/provider-health.js +2 -12
  107. package/dist/routing/provider-health.js.map +1 -1
  108. package/dist/surfaces/cli/index.js +19 -77
  109. package/dist/surfaces/cli/index.js.map +1 -1
  110. package/dist/surfaces/cli/init.d.ts +2 -25
  111. package/dist/surfaces/cli/init.d.ts.map +1 -1
  112. package/dist/surfaces/cli/init.js +57 -312
  113. package/dist/surfaces/cli/init.js.map +1 -1
  114. package/dist/surfaces/cli/output.d.ts.map +1 -1
  115. package/dist/surfaces/cli/output.js +1 -3
  116. package/dist/surfaces/cli/output.js.map +1 -1
  117. package/dist/surfaces/cli/runtime/env.d.ts +0 -5
  118. package/dist/surfaces/cli/runtime/env.d.ts.map +1 -1
  119. package/dist/surfaces/cli/runtime/env.js +0 -115
  120. package/dist/surfaces/cli/runtime/env.js.map +1 -1
  121. package/dist/surfaces/cli/runtime/facade.d.ts +10 -17
  122. package/dist/surfaces/cli/runtime/facade.d.ts.map +1 -1
  123. package/dist/surfaces/cli/runtime/facade.js +5 -5
  124. package/dist/surfaces/cli/runtime/facade.js.map +1 -1
  125. package/dist/surfaces/cli/runtime/graph.d.ts +11 -21
  126. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  127. package/dist/surfaces/cli/runtime/graph.js +31 -261
  128. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  129. package/dist/surfaces/cli/runtime/learning.d.ts +6 -0
  130. package/dist/surfaces/cli/runtime/learning.d.ts.map +1 -0
  131. package/dist/surfaces/cli/runtime/learning.js +28 -0
  132. package/dist/surfaces/cli/runtime/learning.js.map +1 -0
  133. package/dist/surfaces/cli/runtime/routing.d.ts +1 -3
  134. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  135. package/dist/surfaces/cli/runtime/routing.js +12 -36
  136. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  137. package/dist/surfaces/cli/runtime/settings.d.ts.map +1 -1
  138. package/dist/surfaces/cli/runtime/settings.js +11 -117
  139. package/dist/surfaces/cli/runtime/settings.js.map +1 -1
  140. package/dist/surfaces/cli/runtime/types.d.ts +11 -35
  141. package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
  142. package/dist/surfaces/cli/runtime.d.ts +4 -4
  143. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  144. package/dist/surfaces/cli/runtime.js +5 -12
  145. package/dist/surfaces/cli/runtime.js.map +1 -1
  146. package/dist/surfaces/mcp/server.d.ts +4 -4
  147. package/dist/surfaces/mcp/server.d.ts.map +1 -1
  148. package/dist/surfaces/mcp/server.js +18 -21
  149. package/dist/surfaces/mcp/server.js.map +1 -1
  150. package/dist/surfaces/mcp/tool-definitions.d.ts.map +1 -1
  151. package/dist/surfaces/mcp/tool-definitions.js +0 -42
  152. package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
  153. package/dist/surfaces/mcp/tool-handlers.d.ts +1 -4
  154. package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
  155. package/dist/surfaces/mcp/tool-handlers.js +1 -64
  156. package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
  157. package/dist/utils/safe-fs.d.ts +6 -0
  158. package/dist/utils/safe-fs.d.ts.map +1 -0
  159. package/dist/utils/safe-fs.js +37 -0
  160. package/dist/utils/safe-fs.js.map +1 -0
  161. package/package.json +3 -5
  162. package/dist/graph/compression-model.d.ts +0 -52
  163. package/dist/graph/compression-model.d.ts.map +0 -1
  164. package/dist/graph/compression-model.js +0 -125
  165. package/dist/graph/compression-model.js.map +0 -1
  166. package/dist/graph/semantic-compression.d.ts +0 -65
  167. package/dist/graph/semantic-compression.d.ts.map +0 -1
  168. package/dist/graph/semantic-compression.js +0 -173
  169. package/dist/graph/semantic-compression.js.map +0 -1
  170. package/dist/graph/semantic-enricher.d.ts +0 -17
  171. package/dist/graph/semantic-enricher.d.ts.map +0 -1
  172. package/dist/graph/semantic-enricher.js +0 -97
  173. package/dist/graph/semantic-enricher.js.map +0 -1
  174. package/dist/learning/canary-gate.d.ts +0 -6
  175. package/dist/learning/canary-gate.d.ts.map +0 -1
  176. package/dist/learning/canary-gate.js +0 -13
  177. package/dist/learning/canary-gate.js.map +0 -1
  178. package/dist/learning/local-embedding.d.ts +0 -3
  179. package/dist/learning/local-embedding.d.ts.map +0 -1
  180. package/dist/learning/local-embedding.js +0 -37
  181. package/dist/learning/local-embedding.js.map +0 -1
  182. package/dist/learning/skill-evolution.d.ts +0 -16
  183. package/dist/learning/skill-evolution.d.ts.map +0 -1
  184. package/dist/learning/skill-evolution.js +0 -154
  185. package/dist/learning/skill-evolution.js.map +0 -1
  186. package/dist/learning/vector-store.d.ts +0 -20
  187. package/dist/learning/vector-store.d.ts.map +0 -1
  188. package/dist/learning/vector-store.js +0 -77
  189. package/dist/learning/vector-store.js.map +0 -1
  190. package/dist/routing/provider-adapters/openbmb.d.ts +0 -16
  191. package/dist/routing/provider-adapters/openbmb.d.ts.map +0 -1
  192. package/dist/routing/provider-adapters/openbmb.js +0 -368
  193. package/dist/routing/provider-adapters/openbmb.js.map +0 -1
@@ -1,154 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.evolveCompositeSkillLlm = evolveCompositeSkillLlm;
4
- exports.getTripleAtomNames = getTripleAtomNames;
5
- exports.buildTripleFusionNode = buildTripleFusionNode;
6
- exports.cleanJsonString = cleanJsonString;
7
- exports.updateSkillCanary = updateSkillCanary;
8
- const hash_1 = require("../utils/hash");
9
- const logger_1 = require("../utils/logger");
10
- const provider_executor_1 = require("../routing/provider-executor");
11
- const skill_store_1 = require("./skill-store");
12
- /**
13
- * 调遣 MiniCPM-1B 模拟人类进行跨技能融会贯通与概念演进
14
- */
15
- async function evolveCompositeSkillLlm(_client, n1, n2, previousComposite) {
16
- const openbmbModel = process.env.GRAPHFLOW_SKILL_EVOLVE_MODEL ?? "minicpm5-1b";
17
- const prompt = [
18
- `你是一个卓越的代码认知科学家,正模拟人类大脑的技能成长。`,
19
- `你已完全精通以下两项基础“原子技能”:`,
20
- `1. 技能 A: ${n1}`,
21
- `2. 技能 B: ${n2}`,
22
- ``,
23
- `请联想推演:人类在综合 A 和 B 后,能够融会贯通衍生出解决 C 领域什么问题的“复合高阶技能”?`,
24
- `请严格返回 JSON 格式:{"compositeSkillName": "复合技能名", "domainC": "C领域名", "methodologyDescription": "一句话核心方法论"}`,
25
- `不要有任何标点、引言 or markdown 包裹。直接输出合法 JSON:`
26
- ].join("\n");
27
- try {
28
- const selection = {
29
- provider: "openbmb",
30
- model: openbmbModel,
31
- tier: "economy",
32
- fallbackApplied: false
33
- };
34
- const rawJson = await (0, provider_executor_1.executeRolePrompt)("evolver", prompt, selection);
35
- const cleaned = cleanJsonString(rawJson, n1, n2);
36
- const parsed = JSON.parse(cleaned);
37
- if (!parsed.compositeSkillName || !parsed.domainC) {
38
- return null;
39
- }
40
- const evolutionId = `skill:evolution:${(0, hash_1.hashTextHex)(parsed.compositeSkillName)}`;
41
- const record = {
42
- id: evolutionId,
43
- name: parsed.compositeSkillName,
44
- parents: [(0, skill_store_1.skillNodeId)(n1), (0, skill_store_1.skillNodeId)(n2)],
45
- domain: parsed.domainC,
46
- description: parsed.methodologyDescription || "",
47
- score: previousComposite?.score ?? 1,
48
- uses: previousComposite?.uses ?? 1,
49
- updatedAt: Date.now(),
50
- canaryUses: 0,
51
- canaryPasses: 0,
52
- canaryStatus: 'probation',
53
- };
54
- // 返回生成的高阶进化技能节点,在外部写入图谱,并关联 prerequisite 拓扑边
55
- return {
56
- id: evolutionId,
57
- type: "Skill",
58
- content: JSON.stringify({ kind: "evolution", ...record })
59
- };
60
- }
61
- catch (error) {
62
- logger_1.logger.error({ error }, "Caught error");
63
- // 异常安全降级,若推理失败,退回传统规则拼接
64
- return null;
65
- }
66
- }
67
- function getTripleAtomNames(skills) {
68
- if (skills.length < 3) {
69
- return undefined;
70
- }
71
- // 别忘了从 skill-store.ts 拿 dedup (或者这里自己 dedup。为了简单,直接在这里使用 Set,也可以从 skill-store 导入。这里用 Set 也很简单,或者直接从 skill-store 导入。)
72
- const atoms = Array.from(new Set(skills)).sort();
73
- if (atoms.length < 3) {
74
- return undefined;
75
- }
76
- return [atoms[0], atoms[1], atoms[2]];
77
- }
78
- function buildTripleFusionNode(names, now) {
79
- if (process.env.GRAPHFLOW_SKILL_TRIPLE_FUSION === "0") {
80
- return undefined;
81
- }
82
- const [a, b, c] = names;
83
- const text = `${a}+${b}+${c}`;
84
- const id = `skill:triple:${(0, skill_store_1.sanitizeAtom)(a)}__${(0, skill_store_1.sanitizeAtom)(b)}__${(0, skill_store_1.sanitizeAtom)(c)}`;
85
- const content = {
86
- kind: "triple-composite",
87
- id,
88
- name: text,
89
- parents: [(0, skill_store_1.skillNodeId)(a), (0, skill_store_1.skillNodeId)(b), (0, skill_store_1.skillNodeId)(c)],
90
- score: 1,
91
- uses: 1,
92
- updatedAt: now,
93
- methodology: `融合 ${a}、${b}、${c} 的三元高阶技能`,
94
- };
95
- return {
96
- id,
97
- type: "Skill",
98
- content: JSON.stringify(content),
99
- };
100
- }
101
- function cleanJsonString(raw, n1, n2) {
102
- let text = raw.trim();
103
- // 适配测试环境及 mock 环境下的返回
104
- if (text.includes("[openbmb:") || text.includes("[openai:") || !text.startsWith("{")) {
105
- return JSON.stringify({
106
- compositeSkillName: `构建 ${n1} 与 ${n2} 融合高阶技能`,
107
- domainC: `${n1} & ${n2} 复合工程领域`,
108
- methodologyDescription: `在 mock 测试下完美融合 ${n1} 与 ${n2},达到大师级设计。`
109
- });
110
- }
111
- const fence = text.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i);
112
- if (fence && fence[1]) {
113
- text = fence[1].trim();
114
- }
115
- const start = text.indexOf("{");
116
- const end = text.lastIndexOf("}");
117
- if (start !== -1 && end !== -1 && end > start) {
118
- return text.slice(start, end + 1);
119
- }
120
- return text;
121
- }
122
- /**
123
- * 更新合成技能的 canary 验证状态
124
- * 当 canaryUses >= 3 时评估通过率决定 verified 或 demoted
125
- */
126
- async function updateSkillCanary(client, skillId, outcome) {
127
- const existing = await (0, skill_store_1.loadEvolutionSkill)(client, skillId);
128
- if (!existing) {
129
- return undefined;
130
- }
131
- existing.canaryUses += 1;
132
- if (outcome === 'pass') {
133
- existing.canaryPasses += 1;
134
- }
135
- // 累积足够样本后进行阈值判定
136
- if (existing.canaryUses >= 3) {
137
- const passRate = existing.canaryPasses / existing.canaryUses;
138
- if (passRate >= 0.5) {
139
- existing.canaryStatus = 'verified';
140
- }
141
- else {
142
- existing.canaryStatus = 'demoted';
143
- existing.score = -10;
144
- }
145
- }
146
- existing.updatedAt = Date.now();
147
- await client.upsertNodes([{
148
- id: existing.id,
149
- type: "Skill",
150
- content: JSON.stringify({ kind: "evolution", ...existing }),
151
- }]);
152
- return existing;
153
- }
154
- //# sourceMappingURL=skill-evolution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-evolution.js","sourceRoot":"","sources":["../../src/learning/skill-evolution.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- export interface VectorNode {
2
- id: string;
3
- content: string;
4
- embedding: number[];
5
- }
6
- export declare class VectorStore {
7
- private db;
8
- constructor(dbPath?: string);
9
- private initSchema;
10
- addNode(node: VectorNode): void;
11
- addNodes(nodes: VectorNode[]): void;
12
- query(queryEmbedding: number[], topK?: number, minSimilarity?: number): Array<{
13
- node: VectorNode;
14
- score: number;
15
- }>;
16
- deleteNode(id: string): void;
17
- /** 关闭底层 SQLite 句柄,长驻进程退出前必须调用以避免文件描述符泄漏。 */
18
- close(): void;
19
- }
20
- //# sourceMappingURL=vector-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/learning/vector-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoC;gBAElC,MAAM,GAAE,MAAsC;IAU1D,OAAO,CAAC,UAAU;IAUX,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAQ/B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI;IAanC,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,MAAU,EAAE,aAAa,GAAE,MAAU,GAAG,KAAK,CAAC;QAAC,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC;IAuBtH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKnC,4CAA4C;IACrC,KAAK,IAAI,IAAI;CAGrB"}
@@ -1,77 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.VectorStore = void 0;
7
- const node_fs_1 = require("node:fs");
8
- const node_path_1 = require("node:path");
9
- const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
10
- const embeddings_1 = require("./embeddings");
11
- class VectorStore {
12
- db;
13
- constructor(dbPath = ".graphflow-cache/vectors.db") {
14
- const dir = (0, node_path_1.dirname)(dbPath);
15
- if (dir && dir !== "." && dir !== "") {
16
- (0, node_fs_1.mkdirSync)(dir, { recursive: true });
17
- }
18
- this.db = new better_sqlite3_1.default(dbPath);
19
- this.db.pragma("journal_mode = WAL");
20
- this.initSchema();
21
- }
22
- initSchema() {
23
- this.db.exec(`
24
- CREATE TABLE IF NOT EXISTS vector_nodes (
25
- id TEXT PRIMARY KEY,
26
- content TEXT NOT NULL,
27
- embedding TEXT NOT NULL
28
- )
29
- `);
30
- }
31
- addNode(node) {
32
- const stmt = this.db.prepare(`INSERT INTO vector_nodes (id, content, embedding) VALUES (?, ?, ?)
33
- ON CONFLICT(id) DO UPDATE SET content=excluded.content, embedding=excluded.embedding`);
34
- stmt.run(node.id, node.content, JSON.stringify(node.embedding));
35
- }
36
- addNodes(nodes) {
37
- const stmt = this.db.prepare(`INSERT INTO vector_nodes (id, content, embedding) VALUES (?, ?, ?)
38
- ON CONFLICT(id) DO UPDATE SET content=excluded.content, embedding=excluded.embedding`);
39
- const tx = this.db.transaction((batch) => {
40
- for (const node of batch) {
41
- stmt.run(node.id, node.content, JSON.stringify(node.embedding));
42
- }
43
- });
44
- tx(nodes);
45
- }
46
- query(queryEmbedding, topK = 5, minSimilarity = 0) {
47
- const rows = this.db.prepare(`SELECT id, content, embedding FROM vector_nodes`).all();
48
- const results = [];
49
- for (const row of rows) {
50
- try {
51
- const emb = JSON.parse(row.embedding);
52
- const score = (0, embeddings_1.cosineSimilarity)(queryEmbedding, emb);
53
- if (score >= minSimilarity) {
54
- results.push({
55
- node: { id: row.id, content: row.content, embedding: emb },
56
- score
57
- });
58
- }
59
- }
60
- catch {
61
- // ignore invalid JSON
62
- }
63
- }
64
- results.sort((a, b) => b.score - a.score);
65
- return results.slice(0, topK);
66
- }
67
- deleteNode(id) {
68
- const stmt = this.db.prepare(`DELETE FROM vector_nodes WHERE id = ?`);
69
- stmt.run(id);
70
- }
71
- /** 关闭底层 SQLite 句柄,长驻进程退出前必须调用以避免文件描述符泄漏。 */
72
- close() {
73
- this.db.close();
74
- }
75
- }
76
- exports.VectorStore = VectorStore;
77
- //# sourceMappingURL=vector-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/learning/vector-store.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- export interface ProviderTextRequest {
2
- prompt: string;
3
- model: string;
4
- }
5
- export type OpenBmbMode = "embedded" | "ollama" | "openai-compat";
6
- export interface OpenBmbRuntimeOptions {
7
- mode?: OpenBmbMode;
8
- baseUrl?: string;
9
- apiKey?: string;
10
- timeoutMs?: number;
11
- maxTokens?: number;
12
- temperature?: number;
13
- modelPath?: string;
14
- }
15
- export declare function openbmbGenerateText(request: ProviderTextRequest, runtimeOptions?: OpenBmbRuntimeOptions): Promise<string>;
16
- //# sourceMappingURL=openbmb.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openbmb.d.ts","sourceRoot":"","sources":["../../../src/routing/provider-adapters/openbmb.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,eAAe,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8aD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,mBAAmB,EAC5B,cAAc,CAAC,EAAE,qBAAqB,GACrC,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
@@ -1,368 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.openbmbGenerateText = openbmbGenerateText;
4
- const logger_1 = require("../../utils/logger");
5
- const node_child_process_1 = require("node:child_process");
6
- const node_worker_threads_1 = require("node:worker_threads");
7
- const node_util_1 = require("node:util");
8
- const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
9
- class EmbeddedWorkerPool {
10
- worker;
11
- nextId = 1;
12
- pending = new Map();
13
- async run(payload) {
14
- this.ensureWorker();
15
- const id = this.nextId++;
16
- return new Promise((resolve, reject) => {
17
- const timer = setTimeout(() => {
18
- this.pending.delete(id);
19
- this.restartWorker(new Error(`openbmb embedded worker timed out after ${payload.timeoutMs}ms`), id);
20
- reject(new Error(`openbmb embedded worker timed out after ${payload.timeoutMs}ms`));
21
- }, payload.timeoutMs + 500);
22
- this.pending.set(id, { resolve, reject, timer });
23
- this.worker.postMessage({ id, ...payload });
24
- });
25
- }
26
- ensureWorker() {
27
- if (this.worker) {
28
- return;
29
- }
30
- const workerSource = `
31
- const { parentPort } = require("node:worker_threads");
32
- const { execFile } = require("node:child_process");
33
- const { promisify } = require("node:util");
34
- const execFileAsync = promisify(execFile);
35
- let llama = null;
36
- let loadedModel = null;
37
- let loadedContext = null;
38
- let loadedSequence = null;
39
- let loadedModelPath = null;
40
-
41
- async function runCommand(task) {
42
- if (!task.command) {
43
- throw new Error("openbmb embedded mode requires GRAPHFLOW_MINICPM_COMMAND");
44
- }
45
- const args = [
46
- "-m",
47
- task.modelPath || task.model,
48
- "-p",
49
- task.prompt,
50
- "-n",
51
- String(task.maxTokens),
52
- "--temp",
53
- String(task.temperature),
54
- "--no-display-prompt",
55
- ];
56
- const result = await execFileAsync(task.command, args, {
57
- timeout: task.timeoutMs,
58
- windowsHide: true,
59
- maxBuffer: 1024 * 1024,
60
- });
61
- const output = (result.stdout || "").trim();
62
- if (!output) {
63
- throw new Error("openbmb embedded mode returned empty output");
64
- }
65
- return output;
66
- }
67
-
68
- async function ensureNodeLlama(task) {
69
- if (!task.modelPath) {
70
- throw new Error("openbmb embedded node-llama-cpp mode requires modelPath");
71
- }
72
- if (loadedSequence && loadedModelPath === task.modelPath) {
73
- return loadedSequence;
74
- }
75
- const moduleRef = await import("node-llama-cpp");
76
- const createLlama = moduleRef.getLlama || moduleRef.createLlama;
77
- if (typeof createLlama !== "function") {
78
- throw new Error("node-llama-cpp API not available");
79
- }
80
- llama = llama || await createLlama({ gpu: "auto" });
81
- loadedModel = await llama.loadModel({ modelPath: task.modelPath });
82
- loadedContext = await loadedModel.createContext({ contextSize: 2048 });
83
- loadedSequence = loadedContext.getSequence();
84
- loadedModelPath = task.modelPath;
85
- return loadedSequence;
86
- }
87
-
88
- async function runNodeLlama(task) {
89
- const sequence = await ensureNodeLlama(task);
90
- const completion = await sequence.prompt(task.prompt, {
91
- temperature: task.temperature,
92
- maxTokens: task.maxTokens,
93
- stopOnAbortSignal: AbortSignal.timeout(task.timeoutMs),
94
- });
95
- const text = typeof completion === "string" ? completion.trim() : String(completion || "").trim();
96
- if (!text) {
97
- throw new Error("node-llama-cpp produced empty output");
98
- }
99
- global.gc?.();
100
- return text;
101
- }
102
-
103
- parentPort.on("message", async (task) => {
104
- try {
105
- const text = task.engine === "node-llama-cpp" ? await runNodeLlama(task) : await runCommand(task);
106
- parentPort.postMessage({ id: task.id, ok: true, text });
107
- } catch (error) {
108
- parentPort.postMessage({ id: task.id, ok: false, error: error instanceof Error ? error.message : String(error) });
109
- }
110
- });
111
- `;
112
- this.worker = new node_worker_threads_1.Worker(workerSource, { eval: true });
113
- this.worker.on("message", (msg) => {
114
- const id = msg.id;
115
- if (id === undefined) {
116
- return;
117
- }
118
- const pending = this.pending.get(id);
119
- if (!pending) {
120
- return;
121
- }
122
- clearTimeout(pending.timer);
123
- this.pending.delete(id);
124
- if (msg.ok && msg.text) {
125
- pending.resolve(msg.text);
126
- return;
127
- }
128
- pending.reject(new Error(msg.error ?? "openbmb embedded worker failed"));
129
- });
130
- this.worker.on("error", (error) => {
131
- this.restartWorker(error instanceof Error ? error : new Error(String(error)));
132
- });
133
- this.worker.on("exit", (code) => {
134
- if (code !== 0) {
135
- this.restartWorker(new Error(`openbmb embedded worker exited with code ${code}`));
136
- }
137
- else {
138
- this.worker = undefined;
139
- }
140
- });
141
- }
142
- restartWorker(reason, skipId) {
143
- const current = this.worker;
144
- this.worker = undefined;
145
- if (current) {
146
- void current.terminate();
147
- }
148
- for (const [id, pending] of this.pending.entries()) {
149
- if (id === skipId) {
150
- continue;
151
- }
152
- clearTimeout(pending.timer);
153
- pending.reject(reason);
154
- this.pending.delete(id);
155
- }
156
- }
157
- }
158
- const embeddedWorkerPool = new EmbeddedWorkerPool();
159
- function resolveOptions(input) {
160
- const mode = input?.mode ?? process.env.GRAPHFLOW_OPENBMB_MODE ?? "embedded";
161
- const baseUrl = input?.baseUrl ?? process.env.GRAPHFLOW_OPENBMB_BASE_URL ?? "http://localhost:11434";
162
- const timeoutMsRaw = input?.timeoutMs ?? Number(process.env.GRAPHFLOW_OPENBMB_TIMEOUT_MS ?? 5000);
163
- const maxTokensRaw = input?.maxTokens ?? Number(process.env.GRAPHFLOW_OPENBMB_MAX_TOKENS ?? 256);
164
- const temperatureRaw = input?.temperature ?? Number(process.env.GRAPHFLOW_OPENBMB_TEMPERATURE ?? 0.1);
165
- return {
166
- mode,
167
- baseUrl,
168
- apiKey: input?.apiKey ?? process.env.GRAPHFLOW_OPENBMB_API_KEY,
169
- modelPath: input?.modelPath ?? process.env.GRAPHFLOW_OPENBMB_MODEL_PATH,
170
- timeoutMs: Number.isFinite(timeoutMsRaw) ? Math.max(1000, Math.floor(timeoutMsRaw)) : 5000,
171
- maxTokens: Number.isFinite(maxTokensRaw) ? Math.max(16, Math.floor(maxTokensRaw)) : 256,
172
- temperature: Number.isFinite(temperatureRaw) ? temperatureRaw : 0.1,
173
- };
174
- }
175
- function asJsonRecord(value) {
176
- if (value && typeof value === "object") {
177
- return value;
178
- }
179
- return {};
180
- }
181
- async function postJson(url, body, options) {
182
- const controller = new AbortController();
183
- const timer = setTimeout(() => controller.abort(), options.timeoutMs);
184
- try {
185
- const response = await fetch(url, {
186
- method: "POST",
187
- headers: {
188
- "content-type": "application/json",
189
- ...(options.apiKey ? { authorization: `Bearer ${options.apiKey}` } : {}),
190
- },
191
- body: JSON.stringify(body),
192
- signal: controller.signal,
193
- });
194
- if (!response.ok) {
195
- const text = await response.text();
196
- throw new Error(`openbmb http ${response.status}: ${text.slice(0, 400)}`);
197
- }
198
- return asJsonRecord(await response.json());
199
- }
200
- finally {
201
- clearTimeout(timer);
202
- }
203
- }
204
- function pickFirstString(value) {
205
- if (typeof value === "string" && value.trim().length > 0) {
206
- return value.trim();
207
- }
208
- if (Array.isArray(value)) {
209
- for (const item of value) {
210
- const found = pickFirstString(item);
211
- if (found)
212
- return found;
213
- }
214
- }
215
- if (value && typeof value === "object") {
216
- const record = value;
217
- for (const key of ["response", "text", "content", "generated_text"]) {
218
- const found = pickFirstString(record[key]);
219
- if (found)
220
- return found;
221
- }
222
- const choices = record.choices;
223
- if (Array.isArray(choices) && choices[0] && typeof choices[0] === "object") {
224
- const choice = choices[0];
225
- const found = pickFirstString(choice.message ?? choice.text);
226
- if (found)
227
- return found;
228
- }
229
- const message = record.message;
230
- if (message && typeof message === "object") {
231
- const found = pickFirstString(message.content);
232
- if (found)
233
- return found;
234
- }
235
- }
236
- return undefined;
237
- }
238
- async function runEmbedded(request, options) {
239
- const useWorker = process.env.GRAPHFLOW_OPENBMB_USE_WORKER !== "0";
240
- if (useWorker) {
241
- return runEmbeddedInWorker(request, options);
242
- }
243
- const engine = process.env.GRAPHFLOW_MINICPM_ENGINE ?? "command";
244
- if (engine === "node-llama-cpp") {
245
- return runEmbeddedNodeLlamaCpp(request, options);
246
- }
247
- const command = process.env.GRAPHFLOW_MINICPM_COMMAND;
248
- if (!command) {
249
- throw new Error("openbmb embedded mode requires GRAPHFLOW_MINICPM_COMMAND");
250
- }
251
- const args = [
252
- "-m",
253
- options.modelPath ?? request.model,
254
- "-p",
255
- request.prompt,
256
- "-n",
257
- String(options.maxTokens),
258
- "--temp",
259
- String(options.temperature),
260
- "--no-display-prompt",
261
- ];
262
- const result = await execFileAsync(command, args, {
263
- timeout: options.timeoutMs,
264
- windowsHide: true,
265
- maxBuffer: 1024 * 1024,
266
- });
267
- const output = result.stdout.trim();
268
- if (!output) {
269
- throw new Error("openbmb embedded mode returned empty output");
270
- }
271
- return output;
272
- }
273
- async function runEmbeddedInWorker(request, options) {
274
- const engine = process.env.GRAPHFLOW_MINICPM_ENGINE ?? "command";
275
- const command = process.env.GRAPHFLOW_MINICPM_COMMAND;
276
- const payload = {
277
- engine,
278
- prompt: request.prompt,
279
- model: request.model,
280
- maxTokens: options.maxTokens,
281
- temperature: options.temperature,
282
- timeoutMs: options.timeoutMs,
283
- };
284
- if (command) {
285
- payload.command = command;
286
- }
287
- if (options.modelPath) {
288
- payload.modelPath = options.modelPath;
289
- }
290
- return embeddedWorkerPool.run(payload);
291
- }
292
- async function runEmbeddedNodeLlamaCpp(request, options) {
293
- const modelPath = options.modelPath;
294
- if (!modelPath) {
295
- throw new Error("openbmb embedded node-llama-cpp mode requires modelPath");
296
- }
297
- const module = (await import("node-llama-cpp"));
298
- const createLlama = module.getLlama ?? module.createLlama;
299
- if (typeof createLlama !== "function") {
300
- throw new Error("node-llama-cpp API not available");
301
- }
302
- const llama = await createLlama({ gpu: "auto" });
303
- const model = await llama.loadModel({ modelPath });
304
- const context = await model.createContext({ contextSize: 2048 });
305
- const sequence = context.getSequence();
306
- const completion = await sequence.prompt(request.prompt, {
307
- temperature: options.temperature,
308
- maxTokens: options.maxTokens,
309
- stopOnAbortSignal: AbortSignal.timeout(options.timeoutMs),
310
- });
311
- const text = typeof completion === "string" ? completion.trim() : String(completion ?? "").trim();
312
- if (!text) {
313
- throw new Error("node-llama-cpp produced empty output");
314
- }
315
- global.gc?.();
316
- return text;
317
- }
318
- async function runOllama(request, options) {
319
- const payload = await postJson(`${options.baseUrl.replace(/\/+$/, "")}/api/generate`, {
320
- model: request.model,
321
- prompt: request.prompt,
322
- stream: false,
323
- options: {
324
- temperature: options.temperature,
325
- num_predict: options.maxTokens,
326
- },
327
- }, { timeoutMs: options.timeoutMs });
328
- const text = pickFirstString(payload.response ?? payload.text ?? payload.message);
329
- if (!text) {
330
- throw new Error("openbmb ollama response missing text");
331
- }
332
- return text;
333
- }
334
- async function runOpenAiCompat(request, options) {
335
- const payload = await postJson(`${options.baseUrl.replace(/\/+$/, "")}/v1/chat/completions`, {
336
- model: request.model,
337
- messages: [{ role: "user", content: request.prompt }],
338
- temperature: options.temperature,
339
- max_tokens: options.maxTokens,
340
- stream: false,
341
- }, { timeoutMs: options.timeoutMs, ...(options.apiKey ? { apiKey: options.apiKey } : {}) });
342
- const text = pickFirstString(payload.choices ?? payload.message ?? payload.content);
343
- if (!text) {
344
- throw new Error("openbmb openai-compat response missing text");
345
- }
346
- return text;
347
- }
348
- async function openbmbGenerateText(request, runtimeOptions) {
349
- const options = resolveOptions(runtimeOptions);
350
- try {
351
- if (options.mode === "embedded") {
352
- return await runEmbedded(request, options);
353
- }
354
- if (options.mode === "ollama") {
355
- return await runOllama(request, options);
356
- }
357
- return await runOpenAiCompat(request, options);
358
- }
359
- catch (error) {
360
- logger_1.logger.error({ error: error instanceof Error ? error.message : String(error) }, "Provider adapter caught error");
361
- const strict = process.env.GRAPHFLOW_OPENBMB_STRICT === "1";
362
- if (strict) {
363
- throw error;
364
- }
365
- return `[openbmb:${request.model}] ${request.prompt}`;
366
- }
367
- }
368
- //# sourceMappingURL=openbmb.js.map