bikky 0.3.1 → 0.3.2

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 (329) hide show
  1. package/README.md +79 -26
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +7 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +22 -3
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +61 -6
  9. package/dist/config.js.map +1 -1
  10. package/dist/config.test.js +17 -9
  11. package/dist/config.test.js.map +1 -1
  12. package/dist/daemon/capture-policy.d.ts +95 -0
  13. package/dist/daemon/capture-policy.d.ts.map +1 -0
  14. package/dist/daemon/capture-policy.js +139 -0
  15. package/dist/daemon/capture-policy.js.map +1 -0
  16. package/dist/daemon/capture-policy.test.d.ts +2 -0
  17. package/dist/daemon/capture-policy.test.d.ts.map +1 -0
  18. package/dist/daemon/capture-policy.test.js +46 -0
  19. package/dist/daemon/capture-policy.test.js.map +1 -0
  20. package/dist/daemon/consolidation.d.ts.map +1 -1
  21. package/dist/daemon/consolidation.js +84 -98
  22. package/dist/daemon/consolidation.js.map +1 -1
  23. package/dist/daemon/episode-summary.d.ts +77 -0
  24. package/dist/daemon/episode-summary.d.ts.map +1 -0
  25. package/dist/daemon/episode-summary.js +239 -0
  26. package/dist/daemon/episode-summary.js.map +1 -0
  27. package/dist/daemon/episode-summary.test.d.ts +2 -0
  28. package/dist/daemon/episode-summary.test.d.ts.map +1 -0
  29. package/dist/daemon/episode-summary.test.js +101 -0
  30. package/dist/daemon/episode-summary.test.js.map +1 -0
  31. package/dist/daemon/extraction.d.ts +25 -0
  32. package/dist/daemon/extraction.d.ts.map +1 -1
  33. package/dist/daemon/extraction.js +244 -124
  34. package/dist/daemon/extraction.js.map +1 -1
  35. package/dist/daemon/extraction.test.d.ts +2 -0
  36. package/dist/daemon/extraction.test.d.ts.map +1 -0
  37. package/dist/daemon/extraction.test.js +106 -0
  38. package/dist/daemon/extraction.test.js.map +1 -0
  39. package/dist/daemon/loop.d.ts.map +1 -1
  40. package/dist/daemon/loop.js +8 -6
  41. package/dist/daemon/loop.js.map +1 -1
  42. package/dist/daemon/qdrant.d.ts +59 -8
  43. package/dist/daemon/qdrant.d.ts.map +1 -1
  44. package/dist/daemon/qdrant.js +74 -23
  45. package/dist/daemon/qdrant.js.map +1 -1
  46. package/dist/daemon/qdrant.test.js +2 -2
  47. package/dist/daemon/qdrant.test.js.map +1 -1
  48. package/dist/daemon/relations.d.ts +6 -1
  49. package/dist/daemon/relations.d.ts.map +1 -1
  50. package/dist/daemon/relations.js +44 -63
  51. package/dist/daemon/relations.js.map +1 -1
  52. package/dist/daemon/session-index.d.ts +60 -0
  53. package/dist/daemon/session-index.d.ts.map +1 -0
  54. package/dist/daemon/session-index.js +136 -0
  55. package/dist/daemon/session-index.js.map +1 -0
  56. package/dist/daemon/session-index.test.d.ts +2 -0
  57. package/dist/daemon/session-index.test.d.ts.map +1 -0
  58. package/dist/daemon/session-index.test.js +54 -0
  59. package/dist/daemon/session-index.test.js.map +1 -0
  60. package/dist/daemon/session-summary.d.ts +69 -0
  61. package/dist/daemon/session-summary.d.ts.map +1 -0
  62. package/dist/daemon/session-summary.js +200 -0
  63. package/dist/daemon/session-summary.js.map +1 -0
  64. package/dist/daemon/session-summary.test.d.ts +2 -0
  65. package/dist/daemon/session-summary.test.d.ts.map +1 -0
  66. package/dist/daemon/session-summary.test.js +160 -0
  67. package/dist/daemon/session-summary.test.js.map +1 -0
  68. package/dist/daemon/staleness.test.d.ts +7 -0
  69. package/dist/daemon/staleness.test.d.ts.map +1 -0
  70. package/dist/daemon/staleness.test.js +128 -0
  71. package/dist/daemon/staleness.test.js.map +1 -0
  72. package/dist/daemon/workstream-summary.d.ts +68 -0
  73. package/dist/daemon/workstream-summary.d.ts.map +1 -0
  74. package/dist/daemon/workstream-summary.js +253 -0
  75. package/dist/daemon/workstream-summary.js.map +1 -0
  76. package/dist/daemon/workstream-summary.test.d.ts +2 -0
  77. package/dist/daemon/workstream-summary.test.d.ts.map +1 -0
  78. package/dist/daemon/workstream-summary.test.js +86 -0
  79. package/dist/daemon/workstream-summary.test.js.map +1 -0
  80. package/dist/lib/qdrant-client.d.ts +6 -1
  81. package/dist/lib/qdrant-client.d.ts.map +1 -1
  82. package/dist/lib/qdrant-client.js +3 -4
  83. package/dist/lib/qdrant-client.js.map +1 -1
  84. package/dist/lib/qdrant-client.test.js +21 -2
  85. package/dist/lib/qdrant-client.test.js.map +1 -1
  86. package/dist/lifecycle.test.d.ts +8 -0
  87. package/dist/lifecycle.test.d.ts.map +1 -0
  88. package/dist/lifecycle.test.js +74 -0
  89. package/dist/lifecycle.test.js.map +1 -0
  90. package/dist/llm/embedding/index.d.ts +42 -0
  91. package/dist/llm/embedding/index.d.ts.map +1 -0
  92. package/dist/llm/embedding/index.js +78 -0
  93. package/dist/llm/embedding/index.js.map +1 -0
  94. package/dist/llm/embedding/index.test.d.ts +8 -0
  95. package/dist/llm/embedding/index.test.d.ts.map +1 -0
  96. package/dist/llm/embedding/index.test.js +100 -0
  97. package/dist/llm/embedding/index.test.js.map +1 -0
  98. package/dist/llm/embedding/providers/bedrock.d.ts +16 -0
  99. package/dist/llm/embedding/providers/bedrock.d.ts.map +1 -0
  100. package/dist/llm/embedding/providers/bedrock.js +90 -0
  101. package/dist/llm/embedding/providers/bedrock.js.map +1 -0
  102. package/dist/llm/embedding/providers/bedrock.test.d.ts +2 -0
  103. package/dist/llm/embedding/providers/bedrock.test.d.ts.map +1 -0
  104. package/dist/llm/embedding/providers/bedrock.test.js +24 -0
  105. package/dist/llm/embedding/providers/bedrock.test.js.map +1 -0
  106. package/dist/llm/embedding/providers/index.d.ts +9 -0
  107. package/dist/llm/embedding/providers/index.d.ts.map +1 -0
  108. package/dist/llm/embedding/providers/index.js +9 -0
  109. package/dist/llm/embedding/providers/index.js.map +1 -0
  110. package/dist/llm/embedding/providers/ollama.d.ts +6 -0
  111. package/dist/llm/embedding/providers/ollama.d.ts.map +1 -0
  112. package/dist/llm/embedding/providers/ollama.js +39 -0
  113. package/dist/llm/embedding/providers/ollama.js.map +1 -0
  114. package/dist/llm/embedding/providers/ollama.test.d.ts +2 -0
  115. package/dist/llm/embedding/providers/ollama.test.d.ts.map +1 -0
  116. package/dist/llm/embedding/providers/ollama.test.js +54 -0
  117. package/dist/llm/embedding/providers/ollama.test.js.map +1 -0
  118. package/dist/llm/embedding/providers/openai.d.ts +6 -0
  119. package/dist/llm/embedding/providers/openai.d.ts.map +1 -0
  120. package/dist/llm/embedding/providers/openai.js +44 -0
  121. package/dist/llm/embedding/providers/openai.js.map +1 -0
  122. package/dist/llm/embedding/providers/openai.test.d.ts +2 -0
  123. package/dist/llm/embedding/providers/openai.test.d.ts.map +1 -0
  124. package/dist/llm/embedding/providers/openai.test.js +48 -0
  125. package/dist/llm/embedding/providers/openai.test.js.map +1 -0
  126. package/dist/llm/embedding/providers/portkey.d.ts +15 -0
  127. package/dist/llm/embedding/providers/portkey.d.ts.map +1 -0
  128. package/dist/llm/embedding/providers/portkey.js +58 -0
  129. package/dist/llm/embedding/providers/portkey.js.map +1 -0
  130. package/dist/llm/embedding/providers/portkey.test.d.ts +2 -0
  131. package/dist/llm/embedding/providers/portkey.test.d.ts.map +1 -0
  132. package/dist/llm/embedding/providers/portkey.test.js +56 -0
  133. package/dist/llm/embedding/providers/portkey.test.js.map +1 -0
  134. package/dist/llm/embedding/registry.d.ts +14 -0
  135. package/dist/llm/embedding/registry.d.ts.map +1 -0
  136. package/dist/llm/embedding/registry.js +27 -0
  137. package/dist/llm/embedding/registry.js.map +1 -0
  138. package/dist/llm/embedding/registry.test.d.ts +7 -0
  139. package/dist/llm/embedding/registry.test.d.ts.map +1 -0
  140. package/dist/llm/embedding/registry.test.js +68 -0
  141. package/dist/llm/embedding/registry.test.js.map +1 -0
  142. package/dist/llm/embedding/types.d.ts +55 -0
  143. package/dist/llm/embedding/types.d.ts.map +1 -0
  144. package/dist/llm/embedding/types.js +12 -0
  145. package/dist/llm/embedding/types.js.map +1 -0
  146. package/dist/llm/errors.d.ts +95 -0
  147. package/dist/llm/errors.d.ts.map +1 -0
  148. package/dist/llm/errors.js +164 -0
  149. package/dist/llm/errors.js.map +1 -0
  150. package/dist/llm/errors.test.d.ts +2 -0
  151. package/dist/llm/errors.test.d.ts.map +1 -0
  152. package/dist/llm/errors.test.js +103 -0
  153. package/dist/llm/errors.test.js.map +1 -0
  154. package/dist/llm/fetch.d.ts +39 -0
  155. package/dist/llm/fetch.d.ts.map +1 -0
  156. package/dist/llm/fetch.js +52 -0
  157. package/dist/llm/fetch.js.map +1 -0
  158. package/dist/llm/index.d.ts +6 -3
  159. package/dist/llm/index.d.ts.map +1 -1
  160. package/dist/llm/index.js +2 -2
  161. package/dist/llm/index.js.map +1 -1
  162. package/dist/llm/inference/index.d.ts +39 -0
  163. package/dist/llm/inference/index.d.ts.map +1 -0
  164. package/dist/llm/inference/index.js +118 -0
  165. package/dist/llm/inference/index.js.map +1 -0
  166. package/dist/llm/inference/index.test.d.ts +6 -0
  167. package/dist/llm/inference/index.test.d.ts.map +1 -0
  168. package/dist/llm/inference/index.test.js +109 -0
  169. package/dist/llm/inference/index.test.js.map +1 -0
  170. package/dist/llm/inference/providers/bedrock.d.ts +18 -0
  171. package/dist/llm/inference/providers/bedrock.d.ts.map +1 -0
  172. package/dist/llm/inference/providers/bedrock.js +105 -0
  173. package/dist/llm/inference/providers/bedrock.js.map +1 -0
  174. package/dist/llm/inference/providers/bedrock.test.d.ts +2 -0
  175. package/dist/llm/inference/providers/bedrock.test.d.ts.map +1 -0
  176. package/dist/llm/inference/providers/bedrock.test.js +21 -0
  177. package/dist/llm/inference/providers/bedrock.test.js.map +1 -0
  178. package/dist/llm/inference/providers/index.d.ts +10 -0
  179. package/dist/llm/inference/providers/index.d.ts.map +1 -0
  180. package/dist/llm/inference/providers/index.js +10 -0
  181. package/dist/llm/inference/providers/index.js.map +1 -0
  182. package/dist/llm/inference/providers/ollama.d.ts +8 -0
  183. package/dist/llm/inference/providers/ollama.d.ts.map +1 -0
  184. package/dist/llm/inference/providers/ollama.js +63 -0
  185. package/dist/llm/inference/providers/ollama.js.map +1 -0
  186. package/dist/llm/inference/providers/ollama.test.d.ts +2 -0
  187. package/dist/llm/inference/providers/ollama.test.d.ts.map +1 -0
  188. package/dist/llm/inference/providers/ollama.test.js +57 -0
  189. package/dist/llm/inference/providers/ollama.test.js.map +1 -0
  190. package/dist/llm/inference/providers/openai.d.ts +11 -0
  191. package/dist/llm/inference/providers/openai.d.ts.map +1 -0
  192. package/dist/llm/inference/providers/openai.js +73 -0
  193. package/dist/llm/inference/providers/openai.js.map +1 -0
  194. package/dist/llm/inference/providers/openai.test.d.ts +2 -0
  195. package/dist/llm/inference/providers/openai.test.d.ts.map +1 -0
  196. package/dist/llm/inference/providers/openai.test.js +46 -0
  197. package/dist/llm/inference/providers/openai.test.js.map +1 -0
  198. package/dist/llm/inference/providers/portkey.d.ts +13 -0
  199. package/dist/llm/inference/providers/portkey.d.ts.map +1 -0
  200. package/dist/llm/inference/providers/portkey.js +80 -0
  201. package/dist/llm/inference/providers/portkey.js.map +1 -0
  202. package/dist/llm/inference/providers/portkey.test.d.ts +2 -0
  203. package/dist/llm/inference/providers/portkey.test.d.ts.map +1 -0
  204. package/dist/llm/inference/providers/portkey.test.js +48 -0
  205. package/dist/llm/inference/providers/portkey.test.js.map +1 -0
  206. package/dist/llm/inference/registry.d.ts +15 -0
  207. package/dist/llm/inference/registry.d.ts.map +1 -0
  208. package/dist/llm/inference/registry.js +28 -0
  209. package/dist/llm/inference/registry.js.map +1 -0
  210. package/dist/llm/inference/registry.test.d.ts +6 -0
  211. package/dist/llm/inference/registry.test.d.ts.map +1 -0
  212. package/dist/llm/inference/registry.test.js +63 -0
  213. package/dist/llm/inference/registry.test.js.map +1 -0
  214. package/dist/llm/inference/types.d.ts +84 -0
  215. package/dist/llm/inference/types.d.ts.map +1 -0
  216. package/dist/llm/inference/types.js +9 -0
  217. package/dist/llm/inference/types.js.map +1 -0
  218. package/dist/llm/telemetry.d.ts +25 -0
  219. package/dist/llm/telemetry.d.ts.map +1 -0
  220. package/dist/llm/telemetry.js +43 -0
  221. package/dist/llm/telemetry.js.map +1 -0
  222. package/dist/llm/telemetry.test.d.ts +5 -0
  223. package/dist/llm/telemetry.test.d.ts.map +1 -0
  224. package/dist/llm/telemetry.test.js +89 -0
  225. package/dist/llm/telemetry.test.js.map +1 -0
  226. package/dist/llm/types.d.ts +4 -37
  227. package/dist/llm/types.d.ts.map +1 -1
  228. package/dist/llm/types.js +4 -1
  229. package/dist/llm/types.js.map +1 -1
  230. package/dist/logger.d.ts +18 -3
  231. package/dist/logger.d.ts.map +1 -1
  232. package/dist/logger.js +102 -20
  233. package/dist/logger.js.map +1 -1
  234. package/dist/logger.test.d.ts +5 -0
  235. package/dist/logger.test.d.ts.map +1 -0
  236. package/dist/logger.test.js +103 -0
  237. package/dist/logger.test.js.map +1 -0
  238. package/dist/mcp/api.d.ts +15 -1
  239. package/dist/mcp/api.d.ts.map +1 -1
  240. package/dist/mcp/api.js +44 -19
  241. package/dist/mcp/api.js.map +1 -1
  242. package/dist/mcp/api.test.d.ts +6 -0
  243. package/dist/mcp/api.test.d.ts.map +1 -0
  244. package/dist/mcp/api.test.js +130 -0
  245. package/dist/mcp/api.test.js.map +1 -0
  246. package/dist/mcp/helpers.d.ts +1 -0
  247. package/dist/mcp/helpers.d.ts.map +1 -1
  248. package/dist/mcp/helpers.js +62 -6
  249. package/dist/mcp/helpers.js.map +1 -1
  250. package/dist/mcp/helpers.test.js +71 -10
  251. package/dist/mcp/helpers.test.js.map +1 -1
  252. package/dist/mcp/index.d.ts +7 -1
  253. package/dist/mcp/index.d.ts.map +1 -1
  254. package/dist/mcp/index.js +38 -20
  255. package/dist/mcp/index.js.map +1 -1
  256. package/dist/mcp/taxonomy.d.ts +237 -31
  257. package/dist/mcp/taxonomy.d.ts.map +1 -1
  258. package/dist/mcp/taxonomy.js +533 -171
  259. package/dist/mcp/taxonomy.js.map +1 -1
  260. package/dist/mcp/taxonomy.test.d.ts +1 -1
  261. package/dist/mcp/taxonomy.test.js +141 -302
  262. package/dist/mcp/taxonomy.test.js.map +1 -1
  263. package/dist/mcp/tools.d.ts +1 -1
  264. package/dist/mcp/tools.d.ts.map +1 -1
  265. package/dist/mcp/tools.integration.itest.d.ts +23 -0
  266. package/dist/mcp/tools.integration.itest.d.ts.map +1 -0
  267. package/dist/mcp/tools.integration.itest.js +172 -0
  268. package/dist/mcp/tools.integration.itest.js.map +1 -0
  269. package/dist/mcp/tools.js +338 -302
  270. package/dist/mcp/tools.js.map +1 -1
  271. package/dist/mcp/tools.test.d.ts +16 -0
  272. package/dist/mcp/tools.test.d.ts.map +1 -0
  273. package/dist/mcp/tools.test.js +472 -0
  274. package/dist/mcp/tools.test.js.map +1 -0
  275. package/dist/mcp/types.d.ts +63 -8
  276. package/dist/mcp/types.d.ts.map +1 -1
  277. package/dist/prompts/brief.d.ts +19 -0
  278. package/dist/prompts/brief.d.ts.map +1 -0
  279. package/dist/prompts/brief.js +67 -0
  280. package/dist/prompts/brief.js.map +1 -0
  281. package/dist/prompts/contradiction.d.ts +24 -0
  282. package/dist/prompts/contradiction.d.ts.map +1 -0
  283. package/dist/prompts/contradiction.js +73 -0
  284. package/dist/prompts/contradiction.js.map +1 -0
  285. package/dist/prompts/distill.d.ts +21 -0
  286. package/dist/prompts/distill.d.ts.map +1 -0
  287. package/dist/prompts/distill.js +74 -0
  288. package/dist/prompts/distill.js.map +1 -0
  289. package/dist/prompts/extraction.d.ts +14 -0
  290. package/dist/prompts/extraction.d.ts.map +1 -0
  291. package/dist/prompts/extraction.js +87 -0
  292. package/dist/prompts/extraction.js.map +1 -0
  293. package/dist/prompts/index.d.ts +50 -0
  294. package/dist/prompts/index.d.ts.map +1 -0
  295. package/dist/prompts/index.js +102 -0
  296. package/dist/prompts/index.js.map +1 -0
  297. package/dist/prompts/prompts.test.d.ts +8 -0
  298. package/dist/prompts/prompts.test.d.ts.map +1 -0
  299. package/dist/prompts/prompts.test.js +140 -0
  300. package/dist/prompts/prompts.test.js.map +1 -0
  301. package/dist/prompts/relations.d.ts +17 -0
  302. package/dist/prompts/relations.d.ts.map +1 -0
  303. package/dist/prompts/relations.js +72 -0
  304. package/dist/prompts/relations.js.map +1 -0
  305. package/dist/render.d.ts +41 -0
  306. package/dist/render.d.ts.map +1 -0
  307. package/dist/render.js +173 -0
  308. package/dist/render.js.map +1 -0
  309. package/dist/render.test.d.ts +8 -0
  310. package/dist/render.test.d.ts.map +1 -0
  311. package/dist/render.test.js +212 -0
  312. package/dist/render.test.js.map +1 -0
  313. package/package.json +9 -2
  314. package/dist/llm/embedding.d.ts +0 -13
  315. package/dist/llm/embedding.d.ts.map +0 -1
  316. package/dist/llm/embedding.js +0 -127
  317. package/dist/llm/embedding.js.map +0 -1
  318. package/dist/llm/embedding.test.d.ts +0 -8
  319. package/dist/llm/embedding.test.d.ts.map +0 -1
  320. package/dist/llm/embedding.test.js +0 -117
  321. package/dist/llm/embedding.test.js.map +0 -1
  322. package/dist/llm/inference.d.ts +0 -12
  323. package/dist/llm/inference.d.ts.map +0 -1
  324. package/dist/llm/inference.js +0 -146
  325. package/dist/llm/inference.js.map +0 -1
  326. package/dist/llm/inference.test.d.ts +0 -8
  327. package/dist/llm/inference.test.d.ts.map +0 -1
  328. package/dist/llm/inference.test.js +0 -117
  329. package/dist/llm/inference.test.js.map +0 -1
@@ -1,146 +0,0 @@
1
- /**
2
- * Unified LLM chat-completion client.
3
- * Routes to Ollama (default), OpenAI, or Bedrock based on config.
4
- * Ollama → Bedrock fallback when Ollama is primary and fails.
5
- */
6
- import { BedrockRuntimeClient, ConverseCommand, } from "@aws-sdk/client-bedrock-runtime";
7
- // ── Module state ─────────────────────────────────────────────────────────────
8
- let cfg = null;
9
- let log = () => { };
10
- let bedrockClient = null;
11
- export function initLLM(opts) {
12
- cfg = opts.config;
13
- if (opts.logger)
14
- log = opts.logger;
15
- if (cfg.provider === "bedrock")
16
- initBedrockClient();
17
- }
18
- function initBedrockClient() {
19
- const region = cfg?.bedrock_region ?? process.env.AWS_BEDROCK_REGION ?? process.env.AWS_REGION ?? "us-east-1";
20
- // Let the AWS SDK resolve credentials via its default chain:
21
- // env vars → shared credentials file → SSO → IAM role
22
- bedrockClient = new BedrockRuntimeClient({ region });
23
- }
24
- // ── Core function ────────────────────────────────────────────────────────────
25
- export async function chatCompletion(opts) {
26
- const provider = cfg?.provider ?? "ollama";
27
- if (provider === "openai")
28
- return openaiCompletion(opts);
29
- if (provider === "ollama") {
30
- const result = await ollamaCompletion(opts);
31
- if (result !== null)
32
- return result;
33
- log("INFO", "LLM: Ollama failed, falling back to Bedrock");
34
- return bedrockCompletion(opts);
35
- }
36
- return bedrockCompletion(opts);
37
- }
38
- // ── Provider implementations ─────────────────────────────────────────────────
39
- async function ollamaCompletion(opts) {
40
- const baseUrl = cfg?.ollama_url ?? "http://localhost:11434";
41
- const model = cfg?.ollama_model ?? "qwen2.5:7b";
42
- const body = {
43
- model,
44
- messages: opts.messages,
45
- temperature: opts.temperature ?? 0.2,
46
- max_tokens: opts.max_tokens ?? 500,
47
- };
48
- if (opts.response_format) {
49
- body.response_format = opts.response_format.type === "json_schema"
50
- ? { type: "json_object" }
51
- : opts.response_format;
52
- }
53
- try {
54
- const resp = await fetch(`${baseUrl}/v1/chat/completions`, {
55
- method: "POST",
56
- headers: { "Content-Type": "application/json" },
57
- body: JSON.stringify(body),
58
- });
59
- if (!resp.ok) {
60
- const err = await resp.text().catch(() => "");
61
- log("WARN", `LLM Ollama error (${resp.status}): ${err.slice(0, 200)}`);
62
- return null;
63
- }
64
- const data = (await resp.json());
65
- return data.choices?.[0]?.message?.content?.trim() ?? null;
66
- }
67
- catch (e) {
68
- log("WARN", `LLM Ollama unreachable: ${e.message}`);
69
- return null;
70
- }
71
- }
72
- async function openaiCompletion(opts) {
73
- const apiKey = cfg?.openai_api_key;
74
- if (!apiKey) {
75
- log("WARN", "LLM OpenAI: no API key");
76
- return null;
77
- }
78
- const model = cfg?.openai_model ?? "gpt-4.1-mini";
79
- const body = {
80
- model,
81
- messages: opts.messages,
82
- temperature: opts.temperature ?? 0.2,
83
- max_tokens: opts.max_tokens ?? 500,
84
- };
85
- if (opts.response_format)
86
- body.response_format = opts.response_format;
87
- try {
88
- const resp = await fetch("https://api.openai.com/v1/chat/completions", {
89
- method: "POST",
90
- headers: {
91
- "Content-Type": "application/json",
92
- "Authorization": `Bearer ${apiKey}`,
93
- },
94
- body: JSON.stringify(body),
95
- });
96
- if (!resp.ok) {
97
- const err = await resp.text().catch(() => "");
98
- log("WARN", `LLM OpenAI error (${resp.status}): ${err.slice(0, 200)}`);
99
- return null;
100
- }
101
- const data = (await resp.json());
102
- return data.choices?.[0]?.message?.content?.trim() ?? null;
103
- }
104
- catch (e) {
105
- log("WARN", `LLM OpenAI error: ${e.message}`);
106
- return null;
107
- }
108
- }
109
- async function bedrockCompletion(opts) {
110
- if (!bedrockClient)
111
- initBedrockClient();
112
- const modelId = cfg?.bedrock_model ?? "us.anthropic.claude-sonnet-4-20250514";
113
- const systemBlocks = [];
114
- const messages = [];
115
- for (const m of opts.messages) {
116
- if (m.role === "system") {
117
- systemBlocks.push({ text: m.content });
118
- }
119
- else {
120
- messages.push({
121
- role: m.role,
122
- content: [{ text: m.content }],
123
- });
124
- }
125
- }
126
- try {
127
- const command = new ConverseCommand({
128
- modelId,
129
- messages,
130
- ...(systemBlocks.length > 0 ? { system: systemBlocks } : {}),
131
- inferenceConfig: {
132
- maxTokens: opts.max_tokens ?? 500,
133
- temperature: opts.temperature ?? 0.2,
134
- },
135
- });
136
- const resp = await bedrockClient.send(command);
137
- const content = resp.output?.message?.content;
138
- const textBlock = content?.find(c => "text" in c);
139
- return textBlock?.text?.trim() ?? null;
140
- }
141
- catch (e) {
142
- log("WARN", `LLM Bedrock error: ${e.message}`);
143
- return null;
144
- }
145
- }
146
- //# sourceMappingURL=inference.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inference.js","sourceRoot":"","sources":["../../src/llm/inference.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Tests for the inference (LLM) module.
3
- *
4
- * These tests verify initialization and config, NOT actual LLM calls
5
- * (which require a live Ollama/OpenAI/Bedrock service).
6
- */
7
- export {};
8
- //# sourceMappingURL=inference.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inference.test.d.ts","sourceRoot":"","sources":["../../src/llm/inference.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,117 +0,0 @@
1
- /**
2
- * Tests for the inference (LLM) module.
3
- *
4
- * These tests verify initialization and config, NOT actual LLM calls
5
- * (which require a live Ollama/OpenAI/Bedrock service).
6
- */
7
- import { describe, it } from "node:test";
8
- import assert from "node:assert/strict";
9
- import { initLLM, chatCompletion } from "./inference.js";
10
- // ---------------------------------------------------------------------------
11
- // Helpers
12
- // ---------------------------------------------------------------------------
13
- function makeOllamaConfig(overrides = {}) {
14
- return {
15
- provider: "ollama",
16
- ollama_url: "http://localhost:11434",
17
- ollama_model: "qwen2.5:7b",
18
- openai_api_key: null,
19
- openai_model: "gpt-4.1-mini",
20
- bedrock_region: "us-east-1",
21
- bedrock_model: "us.anthropic.claude-sonnet-4-20250514",
22
- ...overrides,
23
- };
24
- }
25
- function makeOpenaiConfig() {
26
- return {
27
- provider: "openai",
28
- ollama_url: "http://localhost:11434",
29
- ollama_model: "qwen2.5:7b",
30
- openai_api_key: "sk-test-key",
31
- openai_model: "gpt-4.1-mini",
32
- bedrock_region: "us-east-1",
33
- bedrock_model: "us.anthropic.claude-sonnet-4-20250514",
34
- };
35
- }
36
- function makeBedrockConfig() {
37
- return {
38
- provider: "bedrock",
39
- ollama_url: "http://localhost:11434",
40
- ollama_model: "qwen2.5:7b",
41
- openai_api_key: null,
42
- openai_model: "gpt-4.1-mini",
43
- bedrock_region: "us-east-1",
44
- bedrock_model: "us.anthropic.claude-sonnet-4-20250514",
45
- };
46
- }
47
- // ---------------------------------------------------------------------------
48
- // initLLM
49
- // ---------------------------------------------------------------------------
50
- describe("initLLM", () => {
51
- it("does not throw with ollama config", () => {
52
- assert.doesNotThrow(() => {
53
- initLLM({ config: makeOllamaConfig() });
54
- });
55
- });
56
- it("does not throw with openai config", () => {
57
- assert.doesNotThrow(() => {
58
- initLLM({ config: makeOpenaiConfig() });
59
- });
60
- });
61
- it("does not throw with bedrock config", () => {
62
- assert.doesNotThrow(() => {
63
- initLLM({ config: makeBedrockConfig() });
64
- });
65
- });
66
- it("accepts optional logger", () => {
67
- const logs = [];
68
- initLLM({
69
- config: makeOllamaConfig(),
70
- logger: (level, ...args) => logs.push(`${level}: ${args.join(" ")}`),
71
- });
72
- // Logger is stored — we can't verify it directly, but it shouldn't throw
73
- assert.ok(true);
74
- });
75
- });
76
- // ---------------------------------------------------------------------------
77
- // chatCompletion — error/fallback behavior (no live calls)
78
- // ---------------------------------------------------------------------------
79
- describe("chatCompletion", () => {
80
- it("returns null when ollama is unreachable (falls back to bedrock which also fails)", async () => {
81
- initLLM({
82
- config: makeOllamaConfig({ ollama_url: "http://localhost:99999" }),
83
- });
84
- const result = await chatCompletion({
85
- messages: [{ role: "user", content: "hello" }],
86
- });
87
- // Ollama fails → falls back to bedrock → which also fails → returns null
88
- assert.strictEqual(result, null);
89
- });
90
- it("returns null when openai has no API key", async () => {
91
- initLLM({
92
- config: makeOpenaiConfig(),
93
- });
94
- // Override to remove API key
95
- initLLM({
96
- config: { ...makeOpenaiConfig(), openai_api_key: null },
97
- });
98
- const result = await chatCompletion({
99
- messages: [{ role: "user", content: "hello" }],
100
- });
101
- assert.strictEqual(result, null);
102
- });
103
- it("respects temperature and max_tokens options", async () => {
104
- // Verify the function at least accepts these options without throwing
105
- initLLM({
106
- config: makeOllamaConfig({ ollama_url: "http://localhost:99999" }),
107
- });
108
- const result = await chatCompletion({
109
- messages: [{ role: "user", content: "test" }],
110
- temperature: 0.5,
111
- max_tokens: 100,
112
- });
113
- // Will fail due to unreachable server, but should not throw on options parsing
114
- assert.strictEqual(result, null);
115
- });
116
- });
117
- //# sourceMappingURL=inference.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inference.test.js","sourceRoot":"","sources":["../../src/llm/inference.test.ts"],"names":[],"mappings":"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"}