inngest 4.8.0 → 4.9.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/CHANGELOG.md +8 -0
- package/components/execution/otel/aiExtractor.cjs +90 -125
- package/components/execution/otel/aiExtractor.cjs.map +1 -1
- package/components/execution/otel/aiExtractor.d.cts +48 -5
- package/components/execution/otel/aiExtractor.d.cts.map +1 -1
- package/components/execution/otel/aiExtractor.d.ts +48 -5
- package/components/execution/otel/aiExtractor.d.ts.map +1 -1
- package/components/execution/otel/aiExtractor.js +90 -125
- package/components/execution/otel/aiExtractor.js.map +1 -1
- package/components/execution/otel/middleware.d.cts +5 -5
- package/components/execution/otel/middleware.d.ts +5 -5
- package/components/realtime/types.d.cts +7 -7
- package/components/realtime/types.d.cts.map +1 -1
- package/components/realtime/types.d.ts +7 -7
- package/components/realtime/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/types.d.cts +4 -4
- package/types.d.ts +4 -4
- package/version.cjs +1 -1
- package/version.cjs.map +1 -1
- package/version.d.cts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# inngest
|
|
2
2
|
|
|
3
|
+
## 4.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#1594](https://github.com/inngest/inngest-js/pull/1594) [`124e55f8`](https://github.com/inngest/inngest-js/commit/124e55f8d159af9145a073c9756a6281da60185b) Thanks [@scottnuma](https://github.com/scottnuma)! - Expand AI step metadata extraction to more OTel GenAI span attributes. The SDK now records additional model, provider, response id, token, and request parameter fields from OTel GenAI spans while continuing to ignore prompt and response content.
|
|
8
|
+
|
|
9
|
+
This removes the previous metadata extraction for Open Inference, Vercel AI SDK-specific, and Langfuse-specific span attributes.
|
|
10
|
+
|
|
3
11
|
## 4.8.0
|
|
4
12
|
|
|
5
13
|
### Minor Changes
|
|
@@ -1,155 +1,120 @@
|
|
|
1
1
|
|
|
2
2
|
//#region src/components/execution/otel/aiExtractor.ts
|
|
3
|
+
function textField(field, source) {
|
|
4
|
+
return {
|
|
5
|
+
field,
|
|
6
|
+
source,
|
|
7
|
+
valueType: "text",
|
|
8
|
+
merge: "replace"
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function numberField(field, source, merge) {
|
|
12
|
+
return {
|
|
13
|
+
field,
|
|
14
|
+
source,
|
|
15
|
+
valueType: "number",
|
|
16
|
+
merge
|
|
17
|
+
};
|
|
18
|
+
}
|
|
3
19
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
|
|
8
|
-
var Convention = /* @__PURE__ */ function(Convention$1) {
|
|
9
|
-
Convention$1[Convention$1["Langfuse"] = 1] = "Langfuse";
|
|
10
|
-
Convention$1[Convention$1["Semconv"] = 2] = "Semconv";
|
|
11
|
-
Convention$1[Convention$1["OpenInference"] = 3] = "OpenInference";
|
|
12
|
-
Convention$1[Convention$1["Vercel"] = 4] = "Vercel";
|
|
13
|
-
return Convention$1;
|
|
14
|
-
}(Convention || {});
|
|
15
|
-
/**
|
|
16
|
-
* Prefix for the synthetic attributes produced by
|
|
17
|
-
* {@link expandLangfuseUsageDetails}, kept distinct from any real attribute
|
|
18
|
-
* namespace.
|
|
19
|
-
*/
|
|
20
|
-
const langfuseUsagePrefix = "__langfuse.usage_details.";
|
|
21
|
-
/**
|
|
22
|
-
* Parses the `langfuse.observation.usage_details` JSON blob (e.g.
|
|
23
|
-
* `{"input":17,"output":36,"total":53}`) and emits a synthetic scalar
|
|
24
|
-
* attribute for each count we track. Only `input` is emitted; the other counts
|
|
25
|
-
* (output, total, cached, reasoning, …) are intentionally dropped since this
|
|
26
|
-
* extractor tracks input tokens alone.
|
|
27
|
-
*/
|
|
28
|
-
const expandLangfuseUsageDetails = (value) => {
|
|
29
|
-
if (typeof value !== "string" || value === "") return {};
|
|
30
|
-
let counts;
|
|
31
|
-
try {
|
|
32
|
-
counts = JSON.parse(value);
|
|
33
|
-
} catch {
|
|
34
|
-
return {};
|
|
35
|
-
}
|
|
36
|
-
if (typeof counts !== "object" || counts === null) return {};
|
|
37
|
-
const input = counts.input;
|
|
38
|
-
if (typeof input !== "number") return {};
|
|
39
|
-
return { [`${langfuseUsagePrefix}input`]: input };
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Maps a source attribute key to the canonical {@link AIMetadata} field it
|
|
43
|
-
* populates and the convention it belongs to.
|
|
20
|
+
* Every `gen_ai.*` attribute we capture, mapped to its canonical field.
|
|
21
|
+
*
|
|
22
|
+
* Anything not listed here (prompt/response content, messages, tool calls,
|
|
23
|
+
* unknown keys) is ignored.
|
|
44
24
|
*/
|
|
45
|
-
const
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"gen_ai.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"gen_ai.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
},
|
|
70
|
-
"ai.model.id": {
|
|
71
|
-
field: "model",
|
|
72
|
-
convention: Convention.Vercel
|
|
73
|
-
},
|
|
74
|
-
"ai.usage.inputTokens": {
|
|
75
|
-
field: "inputTokens",
|
|
76
|
-
convention: Convention.Vercel
|
|
77
|
-
},
|
|
78
|
-
"ai.usage.tokens": {
|
|
79
|
-
field: "inputTokens",
|
|
80
|
-
convention: Convention.Vercel
|
|
81
|
-
}
|
|
82
|
-
};
|
|
25
|
+
const FIELD_SPECS = [
|
|
26
|
+
textField("requestModel", "gen_ai.request.model"),
|
|
27
|
+
textField("responseModel", "gen_ai.response.model"),
|
|
28
|
+
textField("provider", "gen_ai.provider.name"),
|
|
29
|
+
textField("responseId", "gen_ai.response.id"),
|
|
30
|
+
numberField("inputTokens", "gen_ai.usage.input_tokens", "sum"),
|
|
31
|
+
numberField("outputTokens", "gen_ai.usage.output_tokens", "sum"),
|
|
32
|
+
numberField("totalTokens", "gen_ai.usage.total_tokens", "sum"),
|
|
33
|
+
numberField("cacheReadTokens", "gen_ai.usage.cache_read.input_tokens", "sum"),
|
|
34
|
+
numberField("cacheCreationTokens", "gen_ai.usage.cache_creation.input_tokens", "sum"),
|
|
35
|
+
numberField("reasoningTokens", "gen_ai.usage.reasoning.output_tokens", "sum"),
|
|
36
|
+
numberField("temperature", "gen_ai.request.temperature", "replace"),
|
|
37
|
+
numberField("topP", "gen_ai.request.top_p", "replace"),
|
|
38
|
+
numberField("maxTokens", "gen_ai.request.max_tokens", "replace"),
|
|
39
|
+
numberField("frequencyPenalty", "gen_ai.request.frequency_penalty", "replace"),
|
|
40
|
+
numberField("presencePenalty", "gen_ai.request.presence_penalty", "replace"),
|
|
41
|
+
numberField("seed", "gen_ai.request.seed", "replace")
|
|
42
|
+
];
|
|
43
|
+
function parseNumericAttribute(value) {
|
|
44
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : void 0;
|
|
45
|
+
if (typeof value !== "string" || value === "") return;
|
|
46
|
+
const num = Number(value);
|
|
47
|
+
return Number.isFinite(num) ? num : void 0;
|
|
48
|
+
}
|
|
83
49
|
/**
|
|
84
|
-
* Extracts
|
|
50
|
+
* Extracts {@link AIMetadata} from a span's attributes.
|
|
51
|
+
*
|
|
52
|
+
* Only the allowlisted {@link FIELD_SPECS} are read. Every other attribute is
|
|
53
|
+
* ignored. Numeric fields accept numbers and quoted numeric strings and are
|
|
54
|
+
* otherwise dropped, as OTLP/JSON may encode int64 as a quoted string. Text
|
|
55
|
+
* fields are dropped when empty.
|
|
85
56
|
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* convention supplies the same field, the highest-precedence value wins.
|
|
57
|
+
* Returns an empty object for spans carrying no recognised `gen_ai.*`
|
|
58
|
+
* attributes.
|
|
89
59
|
*
|
|
90
60
|
* @param attributes - The span attributes, as exposed by
|
|
91
61
|
* `ReadableSpan.attributes`.
|
|
92
62
|
*/
|
|
93
63
|
const extractAIMetadataFromAttributes = (attributes) => {
|
|
94
|
-
const
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
const existing = candidates[mapping.field];
|
|
98
|
-
if (!existing || mapping.convention < existing.convention) candidates[mapping.field] = {
|
|
99
|
-
value,
|
|
100
|
-
convention: mapping.convention
|
|
101
|
-
};
|
|
102
|
-
};
|
|
103
|
-
for (const [key, value] of Object.entries(attributes)) {
|
|
64
|
+
const metadata = {};
|
|
65
|
+
for (const spec of FIELD_SPECS) {
|
|
66
|
+
const value = attributes[spec.source];
|
|
104
67
|
if (value === void 0) continue;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
continue;
|
|
68
|
+
if (spec.valueType === "text") {
|
|
69
|
+
const text = typeof value === "string" ? value : String(value);
|
|
70
|
+
if (text !== "") metadata[spec.field] = text;
|
|
71
|
+
} else {
|
|
72
|
+
const num = parseNumericAttribute(value);
|
|
73
|
+
if (num !== void 0) metadata[spec.field] = num;
|
|
113
74
|
}
|
|
114
|
-
record(mapping, value);
|
|
115
|
-
}
|
|
116
|
-
const metadata = {};
|
|
117
|
-
const model = candidates.model?.value;
|
|
118
|
-
if (typeof model === "string" && model !== "") metadata.model = model;
|
|
119
|
-
const inputTokens = candidates.inputTokens?.value;
|
|
120
|
-
if (inputTokens !== void 0) {
|
|
121
|
-
const n = Number(inputTokens);
|
|
122
|
-
if (!Number.isNaN(n)) metadata.inputTokens = n;
|
|
123
75
|
}
|
|
124
76
|
return metadata;
|
|
125
77
|
};
|
|
126
78
|
/**
|
|
127
|
-
* Aggregates two {@link AIMetadata} values into
|
|
79
|
+
* Aggregates two {@link AIMetadata} values, folding a later call's metadata into
|
|
80
|
+
* an earlier accumulator for a single step.
|
|
81
|
+
*
|
|
82
|
+
* - Token-count fields (`merge: "sum"`) are **summed**, so a step that makes
|
|
83
|
+
* several LLM calls reports their combined usage.
|
|
84
|
+
* - Every other field uses `merge: "replace"` (`b` overwrites `a`)
|
|
128
85
|
*
|
|
129
|
-
*
|
|
130
|
-
* Each field is only present in the result when at least one input supplies it.
|
|
86
|
+
* A field is present in the result only when at least one input supplies it.
|
|
131
87
|
*
|
|
132
|
-
* @param a - The
|
|
133
|
-
* @param b - The
|
|
88
|
+
* @param a - The accumulator (earlier calls).
|
|
89
|
+
* @param b - The later metadata, whose values win on conflict (and add for sums).
|
|
134
90
|
*/
|
|
135
91
|
const aggregate = (a, b) => {
|
|
136
|
-
const
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
92
|
+
const out = { ...a };
|
|
93
|
+
for (const spec of FIELD_SPECS) if (spec.valueType === "number") {
|
|
94
|
+
const bValue = b[spec.field];
|
|
95
|
+
if (bValue === void 0) continue;
|
|
96
|
+
if (spec.merge === "sum") out[spec.field] = (out[spec.field] ?? 0) + bValue;
|
|
97
|
+
else out[spec.field] = bValue;
|
|
98
|
+
} else if (spec.valueType === "text") {
|
|
99
|
+
const bValue = b[spec.field];
|
|
100
|
+
if (bValue === void 0) continue;
|
|
101
|
+
out[spec.field] = bValue;
|
|
102
|
+
}
|
|
103
|
+
return out;
|
|
141
104
|
};
|
|
105
|
+
/** Converts a canonical camelCase field name to the server's snake_case key. */
|
|
106
|
+
const toSnakeCase = (field) => field.replace(/[A-Z]/g, (char) => `_${char.toLowerCase()}`);
|
|
142
107
|
/**
|
|
143
108
|
* Maps an {@link AIMetadata} value onto the server's `inngest.ai` metadata
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
109
|
+
* values, converting each canonical camelCase field to snake_case (e.g.
|
|
110
|
+
* `inputTokens` → `input_tokens`). Returns `undefined` when there is nothing to
|
|
111
|
+
* emit so callers can skip stamping metadata entirely.
|
|
147
112
|
*/
|
|
148
113
|
const toInngestAIMetadataValues = (metadata) => {
|
|
114
|
+
const entries = Object.entries(metadata);
|
|
115
|
+
if (entries.length === 0) return;
|
|
149
116
|
const values = {};
|
|
150
|
-
|
|
151
|
-
if (metadata.inputTokens !== void 0) values.input_tokens = metadata.inputTokens;
|
|
152
|
-
if (Object.keys(values).length === 0) return;
|
|
117
|
+
for (const [field, value] of entries) values[toSnakeCase(field)] = value;
|
|
153
118
|
return values;
|
|
154
119
|
};
|
|
155
120
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiExtractor.cjs","names":["counts: unknown","keyFieldMap: Record<string, Mapping>","candidates: Partial<Record<Field, Candidate>>","metadata: AIMetadata","values: Record<string, unknown>"],"sources":["../../../../src/components/execution/otel/aiExtractor.ts"],"sourcesContent":["import type { Attributes, AttributeValue } from \"@opentelemetry/api\";\n\n/**\n * AI metadata extracted from a span's attributes.\n *\n * A field is only present when a matching attribute was found on the span;\n * absent fields are omitted rather than zero-valued.\n */\nexport interface AIMetadata {\n /** The requested model, e.g. `gpt-4.1-nano`. */\n model?: string;\n /** The number of input (prompt) tokens consumed by the request. */\n inputTokens?: number;\n}\n\n/**\n * A `convention` identifies a namespace of AI span attributes and orders which\n * should win when multiple namespaces are present on the same span. Lower\n * numbers override higher numbers.\n */\nenum Convention {\n Langfuse = 1,\n Semconv = 2,\n OpenInference = 3,\n Vercel = 4,\n}\n\ntype Field = keyof AIMetadata;\n\ninterface Mapping {\n /**\n * The canonical {@link AIMetadata} field this attribute populates. Omitted\n * for composite attributes that only carry an {@link Mapping.expand}.\n */\n field?: Field;\n convention: Convention;\n /**\n * Composite attributes (e.g. a JSON blob of token counts) provide an\n * `expand` that explodes the raw value into synthetic scalar attributes,\n * each re-matched against {@link keyFieldMap}.\n */\n expand?: (value: AttributeValue) => Record<string, AttributeValue>;\n}\n\n/**\n * Prefix for the synthetic attributes produced by\n * {@link expandLangfuseUsageDetails}, kept distinct from any real attribute\n * namespace.\n */\nconst langfuseUsagePrefix = \"__langfuse.usage_details.\";\n\n/**\n * Parses the `langfuse.observation.usage_details` JSON blob (e.g.\n * `{\"input\":17,\"output\":36,\"total\":53}`) and emits a synthetic scalar\n * attribute for each count we track. Only `input` is emitted; the other counts\n * (output, total, cached, reasoning, …) are intentionally dropped since this\n * extractor tracks input tokens alone.\n */\nconst expandLangfuseUsageDetails = (\n value: AttributeValue,\n): Record<string, AttributeValue> => {\n if (typeof value !== \"string\" || value === \"\") {\n return {};\n }\n\n let counts: unknown;\n try {\n counts = JSON.parse(value);\n } catch {\n return {};\n }\n\n if (typeof counts !== \"object\" || counts === null) {\n return {};\n }\n\n const input = (counts as Record<string, unknown>).input;\n if (typeof input !== \"number\") {\n return {};\n }\n\n return { [`${langfuseUsagePrefix}input`]: input };\n};\n\n/**\n * Maps a source attribute key to the canonical {@link AIMetadata} field it\n * populates and the convention it belongs to.\n */\nconst keyFieldMap: Record<string, Mapping> = {\n // Langfuse (`langfuse.*` telemetry). Langfuse reports token usage as a single\n // JSON blob under `usage_details`; it is expanded into synthetic per-count\n // attributes that are matched back through this map. Langfuse only emits a\n // response model (not the requested model), which this extractor doesn't\n // track, so no `model` mapping is registered here. Langfuse outranks the\n // other conventions when several are present on one span.\n \"langfuse.observation.usage_details\": {\n convention: Convention.Langfuse,\n expand: expandLangfuseUsageDetails,\n },\n [`${langfuseUsagePrefix}input`]: {\n field: \"inputTokens\",\n convention: Convention.Langfuse,\n },\n\n // OpenTelemetry Semantic Conventions\n \"gen_ai.request.model\": { field: \"model\", convention: Convention.Semconv },\n \"gen_ai.usage.input_tokens\": {\n field: \"inputTokens\",\n convention: Convention.Semconv,\n },\n\n // OpenInference\n \"llm.model_name\": { field: \"model\", convention: Convention.OpenInference },\n \"llm.token_count.prompt\": {\n field: \"inputTokens\",\n convention: Convention.OpenInference,\n },\n\n // Vercel AI SDK (native `ai.*` telemetry)\n \"ai.model.id\": { field: \"model\", convention: Convention.Vercel },\n \"ai.usage.inputTokens\": {\n field: \"inputTokens\",\n convention: Convention.Vercel,\n },\n // Embeddings spans emit only a single `ai.usage.tokens` count (no\n // input/output split); map it to inputTokens to match the semconv embeddings\n // case.\n \"ai.usage.tokens\": { field: \"inputTokens\", convention: Convention.Vercel },\n};\n\ninterface Candidate {\n value: AttributeValue;\n convention: Convention;\n}\n\n/**\n * Extracts AI model metadata from a span's attributes.\n *\n * Attributes are matched across multiple instrumentation conventions\n * (OpenTelemetry semconv, OpenInference, Vercel AI SDK). When more than one\n * convention supplies the same field, the highest-precedence value wins.\n *\n * @param attributes - The span attributes, as exposed by\n * `ReadableSpan.attributes`.\n */\nexport const extractAIMetadataFromAttributes = (\n attributes: Attributes,\n): AIMetadata => {\n // Track the highest-precedence (lowest convention) candidate seen per field.\n const candidates: Partial<Record<Field, Candidate>> = {};\n\n const record = (mapping: Mapping, value: AttributeValue) => {\n if (!mapping.field) {\n return;\n }\n const existing = candidates[mapping.field];\n if (!existing || mapping.convention < existing.convention) {\n candidates[mapping.field] = { value, convention: mapping.convention };\n }\n };\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value === undefined) {\n continue;\n }\n\n const mapping = keyFieldMap[key];\n if (!mapping) {\n continue;\n }\n\n // Composite attribute: explode into synthetic children and match each back\n // through the map.\n if (mapping.expand) {\n for (const [childKey, childValue] of Object.entries(\n mapping.expand(value),\n )) {\n const childMapping = keyFieldMap[childKey];\n if (childMapping) {\n record(childMapping, childValue);\n }\n }\n continue;\n }\n\n record(mapping, value);\n }\n\n const metadata: AIMetadata = {};\n\n const model = candidates.model?.value;\n if (typeof model === \"string\" && model !== \"\") {\n metadata.model = model;\n }\n\n const inputTokens = candidates.inputTokens?.value;\n if (inputTokens !== undefined) {\n // Token counts arrive as numbers from the SDK, but OTLP/JSON encodes int64\n // as either a number or a quoted string, so coerce defensively.\n const n = Number(inputTokens);\n if (!Number.isNaN(n)) {\n metadata.inputTokens = n;\n }\n }\n\n return metadata;\n};\n\n/**\n * Aggregates two {@link AIMetadata} values into one.\n *\n * Input token counts are summed, while `a`'s model takes precedence over `b`'s.\n * Each field is only present in the result when at least one input supplies it.\n *\n * @param a - The primary metadata; its `model` wins when both are present.\n * @param b - The secondary metadata.\n */\nexport const aggregate = (a: AIMetadata, b: AIMetadata): AIMetadata => {\n const metadata: AIMetadata = {};\n\n const model = a.model ?? b.model;\n if (model !== undefined) {\n metadata.model = model;\n }\n\n if (a.inputTokens !== undefined || b.inputTokens !== undefined) {\n metadata.inputTokens = (a.inputTokens ?? 0) + (b.inputTokens ?? 0);\n }\n\n return metadata;\n};\n\n/**\n * Maps an {@link AIMetadata} value onto the server's `inngest.ai` metadata\n * schema (snake_case keys). Only the fields we extract are emitted; absent\n * fields are omitted rather than zero-valued. Returns `undefined` when there\n * is nothing to emit, so callers can skip stamping metadata entirely.\n */\nexport const toInngestAIMetadataValues = (\n metadata: AIMetadata,\n): Record<string, unknown> | undefined => {\n const values: Record<string, unknown> = {};\n\n if (metadata.model !== undefined) {\n values.model = metadata.model;\n }\n\n if (metadata.inputTokens !== undefined) {\n values.input_tokens = metadata.inputTokens;\n }\n\n if (Object.keys(values).length === 0) {\n return undefined;\n }\n\n return values;\n};\n"],"mappings":";;;;;;;AAoBA,IAAK,oDAAL;AACE;AACA;AACA;AACA;;EAJG;;;;;;AA6BL,MAAM,sBAAsB;;;;;;;;AAS5B,MAAM,8BACJ,UACmC;AACnC,KAAI,OAAO,UAAU,YAAY,UAAU,GACzC,QAAO,EAAE;CAGX,IAAIA;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,MAAM;SACpB;AACN,SAAO,EAAE;;AAGX,KAAI,OAAO,WAAW,YAAY,WAAW,KAC3C,QAAO,EAAE;CAGX,MAAM,QAAS,OAAmC;AAClD,KAAI,OAAO,UAAU,SACnB,QAAO,EAAE;AAGX,QAAO,GAAG,GAAG,oBAAoB,SAAS,OAAO;;;;;;AAOnD,MAAMC,cAAuC;CAO3C,sCAAsC;EACpC,YAAY,WAAW;EACvB,QAAQ;EACT;EACA,GAAG,oBAAoB,SAAS;EAC/B,OAAO;EACP,YAAY,WAAW;EACxB;CAGD,wBAAwB;EAAE,OAAO;EAAS,YAAY,WAAW;EAAS;CAC1E,6BAA6B;EAC3B,OAAO;EACP,YAAY,WAAW;EACxB;CAGD,kBAAkB;EAAE,OAAO;EAAS,YAAY,WAAW;EAAe;CAC1E,0BAA0B;EACxB,OAAO;EACP,YAAY,WAAW;EACxB;CAGD,eAAe;EAAE,OAAO;EAAS,YAAY,WAAW;EAAQ;CAChE,wBAAwB;EACtB,OAAO;EACP,YAAY,WAAW;EACxB;CAID,mBAAmB;EAAE,OAAO;EAAe,YAAY,WAAW;EAAQ;CAC3E;;;;;;;;;;;AAiBD,MAAa,mCACX,eACe;CAEf,MAAMC,aAAgD,EAAE;CAExD,MAAM,UAAU,SAAkB,UAA0B;AAC1D,MAAI,CAAC,QAAQ,MACX;EAEF,MAAM,WAAW,WAAW,QAAQ;AACpC,MAAI,CAAC,YAAY,QAAQ,aAAa,SAAS,WAC7C,YAAW,QAAQ,SAAS;GAAE;GAAO,YAAY,QAAQ;GAAY;;AAIzE,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,EAAE;AACrD,MAAI,UAAU,OACZ;EAGF,MAAM,UAAU,YAAY;AAC5B,MAAI,CAAC,QACH;AAKF,MAAI,QAAQ,QAAQ;AAClB,QAAK,MAAM,CAAC,UAAU,eAAe,OAAO,QAC1C,QAAQ,OAAO,MAAM,CACtB,EAAE;IACD,MAAM,eAAe,YAAY;AACjC,QAAI,aACF,QAAO,cAAc,WAAW;;AAGpC;;AAGF,SAAO,SAAS,MAAM;;CAGxB,MAAMC,WAAuB,EAAE;CAE/B,MAAM,QAAQ,WAAW,OAAO;AAChC,KAAI,OAAO,UAAU,YAAY,UAAU,GACzC,UAAS,QAAQ;CAGnB,MAAM,cAAc,WAAW,aAAa;AAC5C,KAAI,gBAAgB,QAAW;EAG7B,MAAM,IAAI,OAAO,YAAY;AAC7B,MAAI,CAAC,OAAO,MAAM,EAAE,CAClB,UAAS,cAAc;;AAI3B,QAAO;;;;;;;;;;;AAYT,MAAa,aAAa,GAAe,MAA8B;CACrE,MAAMA,WAAuB,EAAE;CAE/B,MAAM,QAAQ,EAAE,SAAS,EAAE;AAC3B,KAAI,UAAU,OACZ,UAAS,QAAQ;AAGnB,KAAI,EAAE,gBAAgB,UAAa,EAAE,gBAAgB,OACnD,UAAS,eAAe,EAAE,eAAe,MAAM,EAAE,eAAe;AAGlE,QAAO;;;;;;;;AAST,MAAa,6BACX,aACwC;CACxC,MAAMC,SAAkC,EAAE;AAE1C,KAAI,SAAS,UAAU,OACrB,QAAO,QAAQ,SAAS;AAG1B,KAAI,SAAS,gBAAgB,OAC3B,QAAO,eAAe,SAAS;AAGjC,KAAI,OAAO,KAAK,OAAO,CAAC,WAAW,EACjC;AAGF,QAAO"}
|
|
1
|
+
{"version":3,"file":"aiExtractor.cjs","names":["metadata: AIMetadata","out: AIMetadata","values: Record<string, unknown>"],"sources":["../../../../src/components/execution/otel/aiExtractor.ts"],"sourcesContent":["import type { Attributes } from \"@opentelemetry/api\";\n\n/**\n * Canonical AI metadata extracted from a span's OpenTelemetry GenAI semantic\n * convention (`gen_ai.*`) attributes.\n *\n * The fields below are an explicit **allowlist**: only these are ever read from\n * a span (see {@link FIELD_SPECS}). Anything not mapped — prompt/response\n * content, messages, tool calls, embeddings payloads, and other\n * potentially-sensitive or bulky attributes — is not captured.\n *\n * For each category we describe how multiple AIMetadata values are aggregated\n * (see {@link aggregate}).\n */\nexport interface AIMetadata {\n // Identity & classification (last-write-wins).\n\n /** The requested model, e.g. `gpt-4.1-nano`. */\n requestModel?: string;\n /**\n * The model that actually served the request. This is often a dated snapshot\n * of the requested {@link AIMetadata.requestModel} (e.g.\n * `gpt-4.1-nano-2025-04-14`).\n */\n responseModel?: string;\n /** The AI provider that served the request (e.g. `openai`) */\n provider?: string;\n /** The provider's identifier for the response, e.g. `chatcmpl-...`. */\n responseId?: string;\n\n // Token usage (summed).\n\n /** The number of input tokens consumed by the request. */\n inputTokens?: number;\n /** The number of output tokens produced by the response. */\n outputTokens?: number;\n /** The total tokens consumed, as reported by the provider. */\n totalTokens?: number;\n /**\n * Cached input tokens read from the prompt cache. Providers differ on\n * accounting. OpenAI's cached tokens are a subset of\n * {@link AIMetadata.inputTokens}, Anthropic's are additive. Callers must\n * not assume a single relationship.\n */\n cacheReadTokens?: number;\n /** Tokens written to the prompt cache. */\n cacheCreationTokens?: number;\n /** Reasoning/thinking tokens, when the emitter reports them separately. */\n reasoningTokens?: number;\n\n // Request / inference parameters (last-write-wins). These describe the\n // request the caller made, not the response, and are stored raw as the\n // emitter reports them.\n\n /** Sampling temperature requested, e.g. `0.7`. */\n temperature?: number;\n /** Nucleus sampling probability mass requested (`top_p`), e.g. `0.9`. */\n topP?: number;\n /** Upper bound on tokens to generate (`max_tokens`). */\n maxTokens?: number;\n /** Frequency penalty requested. */\n frequencyPenalty?: number;\n /** Presence penalty requested. */\n presencePenalty?: number;\n /** Sampling seed requested, when the emitter reports it. */\n seed?: number;\n}\n\ntype ValueType = \"text\" | \"number\";\ntype MergeStrategy = \"replace\" | \"sum\";\n\n/**\n * Derives the subset of AIMetadata keys whose assigned value matches TValue.\n *\n * AIMetadata fields are optional (`model?: string`), so each field's type is\n * effectively `string | undefined` or `number | undefined`. `Exclude` removes\n * `undefined` before checking the value type, and `-?` prevents optional fields\n * from adding `undefined` back into the final key union.\n */\ntype FieldsWithValue<TValue> = {\n [TField in keyof AIMetadata]-?: Exclude<\n AIMetadata[TField],\n undefined\n > extends TValue\n ? TField\n : never;\n}[keyof AIMetadata];\n\ntype TextField = FieldsWithValue<string>;\ntype NumberField = FieldsWithValue<number>;\n\ninterface BaseFieldSpec {\n /** The source `gen_ai.*` attribute key. */\n source: string;\n valueType: ValueType;\n merge: MergeStrategy;\n}\n\ninterface TextFieldSpec extends BaseFieldSpec {\n /** The canonical {@link AIMetadata} field this populates. */\n field: TextField;\n valueType: \"text\";\n merge: \"replace\";\n}\n\ninterface NumberFieldSpec extends BaseFieldSpec {\n /** The canonical {@link AIMetadata} field this populates. */\n field: NumberField;\n valueType: \"number\";\n}\n\ntype FieldSpec = TextFieldSpec | NumberFieldSpec;\n\nfunction textField(field: TextField, source: string): TextFieldSpec {\n return {\n field,\n source,\n valueType: \"text\",\n merge: \"replace\",\n };\n}\n\nfunction numberField(\n field: NumberField,\n source: string,\n merge: MergeStrategy,\n): NumberFieldSpec {\n return {\n field,\n source,\n valueType: \"number\",\n merge,\n };\n}\n\n/**\n * Every `gen_ai.*` attribute we capture, mapped to its canonical field.\n *\n * Anything not listed here (prompt/response content, messages, tool calls,\n * unknown keys) is ignored.\n */\nexport const FIELD_SPECS = [\n // Identity & classification.\n textField(\"requestModel\", \"gen_ai.request.model\"),\n textField(\"responseModel\", \"gen_ai.response.model\"),\n textField(\"provider\", \"gen_ai.provider.name\"),\n textField(\"responseId\", \"gen_ai.response.id\"),\n\n // Token usage.\n numberField(\"inputTokens\", \"gen_ai.usage.input_tokens\", \"sum\"),\n numberField(\"outputTokens\", \"gen_ai.usage.output_tokens\", \"sum\"),\n numberField(\"totalTokens\", \"gen_ai.usage.total_tokens\", \"sum\"),\n numberField(\"cacheReadTokens\", \"gen_ai.usage.cache_read.input_tokens\", \"sum\"),\n numberField(\n \"cacheCreationTokens\",\n \"gen_ai.usage.cache_creation.input_tokens\",\n \"sum\",\n ),\n numberField(\"reasoningTokens\", \"gen_ai.usage.reasoning.output_tokens\", \"sum\"),\n\n // Request / inference parameters. These describe the request, not a quantity,\n // so they replace rather than sum when a step makes several calls.\n numberField(\"temperature\", \"gen_ai.request.temperature\", \"replace\"),\n numberField(\"topP\", \"gen_ai.request.top_p\", \"replace\"),\n numberField(\"maxTokens\", \"gen_ai.request.max_tokens\", \"replace\"),\n numberField(\n \"frequencyPenalty\",\n \"gen_ai.request.frequency_penalty\",\n \"replace\",\n ),\n numberField(\"presencePenalty\", \"gen_ai.request.presence_penalty\", \"replace\"),\n numberField(\"seed\", \"gen_ai.request.seed\", \"replace\"),\n] as const satisfies readonly FieldSpec[];\n\nfunction parseNumericAttribute(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (typeof value !== \"string\" || value === \"\") {\n return undefined;\n }\n\n const num = Number(value);\n return Number.isFinite(num) ? num : undefined;\n}\n\n/**\n * Extracts {@link AIMetadata} from a span's attributes.\n *\n * Only the allowlisted {@link FIELD_SPECS} are read. Every other attribute is\n * ignored. Numeric fields accept numbers and quoted numeric strings and are\n * otherwise dropped, as OTLP/JSON may encode int64 as a quoted string. Text\n * fields are dropped when empty.\n *\n * Returns an empty object for spans carrying no recognised `gen_ai.*`\n * attributes.\n *\n * @param attributes - The span attributes, as exposed by\n * `ReadableSpan.attributes`.\n */\nexport const extractAIMetadataFromAttributes = (\n attributes: Attributes,\n): AIMetadata => {\n const metadata: AIMetadata = {};\n\n for (const spec of FIELD_SPECS) {\n const value = attributes[spec.source];\n if (value === undefined) {\n continue;\n }\n\n if (spec.valueType === \"text\") {\n const text = typeof value === \"string\" ? value : String(value);\n if (text !== \"\") {\n metadata[spec.field] = text;\n }\n } else {\n const num = parseNumericAttribute(value);\n if (num !== undefined) {\n metadata[spec.field] = num;\n }\n }\n }\n\n return metadata;\n};\n\n/**\n * Aggregates two {@link AIMetadata} values, folding a later call's metadata into\n * an earlier accumulator for a single step.\n *\n * - Token-count fields (`merge: \"sum\"`) are **summed**, so a step that makes\n * several LLM calls reports their combined usage.\n * - Every other field uses `merge: \"replace\"` (`b` overwrites `a`)\n *\n * A field is present in the result only when at least one input supplies it.\n *\n * @param a - The accumulator (earlier calls).\n * @param b - The later metadata, whose values win on conflict (and add for sums).\n */\nexport const aggregate = (a: AIMetadata, b: AIMetadata): AIMetadata => {\n const out: AIMetadata = { ...a };\n\n for (const spec of FIELD_SPECS) {\n if (spec.valueType === \"number\") {\n const bValue = b[spec.field];\n if (bValue === undefined) {\n continue;\n }\n\n if (spec.merge === \"sum\") {\n out[spec.field] = (out[spec.field] ?? 0) + bValue;\n } else {\n out[spec.field] = bValue;\n }\n } else if (spec.valueType === \"text\") {\n // Text fields are always replace.\n const bValue = b[spec.field];\n if (bValue === undefined) {\n continue;\n }\n out[spec.field] = bValue;\n }\n }\n\n return out;\n};\n\n/** Converts a canonical camelCase field name to the server's snake_case key. */\nconst toSnakeCase = (field: string): string =>\n field.replace(/[A-Z]/g, (char) => `_${char.toLowerCase()}`);\n\n/**\n * Maps an {@link AIMetadata} value onto the server's `inngest.ai` metadata\n * values, converting each canonical camelCase field to snake_case (e.g.\n * `inputTokens` → `input_tokens`). Returns `undefined` when there is nothing to\n * emit so callers can skip stamping metadata entirely.\n */\nexport const toInngestAIMetadataValues = (\n metadata: AIMetadata,\n): Record<string, unknown> | undefined => {\n const entries = Object.entries(metadata);\n if (entries.length === 0) {\n return undefined;\n }\n\n const values: Record<string, unknown> = {};\n for (const [field, value] of entries) {\n values[toSnakeCase(field)] = value;\n }\n\n return values;\n};\n"],"mappings":";;AAiHA,SAAS,UAAU,OAAkB,QAA+B;AAClE,QAAO;EACL;EACA;EACA,WAAW;EACX,OAAO;EACR;;AAGH,SAAS,YACP,OACA,QACA,OACiB;AACjB,QAAO;EACL;EACA;EACA,WAAW;EACX;EACD;;;;;;;;AASH,MAAa,cAAc;CAEzB,UAAU,gBAAgB,uBAAuB;CACjD,UAAU,iBAAiB,wBAAwB;CACnD,UAAU,YAAY,uBAAuB;CAC7C,UAAU,cAAc,qBAAqB;CAG7C,YAAY,eAAe,6BAA6B,MAAM;CAC9D,YAAY,gBAAgB,8BAA8B,MAAM;CAChE,YAAY,eAAe,6BAA6B,MAAM;CAC9D,YAAY,mBAAmB,wCAAwC,MAAM;CAC7E,YACE,uBACA,4CACA,MACD;CACD,YAAY,mBAAmB,wCAAwC,MAAM;CAI7E,YAAY,eAAe,8BAA8B,UAAU;CACnE,YAAY,QAAQ,wBAAwB,UAAU;CACtD,YAAY,aAAa,6BAA6B,UAAU;CAChE,YACE,oBACA,oCACA,UACD;CACD,YAAY,mBAAmB,mCAAmC,UAAU;CAC5E,YAAY,QAAQ,uBAAuB,UAAU;CACtD;AAED,SAAS,sBAAsB,OAAoC;AACjE,KAAI,OAAO,UAAU,SACnB,QAAO,OAAO,SAAS,MAAM,GAAG,QAAQ;AAG1C,KAAI,OAAO,UAAU,YAAY,UAAU,GACzC;CAGF,MAAM,MAAM,OAAO,MAAM;AACzB,QAAO,OAAO,SAAS,IAAI,GAAG,MAAM;;;;;;;;;;;;;;;;AAiBtC,MAAa,mCACX,eACe;CACf,MAAMA,WAAuB,EAAE;AAE/B,MAAK,MAAM,QAAQ,aAAa;EAC9B,MAAM,QAAQ,WAAW,KAAK;AAC9B,MAAI,UAAU,OACZ;AAGF,MAAI,KAAK,cAAc,QAAQ;GAC7B,MAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,MAAM;AAC9D,OAAI,SAAS,GACX,UAAS,KAAK,SAAS;SAEpB;GACL,MAAM,MAAM,sBAAsB,MAAM;AACxC,OAAI,QAAQ,OACV,UAAS,KAAK,SAAS;;;AAK7B,QAAO;;;;;;;;;;;;;;;AAgBT,MAAa,aAAa,GAAe,MAA8B;CACrE,MAAMC,MAAkB,EAAE,GAAG,GAAG;AAEhC,MAAK,MAAM,QAAQ,YACjB,KAAI,KAAK,cAAc,UAAU;EAC/B,MAAM,SAAS,EAAE,KAAK;AACtB,MAAI,WAAW,OACb;AAGF,MAAI,KAAK,UAAU,MACjB,KAAI,KAAK,UAAU,IAAI,KAAK,UAAU,KAAK;MAE3C,KAAI,KAAK,SAAS;YAEX,KAAK,cAAc,QAAQ;EAEpC,MAAM,SAAS,EAAE,KAAK;AACtB,MAAI,WAAW,OACb;AAEF,MAAI,KAAK,SAAS;;AAItB,QAAO;;;AAIT,MAAM,eAAe,UACnB,MAAM,QAAQ,WAAW,SAAS,IAAI,KAAK,aAAa,GAAG;;;;;;;AAQ7D,MAAa,6BACX,aACwC;CACxC,MAAM,UAAU,OAAO,QAAQ,SAAS;AACxC,KAAI,QAAQ,WAAW,EACrB;CAGF,MAAMC,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,OAAO,UAAU,QAC3B,QAAO,YAAY,MAAM,IAAI;AAG/B,QAAO"}
|
|
@@ -1,15 +1,58 @@
|
|
|
1
1
|
//#region src/components/execution/otel/aiExtractor.d.ts
|
|
2
2
|
/**
|
|
3
|
-
* AI metadata extracted from a span's
|
|
3
|
+
* Canonical AI metadata extracted from a span's OpenTelemetry GenAI semantic
|
|
4
|
+
* convention (`gen_ai.*`) attributes.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
6
|
+
* The fields below are an explicit **allowlist**: only these are ever read from
|
|
7
|
+
* a span (see {@link FIELD_SPECS}). Anything not mapped — prompt/response
|
|
8
|
+
* content, messages, tool calls, embeddings payloads, and other
|
|
9
|
+
* potentially-sensitive or bulky attributes — is not captured.
|
|
10
|
+
*
|
|
11
|
+
* For each category we describe how multiple AIMetadata values are aggregated
|
|
12
|
+
* (see {@link aggregate}).
|
|
7
13
|
*/
|
|
8
14
|
interface AIMetadata {
|
|
9
15
|
/** The requested model, e.g. `gpt-4.1-nano`. */
|
|
10
|
-
|
|
11
|
-
/**
|
|
16
|
+
requestModel?: string;
|
|
17
|
+
/**
|
|
18
|
+
* The model that actually served the request. This is often a dated snapshot
|
|
19
|
+
* of the requested {@link AIMetadata.requestModel} (e.g.
|
|
20
|
+
* `gpt-4.1-nano-2025-04-14`).
|
|
21
|
+
*/
|
|
22
|
+
responseModel?: string;
|
|
23
|
+
/** The AI provider that served the request (e.g. `openai`) */
|
|
24
|
+
provider?: string;
|
|
25
|
+
/** The provider's identifier for the response, e.g. `chatcmpl-...`. */
|
|
26
|
+
responseId?: string;
|
|
27
|
+
/** The number of input tokens consumed by the request. */
|
|
12
28
|
inputTokens?: number;
|
|
29
|
+
/** The number of output tokens produced by the response. */
|
|
30
|
+
outputTokens?: number;
|
|
31
|
+
/** The total tokens consumed, as reported by the provider. */
|
|
32
|
+
totalTokens?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Cached input tokens read from the prompt cache. Providers differ on
|
|
35
|
+
* accounting. OpenAI's cached tokens are a subset of
|
|
36
|
+
* {@link AIMetadata.inputTokens}, Anthropic's are additive. Callers must
|
|
37
|
+
* not assume a single relationship.
|
|
38
|
+
*/
|
|
39
|
+
cacheReadTokens?: number;
|
|
40
|
+
/** Tokens written to the prompt cache. */
|
|
41
|
+
cacheCreationTokens?: number;
|
|
42
|
+
/** Reasoning/thinking tokens, when the emitter reports them separately. */
|
|
43
|
+
reasoningTokens?: number;
|
|
44
|
+
/** Sampling temperature requested, e.g. `0.7`. */
|
|
45
|
+
temperature?: number;
|
|
46
|
+
/** Nucleus sampling probability mass requested (`top_p`), e.g. `0.9`. */
|
|
47
|
+
topP?: number;
|
|
48
|
+
/** Upper bound on tokens to generate (`max_tokens`). */
|
|
49
|
+
maxTokens?: number;
|
|
50
|
+
/** Frequency penalty requested. */
|
|
51
|
+
frequencyPenalty?: number;
|
|
52
|
+
/** Presence penalty requested. */
|
|
53
|
+
presencePenalty?: number;
|
|
54
|
+
/** Sampling seed requested, when the emitter reports it. */
|
|
55
|
+
seed?: number;
|
|
13
56
|
}
|
|
14
57
|
//#endregion
|
|
15
58
|
export { AIMetadata };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiExtractor.d.cts","names":[],"sources":["../../../../src/components/execution/otel/aiExtractor.ts"],"sourcesContent":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"aiExtractor.d.cts","names":[],"sources":["../../../../src/components/execution/otel/aiExtractor.ts"],"sourcesContent":[],"mappings":";AAcA;;;;;;;;;;;;UAAiB,UAAA"}
|
|
@@ -3,16 +3,59 @@ import "@opentelemetry/api";
|
|
|
3
3
|
//#region src/components/execution/otel/aiExtractor.d.ts
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* AI metadata extracted from a span's
|
|
6
|
+
* Canonical AI metadata extracted from a span's OpenTelemetry GenAI semantic
|
|
7
|
+
* convention (`gen_ai.*`) attributes.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
9
|
+
* The fields below are an explicit **allowlist**: only these are ever read from
|
|
10
|
+
* a span (see {@link FIELD_SPECS}). Anything not mapped — prompt/response
|
|
11
|
+
* content, messages, tool calls, embeddings payloads, and other
|
|
12
|
+
* potentially-sensitive or bulky attributes — is not captured.
|
|
13
|
+
*
|
|
14
|
+
* For each category we describe how multiple AIMetadata values are aggregated
|
|
15
|
+
* (see {@link aggregate}).
|
|
10
16
|
*/
|
|
11
17
|
interface AIMetadata {
|
|
12
18
|
/** The requested model, e.g. `gpt-4.1-nano`. */
|
|
13
|
-
|
|
14
|
-
/**
|
|
19
|
+
requestModel?: string;
|
|
20
|
+
/**
|
|
21
|
+
* The model that actually served the request. This is often a dated snapshot
|
|
22
|
+
* of the requested {@link AIMetadata.requestModel} (e.g.
|
|
23
|
+
* `gpt-4.1-nano-2025-04-14`).
|
|
24
|
+
*/
|
|
25
|
+
responseModel?: string;
|
|
26
|
+
/** The AI provider that served the request (e.g. `openai`) */
|
|
27
|
+
provider?: string;
|
|
28
|
+
/** The provider's identifier for the response, e.g. `chatcmpl-...`. */
|
|
29
|
+
responseId?: string;
|
|
30
|
+
/** The number of input tokens consumed by the request. */
|
|
15
31
|
inputTokens?: number;
|
|
32
|
+
/** The number of output tokens produced by the response. */
|
|
33
|
+
outputTokens?: number;
|
|
34
|
+
/** The total tokens consumed, as reported by the provider. */
|
|
35
|
+
totalTokens?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Cached input tokens read from the prompt cache. Providers differ on
|
|
38
|
+
* accounting. OpenAI's cached tokens are a subset of
|
|
39
|
+
* {@link AIMetadata.inputTokens}, Anthropic's are additive. Callers must
|
|
40
|
+
* not assume a single relationship.
|
|
41
|
+
*/
|
|
42
|
+
cacheReadTokens?: number;
|
|
43
|
+
/** Tokens written to the prompt cache. */
|
|
44
|
+
cacheCreationTokens?: number;
|
|
45
|
+
/** Reasoning/thinking tokens, when the emitter reports them separately. */
|
|
46
|
+
reasoningTokens?: number;
|
|
47
|
+
/** Sampling temperature requested, e.g. `0.7`. */
|
|
48
|
+
temperature?: number;
|
|
49
|
+
/** Nucleus sampling probability mass requested (`top_p`), e.g. `0.9`. */
|
|
50
|
+
topP?: number;
|
|
51
|
+
/** Upper bound on tokens to generate (`max_tokens`). */
|
|
52
|
+
maxTokens?: number;
|
|
53
|
+
/** Frequency penalty requested. */
|
|
54
|
+
frequencyPenalty?: number;
|
|
55
|
+
/** Presence penalty requested. */
|
|
56
|
+
presencePenalty?: number;
|
|
57
|
+
/** Sampling seed requested, when the emitter reports it. */
|
|
58
|
+
seed?: number;
|
|
16
59
|
}
|
|
17
60
|
//#endregion
|
|
18
61
|
export { AIMetadata };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiExtractor.d.ts","names":[],"sources":["../../../../src/components/execution/otel/aiExtractor.ts"],"sourcesContent":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"aiExtractor.d.ts","names":[],"sources":["../../../../src/components/execution/otel/aiExtractor.ts"],"sourcesContent":[],"mappings":";;;;;;AAcA;;;;;;;;;;UAAiB,UAAA"}
|
|
@@ -1,154 +1,119 @@
|
|
|
1
1
|
//#region src/components/execution/otel/aiExtractor.ts
|
|
2
|
+
function textField(field, source) {
|
|
3
|
+
return {
|
|
4
|
+
field,
|
|
5
|
+
source,
|
|
6
|
+
valueType: "text",
|
|
7
|
+
merge: "replace"
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function numberField(field, source, merge) {
|
|
11
|
+
return {
|
|
12
|
+
field,
|
|
13
|
+
source,
|
|
14
|
+
valueType: "number",
|
|
15
|
+
merge
|
|
16
|
+
};
|
|
17
|
+
}
|
|
2
18
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
var Convention = /* @__PURE__ */ function(Convention$1) {
|
|
8
|
-
Convention$1[Convention$1["Langfuse"] = 1] = "Langfuse";
|
|
9
|
-
Convention$1[Convention$1["Semconv"] = 2] = "Semconv";
|
|
10
|
-
Convention$1[Convention$1["OpenInference"] = 3] = "OpenInference";
|
|
11
|
-
Convention$1[Convention$1["Vercel"] = 4] = "Vercel";
|
|
12
|
-
return Convention$1;
|
|
13
|
-
}(Convention || {});
|
|
14
|
-
/**
|
|
15
|
-
* Prefix for the synthetic attributes produced by
|
|
16
|
-
* {@link expandLangfuseUsageDetails}, kept distinct from any real attribute
|
|
17
|
-
* namespace.
|
|
18
|
-
*/
|
|
19
|
-
const langfuseUsagePrefix = "__langfuse.usage_details.";
|
|
20
|
-
/**
|
|
21
|
-
* Parses the `langfuse.observation.usage_details` JSON blob (e.g.
|
|
22
|
-
* `{"input":17,"output":36,"total":53}`) and emits a synthetic scalar
|
|
23
|
-
* attribute for each count we track. Only `input` is emitted; the other counts
|
|
24
|
-
* (output, total, cached, reasoning, …) are intentionally dropped since this
|
|
25
|
-
* extractor tracks input tokens alone.
|
|
26
|
-
*/
|
|
27
|
-
const expandLangfuseUsageDetails = (value) => {
|
|
28
|
-
if (typeof value !== "string" || value === "") return {};
|
|
29
|
-
let counts;
|
|
30
|
-
try {
|
|
31
|
-
counts = JSON.parse(value);
|
|
32
|
-
} catch {
|
|
33
|
-
return {};
|
|
34
|
-
}
|
|
35
|
-
if (typeof counts !== "object" || counts === null) return {};
|
|
36
|
-
const input = counts.input;
|
|
37
|
-
if (typeof input !== "number") return {};
|
|
38
|
-
return { [`${langfuseUsagePrefix}input`]: input };
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Maps a source attribute key to the canonical {@link AIMetadata} field it
|
|
42
|
-
* populates and the convention it belongs to.
|
|
19
|
+
* Every `gen_ai.*` attribute we capture, mapped to its canonical field.
|
|
20
|
+
*
|
|
21
|
+
* Anything not listed here (prompt/response content, messages, tool calls,
|
|
22
|
+
* unknown keys) is ignored.
|
|
43
23
|
*/
|
|
44
|
-
const
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"gen_ai.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"gen_ai.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
},
|
|
69
|
-
"ai.model.id": {
|
|
70
|
-
field: "model",
|
|
71
|
-
convention: Convention.Vercel
|
|
72
|
-
},
|
|
73
|
-
"ai.usage.inputTokens": {
|
|
74
|
-
field: "inputTokens",
|
|
75
|
-
convention: Convention.Vercel
|
|
76
|
-
},
|
|
77
|
-
"ai.usage.tokens": {
|
|
78
|
-
field: "inputTokens",
|
|
79
|
-
convention: Convention.Vercel
|
|
80
|
-
}
|
|
81
|
-
};
|
|
24
|
+
const FIELD_SPECS = [
|
|
25
|
+
textField("requestModel", "gen_ai.request.model"),
|
|
26
|
+
textField("responseModel", "gen_ai.response.model"),
|
|
27
|
+
textField("provider", "gen_ai.provider.name"),
|
|
28
|
+
textField("responseId", "gen_ai.response.id"),
|
|
29
|
+
numberField("inputTokens", "gen_ai.usage.input_tokens", "sum"),
|
|
30
|
+
numberField("outputTokens", "gen_ai.usage.output_tokens", "sum"),
|
|
31
|
+
numberField("totalTokens", "gen_ai.usage.total_tokens", "sum"),
|
|
32
|
+
numberField("cacheReadTokens", "gen_ai.usage.cache_read.input_tokens", "sum"),
|
|
33
|
+
numberField("cacheCreationTokens", "gen_ai.usage.cache_creation.input_tokens", "sum"),
|
|
34
|
+
numberField("reasoningTokens", "gen_ai.usage.reasoning.output_tokens", "sum"),
|
|
35
|
+
numberField("temperature", "gen_ai.request.temperature", "replace"),
|
|
36
|
+
numberField("topP", "gen_ai.request.top_p", "replace"),
|
|
37
|
+
numberField("maxTokens", "gen_ai.request.max_tokens", "replace"),
|
|
38
|
+
numberField("frequencyPenalty", "gen_ai.request.frequency_penalty", "replace"),
|
|
39
|
+
numberField("presencePenalty", "gen_ai.request.presence_penalty", "replace"),
|
|
40
|
+
numberField("seed", "gen_ai.request.seed", "replace")
|
|
41
|
+
];
|
|
42
|
+
function parseNumericAttribute(value) {
|
|
43
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : void 0;
|
|
44
|
+
if (typeof value !== "string" || value === "") return;
|
|
45
|
+
const num = Number(value);
|
|
46
|
+
return Number.isFinite(num) ? num : void 0;
|
|
47
|
+
}
|
|
82
48
|
/**
|
|
83
|
-
* Extracts
|
|
49
|
+
* Extracts {@link AIMetadata} from a span's attributes.
|
|
50
|
+
*
|
|
51
|
+
* Only the allowlisted {@link FIELD_SPECS} are read. Every other attribute is
|
|
52
|
+
* ignored. Numeric fields accept numbers and quoted numeric strings and are
|
|
53
|
+
* otherwise dropped, as OTLP/JSON may encode int64 as a quoted string. Text
|
|
54
|
+
* fields are dropped when empty.
|
|
84
55
|
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* convention supplies the same field, the highest-precedence value wins.
|
|
56
|
+
* Returns an empty object for spans carrying no recognised `gen_ai.*`
|
|
57
|
+
* attributes.
|
|
88
58
|
*
|
|
89
59
|
* @param attributes - The span attributes, as exposed by
|
|
90
60
|
* `ReadableSpan.attributes`.
|
|
91
61
|
*/
|
|
92
62
|
const extractAIMetadataFromAttributes = (attributes) => {
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
const existing = candidates[mapping.field];
|
|
97
|
-
if (!existing || mapping.convention < existing.convention) candidates[mapping.field] = {
|
|
98
|
-
value,
|
|
99
|
-
convention: mapping.convention
|
|
100
|
-
};
|
|
101
|
-
};
|
|
102
|
-
for (const [key, value] of Object.entries(attributes)) {
|
|
63
|
+
const metadata = {};
|
|
64
|
+
for (const spec of FIELD_SPECS) {
|
|
65
|
+
const value = attributes[spec.source];
|
|
103
66
|
if (value === void 0) continue;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
continue;
|
|
67
|
+
if (spec.valueType === "text") {
|
|
68
|
+
const text = typeof value === "string" ? value : String(value);
|
|
69
|
+
if (text !== "") metadata[spec.field] = text;
|
|
70
|
+
} else {
|
|
71
|
+
const num = parseNumericAttribute(value);
|
|
72
|
+
if (num !== void 0) metadata[spec.field] = num;
|
|
112
73
|
}
|
|
113
|
-
record(mapping, value);
|
|
114
|
-
}
|
|
115
|
-
const metadata = {};
|
|
116
|
-
const model = candidates.model?.value;
|
|
117
|
-
if (typeof model === "string" && model !== "") metadata.model = model;
|
|
118
|
-
const inputTokens = candidates.inputTokens?.value;
|
|
119
|
-
if (inputTokens !== void 0) {
|
|
120
|
-
const n = Number(inputTokens);
|
|
121
|
-
if (!Number.isNaN(n)) metadata.inputTokens = n;
|
|
122
74
|
}
|
|
123
75
|
return metadata;
|
|
124
76
|
};
|
|
125
77
|
/**
|
|
126
|
-
* Aggregates two {@link AIMetadata} values into
|
|
78
|
+
* Aggregates two {@link AIMetadata} values, folding a later call's metadata into
|
|
79
|
+
* an earlier accumulator for a single step.
|
|
80
|
+
*
|
|
81
|
+
* - Token-count fields (`merge: "sum"`) are **summed**, so a step that makes
|
|
82
|
+
* several LLM calls reports their combined usage.
|
|
83
|
+
* - Every other field uses `merge: "replace"` (`b` overwrites `a`)
|
|
127
84
|
*
|
|
128
|
-
*
|
|
129
|
-
* Each field is only present in the result when at least one input supplies it.
|
|
85
|
+
* A field is present in the result only when at least one input supplies it.
|
|
130
86
|
*
|
|
131
|
-
* @param a - The
|
|
132
|
-
* @param b - The
|
|
87
|
+
* @param a - The accumulator (earlier calls).
|
|
88
|
+
* @param b - The later metadata, whose values win on conflict (and add for sums).
|
|
133
89
|
*/
|
|
134
90
|
const aggregate = (a, b) => {
|
|
135
|
-
const
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
91
|
+
const out = { ...a };
|
|
92
|
+
for (const spec of FIELD_SPECS) if (spec.valueType === "number") {
|
|
93
|
+
const bValue = b[spec.field];
|
|
94
|
+
if (bValue === void 0) continue;
|
|
95
|
+
if (spec.merge === "sum") out[spec.field] = (out[spec.field] ?? 0) + bValue;
|
|
96
|
+
else out[spec.field] = bValue;
|
|
97
|
+
} else if (spec.valueType === "text") {
|
|
98
|
+
const bValue = b[spec.field];
|
|
99
|
+
if (bValue === void 0) continue;
|
|
100
|
+
out[spec.field] = bValue;
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
140
103
|
};
|
|
104
|
+
/** Converts a canonical camelCase field name to the server's snake_case key. */
|
|
105
|
+
const toSnakeCase = (field) => field.replace(/[A-Z]/g, (char) => `_${char.toLowerCase()}`);
|
|
141
106
|
/**
|
|
142
107
|
* Maps an {@link AIMetadata} value onto the server's `inngest.ai` metadata
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
108
|
+
* values, converting each canonical camelCase field to snake_case (e.g.
|
|
109
|
+
* `inputTokens` → `input_tokens`). Returns `undefined` when there is nothing to
|
|
110
|
+
* emit so callers can skip stamping metadata entirely.
|
|
146
111
|
*/
|
|
147
112
|
const toInngestAIMetadataValues = (metadata) => {
|
|
113
|
+
const entries = Object.entries(metadata);
|
|
114
|
+
if (entries.length === 0) return;
|
|
148
115
|
const values = {};
|
|
149
|
-
|
|
150
|
-
if (metadata.inputTokens !== void 0) values.input_tokens = metadata.inputTokens;
|
|
151
|
-
if (Object.keys(values).length === 0) return;
|
|
116
|
+
for (const [field, value] of entries) values[toSnakeCase(field)] = value;
|
|
152
117
|
return values;
|
|
153
118
|
};
|
|
154
119
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiExtractor.js","names":["counts: unknown","keyFieldMap: Record<string, Mapping>","candidates: Partial<Record<Field, Candidate>>","metadata: AIMetadata","values: Record<string, unknown>"],"sources":["../../../../src/components/execution/otel/aiExtractor.ts"],"sourcesContent":["import type { Attributes, AttributeValue } from \"@opentelemetry/api\";\n\n/**\n * AI metadata extracted from a span's attributes.\n *\n * A field is only present when a matching attribute was found on the span;\n * absent fields are omitted rather than zero-valued.\n */\nexport interface AIMetadata {\n /** The requested model, e.g. `gpt-4.1-nano`. */\n model?: string;\n /** The number of input (prompt) tokens consumed by the request. */\n inputTokens?: number;\n}\n\n/**\n * A `convention` identifies a namespace of AI span attributes and orders which\n * should win when multiple namespaces are present on the same span. Lower\n * numbers override higher numbers.\n */\nenum Convention {\n Langfuse = 1,\n Semconv = 2,\n OpenInference = 3,\n Vercel = 4,\n}\n\ntype Field = keyof AIMetadata;\n\ninterface Mapping {\n /**\n * The canonical {@link AIMetadata} field this attribute populates. Omitted\n * for composite attributes that only carry an {@link Mapping.expand}.\n */\n field?: Field;\n convention: Convention;\n /**\n * Composite attributes (e.g. a JSON blob of token counts) provide an\n * `expand` that explodes the raw value into synthetic scalar attributes,\n * each re-matched against {@link keyFieldMap}.\n */\n expand?: (value: AttributeValue) => Record<string, AttributeValue>;\n}\n\n/**\n * Prefix for the synthetic attributes produced by\n * {@link expandLangfuseUsageDetails}, kept distinct from any real attribute\n * namespace.\n */\nconst langfuseUsagePrefix = \"__langfuse.usage_details.\";\n\n/**\n * Parses the `langfuse.observation.usage_details` JSON blob (e.g.\n * `{\"input\":17,\"output\":36,\"total\":53}`) and emits a synthetic scalar\n * attribute for each count we track. Only `input` is emitted; the other counts\n * (output, total, cached, reasoning, …) are intentionally dropped since this\n * extractor tracks input tokens alone.\n */\nconst expandLangfuseUsageDetails = (\n value: AttributeValue,\n): Record<string, AttributeValue> => {\n if (typeof value !== \"string\" || value === \"\") {\n return {};\n }\n\n let counts: unknown;\n try {\n counts = JSON.parse(value);\n } catch {\n return {};\n }\n\n if (typeof counts !== \"object\" || counts === null) {\n return {};\n }\n\n const input = (counts as Record<string, unknown>).input;\n if (typeof input !== \"number\") {\n return {};\n }\n\n return { [`${langfuseUsagePrefix}input`]: input };\n};\n\n/**\n * Maps a source attribute key to the canonical {@link AIMetadata} field it\n * populates and the convention it belongs to.\n */\nconst keyFieldMap: Record<string, Mapping> = {\n // Langfuse (`langfuse.*` telemetry). Langfuse reports token usage as a single\n // JSON blob under `usage_details`; it is expanded into synthetic per-count\n // attributes that are matched back through this map. Langfuse only emits a\n // response model (not the requested model), which this extractor doesn't\n // track, so no `model` mapping is registered here. Langfuse outranks the\n // other conventions when several are present on one span.\n \"langfuse.observation.usage_details\": {\n convention: Convention.Langfuse,\n expand: expandLangfuseUsageDetails,\n },\n [`${langfuseUsagePrefix}input`]: {\n field: \"inputTokens\",\n convention: Convention.Langfuse,\n },\n\n // OpenTelemetry Semantic Conventions\n \"gen_ai.request.model\": { field: \"model\", convention: Convention.Semconv },\n \"gen_ai.usage.input_tokens\": {\n field: \"inputTokens\",\n convention: Convention.Semconv,\n },\n\n // OpenInference\n \"llm.model_name\": { field: \"model\", convention: Convention.OpenInference },\n \"llm.token_count.prompt\": {\n field: \"inputTokens\",\n convention: Convention.OpenInference,\n },\n\n // Vercel AI SDK (native `ai.*` telemetry)\n \"ai.model.id\": { field: \"model\", convention: Convention.Vercel },\n \"ai.usage.inputTokens\": {\n field: \"inputTokens\",\n convention: Convention.Vercel,\n },\n // Embeddings spans emit only a single `ai.usage.tokens` count (no\n // input/output split); map it to inputTokens to match the semconv embeddings\n // case.\n \"ai.usage.tokens\": { field: \"inputTokens\", convention: Convention.Vercel },\n};\n\ninterface Candidate {\n value: AttributeValue;\n convention: Convention;\n}\n\n/**\n * Extracts AI model metadata from a span's attributes.\n *\n * Attributes are matched across multiple instrumentation conventions\n * (OpenTelemetry semconv, OpenInference, Vercel AI SDK). When more than one\n * convention supplies the same field, the highest-precedence value wins.\n *\n * @param attributes - The span attributes, as exposed by\n * `ReadableSpan.attributes`.\n */\nexport const extractAIMetadataFromAttributes = (\n attributes: Attributes,\n): AIMetadata => {\n // Track the highest-precedence (lowest convention) candidate seen per field.\n const candidates: Partial<Record<Field, Candidate>> = {};\n\n const record = (mapping: Mapping, value: AttributeValue) => {\n if (!mapping.field) {\n return;\n }\n const existing = candidates[mapping.field];\n if (!existing || mapping.convention < existing.convention) {\n candidates[mapping.field] = { value, convention: mapping.convention };\n }\n };\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value === undefined) {\n continue;\n }\n\n const mapping = keyFieldMap[key];\n if (!mapping) {\n continue;\n }\n\n // Composite attribute: explode into synthetic children and match each back\n // through the map.\n if (mapping.expand) {\n for (const [childKey, childValue] of Object.entries(\n mapping.expand(value),\n )) {\n const childMapping = keyFieldMap[childKey];\n if (childMapping) {\n record(childMapping, childValue);\n }\n }\n continue;\n }\n\n record(mapping, value);\n }\n\n const metadata: AIMetadata = {};\n\n const model = candidates.model?.value;\n if (typeof model === \"string\" && model !== \"\") {\n metadata.model = model;\n }\n\n const inputTokens = candidates.inputTokens?.value;\n if (inputTokens !== undefined) {\n // Token counts arrive as numbers from the SDK, but OTLP/JSON encodes int64\n // as either a number or a quoted string, so coerce defensively.\n const n = Number(inputTokens);\n if (!Number.isNaN(n)) {\n metadata.inputTokens = n;\n }\n }\n\n return metadata;\n};\n\n/**\n * Aggregates two {@link AIMetadata} values into one.\n *\n * Input token counts are summed, while `a`'s model takes precedence over `b`'s.\n * Each field is only present in the result when at least one input supplies it.\n *\n * @param a - The primary metadata; its `model` wins when both are present.\n * @param b - The secondary metadata.\n */\nexport const aggregate = (a: AIMetadata, b: AIMetadata): AIMetadata => {\n const metadata: AIMetadata = {};\n\n const model = a.model ?? b.model;\n if (model !== undefined) {\n metadata.model = model;\n }\n\n if (a.inputTokens !== undefined || b.inputTokens !== undefined) {\n metadata.inputTokens = (a.inputTokens ?? 0) + (b.inputTokens ?? 0);\n }\n\n return metadata;\n};\n\n/**\n * Maps an {@link AIMetadata} value onto the server's `inngest.ai` metadata\n * schema (snake_case keys). Only the fields we extract are emitted; absent\n * fields are omitted rather than zero-valued. Returns `undefined` when there\n * is nothing to emit, so callers can skip stamping metadata entirely.\n */\nexport const toInngestAIMetadataValues = (\n metadata: AIMetadata,\n): Record<string, unknown> | undefined => {\n const values: Record<string, unknown> = {};\n\n if (metadata.model !== undefined) {\n values.model = metadata.model;\n }\n\n if (metadata.inputTokens !== undefined) {\n values.input_tokens = metadata.inputTokens;\n }\n\n if (Object.keys(values).length === 0) {\n return undefined;\n }\n\n return values;\n};\n"],"mappings":";;;;;;AAoBA,IAAK,oDAAL;AACE;AACA;AACA;AACA;;EAJG;;;;;;AA6BL,MAAM,sBAAsB;;;;;;;;AAS5B,MAAM,8BACJ,UACmC;AACnC,KAAI,OAAO,UAAU,YAAY,UAAU,GACzC,QAAO,EAAE;CAGX,IAAIA;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,MAAM;SACpB;AACN,SAAO,EAAE;;AAGX,KAAI,OAAO,WAAW,YAAY,WAAW,KAC3C,QAAO,EAAE;CAGX,MAAM,QAAS,OAAmC;AAClD,KAAI,OAAO,UAAU,SACnB,QAAO,EAAE;AAGX,QAAO,GAAG,GAAG,oBAAoB,SAAS,OAAO;;;;;;AAOnD,MAAMC,cAAuC;CAO3C,sCAAsC;EACpC,YAAY,WAAW;EACvB,QAAQ;EACT;EACA,GAAG,oBAAoB,SAAS;EAC/B,OAAO;EACP,YAAY,WAAW;EACxB;CAGD,wBAAwB;EAAE,OAAO;EAAS,YAAY,WAAW;EAAS;CAC1E,6BAA6B;EAC3B,OAAO;EACP,YAAY,WAAW;EACxB;CAGD,kBAAkB;EAAE,OAAO;EAAS,YAAY,WAAW;EAAe;CAC1E,0BAA0B;EACxB,OAAO;EACP,YAAY,WAAW;EACxB;CAGD,eAAe;EAAE,OAAO;EAAS,YAAY,WAAW;EAAQ;CAChE,wBAAwB;EACtB,OAAO;EACP,YAAY,WAAW;EACxB;CAID,mBAAmB;EAAE,OAAO;EAAe,YAAY,WAAW;EAAQ;CAC3E;;;;;;;;;;;AAiBD,MAAa,mCACX,eACe;CAEf,MAAMC,aAAgD,EAAE;CAExD,MAAM,UAAU,SAAkB,UAA0B;AAC1D,MAAI,CAAC,QAAQ,MACX;EAEF,MAAM,WAAW,WAAW,QAAQ;AACpC,MAAI,CAAC,YAAY,QAAQ,aAAa,SAAS,WAC7C,YAAW,QAAQ,SAAS;GAAE;GAAO,YAAY,QAAQ;GAAY;;AAIzE,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,EAAE;AACrD,MAAI,UAAU,OACZ;EAGF,MAAM,UAAU,YAAY;AAC5B,MAAI,CAAC,QACH;AAKF,MAAI,QAAQ,QAAQ;AAClB,QAAK,MAAM,CAAC,UAAU,eAAe,OAAO,QAC1C,QAAQ,OAAO,MAAM,CACtB,EAAE;IACD,MAAM,eAAe,YAAY;AACjC,QAAI,aACF,QAAO,cAAc,WAAW;;AAGpC;;AAGF,SAAO,SAAS,MAAM;;CAGxB,MAAMC,WAAuB,EAAE;CAE/B,MAAM,QAAQ,WAAW,OAAO;AAChC,KAAI,OAAO,UAAU,YAAY,UAAU,GACzC,UAAS,QAAQ;CAGnB,MAAM,cAAc,WAAW,aAAa;AAC5C,KAAI,gBAAgB,QAAW;EAG7B,MAAM,IAAI,OAAO,YAAY;AAC7B,MAAI,CAAC,OAAO,MAAM,EAAE,CAClB,UAAS,cAAc;;AAI3B,QAAO;;;;;;;;;;;AAYT,MAAa,aAAa,GAAe,MAA8B;CACrE,MAAMA,WAAuB,EAAE;CAE/B,MAAM,QAAQ,EAAE,SAAS,EAAE;AAC3B,KAAI,UAAU,OACZ,UAAS,QAAQ;AAGnB,KAAI,EAAE,gBAAgB,UAAa,EAAE,gBAAgB,OACnD,UAAS,eAAe,EAAE,eAAe,MAAM,EAAE,eAAe;AAGlE,QAAO;;;;;;;;AAST,MAAa,6BACX,aACwC;CACxC,MAAMC,SAAkC,EAAE;AAE1C,KAAI,SAAS,UAAU,OACrB,QAAO,QAAQ,SAAS;AAG1B,KAAI,SAAS,gBAAgB,OAC3B,QAAO,eAAe,SAAS;AAGjC,KAAI,OAAO,KAAK,OAAO,CAAC,WAAW,EACjC;AAGF,QAAO"}
|
|
1
|
+
{"version":3,"file":"aiExtractor.js","names":["metadata: AIMetadata","out: AIMetadata","values: Record<string, unknown>"],"sources":["../../../../src/components/execution/otel/aiExtractor.ts"],"sourcesContent":["import type { Attributes } from \"@opentelemetry/api\";\n\n/**\n * Canonical AI metadata extracted from a span's OpenTelemetry GenAI semantic\n * convention (`gen_ai.*`) attributes.\n *\n * The fields below are an explicit **allowlist**: only these are ever read from\n * a span (see {@link FIELD_SPECS}). Anything not mapped — prompt/response\n * content, messages, tool calls, embeddings payloads, and other\n * potentially-sensitive or bulky attributes — is not captured.\n *\n * For each category we describe how multiple AIMetadata values are aggregated\n * (see {@link aggregate}).\n */\nexport interface AIMetadata {\n // Identity & classification (last-write-wins).\n\n /** The requested model, e.g. `gpt-4.1-nano`. */\n requestModel?: string;\n /**\n * The model that actually served the request. This is often a dated snapshot\n * of the requested {@link AIMetadata.requestModel} (e.g.\n * `gpt-4.1-nano-2025-04-14`).\n */\n responseModel?: string;\n /** The AI provider that served the request (e.g. `openai`) */\n provider?: string;\n /** The provider's identifier for the response, e.g. `chatcmpl-...`. */\n responseId?: string;\n\n // Token usage (summed).\n\n /** The number of input tokens consumed by the request. */\n inputTokens?: number;\n /** The number of output tokens produced by the response. */\n outputTokens?: number;\n /** The total tokens consumed, as reported by the provider. */\n totalTokens?: number;\n /**\n * Cached input tokens read from the prompt cache. Providers differ on\n * accounting. OpenAI's cached tokens are a subset of\n * {@link AIMetadata.inputTokens}, Anthropic's are additive. Callers must\n * not assume a single relationship.\n */\n cacheReadTokens?: number;\n /** Tokens written to the prompt cache. */\n cacheCreationTokens?: number;\n /** Reasoning/thinking tokens, when the emitter reports them separately. */\n reasoningTokens?: number;\n\n // Request / inference parameters (last-write-wins). These describe the\n // request the caller made, not the response, and are stored raw as the\n // emitter reports them.\n\n /** Sampling temperature requested, e.g. `0.7`. */\n temperature?: number;\n /** Nucleus sampling probability mass requested (`top_p`), e.g. `0.9`. */\n topP?: number;\n /** Upper bound on tokens to generate (`max_tokens`). */\n maxTokens?: number;\n /** Frequency penalty requested. */\n frequencyPenalty?: number;\n /** Presence penalty requested. */\n presencePenalty?: number;\n /** Sampling seed requested, when the emitter reports it. */\n seed?: number;\n}\n\ntype ValueType = \"text\" | \"number\";\ntype MergeStrategy = \"replace\" | \"sum\";\n\n/**\n * Derives the subset of AIMetadata keys whose assigned value matches TValue.\n *\n * AIMetadata fields are optional (`model?: string`), so each field's type is\n * effectively `string | undefined` or `number | undefined`. `Exclude` removes\n * `undefined` before checking the value type, and `-?` prevents optional fields\n * from adding `undefined` back into the final key union.\n */\ntype FieldsWithValue<TValue> = {\n [TField in keyof AIMetadata]-?: Exclude<\n AIMetadata[TField],\n undefined\n > extends TValue\n ? TField\n : never;\n}[keyof AIMetadata];\n\ntype TextField = FieldsWithValue<string>;\ntype NumberField = FieldsWithValue<number>;\n\ninterface BaseFieldSpec {\n /** The source `gen_ai.*` attribute key. */\n source: string;\n valueType: ValueType;\n merge: MergeStrategy;\n}\n\ninterface TextFieldSpec extends BaseFieldSpec {\n /** The canonical {@link AIMetadata} field this populates. */\n field: TextField;\n valueType: \"text\";\n merge: \"replace\";\n}\n\ninterface NumberFieldSpec extends BaseFieldSpec {\n /** The canonical {@link AIMetadata} field this populates. */\n field: NumberField;\n valueType: \"number\";\n}\n\ntype FieldSpec = TextFieldSpec | NumberFieldSpec;\n\nfunction textField(field: TextField, source: string): TextFieldSpec {\n return {\n field,\n source,\n valueType: \"text\",\n merge: \"replace\",\n };\n}\n\nfunction numberField(\n field: NumberField,\n source: string,\n merge: MergeStrategy,\n): NumberFieldSpec {\n return {\n field,\n source,\n valueType: \"number\",\n merge,\n };\n}\n\n/**\n * Every `gen_ai.*` attribute we capture, mapped to its canonical field.\n *\n * Anything not listed here (prompt/response content, messages, tool calls,\n * unknown keys) is ignored.\n */\nexport const FIELD_SPECS = [\n // Identity & classification.\n textField(\"requestModel\", \"gen_ai.request.model\"),\n textField(\"responseModel\", \"gen_ai.response.model\"),\n textField(\"provider\", \"gen_ai.provider.name\"),\n textField(\"responseId\", \"gen_ai.response.id\"),\n\n // Token usage.\n numberField(\"inputTokens\", \"gen_ai.usage.input_tokens\", \"sum\"),\n numberField(\"outputTokens\", \"gen_ai.usage.output_tokens\", \"sum\"),\n numberField(\"totalTokens\", \"gen_ai.usage.total_tokens\", \"sum\"),\n numberField(\"cacheReadTokens\", \"gen_ai.usage.cache_read.input_tokens\", \"sum\"),\n numberField(\n \"cacheCreationTokens\",\n \"gen_ai.usage.cache_creation.input_tokens\",\n \"sum\",\n ),\n numberField(\"reasoningTokens\", \"gen_ai.usage.reasoning.output_tokens\", \"sum\"),\n\n // Request / inference parameters. These describe the request, not a quantity,\n // so they replace rather than sum when a step makes several calls.\n numberField(\"temperature\", \"gen_ai.request.temperature\", \"replace\"),\n numberField(\"topP\", \"gen_ai.request.top_p\", \"replace\"),\n numberField(\"maxTokens\", \"gen_ai.request.max_tokens\", \"replace\"),\n numberField(\n \"frequencyPenalty\",\n \"gen_ai.request.frequency_penalty\",\n \"replace\",\n ),\n numberField(\"presencePenalty\", \"gen_ai.request.presence_penalty\", \"replace\"),\n numberField(\"seed\", \"gen_ai.request.seed\", \"replace\"),\n] as const satisfies readonly FieldSpec[];\n\nfunction parseNumericAttribute(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (typeof value !== \"string\" || value === \"\") {\n return undefined;\n }\n\n const num = Number(value);\n return Number.isFinite(num) ? num : undefined;\n}\n\n/**\n * Extracts {@link AIMetadata} from a span's attributes.\n *\n * Only the allowlisted {@link FIELD_SPECS} are read. Every other attribute is\n * ignored. Numeric fields accept numbers and quoted numeric strings and are\n * otherwise dropped, as OTLP/JSON may encode int64 as a quoted string. Text\n * fields are dropped when empty.\n *\n * Returns an empty object for spans carrying no recognised `gen_ai.*`\n * attributes.\n *\n * @param attributes - The span attributes, as exposed by\n * `ReadableSpan.attributes`.\n */\nexport const extractAIMetadataFromAttributes = (\n attributes: Attributes,\n): AIMetadata => {\n const metadata: AIMetadata = {};\n\n for (const spec of FIELD_SPECS) {\n const value = attributes[spec.source];\n if (value === undefined) {\n continue;\n }\n\n if (spec.valueType === \"text\") {\n const text = typeof value === \"string\" ? value : String(value);\n if (text !== \"\") {\n metadata[spec.field] = text;\n }\n } else {\n const num = parseNumericAttribute(value);\n if (num !== undefined) {\n metadata[spec.field] = num;\n }\n }\n }\n\n return metadata;\n};\n\n/**\n * Aggregates two {@link AIMetadata} values, folding a later call's metadata into\n * an earlier accumulator for a single step.\n *\n * - Token-count fields (`merge: \"sum\"`) are **summed**, so a step that makes\n * several LLM calls reports their combined usage.\n * - Every other field uses `merge: \"replace\"` (`b` overwrites `a`)\n *\n * A field is present in the result only when at least one input supplies it.\n *\n * @param a - The accumulator (earlier calls).\n * @param b - The later metadata, whose values win on conflict (and add for sums).\n */\nexport const aggregate = (a: AIMetadata, b: AIMetadata): AIMetadata => {\n const out: AIMetadata = { ...a };\n\n for (const spec of FIELD_SPECS) {\n if (spec.valueType === \"number\") {\n const bValue = b[spec.field];\n if (bValue === undefined) {\n continue;\n }\n\n if (spec.merge === \"sum\") {\n out[spec.field] = (out[spec.field] ?? 0) + bValue;\n } else {\n out[spec.field] = bValue;\n }\n } else if (spec.valueType === \"text\") {\n // Text fields are always replace.\n const bValue = b[spec.field];\n if (bValue === undefined) {\n continue;\n }\n out[spec.field] = bValue;\n }\n }\n\n return out;\n};\n\n/** Converts a canonical camelCase field name to the server's snake_case key. */\nconst toSnakeCase = (field: string): string =>\n field.replace(/[A-Z]/g, (char) => `_${char.toLowerCase()}`);\n\n/**\n * Maps an {@link AIMetadata} value onto the server's `inngest.ai` metadata\n * values, converting each canonical camelCase field to snake_case (e.g.\n * `inputTokens` → `input_tokens`). Returns `undefined` when there is nothing to\n * emit so callers can skip stamping metadata entirely.\n */\nexport const toInngestAIMetadataValues = (\n metadata: AIMetadata,\n): Record<string, unknown> | undefined => {\n const entries = Object.entries(metadata);\n if (entries.length === 0) {\n return undefined;\n }\n\n const values: Record<string, unknown> = {};\n for (const [field, value] of entries) {\n values[toSnakeCase(field)] = value;\n }\n\n return values;\n};\n"],"mappings":";AAiHA,SAAS,UAAU,OAAkB,QAA+B;AAClE,QAAO;EACL;EACA;EACA,WAAW;EACX,OAAO;EACR;;AAGH,SAAS,YACP,OACA,QACA,OACiB;AACjB,QAAO;EACL;EACA;EACA,WAAW;EACX;EACD;;;;;;;;AASH,MAAa,cAAc;CAEzB,UAAU,gBAAgB,uBAAuB;CACjD,UAAU,iBAAiB,wBAAwB;CACnD,UAAU,YAAY,uBAAuB;CAC7C,UAAU,cAAc,qBAAqB;CAG7C,YAAY,eAAe,6BAA6B,MAAM;CAC9D,YAAY,gBAAgB,8BAA8B,MAAM;CAChE,YAAY,eAAe,6BAA6B,MAAM;CAC9D,YAAY,mBAAmB,wCAAwC,MAAM;CAC7E,YACE,uBACA,4CACA,MACD;CACD,YAAY,mBAAmB,wCAAwC,MAAM;CAI7E,YAAY,eAAe,8BAA8B,UAAU;CACnE,YAAY,QAAQ,wBAAwB,UAAU;CACtD,YAAY,aAAa,6BAA6B,UAAU;CAChE,YACE,oBACA,oCACA,UACD;CACD,YAAY,mBAAmB,mCAAmC,UAAU;CAC5E,YAAY,QAAQ,uBAAuB,UAAU;CACtD;AAED,SAAS,sBAAsB,OAAoC;AACjE,KAAI,OAAO,UAAU,SACnB,QAAO,OAAO,SAAS,MAAM,GAAG,QAAQ;AAG1C,KAAI,OAAO,UAAU,YAAY,UAAU,GACzC;CAGF,MAAM,MAAM,OAAO,MAAM;AACzB,QAAO,OAAO,SAAS,IAAI,GAAG,MAAM;;;;;;;;;;;;;;;;AAiBtC,MAAa,mCACX,eACe;CACf,MAAMA,WAAuB,EAAE;AAE/B,MAAK,MAAM,QAAQ,aAAa;EAC9B,MAAM,QAAQ,WAAW,KAAK;AAC9B,MAAI,UAAU,OACZ;AAGF,MAAI,KAAK,cAAc,QAAQ;GAC7B,MAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,MAAM;AAC9D,OAAI,SAAS,GACX,UAAS,KAAK,SAAS;SAEpB;GACL,MAAM,MAAM,sBAAsB,MAAM;AACxC,OAAI,QAAQ,OACV,UAAS,KAAK,SAAS;;;AAK7B,QAAO;;;;;;;;;;;;;;;AAgBT,MAAa,aAAa,GAAe,MAA8B;CACrE,MAAMC,MAAkB,EAAE,GAAG,GAAG;AAEhC,MAAK,MAAM,QAAQ,YACjB,KAAI,KAAK,cAAc,UAAU;EAC/B,MAAM,SAAS,EAAE,KAAK;AACtB,MAAI,WAAW,OACb;AAGF,MAAI,KAAK,UAAU,MACjB,KAAI,KAAK,UAAU,IAAI,KAAK,UAAU,KAAK;MAE3C,KAAI,KAAK,SAAS;YAEX,KAAK,cAAc,QAAQ;EAEpC,MAAM,SAAS,EAAE,KAAK;AACtB,MAAI,WAAW,OACb;AAEF,MAAI,KAAK,SAAS;;AAItB,QAAO;;;AAIT,MAAM,eAAe,UACnB,MAAM,QAAQ,WAAW,SAAS,IAAI,KAAK,aAAa,GAAG;;;;;;;AAQ7D,MAAa,6BACX,aACwC;CACxC,MAAM,UAAU,OAAO,QAAQ,SAAS;AACxC,KAAI,QAAQ,WAAW,EACrB;CAGF,MAAMC,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,OAAO,UAAU,QAC3B,QAAO,YAAY,MAAM,IAAI;AAG/B,QAAO"}
|
|
@@ -79,6 +79,11 @@ declare const extendedTracesMiddleware: ({
|
|
|
79
79
|
ctx: {
|
|
80
80
|
tracer: _opentelemetry_api0.Tracer;
|
|
81
81
|
event: Simplify<EventPayload>;
|
|
82
|
+
defer: DeferFn;
|
|
83
|
+
events: AsTuple<Simplify<EventPayload>>;
|
|
84
|
+
runId: string;
|
|
85
|
+
requestId?: string | undefined;
|
|
86
|
+
jobId?: string | undefined;
|
|
82
87
|
step: {
|
|
83
88
|
sendEvent: (idOrOptions: StepOptionsOrId, payload: SendEventPayload) => Promise<SendEventOutput<ClientOptions>>;
|
|
84
89
|
waitForSignal: <TData>(idOrOptions: StepOptionsOrId, opts: {
|
|
@@ -165,11 +170,6 @@ declare const extendedTracesMiddleware: ({
|
|
|
165
170
|
}) => InvocationResult<Jsonify<GetFunctionOutputRaw<TFunction>>>;
|
|
166
171
|
fetch: StepFetch;
|
|
167
172
|
};
|
|
168
|
-
defer: DeferFn;
|
|
169
|
-
events: AsTuple<Simplify<EventPayload>>;
|
|
170
|
-
runId: string;
|
|
171
|
-
requestId?: string | undefined;
|
|
172
|
-
jobId?: string | undefined;
|
|
173
173
|
group: ReturnType<typeof createGroupTools>;
|
|
174
174
|
attempt: number;
|
|
175
175
|
maxAttempts?: number | undefined;
|
|
@@ -79,6 +79,11 @@ declare const extendedTracesMiddleware: ({
|
|
|
79
79
|
ctx: {
|
|
80
80
|
tracer: _opentelemetry_api0.Tracer;
|
|
81
81
|
event: Simplify<EventPayload>;
|
|
82
|
+
defer: DeferFn;
|
|
83
|
+
events: AsTuple<Simplify<EventPayload>>;
|
|
84
|
+
runId: string;
|
|
85
|
+
requestId?: string | undefined;
|
|
86
|
+
jobId?: string | undefined;
|
|
82
87
|
step: {
|
|
83
88
|
sendEvent: (idOrOptions: StepOptionsOrId, payload: SendEventPayload) => Promise<SendEventOutput<ClientOptions>>;
|
|
84
89
|
waitForSignal: <TData>(idOrOptions: StepOptionsOrId, opts: {
|
|
@@ -165,11 +170,6 @@ declare const extendedTracesMiddleware: ({
|
|
|
165
170
|
}) => InvocationResult<Jsonify<GetFunctionOutputRaw<TFunction>>>;
|
|
166
171
|
fetch: StepFetch;
|
|
167
172
|
};
|
|
168
|
-
defer: DeferFn;
|
|
169
|
-
events: AsTuple<Simplify<EventPayload>>;
|
|
170
|
-
runId: string;
|
|
171
|
-
requestId?: string | undefined;
|
|
172
|
-
jobId?: string | undefined;
|
|
173
173
|
group: ReturnType<typeof createGroupTools>;
|
|
174
174
|
attempt: number;
|
|
175
175
|
maxAttempts?: number | undefined;
|
|
@@ -64,9 +64,9 @@ declare namespace Realtime {
|
|
|
64
64
|
stream_id: z.ZodOptional<z.ZodString>;
|
|
65
65
|
kind: z.ZodEnum<["step", "run", "data", "ping", "pong", "closing", "event", "sub", "unsub", "datastream-start", "datastream-end", "chunk"]>;
|
|
66
66
|
}, "strip", z.ZodTypeAny, {
|
|
67
|
-
kind: "data" | "event" | "run" | "step" | "
|
|
68
|
-
channel?: string | undefined;
|
|
67
|
+
kind: "data" | "event" | "run" | "step" | "ping" | "pong" | "closing" | "sub" | "unsub" | "datastream-start" | "datastream-end" | "chunk";
|
|
69
68
|
data?: any;
|
|
69
|
+
channel?: string | undefined;
|
|
70
70
|
topic?: string | undefined;
|
|
71
71
|
run_id?: string | undefined;
|
|
72
72
|
fn_id?: string | undefined;
|
|
@@ -74,9 +74,9 @@ declare namespace Realtime {
|
|
|
74
74
|
env_id?: string | undefined;
|
|
75
75
|
stream_id?: string | undefined;
|
|
76
76
|
}, {
|
|
77
|
-
kind: "data" | "event" | "run" | "step" | "
|
|
78
|
-
channel?: string | undefined;
|
|
77
|
+
kind: "data" | "event" | "run" | "step" | "ping" | "pong" | "closing" | "sub" | "unsub" | "datastream-start" | "datastream-end" | "chunk";
|
|
79
78
|
data?: any;
|
|
79
|
+
channel?: string | undefined;
|
|
80
80
|
topic?: string | undefined;
|
|
81
81
|
run_id?: string | undefined;
|
|
82
82
|
fn_id?: string | undefined;
|
|
@@ -85,7 +85,7 @@ declare namespace Realtime {
|
|
|
85
85
|
stream_id?: string | undefined;
|
|
86
86
|
}>, {
|
|
87
87
|
data: any;
|
|
88
|
-
kind: "data" | "event" | "run" | "step" | "
|
|
88
|
+
kind: "data" | "event" | "run" | "step" | "ping" | "pong" | "closing" | "sub" | "unsub" | "datastream-start" | "datastream-end" | "chunk";
|
|
89
89
|
channel?: string | undefined;
|
|
90
90
|
topic?: string | undefined;
|
|
91
91
|
run_id?: string | undefined;
|
|
@@ -94,9 +94,9 @@ declare namespace Realtime {
|
|
|
94
94
|
env_id?: string | undefined;
|
|
95
95
|
stream_id?: string | undefined;
|
|
96
96
|
}, {
|
|
97
|
-
kind: "data" | "event" | "run" | "step" | "
|
|
98
|
-
channel?: string | undefined;
|
|
97
|
+
kind: "data" | "event" | "run" | "step" | "ping" | "pong" | "closing" | "sub" | "unsub" | "datastream-start" | "datastream-end" | "chunk";
|
|
99
98
|
data?: any;
|
|
99
|
+
channel?: string | undefined;
|
|
100
100
|
topic?: string | undefined;
|
|
101
101
|
run_id?: string | undefined;
|
|
102
102
|
fn_id?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/components/realtime/types.ts"],"sourcesContent":[],"mappings":";;;;kBAGiB,QAAA;+BACqB,QAAA,CAAS;EAD9B,UAAA,SAAQ,CAAA;IAAA,UAAA,KAAA,CAAA,iBAKF,QAAA,CAAS,YALP,GAKsB,QAAA,CAAS,YAL/B,EAAA,gBAAA,MAAA,EAAA,GAAA,MAAA,EAAA,CAAA,CAAA;MACa,GAAA,CAAS,EAAA,MAAA,GAAA,SAAA;MAIxB,OAAS,EAKjB,QALiB;MAAe,MAAS,EAM1C,OAN0C;MAKzC,UAAA,CAAA,EAAA,MAAA;IACD;IAUR,UAAA,WAAA,CAAA;MAAe,GAAA,EAAS,MAAA;MACI,UAAA,CAAA,EAAA,MAAA;IAAxB;IAKoB,KAAA,uBAAA,CAAA,MAAA,CAAA,GANxB,MAMwB,SANT,QAAA,CAAS,WAMA,GALpB,QAAA,CAAS,cAKW,CALI,MAKJ,CAAA,GAAA,GAAA;IAAQ,KAAA,kBAAA,CAAA,wBAAR,KAAQ,GAAA,KAAA,EAAA,cAClB,QADkB,CACT,KAAA,CAAM,YADG,CACU,eADV,CAAA,CAAA,GAC8B,QAD9B,CAE9B,KAAA,CAAM,YAFwB,CAEX,eAFW,CAAA,CAAA,CAAA,GAI9B,cAJ8B,CAIf,KAJe,CAAA,GAAA;MACU;;;;;;MAGzB,aAAA,EAAA,EAOA,cAPA,CAOe,KAPf,CAAA;MAAf;;;;;;;;MAgCU,gBAAM,EAAA,EAfE,cAeF,CAfiB,UAejB,CAAA;MAAkC;;;MAQY,KAAA,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;MAK5D;;;MAKqB,WAAA,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;IACF,CAAA;IAAnB,KAAM,QAAA,CAAA,wBApBc,SAAA,CAAU,KAoBxB,GApBgC,SAAA,CAAU,KAoB1C,CAAA,GAAA,CAAA,OAAA,EAnBE,KAAA,CAAM,YAmBR,CAnBqB,eAmBrB,CAAA,EAAA,GAnB0C,YAmB1C,CAAA,IAAA,CAAA;IADyC,KAAA,oBAAQ,GAAA;MAIvD,KAAA,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;MAAe,WAAA,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;IACP,CAAA;IAAkB,UAAA,KAAA,CAAA;MAAe,KAAA,YAAA,CAAA,eAfL,KAeK,CAAA,GAfI,MAeJ,SAfmB,KAenB,CAAA,KAAA,SAAA,EAAA,GAAA,CAAA,GAVzC,QAUyC,GATzC,QAAA,CAAS,YASgC;MAGL,KAAA,cAAA,CAAA,eATvB,KASuB,EAAA,uBARf,MAQe,CAAA,MAAA,EAAA,OAAA,CAAA,GARW,OAAA,CAAQ,WAQnB,CAPpC,KAAA,CAAM,YAO8B,CAPjB,MAOiB,CAAA,CAAA,CAAA,GAJpC,MAIoC,SAJrB,KAIqB,CAAA,GAAA,EAAA,KAAA,QAAA,CAAA,GAAA,QAH5B,OAK2B,CAAA,MAAA,CAAA,GALT,cAKS,CALM,CAKN,CAAA,EAAb,GAAA,KAAA;MAAtB,KAAQ,YAAA,CAAA,eAF4B,KAE5B,CAAA,GAFqC,QAErC,CADV,QAAA,CAAS,OACC,CAAR,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,YAAd,CAA2B,MAA3B,CAAA,CAAA,EACR,KAAA,CAAM,cADE,CACa,MADb,CAAA,CAAA,CAAA;IACa;;QAFvB,aAAS,EAkBW,CAAA,CAAA,UAlBX,CAkBW,CAAA,CAAA,SAlBX,CAAA;IADsC,OAAA,eAAA,YAAA,CAAA;;;;;;;;;;;;;;;;;;;;;IAmB3B,
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/components/realtime/types.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -64,9 +64,9 @@ declare namespace Realtime {
|
|
|
64
64
|
stream_id: z.ZodOptional<z.ZodString>;
|
|
65
65
|
kind: z.ZodEnum<["step", "run", "data", "ping", "pong", "closing", "event", "sub", "unsub", "datastream-start", "datastream-end", "chunk"]>;
|
|
66
66
|
}, "strip", z.ZodTypeAny, {
|
|
67
|
-
kind: "data" | "event" | "run" | "step" | "
|
|
68
|
-
channel?: string | undefined;
|
|
67
|
+
kind: "data" | "event" | "run" | "step" | "ping" | "pong" | "closing" | "sub" | "unsub" | "datastream-start" | "datastream-end" | "chunk";
|
|
69
68
|
data?: any;
|
|
69
|
+
channel?: string | undefined;
|
|
70
70
|
topic?: string | undefined;
|
|
71
71
|
run_id?: string | undefined;
|
|
72
72
|
fn_id?: string | undefined;
|
|
@@ -74,9 +74,9 @@ declare namespace Realtime {
|
|
|
74
74
|
env_id?: string | undefined;
|
|
75
75
|
stream_id?: string | undefined;
|
|
76
76
|
}, {
|
|
77
|
-
kind: "data" | "event" | "run" | "step" | "
|
|
78
|
-
channel?: string | undefined;
|
|
77
|
+
kind: "data" | "event" | "run" | "step" | "ping" | "pong" | "closing" | "sub" | "unsub" | "datastream-start" | "datastream-end" | "chunk";
|
|
79
78
|
data?: any;
|
|
79
|
+
channel?: string | undefined;
|
|
80
80
|
topic?: string | undefined;
|
|
81
81
|
run_id?: string | undefined;
|
|
82
82
|
fn_id?: string | undefined;
|
|
@@ -85,7 +85,7 @@ declare namespace Realtime {
|
|
|
85
85
|
stream_id?: string | undefined;
|
|
86
86
|
}>, {
|
|
87
87
|
data: any;
|
|
88
|
-
kind: "data" | "event" | "run" | "step" | "
|
|
88
|
+
kind: "data" | "event" | "run" | "step" | "ping" | "pong" | "closing" | "sub" | "unsub" | "datastream-start" | "datastream-end" | "chunk";
|
|
89
89
|
channel?: string | undefined;
|
|
90
90
|
topic?: string | undefined;
|
|
91
91
|
run_id?: string | undefined;
|
|
@@ -94,9 +94,9 @@ declare namespace Realtime {
|
|
|
94
94
|
env_id?: string | undefined;
|
|
95
95
|
stream_id?: string | undefined;
|
|
96
96
|
}, {
|
|
97
|
-
kind: "data" | "event" | "run" | "step" | "
|
|
98
|
-
channel?: string | undefined;
|
|
97
|
+
kind: "data" | "event" | "run" | "step" | "ping" | "pong" | "closing" | "sub" | "unsub" | "datastream-start" | "datastream-end" | "chunk";
|
|
99
98
|
data?: any;
|
|
99
|
+
channel?: string | undefined;
|
|
100
100
|
topic?: string | undefined;
|
|
101
101
|
run_id?: string | undefined;
|
|
102
102
|
fn_id?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/components/realtime/types.ts"],"sourcesContent":[],"mappings":";;;;kBAGiB,QAAA;+BACqB,QAAA,CAAS;EAD9B,UAAA,SAAQ,CAAA;IAAA,UAAA,KAAA,CAAA,iBAKF,QAAA,CAAS,YALP,GAKsB,QAAA,CAAS,YAL/B,EAAA,gBAAA,MAAA,EAAA,GAAA,MAAA,EAAA,CAAA,CAAA;MACa,GAAA,CAAS,EAAA,MAAA,GAAA,SAAA;MAIxB,OAAS,EAKjB,QALiB;MAAe,MAAS,EAM1C,OAN0C;MAKzC,UAAA,CAAA,EAAA,MAAA;IACD;IAUR,UAAA,WAAA,CAAA;MAAe,GAAA,EAAS,MAAA;MACI,UAAA,CAAA,EAAA,MAAA;IAAxB;IAKoB,KAAA,uBAAA,CAAA,MAAA,CAAA,GANxB,MAMwB,SANT,QAAA,CAAS,WAMA,GALpB,QAAA,CAAS,cAKW,CALI,MAKJ,CAAA,GAAA,GAAA;IAAQ,KAAA,kBAAA,CAAA,wBAAR,KAAQ,GAAA,KAAA,EAAA,cAClB,QADkB,CACT,KAAA,CAAM,YADG,CACU,eADV,CAAA,CAAA,GAC8B,QAD9B,CAE9B,KAAA,CAAM,YAFwB,CAEX,eAFW,CAAA,CAAA,CAAA,GAI9B,cAJ8B,CAIf,KAJe,CAAA,GAAA;MACU;;;;;;MAGzB,aAAA,EAAA,EAOA,cAPA,CAOe,KAPf,CAAA;MAAf;;;;;;;;MAgCU,gBAAM,EAAA,EAfE,cAeF,CAfiB,UAejB,CAAA;MAAkC;;;MAQY,KAAA,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;MAK5D;;;MAKqB,WAAA,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;IACF,CAAA;IAAnB,KAAM,QAAA,CAAA,wBApBc,SAAA,CAAU,KAoBxB,GApBgC,SAAA,CAAU,KAoB1C,CAAA,GAAA,CAAA,OAAA,EAnBE,KAAA,CAAM,YAmBR,CAnBqB,eAmBrB,CAAA,EAAA,GAnB0C,YAmB1C,CAAA,IAAA,CAAA;IADyC,KAAA,oBAAQ,GAAA;MAIvD,KAAA,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;MAAe,WAAA,CAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;IACP,CAAA;IAAkB,UAAA,KAAA,CAAA;MAAe,KAAA,YAAA,CAAA,eAfL,KAeK,CAAA,GAfI,MAeJ,SAfmB,KAenB,CAAA,KAAA,SAAA,EAAA,GAAA,CAAA,GAVzC,QAUyC,GATzC,QAAA,CAAS,YASgC;MAGL,KAAA,cAAA,CAAA,eATvB,KASuB,EAAA,uBARf,MAQe,CAAA,MAAA,EAAA,OAAA,CAAA,GARW,OAAA,CAAQ,WAQnB,CAPpC,KAAA,CAAM,YAO8B,CAPjB,MAOiB,CAAA,CAAA,CAAA,GAJpC,MAIoC,SAJrB,KAIqB,CAAA,GAAA,EAAA,KAAA,QAAA,CAAA,GAAA,QAH5B,OAK2B,CAAA,MAAA,CAAA,GALT,cAKS,CALM,CAKN,CAAA,EAAb,GAAA,KAAA;MAAtB,KAAQ,YAAA,CAAA,eAF4B,KAE5B,CAAA,GAFqC,QAErC,CADV,QAAA,CAAS,OACC,CAAR,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,YAAd,CAA2B,MAA3B,CAAA,CAAA,EACR,KAAA,CAAM,cADE,CACa,MADb,CAAA,CAAA,CAAA;IACa;;QAFvB,aAAS,EAkBW,CAAA,CAAA,UAlBX,CAkBW,CAAA,CAAA,SAlBX,CAAA;IADsC,OAAA,eAAA,YAAA,CAAA;;;;;;;;;;;;;;;;;;;;;IAmB3B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/components/realtime/types.ts"],"sourcesContent":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "inngest",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.9.0",
|
|
4
4
|
"description": "Official SDK for Inngest.com. Inngest is the reliability layer for modern applications. Inngest combines durable execution, events, and queues into a zero-infra platform with built-in observability.",
|
|
5
5
|
"main": "./index.cjs",
|
|
6
6
|
"module": "./index.js",
|
package/types.d.cts
CHANGED
|
@@ -1449,12 +1449,12 @@ declare const functionConfigSchema: z.ZodObject<{
|
|
|
1449
1449
|
timeout: z.ZodOptional<z.ZodEffects<z.ZodString, "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s`, string>>;
|
|
1450
1450
|
}, "strict", z.ZodTypeAny, {
|
|
1451
1451
|
period: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s`;
|
|
1452
|
-
key?: string | undefined;
|
|
1453
1452
|
timeout?: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s` | undefined;
|
|
1453
|
+
key?: string | undefined;
|
|
1454
1454
|
}, {
|
|
1455
1455
|
period: string;
|
|
1456
|
-
key?: string | undefined;
|
|
1457
1456
|
timeout?: string | undefined;
|
|
1457
|
+
key?: string | undefined;
|
|
1458
1458
|
}>>;
|
|
1459
1459
|
timeouts: z.ZodOptional<z.ZodObject<{
|
|
1460
1460
|
start: z.ZodOptional<z.ZodEffects<z.ZodString, "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s`, string>>;
|
|
@@ -1556,8 +1556,8 @@ declare const functionConfigSchema: z.ZodObject<{
|
|
|
1556
1556
|
} | undefined;
|
|
1557
1557
|
debounce?: {
|
|
1558
1558
|
period: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s`;
|
|
1559
|
-
key?: string | undefined;
|
|
1560
1559
|
timeout?: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s` | undefined;
|
|
1560
|
+
key?: string | undefined;
|
|
1561
1561
|
} | undefined;
|
|
1562
1562
|
timeouts?: {
|
|
1563
1563
|
finish?: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s` | undefined;
|
|
@@ -1617,8 +1617,8 @@ declare const functionConfigSchema: z.ZodObject<{
|
|
|
1617
1617
|
} | undefined;
|
|
1618
1618
|
debounce?: {
|
|
1619
1619
|
period: string;
|
|
1620
|
-
key?: string | undefined;
|
|
1621
1620
|
timeout?: string | undefined;
|
|
1621
|
+
key?: string | undefined;
|
|
1622
1622
|
} | undefined;
|
|
1623
1623
|
timeouts?: {
|
|
1624
1624
|
finish?: string | undefined;
|
package/types.d.ts
CHANGED
|
@@ -1449,12 +1449,12 @@ declare const functionConfigSchema: z.ZodObject<{
|
|
|
1449
1449
|
timeout: z.ZodOptional<z.ZodEffects<z.ZodString, "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s`, string>>;
|
|
1450
1450
|
}, "strict", z.ZodTypeAny, {
|
|
1451
1451
|
period: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s`;
|
|
1452
|
-
key?: string | undefined;
|
|
1453
1452
|
timeout?: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s` | undefined;
|
|
1453
|
+
key?: string | undefined;
|
|
1454
1454
|
}, {
|
|
1455
1455
|
period: string;
|
|
1456
|
-
key?: string | undefined;
|
|
1457
1456
|
timeout?: string | undefined;
|
|
1457
|
+
key?: string | undefined;
|
|
1458
1458
|
}>>;
|
|
1459
1459
|
timeouts: z.ZodOptional<z.ZodObject<{
|
|
1460
1460
|
start: z.ZodOptional<z.ZodEffects<z.ZodString, "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s`, string>>;
|
|
@@ -1556,8 +1556,8 @@ declare const functionConfigSchema: z.ZodObject<{
|
|
|
1556
1556
|
} | undefined;
|
|
1557
1557
|
debounce?: {
|
|
1558
1558
|
period: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s`;
|
|
1559
|
-
key?: string | undefined;
|
|
1560
1559
|
timeout?: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s` | undefined;
|
|
1560
|
+
key?: string | undefined;
|
|
1561
1561
|
} | undefined;
|
|
1562
1562
|
timeouts?: {
|
|
1563
1563
|
finish?: "" | `${number}w` | `${number}d` | `${number}h` | `${number}m` | `${number}s` | `${number}m${number}s` | `${number}h${number}s` | `${number}h${number}m` | `${number}h${number}m${number}s` | `${number}d${number}s` | `${number}d${number}m` | `${number}d${number}m${number}s` | `${number}d${number}h` | `${number}d${number}h${number}s` | `${number}d${number}h${number}m` | `${number}d${number}h${number}m${number}s` | `${number}w${number}s` | `${number}w${number}m` | `${number}w${number}m${number}s` | `${number}w${number}h` | `${number}w${number}h${number}s` | `${number}w${number}h${number}m` | `${number}w${number}h${number}m${number}s` | `${number}w${number}d` | `${number}w${number}d${number}s` | `${number}w${number}d${number}m` | `${number}w${number}d${number}m${number}s` | `${number}w${number}d${number}h` | `${number}w${number}d${number}h${number}s` | `${number}w${number}d${number}h${number}m` | `${number}w${number}d${number}h${number}m${number}s` | undefined;
|
|
@@ -1617,8 +1617,8 @@ declare const functionConfigSchema: z.ZodObject<{
|
|
|
1617
1617
|
} | undefined;
|
|
1618
1618
|
debounce?: {
|
|
1619
1619
|
period: string;
|
|
1620
|
-
key?: string | undefined;
|
|
1621
1620
|
timeout?: string | undefined;
|
|
1621
|
+
key?: string | undefined;
|
|
1622
1622
|
} | undefined;
|
|
1623
1623
|
timeouts?: {
|
|
1624
1624
|
finish?: string | undefined;
|
package/version.cjs
CHANGED
package/version.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.cjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = \"4.
|
|
1
|
+
{"version":3,"file":"version.cjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = \"4.9.0\";\n"],"mappings":";;AACA,MAAa,UAAU"}
|
package/version.d.cts
CHANGED
package/version.d.ts
CHANGED
package/version.js
CHANGED
package/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = \"4.
|
|
1
|
+
{"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = \"4.9.0\";\n"],"mappings":";AACA,MAAa,UAAU"}
|