risicare 0.4.0 → 0.4.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 (79) hide show
  1. package/dist/frameworks/instructor.cjs +94 -81
  2. package/dist/frameworks/instructor.cjs.map +1 -1
  3. package/dist/frameworks/instructor.d.cts +19 -7
  4. package/dist/frameworks/instructor.d.ts +19 -7
  5. package/dist/frameworks/instructor.js +94 -83
  6. package/dist/frameworks/instructor.js.map +1 -1
  7. package/dist/frameworks/langchain.cjs +192 -101
  8. package/dist/frameworks/langchain.cjs.map +1 -1
  9. package/dist/frameworks/langchain.d.cts +97 -3
  10. package/dist/frameworks/langchain.d.ts +97 -3
  11. package/dist/frameworks/langchain.js +196 -101
  12. package/dist/frameworks/langchain.js.map +1 -1
  13. package/dist/frameworks/langgraph.cjs +192 -101
  14. package/dist/frameworks/langgraph.cjs.map +1 -1
  15. package/dist/frameworks/langgraph.js +196 -101
  16. package/dist/frameworks/langgraph.js.map +1 -1
  17. package/dist/frameworks/llamaindex.cjs +92 -74
  18. package/dist/frameworks/llamaindex.cjs.map +1 -1
  19. package/dist/frameworks/llamaindex.d.cts +33 -17
  20. package/dist/frameworks/llamaindex.d.ts +33 -17
  21. package/dist/frameworks/llamaindex.js +92 -76
  22. package/dist/frameworks/llamaindex.js.map +1 -1
  23. package/dist/index.cjs +2681 -2367
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +35 -1
  26. package/dist/index.d.ts +35 -1
  27. package/dist/index.js +2613 -2318
  28. package/dist/index.js.map +1 -1
  29. package/dist/providers/anthropic/index.cjs +41 -49
  30. package/dist/providers/anthropic/index.cjs.map +1 -1
  31. package/dist/providers/anthropic/index.js +41 -51
  32. package/dist/providers/anthropic/index.js.map +1 -1
  33. package/dist/providers/bedrock/index.cjs +64 -59
  34. package/dist/providers/bedrock/index.cjs.map +1 -1
  35. package/dist/providers/bedrock/index.d.cts +13 -1
  36. package/dist/providers/bedrock/index.d.ts +13 -1
  37. package/dist/providers/bedrock/index.js +63 -61
  38. package/dist/providers/bedrock/index.js.map +1 -1
  39. package/dist/providers/cerebras/index.cjs +41 -49
  40. package/dist/providers/cerebras/index.cjs.map +1 -1
  41. package/dist/providers/cerebras/index.js +41 -51
  42. package/dist/providers/cerebras/index.js.map +1 -1
  43. package/dist/providers/cohere/index.cjs +43 -51
  44. package/dist/providers/cohere/index.cjs.map +1 -1
  45. package/dist/providers/cohere/index.js +43 -53
  46. package/dist/providers/cohere/index.js.map +1 -1
  47. package/dist/providers/google/index.cjs +41 -49
  48. package/dist/providers/google/index.cjs.map +1 -1
  49. package/dist/providers/google/index.js +41 -51
  50. package/dist/providers/google/index.js.map +1 -1
  51. package/dist/providers/groq/index.cjs +41 -49
  52. package/dist/providers/groq/index.cjs.map +1 -1
  53. package/dist/providers/groq/index.js +41 -51
  54. package/dist/providers/groq/index.js.map +1 -1
  55. package/dist/providers/huggingface/index.cjs +41 -49
  56. package/dist/providers/huggingface/index.cjs.map +1 -1
  57. package/dist/providers/huggingface/index.js +41 -51
  58. package/dist/providers/huggingface/index.js.map +1 -1
  59. package/dist/providers/mistral/index.cjs +45 -53
  60. package/dist/providers/mistral/index.cjs.map +1 -1
  61. package/dist/providers/mistral/index.js +45 -55
  62. package/dist/providers/mistral/index.js.map +1 -1
  63. package/dist/providers/ollama/index.cjs +49 -49
  64. package/dist/providers/ollama/index.cjs.map +1 -1
  65. package/dist/providers/ollama/index.js +49 -51
  66. package/dist/providers/ollama/index.js.map +1 -1
  67. package/dist/providers/openai/index.cjs +44 -50
  68. package/dist/providers/openai/index.cjs.map +1 -1
  69. package/dist/providers/openai/index.js +44 -52
  70. package/dist/providers/openai/index.js.map +1 -1
  71. package/dist/providers/together/index.cjs +41 -49
  72. package/dist/providers/together/index.cjs.map +1 -1
  73. package/dist/providers/together/index.js +41 -51
  74. package/dist/providers/together/index.js.map +1 -1
  75. package/dist/providers/vercel-ai/index.cjs +28 -43
  76. package/dist/providers/vercel-ai/index.cjs.map +1 -1
  77. package/dist/providers/vercel-ai/index.js +28 -45
  78. package/dist/providers/vercel-ai/index.js.map +1 -1
  79. package/package.json +94 -33
@@ -3,9 +3,6 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __esm = (fn, res) => function __init() {
7
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
- };
9
6
  var __export = (target, all) => {
10
7
  for (var name in all)
11
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -20,34 +17,6 @@ var __copyProps = (to, from, except, desc) => {
20
17
  };
21
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
19
 
23
- // src/globals.ts
24
- function getTracer() {
25
- return G[PREFIX + "tracer"];
26
- }
27
- function getContextStorage() {
28
- if (!G[PREFIX + "ctx"]) {
29
- G[PREFIX + "ctx"] = new import_node_async_hooks.AsyncLocalStorage();
30
- }
31
- return G[PREFIX + "ctx"];
32
- }
33
- var import_node_async_hooks, G, PREFIX;
34
- var init_globals = __esm({
35
- "src/globals.ts"() {
36
- "use strict";
37
- import_node_async_hooks = require("async_hooks");
38
- G = globalThis;
39
- PREFIX = "__risicare_";
40
- }
41
- });
42
-
43
- // src/utils/log.ts
44
- var init_log = __esm({
45
- "src/utils/log.ts"() {
46
- "use strict";
47
- init_globals();
48
- }
49
- });
50
-
51
20
  // src/frameworks/langgraph.ts
52
21
  var langgraph_exports = {};
53
22
  __export(langgraph_exports, {
@@ -128,8 +97,24 @@ var NOOP_SPAN = Object.freeze({
128
97
  }
129
98
  });
130
99
 
100
+ // src/globals.ts
101
+ var import_node_async_hooks = require("async_hooks");
102
+ var G = globalThis;
103
+ var PREFIX = "__risicare_";
104
+ function getTracer() {
105
+ return G[PREFIX + "tracer"];
106
+ }
107
+ function getContextStorage() {
108
+ if (!G[PREFIX + "ctx"]) {
109
+ G[PREFIX + "ctx"] = new import_node_async_hooks.AsyncLocalStorage();
110
+ }
111
+ return G[PREFIX + "ctx"];
112
+ }
113
+ function getDebug() {
114
+ return G[PREFIX + "debug"] ?? false;
115
+ }
116
+
131
117
  // src/context/storage.ts
132
- init_globals();
133
118
  function storage() {
134
119
  return getContextStorage();
135
120
  }
@@ -142,15 +127,18 @@ function runWithContext(overrides, fn) {
142
127
  return storage().run(merged, fn);
143
128
  }
144
129
 
145
- // src/exporters/batch.ts
146
- init_log();
130
+ // src/utils/log.ts
131
+ function debug(msg) {
132
+ if (getDebug()) {
133
+ process.stderr.write(`[risicare] ${msg}
134
+ `);
135
+ }
136
+ }
147
137
 
148
- // src/exporters/http.ts
149
- init_log();
138
+ // src/runtime/applier.ts
139
+ var import_node_crypto2 = require("crypto");
150
140
 
151
141
  // src/client.ts
152
- init_log();
153
- init_globals();
154
142
  function getTracer2() {
155
143
  return getTracer();
156
144
  }
@@ -162,9 +150,62 @@ function suppressProviderInstrumentation(fn) {
162
150
  }
163
151
 
164
152
  // src/frameworks/langchain.ts
165
- var RisicareCallbackHandler = class {
153
+ var import_meta = {};
154
+ function resolveBaseCallbackHandler() {
155
+ try {
156
+ const { createRequire } = require("module");
157
+ const req = createRequire(import_meta.url);
158
+ const mod = req("@langchain/core/callbacks/base");
159
+ if (mod?.BaseCallbackHandler) {
160
+ return mod.BaseCallbackHandler;
161
+ }
162
+ } catch {
163
+ }
164
+ try {
165
+ const mod = require("@langchain/core/callbacks/base");
166
+ if (mod?.BaseCallbackHandler) {
167
+ return mod.BaseCallbackHandler;
168
+ }
169
+ } catch {
170
+ debug("RisicareCallbackHandler: @langchain/core not installed; handler will not satisfy LangChain v0.2+ instanceof check");
171
+ }
172
+ return Object;
173
+ }
174
+ var _BaseCallbackHandler = resolveBaseCallbackHandler();
175
+ var RisicareCallbackHandler = class _RisicareCallbackHandler extends _BaseCallbackHandler {
176
+ // PR-4+5 review B1: duck-type markers that LangChain v0.3's
177
+ // `isBaseCallbackHandler(x)` checks. This is the ONLY reliable way to be
178
+ // recognised across the CJS↔ESM identity split — `instanceof` cannot work
179
+ // when our `createRequire`-loaded BaseCallbackHandler is a different
180
+ // class object from the customer's ESM-imported BaseCallbackHandler.
181
+ // Keep these as instance properties (not prototype) so they survive any
182
+ // Object-fallback path when @langchain/core is absent.
166
183
  name = "RisicareCallbackHandler";
184
+ awaitHandlers = true;
185
+ ignoreLLM = false;
186
+ ignoreChain = false;
187
+ ignoreAgent = false;
188
+ ignoreRetriever = false;
189
+ ignoreCustomEvent = false;
190
+ raiseError = false;
191
+ lc_serializable = false;
192
+ lc_kwargs = {};
167
193
  _spans = /* @__PURE__ */ new Map();
194
+ constructor() {
195
+ super();
196
+ }
197
+ /**
198
+ * Required by LangChain's `isBaseCallbackHandler(x)` duck-type check
199
+ * (`typeof x.copy === 'function'`). When @langchain/core is installed
200
+ * BaseCallbackHandler's prototype provides its own `copy()`; this
201
+ * declaration overrides with a Risicare-aware copy that re-instantiates
202
+ * — sufficient for the handler-cloning paths LangChain uses internally
203
+ * (e.g., per-run isolation in concurrent chains). Spans map starts empty
204
+ * because a fresh handler should not share span state with its parent.
205
+ */
206
+ copy() {
207
+ return new _RisicareCallbackHandler();
208
+ }
168
209
  /**
169
210
  * Run a function with provider instrumentation suppressed.
170
211
  *
@@ -181,57 +222,75 @@ var RisicareCallbackHandler = class {
181
222
  withSuppression(fn) {
182
223
  return suppressProviderInstrumentation(fn);
183
224
  }
184
- // ── Chain lifecycle ────────────────────────────────────────────────────────
185
- handleChainStart(chain, _inputs, runId, parentRunId) {
225
+ // ── Internal helpers ──────────────────────────────────────────────────────
226
+ _startSpan(runId, parentRunId, name, kind, extraAttrs = {}) {
186
227
  const tracer = getTracer2();
187
228
  if (!tracer?.enabled) return;
188
229
  const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
189
230
  const span = tracer.createSpan({
190
- name: chain.name || chain._type || "chain",
191
- kind: "internal" /* INTERNAL */,
231
+ name,
232
+ kind,
192
233
  parentSpanId: parentEntry?.span.spanId,
193
234
  traceId: parentEntry?.span.traceId,
194
235
  attributes: {
195
- "framework": "langchain",
236
+ framework: "langchain",
196
237
  "langchain.run_id": runId,
197
238
  ...parentRunId ? { "langchain.parent_run_id": parentRunId } : {},
198
- ...chain._type ? { "langchain.chain_type": chain._type } : {}
239
+ ...extraAttrs
199
240
  }
200
241
  });
201
242
  this._spans.set(runId, { span, startTime: Date.now() });
202
243
  }
203
- handleChainEnd(_outputs, runId) {
244
+ _endSpan(runId, extraAttrs = {}) {
204
245
  const entry = this._spans.get(runId);
205
246
  if (!entry) return;
247
+ for (const [k, v] of Object.entries(extraAttrs)) {
248
+ entry.span.setAttribute(k, v);
249
+ }
206
250
  entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
207
251
  entry.span.end();
208
252
  this._spans.delete(runId);
209
253
  }
210
- handleChainError(error, runId) {
254
+ _errorSpan(runId, error) {
211
255
  const entry = this._spans.get(runId);
212
256
  if (!entry) return;
213
257
  entry.span.recordException(error);
214
258
  entry.span.end();
215
259
  this._spans.delete(runId);
216
260
  }
261
+ // ── Chain lifecycle ────────────────────────────────────────────────────────
262
+ handleChainStart(chain, _inputs, runId, parentRunId) {
263
+ this._startSpan(runId, parentRunId, chain.name || chain._type || "chain", "internal" /* INTERNAL */, {
264
+ ...chain._type ? { "langchain.chain_type": chain._type } : {}
265
+ });
266
+ }
267
+ handleChainEnd(_outputs, runId) {
268
+ this._endSpan(runId);
269
+ }
270
+ handleChainError(error, runId) {
271
+ this._errorSpan(runId, error);
272
+ }
217
273
  // ── LLM lifecycle ─────────────────────────────────────────────────────────
218
274
  handleLLMStart(llm, _prompts, runId, parentRunId) {
219
- const tracer = getTracer2();
220
- if (!tracer?.enabled) return;
221
- const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
222
- const span = tracer.createSpan({
223
- name: llm.name || llm._type || "llm",
224
- kind: "llm_call" /* LLM_CALL */,
225
- parentSpanId: parentEntry?.span.spanId,
226
- traceId: parentEntry?.span.traceId,
227
- attributes: {
228
- "framework": "langchain",
229
- "langchain.run_id": runId,
230
- "gen_ai.system": "langchain",
231
- "gen_ai.prompt.count": _prompts.length
232
- }
275
+ this._startSpan(runId, parentRunId, llm.name || llm._type || "llm", "llm_call" /* LLM_CALL */, {
276
+ "gen_ai.system": "langchain",
277
+ "gen_ai.prompt.count": _prompts.length
278
+ });
279
+ }
280
+ /**
281
+ * F-882: chat-model lifecycle — LangChain v0.2+ emits this for any
282
+ * ChatModel (which is EVERY production LLM today). Without this method,
283
+ * not a single `langchain` LLM span fires when used via LCEL.
284
+ *
285
+ * The messages payload is an array-of-arrays (one inner array per prompt);
286
+ * we just count rather than materialize content (PII boundary).
287
+ */
288
+ handleChatModelStart(llm, messages, runId, parentRunId) {
289
+ const messageCount = Array.isArray(messages) ? messages.reduce((sum, arr) => sum + (Array.isArray(arr) ? arr.length : 0), 0) : 0;
290
+ this._startSpan(runId, parentRunId, llm.name || llm._type || "chat_model", "llm_call" /* LLM_CALL */, {
291
+ "gen_ai.system": "langchain",
292
+ "gen_ai.message.count": messageCount
233
293
  });
234
- this._spans.set(runId, { span, startTime: Date.now() });
235
294
  }
236
295
  handleLLMEnd(output, runId) {
237
296
  const entry = this._spans.get(runId);
@@ -253,73 +312,105 @@ var RisicareCallbackHandler = class {
253
312
  this._spans.delete(runId);
254
313
  }
255
314
  handleLLMError(error, runId) {
315
+ this._errorSpan(runId, error);
316
+ }
317
+ /**
318
+ * F-883: streaming-token event. We do NOT create a new span (the LLM span
319
+ * already exists from handleLLMStart/handleChatModelStart) — just count tokens
320
+ * on the existing span. This is a HIGH-FREQUENCY event; do the cheap work only.
321
+ */
322
+ handleLLMNewToken(_token, _idx, runId) {
256
323
  const entry = this._spans.get(runId);
257
324
  if (!entry) return;
258
- entry.span.recordException(error);
259
- entry.span.end();
260
- this._spans.delete(runId);
325
+ const prior = entry.span.attributes?.["gen_ai.stream.token_count"] ?? 0;
326
+ entry.span.setAttribute("gen_ai.stream.token_count", prior + 1);
261
327
  }
262
328
  // ── Tool lifecycle ────────────────────────────────────────────────────────
263
329
  handleToolStart(tool, input, runId, parentRunId) {
330
+ this._startSpan(runId, parentRunId, tool.name || "tool", "tool_call" /* TOOL_CALL */, {
331
+ "tool.name": tool.name || "unknown",
332
+ "tool.input_length": input?.length ?? 0
333
+ });
334
+ }
335
+ handleToolEnd(output, runId) {
336
+ this._endSpan(runId, { "tool.output_length": output?.length ?? 0 });
337
+ }
338
+ handleToolError(error, runId) {
339
+ this._errorSpan(runId, error);
340
+ }
341
+ // ── Retriever lifecycle ───────────────────────────────────────────────────
342
+ handleRetrieverStart(retriever, _query, runId, parentRunId) {
343
+ this._startSpan(runId, parentRunId, retriever.name || "retriever", "retrieval" /* RETRIEVAL */);
344
+ }
345
+ handleRetrieverEnd(documents, runId) {
346
+ this._endSpan(runId, { "retriever.document_count": documents?.length ?? 0 });
347
+ }
348
+ handleRetrieverError(error, runId) {
349
+ this._errorSpan(runId, error);
350
+ }
351
+ // ── Agent lifecycle (F-882) ───────────────────────────────────────────────
352
+ /**
353
+ * Agent decided to take an action (call a tool). LangChain v0.2 agents emit
354
+ * this between LLM calls. Cheap span, no parent change.
355
+ */
356
+ handleAgentAction(action, runId, parentRunId) {
264
357
  const tracer = getTracer2();
265
358
  if (!tracer?.enabled) return;
266
359
  const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
267
360
  const span = tracer.createSpan({
268
- name: tool.name || "tool",
269
- kind: "tool_call" /* TOOL_CALL */,
361
+ name: `agent.action:${action.tool ?? "unknown"}`,
362
+ kind: "internal" /* INTERNAL */,
270
363
  parentSpanId: parentEntry?.span.spanId,
271
364
  traceId: parentEntry?.span.traceId,
272
365
  attributes: {
273
- "framework": "langchain",
366
+ framework: "langchain",
274
367
  "langchain.run_id": runId,
275
- "tool.name": tool.name || "unknown",
276
- "tool.input_length": input?.length ?? 0
368
+ "agent.action.tool": action.tool ?? ""
277
369
  }
278
370
  });
279
- this._spans.set(runId, { span, startTime: Date.now() });
371
+ span.end();
280
372
  }
281
- handleToolEnd(output, runId) {
282
- const entry = this._spans.get(runId);
283
- if (!entry) return;
284
- entry.span.setAttribute("tool.output_length", output?.length ?? 0);
285
- entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
286
- entry.span.end();
287
- this._spans.delete(runId);
288
- }
289
- handleToolError(error, runId) {
290
- const entry = this._spans.get(runId);
291
- if (!entry) return;
292
- entry.span.recordException(error);
293
- entry.span.end();
294
- this._spans.delete(runId);
295
- }
296
- // ── Retriever lifecycle ───────────────────────────────────────────────────
297
- handleRetrieverStart(retriever, _query, runId, parentRunId) {
373
+ /**
374
+ * Agent finished (final answer produced). Mirror of handleAgentAction.
375
+ */
376
+ handleAgentEnd(action, runId, parentRunId) {
298
377
  const tracer = getTracer2();
299
378
  if (!tracer?.enabled) return;
300
379
  const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
301
380
  const span = tracer.createSpan({
302
- name: retriever.name || "retriever",
303
- kind: "retrieval" /* RETRIEVAL */,
381
+ name: "agent.end",
382
+ kind: "internal" /* INTERNAL */,
304
383
  parentSpanId: parentEntry?.span.spanId,
305
384
  traceId: parentEntry?.span.traceId,
306
385
  attributes: {
307
- "framework": "langchain",
308
- "langchain.run_id": runId
386
+ framework: "langchain",
387
+ "langchain.run_id": runId,
388
+ "agent.return_keys": action.returnValues ? Object.keys(action.returnValues).length : 0
309
389
  }
310
390
  });
311
- this._spans.set(runId, { span, startTime: Date.now() });
391
+ span.end();
312
392
  }
313
- handleRetrieverEnd(documents, runId) {
393
+ // ── Misc (F-882) ──────────────────────────────────────────────────────────
394
+ /**
395
+ * Free-text emission (logging-style). Used by ConversationalRetrievalChain
396
+ * and verbose prints. Adds an event to the current chain span if one exists.
397
+ */
398
+ handleText(text, runId, _parentRunId) {
314
399
  const entry = this._spans.get(runId);
315
400
  if (!entry) return;
316
- entry.span.setAttribute(
317
- "retriever.document_count",
318
- documents?.length ?? 0
319
- );
320
- entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
321
- entry.span.end();
322
- this._spans.delete(runId);
401
+ entry.span.addEvent("langchain.text", {
402
+ "text.length": text?.length ?? 0
403
+ });
404
+ }
405
+ /**
406
+ * Custom event hook (introduced in @langchain/core 0.2.14). Customer code can
407
+ * `dispatchCustomEvent(name, payload)` from inside a runnable. We surface as
408
+ * a span event on the closest enclosing run so it shows up in the trace.
409
+ */
410
+ handleCustomEvent(eventName, _payload, runId, _tags, _metadata) {
411
+ const entry = this._spans.get(runId);
412
+ if (!entry) return;
413
+ entry.span.addEvent("langchain.custom_event", { name: eventName });
323
414
  }
324
415
  };
325
416