risicare 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/frameworks/instructor.cjs +178 -0
  2. package/dist/frameworks/instructor.cjs.map +1 -0
  3. package/dist/frameworks/instructor.d.cts +28 -0
  4. package/dist/frameworks/instructor.d.ts +28 -0
  5. package/dist/frameworks/instructor.js +151 -0
  6. package/dist/frameworks/instructor.js.map +1 -0
  7. package/dist/frameworks/langchain.cjs +262 -0
  8. package/dist/frameworks/langchain.cjs.map +1 -0
  9. package/dist/frameworks/langchain.d.cts +45 -0
  10. package/dist/frameworks/langchain.d.ts +45 -0
  11. package/dist/frameworks/langchain.js +235 -0
  12. package/dist/frameworks/langchain.js.map +1 -0
  13. package/dist/frameworks/langgraph.cjs +296 -0
  14. package/dist/frameworks/langgraph.cjs.map +1 -0
  15. package/dist/frameworks/langgraph.d.cts +28 -0
  16. package/dist/frameworks/langgraph.d.ts +28 -0
  17. package/dist/frameworks/langgraph.js +269 -0
  18. package/dist/frameworks/langgraph.js.map +1 -0
  19. package/dist/frameworks/llamaindex.cjs +239 -0
  20. package/dist/frameworks/llamaindex.cjs.map +1 -0
  21. package/dist/frameworks/llamaindex.d.cts +55 -0
  22. package/dist/frameworks/llamaindex.d.ts +55 -0
  23. package/dist/frameworks/llamaindex.js +212 -0
  24. package/dist/frameworks/llamaindex.js.map +1 -0
  25. package/dist/index.cjs +468 -7
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +124 -6
  28. package/dist/index.d.ts +124 -6
  29. package/dist/index.js +459 -7
  30. package/dist/index.js.map +1 -1
  31. package/dist/providers/anthropic/index.cjs +22 -0
  32. package/dist/providers/anthropic/index.cjs.map +1 -1
  33. package/dist/providers/anthropic/index.js +22 -0
  34. package/dist/providers/anthropic/index.js.map +1 -1
  35. package/dist/providers/bedrock/index.cjs +334 -0
  36. package/dist/providers/bedrock/index.cjs.map +1 -0
  37. package/dist/providers/bedrock/index.d.cts +37 -0
  38. package/dist/providers/bedrock/index.d.ts +37 -0
  39. package/dist/providers/bedrock/index.js +307 -0
  40. package/dist/providers/bedrock/index.js.map +1 -0
  41. package/dist/providers/cerebras/index.cjs +282 -0
  42. package/dist/providers/cerebras/index.cjs.map +1 -0
  43. package/dist/providers/cerebras/index.d.cts +24 -0
  44. package/dist/providers/cerebras/index.d.ts +24 -0
  45. package/dist/providers/cerebras/index.js +255 -0
  46. package/dist/providers/cerebras/index.js.map +1 -0
  47. package/dist/providers/cohere/index.cjs +347 -0
  48. package/dist/providers/cohere/index.cjs.map +1 -0
  49. package/dist/providers/cohere/index.d.cts +24 -0
  50. package/dist/providers/cohere/index.d.ts +24 -0
  51. package/dist/providers/cohere/index.js +320 -0
  52. package/dist/providers/cohere/index.js.map +1 -0
  53. package/dist/providers/google/index.cjs +337 -0
  54. package/dist/providers/google/index.cjs.map +1 -0
  55. package/dist/providers/google/index.d.cts +25 -0
  56. package/dist/providers/google/index.d.ts +25 -0
  57. package/dist/providers/google/index.js +310 -0
  58. package/dist/providers/google/index.js.map +1 -0
  59. package/dist/providers/groq/index.cjs +282 -0
  60. package/dist/providers/groq/index.cjs.map +1 -0
  61. package/dist/providers/groq/index.d.cts +23 -0
  62. package/dist/providers/groq/index.d.ts +23 -0
  63. package/dist/providers/groq/index.js +255 -0
  64. package/dist/providers/groq/index.js.map +1 -0
  65. package/dist/providers/huggingface/index.cjs +289 -0
  66. package/dist/providers/huggingface/index.cjs.map +1 -0
  67. package/dist/providers/huggingface/index.d.cts +24 -0
  68. package/dist/providers/huggingface/index.d.ts +24 -0
  69. package/dist/providers/huggingface/index.js +262 -0
  70. package/dist/providers/huggingface/index.js.map +1 -0
  71. package/dist/providers/mistral/index.cjs +336 -0
  72. package/dist/providers/mistral/index.cjs.map +1 -0
  73. package/dist/providers/mistral/index.d.cts +24 -0
  74. package/dist/providers/mistral/index.d.ts +24 -0
  75. package/dist/providers/mistral/index.js +309 -0
  76. package/dist/providers/mistral/index.js.map +1 -0
  77. package/dist/providers/ollama/index.cjs +376 -0
  78. package/dist/providers/ollama/index.cjs.map +1 -0
  79. package/dist/providers/ollama/index.d.cts +28 -0
  80. package/dist/providers/ollama/index.d.ts +28 -0
  81. package/dist/providers/ollama/index.js +349 -0
  82. package/dist/providers/ollama/index.js.map +1 -0
  83. package/dist/providers/openai/index.cjs +31 -1
  84. package/dist/providers/openai/index.cjs.map +1 -1
  85. package/dist/providers/openai/index.js +31 -1
  86. package/dist/providers/openai/index.js.map +1 -1
  87. package/dist/providers/together/index.cjs +275 -0
  88. package/dist/providers/together/index.cjs.map +1 -0
  89. package/dist/providers/together/index.d.cts +24 -0
  90. package/dist/providers/together/index.d.ts +24 -0
  91. package/dist/providers/together/index.js +248 -0
  92. package/dist/providers/together/index.js.map +1 -0
  93. package/dist/providers/vercel-ai/index.cjs.map +1 -1
  94. package/dist/providers/vercel-ai/index.js.map +1 -1
  95. package/package.json +124 -2
package/dist/index.js CHANGED
@@ -113,19 +113,39 @@ var SemanticPhase = /* @__PURE__ */ ((SemanticPhase2) => {
113
113
  var AgentRole = /* @__PURE__ */ ((AgentRole2) => {
114
114
  AgentRole2["ORCHESTRATOR"] = "orchestrator";
115
115
  AgentRole2["WORKER"] = "worker";
116
- AgentRole2["REVIEWER"] = "reviewer";
116
+ AgentRole2["SUPERVISOR"] = "supervisor";
117
+ AgentRole2["SPECIALIST"] = "specialist";
118
+ AgentRole2["ROUTER"] = "router";
119
+ AgentRole2["AGGREGATOR"] = "aggregator";
120
+ AgentRole2["BROADCASTER"] = "broadcaster";
121
+ AgentRole2["CRITIC"] = "critic";
117
122
  AgentRole2["PLANNER"] = "planner";
118
123
  AgentRole2["EXECUTOR"] = "executor";
119
- AgentRole2["CRITIC"] = "critic";
124
+ AgentRole2["RETRIEVER"] = "retriever";
125
+ AgentRole2["VALIDATOR"] = "validator";
126
+ AgentRole2["REVIEWER"] = "reviewer";
120
127
  AgentRole2["CUSTOM"] = "custom";
121
128
  return AgentRole2;
122
129
  })(AgentRole || {});
123
130
  var MessageType = /* @__PURE__ */ ((MessageType2) => {
124
- MessageType2["REQUEST"] = "request";
131
+ MessageType2["TASK"] = "task";
132
+ MessageType2["RESULT"] = "result";
133
+ MessageType2["STATUS"] = "status";
134
+ MessageType2["ERROR"] = "error";
135
+ MessageType2["QUERY"] = "query";
125
136
  MessageType2["RESPONSE"] = "response";
137
+ MessageType2["BROADCAST"] = "broadcast";
138
+ MessageType2["DIRECT"] = "direct";
139
+ MessageType2["PROPOSAL"] = "proposal";
140
+ MessageType2["VOTE"] = "vote";
141
+ MessageType2["CONSENSUS"] = "consensus";
142
+ MessageType2["CONFLICT"] = "conflict";
143
+ MessageType2["HEARTBEAT"] = "heartbeat";
144
+ MessageType2["SHUTDOWN"] = "shutdown";
145
+ MessageType2["HANDOFF"] = "handoff";
146
+ MessageType2["REQUEST"] = "request";
126
147
  MessageType2["DELEGATE"] = "delegate";
127
148
  MessageType2["COORDINATE"] = "coordinate";
128
- MessageType2["BROADCAST"] = "broadcast";
129
149
  return MessageType2;
130
150
  })(MessageType || {});
131
151
 
@@ -1043,10 +1063,66 @@ function getMetrics() {
1043
1063
  queueUtilization: 0
1044
1064
  };
1045
1065
  }
1066
+ function reportError(error, options) {
1067
+ try {
1068
+ const tracer = getTracer2();
1069
+ if (!tracer) return;
1070
+ const err = error instanceof Error ? error : new Error(String(error));
1071
+ const spanName = options?.name ?? `error:${err.constructor.name}`;
1072
+ tracer.startSpan({ name: spanName, kind: "internal" /* INTERNAL */ }, (span) => {
1073
+ span.setStatus("error" /* ERROR */, err.message);
1074
+ span.setAttribute("error", true);
1075
+ span.setAttribute("error.type", err.constructor.name);
1076
+ span.setAttribute("error.message", err.message.slice(0, 2e3));
1077
+ if (err.stack) span.setAttribute("error.stack", err.stack.slice(0, 4e3));
1078
+ span.setAttribute("risicare.reported_error", true);
1079
+ if (options?.attributes) {
1080
+ for (const [k, v] of Object.entries(options.attributes)) {
1081
+ span.setAttribute(k, v);
1082
+ }
1083
+ }
1084
+ });
1085
+ } catch {
1086
+ debug("reportError failed");
1087
+ }
1088
+ }
1089
+ function score(traceId, name, value, options) {
1090
+ try {
1091
+ if (typeof value !== "number" || value < 0 || value > 1) {
1092
+ debug(`score: value must be in [0.0, 1.0], got ${value}. Score not sent.`);
1093
+ return;
1094
+ }
1095
+ if (!traceId || !name) {
1096
+ debug("score: traceId and name are required");
1097
+ return;
1098
+ }
1099
+ const client = getClient();
1100
+ if (!client?.enabled || !client.config.apiKey) return;
1101
+ const endpoint = client.config.endpoint.replace(/\/$/, "");
1102
+ const url = `${endpoint}/api/v1/scores`;
1103
+ const body = JSON.stringify({
1104
+ trace_id: traceId,
1105
+ name,
1106
+ score: value,
1107
+ source: "sdk",
1108
+ ...options?.spanId && { span_id: options.spanId },
1109
+ ...options?.comment && { comment: options.comment }
1110
+ });
1111
+ fetch(url, {
1112
+ method: "POST",
1113
+ headers: {
1114
+ "Content-Type": "application/json",
1115
+ "Authorization": `Bearer ${client.config.apiKey}`
1116
+ },
1117
+ body
1118
+ }).catch((err) => debug(`score: send failed: ${err}`));
1119
+ } catch {
1120
+ debug("score failed");
1121
+ }
1122
+ }
1046
1123
 
1047
1124
  // src/context/agent.ts
1048
1125
  function withAgent(options, fn) {
1049
- if (!isEnabled()) return fn();
1050
1126
  const parent = getCurrentAgent();
1051
1127
  const agentName = options.name ?? "agent";
1052
1128
  const agent2 = {
@@ -1079,7 +1155,6 @@ function agent(options, fn) {
1079
1155
 
1080
1156
  // src/context/session.ts
1081
1157
  function withSession(options, fn) {
1082
- if (!isEnabled()) return fn();
1083
1158
  const session2 = {
1084
1159
  sessionId: options.sessionId,
1085
1160
  userId: options.userId,
@@ -1100,7 +1175,6 @@ function session(optionsOrResolver, fn) {
1100
1175
 
1101
1176
  // src/context/phase.ts
1102
1177
  function withPhase(phase, fn) {
1103
- if (!isEnabled()) return fn();
1104
1178
  return runWithContext({ phase }, fn);
1105
1179
  }
1106
1180
 
@@ -1307,9 +1381,380 @@ function maybeCleanup() {
1307
1381
  }
1308
1382
  }
1309
1383
  }
1384
+
1385
+ // src/streaming.ts
1386
+ async function* tracedStream(source, options) {
1387
+ const opts = typeof options === "string" ? { name: options } : options;
1388
+ const tracer = getTracer2();
1389
+ if (!tracer || !tracer.enabled) {
1390
+ yield* source;
1391
+ return;
1392
+ }
1393
+ const span = tracer.createSpan({
1394
+ name: opts.name,
1395
+ kind: opts.kind ?? "internal" /* INTERNAL */,
1396
+ attributes: opts.attributes
1397
+ });
1398
+ let chunkCount = 0;
1399
+ try {
1400
+ for await (const chunk of source) {
1401
+ chunkCount++;
1402
+ yield chunk;
1403
+ }
1404
+ span.setAttribute("stream.chunk_count", chunkCount);
1405
+ span.setAttribute("stream.completed", true);
1406
+ } catch (error) {
1407
+ span.setAttribute("stream.chunk_count", chunkCount);
1408
+ span.setAttribute("stream.completed", false);
1409
+ span.recordException(error instanceof Error ? error : String(error));
1410
+ throw error;
1411
+ } finally {
1412
+ span.end();
1413
+ }
1414
+ }
1415
+
1416
+ // src/frameworks/langchain.ts
1417
+ var RisicareCallbackHandler = class {
1418
+ name = "RisicareCallbackHandler";
1419
+ _spans = /* @__PURE__ */ new Map();
1420
+ // ── Chain lifecycle ────────────────────────────────────────────────────────
1421
+ handleChainStart(chain, _inputs, runId, parentRunId) {
1422
+ const tracer = getTracer2();
1423
+ if (!tracer?.enabled) return;
1424
+ const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
1425
+ const span = tracer.createSpan({
1426
+ name: chain.name || chain._type || "chain",
1427
+ kind: "internal" /* INTERNAL */,
1428
+ parentSpanId: parentEntry?.span.spanId,
1429
+ traceId: parentEntry?.span.traceId,
1430
+ attributes: {
1431
+ "framework": "langchain",
1432
+ "langchain.run_id": runId,
1433
+ ...parentRunId ? { "langchain.parent_run_id": parentRunId } : {},
1434
+ ...chain._type ? { "langchain.chain_type": chain._type } : {}
1435
+ }
1436
+ });
1437
+ this._spans.set(runId, { span, startTime: Date.now() });
1438
+ }
1439
+ handleChainEnd(_outputs, runId) {
1440
+ const entry = this._spans.get(runId);
1441
+ if (!entry) return;
1442
+ entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
1443
+ entry.span.end();
1444
+ this._spans.delete(runId);
1445
+ }
1446
+ handleChainError(error, runId) {
1447
+ const entry = this._spans.get(runId);
1448
+ if (!entry) return;
1449
+ entry.span.recordException(error);
1450
+ entry.span.end();
1451
+ this._spans.delete(runId);
1452
+ }
1453
+ // ── LLM lifecycle ─────────────────────────────────────────────────────────
1454
+ handleLLMStart(llm, _prompts, runId, parentRunId) {
1455
+ const tracer = getTracer2();
1456
+ if (!tracer?.enabled) return;
1457
+ const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
1458
+ const span = tracer.createSpan({
1459
+ name: llm.name || llm._type || "llm",
1460
+ kind: "llm_call" /* LLM_CALL */,
1461
+ parentSpanId: parentEntry?.span.spanId,
1462
+ traceId: parentEntry?.span.traceId,
1463
+ attributes: {
1464
+ "framework": "langchain",
1465
+ "langchain.run_id": runId,
1466
+ "gen_ai.system": "langchain",
1467
+ "gen_ai.prompt.count": _prompts.length
1468
+ }
1469
+ });
1470
+ this._spans.set(runId, { span, startTime: Date.now() });
1471
+ }
1472
+ handleLLMEnd(output, runId) {
1473
+ const entry = this._spans.get(runId);
1474
+ if (!entry) return;
1475
+ const usage = output.llmOutput?.tokenUsage;
1476
+ if (usage) {
1477
+ entry.span.setLlmFields({
1478
+ promptTokens: usage.promptTokens ?? usage.prompt_tokens,
1479
+ completionTokens: usage.completionTokens ?? usage.completion_tokens,
1480
+ totalTokens: usage.totalTokens ?? usage.total_tokens
1481
+ });
1482
+ }
1483
+ const model = output.llmOutput?.model ?? output.llmOutput?.modelName;
1484
+ if (model) {
1485
+ entry.span.setLlmFields({ model });
1486
+ }
1487
+ entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
1488
+ entry.span.end();
1489
+ this._spans.delete(runId);
1490
+ }
1491
+ handleLLMError(error, runId) {
1492
+ const entry = this._spans.get(runId);
1493
+ if (!entry) return;
1494
+ entry.span.recordException(error);
1495
+ entry.span.end();
1496
+ this._spans.delete(runId);
1497
+ }
1498
+ // ── Tool lifecycle ────────────────────────────────────────────────────────
1499
+ handleToolStart(tool, input, runId, parentRunId) {
1500
+ const tracer = getTracer2();
1501
+ if (!tracer?.enabled) return;
1502
+ const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
1503
+ const span = tracer.createSpan({
1504
+ name: tool.name || "tool",
1505
+ kind: "tool_call" /* TOOL_CALL */,
1506
+ parentSpanId: parentEntry?.span.spanId,
1507
+ traceId: parentEntry?.span.traceId,
1508
+ attributes: {
1509
+ "framework": "langchain",
1510
+ "langchain.run_id": runId,
1511
+ "tool.name": tool.name || "unknown",
1512
+ "tool.input_length": input?.length ?? 0
1513
+ }
1514
+ });
1515
+ this._spans.set(runId, { span, startTime: Date.now() });
1516
+ }
1517
+ handleToolEnd(output, runId) {
1518
+ const entry = this._spans.get(runId);
1519
+ if (!entry) return;
1520
+ entry.span.setAttribute("tool.output_length", output?.length ?? 0);
1521
+ entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
1522
+ entry.span.end();
1523
+ this._spans.delete(runId);
1524
+ }
1525
+ handleToolError(error, runId) {
1526
+ const entry = this._spans.get(runId);
1527
+ if (!entry) return;
1528
+ entry.span.recordException(error);
1529
+ entry.span.end();
1530
+ this._spans.delete(runId);
1531
+ }
1532
+ // ── Retriever lifecycle ───────────────────────────────────────────────────
1533
+ handleRetrieverStart(retriever, _query, runId, parentRunId) {
1534
+ const tracer = getTracer2();
1535
+ if (!tracer?.enabled) return;
1536
+ const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
1537
+ const span = tracer.createSpan({
1538
+ name: retriever.name || "retriever",
1539
+ kind: "retrieval" /* RETRIEVAL */,
1540
+ parentSpanId: parentEntry?.span.spanId,
1541
+ traceId: parentEntry?.span.traceId,
1542
+ attributes: {
1543
+ "framework": "langchain",
1544
+ "langchain.run_id": runId
1545
+ }
1546
+ });
1547
+ this._spans.set(runId, { span, startTime: Date.now() });
1548
+ }
1549
+ handleRetrieverEnd(documents, runId) {
1550
+ const entry = this._spans.get(runId);
1551
+ if (!entry) return;
1552
+ entry.span.setAttribute(
1553
+ "retriever.document_count",
1554
+ documents?.length ?? 0
1555
+ );
1556
+ entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
1557
+ entry.span.end();
1558
+ this._spans.delete(runId);
1559
+ }
1560
+ };
1561
+
1562
+ // src/frameworks/langgraph.ts
1563
+ function instrumentLangGraph(graph) {
1564
+ return new Proxy(graph, {
1565
+ get(target, prop, receiver) {
1566
+ const value = Reflect.get(target, prop, receiver);
1567
+ if ((prop === "invoke" || prop === "stream") && typeof value === "function") {
1568
+ return function patchedMethod(...args) {
1569
+ const tracer = getTracer2();
1570
+ if (!tracer?.enabled) return value.apply(this, args);
1571
+ return tracer.startSpan(
1572
+ {
1573
+ name: `langgraph.${String(prop)}`,
1574
+ kind: "agent" /* AGENT */,
1575
+ attributes: { framework: "langgraph" }
1576
+ },
1577
+ (_span) => {
1578
+ const config = args[1] ?? {};
1579
+ const callbacks = config.callbacks ?? [];
1580
+ callbacks.push(new RisicareCallbackHandler());
1581
+ args[1] = { ...config, callbacks };
1582
+ const result = value.apply(this, args);
1583
+ if (result && typeof result.then === "function") {
1584
+ return result.then((r) => r);
1585
+ }
1586
+ return result;
1587
+ }
1588
+ );
1589
+ };
1590
+ }
1591
+ return value;
1592
+ }
1593
+ });
1594
+ }
1595
+
1596
+ // src/frameworks/instructor.ts
1597
+ function patchInstructor(client) {
1598
+ return new Proxy(client, {
1599
+ get(target, prop, receiver) {
1600
+ const value = Reflect.get(target, prop, receiver);
1601
+ if (prop === "create" && typeof value === "function") {
1602
+ return function patchedCreate(...args) {
1603
+ const tracer = getTracer2();
1604
+ if (!tracer?.enabled) {
1605
+ debug(
1606
+ "Tracer not initialized \u2014 call init() before using patchInstructor()"
1607
+ );
1608
+ return value.apply(this, args);
1609
+ }
1610
+ const params = args[0] ?? {};
1611
+ const responseModel = params.response_model ?? params.responseModel;
1612
+ let modelName = "unknown";
1613
+ if (responseModel && typeof responseModel === "function") {
1614
+ modelName = responseModel.name || "unknown";
1615
+ } else if (responseModel && typeof responseModel === "object") {
1616
+ modelName = responseModel.name ?? responseModel.description ?? "schema";
1617
+ } else if (typeof responseModel === "string") {
1618
+ modelName = responseModel;
1619
+ }
1620
+ return tracer.startSpan(
1621
+ {
1622
+ name: "instructor.create",
1623
+ kind: "llm_call" /* LLM_CALL */,
1624
+ attributes: {
1625
+ framework: "instructor",
1626
+ "framework.span_kind": "extraction",
1627
+ "instructor.response_model": modelName,
1628
+ ...params.max_retries != null ? { "instructor.max_retries": params.max_retries } : {},
1629
+ ...params.model != null ? { "gen_ai.request.model": params.model } : {}
1630
+ }
1631
+ },
1632
+ (_span) => {
1633
+ const result = value.apply(this, args);
1634
+ if (result && typeof result.then === "function") {
1635
+ return result.then((r) => r);
1636
+ }
1637
+ return result;
1638
+ }
1639
+ );
1640
+ };
1641
+ }
1642
+ return value;
1643
+ }
1644
+ });
1645
+ }
1646
+
1647
+ // src/context/dedup.ts
1648
+ function suppressProviderInstrumentation(fn) {
1649
+ return runWithContext({ _suppressProviderInstrumentation: true }, fn);
1650
+ }
1651
+ function isProviderInstrumentationSuppressed() {
1652
+ return getContext()._suppressProviderInstrumentation === true;
1653
+ }
1654
+
1655
+ // src/frameworks/llamaindex.ts
1656
+ var RisicareLlamaIndexHandler = class {
1657
+ _spans = /* @__PURE__ */ new Map();
1658
+ /**
1659
+ * Handle a LlamaIndex lifecycle event.
1660
+ *
1661
+ * Events follow the convention:
1662
+ * - `*.start` / `*.begin` -- component starts
1663
+ * - `*.end` / `*.complete` -- component finishes
1664
+ * - `*.error` -- component failed
1665
+ */
1666
+ onEvent(event) {
1667
+ const tracer = getTracer2();
1668
+ if (!tracer?.enabled) return;
1669
+ if (event.type.endsWith(".start") || event.type.endsWith(".begin")) {
1670
+ this._handleStart(event);
1671
+ } else if (event.type.endsWith(".end") || event.type.endsWith(".complete")) {
1672
+ this._handleEnd(event);
1673
+ } else if (event.type.endsWith(".error")) {
1674
+ this._handleError(event);
1675
+ }
1676
+ }
1677
+ /**
1678
+ * Run a function with provider instrumentation suppressed.
1679
+ *
1680
+ * LlamaIndex handler creates its own LLM spans, so provider spans
1681
+ * (patchOpenAI, patchAnthropic, etc.) should be suppressed to avoid
1682
+ * double-tracing.
1683
+ */
1684
+ withSuppression(fn) {
1685
+ return suppressProviderInstrumentation(fn);
1686
+ }
1687
+ // ── Internal event handlers ───────────────────────────────────────────────
1688
+ _handleStart(event) {
1689
+ const tracer = getTracer2();
1690
+ if (!tracer?.enabled) return;
1691
+ const componentKind = this._classifyComponent(event.type);
1692
+ const parentEntry = event.parentId ? this._spans.get(event.parentId) : void 0;
1693
+ const spanKind = componentKind === "llm" ? "llm_call" /* LLM_CALL */ : componentKind === "retrieval" ? "retrieval" /* RETRIEVAL */ : componentKind === "embedding" ? "llm_call" /* LLM_CALL */ : "internal" /* INTERNAL */;
1694
+ const span = tracer.createSpan({
1695
+ name: event.type.replace(/\.(start|begin)$/, ""),
1696
+ kind: spanKind,
1697
+ parentSpanId: parentEntry?.span.spanId,
1698
+ traceId: parentEntry?.span.traceId,
1699
+ attributes: {
1700
+ framework: "llamaindex",
1701
+ "framework.span_kind": componentKind,
1702
+ ...event.data?.model ? { "gen_ai.request.model": event.data.model } : {}
1703
+ }
1704
+ });
1705
+ this._spans.set(event.id, { span, startTime: Date.now(), componentKind });
1706
+ }
1707
+ _handleEnd(event) {
1708
+ const entry = this._spans.get(event.id);
1709
+ if (!entry) return;
1710
+ entry.span.setAttribute(
1711
+ "gen_ai.latency_ms",
1712
+ Date.now() - entry.startTime
1713
+ );
1714
+ const usage = event.data?.usage;
1715
+ if (usage) {
1716
+ entry.span.setLlmFields({
1717
+ promptTokens: usage.promptTokens ?? usage.prompt_tokens,
1718
+ completionTokens: usage.completionTokens ?? usage.completion_tokens
1719
+ });
1720
+ }
1721
+ if (event.data?.documentCount != null) {
1722
+ entry.span.setAttribute(
1723
+ "retriever.document_count",
1724
+ event.data.documentCount
1725
+ );
1726
+ }
1727
+ entry.span.end();
1728
+ this._spans.delete(event.id);
1729
+ }
1730
+ _handleError(event) {
1731
+ const entry = this._spans.get(event.id);
1732
+ if (!entry) return;
1733
+ const error = event.data?.error;
1734
+ entry.span.recordException(
1735
+ error instanceof Error ? error : String(error ?? "Unknown error")
1736
+ );
1737
+ entry.span.end();
1738
+ this._spans.delete(event.id);
1739
+ }
1740
+ /**
1741
+ * Classify a LlamaIndex event type into a component kind.
1742
+ */
1743
+ _classifyComponent(eventType) {
1744
+ const lower = eventType.toLowerCase();
1745
+ if (lower.includes("llm") || lower.includes("chat")) return "llm";
1746
+ if (lower.includes("embed")) return "embedding";
1747
+ if (lower.includes("retriev") || lower.includes("vector")) return "retrieval";
1748
+ if (lower.includes("synth") || lower.includes("response")) return "synthesis";
1749
+ if (lower.includes("query")) return "query";
1750
+ return "component";
1751
+ }
1752
+ };
1310
1753
  export {
1311
1754
  AgentRole,
1312
1755
  MessageType,
1756
+ RisicareCallbackHandler,
1757
+ RisicareLlamaIndexHandler,
1313
1758
  SemanticPhase,
1314
1759
  SpanKind,
1315
1760
  SpanStatus,
@@ -1334,10 +1779,16 @@ export {
1334
1779
  getTracer2 as getTracer,
1335
1780
  init,
1336
1781
  injectTraceContext,
1782
+ instrumentLangGraph,
1337
1783
  isEnabled,
1784
+ isProviderInstrumentationSuppressed,
1785
+ patchInstructor,
1338
1786
  registerSpan,
1787
+ reportError,
1788
+ score,
1339
1789
  session,
1340
1790
  shutdown,
1791
+ suppressProviderInstrumentation,
1341
1792
  traceAct,
1342
1793
  traceCoordinate,
1343
1794
  traceDecide,
@@ -1345,6 +1796,7 @@ export {
1345
1796
  traceMessage,
1346
1797
  traceObserve,
1347
1798
  traceThink,
1799
+ tracedStream,
1348
1800
  unregisterSpan,
1349
1801
  withAgent,
1350
1802
  withPhase,