risicare 0.1.5 → 0.2.1
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 +425 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +124 -14
- package/dist/index.d.ts +124 -14
- package/dist/index.js +418 -14
- 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/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
|
|
|
@@ -1159,28 +1179,36 @@ function withPhase(phase, fn) {
|
|
|
1159
1179
|
}
|
|
1160
1180
|
|
|
1161
1181
|
// src/decorators/phase.ts
|
|
1162
|
-
function phaseWrapper(phase, kind, fn) {
|
|
1182
|
+
function phaseWrapper(phase, kind, name, fn) {
|
|
1163
1183
|
return (...args) => {
|
|
1164
1184
|
const tracer = getTracer2();
|
|
1165
1185
|
if (!tracer) {
|
|
1166
1186
|
return fn(...args);
|
|
1167
1187
|
}
|
|
1168
1188
|
return withPhase(phase, () => {
|
|
1169
|
-
return tracer.startSpan({ name
|
|
1189
|
+
return tracer.startSpan({ name, kind }, () => fn(...args));
|
|
1170
1190
|
});
|
|
1171
1191
|
};
|
|
1172
1192
|
}
|
|
1173
|
-
function traceThink(
|
|
1174
|
-
|
|
1193
|
+
function traceThink(fnOrName, maybeFn) {
|
|
1194
|
+
const name = typeof fnOrName === "string" ? fnOrName : `phase:think`;
|
|
1195
|
+
const fn = typeof fnOrName === "function" ? fnOrName : maybeFn;
|
|
1196
|
+
return phaseWrapper("think" /* THINK */, "think" /* THINK */, name, fn);
|
|
1175
1197
|
}
|
|
1176
|
-
function traceDecide(
|
|
1177
|
-
|
|
1198
|
+
function traceDecide(fnOrName, maybeFn) {
|
|
1199
|
+
const name = typeof fnOrName === "string" ? fnOrName : `phase:decide`;
|
|
1200
|
+
const fn = typeof fnOrName === "function" ? fnOrName : maybeFn;
|
|
1201
|
+
return phaseWrapper("decide" /* DECIDE */, "decide" /* DECIDE */, name, fn);
|
|
1178
1202
|
}
|
|
1179
|
-
function traceAct(
|
|
1180
|
-
|
|
1203
|
+
function traceAct(fnOrName, maybeFn) {
|
|
1204
|
+
const name = typeof fnOrName === "string" ? fnOrName : `phase:act`;
|
|
1205
|
+
const fn = typeof fnOrName === "function" ? fnOrName : maybeFn;
|
|
1206
|
+
return phaseWrapper("act" /* ACT */, "tool_call" /* TOOL_CALL */, name, fn);
|
|
1181
1207
|
}
|
|
1182
|
-
function traceObserve(
|
|
1183
|
-
|
|
1208
|
+
function traceObserve(fnOrName, maybeFn) {
|
|
1209
|
+
const name = typeof fnOrName === "string" ? fnOrName : `phase:observe`;
|
|
1210
|
+
const fn = typeof fnOrName === "function" ? fnOrName : maybeFn;
|
|
1211
|
+
return phaseWrapper("observe" /* OBSERVE */, "observe" /* OBSERVE */, name, fn);
|
|
1184
1212
|
}
|
|
1185
1213
|
|
|
1186
1214
|
// src/decorators/multi-agent.ts
|
|
@@ -1361,9 +1389,380 @@ function maybeCleanup() {
|
|
|
1361
1389
|
}
|
|
1362
1390
|
}
|
|
1363
1391
|
}
|
|
1392
|
+
|
|
1393
|
+
// src/streaming.ts
|
|
1394
|
+
async function* tracedStream(source, options) {
|
|
1395
|
+
const opts = typeof options === "string" ? { name: options } : options;
|
|
1396
|
+
const tracer = getTracer2();
|
|
1397
|
+
if (!tracer || !tracer.enabled) {
|
|
1398
|
+
yield* source;
|
|
1399
|
+
return;
|
|
1400
|
+
}
|
|
1401
|
+
const span = tracer.createSpan({
|
|
1402
|
+
name: opts.name,
|
|
1403
|
+
kind: opts.kind ?? "internal" /* INTERNAL */,
|
|
1404
|
+
attributes: opts.attributes
|
|
1405
|
+
});
|
|
1406
|
+
let chunkCount = 0;
|
|
1407
|
+
try {
|
|
1408
|
+
for await (const chunk of source) {
|
|
1409
|
+
chunkCount++;
|
|
1410
|
+
yield chunk;
|
|
1411
|
+
}
|
|
1412
|
+
span.setAttribute("stream.chunk_count", chunkCount);
|
|
1413
|
+
span.setAttribute("stream.completed", true);
|
|
1414
|
+
} catch (error) {
|
|
1415
|
+
span.setAttribute("stream.chunk_count", chunkCount);
|
|
1416
|
+
span.setAttribute("stream.completed", false);
|
|
1417
|
+
span.recordException(error instanceof Error ? error : String(error));
|
|
1418
|
+
throw error;
|
|
1419
|
+
} finally {
|
|
1420
|
+
span.end();
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
// src/frameworks/langchain.ts
|
|
1425
|
+
var RisicareCallbackHandler = class {
|
|
1426
|
+
name = "RisicareCallbackHandler";
|
|
1427
|
+
_spans = /* @__PURE__ */ new Map();
|
|
1428
|
+
// ── Chain lifecycle ────────────────────────────────────────────────────────
|
|
1429
|
+
handleChainStart(chain, _inputs, runId, parentRunId) {
|
|
1430
|
+
const tracer = getTracer2();
|
|
1431
|
+
if (!tracer?.enabled) return;
|
|
1432
|
+
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
1433
|
+
const span = tracer.createSpan({
|
|
1434
|
+
name: chain.name || chain._type || "chain",
|
|
1435
|
+
kind: "internal" /* INTERNAL */,
|
|
1436
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1437
|
+
traceId: parentEntry?.span.traceId,
|
|
1438
|
+
attributes: {
|
|
1439
|
+
"framework": "langchain",
|
|
1440
|
+
"langchain.run_id": runId,
|
|
1441
|
+
...parentRunId ? { "langchain.parent_run_id": parentRunId } : {},
|
|
1442
|
+
...chain._type ? { "langchain.chain_type": chain._type } : {}
|
|
1443
|
+
}
|
|
1444
|
+
});
|
|
1445
|
+
this._spans.set(runId, { span, startTime: Date.now() });
|
|
1446
|
+
}
|
|
1447
|
+
handleChainEnd(_outputs, runId) {
|
|
1448
|
+
const entry = this._spans.get(runId);
|
|
1449
|
+
if (!entry) return;
|
|
1450
|
+
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
1451
|
+
entry.span.end();
|
|
1452
|
+
this._spans.delete(runId);
|
|
1453
|
+
}
|
|
1454
|
+
handleChainError(error, runId) {
|
|
1455
|
+
const entry = this._spans.get(runId);
|
|
1456
|
+
if (!entry) return;
|
|
1457
|
+
entry.span.recordException(error);
|
|
1458
|
+
entry.span.end();
|
|
1459
|
+
this._spans.delete(runId);
|
|
1460
|
+
}
|
|
1461
|
+
// ── LLM lifecycle ─────────────────────────────────────────────────────────
|
|
1462
|
+
handleLLMStart(llm, _prompts, runId, parentRunId) {
|
|
1463
|
+
const tracer = getTracer2();
|
|
1464
|
+
if (!tracer?.enabled) return;
|
|
1465
|
+
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
1466
|
+
const span = tracer.createSpan({
|
|
1467
|
+
name: llm.name || llm._type || "llm",
|
|
1468
|
+
kind: "llm_call" /* LLM_CALL */,
|
|
1469
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1470
|
+
traceId: parentEntry?.span.traceId,
|
|
1471
|
+
attributes: {
|
|
1472
|
+
"framework": "langchain",
|
|
1473
|
+
"langchain.run_id": runId,
|
|
1474
|
+
"gen_ai.system": "langchain",
|
|
1475
|
+
"gen_ai.prompt.count": _prompts.length
|
|
1476
|
+
}
|
|
1477
|
+
});
|
|
1478
|
+
this._spans.set(runId, { span, startTime: Date.now() });
|
|
1479
|
+
}
|
|
1480
|
+
handleLLMEnd(output, runId) {
|
|
1481
|
+
const entry = this._spans.get(runId);
|
|
1482
|
+
if (!entry) return;
|
|
1483
|
+
const usage = output.llmOutput?.tokenUsage;
|
|
1484
|
+
if (usage) {
|
|
1485
|
+
entry.span.setLlmFields({
|
|
1486
|
+
promptTokens: usage.promptTokens ?? usage.prompt_tokens,
|
|
1487
|
+
completionTokens: usage.completionTokens ?? usage.completion_tokens,
|
|
1488
|
+
totalTokens: usage.totalTokens ?? usage.total_tokens
|
|
1489
|
+
});
|
|
1490
|
+
}
|
|
1491
|
+
const model = output.llmOutput?.model ?? output.llmOutput?.modelName;
|
|
1492
|
+
if (model) {
|
|
1493
|
+
entry.span.setLlmFields({ model });
|
|
1494
|
+
}
|
|
1495
|
+
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
1496
|
+
entry.span.end();
|
|
1497
|
+
this._spans.delete(runId);
|
|
1498
|
+
}
|
|
1499
|
+
handleLLMError(error, runId) {
|
|
1500
|
+
const entry = this._spans.get(runId);
|
|
1501
|
+
if (!entry) return;
|
|
1502
|
+
entry.span.recordException(error);
|
|
1503
|
+
entry.span.end();
|
|
1504
|
+
this._spans.delete(runId);
|
|
1505
|
+
}
|
|
1506
|
+
// ── Tool lifecycle ────────────────────────────────────────────────────────
|
|
1507
|
+
handleToolStart(tool, input, runId, parentRunId) {
|
|
1508
|
+
const tracer = getTracer2();
|
|
1509
|
+
if (!tracer?.enabled) return;
|
|
1510
|
+
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
1511
|
+
const span = tracer.createSpan({
|
|
1512
|
+
name: tool.name || "tool",
|
|
1513
|
+
kind: "tool_call" /* TOOL_CALL */,
|
|
1514
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1515
|
+
traceId: parentEntry?.span.traceId,
|
|
1516
|
+
attributes: {
|
|
1517
|
+
"framework": "langchain",
|
|
1518
|
+
"langchain.run_id": runId,
|
|
1519
|
+
"tool.name": tool.name || "unknown",
|
|
1520
|
+
"tool.input_length": input?.length ?? 0
|
|
1521
|
+
}
|
|
1522
|
+
});
|
|
1523
|
+
this._spans.set(runId, { span, startTime: Date.now() });
|
|
1524
|
+
}
|
|
1525
|
+
handleToolEnd(output, runId) {
|
|
1526
|
+
const entry = this._spans.get(runId);
|
|
1527
|
+
if (!entry) return;
|
|
1528
|
+
entry.span.setAttribute("tool.output_length", output?.length ?? 0);
|
|
1529
|
+
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
1530
|
+
entry.span.end();
|
|
1531
|
+
this._spans.delete(runId);
|
|
1532
|
+
}
|
|
1533
|
+
handleToolError(error, runId) {
|
|
1534
|
+
const entry = this._spans.get(runId);
|
|
1535
|
+
if (!entry) return;
|
|
1536
|
+
entry.span.recordException(error);
|
|
1537
|
+
entry.span.end();
|
|
1538
|
+
this._spans.delete(runId);
|
|
1539
|
+
}
|
|
1540
|
+
// ── Retriever lifecycle ───────────────────────────────────────────────────
|
|
1541
|
+
handleRetrieverStart(retriever, _query, runId, parentRunId) {
|
|
1542
|
+
const tracer = getTracer2();
|
|
1543
|
+
if (!tracer?.enabled) return;
|
|
1544
|
+
const parentEntry = parentRunId ? this._spans.get(parentRunId) : void 0;
|
|
1545
|
+
const span = tracer.createSpan({
|
|
1546
|
+
name: retriever.name || "retriever",
|
|
1547
|
+
kind: "retrieval" /* RETRIEVAL */,
|
|
1548
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1549
|
+
traceId: parentEntry?.span.traceId,
|
|
1550
|
+
attributes: {
|
|
1551
|
+
"framework": "langchain",
|
|
1552
|
+
"langchain.run_id": runId
|
|
1553
|
+
}
|
|
1554
|
+
});
|
|
1555
|
+
this._spans.set(runId, { span, startTime: Date.now() });
|
|
1556
|
+
}
|
|
1557
|
+
handleRetrieverEnd(documents, runId) {
|
|
1558
|
+
const entry = this._spans.get(runId);
|
|
1559
|
+
if (!entry) return;
|
|
1560
|
+
entry.span.setAttribute(
|
|
1561
|
+
"retriever.document_count",
|
|
1562
|
+
documents?.length ?? 0
|
|
1563
|
+
);
|
|
1564
|
+
entry.span.setAttribute("gen_ai.latency_ms", Date.now() - entry.startTime);
|
|
1565
|
+
entry.span.end();
|
|
1566
|
+
this._spans.delete(runId);
|
|
1567
|
+
}
|
|
1568
|
+
};
|
|
1569
|
+
|
|
1570
|
+
// src/frameworks/langgraph.ts
|
|
1571
|
+
function instrumentLangGraph(graph) {
|
|
1572
|
+
return new Proxy(graph, {
|
|
1573
|
+
get(target, prop, receiver) {
|
|
1574
|
+
const value = Reflect.get(target, prop, receiver);
|
|
1575
|
+
if ((prop === "invoke" || prop === "stream") && typeof value === "function") {
|
|
1576
|
+
return function patchedMethod(...args) {
|
|
1577
|
+
const tracer = getTracer2();
|
|
1578
|
+
if (!tracer?.enabled) return value.apply(this, args);
|
|
1579
|
+
return tracer.startSpan(
|
|
1580
|
+
{
|
|
1581
|
+
name: `langgraph.${String(prop)}`,
|
|
1582
|
+
kind: "agent" /* AGENT */,
|
|
1583
|
+
attributes: { framework: "langgraph" }
|
|
1584
|
+
},
|
|
1585
|
+
(_span) => {
|
|
1586
|
+
const config = args[1] ?? {};
|
|
1587
|
+
const callbacks = config.callbacks ?? [];
|
|
1588
|
+
callbacks.push(new RisicareCallbackHandler());
|
|
1589
|
+
args[1] = { ...config, callbacks };
|
|
1590
|
+
const result = value.apply(this, args);
|
|
1591
|
+
if (result && typeof result.then === "function") {
|
|
1592
|
+
return result.then((r) => r);
|
|
1593
|
+
}
|
|
1594
|
+
return result;
|
|
1595
|
+
}
|
|
1596
|
+
);
|
|
1597
|
+
};
|
|
1598
|
+
}
|
|
1599
|
+
return value;
|
|
1600
|
+
}
|
|
1601
|
+
});
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
// src/frameworks/instructor.ts
|
|
1605
|
+
function patchInstructor(client) {
|
|
1606
|
+
return new Proxy(client, {
|
|
1607
|
+
get(target, prop, receiver) {
|
|
1608
|
+
const value = Reflect.get(target, prop, receiver);
|
|
1609
|
+
if (prop === "create" && typeof value === "function") {
|
|
1610
|
+
return function patchedCreate(...args) {
|
|
1611
|
+
const tracer = getTracer2();
|
|
1612
|
+
if (!tracer?.enabled) {
|
|
1613
|
+
debug(
|
|
1614
|
+
"Tracer not initialized \u2014 call init() before using patchInstructor()"
|
|
1615
|
+
);
|
|
1616
|
+
return value.apply(this, args);
|
|
1617
|
+
}
|
|
1618
|
+
const params = args[0] ?? {};
|
|
1619
|
+
const responseModel = params.response_model ?? params.responseModel;
|
|
1620
|
+
let modelName = "unknown";
|
|
1621
|
+
if (responseModel && typeof responseModel === "function") {
|
|
1622
|
+
modelName = responseModel.name || "unknown";
|
|
1623
|
+
} else if (responseModel && typeof responseModel === "object") {
|
|
1624
|
+
modelName = responseModel.name ?? responseModel.description ?? "schema";
|
|
1625
|
+
} else if (typeof responseModel === "string") {
|
|
1626
|
+
modelName = responseModel;
|
|
1627
|
+
}
|
|
1628
|
+
return tracer.startSpan(
|
|
1629
|
+
{
|
|
1630
|
+
name: "instructor.create",
|
|
1631
|
+
kind: "llm_call" /* LLM_CALL */,
|
|
1632
|
+
attributes: {
|
|
1633
|
+
framework: "instructor",
|
|
1634
|
+
"framework.span_kind": "extraction",
|
|
1635
|
+
"instructor.response_model": modelName,
|
|
1636
|
+
...params.max_retries != null ? { "instructor.max_retries": params.max_retries } : {},
|
|
1637
|
+
...params.model != null ? { "gen_ai.request.model": params.model } : {}
|
|
1638
|
+
}
|
|
1639
|
+
},
|
|
1640
|
+
(_span) => {
|
|
1641
|
+
const result = value.apply(this, args);
|
|
1642
|
+
if (result && typeof result.then === "function") {
|
|
1643
|
+
return result.then((r) => r);
|
|
1644
|
+
}
|
|
1645
|
+
return result;
|
|
1646
|
+
}
|
|
1647
|
+
);
|
|
1648
|
+
};
|
|
1649
|
+
}
|
|
1650
|
+
return value;
|
|
1651
|
+
}
|
|
1652
|
+
});
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1655
|
+
// src/context/dedup.ts
|
|
1656
|
+
function suppressProviderInstrumentation(fn) {
|
|
1657
|
+
return runWithContext({ _suppressProviderInstrumentation: true }, fn);
|
|
1658
|
+
}
|
|
1659
|
+
function isProviderInstrumentationSuppressed() {
|
|
1660
|
+
return getContext()._suppressProviderInstrumentation === true;
|
|
1661
|
+
}
|
|
1662
|
+
|
|
1663
|
+
// src/frameworks/llamaindex.ts
|
|
1664
|
+
var RisicareLlamaIndexHandler = class {
|
|
1665
|
+
_spans = /* @__PURE__ */ new Map();
|
|
1666
|
+
/**
|
|
1667
|
+
* Handle a LlamaIndex lifecycle event.
|
|
1668
|
+
*
|
|
1669
|
+
* Events follow the convention:
|
|
1670
|
+
* - `*.start` / `*.begin` -- component starts
|
|
1671
|
+
* - `*.end` / `*.complete` -- component finishes
|
|
1672
|
+
* - `*.error` -- component failed
|
|
1673
|
+
*/
|
|
1674
|
+
onEvent(event) {
|
|
1675
|
+
const tracer = getTracer2();
|
|
1676
|
+
if (!tracer?.enabled) return;
|
|
1677
|
+
if (event.type.endsWith(".start") || event.type.endsWith(".begin")) {
|
|
1678
|
+
this._handleStart(event);
|
|
1679
|
+
} else if (event.type.endsWith(".end") || event.type.endsWith(".complete")) {
|
|
1680
|
+
this._handleEnd(event);
|
|
1681
|
+
} else if (event.type.endsWith(".error")) {
|
|
1682
|
+
this._handleError(event);
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
/**
|
|
1686
|
+
* Run a function with provider instrumentation suppressed.
|
|
1687
|
+
*
|
|
1688
|
+
* LlamaIndex handler creates its own LLM spans, so provider spans
|
|
1689
|
+
* (patchOpenAI, patchAnthropic, etc.) should be suppressed to avoid
|
|
1690
|
+
* double-tracing.
|
|
1691
|
+
*/
|
|
1692
|
+
withSuppression(fn) {
|
|
1693
|
+
return suppressProviderInstrumentation(fn);
|
|
1694
|
+
}
|
|
1695
|
+
// ── Internal event handlers ───────────────────────────────────────────────
|
|
1696
|
+
_handleStart(event) {
|
|
1697
|
+
const tracer = getTracer2();
|
|
1698
|
+
if (!tracer?.enabled) return;
|
|
1699
|
+
const componentKind = this._classifyComponent(event.type);
|
|
1700
|
+
const parentEntry = event.parentId ? this._spans.get(event.parentId) : void 0;
|
|
1701
|
+
const spanKind = componentKind === "llm" ? "llm_call" /* LLM_CALL */ : componentKind === "retrieval" ? "retrieval" /* RETRIEVAL */ : componentKind === "embedding" ? "llm_call" /* LLM_CALL */ : "internal" /* INTERNAL */;
|
|
1702
|
+
const span = tracer.createSpan({
|
|
1703
|
+
name: event.type.replace(/\.(start|begin)$/, ""),
|
|
1704
|
+
kind: spanKind,
|
|
1705
|
+
parentSpanId: parentEntry?.span.spanId,
|
|
1706
|
+
traceId: parentEntry?.span.traceId,
|
|
1707
|
+
attributes: {
|
|
1708
|
+
framework: "llamaindex",
|
|
1709
|
+
"framework.span_kind": componentKind,
|
|
1710
|
+
...event.data?.model ? { "gen_ai.request.model": event.data.model } : {}
|
|
1711
|
+
}
|
|
1712
|
+
});
|
|
1713
|
+
this._spans.set(event.id, { span, startTime: Date.now(), componentKind });
|
|
1714
|
+
}
|
|
1715
|
+
_handleEnd(event) {
|
|
1716
|
+
const entry = this._spans.get(event.id);
|
|
1717
|
+
if (!entry) return;
|
|
1718
|
+
entry.span.setAttribute(
|
|
1719
|
+
"gen_ai.latency_ms",
|
|
1720
|
+
Date.now() - entry.startTime
|
|
1721
|
+
);
|
|
1722
|
+
const usage = event.data?.usage;
|
|
1723
|
+
if (usage) {
|
|
1724
|
+
entry.span.setLlmFields({
|
|
1725
|
+
promptTokens: usage.promptTokens ?? usage.prompt_tokens,
|
|
1726
|
+
completionTokens: usage.completionTokens ?? usage.completion_tokens
|
|
1727
|
+
});
|
|
1728
|
+
}
|
|
1729
|
+
if (event.data?.documentCount != null) {
|
|
1730
|
+
entry.span.setAttribute(
|
|
1731
|
+
"retriever.document_count",
|
|
1732
|
+
event.data.documentCount
|
|
1733
|
+
);
|
|
1734
|
+
}
|
|
1735
|
+
entry.span.end();
|
|
1736
|
+
this._spans.delete(event.id);
|
|
1737
|
+
}
|
|
1738
|
+
_handleError(event) {
|
|
1739
|
+
const entry = this._spans.get(event.id);
|
|
1740
|
+
if (!entry) return;
|
|
1741
|
+
const error = event.data?.error;
|
|
1742
|
+
entry.span.recordException(
|
|
1743
|
+
error instanceof Error ? error : String(error ?? "Unknown error")
|
|
1744
|
+
);
|
|
1745
|
+
entry.span.end();
|
|
1746
|
+
this._spans.delete(event.id);
|
|
1747
|
+
}
|
|
1748
|
+
/**
|
|
1749
|
+
* Classify a LlamaIndex event type into a component kind.
|
|
1750
|
+
*/
|
|
1751
|
+
_classifyComponent(eventType) {
|
|
1752
|
+
const lower = eventType.toLowerCase();
|
|
1753
|
+
if (lower.includes("llm") || lower.includes("chat")) return "llm";
|
|
1754
|
+
if (lower.includes("embed")) return "embedding";
|
|
1755
|
+
if (lower.includes("retriev") || lower.includes("vector")) return "retrieval";
|
|
1756
|
+
if (lower.includes("synth") || lower.includes("response")) return "synthesis";
|
|
1757
|
+
if (lower.includes("query")) return "query";
|
|
1758
|
+
return "component";
|
|
1759
|
+
}
|
|
1760
|
+
};
|
|
1364
1761
|
export {
|
|
1365
1762
|
AgentRole,
|
|
1366
1763
|
MessageType,
|
|
1764
|
+
RisicareCallbackHandler,
|
|
1765
|
+
RisicareLlamaIndexHandler,
|
|
1367
1766
|
SemanticPhase,
|
|
1368
1767
|
SpanKind,
|
|
1369
1768
|
SpanStatus,
|
|
@@ -1388,12 +1787,16 @@ export {
|
|
|
1388
1787
|
getTracer2 as getTracer,
|
|
1389
1788
|
init,
|
|
1390
1789
|
injectTraceContext,
|
|
1790
|
+
instrumentLangGraph,
|
|
1391
1791
|
isEnabled,
|
|
1792
|
+
isProviderInstrumentationSuppressed,
|
|
1793
|
+
patchInstructor,
|
|
1392
1794
|
registerSpan,
|
|
1393
1795
|
reportError,
|
|
1394
1796
|
score,
|
|
1395
1797
|
session,
|
|
1396
1798
|
shutdown,
|
|
1799
|
+
suppressProviderInstrumentation,
|
|
1397
1800
|
traceAct,
|
|
1398
1801
|
traceCoordinate,
|
|
1399
1802
|
traceDecide,
|
|
@@ -1401,6 +1804,7 @@ export {
|
|
|
1401
1804
|
traceMessage,
|
|
1402
1805
|
traceObserve,
|
|
1403
1806
|
traceThink,
|
|
1807
|
+
tracedStream,
|
|
1404
1808
|
unregisterSpan,
|
|
1405
1809
|
withAgent,
|
|
1406
1810
|
withPhase,
|