@grafana/sigil-sdk-js 0.5.0 → 0.7.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/README.md +114 -3
- package/dist/cache-diagnostics.d.ts +15 -0
- package/dist/cache-diagnostics.d.ts.map +1 -0
- package/dist/cache-diagnostics.js +15 -0
- package/dist/cache-diagnostics.js.map +1 -0
- package/dist/client.d.ts +5 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +172 -53
- package/dist/client.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/content_capture.d.ts +3 -4
- package/dist/content_capture.d.ts.map +1 -1
- package/dist/content_capture.js +7 -9
- package/dist/content_capture.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -2
- package/dist/context.js.map +1 -1
- package/dist/core.d.ts +14 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +13 -0
- package/dist/core.js.map +1 -0
- package/dist/exporters/grpc.d.ts +1 -0
- package/dist/exporters/grpc.d.ts.map +1 -1
- package/dist/exporters/grpc.js +28 -2
- package/dist/exporters/grpc.js.map +1 -1
- package/dist/exporters/http.d.ts.map +1 -1
- package/dist/exporters/http.js +22 -2
- package/dist/exporters/http.js.map +1 -1
- package/dist/frameworks/vercel-ai-sdk/hooks.d.ts.map +1 -1
- package/dist/frameworks/vercel-ai-sdk/hooks.js +70 -39
- package/dist/frameworks/vercel-ai-sdk/hooks.js.map +1 -1
- package/dist/frameworks/vercel-ai-sdk/index.d.ts +1 -1
- package/dist/frameworks/vercel-ai-sdk/index.d.ts.map +1 -1
- package/dist/frameworks/vercel-ai-sdk/index.js +1 -1
- package/dist/frameworks/vercel-ai-sdk/index.js.map +1 -1
- package/dist/frameworks/vercel-ai-sdk/mapping.d.ts +9 -1
- package/dist/frameworks/vercel-ai-sdk/mapping.d.ts.map +1 -1
- package/dist/frameworks/vercel-ai-sdk/mapping.js +56 -0
- package/dist/frameworks/vercel-ai-sdk/mapping.js.map +1 -1
- package/dist/frameworks/vercel-ai-sdk/types.d.ts +6 -0
- package/dist/frameworks/vercel-ai-sdk/types.d.ts.map +1 -1
- package/dist/hooks.js +4 -1
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +1 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -10
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +13 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +13 -2
- package/dist/utils.js.map +1 -1
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +14 -0
- package/dist/version.js.map +1 -0
- package/docs/frameworks/vercel-ai-sdk.md +43 -0
- package/package.json +9 -9
- package/proto/sigil/v1/generation_ingest.proto +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,12 @@ Sigil records normalized LLM generation and tool-execution telemetry using your
|
|
|
8
8
|
pnpm add @grafana/sigil-sdk-js
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
For low-dependency runtimes that only need the core `SigilClient` and generation export APIs, use the slim core package:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add @grafana/sigil-sdk-js-core
|
|
15
|
+
```
|
|
16
|
+
|
|
11
17
|
For a Grafana Cloud setup walkthrough (where to find the endpoint URL, instance ID, and API token), refer to the [Grafana Cloud setup guide](https://grafana.com/docs/grafana-cloud/machine-learning/ai-observability/get-started/grafana-cloud/).
|
|
12
18
|
|
|
13
19
|
## Validation
|
|
@@ -58,6 +64,72 @@ await client.startGeneration(
|
|
|
58
64
|
await client.shutdown();
|
|
59
65
|
```
|
|
60
66
|
|
|
67
|
+
## Content Capture
|
|
68
|
+
|
|
69
|
+
`contentCapture` controls what content the SDK includes in exported generation payloads and OTel span attributes. See [Content Capture Modes](../docs/concepts/content-capture-modes.md) for the canonical mode matrix and defaults; the snippets below show how to wire it up in TypeScript.
|
|
70
|
+
|
|
71
|
+
Client-level default:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
import { SigilClient } from "@grafana/sigil-sdk-js";
|
|
75
|
+
|
|
76
|
+
const client = new SigilClient({
|
|
77
|
+
contentCapture: "metadata_only",
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The core SDK client treats `"default"` as `"no_tool_content"`: generation content is captured but tool-execution arguments and results stay out of spans.
|
|
82
|
+
|
|
83
|
+
Per-generation override:
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
await client.startGeneration(
|
|
87
|
+
{
|
|
88
|
+
model: { provider: "openai", name: "gpt-5" },
|
|
89
|
+
contentCapture: "full",
|
|
90
|
+
},
|
|
91
|
+
async (recorder) => {
|
|
92
|
+
recorder.setResult({ output: [{ role: "assistant", content: "hi" }] });
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Per-tool-execution override (here `"full"` opts into capturing tool arguments and results in the span):
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
await client.startToolExecution(
|
|
101
|
+
{ toolName: "search", contentCapture: "full" },
|
|
102
|
+
async (recorder) => {
|
|
103
|
+
recorder.setResult({ arguments: { q: "weather" }, result: { tempC: 18 } });
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Dynamic resolution via `contentCaptureResolver`:
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
const client = new SigilClient({
|
|
112
|
+
contentCaptureResolver: (metadata) => {
|
|
113
|
+
if (metadata?.["sigil.tenant"] === "healthcare") {
|
|
114
|
+
return "metadata_only";
|
|
115
|
+
}
|
|
116
|
+
return "default"; // defer to `contentCapture`
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The resolver receives the recording's metadata (or `undefined` for recording types that have no metadata, like tool executions). Thrown errors are caught and treated as `"metadata_only"` (fail-closed).
|
|
122
|
+
|
|
123
|
+
Resolution precedence (highest to lowest):
|
|
124
|
+
|
|
125
|
+
1. Per-recording `contentCapture` on `GenerationStart` / `ToolExecutionStart`
|
|
126
|
+
2. `contentCaptureResolver` return value
|
|
127
|
+
3. Client-level `contentCapture` (defaults to `"no_tool_content"`)
|
|
128
|
+
|
|
129
|
+
Unlike the Go, Python, Java, and .NET SDKs, the JS SDK does not propagate the resolved capture mode through async context, so tool executions started inside a generation block do not automatically inherit the generation's mode. Set `contentCapture` on each `ToolExecutionStart` when you need a tool to follow a non-default policy.
|
|
130
|
+
|
|
131
|
+
User-provided `metadata` and `tags` are not stripped by any capture mode. SDK-internal metadata keys that carry content (e.g. `call_error`, `sigil.conversation.title`) are stripped along with the matching content.
|
|
132
|
+
|
|
61
133
|
## Pre-Ingest Redaction
|
|
62
134
|
|
|
63
135
|
Use `generationSanitizer` when you want to redact substrings from normalized generations before
|
|
@@ -94,6 +166,45 @@ const client = new SigilClient({
|
|
|
94
166
|
});
|
|
95
167
|
```
|
|
96
168
|
|
|
169
|
+
## Hooks and Guards
|
|
170
|
+
|
|
171
|
+
Use hooks when you want Sigil guard rules to run before an LLM call. The SDK evaluates the hook on your request path; guard rules configured in Grafana Cloud decide whether to allow, deny, or transform the input.
|
|
172
|
+
|
|
173
|
+
Hooks are disabled by default. Enable them on the client and call `evaluateHook(...)` before the provider request:
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
import { HookDeniedError, SigilClient } from "@grafana/sigil-sdk-js";
|
|
177
|
+
|
|
178
|
+
const client = new SigilClient({
|
|
179
|
+
hooks: { enabled: true, phases: ["preflight"], timeoutMs: 15_000, failOpen: true },
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
let messages = [{ role: "user" as const, content: "Summarize this customer note..." }];
|
|
183
|
+
const response = await client.evaluateHook({
|
|
184
|
+
phase: "preflight",
|
|
185
|
+
context: {
|
|
186
|
+
agentName: "support-agent",
|
|
187
|
+
agentVersion: "1.0.0",
|
|
188
|
+
model: { provider: "openai", name: "gpt-5" },
|
|
189
|
+
},
|
|
190
|
+
input: {
|
|
191
|
+
messages,
|
|
192
|
+
systemPrompt: "You are a helpful support agent.",
|
|
193
|
+
conversationPreview: "Summarize this customer note...",
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
if (response.action === "deny") {
|
|
198
|
+
throw new HookDeniedError(response.reason ?? "", response.ruleId, response.evaluations);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
messages = response.transformedInput?.messages ?? messages;
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
With `failOpen: true`, hook transport errors resolve to allow so an unavailable evaluator does not block production traffic. Set `failOpen: false` for strict paths that should fail closed.
|
|
205
|
+
|
|
206
|
+
If you use transformed input, pass the transformed messages/system prompt to the provider and record those same values in `startGeneration(...)`. If you use the Vercel AI SDK adapter, see `docs/frameworks/vercel-ai-sdk.md` for automatic preflight hook wiring.
|
|
207
|
+
|
|
97
208
|
Configure OTEL exporters (traces/metrics) in your application OTEL SDK setup. You can optionally pass `tracer` and `meter` directly to `SigilClient`.
|
|
98
209
|
|
|
99
210
|
Quick OTEL setup pattern before creating the Sigil client:
|
|
@@ -368,12 +479,12 @@ auth: {
|
|
|
368
479
|
},
|
|
369
480
|
```
|
|
370
481
|
|
|
371
|
-
##
|
|
482
|
+
## Wiring custom env vars
|
|
372
483
|
|
|
373
|
-
The SDK
|
|
484
|
+
The SDK only auto-loads `SIGIL_*` env vars (`SIGIL_ENDPOINT`, `SIGIL_PROTOCOL`, `SIGIL_AUTH_MODE`, `SIGIL_AUTH_TOKEN`, etc.) when you call `new SigilClient()`. For any other env var (for example one your secret manager exposes under a different name), read it in your app and pass the value into the config:
|
|
374
485
|
|
|
375
486
|
```ts
|
|
376
|
-
const generationBearerToken = (process.env.
|
|
487
|
+
const generationBearerToken = (process.env.MY_APP_SIGIL_TOKEN ?? "").trim();
|
|
377
488
|
|
|
378
489
|
const client = new SigilClient({
|
|
379
490
|
generationExport: {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GenerationRecorder } from './types.js';
|
|
2
|
+
/** Reserved generation metadata keys (Sigil docs/guides/cache-diagnostics.md). */
|
|
3
|
+
export declare const CACHE_DIAGNOSTICS_MISS_REASON_KEY = "sigil.cache_diagnostics.miss_reason";
|
|
4
|
+
export declare const CACHE_DIAGNOSTICS_MISSED_INPUT_TOKENS_KEY = "sigil.cache_diagnostics.missed_input_tokens";
|
|
5
|
+
export declare const CACHE_DIAGNOSTICS_PREVIOUS_MESSAGE_ID_KEY = "sigil.cache_diagnostics.previous_message_id";
|
|
6
|
+
export type CacheDiagnosticsOptions = {
|
|
7
|
+
missedInputTokens?: number;
|
|
8
|
+
previousMessageId?: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Stamp `sigil.cache_diagnostics.*` metadata on a generation recorder.
|
|
12
|
+
* Call before `end()`, typically after the provider response is available.
|
|
13
|
+
*/
|
|
14
|
+
export declare function setCacheDiagnostics(rec: GenerationRecorder | null | undefined, missReason: string, opts?: CacheDiagnosticsOptions): void;
|
|
15
|
+
//# sourceMappingURL=cache-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-diagnostics.d.ts","sourceRoot":"","sources":["../src/cache-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,kFAAkF;AAClF,eAAO,MAAM,iCAAiC,wCAAwC,CAAC;AACvF,eAAO,MAAM,yCAAyC,gDAAgD,CAAC;AACvG,eAAO,MAAM,yCAAyC,gDAAgD,CAAC;AAEvG,MAAM,MAAM,uBAAuB,GAAG;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAKN"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Reserved generation metadata keys (Sigil docs/guides/cache-diagnostics.md). */
|
|
2
|
+
export const CACHE_DIAGNOSTICS_MISS_REASON_KEY = 'sigil.cache_diagnostics.miss_reason';
|
|
3
|
+
export const CACHE_DIAGNOSTICS_MISSED_INPUT_TOKENS_KEY = 'sigil.cache_diagnostics.missed_input_tokens';
|
|
4
|
+
export const CACHE_DIAGNOSTICS_PREVIOUS_MESSAGE_ID_KEY = 'sigil.cache_diagnostics.previous_message_id';
|
|
5
|
+
/**
|
|
6
|
+
* Stamp `sigil.cache_diagnostics.*` metadata on a generation recorder.
|
|
7
|
+
* Call before `end()`, typically after the provider response is available.
|
|
8
|
+
*/
|
|
9
|
+
export function setCacheDiagnostics(rec, missReason, opts) {
|
|
10
|
+
if (rec === null || rec === undefined) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
rec.setCacheDiagnostics(missReason, opts);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=cache-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-diagnostics.js","sourceRoot":"","sources":["../src/cache-diagnostics.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,CAAC,MAAM,iCAAiC,GAAG,qCAAqC,CAAC;AACvF,MAAM,CAAC,MAAM,yCAAyC,GAAG,6CAA6C,CAAC;AACvG,MAAM,CAAC,MAAM,yCAAyC,GAAG,6CAA6C,CAAC;AAOvG;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAA0C,EAC1C,UAAkB,EAClB,IAA8B;IAE9B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IACD,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -108,18 +108,19 @@ export declare class SigilClient {
|
|
|
108
108
|
internalEnqueueGeneration(generation: Generation): void;
|
|
109
109
|
internalLogWarn(message: string, error?: unknown): void;
|
|
110
110
|
internalResolveGenerationContentCaptureMode(seed: GenerationStart): ContentCaptureMode;
|
|
111
|
-
|
|
111
|
+
internalResolveEmbeddingContentCaptureMode(seed: EmbeddingStart): ContentCaptureMode;
|
|
112
|
+
internalResolveToolContentCaptureMode(seed: ToolExecutionStart): ContentCaptureMode;
|
|
112
113
|
internalHasGenerationSanitizer(): boolean;
|
|
113
114
|
internalSanitizeGeneration(generation: Generation): Generation;
|
|
114
|
-
internalStartGenerationSpan(seed: GenerationStart, mode: GenerationMode, startedAt: Date): Span;
|
|
115
|
+
internalStartGenerationSpan(seed: GenerationStart, mode: GenerationMode, startedAt: Date, contentCaptureMode: ContentCaptureMode): Span;
|
|
115
116
|
internalStartEmbeddingSpan(seed: EmbeddingStart, startedAt: Date): Span;
|
|
116
117
|
internalStartToolExecutionSpan(seed: ToolExecutionStart, startedAt: Date): Span;
|
|
117
118
|
internalApplyTraceContextFromSpan(span: Span, generation: Generation): void;
|
|
118
119
|
internalSyncGenerationSpan(span: Span, generation: Generation): void;
|
|
119
120
|
internalClearSpanConversationTitle(span: Span): void;
|
|
120
121
|
internalFinalizeGenerationSpan(span: Span, generation: Generation, callError: string | undefined, validationError: Error | undefined, enqueueError: Error | undefined, firstTokenAt: Date | undefined, precomputedCallErrorCategory?: string): void;
|
|
121
|
-
internalFinalizeEmbeddingSpan(span: Span, seed: EmbeddingStart, result: EmbeddingResult, hasResult: boolean, callError: Error | undefined, localError: Error | undefined, startedAt: Date, completedAt: Date): void;
|
|
122
|
-
internalFinalizeToolExecutionSpan(span: Span, toolExecution: ToolExecution, localError: Error | undefined): Error | undefined;
|
|
122
|
+
internalFinalizeEmbeddingSpan(span: Span, seed: EmbeddingStart, result: EmbeddingResult, hasResult: boolean, callError: Error | undefined, localError: Error | undefined, startedAt: Date, completedAt: Date, contentCaptureMode?: ContentCaptureMode): void;
|
|
123
|
+
internalFinalizeToolExecutionSpan(span: Span, toolExecution: ToolExecution, localError: Error | undefined, contentCaptureMode?: ContentCaptureMode): Error | undefined;
|
|
123
124
|
private recordGenerationMetrics;
|
|
124
125
|
private recordEmbeddingMetrics;
|
|
125
126
|
private recordTokenUsage;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|