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