@llm4ts/runner 2.30.0 → 2.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Otel.d.ts +16 -3
- package/dist/Otel.d.ts.map +1 -1
- package/dist/Otel.js +22 -8
- package/dist/Otel.js.map +1 -1
- package/package.json +3 -3
- package/src/Otel.ts +32 -9
package/dist/Otel.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as Duration from "effect/Duration";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import * as Layer from "effect/Layer";
|
|
4
|
+
import type * as HttpClient from "effect/http/HttpClient";
|
|
4
5
|
import * as OtlpExporter from "effect/observability/OtlpExporter";
|
|
5
6
|
export type OtelConfig = {
|
|
6
7
|
readonly mode: "off";
|
|
@@ -32,10 +33,16 @@ export declare const runnerVersion: string;
|
|
|
32
33
|
* traces and metrics from the standard variables for a generic endpoint.
|
|
33
34
|
* Logs are never exported. Export errors are the exporter's to swallow; the
|
|
34
35
|
* run never fails on them.
|
|
36
|
+
*
|
|
37
|
+
* Bodies are protobuf, OTLP/HTTP's default encoding and the only one Phoenix
|
|
38
|
+
* accepts: its traces endpoint answers 415 to `application/json`, and the
|
|
39
|
+
* exporter then drops every batch for a minute, at debug level.
|
|
35
40
|
*/
|
|
36
41
|
export declare const otelLayer: (config: OtelConfig, resource: OtelResource,
|
|
37
42
|
/** What the standard variables are read from in env mode (the run's environment). */
|
|
38
|
-
environment?: Readonly<Record<string, string | undefined
|
|
43
|
+
environment?: Readonly<Record<string, string | undefined>>,
|
|
44
|
+
/** The HTTP client the exporter posts with; fetch by default, a fake in tests. */
|
|
45
|
+
http?: Layer.Layer<HttpClient.HttpClient>) => Layer.Layer<OtlpExporter.Flusher>;
|
|
39
46
|
/**
|
|
40
47
|
* `layerFromConfig` exports nothing unless `OTEL_TRACES_EXPORTER` names
|
|
41
48
|
* `otlp`; an endpoint in the environment is the operator's intent, so the
|
|
@@ -52,6 +59,12 @@ export declare const otelSummary: (config: OtelConfig) => string | undefined;
|
|
|
52
59
|
export declare const otelWarning: (config: OtelConfig, answers: boolean | undefined) => string | undefined;
|
|
53
60
|
/** The doctor's line: `answers` is the probe's result, undefined when export is off. */
|
|
54
61
|
export declare const otelDoctorLine: (config: OtelConfig, answers: boolean | undefined) => string;
|
|
55
|
-
/**
|
|
56
|
-
export
|
|
62
|
+
/** How the probe posts: `fetch` in the runner, a fake in tests. */
|
|
63
|
+
export type Post = (url: string, init: RequestInit) => Promise<Response>;
|
|
64
|
+
/**
|
|
65
|
+
* Whether the endpoint takes what the exporter will send: an empty protobuf
|
|
66
|
+
* traces batch, answered 2xx. A refused connection, a 404 or a 415 (the
|
|
67
|
+
* answer Phoenix gives JSON) all count as "does not answer".
|
|
68
|
+
*/
|
|
69
|
+
export declare const probeOtelEndpoint: (config: OtelConfig, post?: Post) => Effect.Effect<boolean | undefined>;
|
|
57
70
|
//# sourceMappingURL=Otel.d.ts.map
|
package/dist/Otel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Otel.d.ts","sourceRoot":"","sources":["../src/Otel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,YAAY,MAAM,mCAAmC,CAAA;AAMjE,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvD,eAAO,MAAM,gBAAgB,oCAAoC,CAAA;AAOjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,UAmBF,CAAA;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,yFAAyF;AACzF,eAAO,MAAM,YAAY,mBAAsB,CAAA;AAE/C,oDAAoD;AACpD,eAAO,MAAM,aAAa,EAAE,MAAuB,CAAA;AAQnD
|
|
1
|
+
{"version":3,"file":"Otel.d.ts","sourceRoot":"","sources":["../src/Otel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,UAAU,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,YAAY,MAAM,mCAAmC,CAAA;AAMjE,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvD,eAAO,MAAM,gBAAgB,oCAAoC,CAAA;AAOjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,UAmBF,CAAA;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,yFAAyF;AACzF,eAAO,MAAM,YAAY,mBAAsB,CAAA;AAE/C,oDAAoD;AACpD,eAAO,MAAM,aAAa,EAAE,MAAuB,CAAA;AAQnD;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GACpB,QAAQ,UAAU,EAClB,UAAU,YAAY;AACtB,qFAAqF;AACrF,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe;AACvE,kFAAkF;AAClF,OAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAyB,KAC/D,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CA+BlC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,UAAU,EAClB,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQ3B,CAAA;AAEP,eAAO,MAAM,WAAW,GAAI,QAAQ,UAAU,KAAG,MAAM,GAAG,SASzD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,UAAU,EAClB,SAAS,OAAO,GAAG,SAAS,KAC3B,MAAM,GAAG,SAWX,CAAA;AAED,wFAAwF;AACxF,eAAO,MAAM,cAAc,GAAI,QAAQ,UAAU,EAAE,SAAS,OAAO,GAAG,SAAS,KAAG,MAcjF,CAAA;AAED,mEAAmE;AACnE,MAAM,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAExE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,UAAU,EAClB,OAAM,IAAsC,KAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,CAa7B,CAAA"}
|
package/dist/Otel.js
CHANGED
|
@@ -53,10 +53,16 @@ const resourceOf = (resource) => ({
|
|
|
53
53
|
* traces and metrics from the standard variables for a generic endpoint.
|
|
54
54
|
* Logs are never exported. Export errors are the exporter's to swallow; the
|
|
55
55
|
* run never fails on them.
|
|
56
|
+
*
|
|
57
|
+
* Bodies are protobuf, OTLP/HTTP's default encoding and the only one Phoenix
|
|
58
|
+
* accepts: its traces endpoint answers 415 to `application/json`, and the
|
|
59
|
+
* exporter then drops every batch for a minute, at debug level.
|
|
56
60
|
*/
|
|
57
61
|
export const otelLayer = (config, resource,
|
|
58
62
|
/** What the standard variables are read from in env mode (the run's environment). */
|
|
59
|
-
environment = process.env
|
|
63
|
+
environment = process.env,
|
|
64
|
+
/** The HTTP client the exporter posts with; fetch by default, a fake in tests. */
|
|
65
|
+
http = FetchHttpClient.layer) => {
|
|
60
66
|
switch (config.mode) {
|
|
61
67
|
case "off":
|
|
62
68
|
// The exporter's no-op flusher: nothing to export, nothing to flush.
|
|
@@ -66,12 +72,12 @@ environment = process.env) => {
|
|
|
66
72
|
url: config.tracesUrl,
|
|
67
73
|
resource: resourceOf(resource),
|
|
68
74
|
shutdownTimeout: flushTimeout
|
|
69
|
-
}).pipe(Layer.provide(OtlpSerialization.
|
|
75
|
+
}).pipe(Layer.provide(OtlpSerialization.layerProtobuf), Layer.provide(http));
|
|
70
76
|
case "env":
|
|
71
77
|
// The standard variables are read from the run's own environment, with
|
|
72
78
|
// the two exporter defaults an endpoint implies; the process env is
|
|
73
79
|
// never written.
|
|
74
|
-
return Layer.mergeAll(OtlpTracer.layerFromConfig({ resource: resourceOf(resource) }), OtlpMetrics.layerFromConfig({ resource: resourceOf(resource) })).pipe(Layer.provide(OtlpSerialization.
|
|
80
|
+
return Layer.mergeAll(OtlpTracer.layerFromConfig({ resource: resourceOf(resource) }), OtlpMetrics.layerFromConfig({ resource: resourceOf(resource) })).pipe(Layer.provide(OtlpSerialization.layerProtobuf), Layer.provide(http), Layer.provide(ConfigProvider.layer(ConfigProvider.fromEnvRecord({
|
|
75
81
|
...environment,
|
|
76
82
|
...otelEnvironmentDefaults(config, environment)
|
|
77
83
|
}))));
|
|
@@ -130,11 +136,19 @@ export const otelDoctorLine = (config, answers) => {
|
|
|
130
136
|
}
|
|
131
137
|
}
|
|
132
138
|
};
|
|
133
|
-
/**
|
|
134
|
-
|
|
139
|
+
/**
|
|
140
|
+
* Whether the endpoint takes what the exporter will send: an empty protobuf
|
|
141
|
+
* traces batch, answered 2xx. A refused connection, a 404 or a 415 (the
|
|
142
|
+
* answer Phoenix gives JSON) all count as "does not answer".
|
|
143
|
+
*/
|
|
144
|
+
export const probeOtelEndpoint = (config, post = (url, init) => fetch(url, init)) => config.mode === "off"
|
|
135
145
|
? Effect.succeed(undefined)
|
|
136
|
-
: Effect.tryPromise(() =>
|
|
137
|
-
method: "
|
|
146
|
+
: Effect.tryPromise(() => post(config.mode === "phoenix" ? config.tracesUrl : tracesUrlOf(config.endpoint), {
|
|
147
|
+
method: "POST",
|
|
148
|
+
headers: { "content-type": "application/x-protobuf" },
|
|
149
|
+
body: new Uint8Array(0),
|
|
138
150
|
signal: AbortSignal.timeout(1_500)
|
|
139
|
-
})).pipe(Effect.
|
|
151
|
+
})).pipe(Effect.map((response) => response.ok), Effect.orElseSucceed(() => false));
|
|
152
|
+
/** The traces URL the standard variables imply: a bare endpoint gets `/v1/traces`. */
|
|
153
|
+
const tracesUrlOf = (endpoint) => /\/v1\/traces\/?$/u.test(endpoint) ? endpoint : `${endpoint.replace(/\/+$/u, "")}/v1/traces`;
|
|
140
154
|
//# sourceMappingURL=Otel.js.map
|
package/dist/Otel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Otel.js","sourceRoot":"","sources":["../src/Otel.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,uEAAuE;AACvE,uEAAuE;AACvE,4EAA4E;AAC5E,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"Otel.js","sourceRoot":"","sources":["../src/Otel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llm4ts/runner",
|
|
3
|
-
"version": "2.30.
|
|
3
|
+
"version": "2.30.1",
|
|
4
4
|
"description": "Node runner, CLI, terminal, and MCP composition for llm4ts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -69,8 +69,8 @@
|
|
|
69
69
|
"typescript"
|
|
70
70
|
],
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@llm4ts/
|
|
73
|
-
"@llm4ts/
|
|
72
|
+
"@llm4ts/flow": "2.30.1",
|
|
73
|
+
"@llm4ts/core": "2.30.1"
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
76
|
"effect": "4.0.0"
|
package/src/Otel.ts
CHANGED
|
@@ -7,6 +7,7 @@ import * as Duration from "effect/Duration"
|
|
|
7
7
|
import * as Effect from "effect/Effect"
|
|
8
8
|
import * as Layer from "effect/Layer"
|
|
9
9
|
import * as FetchHttpClient from "effect/http/FetchHttpClient"
|
|
10
|
+
import type * as HttpClient from "effect/http/HttpClient"
|
|
10
11
|
import * as OtlpExporter from "effect/observability/OtlpExporter"
|
|
11
12
|
import * as OtlpMetrics from "effect/observability/OtlpMetrics"
|
|
12
13
|
import * as OtlpSerialization from "effect/observability/OtlpSerialization"
|
|
@@ -76,12 +77,18 @@ const resourceOf = (resource: OtelResource) => ({
|
|
|
76
77
|
* traces and metrics from the standard variables for a generic endpoint.
|
|
77
78
|
* Logs are never exported. Export errors are the exporter's to swallow; the
|
|
78
79
|
* run never fails on them.
|
|
80
|
+
*
|
|
81
|
+
* Bodies are protobuf, OTLP/HTTP's default encoding and the only one Phoenix
|
|
82
|
+
* accepts: its traces endpoint answers 415 to `application/json`, and the
|
|
83
|
+
* exporter then drops every batch for a minute, at debug level.
|
|
79
84
|
*/
|
|
80
85
|
export const otelLayer = (
|
|
81
86
|
config: OtelConfig,
|
|
82
87
|
resource: OtelResource,
|
|
83
88
|
/** What the standard variables are read from in env mode (the run's environment). */
|
|
84
|
-
environment: Readonly<Record<string, string | undefined>> = process.env
|
|
89
|
+
environment: Readonly<Record<string, string | undefined>> = process.env,
|
|
90
|
+
/** The HTTP client the exporter posts with; fetch by default, a fake in tests. */
|
|
91
|
+
http: Layer.Layer<HttpClient.HttpClient> = FetchHttpClient.layer
|
|
85
92
|
): Layer.Layer<OtlpExporter.Flusher> => {
|
|
86
93
|
switch (config.mode) {
|
|
87
94
|
case "off":
|
|
@@ -92,7 +99,7 @@ export const otelLayer = (
|
|
|
92
99
|
url: config.tracesUrl,
|
|
93
100
|
resource: resourceOf(resource),
|
|
94
101
|
shutdownTimeout: flushTimeout
|
|
95
|
-
}).pipe(Layer.provide(OtlpSerialization.
|
|
102
|
+
}).pipe(Layer.provide(OtlpSerialization.layerProtobuf), Layer.provide(http))
|
|
96
103
|
case "env":
|
|
97
104
|
// The standard variables are read from the run's own environment, with
|
|
98
105
|
// the two exporter defaults an endpoint implies; the process env is
|
|
@@ -101,8 +108,8 @@ export const otelLayer = (
|
|
|
101
108
|
OtlpTracer.layerFromConfig({ resource: resourceOf(resource) }),
|
|
102
109
|
OtlpMetrics.layerFromConfig({ resource: resourceOf(resource) })
|
|
103
110
|
).pipe(
|
|
104
|
-
Layer.provide(OtlpSerialization.
|
|
105
|
-
Layer.provide(
|
|
111
|
+
Layer.provide(OtlpSerialization.layerProtobuf),
|
|
112
|
+
Layer.provide(http),
|
|
106
113
|
Layer.provide(
|
|
107
114
|
ConfigProvider.layer(
|
|
108
115
|
ConfigProvider.fromEnvRecord({
|
|
@@ -183,16 +190,32 @@ export const otelDoctorLine = (config: OtelConfig, answers: boolean | undefined)
|
|
|
183
190
|
}
|
|
184
191
|
}
|
|
185
192
|
|
|
186
|
-
/**
|
|
187
|
-
export
|
|
193
|
+
/** How the probe posts: `fetch` in the runner, a fake in tests. */
|
|
194
|
+
export type Post = (url: string, init: RequestInit) => Promise<Response>
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Whether the endpoint takes what the exporter will send: an empty protobuf
|
|
198
|
+
* traces batch, answered 2xx. A refused connection, a 404 or a 415 (the
|
|
199
|
+
* answer Phoenix gives JSON) all count as "does not answer".
|
|
200
|
+
*/
|
|
201
|
+
export const probeOtelEndpoint = (
|
|
202
|
+
config: OtelConfig,
|
|
203
|
+
post: Post = (url, init) => fetch(url, init)
|
|
204
|
+
): Effect.Effect<boolean | undefined> =>
|
|
188
205
|
config.mode === "off"
|
|
189
206
|
? Effect.succeed(undefined)
|
|
190
207
|
: Effect.tryPromise(() =>
|
|
191
|
-
|
|
192
|
-
method: "
|
|
208
|
+
post(config.mode === "phoenix" ? config.tracesUrl : tracesUrlOf(config.endpoint), {
|
|
209
|
+
method: "POST",
|
|
210
|
+
headers: { "content-type": "application/x-protobuf" },
|
|
211
|
+
body: new Uint8Array(0),
|
|
193
212
|
signal: AbortSignal.timeout(1_500)
|
|
194
213
|
})
|
|
195
214
|
).pipe(
|
|
196
|
-
Effect.
|
|
215
|
+
Effect.map((response) => response.ok),
|
|
197
216
|
Effect.orElseSucceed(() => false)
|
|
198
217
|
)
|
|
218
|
+
|
|
219
|
+
/** The traces URL the standard variables imply: a bare endpoint gets `/v1/traces`. */
|
|
220
|
+
const tracesUrlOf = (endpoint: string): string =>
|
|
221
|
+
/\/v1\/traces\/?$/u.test(endpoint) ? endpoint : `${endpoint.replace(/\/+$/u, "")}/v1/traces`
|