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.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["
|
|
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["
|
|
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["
|
|
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,
|