@roarpeng/graphflow 0.6.5

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 (271) hide show
  1. package/AGENTS.md +58 -0
  2. package/CHANGELOG.md +205 -0
  3. package/CLAUDE.md +39 -0
  4. package/LICENSE +17 -0
  5. package/README.md +434 -0
  6. package/dist/agents/brainstormer.d.ts +5 -0
  7. package/dist/agents/brainstormer.d.ts.map +1 -0
  8. package/dist/agents/brainstormer.js +61 -0
  9. package/dist/agents/brainstormer.js.map +1 -0
  10. package/dist/agents/planner.d.ts +14 -0
  11. package/dist/agents/planner.d.ts.map +1 -0
  12. package/dist/agents/planner.js +166 -0
  13. package/dist/agents/planner.js.map +1 -0
  14. package/dist/agents/validator.d.ts +6 -0
  15. package/dist/agents/validator.d.ts.map +1 -0
  16. package/dist/agents/validator.js +133 -0
  17. package/dist/agents/validator.js.map +1 -0
  18. package/dist/agents/worker.d.ts +18 -0
  19. package/dist/agents/worker.d.ts.map +1 -0
  20. package/dist/agents/worker.js +34 -0
  21. package/dist/agents/worker.js.map +1 -0
  22. package/dist/config/defaults.d.ts +16 -0
  23. package/dist/config/defaults.d.ts.map +1 -0
  24. package/dist/config/defaults.js +85 -0
  25. package/dist/config/defaults.js.map +1 -0
  26. package/dist/config/embedding-factory.d.ts +4 -0
  27. package/dist/config/embedding-factory.d.ts.map +1 -0
  28. package/dist/config/embedding-factory.js +37 -0
  29. package/dist/config/embedding-factory.js.map +1 -0
  30. package/dist/config/loader.d.ts +4 -0
  31. package/dist/config/loader.d.ts.map +1 -0
  32. package/dist/config/loader.js +194 -0
  33. package/dist/config/loader.js.map +1 -0
  34. package/dist/config/merge.d.ts +6 -0
  35. package/dist/config/merge.d.ts.map +1 -0
  36. package/dist/config/merge.js +130 -0
  37. package/dist/config/merge.js.map +1 -0
  38. package/dist/config/paths.d.ts +6 -0
  39. package/dist/config/paths.d.ts.map +1 -0
  40. package/dist/config/paths.js +32 -0
  41. package/dist/config/paths.js.map +1 -0
  42. package/dist/config/resolve.d.ts +4 -0
  43. package/dist/config/resolve.d.ts.map +1 -0
  44. package/dist/config/resolve.js +45 -0
  45. package/dist/config/resolve.js.map +1 -0
  46. package/dist/config/scaffold.d.ts +11 -0
  47. package/dist/config/scaffold.d.ts.map +1 -0
  48. package/dist/config/scaffold.js +42 -0
  49. package/dist/config/scaffold.js.map +1 -0
  50. package/dist/config/schema.d.ts +102 -0
  51. package/dist/config/schema.d.ts.map +1 -0
  52. package/dist/config/schema.js +3 -0
  53. package/dist/config/schema.js.map +1 -0
  54. package/dist/config/secrets.d.ts +9 -0
  55. package/dist/config/secrets.d.ts.map +1 -0
  56. package/dist/config/secrets.js +55 -0
  57. package/dist/config/secrets.js.map +1 -0
  58. package/dist/core/dag-engine.d.ts +14 -0
  59. package/dist/core/dag-engine.d.ts.map +1 -0
  60. package/dist/core/dag-engine.js +97 -0
  61. package/dist/core/dag-engine.js.map +1 -0
  62. package/dist/core/errors.d.ts +15 -0
  63. package/dist/core/errors.d.ts.map +1 -0
  64. package/dist/core/errors.js +29 -0
  65. package/dist/core/errors.js.map +1 -0
  66. package/dist/core/orchestrator.d.ts +31 -0
  67. package/dist/core/orchestrator.d.ts.map +1 -0
  68. package/dist/core/orchestrator.js +321 -0
  69. package/dist/core/orchestrator.js.map +1 -0
  70. package/dist/core/state-machine.d.ts +14 -0
  71. package/dist/core/state-machine.d.ts.map +1 -0
  72. package/dist/core/state-machine.js +77 -0
  73. package/dist/core/state-machine.js.map +1 -0
  74. package/dist/core/triage.d.ts +6 -0
  75. package/dist/core/triage.d.ts.map +1 -0
  76. package/dist/core/triage.js +58 -0
  77. package/dist/core/triage.js.map +1 -0
  78. package/dist/core/types.d.ts +61 -0
  79. package/dist/core/types.d.ts.map +1 -0
  80. package/dist/core/types.js +3 -0
  81. package/dist/core/types.js.map +1 -0
  82. package/dist/graph/client-factory.d.ts +22 -0
  83. package/dist/graph/client-factory.d.ts.map +1 -0
  84. package/dist/graph/client-factory.js +60 -0
  85. package/dist/graph/client-factory.js.map +1 -0
  86. package/dist/graph/context-slicer.d.ts +47 -0
  87. package/dist/graph/context-slicer.d.ts.map +1 -0
  88. package/dist/graph/context-slicer.js +246 -0
  89. package/dist/graph/context-slicer.js.map +1 -0
  90. package/dist/graph/file-indexer.d.ts +15 -0
  91. package/dist/graph/file-indexer.d.ts.map +1 -0
  92. package/dist/graph/file-indexer.js +343 -0
  93. package/dist/graph/file-indexer.js.map +1 -0
  94. package/dist/graph/graph-indexer.d.ts +7 -0
  95. package/dist/graph/graph-indexer.d.ts.map +1 -0
  96. package/dist/graph/graph-indexer.js +32 -0
  97. package/dist/graph/graph-indexer.js.map +1 -0
  98. package/dist/graph/graphify-client.d.ts +30 -0
  99. package/dist/graph/graphify-client.d.ts.map +1 -0
  100. package/dist/graph/graphify-client.js +186 -0
  101. package/dist/graph/graphify-client.js.map +1 -0
  102. package/dist/graph/graphify-file-client.d.ts +26 -0
  103. package/dist/graph/graphify-file-client.d.ts.map +1 -0
  104. package/dist/graph/graphify-file-client.js +140 -0
  105. package/dist/graph/graphify-file-client.js.map +1 -0
  106. package/dist/graph/graphify-mcp-client.d.ts +18 -0
  107. package/dist/graph/graphify-mcp-client.d.ts.map +1 -0
  108. package/dist/graph/graphify-mcp-client.js +73 -0
  109. package/dist/graph/graphify-mcp-client.js.map +1 -0
  110. package/dist/graph/language-indexers/c-cpp.d.ts +3 -0
  111. package/dist/graph/language-indexers/c-cpp.d.ts.map +1 -0
  112. package/dist/graph/language-indexers/c-cpp.js +121 -0
  113. package/dist/graph/language-indexers/c-cpp.js.map +1 -0
  114. package/dist/graph/language-indexers/go.d.ts +3 -0
  115. package/dist/graph/language-indexers/go.d.ts.map +1 -0
  116. package/dist/graph/language-indexers/go.js +97 -0
  117. package/dist/graph/language-indexers/go.js.map +1 -0
  118. package/dist/graph/language-indexers/index.d.ts +29 -0
  119. package/dist/graph/language-indexers/index.d.ts.map +1 -0
  120. package/dist/graph/language-indexers/index.js +27 -0
  121. package/dist/graph/language-indexers/index.js.map +1 -0
  122. package/dist/graph/language-indexers/python.d.ts +3 -0
  123. package/dist/graph/language-indexers/python.d.ts.map +1 -0
  124. package/dist/graph/language-indexers/python.js +91 -0
  125. package/dist/graph/language-indexers/python.js.map +1 -0
  126. package/dist/graph/language-indexers/rust.d.ts +3 -0
  127. package/dist/graph/language-indexers/rust.d.ts.map +1 -0
  128. package/dist/graph/language-indexers/rust.js +99 -0
  129. package/dist/graph/language-indexers/rust.js.map +1 -0
  130. package/dist/graph/language-indexers/tree-sitter-loader.d.ts +18 -0
  131. package/dist/graph/language-indexers/tree-sitter-loader.d.ts.map +1 -0
  132. package/dist/graph/language-indexers/tree-sitter-loader.js +34 -0
  133. package/dist/graph/language-indexers/tree-sitter-loader.js.map +1 -0
  134. package/dist/graph/language-indexers/typescript.d.ts +3 -0
  135. package/dist/graph/language-indexers/typescript.d.ts.map +1 -0
  136. package/dist/graph/language-indexers/typescript.js +194 -0
  137. package/dist/graph/language-indexers/typescript.js.map +1 -0
  138. package/dist/graph/semantic-enricher.d.ts +17 -0
  139. package/dist/graph/semantic-enricher.d.ts.map +1 -0
  140. package/dist/graph/semantic-enricher.js +97 -0
  141. package/dist/graph/semantic-enricher.js.map +1 -0
  142. package/dist/graph/sqlite-client.d.ts +24 -0
  143. package/dist/graph/sqlite-client.d.ts.map +1 -0
  144. package/dist/graph/sqlite-client.js +215 -0
  145. package/dist/graph/sqlite-client.js.map +1 -0
  146. package/dist/hooks/post-run-sync.d.ts +7 -0
  147. package/dist/hooks/post-run-sync.d.ts.map +1 -0
  148. package/dist/hooks/post-run-sync.js +26 -0
  149. package/dist/hooks/post-run-sync.js.map +1 -0
  150. package/dist/index.d.ts +10 -0
  151. package/dist/index.d.ts.map +1 -0
  152. package/dist/index.js +42 -0
  153. package/dist/index.js.map +1 -0
  154. package/dist/integrations/agent-mcp-installer.d.ts +50 -0
  155. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -0
  156. package/dist/integrations/agent-mcp-installer.js +414 -0
  157. package/dist/integrations/agent-mcp-installer.js.map +1 -0
  158. package/dist/learning/canary-gate.d.ts +6 -0
  159. package/dist/learning/canary-gate.d.ts.map +1 -0
  160. package/dist/learning/canary-gate.js +13 -0
  161. package/dist/learning/canary-gate.js.map +1 -0
  162. package/dist/learning/embeddings.d.ts +19 -0
  163. package/dist/learning/embeddings.d.ts.map +1 -0
  164. package/dist/learning/embeddings.js +160 -0
  165. package/dist/learning/embeddings.js.map +1 -0
  166. package/dist/learning/episodic-memory.d.ts +36 -0
  167. package/dist/learning/episodic-memory.d.ts.map +1 -0
  168. package/dist/learning/episodic-memory.js +228 -0
  169. package/dist/learning/episodic-memory.js.map +1 -0
  170. package/dist/learning/exporter.d.ts +10 -0
  171. package/dist/learning/exporter.d.ts.map +1 -0
  172. package/dist/learning/exporter.js +25 -0
  173. package/dist/learning/exporter.js.map +1 -0
  174. package/dist/learning/feedback-collector.d.ts +12 -0
  175. package/dist/learning/feedback-collector.d.ts.map +1 -0
  176. package/dist/learning/feedback-collector.js +14 -0
  177. package/dist/learning/feedback-collector.js.map +1 -0
  178. package/dist/learning/learning-events.d.ts +4 -0
  179. package/dist/learning/learning-events.d.ts.map +1 -0
  180. package/dist/learning/learning-events.js +35 -0
  181. package/dist/learning/learning-events.js.map +1 -0
  182. package/dist/learning/local-embedding.d.ts +3 -0
  183. package/dist/learning/local-embedding.d.ts.map +1 -0
  184. package/dist/learning/local-embedding.js +21 -0
  185. package/dist/learning/local-embedding.js.map +1 -0
  186. package/dist/learning/nightly-trainer.d.ts +14 -0
  187. package/dist/learning/nightly-trainer.d.ts.map +1 -0
  188. package/dist/learning/nightly-trainer.js +56 -0
  189. package/dist/learning/nightly-trainer.js.map +1 -0
  190. package/dist/learning/reflector.d.ts +19 -0
  191. package/dist/learning/reflector.d.ts.map +1 -0
  192. package/dist/learning/reflector.js +130 -0
  193. package/dist/learning/reflector.js.map +1 -0
  194. package/dist/learning/sample-builder.d.ts +7 -0
  195. package/dist/learning/sample-builder.d.ts.map +1 -0
  196. package/dist/learning/sample-builder.js +10 -0
  197. package/dist/learning/sample-builder.js.map +1 -0
  198. package/dist/learning/skill-flywheel.d.ts +52 -0
  199. package/dist/learning/skill-flywheel.d.ts.map +1 -0
  200. package/dist/learning/skill-flywheel.js +533 -0
  201. package/dist/learning/skill-flywheel.js.map +1 -0
  202. package/dist/learning/vector-store.d.ts +18 -0
  203. package/dist/learning/vector-store.d.ts.map +1 -0
  204. package/dist/learning/vector-store.js +73 -0
  205. package/dist/learning/vector-store.js.map +1 -0
  206. package/dist/routing/model-router.d.ts +13 -0
  207. package/dist/routing/model-router.d.ts.map +1 -0
  208. package/dist/routing/model-router.js +113 -0
  209. package/dist/routing/model-router.js.map +1 -0
  210. package/dist/routing/provider-adapters/anthropic.d.ts +3 -0
  211. package/dist/routing/provider-adapters/anthropic.d.ts.map +1 -0
  212. package/dist/routing/provider-adapters/anthropic.js +57 -0
  213. package/dist/routing/provider-adapters/anthropic.js.map +1 -0
  214. package/dist/routing/provider-adapters/bailian.d.ts +3 -0
  215. package/dist/routing/provider-adapters/bailian.d.ts.map +1 -0
  216. package/dist/routing/provider-adapters/bailian.js +56 -0
  217. package/dist/routing/provider-adapters/bailian.js.map +1 -0
  218. package/dist/routing/provider-adapters/doubao.d.ts +3 -0
  219. package/dist/routing/provider-adapters/doubao.d.ts.map +1 -0
  220. package/dist/routing/provider-adapters/doubao.js +56 -0
  221. package/dist/routing/provider-adapters/doubao.js.map +1 -0
  222. package/dist/routing/provider-adapters/openai.d.ts +6 -0
  223. package/dist/routing/provider-adapters/openai.d.ts.map +1 -0
  224. package/dist/routing/provider-adapters/openai.js +80 -0
  225. package/dist/routing/provider-adapters/openai.js.map +1 -0
  226. package/dist/routing/provider-adapters/openbmb.d.ts +16 -0
  227. package/dist/routing/provider-adapters/openbmb.d.ts.map +1 -0
  228. package/dist/routing/provider-adapters/openbmb.js +368 -0
  229. package/dist/routing/provider-adapters/openbmb.js.map +1 -0
  230. package/dist/routing/provider-executor.d.ts +21 -0
  231. package/dist/routing/provider-executor.d.ts.map +1 -0
  232. package/dist/routing/provider-executor.js +260 -0
  233. package/dist/routing/provider-executor.js.map +1 -0
  234. package/dist/routing/provider-health.d.ts +9 -0
  235. package/dist/routing/provider-health.d.ts.map +1 -0
  236. package/dist/routing/provider-health.js +66 -0
  237. package/dist/routing/provider-health.js.map +1 -0
  238. package/dist/surfaces/cli/index.d.ts +3 -0
  239. package/dist/surfaces/cli/index.d.ts.map +1 -0
  240. package/dist/surfaces/cli/index.js +200 -0
  241. package/dist/surfaces/cli/index.js.map +1 -0
  242. package/dist/surfaces/cli/init.d.ts +2 -0
  243. package/dist/surfaces/cli/init.d.ts.map +1 -0
  244. package/dist/surfaces/cli/init.js +121 -0
  245. package/dist/surfaces/cli/init.js.map +1 -0
  246. package/dist/surfaces/cli/output.d.ts +16 -0
  247. package/dist/surfaces/cli/output.d.ts.map +1 -0
  248. package/dist/surfaces/cli/output.js +74 -0
  249. package/dist/surfaces/cli/output.js.map +1 -0
  250. package/dist/surfaces/cli/runtime.d.ts +218 -0
  251. package/dist/surfaces/cli/runtime.d.ts.map +1 -0
  252. package/dist/surfaces/cli/runtime.js +1130 -0
  253. package/dist/surfaces/cli/runtime.js.map +1 -0
  254. package/dist/surfaces/mcp/server.d.ts +60 -0
  255. package/dist/surfaces/mcp/server.d.ts.map +1 -0
  256. package/dist/surfaces/mcp/server.js +425 -0
  257. package/dist/surfaces/mcp/server.js.map +1 -0
  258. package/dist/surfaces/vscode/extension.d.ts +17 -0
  259. package/dist/surfaces/vscode/extension.d.ts.map +1 -0
  260. package/dist/surfaces/vscode/extension.js +35 -0
  261. package/dist/surfaces/vscode/extension.js.map +1 -0
  262. package/dist/utils/file-lock.d.ts +9 -0
  263. package/dist/utils/file-lock.d.ts.map +1 -0
  264. package/dist/utils/file-lock.js +90 -0
  265. package/dist/utils/file-lock.js.map +1 -0
  266. package/dist/utils/logger.d.ts +3 -0
  267. package/dist/utils/logger.d.ts.map +1 -0
  268. package/dist/utils/logger.js +36 -0
  269. package/dist/utils/logger.js.map +1 -0
  270. package/package.json +89 -0
  271. package/scripts/safe-postinstall.cjs +14 -0
@@ -0,0 +1,368 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openbmb.js","sourceRoot":"","sources":["../../../src/routing/provider-adapters/openbmb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { AgentRole } from "../core/types";
2
+ import type { ModelSelection } from "./model-router";
3
+ export declare class ProviderError extends Error {
4
+ provider: ModelSelection["provider"];
5
+ model: string;
6
+ retryable: boolean;
7
+ constructor(params: {
8
+ provider: ModelSelection["provider"];
9
+ model: string;
10
+ message: string;
11
+ retryable: boolean;
12
+ });
13
+ }
14
+ export interface PromptContext {
15
+ summaryChannel?: string[];
16
+ skillHints?: string[];
17
+ extraInstructions?: string[];
18
+ }
19
+ export declare function formatPromptWithContext(role: AgentRole, prompt: string, context?: PromptContext): string;
20
+ export declare function executeRolePrompt(role: AgentRole, prompt: string, selection: ModelSelection, context?: PromptContext): Promise<string>;
21
+ //# sourceMappingURL=provider-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-executor.d.ts","sourceRoot":"","sources":["../../src/routing/provider-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;gBAEP,MAAM,EAAE;QAClB,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;KACpB;CAOF;AAYD,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAeD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAgCR;AA2HD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,cAAc,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,MAAM,CAAC,CAmGjB"}
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProviderError = void 0;
4
+ exports.formatPromptWithContext = formatPromptWithContext;
5
+ exports.executeRolePrompt = executeRolePrompt;
6
+ const anthropic_1 = require("./provider-adapters/anthropic");
7
+ const bailian_1 = require("./provider-adapters/bailian");
8
+ const doubao_1 = require("./provider-adapters/doubao");
9
+ const openai_1 = require("./provider-adapters/openai");
10
+ const openbmb_1 = require("./provider-adapters/openbmb");
11
+ class ProviderError extends Error {
12
+ provider;
13
+ model;
14
+ retryable;
15
+ constructor(params) {
16
+ super(params.message);
17
+ this.name = "ProviderError";
18
+ this.provider = params.provider;
19
+ this.model = params.model;
20
+ this.retryable = params.retryable;
21
+ }
22
+ }
23
+ exports.ProviderError = ProviderError;
24
+ const circuitByProvider = new Map();
25
+ const DEFAULT_MAX_RETRIES = 2;
26
+ const DEFAULT_CIRCUIT_FAILURE_THRESHOLD = 5;
27
+ const DEFAULT_CIRCUIT_OPEN_MS = 60_000;
28
+ const MAX_SUMMARY_LINES = 20;
29
+ const MAX_SKILL_HINTS = 8;
30
+ function hasAnyContext(context) {
31
+ if (!context) {
32
+ return false;
33
+ }
34
+ const s = context.summaryChannel?.some((x) => x && x.trim().length > 0);
35
+ const k = context.skillHints?.some((x) => x && x.trim().length > 0);
36
+ const e = context.extraInstructions?.some((x) => x && x.trim().length > 0);
37
+ return Boolean(s || k || e);
38
+ }
39
+ function formatPromptWithContext(role, prompt, context) {
40
+ const rolePrefix = `[role:${role}]`;
41
+ if (!hasAnyContext(context)) {
42
+ return `${rolePrefix} ${prompt}`;
43
+ }
44
+ const lines = [rolePrefix];
45
+ const summaries = (context?.summaryChannel ?? []).filter((line) => line && line.trim().length > 0);
46
+ if (summaries.length > 0) {
47
+ lines.push("Knowledge graph context:");
48
+ for (const item of summaries.slice(0, MAX_SUMMARY_LINES)) {
49
+ lines.push(`- ${item}`);
50
+ }
51
+ }
52
+ const skills = (context?.skillHints ?? []).filter((s) => s && s.trim().length > 0);
53
+ if (skills.length > 0) {
54
+ lines.push(`Skills to apply: ${skills.slice(0, MAX_SKILL_HINTS).join(", ")}`);
55
+ }
56
+ const notes = (context?.extraInstructions ?? []).filter((n) => n && n.trim().length > 0);
57
+ if (notes.length > 0) {
58
+ lines.push("Notes:");
59
+ for (const note of notes) {
60
+ lines.push(`- ${note}`);
61
+ }
62
+ }
63
+ lines.push("Task:");
64
+ lines.push(prompt);
65
+ return lines.join("\n");
66
+ }
67
+ async function withTimeout(promise, timeoutMs, label) {
68
+ if (timeoutMs <= 0) {
69
+ return promise;
70
+ }
71
+ let timer;
72
+ const timeout = new Promise((_resolve, reject) => {
73
+ timer = setTimeout(() => {
74
+ reject(new Error(`${label} timed out after ${timeoutMs}ms`));
75
+ }, timeoutMs);
76
+ });
77
+ try {
78
+ return await Promise.race([promise, timeout]);
79
+ }
80
+ finally {
81
+ if (timer) {
82
+ clearTimeout(timer);
83
+ }
84
+ }
85
+ }
86
+ function getCircuitState(key) {
87
+ const found = circuitByProvider.get(key);
88
+ if (found) {
89
+ return found;
90
+ }
91
+ const created = { failures: 0 };
92
+ circuitByProvider.set(key, created);
93
+ return created;
94
+ }
95
+ function getRetryBudget() {
96
+ const envRaw = Number(process.env.GRAPHFLOW_PROVIDER_MAX_RETRIES ?? DEFAULT_MAX_RETRIES);
97
+ if (!Number.isFinite(envRaw)) {
98
+ return DEFAULT_MAX_RETRIES;
99
+ }
100
+ return Math.max(0, Math.floor(envRaw));
101
+ }
102
+ function getCircuitThreshold() {
103
+ const envRaw = Number(process.env.GRAPHFLOW_PROVIDER_CIRCUIT_FAILURES ?? DEFAULT_CIRCUIT_FAILURE_THRESHOLD);
104
+ if (!Number.isFinite(envRaw)) {
105
+ return DEFAULT_CIRCUIT_FAILURE_THRESHOLD;
106
+ }
107
+ return Math.max(1, Math.floor(envRaw));
108
+ }
109
+ function getCircuitOpenMs() {
110
+ const envRaw = Number(process.env.GRAPHFLOW_PROVIDER_CIRCUIT_OPEN_MS ?? DEFAULT_CIRCUIT_OPEN_MS);
111
+ if (!Number.isFinite(envRaw)) {
112
+ return DEFAULT_CIRCUIT_OPEN_MS;
113
+ }
114
+ return Math.max(1000, Math.floor(envRaw));
115
+ }
116
+ function shouldUseCircuit(state) {
117
+ if (!state.openedUntil) {
118
+ return false;
119
+ }
120
+ if (Date.now() >= state.openedUntil) {
121
+ delete state.openedUntil;
122
+ state.failures = 0;
123
+ return false;
124
+ }
125
+ return true;
126
+ }
127
+ function sleep(ms) {
128
+ if (ms <= 0) {
129
+ return Promise.resolve();
130
+ }
131
+ return new Promise((resolve) => setTimeout(resolve, ms));
132
+ }
133
+ class TokenBucket {
134
+ tokens;
135
+ lastRefill;
136
+ capacity;
137
+ fillPerSecond;
138
+ constructor(capacity, fillPerSecond) {
139
+ this.capacity = capacity;
140
+ this.fillPerSecond = fillPerSecond;
141
+ this.tokens = capacity;
142
+ this.lastRefill = Date.now();
143
+ }
144
+ async acquire(timeoutMs) {
145
+ const start = Date.now();
146
+ while (true) {
147
+ this.refill();
148
+ if (this.tokens >= 1) {
149
+ this.tokens -= 1;
150
+ return;
151
+ }
152
+ if (Date.now() - start > timeoutMs) {
153
+ throw new Error("Rate limit timeout (429)");
154
+ }
155
+ await new Promise(r => setTimeout(r, 100));
156
+ }
157
+ }
158
+ refill() {
159
+ const now = Date.now();
160
+ const delta = (now - this.lastRefill) * this.fillPerSecond / 1000;
161
+ this.tokens = Math.min(this.capacity, this.tokens + delta);
162
+ this.lastRefill = now;
163
+ }
164
+ }
165
+ const providerRateLimiters = new Map();
166
+ function getRateLimiter(provider) {
167
+ let limiter = providerRateLimiters.get(provider);
168
+ if (!limiter) {
169
+ limiter = new TokenBucket(60, 1);
170
+ providerRateLimiters.set(provider, limiter);
171
+ }
172
+ return limiter;
173
+ }
174
+ async function executeRolePrompt(role, prompt, selection, context) {
175
+ const finalPrompt = formatPromptWithContext(role, prompt, context);
176
+ const request = {
177
+ prompt: finalPrompt,
178
+ model: selection.model,
179
+ };
180
+ const timeoutMsRaw = Number(process.env.GRAPHFLOW_PROVIDER_TIMEOUT_MS ?? 15000);
181
+ const timeoutMs = Number.isFinite(timeoutMsRaw) ? Math.max(1000, Math.floor(timeoutMsRaw)) : 15000;
182
+ const circuitKey = `${selection.provider}:${selection.model}`;
183
+ const circuitState = getCircuitState(circuitKey);
184
+ if (shouldUseCircuit(circuitState)) {
185
+ throw new ProviderError({
186
+ provider: selection.provider,
187
+ model: selection.model,
188
+ message: `${selection.provider}/${selection.model} circuit is open`,
189
+ retryable: true,
190
+ });
191
+ }
192
+ const execute = async () => {
193
+ if (selection.provider === "anthropic") {
194
+ return (0, anthropic_1.anthropicGenerateText)(request);
195
+ }
196
+ if (selection.provider === "bailian") {
197
+ return (0, bailian_1.bailianGenerateText)(request);
198
+ }
199
+ if (selection.provider === "doubao") {
200
+ return (0, doubao_1.doubaoGenerateText)(request);
201
+ }
202
+ if (selection.provider === "openbmb") {
203
+ return (0, openbmb_1.openbmbGenerateText)(request);
204
+ }
205
+ return (0, openai_1.openaiGenerateText)(request);
206
+ };
207
+ const retryBudget = getRetryBudget();
208
+ const circuitThreshold = getCircuitThreshold();
209
+ const circuitOpenMs = getCircuitOpenMs();
210
+ let attempt = 0;
211
+ while (attempt <= retryBudget) {
212
+ try {
213
+ if (selection.provider !== "openbmb") {
214
+ await getRateLimiter(selection.provider).acquire(timeoutMs);
215
+ }
216
+ const value = await withTimeout(execute(), timeoutMs, `${selection.provider}/${selection.model}`);
217
+ circuitState.failures = 0;
218
+ delete circuitState.openedUntil;
219
+ return value;
220
+ }
221
+ catch (error) {
222
+ const message = error instanceof Error ? error.message : String(error);
223
+ const retryable = !/invalid|unauthorized|forbidden|404|not found/i.test(message);
224
+ const wrapped = new ProviderError({
225
+ provider: selection.provider,
226
+ model: selection.model,
227
+ message,
228
+ retryable,
229
+ });
230
+ circuitState.failures += 1;
231
+ if (circuitState.failures >= circuitThreshold) {
232
+ circuitState.openedUntil = Date.now() + circuitOpenMs;
233
+ }
234
+ const isRateLimit = /429|too many requests|rate limit/i.test(message);
235
+ console.warn(`[provider-executor] Request failed for ${selection.provider}/${selection.model} (attempt ${attempt}/${retryBudget}): ${message}`);
236
+ if (!retryable || attempt >= retryBudget) {
237
+ console.error(`[provider-executor] Final failure for ${selection.provider}/${selection.model}: ${message}`);
238
+ throw wrapped;
239
+ }
240
+ attempt += 1;
241
+ let backoffMs = Math.min(1500, 100 * 2 ** attempt);
242
+ if (isRateLimit) {
243
+ const jitter = Math.random() * 1000;
244
+ backoffMs = Math.pow(2, attempt) * 1000 + jitter;
245
+ console.warn(`[provider-executor] Rate limit hit. Backing off for ${Math.round(backoffMs)}ms...`);
246
+ }
247
+ else {
248
+ console.warn(`[provider-executor] Retrying in ${backoffMs}ms...`);
249
+ }
250
+ await sleep(backoffMs);
251
+ }
252
+ }
253
+ throw new ProviderError({
254
+ provider: selection.provider,
255
+ model: selection.model,
256
+ message: `${selection.provider}/${selection.model} exhausted retries`,
257
+ retryable: true,
258
+ });
259
+ }
260
+ //# sourceMappingURL=provider-executor.js.map