@mastra/langfuse 1.0.0-beta.1 → 1.0.0-beta.11
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/CHANGELOG.md +141 -0
- package/README.md +48 -6
- package/dist/helpers.d.ts +79 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/index.cjs +124 -53
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +123 -54
- package/dist/index.js.map +1 -1
- package/dist/tracing.d.ts +21 -19
- package/dist/tracing.d.ts.map +1 -1
- package/package.json +8 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,146 @@
|
|
|
1
1
|
# @mastra/langfuse
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.11
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- feat(observability): add zero-config environment variable support for all exporters ([#11686](https://github.com/mastra-ai/mastra/pull/11686))
|
|
8
|
+
|
|
9
|
+
All observability exporters now support zero-config setup via environment variables. Set the appropriate environment variables and instantiate exporters with no configuration:
|
|
10
|
+
- **Langfuse**: `LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, `LANGFUSE_BASE_URL`
|
|
11
|
+
- **Braintrust**: `BRAINTRUST_API_KEY`, `BRAINTRUST_ENDPOINT`
|
|
12
|
+
- **PostHog**: `POSTHOG_API_KEY`, `POSTHOG_HOST`
|
|
13
|
+
- **Arize/Phoenix**: `ARIZE_SPACE_ID`, `ARIZE_API_KEY`, `ARIZE_PROJECT_NAME`, `PHOENIX_ENDPOINT`, `PHOENIX_API_KEY`, `PHOENIX_PROJECT_NAME`
|
|
14
|
+
- **OTEL Providers**:
|
|
15
|
+
- Dash0: `DASH0_API_KEY`, `DASH0_ENDPOINT`, `DASH0_DATASET`
|
|
16
|
+
- SigNoz: `SIGNOZ_API_KEY`, `SIGNOZ_REGION`, `SIGNOZ_ENDPOINT`
|
|
17
|
+
- New Relic: `NEW_RELIC_LICENSE_KEY`, `NEW_RELIC_ENDPOINT`
|
|
18
|
+
- Traceloop: `TRACELOOP_API_KEY`, `TRACELOOP_DESTINATION_ID`, `TRACELOOP_ENDPOINT`
|
|
19
|
+
- Laminar: `LMNR_PROJECT_API_KEY`, `LAMINAR_ENDPOINT`, `LAMINAR_TEAM_ID`
|
|
20
|
+
|
|
21
|
+
Example usage:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// Zero-config - reads from environment variables
|
|
25
|
+
new LangfuseExporter();
|
|
26
|
+
new BraintrustExporter();
|
|
27
|
+
new PosthogExporter();
|
|
28
|
+
new ArizeExporter();
|
|
29
|
+
new OtelExporter({ provider: { signoz: {} } });
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Explicit configuration still works and takes precedence over environment variables.
|
|
33
|
+
|
|
34
|
+
### Patch Changes
|
|
35
|
+
|
|
36
|
+
- Updated dependencies [[`08766f1`](https://github.com/mastra-ai/mastra/commit/08766f15e13ac0692fde2a8bd366c2e16e4321df), [`ae8baf7`](https://github.com/mastra-ai/mastra/commit/ae8baf7d8adcb0ff9dac11880400452bc49b33ff), [`cfabdd4`](https://github.com/mastra-ai/mastra/commit/cfabdd4aae7a726b706942d6836eeca110fb6267), [`a0e437f`](https://github.com/mastra-ai/mastra/commit/a0e437fac561b28ee719e0302d72b2f9b4c138f0), [`bec5efd`](https://github.com/mastra-ai/mastra/commit/bec5efde96653ccae6604e68c696d1bc6c1a0bf5), [`9eedf7d`](https://github.com/mastra-ai/mastra/commit/9eedf7de1d6e0022a2f4e5e9e6fe1ec468f9b43c)]:
|
|
37
|
+
- @mastra/core@1.0.0-beta.21
|
|
38
|
+
|
|
39
|
+
## 1.0.0-beta.10
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
- Add embedded documentation support for Mastra packages ([#11472](https://github.com/mastra-ai/mastra/pull/11472))
|
|
44
|
+
|
|
45
|
+
Mastra packages now include embedded documentation in the published npm package under `dist/docs/`. This enables coding agents and AI assistants to understand and use the framework by reading documentation directly from `node_modules`.
|
|
46
|
+
|
|
47
|
+
Each package includes:
|
|
48
|
+
- **SKILL.md** - Entry point explaining the package's purpose and capabilities
|
|
49
|
+
- **SOURCE_MAP.json** - Machine-readable index mapping exports to types and implementation files
|
|
50
|
+
- **Topic folders** - Conceptual documentation organized by feature area
|
|
51
|
+
|
|
52
|
+
Documentation is driven by the `packages` frontmatter field in MDX files, which maps docs to their corresponding packages. CI validation ensures all docs include this field.
|
|
53
|
+
|
|
54
|
+
- Updated dependencies [[`d2d3e22`](https://github.com/mastra-ai/mastra/commit/d2d3e22a419ee243f8812a84e3453dd44365ecb0), [`bc72b52`](https://github.com/mastra-ai/mastra/commit/bc72b529ee4478fe89ecd85a8be47ce0127b82a0), [`05b8bee`](https://github.com/mastra-ai/mastra/commit/05b8bee9e50e6c2a4a2bf210eca25ee212ca24fa), [`c042bd0`](https://github.com/mastra-ai/mastra/commit/c042bd0b743e0e86199d0cb83344ca7690e34a9c), [`940a2b2`](https://github.com/mastra-ai/mastra/commit/940a2b27480626ed7e74f55806dcd2181c1dd0c2), [`e0941c3`](https://github.com/mastra-ai/mastra/commit/e0941c3d7fc75695d5d258e7008fd5d6e650800c), [`0c0580a`](https://github.com/mastra-ai/mastra/commit/0c0580a42f697cd2a7d5973f25bfe7da9055038a), [`28f5f89`](https://github.com/mastra-ai/mastra/commit/28f5f89705f2409921e3c45178796c0e0d0bbb64), [`e601b27`](https://github.com/mastra-ai/mastra/commit/e601b272c70f3a5ecca610373aa6223012704892), [`3d3366f`](https://github.com/mastra-ai/mastra/commit/3d3366f31683e7137d126a3a57174a222c5801fb), [`5a4953f`](https://github.com/mastra-ai/mastra/commit/5a4953f7d25bb15ca31ed16038092a39cb3f98b3), [`eb9e522`](https://github.com/mastra-ai/mastra/commit/eb9e522ce3070a405e5b949b7bf5609ca51d7fe2), [`20e6f19`](https://github.com/mastra-ai/mastra/commit/20e6f1971d51d3ff6dd7accad8aaaae826d540ed), [`8a6734a`](https://github.com/mastra-ai/mastra/commit/8a6734a9b3eb192ada1f723d248b08b2258dd6b3), [`4f0b3c6`](https://github.com/mastra-ai/mastra/commit/4f0b3c66f196c06448487f680ccbb614d281e2f7), [`74c4f22`](https://github.com/mastra-ai/mastra/commit/74c4f22ed4c71e72598eacc346ba95cdbc00294f), [`81b6a8f`](https://github.com/mastra-ai/mastra/commit/81b6a8ff79f49a7549d15d66624ac1a0b8f5f971), [`e4d366a`](https://github.com/mastra-ai/mastra/commit/e4d366aeb500371dd4210d6aa8361a4c21d87034), [`a4f010b`](https://github.com/mastra-ai/mastra/commit/a4f010b22e4355a5fdee70a1fe0f6e4a692cc29e), [`73b0bb3`](https://github.com/mastra-ai/mastra/commit/73b0bb394dba7c9482eb467a97ab283dbc0ef4db), [`5627a8c`](https://github.com/mastra-ai/mastra/commit/5627a8c6dc11fe3711b3fa7a6ffd6eb34100a306), [`3ff45d1`](https://github.com/mastra-ai/mastra/commit/3ff45d10e0c80c5335a957ab563da72feb623520), [`251df45`](https://github.com/mastra-ai/mastra/commit/251df4531407dfa46d805feb40ff3fb49769f455), [`f894d14`](https://github.com/mastra-ai/mastra/commit/f894d148946629af7b1f452d65a9cf864cec3765), [`c2b9547`](https://github.com/mastra-ai/mastra/commit/c2b9547bf435f56339f23625a743b2147ab1c7a6), [`580b592`](https://github.com/mastra-ai/mastra/commit/580b5927afc82fe460dfdf9a38a902511b6b7e7f), [`58e3931`](https://github.com/mastra-ai/mastra/commit/58e3931af9baa5921688566210f00fb0c10479fa), [`08bb631`](https://github.com/mastra-ai/mastra/commit/08bb631ae2b14684b2678e3549d0b399a6f0561e), [`4fba91b`](https://github.com/mastra-ai/mastra/commit/4fba91bec7c95911dc28e369437596b152b04cd0), [`12b0cc4`](https://github.com/mastra-ai/mastra/commit/12b0cc4077d886b1a552637dedb70a7ade93528c)]:
|
|
55
|
+
- @mastra/core@1.0.0-beta.20
|
|
56
|
+
- @mastra/observability@1.0.0-beta.10
|
|
57
|
+
|
|
58
|
+
## 1.0.0-beta.9
|
|
59
|
+
|
|
60
|
+
### Patch Changes
|
|
61
|
+
|
|
62
|
+
- Updated dependencies [[`51fec93`](https://github.com/mastra-ai/mastra/commit/51fec93ffd2f167b1247c23e5c04ed24e369ff75), [`5947fcd`](https://github.com/mastra-ai/mastra/commit/5947fcdd425531f29f9422026d466c2ee3113c93)]:
|
|
63
|
+
- @mastra/observability@1.0.0-beta.9
|
|
64
|
+
- @mastra/core@1.0.0-beta.18
|
|
65
|
+
|
|
66
|
+
## 1.0.0-beta.8
|
|
67
|
+
|
|
68
|
+
### Patch Changes
|
|
69
|
+
|
|
70
|
+
- Updated dependencies [[`3d93a15`](https://github.com/mastra-ai/mastra/commit/3d93a15796b158c617461c8b98bede476ebb43e2), [`efe406a`](https://github.com/mastra-ai/mastra/commit/efe406a1353c24993280ebc2ed61dd9f65b84b26), [`119e5c6`](https://github.com/mastra-ai/mastra/commit/119e5c65008f3e5cfca954eefc2eb85e3bf40da4), [`74e504a`](https://github.com/mastra-ai/mastra/commit/74e504a3b584eafd2f198001c6a113bbec589fd3), [`e33fdbd`](https://github.com/mastra-ai/mastra/commit/e33fdbd07b33920d81e823122331b0c0bee0bb59), [`929f69c`](https://github.com/mastra-ai/mastra/commit/929f69c3436fa20dd0f0e2f7ebe8270bd82a1529), [`8a73529`](https://github.com/mastra-ai/mastra/commit/8a73529ca01187f604b1f3019d0a725ac63ae55f)]:
|
|
71
|
+
- @mastra/core@1.0.0-beta.16
|
|
72
|
+
- @mastra/observability@1.0.0-beta.8
|
|
73
|
+
|
|
74
|
+
## 1.0.0-beta.7
|
|
75
|
+
|
|
76
|
+
### Patch Changes
|
|
77
|
+
|
|
78
|
+
- Updated dependencies [[`33a4d2e`](https://github.com/mastra-ai/mastra/commit/33a4d2e4ed8af51f69256232f00c34d6b6b51d48), [`4aaa844`](https://github.com/mastra-ai/mastra/commit/4aaa844a4f19d054490f43638a990cc57bda8d2f), [`4a1a6cb`](https://github.com/mastra-ai/mastra/commit/4a1a6cb3facad54b2bb6780b00ce91d6de1edc08), [`31d13d5`](https://github.com/mastra-ai/mastra/commit/31d13d5fdc2e2380e2e3ee3ec9fb29d2a00f265d), [`4c62166`](https://github.com/mastra-ai/mastra/commit/4c621669f4a29b1f443eca3ba70b814afa286266), [`7bcbf10`](https://github.com/mastra-ai/mastra/commit/7bcbf10133516e03df964b941f9a34e9e4ab4177), [`4353600`](https://github.com/mastra-ai/mastra/commit/43536005a65988a8eede236f69122e7f5a284ba2), [`6986fb0`](https://github.com/mastra-ai/mastra/commit/6986fb064f5db6ecc24aa655e1d26529087b43b3), [`053e979`](https://github.com/mastra-ai/mastra/commit/053e9793b28e970086b0507f7f3b76ea32c1e838), [`e26dc9c`](https://github.com/mastra-ai/mastra/commit/e26dc9c3ccfec54ae3dc3e2b2589f741f9ae60a6), [`55edf73`](https://github.com/mastra-ai/mastra/commit/55edf7302149d6c964fbb7908b43babfc2b52145), [`27c0009`](https://github.com/mastra-ai/mastra/commit/27c0009777a6073d7631b0eb7b481d94e165b5ca), [`dee388d`](https://github.com/mastra-ai/mastra/commit/dee388dde02f2e63c53385ae69252a47ab6825cc), [`3f3fc30`](https://github.com/mastra-ai/mastra/commit/3f3fc3096f24c4a26cffeecfe73085928f72aa63), [`d90ea65`](https://github.com/mastra-ai/mastra/commit/d90ea6536f7aa51c6545a4e9215b55858e98e16d), [`d171e55`](https://github.com/mastra-ai/mastra/commit/d171e559ead9f52ec728d424844c8f7b164c4510), [`10c2735`](https://github.com/mastra-ai/mastra/commit/10c27355edfdad1ee2b826b897df74125eb81fb8), [`1924cf0`](https://github.com/mastra-ai/mastra/commit/1924cf06816e5e4d4d5333065ec0f4bb02a97799), [`b339816`](https://github.com/mastra-ai/mastra/commit/b339816df0984d0243d944ac2655d6ba5f809cde)]:
|
|
79
|
+
- @mastra/core@1.0.0-beta.15
|
|
80
|
+
- @mastra/observability@1.0.0-beta.7
|
|
81
|
+
|
|
82
|
+
## 1.0.0-beta.6
|
|
83
|
+
|
|
84
|
+
### Patch Changes
|
|
85
|
+
|
|
86
|
+
- Updated dependencies [[`4f94ed8`](https://github.com/mastra-ai/mastra/commit/4f94ed8177abfde3ec536e3574883e075423350c), [`ac3cc23`](https://github.com/mastra-ai/mastra/commit/ac3cc2397d1966bc0fc2736a223abc449d3c7719), [`a86f4df`](https://github.com/mastra-ai/mastra/commit/a86f4df0407311e0d2ea49b9a541f0938810d6a9), [`029540c`](https://github.com/mastra-ai/mastra/commit/029540ca1e582fc2dd8d288ecd4a9b0f31a954ef), [`f1bbc94`](https://github.com/mastra-ai/mastra/commit/f1bbc941934a4806f5512b3fb1507c77420336b1), [`66741d1`](https://github.com/mastra-ai/mastra/commit/66741d1a99c4f42cf23a16109939e8348ac6852e), [`01b20fe`](https://github.com/mastra-ai/mastra/commit/01b20fefb7c67c2b7d79417598ef4e60256d1225), [`0dbf199`](https://github.com/mastra-ai/mastra/commit/0dbf199110f22192ce5c95b1c8148d4872b4d119), [`a7ce182`](https://github.com/mastra-ai/mastra/commit/a7ce1822a8785ce45d62dd5c911af465e144f7d7)]:
|
|
87
|
+
- @mastra/core@1.0.0-beta.14
|
|
88
|
+
- @mastra/observability@1.0.0-beta.6
|
|
89
|
+
|
|
90
|
+
## 1.0.0-beta.5
|
|
91
|
+
|
|
92
|
+
### Patch Changes
|
|
93
|
+
|
|
94
|
+
- Updated dependencies [[`d5ed981`](https://github.com/mastra-ai/mastra/commit/d5ed981c8701c1b8a27a5f35a9a2f7d9244e695f), [`9650cce`](https://github.com/mastra-ai/mastra/commit/9650cce52a1d917ff9114653398e2a0f5c3ba808), [`932d63d`](https://github.com/mastra-ai/mastra/commit/932d63dd51be9c8bf1e00e3671fe65606c6fb9cd), [`b760b73`](https://github.com/mastra-ai/mastra/commit/b760b731aca7c8a3f041f61d57a7f125ae9cb215), [`695a621`](https://github.com/mastra-ai/mastra/commit/695a621528bdabeb87f83c2277cf2bb084c7f2b4), [`2b459f4`](https://github.com/mastra-ai/mastra/commit/2b459f466fd91688eeb2a44801dc23f7f8a887ab), [`486352b`](https://github.com/mastra-ai/mastra/commit/486352b66c746602b68a95839f830de14c7fb8c0), [`09e4bae`](https://github.com/mastra-ai/mastra/commit/09e4bae18dd5357d2ae078a4a95a2af32168ab08), [`24b76d8`](https://github.com/mastra-ai/mastra/commit/24b76d8e17656269c8ed09a0c038adb9cc2ae95a), [`243a823`](https://github.com/mastra-ai/mastra/commit/243a8239c5906f5c94e4f78b54676793f7510ae3), [`486352b`](https://github.com/mastra-ai/mastra/commit/486352b66c746602b68a95839f830de14c7fb8c0), [`c61fac3`](https://github.com/mastra-ai/mastra/commit/c61fac3add96f0dcce0208c07415279e2537eb62), [`6f14f70`](https://github.com/mastra-ai/mastra/commit/6f14f706ccaaf81b69544b6c1b75ab66a41e5317), [`09e4bae`](https://github.com/mastra-ai/mastra/commit/09e4bae18dd5357d2ae078a4a95a2af32168ab08), [`4524734`](https://github.com/mastra-ai/mastra/commit/45247343e384717a7c8404296275c56201d6470f), [`2a53598`](https://github.com/mastra-ai/mastra/commit/2a53598c6d8cfeb904a7fc74e57e526d751c8fa6), [`c7cd3c7`](https://github.com/mastra-ai/mastra/commit/c7cd3c7a187d7aaf79e2ca139de328bf609a14b4), [`5a632bd`](https://github.com/mastra-ai/mastra/commit/5a632bdf7b78953b664f5e038e98d4ba5f971e47), [`847c212`](https://github.com/mastra-ai/mastra/commit/847c212caba7df0d6f2fc756b494ac3c75c3720d), [`6f941c4`](https://github.com/mastra-ai/mastra/commit/6f941c438ca5f578619788acc7608fc2e23bd176)]:
|
|
95
|
+
- @mastra/core@1.0.0-beta.12
|
|
96
|
+
- @mastra/observability@1.0.0-beta.5
|
|
97
|
+
|
|
98
|
+
## 1.0.0-beta.4
|
|
99
|
+
|
|
100
|
+
### Patch Changes
|
|
101
|
+
|
|
102
|
+
- Fixed CachedToken tracking in all Observability Exporters. Also fixed TimeToFirstToken in Langfuse, Braintrust, PostHog exporters. Fixed trace formatting in Posthog Exporter. ([#11029](https://github.com/mastra-ai/mastra/pull/11029))
|
|
103
|
+
|
|
104
|
+
- Updated dependencies [[`edb07e4`](https://github.com/mastra-ai/mastra/commit/edb07e49283e0c28bd094a60e03439bf6ecf0221), [`b7e17d3`](https://github.com/mastra-ai/mastra/commit/b7e17d3f5390bb5a71efc112204413656fcdc18d), [`261473a`](https://github.com/mastra-ai/mastra/commit/261473ac637e633064a22076671e2e02b002214d), [`5d7000f`](https://github.com/mastra-ai/mastra/commit/5d7000f757cd65ea9dc5b05e662fd83dfd44e932), [`4f0331a`](https://github.com/mastra-ai/mastra/commit/4f0331a79bf6eb5ee598a5086e55de4b5a0ada03), [`8a000da`](https://github.com/mastra-ai/mastra/commit/8a000da0c09c679a2312f6b3aa05b2ca78ca7393)]:
|
|
105
|
+
- @mastra/core@1.0.0-beta.10
|
|
106
|
+
- @mastra/observability@1.0.0-beta.4
|
|
107
|
+
|
|
108
|
+
## 1.0.0-beta.3
|
|
109
|
+
|
|
110
|
+
### Patch Changes
|
|
111
|
+
|
|
112
|
+
- Add time-to-first-token (TTFT) support for Langfuse integration ([#10781](https://github.com/mastra-ai/mastra/pull/10781))
|
|
113
|
+
|
|
114
|
+
Adds `completionStartTime` to model generation spans, which Langfuse uses to calculate TTFT metrics. The timestamp is automatically captured when the first content chunk arrives during streaming.
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// completionStartTime is now automatically captured and sent to Langfuse
|
|
118
|
+
// enabling TTFT metrics in your Langfuse dashboard
|
|
119
|
+
const result = await agent.stream('Hello');
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
- Fix Langfuse exporter to reuse existing traces when multiple root spans share the same traceId. This resolves an issue where multiple agent.stream() calls with client-side tools would create separate traces in Langfuse instead of grouping them under a single trace. The exporter now checks if a trace already exists before creating a new one, allowing proper trace consolidation for conversations with multiple agent interactions. ([#10838](https://github.com/mastra-ai/mastra/pull/10838))
|
|
123
|
+
|
|
124
|
+
Fixes #8830
|
|
125
|
+
|
|
126
|
+
- link langfuse prompts and helper functions ([#10738](https://github.com/mastra-ai/mastra/pull/10738))
|
|
127
|
+
|
|
128
|
+
- Updated dependencies [[`6c59a40`](https://github.com/mastra-ai/mastra/commit/6c59a40e0ad160467bd13d63a8a287028d75b02d), [`3076c67`](https://github.com/mastra-ai/mastra/commit/3076c6778b18988ae7d5c4c5c466366974b2d63f), [`85d7ee1`](https://github.com/mastra-ai/mastra/commit/85d7ee18ff4e14d625a8a30ec6656bb49804989b), [`c6c1092`](https://github.com/mastra-ai/mastra/commit/c6c1092f8fbf76109303f69e000e96fd1960c4ce), [`81dc110`](https://github.com/mastra-ai/mastra/commit/81dc11008d147cf5bdc8996ead1aa61dbdebb6fc), [`7aedb74`](https://github.com/mastra-ai/mastra/commit/7aedb74883adf66af38e270e4068fd42e7a37036), [`8f02d80`](https://github.com/mastra-ai/mastra/commit/8f02d800777397e4b45d7f1ad041988a8b0c6630), [`d7aad50`](https://github.com/mastra-ai/mastra/commit/d7aad501ce61646b76b4b511e558ac4eea9884d0), [`ce0a73a`](https://github.com/mastra-ai/mastra/commit/ce0a73abeaa75b10ca38f9e40a255a645d50ebfb), [`a02e542`](https://github.com/mastra-ai/mastra/commit/a02e542d23179bad250b044b17ff023caa61739f), [`a372c64`](https://github.com/mastra-ai/mastra/commit/a372c640ad1fd12e8f0613cebdc682fc156b4d95), [`8846867`](https://github.com/mastra-ai/mastra/commit/8846867ffa9a3746767618e314bebac08eb77d87), [`0bada2f`](https://github.com/mastra-ai/mastra/commit/0bada2f2c1234932cf30c1c47a719ffb64b801c5), [`42a42cf`](https://github.com/mastra-ai/mastra/commit/42a42cf3132b9786feecbb8c13c583dce5b0e198), [`cc60ff6`](https://github.com/mastra-ai/mastra/commit/cc60ff616541a3b0fb531a7e469bf9ae7bb90528), [`ae08bf0`](https://github.com/mastra-ai/mastra/commit/ae08bf0ebc6a4e4da992b711c4a389c32ba84cf4), [`21735a7`](https://github.com/mastra-ai/mastra/commit/21735a7ef306963554a69a89b44f06c3bcd85141), [`1d877b8`](https://github.com/mastra-ai/mastra/commit/1d877b8d7b536a251c1a7a18db7ddcf4f68d6f8b)]:
|
|
129
|
+
- @mastra/observability@1.0.0-beta.3
|
|
130
|
+
- @mastra/core@1.0.0-beta.7
|
|
131
|
+
|
|
132
|
+
## 1.0.0-beta.2
|
|
133
|
+
|
|
134
|
+
### Minor Changes
|
|
135
|
+
|
|
136
|
+
- Adds trace tagging support to the BrainTrust and Langfuse tracing exporters. ([#10765](https://github.com/mastra-ai/mastra/pull/10765))
|
|
137
|
+
|
|
138
|
+
### Patch Changes
|
|
139
|
+
|
|
140
|
+
- Updated dependencies [[`ac0d2f4`](https://github.com/mastra-ai/mastra/commit/ac0d2f4ff8831f72c1c66c2be809706d17f65789), [`1a0d3fc`](https://github.com/mastra-ai/mastra/commit/1a0d3fc811482c9c376cdf79ee615c23bae9b2d6), [`85a628b`](https://github.com/mastra-ai/mastra/commit/85a628b1224a8f64cd82ea7f033774bf22df7a7e), [`c237233`](https://github.com/mastra-ai/mastra/commit/c23723399ccedf7f5744b3f40997b79246bfbe64), [`15f9e21`](https://github.com/mastra-ai/mastra/commit/15f9e216177201ea6e3f6d0bfb063fcc0953444f), [`ff94dea`](https://github.com/mastra-ai/mastra/commit/ff94dea935f4e34545c63bcb6c29804732698809), [`5b2ff46`](https://github.com/mastra-ai/mastra/commit/5b2ff4651df70c146523a7fca773f8eb0a2272f8), [`db41688`](https://github.com/mastra-ai/mastra/commit/db4168806d007417e2e60b4f68656dca4e5f40c9), [`103586c`](https://github.com/mastra-ai/mastra/commit/103586cb23ebcd2466c7f68a71674d37cc10e263), [`5ca599d`](https://github.com/mastra-ai/mastra/commit/5ca599d0bb59a1595f19f58473fcd67cc71cef58), [`bff1145`](https://github.com/mastra-ai/mastra/commit/bff114556b3cbadad9b2768488708f8ad0e91475), [`5c8ca24`](https://github.com/mastra-ai/mastra/commit/5c8ca247094e0cc2cdbd7137822fb47241f86e77), [`e191844`](https://github.com/mastra-ai/mastra/commit/e1918444ca3f80e82feef1dad506cd4ec6e2875f), [`22553f1`](https://github.com/mastra-ai/mastra/commit/22553f11c63ee5e966a9c034a349822249584691), [`7237163`](https://github.com/mastra-ai/mastra/commit/72371635dbf96a87df4b073cc48fc655afbdce3d), [`2500740`](https://github.com/mastra-ai/mastra/commit/2500740ea23da067d6e50ec71c625ab3ce275e64), [`873ecbb`](https://github.com/mastra-ai/mastra/commit/873ecbb517586aa17d2f1e99283755b3ebb2863f), [`4f9bbe5`](https://github.com/mastra-ai/mastra/commit/4f9bbe5968f42c86f4930b8193de3c3c17e5bd36), [`02e51fe`](https://github.com/mastra-ai/mastra/commit/02e51feddb3d4155cfbcc42624fd0d0970d032c0), [`8f3fa3a`](https://github.com/mastra-ai/mastra/commit/8f3fa3a652bb77da092f913ec51ae46e3a7e27dc), [`cd29ad2`](https://github.com/mastra-ai/mastra/commit/cd29ad23a255534e8191f249593849ed29160886), [`bdf4d8c`](https://github.com/mastra-ai/mastra/commit/bdf4d8cdc656d8a2c21d81834bfa3bfa70f56c16), [`854e3da`](https://github.com/mastra-ai/mastra/commit/854e3dad5daac17a91a20986399d3a51f54bf68b), [`ce18d38`](https://github.com/mastra-ai/mastra/commit/ce18d38678c65870350d123955014a8432075fd9), [`cccf9c8`](https://github.com/mastra-ai/mastra/commit/cccf9c8b2d2dfc1a5e63919395b83d78c89682a0), [`61a5705`](https://github.com/mastra-ai/mastra/commit/61a570551278b6743e64243b3ce7d73de915ca8a), [`db70a48`](https://github.com/mastra-ai/mastra/commit/db70a48aeeeeb8e5f92007e8ede52c364ce15287), [`f0fdc14`](https://github.com/mastra-ai/mastra/commit/f0fdc14ee233d619266b3d2bbdeea7d25cfc6d13), [`db18bc9`](https://github.com/mastra-ai/mastra/commit/db18bc9c3825e2c1a0ad9a183cc9935f6691bfa1), [`9b37b56`](https://github.com/mastra-ai/mastra/commit/9b37b565e1f2a76c24f728945cc740c2b09be9da), [`41a23c3`](https://github.com/mastra-ai/mastra/commit/41a23c32f9877d71810f37e24930515df2ff7a0f), [`5d171ad`](https://github.com/mastra-ai/mastra/commit/5d171ad9ef340387276b77c2bb3e83e83332d729), [`f03ae60`](https://github.com/mastra-ai/mastra/commit/f03ae60500fe350c9d828621006cdafe1975fdd8), [`d1e74a0`](https://github.com/mastra-ai/mastra/commit/d1e74a0a293866dece31022047f5dbab65a304d0), [`39e7869`](https://github.com/mastra-ai/mastra/commit/39e7869bc7d0ee391077ce291474d8a84eedccff), [`5761926`](https://github.com/mastra-ai/mastra/commit/57619260c4a2cdd598763abbacd90de594c6bc76), [`c900fdd`](https://github.com/mastra-ai/mastra/commit/c900fdd504c41348efdffb205cfe80d48c38fa33), [`604a79f`](https://github.com/mastra-ai/mastra/commit/604a79fecf276e26a54a3fe01bb94e65315d2e0e), [`887f0b4`](https://github.com/mastra-ai/mastra/commit/887f0b4746cdbd7cb7d6b17ac9f82aeb58037ea5), [`2562143`](https://github.com/mastra-ai/mastra/commit/256214336b4faa78646c9c1776612393790d8784), [`ef11a61`](https://github.com/mastra-ai/mastra/commit/ef11a61920fa0ed08a5b7ceedd192875af119749)]:
|
|
141
|
+
- @mastra/core@1.0.0-beta.6
|
|
142
|
+
- @mastra/observability@1.0.0-beta.2
|
|
143
|
+
|
|
3
144
|
## 1.0.0-beta.1
|
|
4
145
|
|
|
5
146
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -10,22 +10,54 @@ npm install @mastra/langfuse
|
|
|
10
10
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
|
+
### Zero-Config Setup
|
|
14
|
+
|
|
15
|
+
The exporter automatically reads credentials from environment variables:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Required
|
|
19
|
+
LANGFUSE_PUBLIC_KEY=pk-lf-...
|
|
20
|
+
LANGFUSE_SECRET_KEY=sk-lf-...
|
|
21
|
+
|
|
22
|
+
# Optional - defaults to Langfuse cloud
|
|
23
|
+
LANGFUSE_BASE_URL=https://cloud.langfuse.com
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { LangfuseExporter } from '@mastra/langfuse';
|
|
28
|
+
|
|
29
|
+
const mastra = new Mastra({
|
|
30
|
+
...,
|
|
31
|
+
observability: {
|
|
32
|
+
configs: {
|
|
33
|
+
langfuse: {
|
|
34
|
+
serviceName: 'my-service',
|
|
35
|
+
exporters: [new LangfuseExporter()],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Explicit Configuration
|
|
43
|
+
|
|
44
|
+
You can also pass credentials directly:
|
|
45
|
+
|
|
13
46
|
```typescript
|
|
14
47
|
import { LangfuseExporter } from '@mastra/langfuse';
|
|
15
48
|
|
|
16
|
-
// Use with Mastra
|
|
17
49
|
const mastra = new Mastra({
|
|
18
50
|
...,
|
|
19
51
|
observability: {
|
|
20
52
|
configs: {
|
|
21
53
|
langfuse: {
|
|
22
|
-
serviceName: 'service',
|
|
54
|
+
serviceName: 'my-service',
|
|
23
55
|
exporters: [
|
|
24
56
|
new LangfuseExporter({
|
|
25
|
-
publicKey:
|
|
26
|
-
secretKey:
|
|
27
|
-
baseUrl:
|
|
28
|
-
realtime: true,
|
|
57
|
+
publicKey: 'pk-lf-...',
|
|
58
|
+
secretKey: 'sk-lf-...',
|
|
59
|
+
baseUrl: 'https://cloud.langfuse.com', // Optional
|
|
60
|
+
realtime: true, // Optional - flush after each event
|
|
29
61
|
}),
|
|
30
62
|
],
|
|
31
63
|
},
|
|
@@ -34,6 +66,16 @@ const mastra = new Mastra({
|
|
|
34
66
|
});
|
|
35
67
|
```
|
|
36
68
|
|
|
69
|
+
### Configuration Options
|
|
70
|
+
|
|
71
|
+
| Option | Type | Description |
|
|
72
|
+
| ----------- | --------- | ---------------------------------------------------------------------------- |
|
|
73
|
+
| `publicKey` | `string` | Langfuse public key. Defaults to `LANGFUSE_PUBLIC_KEY` env var |
|
|
74
|
+
| `secretKey` | `string` | Langfuse secret key. Defaults to `LANGFUSE_SECRET_KEY` env var |
|
|
75
|
+
| `baseUrl` | `string` | Langfuse host URL. Defaults to `LANGFUSE_BASE_URL` env var or Langfuse cloud |
|
|
76
|
+
| `realtime` | `boolean` | Flush after each event for immediate visibility. Defaults to `false` |
|
|
77
|
+
| `options` | `object` | Additional options to pass to the Langfuse client |
|
|
78
|
+
|
|
37
79
|
## Features
|
|
38
80
|
|
|
39
81
|
### Tracing
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Langfuse Tracing Options Helpers
|
|
3
|
+
*
|
|
4
|
+
* These helpers integrate with the `buildTracingOptions` pattern from
|
|
5
|
+
* `@mastra/observability` to add Langfuse-specific tracing features.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { buildTracingOptions } from '@mastra/observability';
|
|
10
|
+
* import { withLangfusePrompt } from '@mastra/langfuse';
|
|
11
|
+
*
|
|
12
|
+
* const prompt = await langfuse.getPrompt('my-prompt');
|
|
13
|
+
*
|
|
14
|
+
* const agent = new Agent({
|
|
15
|
+
* defaultGenerateOptions: {
|
|
16
|
+
* tracingOptions: buildTracingOptions(withLangfusePrompt(prompt)),
|
|
17
|
+
* },
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import type { TracingOptionsUpdater } from '@mastra/observability';
|
|
22
|
+
/**
|
|
23
|
+
* Langfuse prompt input - accepts either a Langfuse SDK prompt object
|
|
24
|
+
* or manual fields.
|
|
25
|
+
*/
|
|
26
|
+
export interface LangfusePromptInput {
|
|
27
|
+
/** Prompt name */
|
|
28
|
+
name?: string;
|
|
29
|
+
/** Prompt version */
|
|
30
|
+
version?: number;
|
|
31
|
+
/** Prompt UUID */
|
|
32
|
+
id?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Adds Langfuse prompt metadata to the tracing options
|
|
36
|
+
* to enable Langfuse Prompt Tracing.
|
|
37
|
+
*
|
|
38
|
+
* The metadata is added under `metadata.langfuse.prompt` and includes:
|
|
39
|
+
* - `name` - Prompt name
|
|
40
|
+
* - `version` - Prompt version
|
|
41
|
+
* - `id` - Prompt UUID
|
|
42
|
+
*
|
|
43
|
+
* All fields are deeply merged with any existing metadata.
|
|
44
|
+
*
|
|
45
|
+
* @param prompt - A Langfuse prompt object (from `langfuse.getPrompt()`) or manual fields
|
|
46
|
+
* @returns A TracingOptionsUpdater function for use with `buildTracingOptions`
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* import { buildTracingOptions } from '@mastra/observability';
|
|
51
|
+
* import { withLangfusePrompt } from '@mastra/langfuse';
|
|
52
|
+
* import { Langfuse } from 'langfuse';
|
|
53
|
+
*
|
|
54
|
+
* const langfuse = new Langfuse();
|
|
55
|
+
* const prompt = await langfuse.getPrompt('customer-support');
|
|
56
|
+
*
|
|
57
|
+
* // Use with buildTracingOptions
|
|
58
|
+
* const tracingOptions = buildTracingOptions(
|
|
59
|
+
* withLangfusePrompt(prompt),
|
|
60
|
+
* );
|
|
61
|
+
*
|
|
62
|
+
* // Or directly in agent config
|
|
63
|
+
* const agent = new Agent({
|
|
64
|
+
* name: 'support-agent',
|
|
65
|
+
* instructions: prompt.prompt,
|
|
66
|
+
* model: openai('gpt-4o'),
|
|
67
|
+
* defaultGenerateOptions: {
|
|
68
|
+
* tracingOptions: buildTracingOptions(withLangfusePrompt(prompt)),
|
|
69
|
+
* },
|
|
70
|
+
* });
|
|
71
|
+
*
|
|
72
|
+
* // Manual fields also work
|
|
73
|
+
* const tracingOptions = buildTracingOptions(
|
|
74
|
+
* withLangfusePrompt({ name: 'my-prompt', version: 1 }),
|
|
75
|
+
* );
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function withLangfusePrompt(prompt: LangfusePromptInput): TracingOptionsUpdater;
|
|
79
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,qBAAqB,CAerF"}
|
package/dist/index.cjs
CHANGED
|
@@ -6,25 +6,57 @@ var observability = require('@mastra/observability');
|
|
|
6
6
|
var langfuse = require('langfuse');
|
|
7
7
|
|
|
8
8
|
// src/tracing.ts
|
|
9
|
+
function formatUsageMetrics(usage) {
|
|
10
|
+
if (!usage) return {};
|
|
11
|
+
const metrics = {};
|
|
12
|
+
if (usage.inputTokens !== void 0) {
|
|
13
|
+
metrics.input = usage.inputTokens;
|
|
14
|
+
if (usage.inputDetails?.cacheWrite !== void 0) {
|
|
15
|
+
metrics.cache_write_input_tokens = usage.inputDetails.cacheWrite;
|
|
16
|
+
metrics.input -= metrics.cache_write_input_tokens;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (usage.inputDetails?.cacheRead !== void 0) {
|
|
20
|
+
metrics.cache_read_input_tokens = usage.inputDetails.cacheRead;
|
|
21
|
+
}
|
|
22
|
+
if (usage.outputTokens !== void 0) {
|
|
23
|
+
metrics.output = usage.outputTokens;
|
|
24
|
+
}
|
|
25
|
+
if (usage.outputDetails?.reasoning !== void 0) {
|
|
26
|
+
metrics.reasoning = usage.outputDetails.reasoning;
|
|
27
|
+
}
|
|
28
|
+
if (metrics.input && metrics.output) {
|
|
29
|
+
metrics.total = metrics.input + metrics.output;
|
|
30
|
+
if (metrics.cache_write_input_tokens) {
|
|
31
|
+
metrics.total += metrics.cache_write_input_tokens;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return metrics;
|
|
35
|
+
}
|
|
9
36
|
var LangfuseExporter = class extends observability.BaseExporter {
|
|
10
37
|
name = "langfuse";
|
|
11
38
|
client;
|
|
12
39
|
realtime;
|
|
13
40
|
traceMap = /* @__PURE__ */ new Map();
|
|
14
|
-
constructor(config) {
|
|
41
|
+
constructor(config = {}) {
|
|
15
42
|
super(config);
|
|
16
43
|
this.realtime = config.realtime ?? false;
|
|
17
|
-
|
|
44
|
+
const publicKey = config.publicKey ?? process.env.LANGFUSE_PUBLIC_KEY;
|
|
45
|
+
const secretKey = config.secretKey ?? process.env.LANGFUSE_SECRET_KEY;
|
|
46
|
+
const baseUrl = config.baseUrl ?? process.env.LANGFUSE_BASE_URL;
|
|
47
|
+
if (!publicKey || !secretKey) {
|
|
48
|
+
const publicKeySource = config.publicKey ? "from config" : process.env.LANGFUSE_PUBLIC_KEY ? "from env" : "missing";
|
|
49
|
+
const secretKeySource = config.secretKey ? "from config" : process.env.LANGFUSE_SECRET_KEY ? "from env" : "missing";
|
|
18
50
|
this.setDisabled(
|
|
19
|
-
`Missing required credentials (publicKey: ${
|
|
51
|
+
`Missing required credentials (publicKey: ${publicKeySource}, secretKey: ${secretKeySource}). Set LANGFUSE_PUBLIC_KEY and LANGFUSE_SECRET_KEY environment variables or pass them in config.`
|
|
20
52
|
);
|
|
21
53
|
this.client = null;
|
|
22
54
|
return;
|
|
23
55
|
}
|
|
24
56
|
this.client = new langfuse.Langfuse({
|
|
25
|
-
publicKey
|
|
26
|
-
secretKey
|
|
27
|
-
baseUrl
|
|
57
|
+
publicKey,
|
|
58
|
+
secretKey,
|
|
59
|
+
baseUrl,
|
|
28
60
|
...config.options
|
|
29
61
|
});
|
|
30
62
|
}
|
|
@@ -57,11 +89,18 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
57
89
|
if (!traceData) {
|
|
58
90
|
return;
|
|
59
91
|
}
|
|
92
|
+
if (!span.isRootSpan) {
|
|
93
|
+
const langfuseData = span.metadata?.langfuse;
|
|
94
|
+
traceData.spanMetadata.set(span.id, {
|
|
95
|
+
parentSpanId: span.parentSpanId,
|
|
96
|
+
langfusePrompt: langfuseData?.prompt
|
|
97
|
+
});
|
|
98
|
+
}
|
|
60
99
|
const langfuseParent = this.getLangfuseParent({ traceData, span, method });
|
|
61
100
|
if (!langfuseParent) {
|
|
62
101
|
return;
|
|
63
102
|
}
|
|
64
|
-
const payload = this.buildSpanPayload(span, true);
|
|
103
|
+
const payload = this.buildSpanPayload(span, true, traceData);
|
|
65
104
|
const langfuseSpan = span.type === observability$1.SpanType.MODEL_GENERATION ? langfuseParent.generation(payload) : langfuseParent.span(payload);
|
|
66
105
|
traceData.spans.set(span.id, langfuseSpan);
|
|
67
106
|
traceData.activeSpans.add(span.id);
|
|
@@ -92,7 +131,7 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
92
131
|
});
|
|
93
132
|
return;
|
|
94
133
|
}
|
|
95
|
-
langfuseSpan.update(this.buildSpanPayload(span, false));
|
|
134
|
+
langfuseSpan.update(this.buildSpanPayload(span, false, traceData));
|
|
96
135
|
if (isEnd) {
|
|
97
136
|
traceData.activeSpans.delete(span.id);
|
|
98
137
|
if (span.isRootSpan) {
|
|
@@ -122,7 +161,7 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
122
161
|
if (!langfuseParent) {
|
|
123
162
|
return;
|
|
124
163
|
}
|
|
125
|
-
const payload = this.buildSpanPayload(span, true);
|
|
164
|
+
const payload = this.buildSpanPayload(span, true, traceData);
|
|
126
165
|
const langfuseEvent = langfuseParent.event(payload);
|
|
127
166
|
traceData.events.set(span.id, langfuseEvent);
|
|
128
167
|
if (!span.endTime) {
|
|
@@ -130,10 +169,25 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
130
169
|
}
|
|
131
170
|
}
|
|
132
171
|
initTrace(span) {
|
|
172
|
+
if (this.traceMap.has(span.traceId)) {
|
|
173
|
+
this.logger.debug("Langfuse exporter: Reusing existing trace from local map", {
|
|
174
|
+
traceId: span.traceId,
|
|
175
|
+
spanId: span.id,
|
|
176
|
+
spanName: span.name
|
|
177
|
+
});
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
133
180
|
const trace = this.client.trace(this.buildTracePayload(span));
|
|
181
|
+
const langfuseData = span.metadata?.langfuse;
|
|
182
|
+
const spanMetadata = /* @__PURE__ */ new Map();
|
|
183
|
+
spanMetadata.set(span.id, {
|
|
184
|
+
parentSpanId: void 0,
|
|
185
|
+
langfusePrompt: langfuseData?.prompt
|
|
186
|
+
});
|
|
134
187
|
this.traceMap.set(span.traceId, {
|
|
135
188
|
trace,
|
|
136
189
|
spans: /* @__PURE__ */ new Map(),
|
|
190
|
+
spanMetadata,
|
|
137
191
|
events: /* @__PURE__ */ new Map(),
|
|
138
192
|
activeSpans: /* @__PURE__ */ new Set(),
|
|
139
193
|
rootSpanId: span.id
|
|
@@ -185,6 +239,7 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
185
239
|
if (userId) payload.userId = userId;
|
|
186
240
|
if (sessionId) payload.sessionId = sessionId;
|
|
187
241
|
if (span.input) payload.input = span.input;
|
|
242
|
+
if (span.tags?.length) payload.tags = span.tags;
|
|
188
243
|
payload.metadata = {
|
|
189
244
|
spanType: span.type,
|
|
190
245
|
...span.attributes,
|
|
@@ -193,48 +248,22 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
193
248
|
return payload;
|
|
194
249
|
}
|
|
195
250
|
/**
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
* AI SDK v5 uses: inputTokens, outputTokens
|
|
200
|
-
*
|
|
201
|
-
* This function normalizes to a unified format that Langfuse can consume,
|
|
202
|
-
* prioritizing v5 format while maintaining backward compatibility.
|
|
203
|
-
*
|
|
204
|
-
* @param usage - Token usage data from AI SDK (v4 or v5 format)
|
|
205
|
-
* @returns Normalized usage object, or undefined if no usage data available
|
|
251
|
+
* Look up the Langfuse prompt from the closest parent span that has one.
|
|
252
|
+
* This enables prompt inheritance for MODEL_GENERATION spans when the prompt
|
|
253
|
+
* is set on a parent span (e.g., AGENT_RUN) rather than directly on the generation.
|
|
206
254
|
*/
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if (outputTokens !== void 0) {
|
|
216
|
-
normalized.output = outputTokens;
|
|
217
|
-
}
|
|
218
|
-
if (usage.totalTokens !== void 0) {
|
|
219
|
-
normalized.total = usage.totalTokens;
|
|
220
|
-
} else if (normalized.input !== void 0 && normalized.output !== void 0) {
|
|
221
|
-
normalized.total = normalized.input + normalized.output;
|
|
222
|
-
}
|
|
223
|
-
if (usage.reasoningTokens !== void 0) {
|
|
224
|
-
normalized.reasoning = usage.reasoningTokens;
|
|
225
|
-
}
|
|
226
|
-
if (usage.cachedInputTokens !== void 0) {
|
|
227
|
-
normalized.cachedInput = usage.cachedInputTokens;
|
|
228
|
-
}
|
|
229
|
-
if (usage.promptCacheHitTokens !== void 0) {
|
|
230
|
-
normalized.promptCacheHit = usage.promptCacheHitTokens;
|
|
231
|
-
}
|
|
232
|
-
if (usage.promptCacheMissTokens !== void 0) {
|
|
233
|
-
normalized.promptCacheMiss = usage.promptCacheMissTokens;
|
|
255
|
+
findParentLangfusePrompt(traceData, span) {
|
|
256
|
+
let currentSpanId = span.parentSpanId;
|
|
257
|
+
while (currentSpanId) {
|
|
258
|
+
const parentMetadata = traceData.spanMetadata.get(currentSpanId);
|
|
259
|
+
if (parentMetadata?.langfusePrompt) {
|
|
260
|
+
return parentMetadata.langfusePrompt;
|
|
261
|
+
}
|
|
262
|
+
currentSpanId = parentMetadata?.parentSpanId;
|
|
234
263
|
}
|
|
235
|
-
return
|
|
264
|
+
return void 0;
|
|
236
265
|
}
|
|
237
|
-
buildSpanPayload(span, isCreate) {
|
|
266
|
+
buildSpanPayload(span, isCreate, traceData) {
|
|
238
267
|
const payload = {};
|
|
239
268
|
if (isCreate) {
|
|
240
269
|
payload.id = span.id;
|
|
@@ -245,7 +274,17 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
245
274
|
if (span.output !== void 0) payload.output = span.output;
|
|
246
275
|
if (span.endTime !== void 0) payload.endTime = span.endTime;
|
|
247
276
|
const attributes = span.attributes ?? {};
|
|
277
|
+
const resolvedTraceData = traceData ?? this.traceMap.get(span.traceId);
|
|
278
|
+
let inheritedLangfusePrompt;
|
|
279
|
+
if (span.type === observability$1.SpanType.MODEL_GENERATION && !span.metadata?.langfuse && resolvedTraceData) {
|
|
280
|
+
inheritedLangfusePrompt = this.findParentLangfusePrompt(resolvedTraceData, span);
|
|
281
|
+
}
|
|
282
|
+
const metadata = {
|
|
283
|
+
...span.metadata,
|
|
284
|
+
...inheritedLangfusePrompt ? { langfuse: { prompt: inheritedLangfusePrompt } } : {}
|
|
285
|
+
};
|
|
248
286
|
const attributesToOmit = [];
|
|
287
|
+
const metadataToOmit = [];
|
|
249
288
|
if (span.type === observability$1.SpanType.MODEL_GENERATION) {
|
|
250
289
|
const modelAttr = attributes;
|
|
251
290
|
if (modelAttr.model !== void 0) {
|
|
@@ -253,21 +292,33 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
253
292
|
attributesToOmit.push("model");
|
|
254
293
|
}
|
|
255
294
|
if (modelAttr.usage !== void 0) {
|
|
256
|
-
|
|
257
|
-
if (normalizedUsage) {
|
|
258
|
-
payload.usage = normalizedUsage;
|
|
259
|
-
}
|
|
295
|
+
payload.usageDetails = formatUsageMetrics(modelAttr.usage);
|
|
260
296
|
attributesToOmit.push("usage");
|
|
261
297
|
}
|
|
262
298
|
if (modelAttr.parameters !== void 0) {
|
|
263
299
|
payload.modelParameters = modelAttr.parameters;
|
|
264
300
|
attributesToOmit.push("parameters");
|
|
265
301
|
}
|
|
302
|
+
const langfuseData = metadata.langfuse;
|
|
303
|
+
const promptData = langfuseData?.prompt;
|
|
304
|
+
const hasNameAndVersion = promptData?.name !== void 0 && promptData?.version !== void 0;
|
|
305
|
+
const hasId = promptData?.id !== void 0;
|
|
306
|
+
if (hasNameAndVersion || hasId) {
|
|
307
|
+
payload.prompt = {};
|
|
308
|
+
if (promptData?.name !== void 0) payload.prompt.name = promptData.name;
|
|
309
|
+
if (promptData?.version !== void 0) payload.prompt.version = promptData.version;
|
|
310
|
+
if (promptData?.id !== void 0) payload.prompt.id = promptData.id;
|
|
311
|
+
metadataToOmit.push("langfuse");
|
|
312
|
+
}
|
|
313
|
+
if (modelAttr.completionStartTime !== void 0) {
|
|
314
|
+
payload.completionStartTime = modelAttr.completionStartTime;
|
|
315
|
+
attributesToOmit.push("completionStartTime");
|
|
316
|
+
}
|
|
266
317
|
}
|
|
267
318
|
payload.metadata = {
|
|
268
319
|
spanType: span.type,
|
|
269
320
|
...utils.omitKeys(attributes, attributesToOmit),
|
|
270
|
-
...
|
|
321
|
+
...utils.omitKeys(metadata, metadataToOmit)
|
|
271
322
|
};
|
|
272
323
|
if (span.errorInfo) {
|
|
273
324
|
payload.level = "ERROR";
|
|
@@ -313,6 +364,26 @@ var LangfuseExporter = class extends observability.BaseExporter {
|
|
|
313
364
|
}
|
|
314
365
|
};
|
|
315
366
|
|
|
367
|
+
// src/helpers.ts
|
|
368
|
+
function withLangfusePrompt(prompt) {
|
|
369
|
+
return (opts) => ({
|
|
370
|
+
...opts,
|
|
371
|
+
metadata: {
|
|
372
|
+
...opts.metadata,
|
|
373
|
+
langfuse: {
|
|
374
|
+
...opts.metadata?.langfuse,
|
|
375
|
+
prompt: {
|
|
376
|
+
...prompt.name !== void 0 && { name: prompt.name },
|
|
377
|
+
...prompt.version !== void 0 && { version: prompt.version },
|
|
378
|
+
...prompt.id !== void 0 && { id: prompt.id }
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
|
|
316
385
|
exports.LangfuseExporter = LangfuseExporter;
|
|
386
|
+
exports.formatUsageMetrics = formatUsageMetrics;
|
|
387
|
+
exports.withLangfusePrompt = withLangfusePrompt;
|
|
317
388
|
//# sourceMappingURL=index.cjs.map
|
|
318
389
|
//# sourceMappingURL=index.cjs.map
|