weflayr 0.24.0 → 0.26.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.
Files changed (234) hide show
  1. package/README.md +2 -2
  2. package/dist/{api → src/api}/generated/facade.gen.d.ts +86 -12
  3. package/dist/{api → src/api}/generated/facade.gen.js +4 -2
  4. package/dist/src/api/generated/index.d.ts +2 -0
  5. package/dist/{api → src/api}/generated/index.js +3 -1
  6. package/dist/{api → src/api}/generated/sdk.gen.d.ts +11 -3
  7. package/dist/{api → src/api}/generated/sdk.gen.js +34 -4
  8. package/{src/api/generated/types.gen.ts → dist/src/api/generated/types.gen.d.ts} +436 -153
  9. package/dist/{api → src/api}/makeEndpoint.js +1 -3
  10. package/dist/src/auto-instrument.d.ts +42 -0
  11. package/dist/src/auto-instrument.js +156 -0
  12. package/dist/src/index.d.ts +9 -0
  13. package/dist/src/index.js +49 -0
  14. package/dist/src/instrumentation/anthropic/get_cache_and_reasoning_telemetry.d.ts +20 -0
  15. package/dist/src/instrumentation/anthropic/get_cache_and_reasoning_telemetry.js +114 -0
  16. package/dist/src/instrumentation/anthropic/get_cache_config_telemetry.d.ts +28 -0
  17. package/dist/src/instrumentation/anthropic/get_cache_config_telemetry.js +92 -0
  18. package/dist/src/instrumentation/anthropic/get_streaming_accumulation_telemetry.d.ts +25 -0
  19. package/dist/src/instrumentation/anthropic/get_streaming_accumulation_telemetry.js +141 -0
  20. package/dist/src/instrumentation/anthropic/get_structured_output_schema_telemetry.d.ts +9 -0
  21. package/dist/src/instrumentation/anthropic/get_structured_output_schema_telemetry.js +17 -0
  22. package/dist/src/instrumentation/anthropic/get_tool_definitions_telemetry.d.ts +15 -0
  23. package/dist/src/instrumentation/anthropic/get_tool_definitions_telemetry.js +50 -0
  24. package/dist/src/instrumentation/anthropic/set_telemetry_attributes.d.ts +15 -0
  25. package/dist/src/instrumentation/anthropic/set_telemetry_attributes.js +39 -0
  26. package/dist/src/instrumentation/bedrock/get_cache_config_telemetry.d.ts +22 -0
  27. package/dist/src/instrumentation/bedrock/get_cache_config_telemetry.js +97 -0
  28. package/dist/src/instrumentation/bedrock/get_cache_telemetry.d.ts +22 -0
  29. package/dist/src/instrumentation/bedrock/get_cache_telemetry.js +102 -0
  30. package/dist/src/instrumentation/bedrock/get_input_message_content_telemetry.d.ts +15 -0
  31. package/dist/src/instrumentation/bedrock/get_input_message_content_telemetry.js +91 -0
  32. package/dist/src/instrumentation/bedrock/get_model_id_telemetry.d.ts +21 -0
  33. package/dist/src/instrumentation/bedrock/get_model_id_telemetry.js +54 -0
  34. package/dist/src/instrumentation/bedrock/get_reasoning_output_telemetry.d.ts +19 -0
  35. package/dist/src/instrumentation/bedrock/get_reasoning_output_telemetry.js +81 -0
  36. package/dist/src/instrumentation/bedrock/get_streaming_output_message_telemetry.d.ts +27 -0
  37. package/dist/src/instrumentation/bedrock/get_streaming_output_message_telemetry.js +126 -0
  38. package/dist/src/instrumentation/bedrock/get_tool_call_output_telemetry.d.ts +17 -0
  39. package/dist/src/instrumentation/bedrock/get_tool_call_output_telemetry.js +85 -0
  40. package/dist/src/instrumentation/bedrock/get_tool_definitions_telemetry.d.ts +15 -0
  41. package/dist/src/instrumentation/bedrock/get_tool_definitions_telemetry.js +68 -0
  42. package/dist/src/instrumentation/bedrock/set_telemetry_attributes.d.ts +18 -0
  43. package/dist/src/instrumentation/bedrock/set_telemetry_attributes.js +47 -0
  44. package/dist/src/instrumentation/cohere/get_chat_telemetry.d.ts +23 -0
  45. package/dist/src/instrumentation/cohere/get_chat_telemetry.js +77 -0
  46. package/dist/src/instrumentation/cohere/get_embeddings_telemetry.d.ts +18 -0
  47. package/dist/src/instrumentation/cohere/get_embeddings_telemetry.js +88 -0
  48. package/dist/src/instrumentation/cohere/get_structured_output_schema_telemetry.d.ts +12 -0
  49. package/dist/src/instrumentation/cohere/get_structured_output_schema_telemetry.js +18 -0
  50. package/dist/src/instrumentation/cohere/get_tool_call_output_telemetry.d.ts +31 -0
  51. package/dist/src/instrumentation/cohere/get_tool_call_output_telemetry.js +106 -0
  52. package/dist/src/instrumentation/cohere/get_tool_definitions_telemetry.d.ts +27 -0
  53. package/dist/src/instrumentation/cohere/get_tool_definitions_telemetry.js +75 -0
  54. package/dist/src/instrumentation/cohere/set_telemetry_attributes.d.ts +17 -0
  55. package/dist/src/instrumentation/cohere/set_telemetry_attributes.js +44 -0
  56. package/dist/src/instrumentation/elevenlabs/full_instrumentation.d.ts +28 -0
  57. package/dist/src/instrumentation/elevenlabs/full_instrumentation.js +209 -0
  58. package/dist/src/instrumentation/google/get_audio_telemetry.d.ts +9 -0
  59. package/dist/src/instrumentation/google/get_audio_telemetry.js +28 -0
  60. package/dist/src/instrumentation/google/get_cache_operations_telemetry.d.ts +23 -0
  61. package/dist/src/instrumentation/google/get_cache_operations_telemetry.js +154 -0
  62. package/dist/src/instrumentation/google/get_cache_telemetry.d.ts +16 -0
  63. package/{src → dist/src}/instrumentation/google/get_cache_telemetry.js +18 -19
  64. package/dist/src/instrumentation/google/get_embeddings_telemetry.d.ts +12 -0
  65. package/dist/src/instrumentation/google/get_embeddings_telemetry.js +85 -0
  66. package/dist/src/instrumentation/google/get_provider_name.d.ts +11 -0
  67. package/{src → dist/src}/instrumentation/google/get_provider_name.js +11 -12
  68. package/{src/instrumentation/google/get_reasoning_telemetry.js → dist/src/instrumentation/google/get_reasoning_telemetry.d.ts} +1 -11
  69. package/dist/src/instrumentation/google/get_reasoning_telemetry.js +21 -0
  70. package/dist/src/instrumentation/google/get_structured_output_schema_telemetry.d.ts +12 -0
  71. package/dist/src/instrumentation/google/get_structured_output_schema_telemetry.js +19 -0
  72. package/dist/src/instrumentation/google/set_telemetry_attributes.d.ts +18 -0
  73. package/dist/src/instrumentation/google/set_telemetry_attributes.js +98 -0
  74. package/dist/src/instrumentation/openai/get_audio_telemetry.d.ts +25 -0
  75. package/dist/src/instrumentation/openai/get_audio_telemetry.js +123 -0
  76. package/dist/src/instrumentation/openai/get_bedrock_mantle_telemetry.d.ts +35 -0
  77. package/dist/src/instrumentation/openai/get_bedrock_mantle_telemetry.js +148 -0
  78. package/dist/src/instrumentation/openai/get_cache_and_reasoning_telemetry.d.ts +27 -0
  79. package/dist/src/instrumentation/openai/get_cache_and_reasoning_telemetry.js +72 -0
  80. package/dist/src/instrumentation/openai/get_cache_config_telemetry.d.ts +28 -0
  81. package/dist/src/instrumentation/openai/get_cache_config_telemetry.js +91 -0
  82. package/dist/src/instrumentation/openai/get_embeddings_telemetry.d.ts +18 -0
  83. package/dist/src/instrumentation/openai/get_embeddings_telemetry.js +86 -0
  84. package/dist/src/instrumentation/openai/get_streaming_usage.d.ts +21 -0
  85. package/dist/src/instrumentation/openai/get_streaming_usage.js +74 -0
  86. package/dist/src/instrumentation/openai/get_structured_output_schema_telemetry.d.ts +12 -0
  87. package/dist/src/instrumentation/openai/get_structured_output_schema_telemetry.js +20 -0
  88. package/dist/src/instrumentation/openai/set_telemetry_attributes.d.ts +17 -0
  89. package/dist/src/instrumentation/openai/set_telemetry_attributes.js +47 -0
  90. package/dist/src/instrumentation/shared/get_structured_output_schema_telemetry.d.ts +35 -0
  91. package/dist/src/instrumentation/shared/get_structured_output_schema_telemetry.js +76 -0
  92. package/dist/src/instrumentation/vercel/full_instrumentation.d.ts +3 -0
  93. package/dist/src/instrumentation/vercel/full_instrumentation.js +54 -0
  94. package/dist/src/instrumentation/vercel/get_cache_creation_telemetry.d.ts +22 -0
  95. package/dist/src/instrumentation/vercel/get_cache_creation_telemetry.js +66 -0
  96. package/dist/src/instrumentation/vercel/get_structured_output_schema_telemetry.d.ts +24 -0
  97. package/dist/src/instrumentation/vercel/get_structured_output_schema_telemetry.js +84 -0
  98. package/dist/src/logger.d.ts +1 -0
  99. package/dist/src/logger.js +6 -0
  100. package/dist/src/otel/exporter.d.ts +19 -0
  101. package/dist/src/otel/exporter.js +94 -0
  102. package/dist/src/otel/propagation.d.ts +46 -0
  103. package/dist/src/otel/propagation.js +110 -0
  104. package/dist/src/otel/span-filter.d.ts +3 -0
  105. package/dist/src/otel/span-filter.js +61 -0
  106. package/dist/src/otel/span-processor.d.ts +55 -0
  107. package/dist/src/otel/span-processor.js +169 -0
  108. package/dist/src/otel/vercel-ai-sdk-span-filter.d.ts +12 -0
  109. package/dist/src/otel/vercel-ai-sdk-span-filter.js +88 -0
  110. package/dist/src/setup.d.ts +50 -0
  111. package/dist/src/setup.js +155 -0
  112. package/package.json +11 -5
  113. package/.prettierignore +0 -2
  114. package/.prettierrc.json +0 -7
  115. package/LICENSE-MIT +0 -21
  116. package/NOTICE +0 -12
  117. package/dist/api/generated/index.d.ts +0 -2
  118. package/dist/api/generated/types.gen.d.ts +0 -1005
  119. package/eslint.config.mjs +0 -36
  120. package/index.d.ts +0 -170
  121. package/openapi-ts.config.mjs +0 -9
  122. package/scripts/generate_facade.mjs +0 -86
  123. package/src/api/caseConversion.ts +0 -58
  124. package/src/api/generated/client/client.gen.ts +0 -277
  125. package/src/api/generated/client/index.ts +0 -27
  126. package/src/api/generated/client/types.gen.ts +0 -218
  127. package/src/api/generated/client/utils.gen.ts +0 -316
  128. package/src/api/generated/client.gen.ts +0 -16
  129. package/src/api/generated/core/auth.gen.ts +0 -48
  130. package/src/api/generated/core/bodySerializer.gen.ts +0 -82
  131. package/src/api/generated/core/params.gen.ts +0 -178
  132. package/src/api/generated/core/pathSerializer.gen.ts +0 -171
  133. package/src/api/generated/core/queryKeySerializer.gen.ts +0 -117
  134. package/src/api/generated/core/serverSentEvents.gen.ts +0 -242
  135. package/src/api/generated/core/types.gen.ts +0 -110
  136. package/src/api/generated/core/utils.gen.ts +0 -140
  137. package/src/api/generated/facade.gen.ts +0 -104
  138. package/src/api/generated/index.ts +0 -4
  139. package/src/api/generated/sdk.gen.ts +0 -175
  140. package/src/api/index.ts +0 -45
  141. package/src/api/makeEndpoint.ts +0 -54
  142. package/src/auto-instrument.js +0 -172
  143. package/src/index.js +0 -19
  144. package/src/instrumentation/anthropic/get_cache_and_reasoning_telemetry.js +0 -118
  145. package/src/instrumentation/anthropic/get_cache_config_telemetry.js +0 -90
  146. package/src/instrumentation/anthropic/get_streaming_stop_reason_telemetry.js +0 -121
  147. package/src/instrumentation/anthropic/get_tool_definitions_telemetry.js +0 -55
  148. package/src/instrumentation/anthropic/set_telemetry_attributes.js +0 -39
  149. package/src/instrumentation/bedrock/get_cache_config_telemetry.js +0 -106
  150. package/src/instrumentation/bedrock/get_cache_telemetry.js +0 -109
  151. package/src/instrumentation/bedrock/get_input_message_content_telemetry.js +0 -94
  152. package/src/instrumentation/bedrock/get_streaming_output_message_telemetry.js +0 -87
  153. package/src/instrumentation/bedrock/set_telemetry_attributes.js +0 -40
  154. package/src/instrumentation/cohere/get_chat_telemetry.js +0 -88
  155. package/src/instrumentation/cohere/get_embeddings_telemetry.js +0 -107
  156. package/src/instrumentation/cohere/set_telemetry_attributes.js +0 -32
  157. package/src/instrumentation/elevenlabs/full_instrumentation.js +0 -236
  158. package/src/instrumentation/google/get_audio_telemetry.js +0 -30
  159. package/src/instrumentation/google/get_cache_operations_telemetry.js +0 -171
  160. package/src/instrumentation/google/get_embeddings_telemetry.js +0 -99
  161. package/src/instrumentation/google/set_telemetry_attributes.js +0 -104
  162. package/src/instrumentation/openai/get_audio_telemetry.js +0 -149
  163. package/src/instrumentation/openai/get_cache_and_reasoning_telemetry.js +0 -71
  164. package/src/instrumentation/openai/get_cache_config_telemetry.js +0 -63
  165. package/src/instrumentation/openai/get_embeddings_telemetry.js +0 -107
  166. package/src/instrumentation/openai/get_streaming_usage.js +0 -81
  167. package/src/instrumentation/openai/set_telemetry_attributes.js +0 -41
  168. package/src/instrumentation/vercel/full_instrumentation.js +0 -52
  169. package/src/instrumentation/vercel/get_cache_creation_telemetry.js +0 -70
  170. package/src/logger.js +0 -8
  171. package/src/otel/exporter.js +0 -108
  172. package/src/otel/propagation.js +0 -146
  173. package/src/otel/span-filter.js +0 -69
  174. package/src/otel/span-processor.js +0 -170
  175. package/src/otel/vercel-ai-sdk-span-filter.js +0 -79
  176. package/src/setup.js +0 -167
  177. package/tests/api/index.test.js +0 -437
  178. package/tests/index.test.js +0 -884
  179. package/tests/instrumentation/anthropic/get_cache_and_reasoning_telemetry.test.js +0 -181
  180. package/tests/instrumentation/anthropic/get_cache_config_telemetry.test.js +0 -92
  181. package/tests/instrumentation/anthropic/get_streaming_stop_reason_telemetry.test.js +0 -117
  182. package/tests/instrumentation/anthropic/get_tool_definitions_telemetry.test.js +0 -97
  183. package/tests/instrumentation/bedrock/get_cache_config_telemetry.test.js +0 -107
  184. package/tests/instrumentation/bedrock/get_cache_telemetry.test.js +0 -118
  185. package/tests/instrumentation/bedrock/get_input_message_content_telemetry.test.js +0 -89
  186. package/tests/instrumentation/bedrock/get_streaming_output_message_telemetry.test.js +0 -87
  187. package/tests/instrumentation/cohere/get_chat_telemetry.test.js +0 -148
  188. package/tests/instrumentation/cohere/get_embeddings_telemetry.test.js +0 -132
  189. package/tests/instrumentation/elevenlabs/full_instrumentation.test.js +0 -258
  190. package/tests/instrumentation/google/get_cache_operations_telemetry.test.js +0 -130
  191. package/tests/instrumentation/google/get_embeddings_telemetry.test.js +0 -128
  192. package/tests/instrumentation/google/get_reasoning_telemetry.test.js +0 -41
  193. package/tests/instrumentation/google/set_telemetry_attributes.test.js +0 -219
  194. package/tests/instrumentation/openai/get_audio_telemetry.test.js +0 -170
  195. package/tests/instrumentation/openai/get_cache_and_reasoning_telemetry.test.js +0 -83
  196. package/tests/instrumentation/openai/get_cache_config_telemetry.test.js +0 -83
  197. package/tests/instrumentation/openai/get_embeddings_telemetry.test.js +0 -145
  198. package/tests/instrumentation/openai/get_streaming_usage.test.js +0 -105
  199. package/tests/instrumentation/vercel/full_instrumentation.test.js +0 -16
  200. package/tests/instrumentation/vercel/get_cache_creation_telemetry.test.js +0 -96
  201. package/tests/otel/vercel-ai-sdk-span-filter.test.js +0 -159
  202. package/tsconfig.json +0 -18
  203. /package/dist/{api → src/api}/caseConversion.d.ts +0 -0
  204. /package/dist/{api → src/api}/caseConversion.js +0 -0
  205. /package/dist/{api → src/api}/generated/client/client.gen.d.ts +0 -0
  206. /package/dist/{api → src/api}/generated/client/client.gen.js +0 -0
  207. /package/dist/{api → src/api}/generated/client/index.d.ts +0 -0
  208. /package/dist/{api → src/api}/generated/client/index.js +0 -0
  209. /package/dist/{api → src/api}/generated/client/types.gen.d.ts +0 -0
  210. /package/dist/{api → src/api}/generated/client/types.gen.js +0 -0
  211. /package/dist/{api → src/api}/generated/client/utils.gen.d.ts +0 -0
  212. /package/dist/{api → src/api}/generated/client/utils.gen.js +0 -0
  213. /package/dist/{api → src/api}/generated/client.gen.d.ts +0 -0
  214. /package/dist/{api → src/api}/generated/client.gen.js +0 -0
  215. /package/dist/{api → src/api}/generated/core/auth.gen.d.ts +0 -0
  216. /package/dist/{api → src/api}/generated/core/auth.gen.js +0 -0
  217. /package/dist/{api → src/api}/generated/core/bodySerializer.gen.d.ts +0 -0
  218. /package/dist/{api → src/api}/generated/core/bodySerializer.gen.js +0 -0
  219. /package/dist/{api → src/api}/generated/core/params.gen.d.ts +0 -0
  220. /package/dist/{api → src/api}/generated/core/params.gen.js +0 -0
  221. /package/dist/{api → src/api}/generated/core/pathSerializer.gen.d.ts +0 -0
  222. /package/dist/{api → src/api}/generated/core/pathSerializer.gen.js +0 -0
  223. /package/dist/{api → src/api}/generated/core/queryKeySerializer.gen.d.ts +0 -0
  224. /package/dist/{api → src/api}/generated/core/queryKeySerializer.gen.js +0 -0
  225. /package/dist/{api → src/api}/generated/core/serverSentEvents.gen.d.ts +0 -0
  226. /package/dist/{api → src/api}/generated/core/serverSentEvents.gen.js +0 -0
  227. /package/dist/{api → src/api}/generated/core/types.gen.d.ts +0 -0
  228. /package/dist/{api → src/api}/generated/core/types.gen.js +0 -0
  229. /package/dist/{api → src/api}/generated/core/utils.gen.d.ts +0 -0
  230. /package/dist/{api → src/api}/generated/core/utils.gen.js +0 -0
  231. /package/dist/{api → src/api}/generated/types.gen.js +0 -0
  232. /package/dist/{api → src/api}/index.d.ts +0 -0
  233. /package/dist/{api → src/api}/index.js +0 -0
  234. /package/dist/{api → src/api}/makeEndpoint.d.ts +0 -0
@@ -1,181 +0,0 @@
1
- 'use strict';
2
-
3
- // Tests for the Anthropic cached-prompt token complement. It wraps the primary
4
- // instrumentor's `_endSpan({ span, type, result })` to stamp
5
- // gen_ai.usage.cache_read_input_tokens / cache_creation_input_tokens from the
6
- // response's `usage.cache_read_input_tokens` / `cache_creation_input_tokens`.
7
-
8
- const test = require('node:test');
9
- const assert = require('node:assert/strict');
10
-
11
- const {
12
- AnthropicPromptCachingInstrumentor,
13
- } = require('../../../src/instrumentation/anthropic/get_cache_and_reasoning_telemetry');
14
-
15
- function fakeSpan() {
16
- const attrs = {};
17
- return {
18
- attrs,
19
- isRecording: () => true,
20
- setAttribute(key, value) {
21
- attrs[key] = value;
22
- },
23
- };
24
- }
25
-
26
- test('stamps cache write and still calls the original _endSpan', () => {
27
- const calls = [];
28
- const instrumentation = {
29
- _endSpan(args) {
30
- calls.push(args);
31
- },
32
- };
33
- new AnthropicPromptCachingInstrumentor().instrument(instrumentation);
34
-
35
- const span = fakeSpan();
36
- instrumentation._endSpan({
37
- span,
38
- type: 'completion',
39
- result: {
40
- usage: { input_tokens: 10, cache_creation_input_tokens: 5269, cache_read_input_tokens: 0 },
41
- },
42
- });
43
-
44
- assert.equal(span.attrs['gen_ai.usage.cache_creation_input_tokens'], 5269);
45
- assert.equal(span.attrs['gen_ai.usage.cache_read_input_tokens'], undefined);
46
- assert.equal(calls.length, 1);
47
- });
48
-
49
- test('stamps cache read on a warm call', () => {
50
- const instrumentation = { _endSpan() {} };
51
- new AnthropicPromptCachingInstrumentor().instrument(instrumentation);
52
-
53
- const span = fakeSpan();
54
- instrumentation._endSpan({
55
- span,
56
- type: 'completion',
57
- result: {
58
- usage: { input_tokens: 10, cache_creation_input_tokens: 0, cache_read_input_tokens: 5271 },
59
- },
60
- });
61
-
62
- assert.equal(span.attrs['gen_ai.usage.cache_read_input_tokens'], 5271);
63
- assert.equal(span.attrs['gen_ai.usage.cache_creation_input_tokens'], undefined);
64
- });
65
-
66
- test('stamps usage.cache_creation verbatim', () => {
67
- const instrumentation = { _endSpan() {} };
68
- new AnthropicPromptCachingInstrumentor().instrument(instrumentation);
69
-
70
- const span = fakeSpan();
71
- instrumentation._endSpan({
72
- span,
73
- type: 'completion',
74
- result: {
75
- usage: {
76
- input_tokens: 10,
77
- cache_creation_input_tokens: 5300,
78
- cache_creation: { ephemeral_5m_input_tokens: 4000, ephemeral_1h_input_tokens: 1300 },
79
- },
80
- },
81
- });
82
-
83
- assert.deepEqual(JSON.parse(span.attrs['weflayr.cache.creation']), {
84
- ephemeral_5m_input_tokens: 4000,
85
- ephemeral_1h_input_tokens: 1300,
86
- });
87
- });
88
-
89
- test('sets nothing for an uncached call', () => {
90
- const instrumentation = { _endSpan() {} };
91
- new AnthropicPromptCachingInstrumentor().instrument(instrumentation);
92
-
93
- const span = fakeSpan();
94
- instrumentation._endSpan({ span, type: 'completion', result: { usage: { input_tokens: 13 } } });
95
-
96
- assert.equal(span.attrs['gen_ai.usage.cache_read_input_tokens'], undefined);
97
- assert.equal(span.attrs['gen_ai.usage.cache_creation_input_tokens'], undefined);
98
- });
99
-
100
- test('stamps extended thinking tokens from output_tokens_details', () => {
101
- const instrumentation = { _endSpan() {} };
102
- new AnthropicPromptCachingInstrumentor().instrument(instrumentation);
103
-
104
- const span = fakeSpan();
105
- instrumentation._endSpan({
106
- span,
107
- type: 'completion',
108
- result: { usage: { input_tokens: 10, output_tokens_details: { thinking_tokens: 150 } } },
109
- });
110
-
111
- assert.equal(span.attrs['gen_ai.usage.output_tokens_details.thinking_tokens'], 150);
112
- });
113
-
114
- test('stamps cache + raw input from the streamed message_start usage', async () => {
115
- const instrumentation = {
116
- _endSpan() {},
117
- _streamingWrapPromise() {
118
- return (async function* () {
119
- yield {
120
- type: 'message_start',
121
- message: {
122
- usage: {
123
- input_tokens: 10,
124
- cache_read_input_tokens: 5270,
125
- cache_creation_input_tokens: 0,
126
- },
127
- },
128
- };
129
- yield { type: 'content_block_delta', delta: { text: 'OK' } };
130
- })();
131
- },
132
- };
133
- new AnthropicPromptCachingInstrumentor().instrument(instrumentation);
134
-
135
- const span = fakeSpan();
136
- for await (const _chunk of instrumentation._streamingWrapPromise('client', 'mod', { span })) {
137
- void _chunk;
138
- }
139
-
140
- assert.equal(span.attrs['gen_ai.usage.cache_read_input_tokens'], 5270);
141
- assert.equal(span.attrs['gen_ai.usage.input_tokens'], 10);
142
- });
143
-
144
- test('re-yields every stream chunk unchanged — no telemetry collision with the payload', async () => {
145
- const emitted = [
146
- {
147
- type: 'message_start',
148
- message: { usage: { input_tokens: 10, cache_read_input_tokens: 5270 } },
149
- },
150
- { type: 'content_block_delta', delta: { text: 'O' } },
151
- { type: 'content_block_delta', delta: { text: 'K' } },
152
- ];
153
- const instrumentation = {
154
- _endSpan() {},
155
- _streamingWrapPromise() {
156
- return (async function* () {
157
- for (const chunk of emitted) yield chunk;
158
- })();
159
- },
160
- };
161
- new AnthropicPromptCachingInstrumentor().instrument(instrumentation);
162
-
163
- const span = fakeSpan();
164
- const collected = [];
165
- for await (const chunk of instrumentation._streamingWrapPromise('client', 'mod', { span })) {
166
- collected.push(chunk);
167
- }
168
-
169
- // Same count, order, and object identity: observeCache re-yields each chunk by
170
- // reference without copying or mutating it.
171
- assert.equal(collected.length, emitted.length);
172
- collected.forEach((chunk, index) => assert.equal(chunk, emitted[index]));
173
- // …while still stamping cache + raw input off the message_start chunk.
174
- assert.equal(span.attrs['gen_ai.usage.input_tokens'], 10);
175
- });
176
-
177
- test('is a no-op when the instrumentor has no _endSpan', () => {
178
- const instrumentation = {};
179
- new AnthropicPromptCachingInstrumentor().instrument(instrumentation);
180
- assert.equal(instrumentation._endSpan, undefined);
181
- });
@@ -1,92 +0,0 @@
1
- 'use strict';
2
-
3
- // Tests for the Anthropic request-side cache_control breakpoint capture.
4
- //
5
- // The traceloop instrumentation instance is stubbed with a `startSpan` that
6
- // returns a fake span, so the wrap can be exercised without the real SDK.
7
-
8
- const test = require('node:test');
9
- const assert = require('node:assert/strict');
10
-
11
- const {
12
- AnthropicCacheConfigInstrumentor,
13
- extractCacheBreakpoints,
14
- } = require('../../../src/instrumentation/anthropic/get_cache_config_telemetry');
15
-
16
- function makeFakeSpan() {
17
- const attributes = {};
18
- return {
19
- attributes,
20
- setAttribute(key, value) {
21
- attributes[key] = value;
22
- },
23
- };
24
- }
25
-
26
- function makeStubInstrumentation() {
27
- return {
28
- startSpan() {
29
- return makeFakeSpan();
30
- },
31
- };
32
- }
33
-
34
- test('stamps breakpoints from system, message content and tools', () => {
35
- const instrumentation = makeStubInstrumentation();
36
- new AnthropicCacheConfigInstrumentor().instrument(instrumentation);
37
-
38
- const span = instrumentation.startSpan({
39
- type: 'chat',
40
- params: {
41
- system: [{ type: 'text', text: 'big prefix', cache_control: { type: 'ephemeral' } }],
42
- messages: [
43
- { role: 'user', content: 'plain string content' },
44
- {
45
- role: 'user',
46
- content: [{ type: 'text', text: 'doc', cache_control: { type: 'ephemeral', ttl: '1h' } }],
47
- },
48
- ],
49
- tools: [
50
- { name: 'get_weather', cache_control: { type: 'ephemeral' } },
51
- { name: 'uncached_tool' },
52
- ],
53
- },
54
- });
55
-
56
- assert.deepEqual(JSON.parse(span.attributes['weflayr.cache.breakpoints']), [
57
- { location: 'system' },
58
- { location: 'messages[1]', ttl: '1h' },
59
- { location: 'tools[0]' },
60
- ]);
61
- });
62
-
63
- test('no attribute without breakpoints', () => {
64
- const instrumentation = makeStubInstrumentation();
65
- new AnthropicCacheConfigInstrumentor().instrument(instrumentation);
66
-
67
- const span = instrumentation.startSpan({
68
- type: 'chat',
69
- params: { messages: [{ role: 'user', content: 'hello' }] },
70
- });
71
-
72
- assert.ok(!('weflayr.cache.breakpoints' in span.attributes));
73
- });
74
-
75
- test('extractCacheBreakpoints omits the ttl when the request sets none', () => {
76
- assert.deepEqual(
77
- extractCacheBreakpoints({
78
- system: [{ type: 'text', text: 'p', cache_control: { type: 'ephemeral' } }],
79
- }),
80
- [{ location: 'system' }]
81
- );
82
- });
83
-
84
- test('uninstrument restores the original startSpan', () => {
85
- const instrumentation = makeStubInstrumentation();
86
- const original = instrumentation.startSpan;
87
- const instrumentor = new AnthropicCacheConfigInstrumentor();
88
- instrumentor.instrument(instrumentation);
89
- assert.notEqual(instrumentation.startSpan, original);
90
- instrumentor.uninstrument();
91
- assert.equal(instrumentation.startSpan, original);
92
- });
@@ -1,117 +0,0 @@
1
- 'use strict';
2
-
3
- // Tests for the Anthropic streamed stop-reason complement.
4
- //
5
- // The traceloop instrumentation instance is stubbed the way the real one works:
6
- // `_streamingWrapPromise` returns `new moduleExports.APIPromise(...)` whose
7
- // parse step wraps the SDK stream with an accumulating iterator that calls
8
- // `_endSpan` when exhausted — so the test exercises the complement's APIPromise
9
- // interposition end to end.
10
-
11
- const test = require('node:test');
12
- const assert = require('node:assert/strict');
13
-
14
- const {
15
- AnthropicStreamingStopReasonInstrumentor,
16
- } = require('../../../src/instrumentation/anthropic/get_streaming_stop_reason_telemetry');
17
-
18
- class StubStream {
19
- constructor(iteratorFactory, controller) {
20
- this._iteratorFactory = iteratorFactory;
21
- this.controller = controller;
22
- }
23
-
24
- [Symbol.asyncIterator]() {
25
- return this._iteratorFactory();
26
- }
27
- }
28
-
29
- class StubAPIPromise {
30
- constructor(client, responsePromise, parseResponse) {
31
- this.parsed = parseResponse(client, responsePromise);
32
- }
33
- }
34
-
35
- function makeStubInstrumentation() {
36
- const finalized = [];
37
- return {
38
- finalized,
39
- _streamingWrapPromise(client, moduleExports, { span, promise }) {
40
- const self = this;
41
- return new moduleExports.APIPromise(
42
- client,
43
- promise,
44
- async (parseClient, realStreamPromise) => {
45
- const realStream = await realStreamPromise;
46
- // Mimics traceloop: re-wrap the stream with an accumulating iterator
47
- // that finalizes the span once exhausted.
48
- return new realStream.constructor(
49
- () =>
50
- (async function* accumulate() {
51
- const result = { stop_reason: null };
52
- for await (const chunk of realStream) yield chunk;
53
- self._endSpan({ span, result });
54
- })(),
55
- realStream.controller
56
- );
57
- }
58
- );
59
- },
60
- _endSpan(args) {
61
- finalized.push(args.result);
62
- },
63
- };
64
- }
65
-
66
- function chunkStream() {
67
- return new StubStream(async function* chunks() {
68
- yield { type: 'message_start', message: { usage: { input_tokens: 5 } } };
69
- yield { type: 'content_block_delta', delta: { type: 'text_delta', text: 'Hello' } };
70
- yield {
71
- type: 'message_delta',
72
- delta: { stop_reason: 'end_turn' },
73
- usage: { output_tokens: 3 },
74
- };
75
- yield { type: 'message_stop' };
76
- });
77
- }
78
-
79
- test('injects the streamed stop reason into the result before endSpan', async () => {
80
- const instrumentation = makeStubInstrumentation();
81
- new AnthropicStreamingStopReasonInstrumentor().instrument(instrumentation);
82
-
83
- const span = { name: 'anthropic.chat' };
84
- const apiPromise = instrumentation._streamingWrapPromise(
85
- {},
86
- { APIPromise: StubAPIPromise },
87
- { span, type: 'chat', promise: Promise.resolve(chunkStream()) }
88
- );
89
-
90
- const stream = await apiPromise.parsed;
91
- const seen = [];
92
- for await (const chunk of stream) seen.push(chunk.type);
93
-
94
- assert.deepEqual(seen, ['message_start', 'content_block_delta', 'message_delta', 'message_stop']);
95
- assert.equal(instrumentation.finalized.length, 1);
96
- assert.equal(instrumentation.finalized[0].stop_reason, 'end_turn');
97
- });
98
-
99
- test('leaves an already-set stop reason untouched', () => {
100
- const instrumentation = makeStubInstrumentation();
101
- new AnthropicStreamingStopReasonInstrumentor().instrument(instrumentation);
102
-
103
- const span = { name: 'anthropic.chat' };
104
- instrumentation._endSpan({ span, result: { stop_reason: 'max_tokens' } });
105
- assert.equal(instrumentation.finalized[0].stop_reason, 'max_tokens');
106
- });
107
-
108
- test('uninstrument restores the original methods', () => {
109
- const instrumentation = makeStubInstrumentation();
110
- const streamOriginal = instrumentation._streamingWrapPromise;
111
- const endSpanOriginal = instrumentation._endSpan;
112
- const instrumentor = new AnthropicStreamingStopReasonInstrumentor();
113
- instrumentor.instrument(instrumentation);
114
- instrumentor.uninstrument();
115
- assert.equal(instrumentation._streamingWrapPromise, streamOriginal);
116
- assert.equal(instrumentation._endSpan, endSpanOriginal);
117
- });
@@ -1,97 +0,0 @@
1
- 'use strict';
2
-
3
- // Tests for the Anthropic tool-definitions complement.
4
- //
5
- // The traceloop instrumentation instance is stubbed with a `startSpan` that
6
- // returns a fake span, so the wrap can be exercised without the real SDK.
7
-
8
- const test = require('node:test');
9
- const assert = require('node:assert/strict');
10
-
11
- const {
12
- AnthropicToolDefinitionsInstrumentor,
13
- } = require('../../../src/instrumentation/anthropic/get_tool_definitions_telemetry');
14
-
15
- function makeFakeSpan() {
16
- const attributes = {};
17
- return {
18
- attributes,
19
- setAttribute(key, value) {
20
- attributes[key] = value;
21
- },
22
- };
23
- }
24
-
25
- function makeStubInstrumentation() {
26
- return {
27
- startSpan(request) {
28
- const span = makeFakeSpan();
29
- span.attributes['gen_ai.request.model'] = request.params.model;
30
- return span;
31
- },
32
- };
33
- }
34
-
35
- const WEATHER_TOOL = {
36
- name: 'get_weather',
37
- description: 'Get the current weather for a city.',
38
- input_schema: { type: 'object', properties: { city: { type: 'string' } } },
39
- };
40
-
41
- test('stamps tool definitions from the request params', () => {
42
- const instrumentation = makeStubInstrumentation();
43
- const instrumentor = new AnthropicToolDefinitionsInstrumentor();
44
- instrumentor.instrument(instrumentation);
45
-
46
- const span = instrumentation.startSpan({
47
- type: 'chat',
48
- params: { model: 'claude-haiku-4-5', tools: [WEATHER_TOOL] },
49
- });
50
-
51
- assert.equal(span.attributes['gen_ai.request.model'], 'claude-haiku-4-5');
52
- assert.deepEqual(JSON.parse(span.attributes['gen_ai.tool.definitions']), [WEATHER_TOOL]);
53
- });
54
-
55
- test('drops cache_control from the stamped tool definitions', () => {
56
- const instrumentation = makeStubInstrumentation();
57
- new AnthropicToolDefinitionsInstrumentor().instrument(instrumentation);
58
-
59
- const span = instrumentation.startSpan({
60
- type: 'chat',
61
- params: {
62
- model: 'claude-haiku-4-5',
63
- tools: [{ ...WEATHER_TOOL, cache_control: { type: 'ephemeral', ttl: '1h' } }],
64
- },
65
- });
66
-
67
- assert.deepEqual(JSON.parse(span.attributes['gen_ai.tool.definitions']), [WEATHER_TOOL]);
68
- });
69
-
70
- test('no attribute when the request has no tools', () => {
71
- const instrumentation = makeStubInstrumentation();
72
- new AnthropicToolDefinitionsInstrumentor().instrument(instrumentation);
73
-
74
- const span = instrumentation.startSpan({
75
- type: 'chat',
76
- params: { model: 'claude-haiku-4-5' },
77
- });
78
-
79
- assert.ok(!('gen_ai.tool.definitions' in span.attributes));
80
- });
81
-
82
- test('uninstrument restores the original startSpan', () => {
83
- const instrumentation = makeStubInstrumentation();
84
- const original = instrumentation.startSpan;
85
- const instrumentor = new AnthropicToolDefinitionsInstrumentor();
86
- instrumentor.instrument(instrumentation);
87
- assert.notEqual(instrumentation.startSpan, original);
88
- instrumentor.uninstrument();
89
- assert.equal(instrumentation.startSpan, original);
90
- });
91
-
92
- test('is a no-op when the instrumentor has no startSpan', () => {
93
- const instrumentor = new AnthropicToolDefinitionsInstrumentor();
94
- instrumentor.instrument({});
95
- instrumentor.instrument(undefined);
96
- instrumentor.uninstrument();
97
- });
@@ -1,107 +0,0 @@
1
- 'use strict';
2
-
3
- // Tests for the Bedrock request-side cache breakpoint capture.
4
- //
5
- // The extractor reads both body schemas an InvokeModel request can carry:
6
- // Anthropic-on-Bedrock `cache_control` blocks and Amazon Nova `cachePoint`
7
- // blocks (attached to a content block or standing alone). The traceloop
8
- // instrumentation instance is stubbed with a `_startSpan` returning a fake
9
- // span, so the wrap can be exercised without the real SDK.
10
-
11
- const test = require('node:test');
12
- const assert = require('node:assert/strict');
13
-
14
- const {
15
- BedrockCacheConfigInstrumentor,
16
- extractBedrockCacheBreakpoints,
17
- } = require('../../../src/instrumentation/bedrock/get_cache_config_telemetry');
18
-
19
- function makeFakeSpan() {
20
- const attributes = {};
21
- return {
22
- attributes,
23
- setAttribute(key, value) {
24
- attributes[key] = value;
25
- },
26
- };
27
- }
28
-
29
- function makeStubInstrumentation() {
30
- return {
31
- _startSpan() {
32
- return makeFakeSpan();
33
- },
34
- };
35
- }
36
-
37
- test('extracts nova cache points', () => {
38
- const body = {
39
- system: [{ text: 'sys' }, { cachePoint: { type: 'default' } }],
40
- messages: [
41
- {
42
- role: 'user',
43
- content: [
44
- { text: 'big prefix', cachePoint: { type: 'default' } },
45
- { text: 'Reply with OK.' },
46
- ],
47
- },
48
- ],
49
- toolConfig: {
50
- tools: [
51
- { toolSpec: { name: 'get_weather' } },
52
- { cachePoint: { type: 'default', ttl: '1h' } },
53
- ],
54
- },
55
- };
56
- assert.deepEqual(extractBedrockCacheBreakpoints(body), [
57
- { location: 'system' },
58
- { location: 'messages[0]' },
59
- { location: 'tools[1]', ttl: '1h' },
60
- ]);
61
- });
62
-
63
- test('extracts anthropic-on-bedrock cache_control', () => {
64
- const body = {
65
- anthropic_version: 'bedrock-2023-05-31',
66
- system: [{ type: 'text', text: 'big prefix', cache_control: { type: 'ephemeral', ttl: '1h' } }],
67
- messages: [{ role: 'user', content: 'Reply with OK.' }],
68
- };
69
- assert.deepEqual(extractBedrockCacheBreakpoints(body), [{ location: 'system', ttl: '1h' }]);
70
- });
71
-
72
- test('no breakpoints without cache blocks', () => {
73
- assert.deepEqual(
74
- extractBedrockCacheBreakpoints({ messages: [{ role: 'user', content: 'hello' }] }),
75
- []
76
- );
77
- });
78
-
79
- test('stamps breakpoints from the request body', () => {
80
- const instrumentation = makeStubInstrumentation();
81
- new BedrockCacheConfigInstrumentor().instrument(instrumentation);
82
-
83
- const span = instrumentation._startSpan({
84
- params: {
85
- input: {
86
- modelId: 'amazon.nova-micro-v1:0',
87
- body: JSON.stringify({
88
- messages: [{ role: 'user', content: [{ text: 'p', cachePoint: { type: 'default' } }] }],
89
- }),
90
- },
91
- },
92
- });
93
-
94
- assert.deepEqual(JSON.parse(span.attributes['weflayr.cache.breakpoints']), [
95
- { location: 'messages[0]' },
96
- ]);
97
- });
98
-
99
- test('uninstrument restores the original _startSpan', () => {
100
- const instrumentation = makeStubInstrumentation();
101
- const original = instrumentation._startSpan;
102
- const instrumentor = new BedrockCacheConfigInstrumentor();
103
- instrumentor.instrument(instrumentation);
104
- assert.notEqual(instrumentation._startSpan, original);
105
- instrumentor.uninstrument();
106
- assert.equal(instrumentation._startSpan, original);
107
- });