@arizeai/openinference-instrumentation-beeai 1.0.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/LICENSE +201 -0
- package/README.md +80 -0
- package/dist/esm/config.d.ts +39 -0
- package/dist/esm/config.d.ts.map +1 -0
- package/dist/esm/config.js +39 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/helpers/buildTraceTree.d.ts +21 -0
- package/dist/esm/helpers/buildTraceTree.d.ts.map +1 -0
- package/dist/esm/helpers/buildTraceTree.js +71 -0
- package/dist/esm/helpers/buildTraceTree.js.map +1 -0
- package/dist/esm/helpers/create-span.d.ts +32 -0
- package/dist/esm/helpers/create-span.d.ts.map +1 -0
- package/dist/esm/helpers/create-span.js +42 -0
- package/dist/esm/helpers/create-span.js.map +1 -0
- package/dist/esm/helpers/getErrorSafe.d.ts +17 -0
- package/dist/esm/helpers/getErrorSafe.d.ts.map +1 -0
- package/dist/esm/helpers/getErrorSafe.js +24 -0
- package/dist/esm/helpers/getErrorSafe.js.map +1 -0
- package/dist/esm/helpers/getSerializedObjectSafe.d.ts +18 -0
- package/dist/esm/helpers/getSerializedObjectSafe.d.ts.map +1 -0
- package/dist/esm/helpers/getSerializedObjectSafe.js +217 -0
- package/dist/esm/helpers/getSerializedObjectSafe.js.map +1 -0
- package/dist/esm/helpers/idNameManager.d.ts +31 -0
- package/dist/esm/helpers/idNameManager.d.ts.map +1 -0
- package/dist/esm/helpers/idNameManager.js +50 -0
- package/dist/esm/helpers/idNameManager.js.map +1 -0
- package/dist/esm/helpers/traceSerializer.d.ts +19 -0
- package/dist/esm/helpers/traceSerializer.d.ts.map +1 -0
- package/dist/esm/helpers/traceSerializer.js +35 -0
- package/dist/esm/helpers/traceSerializer.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/instrumentation.d.ts +34 -0
- package/dist/esm/instrumentation.d.ts.map +1 -0
- package/dist/esm/instrumentation.js +71 -0
- package/dist/esm/instrumentation.js.map +1 -0
- package/dist/esm/middleware.d.ts +27 -0
- package/dist/esm/middleware.d.ts.map +1 -0
- package/dist/esm/middleware.js +247 -0
- package/dist/esm/middleware.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +36 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +17 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esnext/config.d.ts +39 -0
- package/dist/esnext/config.d.ts.map +1 -0
- package/dist/esnext/config.js +39 -0
- package/dist/esnext/config.js.map +1 -0
- package/dist/esnext/helpers/buildTraceTree.d.ts +21 -0
- package/dist/esnext/helpers/buildTraceTree.d.ts.map +1 -0
- package/dist/esnext/helpers/buildTraceTree.js +57 -0
- package/dist/esnext/helpers/buildTraceTree.js.map +1 -0
- package/dist/esnext/helpers/create-span.d.ts +32 -0
- package/dist/esnext/helpers/create-span.d.ts.map +1 -0
- package/dist/esnext/helpers/create-span.js +37 -0
- package/dist/esnext/helpers/create-span.js.map +1 -0
- package/dist/esnext/helpers/getErrorSafe.d.ts +17 -0
- package/dist/esnext/helpers/getErrorSafe.d.ts.map +1 -0
- package/dist/esnext/helpers/getErrorSafe.js +24 -0
- package/dist/esnext/helpers/getErrorSafe.js.map +1 -0
- package/dist/esnext/helpers/getSerializedObjectSafe.d.ts +18 -0
- package/dist/esnext/helpers/getSerializedObjectSafe.d.ts.map +1 -0
- package/dist/esnext/helpers/getSerializedObjectSafe.js +165 -0
- package/dist/esnext/helpers/getSerializedObjectSafe.js.map +1 -0
- package/dist/esnext/helpers/idNameManager.d.ts +31 -0
- package/dist/esnext/helpers/idNameManager.d.ts.map +1 -0
- package/dist/esnext/helpers/idNameManager.js +50 -0
- package/dist/esnext/helpers/idNameManager.js.map +1 -0
- package/dist/esnext/helpers/traceSerializer.d.ts +19 -0
- package/dist/esnext/helpers/traceSerializer.d.ts.map +1 -0
- package/dist/esnext/helpers/traceSerializer.js +35 -0
- package/dist/esnext/helpers/traceSerializer.js.map +1 -0
- package/dist/esnext/index.d.ts +2 -0
- package/dist/esnext/index.d.ts.map +1 -0
- package/dist/esnext/index.js +2 -0
- package/dist/esnext/index.js.map +1 -0
- package/dist/esnext/instrumentation.d.ts +34 -0
- package/dist/esnext/instrumentation.d.ts.map +1 -0
- package/dist/esnext/instrumentation.js +71 -0
- package/dist/esnext/instrumentation.js.map +1 -0
- package/dist/esnext/middleware.d.ts +27 -0
- package/dist/esnext/middleware.d.ts.map +1 -0
- package/dist/esnext/middleware.js +241 -0
- package/dist/esnext/middleware.js.map +1 -0
- package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -0
- package/dist/esnext/types.d.ts +36 -0
- package/dist/esnext/types.d.ts.map +1 -0
- package/dist/esnext/types.js +17 -0
- package/dist/esnext/types.js.map +1 -0
- package/dist/examples/bee.d.ts +2 -0
- package/dist/examples/bee.d.ts.map +1 -0
- package/dist/examples/bee.js +35 -0
- package/dist/examples/bee.js.map +1 -0
- package/dist/examples/instrumentation.d.ts +2 -0
- package/dist/examples/instrumentation.d.ts.map +1 -0
- package/dist/examples/instrumentation.js +54 -0
- package/dist/examples/instrumentation.js.map +1 -0
- package/dist/src/config.d.ts +39 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +42 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/helpers/buildTraceTree.d.ts +21 -0
- package/dist/src/helpers/buildTraceTree.d.ts.map +1 -0
- package/dist/src/helpers/buildTraceTree.js +60 -0
- package/dist/src/helpers/buildTraceTree.js.map +1 -0
- package/dist/src/helpers/create-span.d.ts +32 -0
- package/dist/src/helpers/create-span.d.ts.map +1 -0
- package/dist/src/helpers/create-span.js +40 -0
- package/dist/src/helpers/create-span.js.map +1 -0
- package/dist/src/helpers/getErrorSafe.d.ts +17 -0
- package/dist/src/helpers/getErrorSafe.d.ts.map +1 -0
- package/dist/src/helpers/getErrorSafe.js +27 -0
- package/dist/src/helpers/getErrorSafe.js.map +1 -0
- package/dist/src/helpers/getSerializedObjectSafe.d.ts +18 -0
- package/dist/src/helpers/getSerializedObjectSafe.d.ts.map +1 -0
- package/dist/src/helpers/getSerializedObjectSafe.js +168 -0
- package/dist/src/helpers/getSerializedObjectSafe.js.map +1 -0
- package/dist/src/helpers/idNameManager.d.ts +31 -0
- package/dist/src/helpers/idNameManager.d.ts.map +1 -0
- package/dist/src/helpers/idNameManager.js +54 -0
- package/dist/src/helpers/idNameManager.js.map +1 -0
- package/dist/src/helpers/traceSerializer.d.ts +19 -0
- package/dist/src/helpers/traceSerializer.d.ts.map +1 -0
- package/dist/src/helpers/traceSerializer.js +38 -0
- package/dist/src/helpers/traceSerializer.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/instrumentation.d.ts +34 -0
- package/dist/src/instrumentation.d.ts.map +1 -0
- package/dist/src/instrumentation.js +76 -0
- package/dist/src/instrumentation.js.map +1 -0
- package/dist/src/middleware.d.ts +27 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/middleware.js +254 -0
- package/dist/src/middleware.js.map +1 -0
- package/dist/src/types.d.ts +36 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +18 -0
- package/dist/src/types.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +64 -0
- package/src/config.ts +48 -0
- package/src/helpers/buildTraceTree.ts +118 -0
- package/src/helpers/create-span.ts +66 -0
- package/src/helpers/getErrorSafe.ts +26 -0
- package/src/helpers/getSerializedObjectSafe.ts +325 -0
- package/src/helpers/idNameManager.ts +53 -0
- package/src/helpers/traceSerializer.ts +46 -0
- package/src/index.ts +1 -0
- package/src/instrumentation.ts +123 -0
- package/src/middleware.ts +318 -0
- package/src/types.ts +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { InstrumentationBase, InstrumentationNodeModuleDefinition, InstrumentationConfig } from "@opentelemetry/instrumentation";
|
|
2
|
+
import * as bee from "beeai-framework";
|
|
3
|
+
import { TraceConfigOptions } from "@arizeai/openinference-core";
|
|
4
|
+
/**
|
|
5
|
+
* function to check if instrumentation is enabled / disabled
|
|
6
|
+
*/
|
|
7
|
+
export declare function isPatched(): boolean;
|
|
8
|
+
export declare class BeeAIInstrumentation extends InstrumentationBase {
|
|
9
|
+
private oiTracer;
|
|
10
|
+
constructor({ instrumentationConfig, traceConfig, }?: {
|
|
11
|
+
/**
|
|
12
|
+
* The config for the instrumentation
|
|
13
|
+
* @see {@link InstrumentationConfig}
|
|
14
|
+
*/
|
|
15
|
+
instrumentationConfig?: InstrumentationConfig;
|
|
16
|
+
/**
|
|
17
|
+
* The OpenInference trace configuration. Can be used to mask or redact sensitive information on spans.
|
|
18
|
+
* @see {@link TraceConfigOptions}
|
|
19
|
+
*/
|
|
20
|
+
traceConfig?: TraceConfigOptions;
|
|
21
|
+
});
|
|
22
|
+
protected init(): InstrumentationNodeModuleDefinition;
|
|
23
|
+
/**
|
|
24
|
+
* Manually instruments the BeeAI module. This is needed when the module is not loaded via require (commonjs)
|
|
25
|
+
* @param {openai} module
|
|
26
|
+
*/
|
|
27
|
+
manuallyInstrument(module: typeof bee): void;
|
|
28
|
+
private patch;
|
|
29
|
+
/**
|
|
30
|
+
* Un-patches the OpenAI module's chat completions API
|
|
31
|
+
*/
|
|
32
|
+
private unpatch;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mCAAmC,EACnC,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAY,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAW3E;;GAEG;AACH,wBAAgB,SAAS,YAExB;AAED,qBAAa,oBAAqB,SAAQ,mBAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAW;gBAEf,EACV,qBAAqB,EACrB,WAAW,GACZ,GAAE;QACD;;;WAGG;QACH,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;QAC9C;;;WAGG;QACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;KAC7B;IASN,SAAS,CAAC,IAAI;IAWd;;;OAGG;IACH,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG;IAKrC,OAAO,CAAC,KAAK;IA+Bb;;OAEG;IACH,OAAO,CAAC,OAAO;CAehB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { InstrumentationBase, InstrumentationNodeModuleDefinition, } from "@opentelemetry/instrumentation";
|
|
2
|
+
import { diag } from "@opentelemetry/api";
|
|
3
|
+
import { Version } from "beeai-framework";
|
|
4
|
+
import { OITracer } from "@arizeai/openinference-core";
|
|
5
|
+
import { createTelemetryMiddleware } from "./middleware";
|
|
6
|
+
const MODULE_NAME = "beeai-framework";
|
|
7
|
+
/**
|
|
8
|
+
* Flag to check if the openai module has been patched
|
|
9
|
+
* Note: This is a fallback in case the module is made immutable (e.x. Deno, webpack, etc.)
|
|
10
|
+
*/
|
|
11
|
+
let _isOpenInferencePatched = false;
|
|
12
|
+
/**
|
|
13
|
+
* function to check if instrumentation is enabled / disabled
|
|
14
|
+
*/
|
|
15
|
+
export function isPatched() {
|
|
16
|
+
return _isOpenInferencePatched;
|
|
17
|
+
}
|
|
18
|
+
export class BeeAIInstrumentation extends InstrumentationBase {
|
|
19
|
+
constructor({ instrumentationConfig, traceConfig, } = {}) {
|
|
20
|
+
super("@arizeai/openinference-instrumentation-beeai", Version, Object.assign({}, instrumentationConfig));
|
|
21
|
+
this.oiTracer = new OITracer({ tracer: this.tracer, traceConfig });
|
|
22
|
+
}
|
|
23
|
+
init() {
|
|
24
|
+
const module = new InstrumentationNodeModuleDefinition(MODULE_NAME, ["0.*"], this.patch.bind(this), this.unpatch.bind(this));
|
|
25
|
+
return module;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Manually instruments the BeeAI module. This is needed when the module is not loaded via require (commonjs)
|
|
29
|
+
* @param {openai} module
|
|
30
|
+
*/
|
|
31
|
+
manuallyInstrument(module) {
|
|
32
|
+
diag.debug(`[BeeaiInstrumentation] Manually instrumenting ${MODULE_NAME}`);
|
|
33
|
+
this.patch(module);
|
|
34
|
+
}
|
|
35
|
+
patch(module) {
|
|
36
|
+
if (!(module === null || module === void 0 ? void 0 : module.BaseAgent)) {
|
|
37
|
+
diag.warn("[BeeaiInstrumentation] BaseAgent not found, skipping instrumentation.");
|
|
38
|
+
return module;
|
|
39
|
+
}
|
|
40
|
+
if ((module === null || module === void 0 ? void 0 : module.openInferencePatched) || _isOpenInferencePatched) {
|
|
41
|
+
return module;
|
|
42
|
+
}
|
|
43
|
+
diag.info("[BeeaiInstrumentation] Patching BaseAgent.run");
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
45
|
+
const instrumentation = this;
|
|
46
|
+
this._wrap(module.BaseAgent.prototype, "run", (original) => {
|
|
47
|
+
return function wrappedRun(...args) {
|
|
48
|
+
const returned = original.apply(this, args);
|
|
49
|
+
returned.middleware(createTelemetryMiddleware(instrumentation.oiTracer));
|
|
50
|
+
return returned;
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
return module;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Un-patches the OpenAI module's chat completions API
|
|
57
|
+
*/
|
|
58
|
+
unpatch(moduleExports, moduleVersion) {
|
|
59
|
+
diag.debug(`Removing patch for ${MODULE_NAME}@${moduleVersion}`);
|
|
60
|
+
this._unwrap(moduleExports.BaseAgent.prototype, "run");
|
|
61
|
+
_isOpenInferencePatched = false;
|
|
62
|
+
try {
|
|
63
|
+
// This can fail if the module is made immutable via the runtime or bundler
|
|
64
|
+
moduleExports.openInferencePatched = false;
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
diag.warn(`Failed to unset ${MODULE_NAME} patched flag on the module`, e);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 IBM Corp.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { OITracer } from "@arizeai/openinference-core";
|
|
17
|
+
import type { GetRunContext, RunInstance } from "beeai-framework/context";
|
|
18
|
+
export declare const activeTracesMap: Map<string, string>;
|
|
19
|
+
/**
|
|
20
|
+
* First we collect, filter and transform events from the beeai emitter to our internal framework spans in the `emitter.match("*.*"` block
|
|
21
|
+
* Some special data are collected in other `emitter.match` blocks like (history, response, rawPromt)
|
|
22
|
+
*
|
|
23
|
+
* Then we create the open telemetry spans when all data are collected. We are retroactively deleting some unnecessary internal spans
|
|
24
|
+
* see "emitter.match((event) => event.path === `${basePath}.run.${finishEventName}`" section
|
|
25
|
+
*/
|
|
26
|
+
export declare function createTelemetryMiddleware(tracer: OITracer): (context: GetRunContext<RunInstance, unknown>) => void;
|
|
27
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAWvD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAkB1E,eAAO,MAAM,eAAe,qBAA4B,CAAC;AAEzD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,QAAQ,aACvC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,UAsQrD"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 IBM Corp.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { getSerializedObjectSafe } from "./helpers/getSerializedObjectSafe";
|
|
17
|
+
import { createSpan } from "./helpers/create-span";
|
|
18
|
+
import { IdNameManager } from "./helpers/idNameManager";
|
|
19
|
+
import { getErrorSafe } from "./helpers/getErrorSafe";
|
|
20
|
+
import { findLast, isEmpty } from "remeda";
|
|
21
|
+
import { FrameworkError } from "beeai-framework/errors";
|
|
22
|
+
import { Version } from "beeai-framework/version";
|
|
23
|
+
import { Role } from "beeai-framework/backend/message";
|
|
24
|
+
import { traceSerializer } from "./helpers/traceSerializer";
|
|
25
|
+
import { errorLLMEventName, finishLLMEventName, INSTRUMENTATION_IGNORED_KEYS, newTokenLLMEventName, partialUpdateEventName, successLLMEventName, } from "./config";
|
|
26
|
+
import { createFullPath } from "beeai-framework/emitter/utils";
|
|
27
|
+
import { BaseAgent } from "beeai-framework/agents/base";
|
|
28
|
+
import { diag } from "@opentelemetry/api";
|
|
29
|
+
import { buildTraceTree } from "./helpers/buildTraceTree";
|
|
30
|
+
import { SemanticConventions } from "@arizeai/openinference-semantic-conventions";
|
|
31
|
+
export const activeTracesMap = new Map();
|
|
32
|
+
/**
|
|
33
|
+
* First we collect, filter and transform events from the beeai emitter to our internal framework spans in the `emitter.match("*.*"` block
|
|
34
|
+
* Some special data are collected in other `emitter.match` blocks like (history, response, rawPromt)
|
|
35
|
+
*
|
|
36
|
+
* Then we create the open telemetry spans when all data are collected. We are retroactively deleting some unnecessary internal spans
|
|
37
|
+
* see "emitter.match((event) => event.path === `${basePath}.run.${finishEventName}`" section
|
|
38
|
+
*/
|
|
39
|
+
export function createTelemetryMiddleware(tracer) {
|
|
40
|
+
return (context) => {
|
|
41
|
+
var _a, _b, _c, _d;
|
|
42
|
+
if (!((_b = (_a = context.emitter) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.id)) {
|
|
43
|
+
throw new FrameworkError(`Fatal error. Missing traceId`, [], { context });
|
|
44
|
+
}
|
|
45
|
+
const traceId = (_d = (_c = context.emitter) === null || _c === void 0 ? void 0 : _c.trace) === null || _d === void 0 ? void 0 : _d.id;
|
|
46
|
+
if (activeTracesMap.has(traceId)) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
activeTracesMap.set(traceId, context.instance.constructor.name);
|
|
50
|
+
diag.debug("createTelemetryMiddleware", {
|
|
51
|
+
source: context.instance.constructor.name,
|
|
52
|
+
traceId: traceId,
|
|
53
|
+
});
|
|
54
|
+
const { emitter, runParams, instance } = context;
|
|
55
|
+
const basePath = createFullPath(emitter.namespace, "");
|
|
56
|
+
let prompt = null;
|
|
57
|
+
if (instance instanceof BaseAgent) {
|
|
58
|
+
prompt = runParams[0].prompt;
|
|
59
|
+
}
|
|
60
|
+
const spansMap = new Map();
|
|
61
|
+
const parentIdsMap = new Map();
|
|
62
|
+
const spansToDeleteMap = new Map();
|
|
63
|
+
let generatedMessage = undefined;
|
|
64
|
+
let history = undefined;
|
|
65
|
+
const groupIterations = [];
|
|
66
|
+
const idNameManager = new IdNameManager();
|
|
67
|
+
const eventsIterationsMap = new Map();
|
|
68
|
+
const startTimeDate = new Date().getTime();
|
|
69
|
+
const startTimePerf = performance.now();
|
|
70
|
+
function convertDateToPerformance(date) {
|
|
71
|
+
return date.getTime() - startTimeDate + startTimePerf;
|
|
72
|
+
}
|
|
73
|
+
const serializer = traceSerializer({
|
|
74
|
+
ignored_keys: INSTRUMENTATION_IGNORED_KEYS,
|
|
75
|
+
});
|
|
76
|
+
function cleanSpanSources({ spanId }) {
|
|
77
|
+
var _a;
|
|
78
|
+
const parentId = (_a = spansMap.get(spanId)) === null || _a === void 0 ? void 0 : _a.parent_id;
|
|
79
|
+
if (!parentId) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const spanCount = parentIdsMap.get(parentId);
|
|
83
|
+
if (!spanCount) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (spanCount > 1) {
|
|
87
|
+
// increase the span count for the parentId
|
|
88
|
+
parentIdsMap.set(parentId, spanCount - 1);
|
|
89
|
+
}
|
|
90
|
+
else if (spanCount === 1) {
|
|
91
|
+
parentIdsMap.delete(parentId);
|
|
92
|
+
// check the `spansToDelete` if the span should be deleted when it has no children's
|
|
93
|
+
if (spansToDeleteMap.has(parentId)) {
|
|
94
|
+
spansMap.delete(parentId);
|
|
95
|
+
spansToDeleteMap.delete(parentId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create OpenTelemetry spans from collected data
|
|
101
|
+
*/
|
|
102
|
+
emitter.match((event) => event.path === `${basePath}.run.${finishLLMEventName}`, async (_, meta) => {
|
|
103
|
+
var _a;
|
|
104
|
+
try {
|
|
105
|
+
diag.debug("run finish event", { path: meta.path, traceId: traceId });
|
|
106
|
+
if (!prompt && instance instanceof BaseAgent) {
|
|
107
|
+
prompt = (_a = findLast(instance.memory.messages, (message) => message.role === Role.USER)) === null || _a === void 0 ? void 0 : _a.text;
|
|
108
|
+
if (!prompt) {
|
|
109
|
+
throw new FrameworkError("The prompt must be defined for the Agent's run", [], {
|
|
110
|
+
context,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// create tracer spans from collected data
|
|
115
|
+
buildTraceTree({
|
|
116
|
+
tracer,
|
|
117
|
+
data: {
|
|
118
|
+
prompt: prompt,
|
|
119
|
+
history,
|
|
120
|
+
generatedMessage,
|
|
121
|
+
spans: JSON.parse(serializer(Array.from(spansMap.values()))),
|
|
122
|
+
traceId,
|
|
123
|
+
version: Version,
|
|
124
|
+
runErrorSpanKey: `${basePath}.run.${errorLLMEventName}`,
|
|
125
|
+
startTime: startTimePerf,
|
|
126
|
+
endTime: performance.now(),
|
|
127
|
+
source: activeTracesMap.get(traceId),
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
diag.warn("Instrumentation error", e);
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
activeTracesMap.delete(traceId);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
/**
|
|
139
|
+
* This block collects all "not run category" events with their data and prepares spans for the OpenTelemetry.
|
|
140
|
+
* The huge number of `newToken` events are skipped and only the last one for each parent event is saved because of `generated_token_count` information
|
|
141
|
+
* The framework event tree structure is different from the open-telemetry tree structure and must be transformed from groupId and parentGroupId pattern via idNameManager
|
|
142
|
+
* The artificial "iteration" main tree level is computed from the `meta.groupId`
|
|
143
|
+
*/
|
|
144
|
+
emitter.match("*.*", (data, meta) => {
|
|
145
|
+
var _a, _b;
|
|
146
|
+
// allow `run.error` event due to the runtime error information
|
|
147
|
+
if (meta.path.includes(".run.") &&
|
|
148
|
+
meta.path !== `${basePath}.run.${errorLLMEventName}`) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// skip all new token events
|
|
152
|
+
if (meta.name === newTokenLLMEventName) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (!((_a = meta.trace) === null || _a === void 0 ? void 0 : _a.runId)) {
|
|
156
|
+
throw new FrameworkError(`Fatal error. Missing runId for event: ${meta.path}`, [], {
|
|
157
|
+
context,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* create groupId span level (id does not exist)
|
|
162
|
+
* I use only the top-level groups like iterations other nested groups like tokens would introduce unuseful complexity
|
|
163
|
+
*/
|
|
164
|
+
if (meta.groupId &&
|
|
165
|
+
!meta.trace.parentRunId &&
|
|
166
|
+
!groupIterations.includes(meta.groupId)) {
|
|
167
|
+
spansMap.set(meta.groupId, createSpan({
|
|
168
|
+
id: meta.groupId,
|
|
169
|
+
name: meta.groupId,
|
|
170
|
+
target: "groupId",
|
|
171
|
+
data: {
|
|
172
|
+
[SemanticConventions.OPENINFERENCE_SPAN_KIND]: "Chain",
|
|
173
|
+
},
|
|
174
|
+
startedAt: convertDateToPerformance(meta.createdAt),
|
|
175
|
+
}));
|
|
176
|
+
groupIterations.push(meta.groupId);
|
|
177
|
+
}
|
|
178
|
+
const { spanId, parentSpanId } = idNameManager.getIds({
|
|
179
|
+
path: meta.path,
|
|
180
|
+
id: meta.id,
|
|
181
|
+
runId: meta.trace.runId,
|
|
182
|
+
parentRunId: meta.trace.parentRunId,
|
|
183
|
+
groupId: meta.groupId,
|
|
184
|
+
});
|
|
185
|
+
const serializedData = getSerializedObjectSafe(data, meta);
|
|
186
|
+
// skip partialUpdate events with no data
|
|
187
|
+
if (meta.name === partialUpdateEventName && isEmpty(serializedData)) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const span = createSpan(Object.assign(Object.assign({ id: spanId, name: meta.name, target: meta.path }, (parentSpanId && { parent: { id: parentSpanId } })), { ctx: meta.context, data: serializedData, error: getErrorSafe(data), startedAt: convertDateToPerformance(meta.createdAt) }));
|
|
191
|
+
const lastIteration = groupIterations[groupIterations.length - 1];
|
|
192
|
+
// delete the `partialUpdate` event if does not have nested spans
|
|
193
|
+
const lastIterationEventSpanId = (_b = eventsIterationsMap
|
|
194
|
+
.get(lastIteration)) === null || _b === void 0 ? void 0 : _b.get(meta.name);
|
|
195
|
+
if (lastIterationEventSpanId &&
|
|
196
|
+
partialUpdateEventName === meta.name &&
|
|
197
|
+
spansMap.has(lastIterationEventSpanId)) {
|
|
198
|
+
const { context } = spansMap.get(lastIterationEventSpanId);
|
|
199
|
+
if (parentIdsMap.has(context.span_id)) {
|
|
200
|
+
spansToDeleteMap.set(lastIterationEventSpanId, undefined);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// delete span
|
|
204
|
+
cleanSpanSources({ spanId: lastIterationEventSpanId });
|
|
205
|
+
spansMap.delete(lastIterationEventSpanId);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// create new span
|
|
209
|
+
spansMap.set(span.context.span_id, span);
|
|
210
|
+
// update number of nested spans for parent_id if exists
|
|
211
|
+
if (span.parent_id) {
|
|
212
|
+
parentIdsMap.set(span.parent_id, (parentIdsMap.get(span.parent_id) || 0) + 1);
|
|
213
|
+
}
|
|
214
|
+
// save the last event for each iteration
|
|
215
|
+
if (groupIterations.length > 0) {
|
|
216
|
+
if (eventsIterationsMap.has(lastIteration)) {
|
|
217
|
+
eventsIterationsMap
|
|
218
|
+
.get(lastIteration)
|
|
219
|
+
.set(meta.name, span.context.span_id);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
eventsIterationsMap.set(lastIteration, new Map().set(meta.name, span.context.span_id));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
// The generated response and message history are collected from the `success` agent's event
|
|
227
|
+
emitter.match((event) => event.name === successLLMEventName &&
|
|
228
|
+
event.creator instanceof BaseAgent, (data) => {
|
|
229
|
+
const { data: dataObject, memory } = data;
|
|
230
|
+
generatedMessage = {
|
|
231
|
+
role: dataObject.role,
|
|
232
|
+
text: dataObject.text,
|
|
233
|
+
};
|
|
234
|
+
history = memory.messages.map((msg) => ({
|
|
235
|
+
text: msg.text,
|
|
236
|
+
role: msg.role,
|
|
237
|
+
}));
|
|
238
|
+
});
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/middleware.ts"],"names":[],"mappings":"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"}
|