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.
- package/dist/frameworks/instructor.cjs +178 -0
- package/dist/frameworks/instructor.cjs.map +1 -0
- package/dist/frameworks/instructor.d.cts +28 -0
- package/dist/frameworks/instructor.d.ts +28 -0
- package/dist/frameworks/instructor.js +151 -0
- package/dist/frameworks/instructor.js.map +1 -0
- package/dist/frameworks/langchain.cjs +262 -0
- package/dist/frameworks/langchain.cjs.map +1 -0
- package/dist/frameworks/langchain.d.cts +45 -0
- package/dist/frameworks/langchain.d.ts +45 -0
- package/dist/frameworks/langchain.js +235 -0
- package/dist/frameworks/langchain.js.map +1 -0
- package/dist/frameworks/langgraph.cjs +296 -0
- package/dist/frameworks/langgraph.cjs.map +1 -0
- package/dist/frameworks/langgraph.d.cts +28 -0
- package/dist/frameworks/langgraph.d.ts +28 -0
- package/dist/frameworks/langgraph.js +269 -0
- package/dist/frameworks/langgraph.js.map +1 -0
- package/dist/frameworks/llamaindex.cjs +239 -0
- package/dist/frameworks/llamaindex.cjs.map +1 -0
- package/dist/frameworks/llamaindex.d.cts +55 -0
- package/dist/frameworks/llamaindex.d.ts +55 -0
- package/dist/frameworks/llamaindex.js +212 -0
- package/dist/frameworks/llamaindex.js.map +1 -0
- package/dist/index.cjs +468 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +124 -6
- package/dist/index.d.ts +124 -6
- package/dist/index.js +459 -7
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic/index.cjs +22 -0
- package/dist/providers/anthropic/index.cjs.map +1 -1
- package/dist/providers/anthropic/index.js +22 -0
- package/dist/providers/anthropic/index.js.map +1 -1
- package/dist/providers/bedrock/index.cjs +334 -0
- package/dist/providers/bedrock/index.cjs.map +1 -0
- package/dist/providers/bedrock/index.d.cts +37 -0
- package/dist/providers/bedrock/index.d.ts +37 -0
- package/dist/providers/bedrock/index.js +307 -0
- package/dist/providers/bedrock/index.js.map +1 -0
- package/dist/providers/cerebras/index.cjs +282 -0
- package/dist/providers/cerebras/index.cjs.map +1 -0
- package/dist/providers/cerebras/index.d.cts +24 -0
- package/dist/providers/cerebras/index.d.ts +24 -0
- package/dist/providers/cerebras/index.js +255 -0
- package/dist/providers/cerebras/index.js.map +1 -0
- package/dist/providers/cohere/index.cjs +347 -0
- package/dist/providers/cohere/index.cjs.map +1 -0
- package/dist/providers/cohere/index.d.cts +24 -0
- package/dist/providers/cohere/index.d.ts +24 -0
- package/dist/providers/cohere/index.js +320 -0
- package/dist/providers/cohere/index.js.map +1 -0
- package/dist/providers/google/index.cjs +337 -0
- package/dist/providers/google/index.cjs.map +1 -0
- package/dist/providers/google/index.d.cts +25 -0
- package/dist/providers/google/index.d.ts +25 -0
- package/dist/providers/google/index.js +310 -0
- package/dist/providers/google/index.js.map +1 -0
- package/dist/providers/groq/index.cjs +282 -0
- package/dist/providers/groq/index.cjs.map +1 -0
- package/dist/providers/groq/index.d.cts +23 -0
- package/dist/providers/groq/index.d.ts +23 -0
- package/dist/providers/groq/index.js +255 -0
- package/dist/providers/groq/index.js.map +1 -0
- package/dist/providers/huggingface/index.cjs +289 -0
- package/dist/providers/huggingface/index.cjs.map +1 -0
- package/dist/providers/huggingface/index.d.cts +24 -0
- package/dist/providers/huggingface/index.d.ts +24 -0
- package/dist/providers/huggingface/index.js +262 -0
- package/dist/providers/huggingface/index.js.map +1 -0
- package/dist/providers/mistral/index.cjs +336 -0
- package/dist/providers/mistral/index.cjs.map +1 -0
- package/dist/providers/mistral/index.d.cts +24 -0
- package/dist/providers/mistral/index.d.ts +24 -0
- package/dist/providers/mistral/index.js +309 -0
- package/dist/providers/mistral/index.js.map +1 -0
- package/dist/providers/ollama/index.cjs +376 -0
- package/dist/providers/ollama/index.cjs.map +1 -0
- package/dist/providers/ollama/index.d.cts +28 -0
- package/dist/providers/ollama/index.d.ts +28 -0
- package/dist/providers/ollama/index.js +349 -0
- package/dist/providers/ollama/index.js.map +1 -0
- package/dist/providers/openai/index.cjs +31 -1
- package/dist/providers/openai/index.cjs.map +1 -1
- package/dist/providers/openai/index.js +31 -1
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/together/index.cjs +275 -0
- package/dist/providers/together/index.cjs.map +1 -0
- package/dist/providers/together/index.d.cts +24 -0
- package/dist/providers/together/index.d.ts +24 -0
- package/dist/providers/together/index.js +248 -0
- package/dist/providers/together/index.js.map +1 -0
- package/dist/providers/vercel-ai/index.cjs.map +1 -1
- package/dist/providers/vercel-ai/index.js.map +1 -1
- package/package.json +124 -2
package/dist/index.cjs
CHANGED
|
@@ -32,6 +32,8 @@ var src_exports = {};
|
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
AgentRole: () => AgentRole,
|
|
34
34
|
MessageType: () => MessageType,
|
|
35
|
+
RisicareCallbackHandler: () => RisicareCallbackHandler,
|
|
36
|
+
RisicareLlamaIndexHandler: () => RisicareLlamaIndexHandler,
|
|
35
37
|
SemanticPhase: () => SemanticPhase,
|
|
36
38
|
SpanKind: () => SpanKind,
|
|
37
39
|
SpanStatus: () => SpanStatus,
|
|
@@ -56,10 +58,16 @@ __export(src_exports, {
|
|
|
56
58
|
getTracer: () => getTracer2,
|
|
57
59
|
init: () => init,
|
|
58
60
|
injectTraceContext: () => injectTraceContext,
|
|
61
|
+
instrumentLangGraph: () => instrumentLangGraph,
|
|
59
62
|
isEnabled: () => isEnabled,
|
|
63
|
+
isProviderInstrumentationSuppressed: () => isProviderInstrumentationSuppressed,
|
|
64
|
+
patchInstructor: () => patchInstructor,
|
|
60
65
|
registerSpan: () => registerSpan,
|
|
66
|
+
reportError: () => reportError,
|
|
67
|
+
score: () => score,
|
|
61
68
|
session: () => session,
|
|
62
69
|
shutdown: () => shutdown,
|
|
70
|
+
suppressProviderInstrumentation: () => suppressProviderInstrumentation,
|
|
63
71
|
traceAct: () => traceAct,
|
|
64
72
|
traceCoordinate: () => traceCoordinate,
|
|
65
73
|
traceDecide: () => traceDecide,
|
|
@@ -67,6 +75,7 @@ __export(src_exports, {
|
|
|
67
75
|
traceMessage: () => traceMessage,
|
|
68
76
|
traceObserve: () => traceObserve,
|
|
69
77
|
traceThink: () => traceThink,
|
|
78
|
+
tracedStream: () => tracedStream,
|
|
70
79
|
unregisterSpan: () => unregisterSpan,
|
|
71
80
|
withAgent: () => withAgent,
|
|
72
81
|
withPhase: () => withPhase,
|
|
@@ -189,19 +198,39 @@ var SemanticPhase = /* @__PURE__ */ ((SemanticPhase2) => {
|
|
|
189
198
|
var AgentRole = /* @__PURE__ */ ((AgentRole2) => {
|
|
190
199
|
AgentRole2["ORCHESTRATOR"] = "orchestrator";
|
|
191
200
|
AgentRole2["WORKER"] = "worker";
|
|
192
|
-
AgentRole2["
|
|
201
|
+
AgentRole2["SUPERVISOR"] = "supervisor";
|
|
202
|
+
AgentRole2["SPECIALIST"] = "specialist";
|
|
203
|
+
AgentRole2["ROUTER"] = "router";
|
|
204
|
+
AgentRole2["AGGREGATOR"] = "aggregator";
|
|
205
|
+
AgentRole2["BROADCASTER"] = "broadcaster";
|
|
206
|
+
AgentRole2["CRITIC"] = "critic";
|
|
193
207
|
AgentRole2["PLANNER"] = "planner";
|
|
194
208
|
AgentRole2["EXECUTOR"] = "executor";
|
|
195
|
-
AgentRole2["
|
|
209
|
+
AgentRole2["RETRIEVER"] = "retriever";
|
|
210
|
+
AgentRole2["VALIDATOR"] = "validator";
|
|
211
|
+
AgentRole2["REVIEWER"] = "reviewer";
|
|
196
212
|
AgentRole2["CUSTOM"] = "custom";
|
|
197
213
|
return AgentRole2;
|
|
198
214
|
})(AgentRole || {});
|
|
199
215
|
var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
200
|
-
MessageType2["
|
|
216
|
+
MessageType2["TASK"] = "task";
|
|
217
|
+
MessageType2["RESULT"] = "result";
|
|
218
|
+
MessageType2["STATUS"] = "status";
|
|
219
|
+
MessageType2["ERROR"] = "error";
|
|
220
|
+
MessageType2["QUERY"] = "query";
|
|
201
221
|
MessageType2["RESPONSE"] = "response";
|
|
222
|
+
MessageType2["BROADCAST"] = "broadcast";
|
|
223
|
+
MessageType2["DIRECT"] = "direct";
|
|
224
|
+
MessageType2["PROPOSAL"] = "proposal";
|
|
225
|
+
MessageType2["VOTE"] = "vote";
|
|
226
|
+
MessageType2["CONSENSUS"] = "consensus";
|
|
227
|
+
MessageType2["CONFLICT"] = "conflict";
|
|
228
|
+
MessageType2["HEARTBEAT"] = "heartbeat";
|
|
229
|
+
MessageType2["SHUTDOWN"] = "shutdown";
|
|
230
|
+
MessageType2["HANDOFF"] = "handoff";
|
|
231
|
+
MessageType2["REQUEST"] = "request";
|
|
202
232
|
MessageType2["DELEGATE"] = "delegate";
|
|
203
233
|
MessageType2["COORDINATE"] = "coordinate";
|
|
204
|
-
MessageType2["BROADCAST"] = "broadcast";
|
|
205
234
|
return MessageType2;
|
|
206
235
|
})(MessageType || {});
|
|
207
236
|
|
|
@@ -1119,10 +1148,66 @@ function getMetrics() {
|
|
|
1119
1148
|
queueUtilization: 0
|
|
1120
1149
|
};
|
|
1121
1150
|
}
|
|
1151
|
+
function reportError(error, options) {
|
|
1152
|
+
try {
|
|
1153
|
+
const tracer = getTracer2();
|
|
1154
|
+
if (!tracer) return;
|
|
1155
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
1156
|
+
const spanName = options?.name ?? `error:${err.constructor.name}`;
|
|
1157
|
+
tracer.startSpan({ name: spanName, kind: "internal" /* INTERNAL */ }, (span) => {
|
|
1158
|
+
span.setStatus("error" /* ERROR */, err.message);
|
|
1159
|
+
span.setAttribute("error", true);
|
|
1160
|
+
span.setAttribute("error.type", err.constructor.name);
|
|
1161
|
+
span.setAttribute("error.message", err.message.slice(0, 2e3));
|
|
1162
|
+
if (err.stack) span.setAttribute("error.stack", err.stack.slice(0, 4e3));
|
|
1163
|
+
span.setAttribute("risicare.reported_error", true);
|
|
1164
|
+
if (options?.attributes) {
|
|
1165
|
+
for (const [k, v] of Object.entries(options.attributes)) {
|
|
1166
|
+
span.setAttribute(k, v);
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
});
|
|
1170
|
+
} catch {
|
|
1171
|
+
debug("reportError failed");
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
function score(traceId, name, value, options) {
|
|
1175
|
+
try {
|
|
1176
|
+
if (typeof value !== "number" || value < 0 || value > 1) {
|
|
1177
|
+
debug(`score: value must be in [0.0, 1.0], got ${value}. Score not sent.`);
|
|
1178
|
+
return;
|
|
1179
|
+
}
|
|
1180
|
+
if (!traceId || !name) {
|
|
1181
|
+
debug("score: traceId and name are required");
|
|
1182
|
+
return;
|
|
1183
|
+
}
|
|
1184
|
+
const client = getClient();
|
|
1185
|
+
if (!client?.enabled || !client.config.apiKey) return;
|
|
1186
|
+
const endpoint = client.config.endpoint.replace(/\/$/, "");
|
|
1187
|
+
const url = `${endpoint}/api/v1/scores`;
|
|
1188
|
+
const body = JSON.stringify({
|
|
1189
|
+
trace_id: traceId,
|
|
1190
|
+
name,
|
|
1191
|
+
score: value,
|
|
1192
|
+
source: "sdk",
|
|
1193
|
+
...options?.spanId && { span_id: options.spanId },
|
|
1194
|
+
...options?.comment && { comment: options.comment }
|
|
1195
|
+
});
|
|
1196
|
+
fetch(url, {
|
|
1197
|
+
method: "POST",
|
|
1198
|
+
headers: {
|
|
1199
|
+
"Content-Type": "application/json",
|
|
1200
|
+
"Authorization": `Bearer ${client.config.apiKey}`
|
|
1201
|
+
},
|
|
1202
|
+
body
|
|
1203
|
+
}).catch((err) => debug(`score: send failed: ${err}`));
|
|
1204
|
+
} catch {
|
|
1205
|
+
debug("score failed");
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1122
1208
|
|
|
1123
1209
|
// src/context/agent.ts
|
|
1124
1210
|
function withAgent(options, fn) {
|
|
1125
|
-
if (!isEnabled()) return fn();
|
|
1126
1211
|
const parent = getCurrentAgent();
|
|
1127
1212
|
const agentName = options.name ?? "agent";
|
|
1128
1213
|
const agent2 = {
|
|
@@ -1155,7 +1240,6 @@ function agent(options, fn) {
|
|
|
1155
1240
|
|
|
1156
1241
|
// src/context/session.ts
|
|
1157
1242
|
function withSession(options, fn) {
|
|
1158
|
-
if (!isEnabled()) return fn();
|
|
1159
1243
|
const session2 = {
|
|
1160
1244
|
sessionId: options.sessionId,
|
|
1161
1245
|
userId: options.userId,
|
|
@@ -1176,7 +1260,6 @@ function session(optionsOrResolver, fn) {
|
|
|
1176
1260
|
|
|
1177
1261
|
// src/context/phase.ts
|
|
1178
1262
|
function withPhase(phase, fn) {
|
|
1179
|
-
if (!isEnabled()) return fn();
|
|
1180
1263
|
return runWithContext({ phase }, fn);
|
|
1181
1264
|
}
|
|
1182
1265
|
|
|
@@ -1383,10 +1466,381 @@ function maybeCleanup() {
|
|
|
1383
1466
|
}
|
|
1384
1467
|
}
|
|
1385
1468
|
}
|
|
1469
|
+
|
|
1470
|
+
// src/streaming.ts
|
|
1471
|
+
async function* tracedStream(source, options) {
|
|
1472
|
+
const opts = typeof options === "string" ? { name: options } : options;
|
|
1473
|
+
const tracer = getTracer2();
|
|
1474
|
+
if (!tracer || !tracer.enabled) {
|
|
1475
|
+
yield* source;
|
|
1476
|
+
return;
|
|
1477
|
+
}
|
|
1478
|
+
const span = tracer.createSpan({
|
|
1479
|
+
name: opts.name,
|
|
1480
|
+
kind: opts.kind ?? "internal" /* INTERNAL */,
|
|
1481
|
+
attributes: opts.attributes
|
|
1482
|
+
});
|
|
1483
|
+
let chunkCount = 0;
|
|
1484
|
+
try {
|
|
1485
|
+
for await (const chunk of source) {
|
|
1486
|
+
chunkCount++;
|
|
1487
|
+
yield chunk;
|
|
1488
|
+
}
|
|
1489
|
+
span.setAttribute("stream.chunk_count", chunkCount);
|
|
1490
|
+
span.setAttribute("stream.completed", true);
|
|
1491
|
+
} catch (error) {
|
|
1492
|
+
span.setAttribute("stream.chunk_count", chunkCount);
|
|
1493
|
+
span.setAttribute("stream.completed", false);
|
|
1494
|
+
span.recordException(error instanceof Error ? error : String(error));
|
|
1495
|
+
throw error;
|
|
1496
|
+
} finally {
|
|
1497
|
+
span.end();
|
|
1498
|
+
}
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
// src/frameworks/langchain.ts
|
|
1502
|
+
var RisicareCallbackHandler = class {
|
|
1503
|
+
name = "RisicareCallbackHandler";
|
|
1504
|
+
_spans = /* @__PURE__ */ new Map();
|
|
1505
|
+
// ── Chain lifecycle ────────────────────────────────────────────────────────
|
|
1506
|
+
handleChainStart(chain, _inputs, runId, parentRunId) {
|
|
1507
|
+
const tracer = getTracer2();
|
|
1508
|
+
if (!tracer?.enabled) return;
|
|
1509
|
+
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
1510
|
+
const span = tracer.createSpan({
|
|
1511
|
+
name: chain.name || chain._type || "chain",
|
|
1512
|
+
kind: "internal" /* INTERNAL */,
|
|
1513
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1514
|
+
traceId: parentEntry?.span.traceId,
|
|
1515
|
+
attributes: {
|
|
1516
|
+
"framework": "langchain",
|
|
1517
|
+
"langchain.run_id": runId,
|
|
1518
|
+
...parentRunId ? { "langchain.parent_run_id": parentRunId } : {},
|
|
1519
|
+
...chain._type ? { "langchain.chain_type": chain._type } : {}
|
|
1520
|
+
}
|
|
1521
|
+
});
|
|
1522
|
+
this._spans.set(runId, { span, startTime: Date.now() });
|
|
1523
|
+
}
|
|
1524
|
+
handleChainEnd(_outputs, runId) {
|
|
1525
|
+
const entry = this._spans.get(runId);
|
|
1526
|
+
if (!entry) return;
|
|
1527
|
+
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
1528
|
+
entry.span.end();
|
|
1529
|
+
this._spans.delete(runId);
|
|
1530
|
+
}
|
|
1531
|
+
handleChainError(error, runId) {
|
|
1532
|
+
const entry = this._spans.get(runId);
|
|
1533
|
+
if (!entry) return;
|
|
1534
|
+
entry.span.recordException(error);
|
|
1535
|
+
entry.span.end();
|
|
1536
|
+
this._spans.delete(runId);
|
|
1537
|
+
}
|
|
1538
|
+
// ── LLM lifecycle ─────────────────────────────────────────────────────────
|
|
1539
|
+
handleLLMStart(llm, _prompts, runId, parentRunId) {
|
|
1540
|
+
const tracer = getTracer2();
|
|
1541
|
+
if (!tracer?.enabled) return;
|
|
1542
|
+
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
1543
|
+
const span = tracer.createSpan({
|
|
1544
|
+
name: llm.name || llm._type || "llm",
|
|
1545
|
+
kind: "llm_call" /* LLM_CALL */,
|
|
1546
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1547
|
+
traceId: parentEntry?.span.traceId,
|
|
1548
|
+
attributes: {
|
|
1549
|
+
"framework": "langchain",
|
|
1550
|
+
"langchain.run_id": runId,
|
|
1551
|
+
"gen_ai.system": "langchain",
|
|
1552
|
+
"gen_ai.prompt.count": _prompts.length
|
|
1553
|
+
}
|
|
1554
|
+
});
|
|
1555
|
+
this._spans.set(runId, { span, startTime: Date.now() });
|
|
1556
|
+
}
|
|
1557
|
+
handleLLMEnd(output, runId) {
|
|
1558
|
+
const entry = this._spans.get(runId);
|
|
1559
|
+
if (!entry) return;
|
|
1560
|
+
const usage = output.llmOutput?.tokenUsage;
|
|
1561
|
+
if (usage) {
|
|
1562
|
+
entry.span.setLlmFields({
|
|
1563
|
+
promptTokens: usage.promptTokens ?? usage.prompt_tokens,
|
|
1564
|
+
completionTokens: usage.completionTokens ?? usage.completion_tokens,
|
|
1565
|
+
totalTokens: usage.totalTokens ?? usage.total_tokens
|
|
1566
|
+
});
|
|
1567
|
+
}
|
|
1568
|
+
const model = output.llmOutput?.model ?? output.llmOutput?.modelName;
|
|
1569
|
+
if (model) {
|
|
1570
|
+
entry.span.setLlmFields({ model });
|
|
1571
|
+
}
|
|
1572
|
+
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
1573
|
+
entry.span.end();
|
|
1574
|
+
this._spans.delete(runId);
|
|
1575
|
+
}
|
|
1576
|
+
handleLLMError(error, runId) {
|
|
1577
|
+
const entry = this._spans.get(runId);
|
|
1578
|
+
if (!entry) return;
|
|
1579
|
+
entry.span.recordException(error);
|
|
1580
|
+
entry.span.end();
|
|
1581
|
+
this._spans.delete(runId);
|
|
1582
|
+
}
|
|
1583
|
+
// ── Tool lifecycle ────────────────────────────────────────────────────────
|
|
1584
|
+
handleToolStart(tool, input, runId, parentRunId) {
|
|
1585
|
+
const tracer = getTracer2();
|
|
1586
|
+
if (!tracer?.enabled) return;
|
|
1587
|
+
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
1588
|
+
const span = tracer.createSpan({
|
|
1589
|
+
name: tool.name || "tool",
|
|
1590
|
+
kind: "tool_call" /* TOOL_CALL */,
|
|
1591
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1592
|
+
traceId: parentEntry?.span.traceId,
|
|
1593
|
+
attributes: {
|
|
1594
|
+
"framework": "langchain",
|
|
1595
|
+
"langchain.run_id": runId,
|
|
1596
|
+
"tool.name": tool.name || "unknown",
|
|
1597
|
+
"tool.input_length": input?.length ?? 0
|
|
1598
|
+
}
|
|
1599
|
+
});
|
|
1600
|
+
this._spans.set(runId, { span, startTime: Date.now() });
|
|
1601
|
+
}
|
|
1602
|
+
handleToolEnd(output, runId) {
|
|
1603
|
+
const entry = this._spans.get(runId);
|
|
1604
|
+
if (!entry) return;
|
|
1605
|
+
entry.span.setAttribute("tool.output_length", output?.length ?? 0);
|
|
1606
|
+
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
1607
|
+
entry.span.end();
|
|
1608
|
+
this._spans.delete(runId);
|
|
1609
|
+
}
|
|
1610
|
+
handleToolError(error, runId) {
|
|
1611
|
+
const entry = this._spans.get(runId);
|
|
1612
|
+
if (!entry) return;
|
|
1613
|
+
entry.span.recordException(error);
|
|
1614
|
+
entry.span.end();
|
|
1615
|
+
this._spans.delete(runId);
|
|
1616
|
+
}
|
|
1617
|
+
// ── Retriever lifecycle ───────────────────────────────────────────────────
|
|
1618
|
+
handleRetrieverStart(retriever, _query, runId, parentRunId) {
|
|
1619
|
+
const tracer = getTracer2();
|
|
1620
|
+
if (!tracer?.enabled) return;
|
|
1621
|
+
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
1622
|
+
const span = tracer.createSpan({
|
|
1623
|
+
name: retriever.name || "retriever",
|
|
1624
|
+
kind: "retrieval" /* RETRIEVAL */,
|
|
1625
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1626
|
+
traceId: parentEntry?.span.traceId,
|
|
1627
|
+
attributes: {
|
|
1628
|
+
"framework": "langchain",
|
|
1629
|
+
"langchain.run_id": runId
|
|
1630
|
+
}
|
|
1631
|
+
});
|
|
1632
|
+
this._spans.set(runId, { span, startTime: Date.now() });
|
|
1633
|
+
}
|
|
1634
|
+
handleRetrieverEnd(documents, runId) {
|
|
1635
|
+
const entry = this._spans.get(runId);
|
|
1636
|
+
if (!entry) return;
|
|
1637
|
+
entry.span.setAttribute(
|
|
1638
|
+
"retriever.document_count",
|
|
1639
|
+
documents?.length ?? 0
|
|
1640
|
+
);
|
|
1641
|
+
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
1642
|
+
entry.span.end();
|
|
1643
|
+
this._spans.delete(runId);
|
|
1644
|
+
}
|
|
1645
|
+
};
|
|
1646
|
+
|
|
1647
|
+
// src/frameworks/langgraph.ts
|
|
1648
|
+
function instrumentLangGraph(graph) {
|
|
1649
|
+
return new Proxy(graph, {
|
|
1650
|
+
get(target, prop, receiver) {
|
|
1651
|
+
const value = Reflect.get(target, prop, receiver);
|
|
1652
|
+
if ((prop === "invoke" || prop === "stream") && typeof value === "function") {
|
|
1653
|
+
return function patchedMethod(...args) {
|
|
1654
|
+
const tracer = getTracer2();
|
|
1655
|
+
if (!tracer?.enabled) return value.apply(this, args);
|
|
1656
|
+
return tracer.startSpan(
|
|
1657
|
+
{
|
|
1658
|
+
name: `langgraph.${String(prop)}`,
|
|
1659
|
+
kind: "agent" /* AGENT */,
|
|
1660
|
+
attributes: { framework: "langgraph" }
|
|
1661
|
+
},
|
|
1662
|
+
(_span) => {
|
|
1663
|
+
const config = args[1] ?? {};
|
|
1664
|
+
const callbacks = config.callbacks ?? [];
|
|
1665
|
+
callbacks.push(new RisicareCallbackHandler());
|
|
1666
|
+
args[1] = { ...config, callbacks };
|
|
1667
|
+
const result = value.apply(this, args);
|
|
1668
|
+
if (result && typeof result.then === "function") {
|
|
1669
|
+
return result.then((r) => r);
|
|
1670
|
+
}
|
|
1671
|
+
return result;
|
|
1672
|
+
}
|
|
1673
|
+
);
|
|
1674
|
+
};
|
|
1675
|
+
}
|
|
1676
|
+
return value;
|
|
1677
|
+
}
|
|
1678
|
+
});
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
// src/frameworks/instructor.ts
|
|
1682
|
+
function patchInstructor(client) {
|
|
1683
|
+
return new Proxy(client, {
|
|
1684
|
+
get(target, prop, receiver) {
|
|
1685
|
+
const value = Reflect.get(target, prop, receiver);
|
|
1686
|
+
if (prop === "create" && typeof value === "function") {
|
|
1687
|
+
return function patchedCreate(...args) {
|
|
1688
|
+
const tracer = getTracer2();
|
|
1689
|
+
if (!tracer?.enabled) {
|
|
1690
|
+
debug(
|
|
1691
|
+
"Tracer not initialized \u2014 call init() before using patchInstructor()"
|
|
1692
|
+
);
|
|
1693
|
+
return value.apply(this, args);
|
|
1694
|
+
}
|
|
1695
|
+
const params = args[0] ?? {};
|
|
1696
|
+
const responseModel = params.response_model ?? params.responseModel;
|
|
1697
|
+
let modelName = "unknown";
|
|
1698
|
+
if (responseModel && typeof responseModel === "function") {
|
|
1699
|
+
modelName = responseModel.name || "unknown";
|
|
1700
|
+
} else if (responseModel && typeof responseModel === "object") {
|
|
1701
|
+
modelName = responseModel.name ?? responseModel.description ?? "schema";
|
|
1702
|
+
} else if (typeof responseModel === "string") {
|
|
1703
|
+
modelName = responseModel;
|
|
1704
|
+
}
|
|
1705
|
+
return tracer.startSpan(
|
|
1706
|
+
{
|
|
1707
|
+
name: "instructor.create",
|
|
1708
|
+
kind: "llm_call" /* LLM_CALL */,
|
|
1709
|
+
attributes: {
|
|
1710
|
+
framework: "instructor",
|
|
1711
|
+
"framework.span_kind": "extraction",
|
|
1712
|
+
"instructor.response_model": modelName,
|
|
1713
|
+
...params.max_retries != null ? { "instructor.max_retries": params.max_retries } : {},
|
|
1714
|
+
...params.model != null ? { "gen_ai.request.model": params.model } : {}
|
|
1715
|
+
}
|
|
1716
|
+
},
|
|
1717
|
+
(_span) => {
|
|
1718
|
+
const result = value.apply(this, args);
|
|
1719
|
+
if (result && typeof result.then === "function") {
|
|
1720
|
+
return result.then((r) => r);
|
|
1721
|
+
}
|
|
1722
|
+
return result;
|
|
1723
|
+
}
|
|
1724
|
+
);
|
|
1725
|
+
};
|
|
1726
|
+
}
|
|
1727
|
+
return value;
|
|
1728
|
+
}
|
|
1729
|
+
});
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
// src/context/dedup.ts
|
|
1733
|
+
function suppressProviderInstrumentation(fn) {
|
|
1734
|
+
return runWithContext({ _suppressProviderInstrumentation: true }, fn);
|
|
1735
|
+
}
|
|
1736
|
+
function isProviderInstrumentationSuppressed() {
|
|
1737
|
+
return getContext()._suppressProviderInstrumentation === true;
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
// src/frameworks/llamaindex.ts
|
|
1741
|
+
var RisicareLlamaIndexHandler = class {
|
|
1742
|
+
_spans = /* @__PURE__ */ new Map();
|
|
1743
|
+
/**
|
|
1744
|
+
* Handle a LlamaIndex lifecycle event.
|
|
1745
|
+
*
|
|
1746
|
+
* Events follow the convention:
|
|
1747
|
+
* - `*.start` / `*.begin` -- component starts
|
|
1748
|
+
* - `*.end` / `*.complete` -- component finishes
|
|
1749
|
+
* - `*.error` -- component failed
|
|
1750
|
+
*/
|
|
1751
|
+
onEvent(event) {
|
|
1752
|
+
const tracer = getTracer2();
|
|
1753
|
+
if (!tracer?.enabled) return;
|
|
1754
|
+
if (event.type.endsWith(".start") || event.type.endsWith(".begin")) {
|
|
1755
|
+
this._handleStart(event);
|
|
1756
|
+
} else if (event.type.endsWith(".end") || event.type.endsWith(".complete")) {
|
|
1757
|
+
this._handleEnd(event);
|
|
1758
|
+
} else if (event.type.endsWith(".error")) {
|
|
1759
|
+
this._handleError(event);
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
/**
|
|
1763
|
+
* Run a function with provider instrumentation suppressed.
|
|
1764
|
+
*
|
|
1765
|
+
* LlamaIndex handler creates its own LLM spans, so provider spans
|
|
1766
|
+
* (patchOpenAI, patchAnthropic, etc.) should be suppressed to avoid
|
|
1767
|
+
* double-tracing.
|
|
1768
|
+
*/
|
|
1769
|
+
withSuppression(fn) {
|
|
1770
|
+
return suppressProviderInstrumentation(fn);
|
|
1771
|
+
}
|
|
1772
|
+
// ── Internal event handlers ───────────────────────────────────────────────
|
|
1773
|
+
_handleStart(event) {
|
|
1774
|
+
const tracer = getTracer2();
|
|
1775
|
+
if (!tracer?.enabled) return;
|
|
1776
|
+
const componentKind = this._classifyComponent(event.type);
|
|
1777
|
+
const parentEntry = event.parentId ? this._spans.get(event.parentId) : void 0;
|
|
1778
|
+
const spanKind = componentKind === "llm" ? "llm_call" /* LLM_CALL */ : componentKind === "retrieval" ? "retrieval" /* RETRIEVAL */ : componentKind === "embedding" ? "llm_call" /* LLM_CALL */ : "internal" /* INTERNAL */;
|
|
1779
|
+
const span = tracer.createSpan({
|
|
1780
|
+
name: event.type.replace(/\.(start|begin)$/, ""),
|
|
1781
|
+
kind: spanKind,
|
|
1782
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1783
|
+
traceId: parentEntry?.span.traceId,
|
|
1784
|
+
attributes: {
|
|
1785
|
+
framework: "llamaindex",
|
|
1786
|
+
"framework.span_kind": componentKind,
|
|
1787
|
+
...event.data?.model ? { "gen_ai.request.model": event.data.model } : {}
|
|
1788
|
+
}
|
|
1789
|
+
});
|
|
1790
|
+
this._spans.set(event.id, { span, startTime: Date.now(), componentKind });
|
|
1791
|
+
}
|
|
1792
|
+
_handleEnd(event) {
|
|
1793
|
+
const entry = this._spans.get(event.id);
|
|
1794
|
+
if (!entry) return;
|
|
1795
|
+
entry.span.setAttribute(
|
|
1796
|
+
"gen_ai.latency_ms",
|
|
1797
|
+
Date.now() - entry.startTime
|
|
1798
|
+
);
|
|
1799
|
+
const usage = event.data?.usage;
|
|
1800
|
+
if (usage) {
|
|
1801
|
+
entry.span.setLlmFields({
|
|
1802
|
+
promptTokens: usage.promptTokens ?? usage.prompt_tokens,
|
|
1803
|
+
completionTokens: usage.completionTokens ?? usage.completion_tokens
|
|
1804
|
+
});
|
|
1805
|
+
}
|
|
1806
|
+
if (event.data?.documentCount != null) {
|
|
1807
|
+
entry.span.setAttribute(
|
|
1808
|
+
"retriever.document_count",
|
|
1809
|
+
event.data.documentCount
|
|
1810
|
+
);
|
|
1811
|
+
}
|
|
1812
|
+
entry.span.end();
|
|
1813
|
+
this._spans.delete(event.id);
|
|
1814
|
+
}
|
|
1815
|
+
_handleError(event) {
|
|
1816
|
+
const entry = this._spans.get(event.id);
|
|
1817
|
+
if (!entry) return;
|
|
1818
|
+
const error = event.data?.error;
|
|
1819
|
+
entry.span.recordException(
|
|
1820
|
+
error instanceof Error ? error : String(error ?? "Unknown error")
|
|
1821
|
+
);
|
|
1822
|
+
entry.span.end();
|
|
1823
|
+
this._spans.delete(event.id);
|
|
1824
|
+
}
|
|
1825
|
+
/**
|
|
1826
|
+
* Classify a LlamaIndex event type into a component kind.
|
|
1827
|
+
*/
|
|
1828
|
+
_classifyComponent(eventType) {
|
|
1829
|
+
const lower = eventType.toLowerCase();
|
|
1830
|
+
if (lower.includes("llm") || lower.includes("chat")) return "llm";
|
|
1831
|
+
if (lower.includes("embed")) return "embedding";
|
|
1832
|
+
if (lower.includes("retriev") || lower.includes("vector")) return "retrieval";
|
|
1833
|
+
if (lower.includes("synth") || lower.includes("response")) return "synthesis";
|
|
1834
|
+
if (lower.includes("query")) return "query";
|
|
1835
|
+
return "component";
|
|
1836
|
+
}
|
|
1837
|
+
};
|
|
1386
1838
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1387
1839
|
0 && (module.exports = {
|
|
1388
1840
|
AgentRole,
|
|
1389
1841
|
MessageType,
|
|
1842
|
+
RisicareCallbackHandler,
|
|
1843
|
+
RisicareLlamaIndexHandler,
|
|
1390
1844
|
SemanticPhase,
|
|
1391
1845
|
SpanKind,
|
|
1392
1846
|
SpanStatus,
|
|
@@ -1411,10 +1865,16 @@ function maybeCleanup() {
|
|
|
1411
1865
|
getTracer,
|
|
1412
1866
|
init,
|
|
1413
1867
|
injectTraceContext,
|
|
1868
|
+
instrumentLangGraph,
|
|
1414
1869
|
isEnabled,
|
|
1870
|
+
isProviderInstrumentationSuppressed,
|
|
1871
|
+
patchInstructor,
|
|
1415
1872
|
registerSpan,
|
|
1873
|
+
reportError,
|
|
1874
|
+
score,
|
|
1416
1875
|
session,
|
|
1417
1876
|
shutdown,
|
|
1877
|
+
suppressProviderInstrumentation,
|
|
1418
1878
|
traceAct,
|
|
1419
1879
|
traceCoordinate,
|
|
1420
1880
|
traceDecide,
|
|
@@ -1422,6 +1882,7 @@ function maybeCleanup() {
|
|
|
1422
1882
|
traceMessage,
|
|
1423
1883
|
traceObserve,
|
|
1424
1884
|
traceThink,
|
|
1885
|
+
tracedStream,
|
|
1425
1886
|
unregisterSpan,
|
|
1426
1887
|
withAgent,
|
|
1427
1888
|
withPhase,
|