@cloudbase/agent-observability 1.0.1-alpha.27 → 1.0.1-alpha.29

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.
@@ -0,0 +1,80 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __esm = (fn, res) => function __init() {
6
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
+ };
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/core/constants.ts
23
+ import {
24
+ SemanticConventions,
25
+ OpenInferenceSpanKind
26
+ } from "@arizeai/openinference-semantic-conventions";
27
+ var OBSERVABILITY_TRACER_NAME, OBSERVABILITY_SDK_NAME, OBSERVABILITY_SDK_VERSION, OtelSpanAttributes;
28
+ var init_constants = __esm({
29
+ "src/core/constants.ts"() {
30
+ "use strict";
31
+ OBSERVABILITY_TRACER_NAME = "agui-tracer";
32
+ OBSERVABILITY_SDK_NAME = "observability";
33
+ OBSERVABILITY_SDK_VERSION = "0.1.0";
34
+ OtelSpanAttributes = {
35
+ // OpenInference - re-export all standard conventions
36
+ ...SemanticConventions,
37
+ // Trace attributes (non-standard)
38
+ TRACE_NAME: "trace.name",
39
+ TRACE_TAGS: "trace.tags",
40
+ TRACE_PUBLIC: "trace.public",
41
+ TRACE_METADATA: "trace.metadata",
42
+ TRACE_INPUT: "trace.input",
43
+ TRACE_OUTPUT: "trace.output",
44
+ // Observation attributes (non-standard)
45
+ OBSERVATION_TYPE: "observation.type",
46
+ OBSERVATION_LEVEL: "observation.level",
47
+ OBSERVATION_STATUS_MESSAGE: "observation.status_message",
48
+ OBSERVATION_INPUT: "observation.input",
49
+ OBSERVATION_OUTPUT: "observation.output",
50
+ OBSERVATION_METADATA: "observation.metadata",
51
+ // LLM-specific (non-standard)
52
+ LLM_COMPLETION_START_TIME: "llm.completion_start_time",
53
+ LLM_MODEL_PARAMETERS: "llm.model_parameters",
54
+ LLM_USAGE_DETAILS: "llm.usage_details",
55
+ LLM_COST_DETAILS: "llm.cost_details",
56
+ // Retriever-specific (non-standard)
57
+ RETRIEVER_NAME: "retriever.name",
58
+ RETRIEVER_QUERY: "retriever.query",
59
+ RETRIEVER_INDEX_ID: "retriever.index_id",
60
+ RETRIEVER_TOP_K: "retriever.top_k",
61
+ // General (non-standard)
62
+ ENVIRONMENT: "environment",
63
+ RELEASE: "release",
64
+ VERSION: "version"
65
+ };
66
+ }
67
+ });
68
+
69
+ export {
70
+ __esm,
71
+ __export,
72
+ __toCommonJS,
73
+ OpenInferenceSpanKind,
74
+ OBSERVABILITY_TRACER_NAME,
75
+ OBSERVABILITY_SDK_NAME,
76
+ OBSERVABILITY_SDK_VERSION,
77
+ OtelSpanAttributes,
78
+ init_constants
79
+ };
80
+ //# sourceMappingURL=chunk-PJ5HSKYS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/constants.ts"],"sourcesContent":["/**\n * OTEL attribute constants for observability.\n *\n * Uses OpenInference semantic conventions where applicable:\n * https://github.com/Arize-ai/openinference/tree/main/spec\n *\n * Falls back to non-standard attributes where OpenInference\n * doesn't define a standard.\n *\n * @module\n */\n\nimport {\n SemanticConventions,\n OpenInferenceSpanKind,\n} from \"@arizeai/openinference-semantic-conventions\";\n\n// Re-export OpenInference types for convenience\nexport { OpenInferenceSpanKind };\n\n/**\n * SDK information\n */\n// Brandless defaults: avoid emitting project-specific identifiers into traces.\n// Users can still override service.name via OTEL_SERVICE_NAME.\nexport const OBSERVABILITY_TRACER_NAME = \"agui-tracer\";\nexport const OBSERVABILITY_SDK_NAME = \"observability\";\nexport const OBSERVABILITY_SDK_VERSION = \"0.1.0\";\n\n/**\n * Combined attribute namespace for internal use\n * Provides a single namespace for all OTEL attributes used internally.\n *\n * Combines OpenInference SemanticConventions with non-standard attributes\n */\nexport const OtelSpanAttributes = {\n // OpenInference - re-export all standard conventions\n ...SemanticConventions,\n\n // Trace attributes (non-standard)\n TRACE_NAME: \"trace.name\",\n TRACE_TAGS: \"trace.tags\",\n TRACE_PUBLIC: \"trace.public\",\n TRACE_METADATA: \"trace.metadata\",\n TRACE_INPUT: \"trace.input\",\n TRACE_OUTPUT: \"trace.output\",\n\n // Observation attributes (non-standard)\n OBSERVATION_TYPE: \"observation.type\",\n OBSERVATION_LEVEL: \"observation.level\",\n OBSERVATION_STATUS_MESSAGE: \"observation.status_message\",\n OBSERVATION_INPUT: \"observation.input\",\n OBSERVATION_OUTPUT: \"observation.output\",\n OBSERVATION_METADATA: \"observation.metadata\",\n\n // LLM-specific (non-standard)\n LLM_COMPLETION_START_TIME: \"llm.completion_start_time\",\n LLM_MODEL_PARAMETERS: \"llm.model_parameters\",\n LLM_USAGE_DETAILS: \"llm.usage_details\",\n LLM_COST_DETAILS: \"llm.cost_details\",\n\n // Retriever-specific (non-standard)\n RETRIEVER_NAME: \"retriever.name\",\n RETRIEVER_QUERY: \"retriever.query\",\n RETRIEVER_INDEX_ID: \"retriever.index_id\",\n RETRIEVER_TOP_K: \"retriever.top_k\",\n\n // General (non-standard)\n ENVIRONMENT: \"environment\",\n RELEASE: \"release\",\n VERSION: \"version\",\n} as const;\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAYA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAfP,IAyBa,2BACA,wBACA,2BAQA;AAnCb;AAAA;AAAA;AAyBO,IAAM,4BAA4B;AAClC,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B;AAQlC,IAAM,qBAAqB;AAAA;AAAA,MAEhC,GAAG;AAAA;AAAA,MAGH,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,cAAc;AAAA;AAAA,MAGd,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,4BAA4B;AAAA,MAC5B,mBAAmB;AAAA,MACnB,oBAAoB;AAAA,MACpB,sBAAsB;AAAA;AAAA,MAGtB,2BAA2B;AAAA,MAC3B,sBAAsB;AAAA,MACtB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA;AAAA,MAGlB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA;AAAA,MAGjB,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA;AAAA;","names":[]}
@@ -1,57 +1,16 @@
1
1
  import {
2
+ OBSERVABILITY_SDK_NAME,
3
+ OBSERVABILITY_SDK_VERSION,
4
+ OpenInferenceSpanKind,
5
+ OtelSpanAttributes,
2
6
  __esm,
3
7
  __export,
4
- __toCommonJS
5
- } from "./chunk-NFEGQTCC.mjs";
6
-
7
- // src/core/constants.ts
8
- import {
9
- SemanticConventions,
10
- OpenInferenceSpanKind
11
- } from "@arizeai/openinference-semantic-conventions";
12
- var OBSERVABILITY_SDK_NAME, OBSERVABILITY_SDK_VERSION, OtelSpanAttributes;
13
- var init_constants = __esm({
14
- "src/core/constants.ts"() {
15
- "use strict";
16
- OBSERVABILITY_SDK_NAME = "observability";
17
- OBSERVABILITY_SDK_VERSION = "0.1.0";
18
- OtelSpanAttributes = {
19
- // OpenInference - re-export all standard conventions
20
- ...SemanticConventions,
21
- // Trace attributes (non-standard)
22
- TRACE_NAME: "trace.name",
23
- TRACE_TAGS: "trace.tags",
24
- TRACE_PUBLIC: "trace.public",
25
- TRACE_METADATA: "trace.metadata",
26
- TRACE_INPUT: "trace.input",
27
- TRACE_OUTPUT: "trace.output",
28
- // Observation attributes (non-standard)
29
- OBSERVATION_TYPE: "observation.type",
30
- OBSERVATION_LEVEL: "observation.level",
31
- OBSERVATION_STATUS_MESSAGE: "observation.status_message",
32
- OBSERVATION_INPUT: "observation.input",
33
- OBSERVATION_OUTPUT: "observation.output",
34
- OBSERVATION_METADATA: "observation.metadata",
35
- // LLM-specific (non-standard)
36
- LLM_COMPLETION_START_TIME: "llm.completion_start_time",
37
- LLM_MODEL_PARAMETERS: "llm.model_parameters",
38
- LLM_USAGE_DETAILS: "llm.usage_details",
39
- LLM_COST_DETAILS: "llm.cost_details",
40
- // Retriever-specific (non-standard)
41
- RETRIEVER_NAME: "retriever.name",
42
- RETRIEVER_QUERY: "retriever.query",
43
- RETRIEVER_INDEX_ID: "retriever.index_id",
44
- RETRIEVER_TOP_K: "retriever.top_k",
45
- // General (non-standard)
46
- ENVIRONMENT: "environment",
47
- RELEASE: "release",
48
- VERSION: "version"
49
- };
50
- }
51
- });
8
+ __toCommonJS,
9
+ init_constants
10
+ } from "./chunk-PJ5HSKYS.mjs";
52
11
 
53
12
  // src/core/attributes.ts
54
- import { SemanticConventions as SemanticConventions2 } from "@arizeai/openinference-semantic-conventions";
13
+ import { SemanticConventions } from "@arizeai/openinference-semantic-conventions";
55
14
  function createTraceAttributes({
56
15
  name,
57
16
  userId,
@@ -98,23 +57,23 @@ function createObservationAttributes(type, attributes) {
98
57
  } = attributes;
99
58
  const spanKind = OpenInferenceSpanKind[type.toUpperCase()] || "CHAIN";
100
59
  const otelAttributes = {
101
- [SemanticConventions2.OPENINFERENCE_SPAN_KIND]: spanKind,
60
+ [SemanticConventions.OPENINFERENCE_SPAN_KIND]: spanKind,
102
61
  [OtelSpanAttributes.OBSERVATION_TYPE]: type,
103
62
  [OtelSpanAttributes.OBSERVATION_LEVEL]: level,
104
63
  [OtelSpanAttributes.OBSERVATION_STATUS_MESSAGE]: statusMessage,
105
64
  [OtelSpanAttributes.VERSION]: version,
106
65
  // Use OpenInference input.value convention
107
- [SemanticConventions2.INPUT_VALUE]: _serialize(input),
66
+ [SemanticConventions.INPUT_VALUE]: _serialize(input),
108
67
  // Also set observation.input for compatibility
109
68
  [OtelSpanAttributes.OBSERVATION_INPUT]: _serialize(input),
110
69
  // Use OpenInference output.value convention
111
- [SemanticConventions2.OUTPUT_VALUE]: _serialize(output),
70
+ [SemanticConventions.OUTPUT_VALUE]: _serialize(output),
112
71
  // Also set observation.output for compatibility
113
72
  [OtelSpanAttributes.OBSERVATION_OUTPUT]: _serialize(output)
114
73
  };
115
74
  if (type === "llm") {
116
75
  if (model) {
117
- otelAttributes[SemanticConventions2.LLM_MODEL_NAME] = model;
76
+ otelAttributes[SemanticConventions.LLM_MODEL_NAME] = model;
118
77
  }
119
78
  const system = attributes?.system;
120
79
  const provider = attributes?.provider;
@@ -123,26 +82,26 @@ function createObservationAttributes(type, attributes) {
123
82
  const inputMimeType = attributes?.inputMimeType;
124
83
  const outputMimeType = attributes?.outputMimeType;
125
84
  if (system !== void 0) {
126
- otelAttributes[SemanticConventions2.LLM_SYSTEM] = String(system);
85
+ otelAttributes[SemanticConventions.LLM_SYSTEM] = String(system);
127
86
  }
128
87
  if (provider !== void 0) {
129
- otelAttributes[SemanticConventions2.LLM_PROVIDER] = String(provider);
88
+ otelAttributes[SemanticConventions.LLM_PROVIDER] = String(provider);
130
89
  }
131
90
  if (modelParameters) {
132
- otelAttributes[SemanticConventions2.LLM_INVOCATION_PARAMETERS] = _serialize(modelParameters);
91
+ otelAttributes[SemanticConventions.LLM_INVOCATION_PARAMETERS] = _serialize(modelParameters);
133
92
  otelAttributes[OtelSpanAttributes.LLM_MODEL_PARAMETERS] = _serialize(modelParameters);
134
93
  }
135
94
  if (usageDetails) {
136
95
  if (typeof usageDetails === "object") {
137
96
  const usage = usageDetails;
138
97
  if (usage.promptTokens !== void 0) {
139
- otelAttributes[SemanticConventions2.LLM_TOKEN_COUNT_PROMPT] = usage.promptTokens;
98
+ otelAttributes[SemanticConventions.LLM_TOKEN_COUNT_PROMPT] = usage.promptTokens;
140
99
  }
141
100
  if (usage.completionTokens !== void 0) {
142
- otelAttributes[SemanticConventions2.LLM_TOKEN_COUNT_COMPLETION] = usage.completionTokens;
101
+ otelAttributes[SemanticConventions.LLM_TOKEN_COUNT_COMPLETION] = usage.completionTokens;
143
102
  }
144
103
  if (usage.totalTokens !== void 0) {
145
- otelAttributes[SemanticConventions2.LLM_TOKEN_COUNT_TOTAL] = usage.totalTokens;
104
+ otelAttributes[SemanticConventions.LLM_TOKEN_COUNT_TOTAL] = usage.totalTokens;
146
105
  }
147
106
  }
148
107
  otelAttributes[OtelSpanAttributes.LLM_USAGE_DETAILS] = _serialize(usageDetails);
@@ -159,18 +118,18 @@ function createObservationAttributes(type, attributes) {
159
118
  Object.assign(otelAttributes, messageAttrs);
160
119
  }
161
120
  if (inputMimeType !== void 0) {
162
- otelAttributes[SemanticConventions2.INPUT_MIME_TYPE] = String(inputMimeType);
121
+ otelAttributes[SemanticConventions.INPUT_MIME_TYPE] = String(inputMimeType);
163
122
  }
164
123
  if (outputMimeType !== void 0) {
165
- otelAttributes[SemanticConventions2.OUTPUT_MIME_TYPE] = String(outputMimeType);
124
+ otelAttributes[SemanticConventions.OUTPUT_MIME_TYPE] = String(outputMimeType);
166
125
  }
167
126
  }
168
127
  if (type === "embedding") {
169
128
  if (model) {
170
- otelAttributes[SemanticConventions2.EMBEDDING_MODEL_NAME] = model;
129
+ otelAttributes[SemanticConventions.EMBEDDING_MODEL_NAME] = model;
171
130
  }
172
131
  if (modelParameters) {
173
- otelAttributes[SemanticConventions2.LLM_INVOCATION_PARAMETERS] = _serialize(modelParameters);
132
+ otelAttributes[SemanticConventions.LLM_INVOCATION_PARAMETERS] = _serialize(modelParameters);
174
133
  }
175
134
  }
176
135
  if (type === "tool") {
@@ -179,13 +138,13 @@ function createObservationAttributes(type, attributes) {
179
138
  const toolParameters = attributes?.toolParameters;
180
139
  const toolCall = attributes?.toolCall;
181
140
  if (toolName !== void 0) {
182
- otelAttributes[SemanticConventions2.TOOL_NAME] = String(toolName);
141
+ otelAttributes[SemanticConventions.TOOL_NAME] = String(toolName);
183
142
  }
184
143
  if (toolDescription !== void 0) {
185
- otelAttributes[SemanticConventions2.TOOL_DESCRIPTION] = String(toolDescription);
144
+ otelAttributes[SemanticConventions.TOOL_DESCRIPTION] = String(toolDescription);
186
145
  }
187
146
  if (toolParameters !== void 0) {
188
- otelAttributes[SemanticConventions2.TOOL_PARAMETERS] = _serialize(toolParameters);
147
+ otelAttributes[SemanticConventions.TOOL_PARAMETERS] = _serialize(toolParameters);
189
148
  }
190
149
  if (toolCall !== void 0 && typeof toolCall === "object") {
191
150
  const toolCallAttrs = _flattenToolCall(toolCall);
@@ -195,7 +154,7 @@ function createObservationAttributes(type, attributes) {
195
154
  if (type === "agent") {
196
155
  const agentName = attributes?.agentName;
197
156
  if (agentName !== void 0) {
198
- otelAttributes[SemanticConventions2.AGENT_NAME] = String(agentName);
157
+ otelAttributes[SemanticConventions.AGENT_NAME] = String(agentName);
199
158
  }
200
159
  }
201
160
  if (type === "retriever") {
@@ -211,7 +170,7 @@ function createObservationAttributes(type, attributes) {
211
170
  }
212
171
  const metadataAttrs = _flattenAndSerializeMetadata(
213
172
  metadata,
214
- SemanticConventions2.METADATA
173
+ SemanticConventions.METADATA
215
174
  );
216
175
  Object.assign(otelAttributes, metadataAttrs);
217
176
  const obsetvabilityMetadataAttrs = _flattenAndSerializeMetadata(
@@ -780,7 +739,7 @@ __export(src_exports, {
780
739
  validateTraceContext: () => validateTraceContext,
781
740
  validateTraceId: () => validateTraceId
782
741
  });
783
- import { trace as trace2, context as context2, SpanStatusCode as SpanStatusCode2 } from "@opentelemetry/api";
742
+ import { trace as trace2, context as context2, SpanStatusCode as SpanStatusCode2, INVALID_SPAN_CONTEXT } from "@opentelemetry/api";
784
743
  function createOtelSpan(params) {
785
744
  return getTracer().startSpan(
786
745
  params.name,
@@ -795,63 +754,98 @@ function createParentContext(parentSpanContext) {
795
754
  if (!parentSpanContext) return;
796
755
  return trace2.setSpanContext(context2.active(), parentSpanContext);
797
756
  }
798
- function startObservation(name, attributes, options) {
799
- const { asType = "chain", ...observationOptions } = options || {};
800
- const otelSpan = createOtelSpan({
801
- name,
802
- ...observationOptions
803
- });
757
+ function createNoopSpan() {
758
+ return trace2.wrapSpanContext(INVALID_SPAN_CONTEXT);
759
+ }
760
+ function createNoopObservation(asType = "chain") {
761
+ const otelSpan = createNoopSpan();
804
762
  switch (asType) {
805
763
  case "llm":
806
- return new ObservationLLM({
807
- otelSpan,
808
- attributes
809
- });
764
+ return new ObservationLLM({ otelSpan });
810
765
  case "embedding":
811
- return new ObservationEmbedding({
812
- otelSpan,
813
- attributes
814
- });
766
+ return new ObservationEmbedding({ otelSpan });
815
767
  case "agent":
816
- return new ObservationAgent({
817
- otelSpan,
818
- attributes
819
- });
768
+ return new ObservationAgent({ otelSpan });
820
769
  case "tool":
821
- return new ObservationTool({
822
- otelSpan,
823
- attributes
824
- });
825
- case "chain":
826
- return new ObservationChain({
827
- otelSpan,
828
- attributes
829
- });
770
+ return new ObservationTool({ otelSpan });
830
771
  case "retriever":
831
- return new ObservationRetriever({
832
- otelSpan,
833
- attributes
834
- });
772
+ return new ObservationRetriever({ otelSpan });
835
773
  case "reranker":
836
- return new ObservationReranker({
837
- otelSpan,
838
- attributes
839
- });
774
+ return new ObservationReranker({ otelSpan });
840
775
  case "evaluator":
841
- return new ObservationEvaluator({
842
- otelSpan,
843
- attributes
844
- });
776
+ return new ObservationEvaluator({ otelSpan });
845
777
  case "guardrail":
846
- return new ObservationGuardrail({
847
- otelSpan,
848
- attributes
849
- });
778
+ return new ObservationGuardrail({ otelSpan });
779
+ case "chain":
850
780
  default:
851
- return new ObservationChain({
852
- otelSpan,
853
- attributes
854
- });
781
+ return new ObservationChain({ otelSpan });
782
+ }
783
+ }
784
+ function startObservation(name, attributes, options) {
785
+ const { asType = "chain", ...observationOptions } = options || {};
786
+ try {
787
+ const otelSpan = createOtelSpan({
788
+ name,
789
+ ...observationOptions
790
+ });
791
+ switch (asType) {
792
+ case "llm":
793
+ return new ObservationLLM({
794
+ otelSpan,
795
+ attributes
796
+ });
797
+ case "embedding":
798
+ return new ObservationEmbedding({
799
+ otelSpan,
800
+ attributes
801
+ });
802
+ case "agent":
803
+ return new ObservationAgent({
804
+ otelSpan,
805
+ attributes
806
+ });
807
+ case "tool":
808
+ return new ObservationTool({
809
+ otelSpan,
810
+ attributes
811
+ });
812
+ case "chain":
813
+ return new ObservationChain({
814
+ otelSpan,
815
+ attributes
816
+ });
817
+ case "retriever":
818
+ return new ObservationRetriever({
819
+ otelSpan,
820
+ attributes
821
+ });
822
+ case "reranker":
823
+ return new ObservationReranker({
824
+ otelSpan,
825
+ attributes
826
+ });
827
+ case "evaluator":
828
+ return new ObservationEvaluator({
829
+ otelSpan,
830
+ attributes
831
+ });
832
+ case "guardrail":
833
+ return new ObservationGuardrail({
834
+ otelSpan,
835
+ attributes
836
+ });
837
+ default:
838
+ return new ObservationChain({
839
+ otelSpan,
840
+ attributes
841
+ });
842
+ }
843
+ } catch (err) {
844
+ console.warn(
845
+ `[Observability] Failed to create observation "${name}":`,
846
+ err instanceof Error ? err.message : err
847
+ );
848
+ return createNoopObservation(asType);
855
849
  }
856
850
  }
857
851
  function updateActiveTrace(attributes) {
@@ -892,67 +886,81 @@ function wrapPromise(promise, span, endOnExit) {
892
886
  }
893
887
  function startActiveObservation(name, fn, options) {
894
888
  const { asType = "chain", endOnExit, ...observationOptions } = options || {};
895
- return getTracer().startActiveSpan(
896
- name,
897
- { startTime: observationOptions?.startTime },
898
- createParentContext(observationOptions?.parentSpanContext) ?? context2.active(),
899
- (span) => {
900
- try {
901
- let observation;
902
- switch (asType) {
903
- case "llm":
904
- observation = new ObservationLLM({ otelSpan: span });
905
- break;
906
- case "embedding":
907
- observation = new ObservationEmbedding({ otelSpan: span });
908
- break;
909
- case "agent":
910
- observation = new ObservationAgent({ otelSpan: span });
911
- break;
912
- case "tool":
913
- observation = new ObservationTool({ otelSpan: span });
914
- break;
915
- case "retriever":
916
- observation = new ObservationRetriever({ otelSpan: span });
917
- break;
918
- case "reranker":
919
- observation = new ObservationReranker({ otelSpan: span });
920
- break;
921
- case "evaluator":
922
- observation = new ObservationEvaluator({ otelSpan: span });
923
- break;
924
- case "guardrail":
925
- observation = new ObservationGuardrail({ otelSpan: span });
926
- break;
927
- case "chain":
928
- default:
929
- observation = new ObservationChain({ otelSpan: span });
930
- }
931
- const result = fn(observation);
932
- if (result instanceof Promise) {
933
- return wrapPromise(
934
- result,
935
- span,
936
- endOnExit
937
- );
938
- } else {
889
+ let fnCalled = false;
890
+ try {
891
+ return getTracer().startActiveSpan(
892
+ name,
893
+ { startTime: observationOptions?.startTime },
894
+ createParentContext(observationOptions?.parentSpanContext) ?? context2.active(),
895
+ (span) => {
896
+ try {
897
+ let observation;
898
+ switch (asType) {
899
+ case "llm":
900
+ observation = new ObservationLLM({ otelSpan: span });
901
+ break;
902
+ case "embedding":
903
+ observation = new ObservationEmbedding({ otelSpan: span });
904
+ break;
905
+ case "agent":
906
+ observation = new ObservationAgent({ otelSpan: span });
907
+ break;
908
+ case "tool":
909
+ observation = new ObservationTool({ otelSpan: span });
910
+ break;
911
+ case "retriever":
912
+ observation = new ObservationRetriever({ otelSpan: span });
913
+ break;
914
+ case "reranker":
915
+ observation = new ObservationReranker({ otelSpan: span });
916
+ break;
917
+ case "evaluator":
918
+ observation = new ObservationEvaluator({ otelSpan: span });
919
+ break;
920
+ case "guardrail":
921
+ observation = new ObservationGuardrail({ otelSpan: span });
922
+ break;
923
+ case "chain":
924
+ default:
925
+ observation = new ObservationChain({ otelSpan: span });
926
+ }
927
+ fnCalled = true;
928
+ const result = fn(observation);
929
+ if (result instanceof Promise) {
930
+ return wrapPromise(
931
+ result,
932
+ span,
933
+ endOnExit
934
+ );
935
+ } else {
936
+ if (endOnExit !== false) {
937
+ span.end();
938
+ }
939
+ return result;
940
+ }
941
+ } catch (err) {
942
+ span.setStatus({
943
+ code: SpanStatusCode2.ERROR,
944
+ message: err instanceof Error ? err.message : "Unknown error"
945
+ });
939
946
  if (endOnExit !== false) {
940
947
  span.end();
941
948
  }
942
- return result;
943
- }
944
- } catch (err) {
945
- span.setStatus({
946
- code: SpanStatusCode2.ERROR,
947
- message: err instanceof Error ? err.message : "Unknown error"
948
- });
949
- if (endOnExit !== false) {
950
- span.end();
949
+ throw err;
951
950
  }
952
- throw err;
953
951
  }
952
+ );
953
+ } catch (err) {
954
+ if (fnCalled) {
955
+ throw err;
954
956
  }
955
- );
957
+ console.warn(
958
+ `[Observability] startActiveObservation "${name}" failed, falling back to no-op:`,
959
+ err instanceof Error ? err.message : err
960
+ );
961
+ const noopObservation = createNoopObservation(asType);
962
+ return fn(noopObservation);
963
+ }
956
964
  }
957
965
  function updateActiveObservation(attributes) {
958
966
  const span = trace2.getActiveSpan();
@@ -978,41 +986,59 @@ function observe(fn, options = {}) {
978
986
  } = options;
979
987
  const wrappedFunction = function(...args) {
980
988
  const name = fn.name || "anonymous-function";
981
- const inputData = captureInput ? _captureArguments(args) : void 0;
982
- const observation = startObservation(
983
- name,
984
- inputData ? { input: inputData } : {},
985
- {
986
- ...observationOptions,
987
- asType
988
- }
989
- );
990
- const activeContext = trace2.setSpan(context2.active(), observation.otelSpan);
991
- const result = context2.with(activeContext, () => fn.apply(this, args));
992
- if (result instanceof Promise) {
993
- return result.then(
994
- (value) => {
995
- if (captureOutput) {
996
- observation.update({ output: value });
997
- }
998
- observation.end();
999
- return value;
1000
- },
1001
- (err) => {
1002
- observation.update({
1003
- level: "ERROR",
1004
- statusMessage: err instanceof Error ? err.message : "Unknown error"
1005
- });
1006
- observation.end();
1007
- throw err;
989
+ let observation;
990
+ let fnCalled = false;
991
+ try {
992
+ const inputData = captureInput ? _captureArguments(args) : void 0;
993
+ observation = startObservation(
994
+ name,
995
+ inputData ? { input: inputData } : {},
996
+ {
997
+ ...observationOptions,
998
+ asType
1008
999
  }
1009
1000
  );
1001
+ const activeContext = trace2.setSpan(context2.active(), observation.otelSpan);
1002
+ fnCalled = true;
1003
+ const result = context2.with(activeContext, () => fn.apply(this, args));
1004
+ if (result instanceof Promise) {
1005
+ return result.then(
1006
+ (value) => {
1007
+ if (captureOutput) {
1008
+ observation.update({ output: value });
1009
+ }
1010
+ observation.end();
1011
+ return value;
1012
+ },
1013
+ (err) => {
1014
+ observation.update({
1015
+ level: "ERROR",
1016
+ statusMessage: err instanceof Error ? err.message : "Unknown error"
1017
+ });
1018
+ observation.end();
1019
+ throw err;
1020
+ }
1021
+ );
1022
+ }
1023
+ if (captureOutput) {
1024
+ observation.update({ output: result });
1025
+ }
1026
+ observation.end();
1027
+ return result;
1028
+ } catch (err) {
1029
+ if (fnCalled) {
1030
+ throw err;
1031
+ }
1032
+ console.warn(
1033
+ `[Observability] observe "${name}" failed, falling back to direct call:`,
1034
+ err instanceof Error ? err.message : err
1035
+ );
1036
+ try {
1037
+ observation?.end();
1038
+ } catch {
1039
+ }
1040
+ return fn.apply(this, args);
1010
1041
  }
1011
- if (captureOutput) {
1012
- observation.update({ output: result });
1013
- }
1014
- observation.end();
1015
- return result;
1016
1042
  };
1017
1043
  Object.defineProperty(wrappedFunction, "name", { value: fn.name });
1018
1044
  Object.defineProperty(wrappedFunction, "length", { value: fn.length });
@@ -1059,4 +1085,4 @@ export {
1059
1085
  observe,
1060
1086
  init_src
1061
1087
  };
1062
- //# sourceMappingURL=chunk-43GF2BGQ.mjs.map
1088
+ //# sourceMappingURL=chunk-Q5P7VQEQ.mjs.map