@introspection-sdk/introspection-pi 0.6.2 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/instrument-agent.js +12 -5
- package/dist/instrument-agent.js.map +1 -1
- package/dist/instrument-stream.d.ts +13 -0
- package/dist/instrument-stream.d.ts.map +1 -1
- package/dist/instrument-stream.js +26 -6
- package/dist/instrument-stream.js.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -21,6 +21,6 @@ export { instrumentStream, type InstrumentStreamOptions, } from "./instrument-st
|
|
|
21
21
|
export { instrumentAgent, type AgentInstrumentation, type InstrumentAgentOptions, } from "./instrument-agent.js";
|
|
22
22
|
export { chatRequestAttributes, chatResponseAttributes, executeToolAttributes, executeToolResultAttribute, type AgentMeta, } from "./attributes.js";
|
|
23
23
|
export { assistantToOutputMessages, inputMessagesToMessages, messagesToInputMessages, systemPromptToInstructions, type ConvertOptions, } from "./convert.js";
|
|
24
|
-
export type { GenAiAttributes, InputMessage, MessagePart, MessageRole, OutputMessage, ReasoningPart, SystemInstruction, TextPart, ToolCallRequestPart, ToolCallResponsePart, ToolDefinition, } from "@introspection-sdk/types";
|
|
25
|
-
export { GenAi, GenAiSpanName, toAttributes } from "@introspection-sdk/types";
|
|
24
|
+
export type { AbortTerminationReason, GenAiAttributes, InputMessage, MessagePart, MessageRole, OutputMessage, ReasoningPart, SystemInstruction, TextPart, ToolCallRequestPart, ToolCallResponsePart, ToolDefinition, } from "@introspection-sdk/types";
|
|
25
|
+
export { GenAi, GenAiSpanName, IntrospectionAttr, toAttributes, } from "@introspection-sdk/types";
|
|
26
26
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,SAAS,GACf,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,SAAS,GACf,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,sBAAsB,EACtB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,EACL,aAAa,EACb,iBAAiB,EACjB,YAAY,GACb,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,5 +26,5 @@ export { chatRequestAttributes, chatResponseAttributes, executeToolAttributes, e
|
|
|
26
26
|
// from stored span attributes) and downstream consumers that want the raw
|
|
27
27
|
// semconv shapes.
|
|
28
28
|
export { assistantToOutputMessages, inputMessagesToMessages, messagesToInputMessages, systemPromptToInstructions, } from "./convert.js";
|
|
29
|
-
export { GenAi, GenAiSpanName, toAttributes } from "@introspection-sdk/types";
|
|
29
|
+
export { GenAi, GenAiSpanName, IntrospectionAttr, toAttributes, } from "@introspection-sdk/types";
|
|
30
30
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,kBAAkB;AAClB,OAAO,EACL,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,GAGhB,MAAM,uBAAuB,CAAC;AAE/B,gFAAgF;AAChF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAE3B,MAAM,iBAAiB,CAAC;AAEzB,6EAA6E;AAC7E,0EAA0E;AAC1E,kBAAkB;AAClB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,GAE3B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,kBAAkB;AAClB,OAAO,EACL,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,GAGhB,MAAM,uBAAuB,CAAC;AAE/B,gFAAgF;AAChF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAE3B,MAAM,iBAAiB,CAAC;AAEzB,6EAA6E;AAC7E,0EAA0E;AAC1E,kBAAkB;AAClB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,GAE3B,MAAM,cAAc,CAAC;AAiBtB,OAAO,EACL,KAAK,EACL,aAAa,EACb,iBAAiB,EACjB,YAAY,GACb,MAAM,0BAA0B,CAAC"}
|
package/dist/instrument-agent.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* tool call the loop runs.
|
|
4
4
|
*/
|
|
5
5
|
import { context as otelContext, SpanKind, SpanStatusCode, } from "@opentelemetry/api";
|
|
6
|
-
import { GenAiSpanName } from "@introspection-sdk/types";
|
|
6
|
+
import { GenAiSpanName, IntrospectionAttr } from "@introspection-sdk/types";
|
|
7
7
|
import { executeToolAttributes, executeToolResultAttribute, } from "./attributes.js";
|
|
8
8
|
/**
|
|
9
9
|
* Subscribe to {@link Agent.subscribe} and emit one `execute_tool ${name}`
|
|
@@ -17,8 +17,8 @@ import { executeToolAttributes, executeToolResultAttribute, } from "./attributes
|
|
|
17
17
|
export function instrumentAgent(agent, opts) {
|
|
18
18
|
const buildSpanName = opts.spanName ?? GenAiSpanName.executeTool;
|
|
19
19
|
const activeSpans = new Map();
|
|
20
|
-
const unsubscribe = agent.subscribe((event) => {
|
|
21
|
-
handleEvent(event, opts, activeSpans, buildSpanName);
|
|
20
|
+
const unsubscribe = agent.subscribe((event, signal) => {
|
|
21
|
+
handleEvent(event, opts, activeSpans, buildSpanName, signal);
|
|
22
22
|
});
|
|
23
23
|
return {
|
|
24
24
|
stop: () => {
|
|
@@ -31,7 +31,7 @@ export function instrumentAgent(agent, opts) {
|
|
|
31
31
|
},
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
-
function handleEvent(event, opts, activeSpans, buildSpanName) {
|
|
34
|
+
function handleEvent(event, opts, activeSpans, buildSpanName, signal) {
|
|
35
35
|
switch (event.type) {
|
|
36
36
|
case "tool_execution_start": {
|
|
37
37
|
const parentContext = opts.getParentContext?.() ?? otelContext.active();
|
|
@@ -50,7 +50,14 @@ function handleEvent(event, opts, activeSpans, buildSpanName) {
|
|
|
50
50
|
return;
|
|
51
51
|
activeSpans.delete(event.toolCallId);
|
|
52
52
|
span.setAttributes(executeToolResultAttribute(event.result));
|
|
53
|
-
if (event.isError) {
|
|
53
|
+
if (event.isError && signal?.aborted) {
|
|
54
|
+
// The run's AbortSignal fired: pi synthesizes "Operation aborted"
|
|
55
|
+
// error results for tool calls cut short by a requested abort. A
|
|
56
|
+
// cancelled tool call is an outcome, not a failure — status stays
|
|
57
|
+
// Unset, and the cancellation is queryable via the attribute.
|
|
58
|
+
span.setAttribute(IntrospectionAttr.TERMINATION_REASON, "cancelled");
|
|
59
|
+
}
|
|
60
|
+
else if (event.isError) {
|
|
54
61
|
span.setStatus({
|
|
55
62
|
code: SpanStatusCode.ERROR,
|
|
56
63
|
message: typeof event.result === "string"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-agent.js","sourceRoot":"","sources":["../src/instrument-agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,OAAO,IAAI,WAAW,EACtB,QAAQ,EACR,cAAc,GAKf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"instrument-agent.js","sourceRoot":"","sources":["../src/instrument-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { type Attributes, type Context as OtelContext, type Tracer } from "@opentelemetry/api";
|
|
6
6
|
import { type Api, type Context, type Model } from "@earendil-works/pi-ai";
|
|
7
7
|
import type { StreamFn } from "@earendil-works/pi-agent-core";
|
|
8
|
+
import { type AbortTerminationReason } from "@introspection-sdk/types";
|
|
8
9
|
import { type AgentMeta } from "./attributes.js";
|
|
9
10
|
export interface InstrumentStreamOptions {
|
|
10
11
|
/** Tracer to start the chat span on. */
|
|
@@ -32,6 +33,18 @@ export interface InstrumentStreamOptions {
|
|
|
32
33
|
* depend on the prose wrapper pi renders around the summary.
|
|
33
34
|
*/
|
|
34
35
|
getCompactionSummaries?: () => readonly string[];
|
|
36
|
+
/**
|
|
37
|
+
* Classify a stream that ended with stop reason `"aborted"` (the caller's
|
|
38
|
+
* AbortSignal fired mid-generation; pi never maps provider timeouts to
|
|
39
|
+
* `"aborted"`). Called at span end. Return the
|
|
40
|
+
* `introspection.termination_reason` to stamp on the span —
|
|
41
|
+
* `"cancelled"` (user/runtime stop) or `"awaiting_user"` (paused for an
|
|
42
|
+
* interrupt) — and the span ends with status Unset and no exception:
|
|
43
|
+
* a requested cancellation is an outcome, not a failure. Return `null`
|
|
44
|
+
* to keep the abort classified as an error (the host did not request
|
|
45
|
+
* this cancellation). When omitted, aborts default to `"cancelled"`.
|
|
46
|
+
*/
|
|
47
|
+
abortTerminationReason?: () => AbortTerminationReason | null;
|
|
35
48
|
}
|
|
36
49
|
/**
|
|
37
50
|
* Wrap a {@link StreamFn} to emit `chat ${provider}` spans.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-stream.d.ts","sourceRoot":"","sources":["../src/instrument-stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,OAAO,IAAI,WAAW,EAE3B,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,OAAO,EACZ,KAAK,KAAK,EACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"instrument-stream.d.ts","sourceRoot":"","sources":["../src/instrument-stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,OAAO,IAAI,WAAW,EAE3B,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,OAAO,EACZ,KAAK,KAAK,EACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,uBAAuB;IACtC,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,IAAI,EAAE,SAAS,CAAC;IAChB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;IACxD;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,UAAU,CAAC;IACtE,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IAC3D;;;;;;;OAOG;IACH,sBAAsB,CAAC,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;IACjD;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,EAAE,MAAM,sBAAsB,GAAG,IAAI,CAAC;CAC9D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,uBAAuB,GAC5B,QAAQ,CA0CV"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { context as otelContext, SpanKind, SpanStatusCode, trace, } from "@opentelemetry/api";
|
|
6
6
|
import { createAssistantMessageEventStream, } from "@earendil-works/pi-ai";
|
|
7
|
-
import { GenAiSpanName } from "@introspection-sdk/types";
|
|
7
|
+
import { GenAiSpanName, IntrospectionAttr, } from "@introspection-sdk/types";
|
|
8
8
|
import { chatRequestAttributes, chatResponseAttributes, } from "./attributes.js";
|
|
9
9
|
/**
|
|
10
10
|
* Wrap a {@link StreamFn} to emit `chat ${provider}` spans.
|
|
@@ -41,11 +41,12 @@ export function instrumentStream(streamFn, opts) {
|
|
|
41
41
|
spanContext,
|
|
42
42
|
span,
|
|
43
43
|
proxy,
|
|
44
|
+
abortTerminationReason: opts.abortTerminationReason,
|
|
44
45
|
});
|
|
45
46
|
return proxy;
|
|
46
47
|
});
|
|
47
48
|
}
|
|
48
|
-
async function runUpstream({ streamFn, model, context, options, spanContext, span, proxy, }) {
|
|
49
|
+
async function runUpstream({ streamFn, model, context, options, spanContext, span, proxy, abortTerminationReason, }) {
|
|
49
50
|
let finished = false;
|
|
50
51
|
try {
|
|
51
52
|
const upstream = await otelContext.with(spanContext, () => streamFn(model, context, options));
|
|
@@ -53,7 +54,7 @@ async function runUpstream({ streamFn, model, context, options, spanContext, spa
|
|
|
53
54
|
proxy.push(event);
|
|
54
55
|
if (!finished && (event.type === "done" || event.type === "error")) {
|
|
55
56
|
finished = true;
|
|
56
|
-
finishSpan(span, event);
|
|
57
|
+
finishSpan(span, event, abortTerminationReason);
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
}
|
|
@@ -68,7 +69,7 @@ async function runUpstream({ streamFn, model, context, options, spanContext, spa
|
|
|
68
69
|
proxy.push(errorEvent);
|
|
69
70
|
if (!finished) {
|
|
70
71
|
finished = true;
|
|
71
|
-
finishSpan(span, errorEvent);
|
|
72
|
+
finishSpan(span, errorEvent, abortTerminationReason);
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
finally {
|
|
@@ -80,10 +81,29 @@ async function runUpstream({ streamFn, model, context, options, spanContext, spa
|
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
|
-
function finishSpan(span, event) {
|
|
84
|
+
function finishSpan(span, event, abortTerminationReason) {
|
|
84
85
|
const message = event.type === "done" ? event.message : event.error;
|
|
85
86
|
span.setAttributes(chatResponseAttributes(message));
|
|
86
|
-
|
|
87
|
+
const aborted = (event.type === "error" && event.reason === "aborted") ||
|
|
88
|
+
message.stopReason === "aborted";
|
|
89
|
+
const terminationReason = !aborted
|
|
90
|
+
? null
|
|
91
|
+
: abortTerminationReason
|
|
92
|
+
? abortTerminationReason()
|
|
93
|
+
: "cancelled";
|
|
94
|
+
if (terminationReason !== null) {
|
|
95
|
+
// A requested cancellation is an outcome, not a failure: status stays
|
|
96
|
+
// Unset (no success assertion over a truncated generation, no error),
|
|
97
|
+
// no synthetic exception. finish_reasons=["aborted"] is already on the
|
|
98
|
+
// span via chatResponseAttributes.
|
|
99
|
+
span.setAttribute(IntrospectionAttr.TERMINATION_REASON, terminationReason);
|
|
100
|
+
}
|
|
101
|
+
else if (aborted ||
|
|
102
|
+
event.type === "error" ||
|
|
103
|
+
message.stopReason === "error") {
|
|
104
|
+
// An aborted stream lands here only when the host did not claim the
|
|
105
|
+
// abort (callback returned null) — fail toward a false error, never a
|
|
106
|
+
// hidden one.
|
|
87
107
|
const errorMessage = message.errorMessage ?? "Unknown error";
|
|
88
108
|
span.recordException(new Error(errorMessage));
|
|
89
109
|
span.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-stream.js","sourceRoot":"","sources":["../src/instrument-stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,OAAO,IAAI,WAAW,EACtB,QAAQ,EACR,cAAc,EACd,KAAK,GAKN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,iCAAiC,GAOlC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,
|
|
1
|
+
{"version":3,"file":"instrument-stream.js","sourceRoot":"","sources":["../src/instrument-stream.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@introspection-sdk/introspection-pi",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Introspection observability extension for the Pi Agent SDK — OTEL GenAI semantic-convention spans for chat completions and tool execution",
|
|
6
6
|
"type": "module",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@opentelemetry/api": "^1.9.1",
|
|
20
|
-
"@introspection-sdk/types": "0.6.
|
|
20
|
+
"@introspection-sdk/types": "0.6.4"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"@earendil-works/pi-ai": ">=0.75.0",
|
|
@@ -32,13 +32,13 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@earendil-works/pi-agent-core": "^0.
|
|
36
|
-
"@earendil-works/pi-ai": "^0.
|
|
35
|
+
"@earendil-works/pi-agent-core": "^0.80.2",
|
|
36
|
+
"@earendil-works/pi-ai": "^0.80.2",
|
|
37
37
|
"@types/node": "^22.20.0",
|
|
38
38
|
"eslint": "^9.39.4",
|
|
39
39
|
"typescript": "5.9.3",
|
|
40
|
-
"@repo/
|
|
41
|
-
"@repo/
|
|
40
|
+
"@repo/typescript-config": "0.0.0",
|
|
41
|
+
"@repo/eslint-config": "0.0.0"
|
|
42
42
|
},
|
|
43
43
|
"engines": {
|
|
44
44
|
"node": ">=22"
|