@grafana/sigil-sdk-js 0.0.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/LICENSE +3 -0
- package/README.md +367 -0
- package/dist/client.d.ts +102 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1502 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +190 -0
- package/dist/config.js.map +1 -0
- package/dist/content_capture.d.ts +35 -0
- package/dist/content_capture.d.ts.map +1 -0
- package/dist/content_capture.js +123 -0
- package/dist/content_capture.js.map +1 -0
- package/dist/context.d.ts +11 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +53 -0
- package/dist/context.js.map +1 -0
- package/dist/exporters/default.d.ts +3 -0
- package/dist/exporters/default.d.ts.map +1 -0
- package/dist/exporters/default.js +34 -0
- package/dist/exporters/default.js.map +1 -0
- package/dist/exporters/grpc.d.ts +14 -0
- package/dist/exporters/grpc.d.ts.map +1 -0
- package/dist/exporters/grpc.js +369 -0
- package/dist/exporters/grpc.js.map +1 -0
- package/dist/exporters/http.d.ts +8 -0
- package/dist/exporters/http.d.ts.map +1 -0
- package/dist/exporters/http.js +258 -0
- package/dist/exporters/http.js.map +1 -0
- package/dist/frameworks/google-adk/index.d.ts +136 -0
- package/dist/frameworks/google-adk/index.d.ts.map +1 -0
- package/dist/frameworks/google-adk/index.js +509 -0
- package/dist/frameworks/google-adk/index.js.map +1 -0
- package/dist/frameworks/langchain/index.d.ts +29 -0
- package/dist/frameworks/langchain/index.d.ts.map +1 -0
- package/dist/frameworks/langchain/index.js +70 -0
- package/dist/frameworks/langchain/index.js.map +1 -0
- package/dist/frameworks/langgraph/index.d.ts +29 -0
- package/dist/frameworks/langgraph/index.d.ts.map +1 -0
- package/dist/frameworks/langgraph/index.js +70 -0
- package/dist/frameworks/langgraph/index.js.map +1 -0
- package/dist/frameworks/llamaindex/index.d.ts +43 -0
- package/dist/frameworks/llamaindex/index.d.ts.map +1 -0
- package/dist/frameworks/llamaindex/index.js +493 -0
- package/dist/frameworks/llamaindex/index.js.map +1 -0
- package/dist/frameworks/openai-agents/index.d.ts +33 -0
- package/dist/frameworks/openai-agents/index.d.ts.map +1 -0
- package/dist/frameworks/openai-agents/index.js +531 -0
- package/dist/frameworks/openai-agents/index.js.map +1 -0
- package/dist/frameworks/shared.d.ts +57 -0
- package/dist/frameworks/shared.d.ts.map +1 -0
- package/dist/frameworks/shared.js +1032 -0
- package/dist/frameworks/shared.js.map +1 -0
- package/dist/frameworks/vercel-ai-sdk/hooks.d.ts +18 -0
- package/dist/frameworks/vercel-ai-sdk/hooks.d.ts.map +1 -0
- package/dist/frameworks/vercel-ai-sdk/hooks.js +672 -0
- package/dist/frameworks/vercel-ai-sdk/hooks.js.map +1 -0
- package/dist/frameworks/vercel-ai-sdk/index.d.ts +8 -0
- package/dist/frameworks/vercel-ai-sdk/index.d.ts.map +1 -0
- package/dist/frameworks/vercel-ai-sdk/index.js +7 -0
- package/dist/frameworks/vercel-ai-sdk/index.js.map +1 -0
- package/dist/frameworks/vercel-ai-sdk/mapping.d.ts +49 -0
- package/dist/frameworks/vercel-ai-sdk/mapping.d.ts.map +1 -0
- package/dist/frameworks/vercel-ai-sdk/mapping.js +660 -0
- package/dist/frameworks/vercel-ai-sdk/mapping.js.map +1 -0
- package/dist/frameworks/vercel-ai-sdk/types.d.ts +126 -0
- package/dist/frameworks/vercel-ai-sdk/types.d.ts.map +1 -0
- package/dist/frameworks/vercel-ai-sdk/types.js +2 -0
- package/dist/frameworks/vercel-ai-sdk/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +35 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +581 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +42 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +650 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/openai.d.ts +67 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +1007 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/types.d.ts +461 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +25 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +331 -0
- package/dist/utils.js.map +1 -0
- package/docs/frameworks/google-adk.md +84 -0
- package/docs/frameworks/langchain.md +102 -0
- package/docs/frameworks/langgraph.md +137 -0
- package/docs/frameworks/llamaindex.md +82 -0
- package/docs/frameworks/openai-agents.md +88 -0
- package/docs/frameworks/vercel-ai-sdk.md +124 -0
- package/docs/index.md +22 -0
- package/docs/providers/anthropic.md +69 -0
- package/docs/providers/gemini.md +86 -0
- package/docs/providers/openai.md +151 -0
- package/package.json +80 -0
- package/proto/opentelemetry/proto/collector/trace/v1/trace_service.proto +77 -0
- package/proto/opentelemetry/proto/common/v1/common.proto +115 -0
- package/proto/opentelemetry/proto/resource/v1/resource.proto +44 -0
- package/proto/opentelemetry/proto/trace/v1/trace.proto +357 -0
- package/proto/sigil/v1/generation_ingest.proto +145 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
const textEncoder = new TextEncoder();
|
|
2
|
+
export function encodedSizeBytes(value) {
|
|
3
|
+
return textEncoder.encode(JSON.stringify(value)).byteLength;
|
|
4
|
+
}
|
|
5
|
+
export function defaultOperationNameForMode(mode) {
|
|
6
|
+
return mode === 'STREAM' ? 'streamText' : 'generateText';
|
|
7
|
+
}
|
|
8
|
+
export function validateGeneration(generation) {
|
|
9
|
+
if (generation.id.trim().length === 0) {
|
|
10
|
+
return new Error('generation id is required');
|
|
11
|
+
}
|
|
12
|
+
if (generation.mode !== 'SYNC' && generation.mode !== 'STREAM') {
|
|
13
|
+
return new Error('generation.mode must be one of SYNC|STREAM');
|
|
14
|
+
}
|
|
15
|
+
if (generation.model.provider.trim().length === 0) {
|
|
16
|
+
return new Error('generation model provider is required');
|
|
17
|
+
}
|
|
18
|
+
if (generation.model.name.trim().length === 0) {
|
|
19
|
+
return new Error('generation model name is required');
|
|
20
|
+
}
|
|
21
|
+
for (let index = 0; index < (generation.input ?? []).length; index++) {
|
|
22
|
+
const error = validateMessage('generation.input', index, generation.input?.[index]);
|
|
23
|
+
if (error !== undefined) {
|
|
24
|
+
return error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
for (let index = 0; index < (generation.output ?? []).length; index++) {
|
|
28
|
+
const error = validateMessage('generation.output', index, generation.output?.[index]);
|
|
29
|
+
if (error !== undefined) {
|
|
30
|
+
return error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
for (let index = 0; index < (generation.tools ?? []).length; index++) {
|
|
34
|
+
const tool = generation.tools?.[index];
|
|
35
|
+
if (tool === undefined || tool.name.trim().length === 0) {
|
|
36
|
+
return new Error(`generation.tools[${index}].name is required`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
for (let index = 0; index < (generation.artifacts ?? []).length; index++) {
|
|
40
|
+
const error = validateArtifact(index, generation.artifacts?.[index]);
|
|
41
|
+
if (error !== undefined) {
|
|
42
|
+
return error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (generation.completedAt.getTime() < generation.startedAt.getTime()) {
|
|
46
|
+
return new Error('generation completedAt must not be earlier than startedAt');
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
export function validateToolExecution(toolExecution) {
|
|
51
|
+
if (toolExecution.toolName.trim().length === 0) {
|
|
52
|
+
return new Error('tool execution name is required');
|
|
53
|
+
}
|
|
54
|
+
if (toolExecution.completedAt.getTime() < toolExecution.startedAt.getTime()) {
|
|
55
|
+
return new Error('tool execution completedAt must not be earlier than startedAt');
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
export function validateEmbeddingStart(start) {
|
|
60
|
+
if (start.model.provider.trim().length === 0) {
|
|
61
|
+
return new Error('embedding.model.provider is required');
|
|
62
|
+
}
|
|
63
|
+
if (start.model.name.trim().length === 0) {
|
|
64
|
+
return new Error('embedding.model.name is required');
|
|
65
|
+
}
|
|
66
|
+
if (start.dimensions !== undefined && start.dimensions <= 0) {
|
|
67
|
+
return new Error('embedding.dimensions must be > 0');
|
|
68
|
+
}
|
|
69
|
+
if (start.encodingFormat !== undefined && start.encodingFormat.trim().length === 0) {
|
|
70
|
+
return new Error('embedding.encoding_format must not be blank');
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
export function validateEmbeddingResult(result) {
|
|
75
|
+
if (result.inputCount < 0) {
|
|
76
|
+
return new Error('embedding.input_count must be >= 0');
|
|
77
|
+
}
|
|
78
|
+
if (result.inputTokens !== undefined && result.inputTokens < 0) {
|
|
79
|
+
return new Error('embedding.input_tokens must be >= 0');
|
|
80
|
+
}
|
|
81
|
+
if (result.dimensions !== undefined && result.dimensions <= 0) {
|
|
82
|
+
return new Error('embedding.dimensions must be > 0');
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
export function asError(value) {
|
|
87
|
+
if (value instanceof Error) {
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
return new Error(String(value));
|
|
91
|
+
}
|
|
92
|
+
export function isRecord(value) {
|
|
93
|
+
return typeof value === 'object' && value !== null;
|
|
94
|
+
}
|
|
95
|
+
export function maybeUnref(timer) {
|
|
96
|
+
if (typeof timer === 'object' && timer !== null && 'unref' in timer) {
|
|
97
|
+
const maybeTimer = timer;
|
|
98
|
+
maybeTimer.unref?.();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function defaultSleep(durationMs) {
|
|
102
|
+
return new Promise((resolve) => {
|
|
103
|
+
setTimeout(resolve, durationMs);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
export function cloneGeneration(generation) {
|
|
107
|
+
return {
|
|
108
|
+
...generation,
|
|
109
|
+
model: cloneModelRef(generation.model),
|
|
110
|
+
input: generation.input?.map(cloneMessage),
|
|
111
|
+
output: generation.output?.map(cloneMessage),
|
|
112
|
+
tools: generation.tools?.map(cloneToolDefinition),
|
|
113
|
+
usage: generation.usage ? { ...generation.usage } : undefined,
|
|
114
|
+
startedAt: new Date(generation.startedAt),
|
|
115
|
+
completedAt: new Date(generation.completedAt),
|
|
116
|
+
tags: generation.tags ? { ...generation.tags } : undefined,
|
|
117
|
+
metadata: generation.metadata ? { ...generation.metadata } : undefined,
|
|
118
|
+
artifacts: generation.artifacts === null ? null : generation.artifacts?.map(cloneArtifact),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export function cloneGenerationResult(result) {
|
|
122
|
+
return {
|
|
123
|
+
...result,
|
|
124
|
+
input: result.input?.map(cloneMessage),
|
|
125
|
+
output: result.output?.map(cloneMessage),
|
|
126
|
+
tools: result.tools?.map(cloneToolDefinition),
|
|
127
|
+
usage: result.usage ? { ...result.usage } : undefined,
|
|
128
|
+
completedAt: result.completedAt ? new Date(result.completedAt) : undefined,
|
|
129
|
+
tags: result.tags ? { ...result.tags } : undefined,
|
|
130
|
+
metadata: result.metadata ? { ...result.metadata } : undefined,
|
|
131
|
+
artifacts: result.artifacts?.map(cloneArtifact),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export function cloneGenerationStart(start) {
|
|
135
|
+
return {
|
|
136
|
+
...start,
|
|
137
|
+
model: cloneModelRef(start.model),
|
|
138
|
+
tools: start.tools?.map(cloneToolDefinition),
|
|
139
|
+
tags: start.tags ? { ...start.tags } : undefined,
|
|
140
|
+
metadata: start.metadata ? { ...start.metadata } : undefined,
|
|
141
|
+
startedAt: start.startedAt ? new Date(start.startedAt) : undefined,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export function cloneEmbeddingStart(start) {
|
|
145
|
+
return {
|
|
146
|
+
...start,
|
|
147
|
+
model: cloneModelRef(start.model),
|
|
148
|
+
tags: start.tags ? { ...start.tags } : undefined,
|
|
149
|
+
metadata: start.metadata ? { ...start.metadata } : undefined,
|
|
150
|
+
startedAt: start.startedAt ? new Date(start.startedAt) : undefined,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export function cloneEmbeddingResult(result) {
|
|
154
|
+
return {
|
|
155
|
+
...result,
|
|
156
|
+
inputTexts: result.inputTexts ? [...result.inputTexts] : undefined,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
export function cloneToolExecution(toolExecution) {
|
|
160
|
+
return {
|
|
161
|
+
...toolExecution,
|
|
162
|
+
startedAt: new Date(toolExecution.startedAt),
|
|
163
|
+
completedAt: new Date(toolExecution.completedAt),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function cloneToolExecutionStart(start) {
|
|
167
|
+
return {
|
|
168
|
+
...start,
|
|
169
|
+
startedAt: start.startedAt ? new Date(start.startedAt) : undefined,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
export function cloneToolExecutionResult(result) {
|
|
173
|
+
return {
|
|
174
|
+
...result,
|
|
175
|
+
completedAt: result.completedAt ? new Date(result.completedAt) : undefined,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export function cloneModelRef(model) {
|
|
179
|
+
return { ...model };
|
|
180
|
+
}
|
|
181
|
+
export function cloneMessage(message) {
|
|
182
|
+
return {
|
|
183
|
+
...message,
|
|
184
|
+
parts: message.parts?.map(cloneMessagePart),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
export function cloneToolDefinition(tool) {
|
|
188
|
+
return { ...tool };
|
|
189
|
+
}
|
|
190
|
+
export function cloneArtifact(artifact) {
|
|
191
|
+
return { ...artifact };
|
|
192
|
+
}
|
|
193
|
+
export function newLocalID(prefix) {
|
|
194
|
+
const now = Date.now().toString(36);
|
|
195
|
+
const rand = Math.random().toString(36).slice(2, 10);
|
|
196
|
+
return `${prefix}-${now}-${rand}`;
|
|
197
|
+
}
|
|
198
|
+
function cloneMessagePart(part) {
|
|
199
|
+
switch (part.type) {
|
|
200
|
+
case 'text':
|
|
201
|
+
return {
|
|
202
|
+
type: 'text',
|
|
203
|
+
text: part.text,
|
|
204
|
+
metadata: part.metadata ? { ...part.metadata } : undefined,
|
|
205
|
+
};
|
|
206
|
+
case 'thinking':
|
|
207
|
+
return {
|
|
208
|
+
type: 'thinking',
|
|
209
|
+
thinking: part.thinking,
|
|
210
|
+
metadata: part.metadata ? { ...part.metadata } : undefined,
|
|
211
|
+
};
|
|
212
|
+
case 'tool_call':
|
|
213
|
+
return {
|
|
214
|
+
type: 'tool_call',
|
|
215
|
+
toolCall: { ...part.toolCall },
|
|
216
|
+
metadata: part.metadata ? { ...part.metadata } : undefined,
|
|
217
|
+
};
|
|
218
|
+
case 'tool_result':
|
|
219
|
+
return {
|
|
220
|
+
type: 'tool_result',
|
|
221
|
+
toolResult: { ...part.toolResult },
|
|
222
|
+
metadata: part.metadata ? { ...part.metadata } : undefined,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function validateMessage(path, index, message) {
|
|
227
|
+
if (message === undefined) {
|
|
228
|
+
return new Error(`${path}[${index}] is required`);
|
|
229
|
+
}
|
|
230
|
+
const role = normalizeRole(message.role);
|
|
231
|
+
if (role !== 'user' && role !== 'assistant' && role !== 'tool') {
|
|
232
|
+
return new Error(`${path}[${index}].role must be one of user|assistant|tool`);
|
|
233
|
+
}
|
|
234
|
+
const hasContent = typeof message.content === 'string' && message.content.trim().length > 0;
|
|
235
|
+
const parts = message.parts ?? [];
|
|
236
|
+
if (parts.length === 0 && !hasContent) {
|
|
237
|
+
return new Error(`${path}[${index}].parts must not be empty`);
|
|
238
|
+
}
|
|
239
|
+
for (let partIndex = 0; partIndex < parts.length; partIndex++) {
|
|
240
|
+
const part = parts[partIndex];
|
|
241
|
+
if (part === undefined) {
|
|
242
|
+
return new Error(`${path}[${index}].parts[${partIndex}] is required`);
|
|
243
|
+
}
|
|
244
|
+
const error = validatePart(path, index, partIndex, role, part);
|
|
245
|
+
if (error !== undefined) {
|
|
246
|
+
return error;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
function validatePart(path, messageIndex, partIndex, role, part) {
|
|
252
|
+
const payloadFieldCount = payloadFieldsCount(part);
|
|
253
|
+
if (payloadFieldCount !== 1) {
|
|
254
|
+
return new Error(`${path}[${messageIndex}].parts[${partIndex}] must set exactly one payload field`);
|
|
255
|
+
}
|
|
256
|
+
switch (part.type) {
|
|
257
|
+
case 'text':
|
|
258
|
+
if (part.text.trim().length === 0) {
|
|
259
|
+
return new Error(`${path}[${messageIndex}].parts[${partIndex}].text is required`);
|
|
260
|
+
}
|
|
261
|
+
return undefined;
|
|
262
|
+
case 'thinking':
|
|
263
|
+
if (role !== 'assistant') {
|
|
264
|
+
return new Error(`${path}[${messageIndex}].parts[${partIndex}].thinking only allowed for assistant role`);
|
|
265
|
+
}
|
|
266
|
+
if (part.thinking.trim().length === 0) {
|
|
267
|
+
return new Error(`${path}[${messageIndex}].parts[${partIndex}].thinking is required`);
|
|
268
|
+
}
|
|
269
|
+
return undefined;
|
|
270
|
+
case 'tool_call':
|
|
271
|
+
if (role !== 'assistant') {
|
|
272
|
+
return new Error(`${path}[${messageIndex}].parts[${partIndex}].tool_call only allowed for assistant role`);
|
|
273
|
+
}
|
|
274
|
+
if (part.toolCall.name.trim().length === 0) {
|
|
275
|
+
return new Error(`${path}[${messageIndex}].parts[${partIndex}].tool_call.name is required`);
|
|
276
|
+
}
|
|
277
|
+
return undefined;
|
|
278
|
+
case 'tool_result':
|
|
279
|
+
if (role !== 'tool') {
|
|
280
|
+
return new Error(`${path}[${messageIndex}].parts[${partIndex}].tool_result only allowed for tool role`);
|
|
281
|
+
}
|
|
282
|
+
return undefined;
|
|
283
|
+
default:
|
|
284
|
+
return new Error(`${path}[${messageIndex}].parts[${partIndex}].kind is invalid`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function payloadFieldsCount(part) {
|
|
288
|
+
let count = 0;
|
|
289
|
+
if ('text' in part && typeof part.text === 'string' && part.text.trim().length > 0) {
|
|
290
|
+
count++;
|
|
291
|
+
}
|
|
292
|
+
if ('thinking' in part && typeof part.thinking === 'string' && part.thinking.trim().length > 0) {
|
|
293
|
+
count++;
|
|
294
|
+
}
|
|
295
|
+
if ('toolCall' in part && isRecord(part.toolCall)) {
|
|
296
|
+
count++;
|
|
297
|
+
}
|
|
298
|
+
if ('toolResult' in part && isRecord(part.toolResult)) {
|
|
299
|
+
count++;
|
|
300
|
+
}
|
|
301
|
+
return count;
|
|
302
|
+
}
|
|
303
|
+
function validateArtifact(index, artifact) {
|
|
304
|
+
if (artifact === undefined) {
|
|
305
|
+
return new Error(`generation.artifacts[${index}] is required`);
|
|
306
|
+
}
|
|
307
|
+
const kind = artifact.type.trim().toLowerCase();
|
|
308
|
+
switch (kind) {
|
|
309
|
+
case 'request':
|
|
310
|
+
case 'response':
|
|
311
|
+
case 'tools':
|
|
312
|
+
case 'provider_event':
|
|
313
|
+
break;
|
|
314
|
+
default:
|
|
315
|
+
return new Error(`generation.artifacts[${index}].kind is invalid`);
|
|
316
|
+
}
|
|
317
|
+
const payload = artifact.payload?.trim() ?? '';
|
|
318
|
+
const recordID = artifact.recordId?.trim() ?? '';
|
|
319
|
+
if (payload.length === 0 && recordID.length === 0) {
|
|
320
|
+
return new Error(`generation.artifacts[${index}] must provide payload or record_id`);
|
|
321
|
+
}
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
function normalizeRole(role) {
|
|
325
|
+
const normalized = role.trim().toLowerCase();
|
|
326
|
+
if (normalized === 'user' || normalized === 'assistant' || normalized === 'tool') {
|
|
327
|
+
return normalized;
|
|
328
|
+
}
|
|
329
|
+
return '';
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Google ADK Handler (`@grafana/sigil-sdk-js/google-adk`)
|
|
2
|
+
|
|
3
|
+
Use `SigilGoogleAdkHandler` to map Google ADK session/invocation callbacks to Sigil generations.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @grafana/sigil-sdk-js @google/adk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quickstart
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { SigilClient } from '@grafana/sigil-sdk-js';
|
|
15
|
+
import { withSigilGoogleAdkPlugins } from '@grafana/sigil-sdk-js/google-adk';
|
|
16
|
+
|
|
17
|
+
const client = new SigilClient();
|
|
18
|
+
const runnerConfig = withSigilGoogleAdkPlugins(undefined, client, {
|
|
19
|
+
providerResolver: 'auto',
|
|
20
|
+
agentName: 'adk-app',
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Or create the plugin explicitly:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { createSigilGoogleAdkPlugin } from '@grafana/sigil-sdk-js/google-adk';
|
|
28
|
+
|
|
29
|
+
const sigilPlugin = createSigilGoogleAdkPlugin(client, { providerResolver: 'auto' });
|
|
30
|
+
const runnerConfig = { plugins: [sigilPlugin] };
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`withSigilGoogleAdkPlugins(...)` appends Sigil instrumentation to ADK plugin config while preserving existing plugins.
|
|
34
|
+
The appended plugin implements the ADK callback surface (`beforeRunCallback`, `onEventCallback`, `afterRunCallback`, model/tool lifecycle callbacks).
|
|
35
|
+
|
|
36
|
+
## Streaming snippet
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { SigilClient } from '@grafana/sigil-sdk-js';
|
|
40
|
+
import { SigilGoogleAdkHandler } from '@grafana/sigil-sdk-js/google-adk';
|
|
41
|
+
|
|
42
|
+
const client = new SigilClient();
|
|
43
|
+
const handler = new SigilGoogleAdkHandler(client, { providerResolver: 'auto' });
|
|
44
|
+
|
|
45
|
+
await handler.handleLLMStart(
|
|
46
|
+
{ kwargs: { model: 'gemini-2.5-pro' } },
|
|
47
|
+
['stream adk step'],
|
|
48
|
+
'run-1',
|
|
49
|
+
undefined,
|
|
50
|
+
{ invocation_params: { model: 'gemini-2.5-pro', stream: true, session_id: 'adk-session-42' } }
|
|
51
|
+
);
|
|
52
|
+
await handler.handleLLMNewToken('step ', undefined, 'run-1');
|
|
53
|
+
await handler.handleLLMNewToken('done', undefined, 'run-1');
|
|
54
|
+
await handler.handleLLMEnd({ llm_output: { model_name: 'gemini-2.5-pro' } }, 'run-1');
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Conversation mapping
|
|
58
|
+
|
|
59
|
+
Primary mapping is ADK conversation/session identity:
|
|
60
|
+
|
|
61
|
+
1. `conversation_id` / `session_id` / `group_id`
|
|
62
|
+
2. `thread_id`
|
|
63
|
+
3. fallback: `sigil:framework:google-adk:<run_id>`
|
|
64
|
+
|
|
65
|
+
## Metadata and lineage
|
|
66
|
+
|
|
67
|
+
- Required: `sigil.framework.run_type`
|
|
68
|
+
- Optional lineage: `sigil.framework.run_id`, `sigil.framework.parent_run_id`, `sigil.framework.thread_id`, `sigil.framework.event_id`, `sigil.framework.component_name`
|
|
69
|
+
|
|
70
|
+
Tags:
|
|
71
|
+
|
|
72
|
+
- `sigil.framework.name=google-adk`
|
|
73
|
+
- `sigil.framework.source=handler`
|
|
74
|
+
- `sigil.framework.language=javascript`
|
|
75
|
+
|
|
76
|
+
## Provider resolver
|
|
77
|
+
|
|
78
|
+
Uses explicit provider first, then payload, then model-prefix inference.
|
|
79
|
+
|
|
80
|
+
## Troubleshooting
|
|
81
|
+
|
|
82
|
+
- Reused ADK sessions should pass stable `session_id` for correct grouping.
|
|
83
|
+
- Use `provider` option when model names are custom aliases.
|
|
84
|
+
- Call `await client.shutdown()` to guarantee export flush.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# LangChain Handler (`@grafana/sigil-sdk-js/langchain`)
|
|
2
|
+
|
|
3
|
+
Use `SigilLangChainHandler` to map LangChain callback lifecycle events to Sigil generation records.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @grafana/sigil-sdk-js @langchain/core @langchain/openai
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { SigilClient } from '@grafana/sigil-sdk-js';
|
|
15
|
+
import { withSigilLangChainCallbacks } from '@grafana/sigil-sdk-js/langchain';
|
|
16
|
+
|
|
17
|
+
const client = new SigilClient();
|
|
18
|
+
const config = withSigilLangChainCallbacks(undefined, client, {
|
|
19
|
+
providerResolver: 'auto',
|
|
20
|
+
agentName: 'langchain-app',
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## End-to-end example (invoke + stream)
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
28
|
+
import { SigilClient } from '@grafana/sigil-sdk-js';
|
|
29
|
+
import {
|
|
30
|
+
SigilLangChainHandler,
|
|
31
|
+
withSigilLangChainCallbacks,
|
|
32
|
+
} from '@grafana/sigil-sdk-js/langchain';
|
|
33
|
+
|
|
34
|
+
const client = new SigilClient();
|
|
35
|
+
const handler = new SigilLangChainHandler(client, {
|
|
36
|
+
providerResolver: 'auto',
|
|
37
|
+
agentName: 'langchain-example',
|
|
38
|
+
agentVersion: '1.0.0',
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const llm = new ChatOpenAI({ model: 'gpt-4o-mini', temperature: 0 });
|
|
42
|
+
|
|
43
|
+
// Non-stream call -> SYNC generation mode.
|
|
44
|
+
const result = await llm.invoke(
|
|
45
|
+
'Summarize why retry budgets matter.',
|
|
46
|
+
withSigilLangChainCallbacks(undefined, client, { providerResolver: 'auto' })
|
|
47
|
+
);
|
|
48
|
+
console.log(result.content);
|
|
49
|
+
|
|
50
|
+
// Stream call -> STREAM generation mode + TTFT tracking.
|
|
51
|
+
const stream = await llm.stream(
|
|
52
|
+
'Give me three short reliability tips.',
|
|
53
|
+
withSigilLangChainCallbacks(undefined, client, { providerResolver: 'auto' })
|
|
54
|
+
);
|
|
55
|
+
for await (const chunk of stream) {
|
|
56
|
+
if (chunk.content) process.stdout.write(String(chunk.content));
|
|
57
|
+
}
|
|
58
|
+
process.stdout.write('\n');
|
|
59
|
+
|
|
60
|
+
// Advanced usage: instantiate and pass a handler manually.
|
|
61
|
+
const handler = new SigilLangChainHandler(client, { providerResolver: 'auto' });
|
|
62
|
+
await llm.invoke('manual handler wiring', { callbacks: [handler] });
|
|
63
|
+
|
|
64
|
+
await client.shutdown();
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Contract
|
|
68
|
+
|
|
69
|
+
- `handleLLMStart` / `handleChatModelStart` starts recorder lifecycle.
|
|
70
|
+
- `handleLLMNewToken` sets first-token timestamp and accumulates streamed output.
|
|
71
|
+
- `handleLLMEnd` maps output + usage and ends recorder.
|
|
72
|
+
- `handleLLMError` sets call error and ends recorder.
|
|
73
|
+
- `handleToolStart` / `handleToolEnd` / `handleToolError` maps into `startToolExecution(...)`.
|
|
74
|
+
- `handleChainStart` / `handleChainEnd` / `handleChainError` emits framework chain spans.
|
|
75
|
+
- `handleRetrieverStart` / `handleRetrieverEnd` / `handleRetrieverError` emits framework retriever spans.
|
|
76
|
+
|
|
77
|
+
Framework tags and metadata are always injected:
|
|
78
|
+
|
|
79
|
+
- `sigil.framework.name=langchain`
|
|
80
|
+
- `sigil.framework.source=handler`
|
|
81
|
+
- `sigil.framework.language=javascript`
|
|
82
|
+
- `metadata["sigil.framework.run_id"]=<framework run id>`
|
|
83
|
+
- `metadata["sigil.framework.thread_id"]=<thread id>` (when present in callback metadata/config)
|
|
84
|
+
- `metadata["sigil.framework.parent_run_id"]=<parent run id>` (when available)
|
|
85
|
+
- `metadata["sigil.framework.component_name"]=<serialized component name>`
|
|
86
|
+
- `metadata["sigil.framework.run_type"]=<llm|chat|tool|chain|retriever>`
|
|
87
|
+
- `metadata["sigil.framework.tags"]=<normalized callback tags>`
|
|
88
|
+
- `metadata["sigil.framework.retry_attempt"]=<attempt>` (when available)
|
|
89
|
+
- `metadata["sigil.framework.event_id"]=<event id>` (when available)
|
|
90
|
+
- generation span attributes mirror low-cardinality framework metadata keys
|
|
91
|
+
|
|
92
|
+
Conversation mapping is conversation-first:
|
|
93
|
+
|
|
94
|
+
- `conversation_id` / `session_id` / `group_id` first
|
|
95
|
+
- then `thread_id`
|
|
96
|
+
- deterministic fallback `sigil:framework:langchain:<run_id>`
|
|
97
|
+
|
|
98
|
+
Provider resolver behavior:
|
|
99
|
+
|
|
100
|
+
- explicit provider metadata when available
|
|
101
|
+
- model prefix inference (`gpt-`/`o1`/`o3`/`o4` -> `openai`, `claude-` -> `anthropic`, `gemini-` -> `gemini`)
|
|
102
|
+
- fallback `custom`
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# LangGraph Handler (`@grafana/sigil-sdk-js/langgraph`)
|
|
2
|
+
|
|
3
|
+
Use `SigilLangGraphHandler` to map LangGraph callback lifecycle events to Sigil generation records.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @grafana/sigil-sdk-js @langchain/core @langchain/langgraph @langchain/openai
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { SigilClient } from '@grafana/sigil-sdk-js';
|
|
15
|
+
import { withSigilLangGraphCallbacks } from '@grafana/sigil-sdk-js/langgraph';
|
|
16
|
+
|
|
17
|
+
const client = new SigilClient();
|
|
18
|
+
const config = withSigilLangGraphCallbacks(undefined, client, { providerResolver: 'auto' });
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## End-to-end example (graph invoke + stream)
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
25
|
+
import { END, START, StateGraph, Annotation } from '@langchain/langgraph';
|
|
26
|
+
import { SigilClient } from '@grafana/sigil-sdk-js';
|
|
27
|
+
import {
|
|
28
|
+
SigilLangGraphHandler,
|
|
29
|
+
withSigilLangGraphCallbacks,
|
|
30
|
+
} from '@grafana/sigil-sdk-js/langgraph';
|
|
31
|
+
|
|
32
|
+
const GraphState = Annotation.Root({
|
|
33
|
+
prompt: Annotation<string>(),
|
|
34
|
+
answer: Annotation<string>(),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const client = new SigilClient();
|
|
38
|
+
const handler = new SigilLangGraphHandler(client, {
|
|
39
|
+
providerResolver: 'auto',
|
|
40
|
+
agentName: 'langgraph-example',
|
|
41
|
+
agentVersion: '1.0.0',
|
|
42
|
+
});
|
|
43
|
+
const llm = new ChatOpenAI({ model: 'gpt-4o-mini', temperature: 0 });
|
|
44
|
+
|
|
45
|
+
const graph = new StateGraph(GraphState)
|
|
46
|
+
.addNode('model', async (state) => {
|
|
47
|
+
const response = await llm.invoke(
|
|
48
|
+
state.prompt,
|
|
49
|
+
withSigilLangGraphCallbacks(undefined, client, { providerResolver: 'auto' })
|
|
50
|
+
);
|
|
51
|
+
return { answer: String(response.content) };
|
|
52
|
+
})
|
|
53
|
+
.addEdge(START, 'model')
|
|
54
|
+
.addEdge('model', END)
|
|
55
|
+
.compile();
|
|
56
|
+
|
|
57
|
+
// Non-stream graph invocation.
|
|
58
|
+
const out = await graph.invoke({ prompt: 'Explain SLO burn rate in one paragraph.', answer: '' });
|
|
59
|
+
console.log(out.answer);
|
|
60
|
+
|
|
61
|
+
// Streamed graph updates.
|
|
62
|
+
for await (const _event of graph.stream({ prompt: 'List three practical alerting tips.', answer: '' })) {
|
|
63
|
+
// Consume events to drive streamed model execution.
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Advanced usage: instantiate and pass a handler manually.
|
|
67
|
+
const handler = new SigilLangGraphHandler(client, { providerResolver: 'auto' });
|
|
68
|
+
await llm.invoke('manual handler wiring', { callbacks: [handler] });
|
|
69
|
+
|
|
70
|
+
await client.shutdown();
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Persistent thread example (LangGraph checkpointer)
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import { MemorySaver } from '@langchain/langgraph';
|
|
77
|
+
|
|
78
|
+
const checkpointer = new MemorySaver();
|
|
79
|
+
const persistedGraph = new StateGraph(GraphState)
|
|
80
|
+
.addNode('model', async (state) => {
|
|
81
|
+
const response = await llm.invoke(state.prompt, { callbacks: [handler] });
|
|
82
|
+
return { answer: String(response.content) };
|
|
83
|
+
})
|
|
84
|
+
.addEdge(START, 'model')
|
|
85
|
+
.addEdge('model', END)
|
|
86
|
+
.compile({ checkpointer });
|
|
87
|
+
const threadConfig = {
|
|
88
|
+
...withSigilLangGraphCallbacks(undefined, client, { providerResolver: 'auto' }),
|
|
89
|
+
configurable: { thread_id: 'customer-42' },
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
await persistedGraph.invoke({ prompt: 'Remember that my timezone is UTC+1.', answer: '' }, threadConfig);
|
|
93
|
+
await persistedGraph.invoke({ prompt: 'What timezone did I just give you?', answer: '' }, threadConfig);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
When `thread_id` is present, the handler records:
|
|
97
|
+
|
|
98
|
+
- `conversationId=<thread_id>`
|
|
99
|
+
- `metadata["sigil.framework.run_id"]=<run id>`
|
|
100
|
+
- `metadata["sigil.framework.thread_id"]=<thread id>`
|
|
101
|
+
- generation span attributes `sigil.framework.run_id` and `sigil.framework.thread_id`
|
|
102
|
+
|
|
103
|
+
When `conversation_id` / `session_id` / `group_id` is present, that value is used as primary `conversationId`.
|
|
104
|
+
|
|
105
|
+
## Contract
|
|
106
|
+
|
|
107
|
+
- `handleLLMStart` / `handleChatModelStart` starts recorder lifecycle.
|
|
108
|
+
- `handleLLMNewToken` sets first-token timestamp and accumulates streamed output.
|
|
109
|
+
- `handleLLMEnd` maps output + usage and ends recorder.
|
|
110
|
+
- `handleLLMError` sets call error and ends recorder.
|
|
111
|
+
- `handleToolStart` / `handleToolEnd` / `handleToolError` maps into `startToolExecution(...)`.
|
|
112
|
+
- `handleChainStart` / `handleChainEnd` / `handleChainError` emits framework chain spans.
|
|
113
|
+
- `handleRetrieverStart` / `handleRetrieverEnd` / `handleRetrieverError` emits framework retriever spans.
|
|
114
|
+
|
|
115
|
+
Framework tags and metadata are always injected:
|
|
116
|
+
|
|
117
|
+
- `sigil.framework.name=langgraph`
|
|
118
|
+
- `sigil.framework.source=handler`
|
|
119
|
+
- `sigil.framework.language=javascript`
|
|
120
|
+
- `metadata["sigil.framework.run_id"]=<framework run id>`
|
|
121
|
+
- `metadata["sigil.framework.thread_id"]=<thread id>` (when present in callback metadata/config)
|
|
122
|
+
- `metadata["sigil.framework.parent_run_id"]=<parent run id>` (when available)
|
|
123
|
+
- `metadata["sigil.framework.component_name"]=<serialized component name>`
|
|
124
|
+
- `metadata["sigil.framework.run_type"]=<llm|chat|tool|chain|retriever>`
|
|
125
|
+
- `metadata["sigil.framework.tags"]=<normalized callback tags>`
|
|
126
|
+
- `metadata["sigil.framework.retry_attempt"]=<attempt>` (when available)
|
|
127
|
+
- `metadata["sigil.framework.event_id"]=<event id>` (when available)
|
|
128
|
+
- `metadata["sigil.framework.langgraph.node"]=<node id>` (when callback context exposes it)
|
|
129
|
+
- generation span attributes mirror low-cardinality framework metadata keys
|
|
130
|
+
|
|
131
|
+
Fallback conversation mapping uses `sigil:framework:langgraph:<run_id>` when no framework session key is available.
|
|
132
|
+
|
|
133
|
+
Provider resolver behavior:
|
|
134
|
+
|
|
135
|
+
- explicit provider metadata when available
|
|
136
|
+
- model prefix inference (`gpt-`/`o1`/`o3`/`o4` -> `openai`, `claude-` -> `anthropic`, `gemini-` -> `gemini`)
|
|
137
|
+
- fallback `custom`
|