@amaster.ai/pi-telemetry 0.1.0-beta.0 → 0.1.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -38
- package/dist/config.d.ts +27 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -0
- package/dist/extension.d.ts +3 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +126 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/langfuse.d.ts +6 -3
- package/dist/langfuse.d.ts.map +1 -1
- package/dist/langfuse.js +249 -194
- package/dist/langfuse.js.map +1 -1
- package/dist/otel.d.ts +6 -3
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +32 -9
- package/dist/otel.js.map +1 -1
- package/package.json +20 -3
package/README.md
CHANGED
|
@@ -7,55 +7,85 @@ The root package exposes stable exporter contracts plus no-op and composite expo
|
|
|
7
7
|
## Entry Points
|
|
8
8
|
|
|
9
9
|
- `@amaster.ai/pi-telemetry`: stable contracts, `NoopRuntimeEventExporter`, and `CompositeRuntimeEventExporter`.
|
|
10
|
+
- `@amaster.ai/pi-telemetry/config`: `TelemetryConfig` type, `resolveConfig`, and `loadConfigFromFile`.
|
|
10
11
|
- `@amaster.ai/pi-telemetry/langfuse`: Langfuse SDK and ingestion API exporters.
|
|
11
12
|
- `@amaster.ai/pi-telemetry/otel`: generic OTLP/HTTP traces exporter.
|
|
12
13
|
|
|
13
|
-
##
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
## Configuration
|
|
15
|
+
|
|
16
|
+
Configuration is read from `.pi/settings.json` under the `"pi-telemetry"` key. Project-level settings (`.pi/settings.json` in the working directory) take priority over user-level settings (`~/.pi/agent/settings.json`).
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"pi-telemetry": {
|
|
21
|
+
"serviceName": "my-service",
|
|
22
|
+
"serviceVersion": "1.0.0",
|
|
23
|
+
"includePayloads": true,
|
|
24
|
+
"langfuse": {
|
|
25
|
+
"enabled": true,
|
|
26
|
+
"publicKey": "pk-lf-...",
|
|
27
|
+
"secretKey": "sk-lf-...",
|
|
28
|
+
"baseUrl": "https://cloud.langfuse.com",
|
|
29
|
+
"transport": "sdk",
|
|
30
|
+
"flushAt": 20,
|
|
31
|
+
"flushIntervalMs": 5000
|
|
32
|
+
},
|
|
33
|
+
"otel": {
|
|
34
|
+
"enabled": true,
|
|
35
|
+
"endpoint": "https://otel-collector.example.com",
|
|
36
|
+
"headers": { "Authorization": "Bearer ..." },
|
|
37
|
+
"flushAt": 20,
|
|
38
|
+
"flushIntervalMs": 5000
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
19
42
|
```
|
|
20
43
|
|
|
21
|
-
|
|
44
|
+
### Config Fields
|
|
45
|
+
|
|
46
|
+
| Field | Type | Default | Description |
|
|
47
|
+
|-------|------|---------|-------------|
|
|
48
|
+
| `serviceName` | `string` | `"pi-server"` | Service name for traces |
|
|
49
|
+
| `serviceVersion` | `string` | — | Service version for traces |
|
|
50
|
+
| `includePayloads` | `boolean` | `true` | Include chat payloads, tool args, LLM I/O |
|
|
51
|
+
|
|
52
|
+
### Langfuse Config
|
|
53
|
+
|
|
54
|
+
| Field | Type | Default | Description |
|
|
55
|
+
|-------|------|---------|-------------|
|
|
56
|
+
| `enabled` | `boolean` | `false` | Enable Langfuse exporter |
|
|
57
|
+
| `publicKey` | `string` | — | Langfuse public API key |
|
|
58
|
+
| `secretKey` | `string` | — | Langfuse secret API key |
|
|
59
|
+
| `baseUrl` | `string` | `"https://cloud.langfuse.com"` | Langfuse server URL |
|
|
60
|
+
| `transport` | `"sdk" \| "ingestion"` | `"sdk"` | Transport mode |
|
|
61
|
+
| `flushAt` | `number` | `20` | Batch size before flush |
|
|
62
|
+
| `flushIntervalMs` | `number` | `5000` | Flush interval in ms |
|
|
63
|
+
|
|
64
|
+
### OTEL Config
|
|
65
|
+
|
|
66
|
+
| Field | Type | Default | Description |
|
|
67
|
+
|-------|------|---------|-------------|
|
|
68
|
+
| `enabled` | `boolean` | `false` | Enable OTEL exporter |
|
|
69
|
+
| `endpoint` | `string` | — | OTLP traces endpoint |
|
|
70
|
+
| `headers` | `Record<string, string>` | — | Request headers |
|
|
71
|
+
| `flushAt` | `number` | `20` | Batch size before flush |
|
|
72
|
+
| `flushIntervalMs` | `number` | `5000` | Flush interval in ms |
|
|
73
|
+
| `errorLabel` | `string` | — | Custom label for error messages |
|
|
22
74
|
|
|
23
|
-
|
|
24
|
-
- `LANGFUSE_PUBLIC_KEY`
|
|
25
|
-
- `LANGFUSE_SECRET_KEY`
|
|
26
|
-
- `LANGFUSE_BASE_URL`
|
|
27
|
-
- `LANGFUSE_TRANSPORT`
|
|
28
|
-
- `TELEMETRY_SERVICE_NAME`
|
|
29
|
-
- `TELEMETRY_SERVICE_VERSION`
|
|
30
|
-
- `TELEMETRY_INCLUDE_PAYLOADS`
|
|
31
|
-
|
|
32
|
-
Set `TELEMETRY_INCLUDE_PAYLOADS=false` to remove chat payloads, tool args, and LLM input/output from exported telemetry. For finer control, construct a Langfuse exporter directly and pass `redactEvent`.
|
|
75
|
+
When the endpoint does not end with `/v1/traces`, the exporter appends `/v1/traces`.
|
|
33
76
|
|
|
34
|
-
##
|
|
77
|
+
## Programmatic Usage
|
|
35
78
|
|
|
36
79
|
```ts
|
|
37
|
-
import {
|
|
80
|
+
import { loadConfigFromFile, resolveConfig } from "@amaster.ai/pi-telemetry/config";
|
|
81
|
+
import { createLangfuseExporter } from "@amaster.ai/pi-telemetry/langfuse";
|
|
82
|
+
import { createOtelExporter } from "@amaster.ai/pi-telemetry/otel";
|
|
38
83
|
|
|
39
|
-
const
|
|
84
|
+
const config = resolveConfig(loadConfigFromFile());
|
|
85
|
+
const langfuse = createLangfuseExporter(config);
|
|
86
|
+
const otel = createOtelExporter(config);
|
|
40
87
|
```
|
|
41
88
|
|
|
42
|
-
Supported generic OTEL environment variables include:
|
|
43
|
-
|
|
44
|
-
- `OTEL_EXPORTER_OTLP_ENDPOINT`
|
|
45
|
-
- `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`
|
|
46
|
-
- `OTEL_EXPORTER_OTLP_HEADERS`
|
|
47
|
-
- `OTEL_EXPORTER_OTLP_TRACES_HEADERS`
|
|
48
|
-
- `OTEL_BSP_MAX_EXPORT_BATCH_SIZE`
|
|
49
|
-
- `OTEL_BSP_SCHEDULE_DELAY`
|
|
50
|
-
- `OTEL_SERVICE_NAME`
|
|
51
|
-
- `OTEL_RESOURCE_ATTRIBUTES`
|
|
52
|
-
- `OTEL_SDK_DISABLED`
|
|
53
|
-
- `TELEMETRY_INCLUDE_PAYLOADS`
|
|
54
|
-
- `TELEMETRY_SERVICE_VERSION`
|
|
55
|
-
|
|
56
|
-
When the endpoint does not end with `/v1/traces`, the exporter appends `/v1/traces`.
|
|
57
|
-
Use this entry point for any OTLP/HTTP collector, including Langfuse's OTEL endpoint.
|
|
58
|
-
|
|
59
89
|
## Privacy
|
|
60
90
|
|
|
61
|
-
Runtime events may include user prompts, assistant responses, tool arguments, tool outputs, and model inputs/outputs.
|
|
91
|
+
Runtime events may include user prompts, assistant responses, tool arguments, tool outputs, and model inputs/outputs. Set `includePayloads: false` to strip these from exported telemetry. For finer control, construct an exporter directly and pass `redactEvent`.
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface LangfuseConfig {
|
|
2
|
+
enabled?: boolean;
|
|
3
|
+
publicKey?: string;
|
|
4
|
+
secretKey?: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
transport?: 'sdk' | 'ingestion';
|
|
7
|
+
flushAt?: number;
|
|
8
|
+
flushIntervalMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface OtelConfig {
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
endpoint?: string;
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
flushAt?: number;
|
|
15
|
+
flushIntervalMs?: number;
|
|
16
|
+
errorLabel?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface TelemetryConfig {
|
|
19
|
+
serviceName?: string;
|
|
20
|
+
serviceVersion?: string;
|
|
21
|
+
includePayloads?: boolean;
|
|
22
|
+
langfuse?: LangfuseConfig;
|
|
23
|
+
otel?: OtelConfig;
|
|
24
|
+
}
|
|
25
|
+
export declare function resolveConfig(config?: TelemetryConfig): TelemetryConfig;
|
|
26
|
+
export declare function loadConfigFromFile(): TelemetryConfig;
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAOD,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,eAAe,CAEvE;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { loadPiSettings } from '@amaster.ai/pi-shared/settings';
|
|
2
|
+
const DEFAULTS = {
|
|
3
|
+
serviceName: 'pi-server',
|
|
4
|
+
includePayloads: true,
|
|
5
|
+
};
|
|
6
|
+
export function resolveConfig(config) {
|
|
7
|
+
return { ...DEFAULTS, ...config };
|
|
8
|
+
}
|
|
9
|
+
export function loadConfigFromFile() {
|
|
10
|
+
return loadPiSettings('pi-telemetry');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AA8BhE,MAAM,QAAQ,GAAoB;IAChC,WAAW,EAAE,WAAW;IACxB,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAAwB;IACpD,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,cAAc,CAAkB,cAAc,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAoBpE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAwHjE"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { loadConfigFromFile, resolveConfig } from './config.js';
|
|
3
|
+
import { CompositeRuntimeEventExporter, NoopRuntimeEventExporter, } from './index.js';
|
|
4
|
+
import { createLangfuseExporter } from './langfuse.js';
|
|
5
|
+
import { createOtelExporter } from './otel.js';
|
|
6
|
+
function extractModelConfig(payload) {
|
|
7
|
+
if (payload && typeof payload === 'object' && 'model' in payload) {
|
|
8
|
+
const model = payload.model;
|
|
9
|
+
if (typeof model === 'string') {
|
|
10
|
+
return { provider: 'unknown', model };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return { provider: 'unknown', model: 'unknown' };
|
|
14
|
+
}
|
|
15
|
+
export default function telemetryExtension(pi) {
|
|
16
|
+
let exporter = new NoopRuntimeEventExporter();
|
|
17
|
+
const sessionId = randomUUID();
|
|
18
|
+
let currentTraceId;
|
|
19
|
+
let turnStartTime;
|
|
20
|
+
let llmGenerationCounter = 0;
|
|
21
|
+
pi.on('session_start', async () => {
|
|
22
|
+
const config = resolveConfig(loadConfigFromFile());
|
|
23
|
+
const langfuse = createLangfuseExporter(config);
|
|
24
|
+
const otel = createOtelExporter(config);
|
|
25
|
+
const active = [langfuse, otel].filter((e) => !(e instanceof NoopRuntimeEventExporter));
|
|
26
|
+
if (active.length > 1) {
|
|
27
|
+
exporter = new CompositeRuntimeEventExporter(active);
|
|
28
|
+
}
|
|
29
|
+
else if (active.length === 1) {
|
|
30
|
+
exporter = active[0];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
pi.on('turn_start', async (event) => {
|
|
34
|
+
currentTraceId = randomUUID().replace(/-/g, '');
|
|
35
|
+
turnStartTime = event.timestamp;
|
|
36
|
+
llmGenerationCounter = 0;
|
|
37
|
+
await exporter.publish({
|
|
38
|
+
id: randomUUID(),
|
|
39
|
+
traceId: currentTraceId,
|
|
40
|
+
type: 'chat_turn_started',
|
|
41
|
+
sessionId,
|
|
42
|
+
createdAt: new Date(event.timestamp).toISOString(),
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
pi.on('turn_end', async () => {
|
|
46
|
+
if (!currentTraceId)
|
|
47
|
+
return;
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
const durationMs = turnStartTime ? now - turnStartTime : undefined;
|
|
50
|
+
await exporter.publish({
|
|
51
|
+
id: randomUUID(),
|
|
52
|
+
traceId: currentTraceId,
|
|
53
|
+
type: 'chat_turn_completed',
|
|
54
|
+
sessionId,
|
|
55
|
+
createdAt: new Date(now).toISOString(),
|
|
56
|
+
...(durationMs !== undefined ? { durationMs } : {}),
|
|
57
|
+
});
|
|
58
|
+
currentTraceId = undefined;
|
|
59
|
+
turnStartTime = undefined;
|
|
60
|
+
});
|
|
61
|
+
pi.on('tool_execution_start', async (event) => {
|
|
62
|
+
if (!currentTraceId)
|
|
63
|
+
return;
|
|
64
|
+
await exporter.publish({
|
|
65
|
+
id: randomUUID(),
|
|
66
|
+
traceId: currentTraceId,
|
|
67
|
+
sessionId,
|
|
68
|
+
conversationId: sessionId,
|
|
69
|
+
toolCallId: event.toolCallId,
|
|
70
|
+
toolName: event.toolName,
|
|
71
|
+
status: 'started',
|
|
72
|
+
createdAt: new Date().toISOString(),
|
|
73
|
+
args: event.args,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
pi.on('tool_execution_end', async (event) => {
|
|
77
|
+
if (!currentTraceId)
|
|
78
|
+
return;
|
|
79
|
+
await exporter.publish({
|
|
80
|
+
id: randomUUID(),
|
|
81
|
+
traceId: currentTraceId,
|
|
82
|
+
sessionId,
|
|
83
|
+
conversationId: sessionId,
|
|
84
|
+
toolCallId: event.toolCallId,
|
|
85
|
+
toolName: event.toolName,
|
|
86
|
+
status: event.isError ? 'failed' : 'completed',
|
|
87
|
+
createdAt: new Date().toISOString(),
|
|
88
|
+
...(event.isError ? { error: String(event.result) } : {}),
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
pi.on('before_provider_request', async (event) => {
|
|
92
|
+
if (!currentTraceId)
|
|
93
|
+
return;
|
|
94
|
+
llmGenerationCounter++;
|
|
95
|
+
await exporter.publish({
|
|
96
|
+
id: randomUUID(),
|
|
97
|
+
traceId: currentTraceId,
|
|
98
|
+
sessionId,
|
|
99
|
+
conversationId: sessionId,
|
|
100
|
+
llmGenerationId: `gen-${llmGenerationCounter}`,
|
|
101
|
+
status: 'started',
|
|
102
|
+
createdAt: new Date().toISOString(),
|
|
103
|
+
model: extractModelConfig(event.payload),
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
pi.on('after_provider_response', async (event) => {
|
|
107
|
+
if (!currentTraceId)
|
|
108
|
+
return;
|
|
109
|
+
await exporter.publish({
|
|
110
|
+
id: randomUUID(),
|
|
111
|
+
traceId: currentTraceId,
|
|
112
|
+
sessionId,
|
|
113
|
+
conversationId: sessionId,
|
|
114
|
+
llmGenerationId: `gen-${llmGenerationCounter}`,
|
|
115
|
+
status: event.status >= 400 ? 'failed' : 'completed',
|
|
116
|
+
createdAt: new Date().toISOString(),
|
|
117
|
+
model: extractModelConfig(undefined),
|
|
118
|
+
...(event.status >= 400 ? { error: `HTTP ${event.status}` } : {}),
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
pi.on('session_shutdown', async () => {
|
|
122
|
+
await exporter.flush?.();
|
|
123
|
+
await exporter.close?.();
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RuntimeLifecycleEvent, RuntimeLlmGenerationEvent, RuntimeToolEvent } from
|
|
1
|
+
import type { RuntimeLifecycleEvent, RuntimeLlmGenerationEvent, RuntimeToolEvent } from '@amaster.ai/pi-shared';
|
|
2
2
|
export type RuntimeTelemetryEvent = RuntimeLifecycleEvent | RuntimeToolEvent | RuntimeLlmGenerationEvent;
|
|
3
3
|
export interface RuntimeEventExporter {
|
|
4
4
|
publish(event: RuntimeTelemetryEvent): Promise<void>;
|
|
@@ -7,7 +7,7 @@ export interface RuntimeEventExporter {
|
|
|
7
7
|
}
|
|
8
8
|
export type TelemetryEnvironment = Record<string, string | undefined>;
|
|
9
9
|
export type TelemetryFetch = (input: string, init: {
|
|
10
|
-
method:
|
|
10
|
+
method: 'POST';
|
|
11
11
|
headers: Record<string, string>;
|
|
12
12
|
body: string;
|
|
13
13
|
}) => Promise<{
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,qBAAqB,GAC7B,qBAAqB,GACrB,gBAAgB,GAChB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,KACE,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,qBAAqB,KAAK,qBAAqB,GAAG,SAAS,CAAC;AAEpG,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAC7C,CAAC;AAEF,qBAAa,wBAAyB,YAAW,oBAAoB;IAC7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7B;AAED,qBAAa,6BAA8B,YAAW,oBAAoB;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,oBAAoB,EAAE;IAExD,OAAO,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqCA,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,OAAO,KAAmB,CAAC;IACjC,KAAK,CAAC,KAAK,KAAmB,CAAC;IAC/B,KAAK,CAAC,KAAK,KAAmB,CAAC;CAChC;AAED,MAAM,OAAO,6BAA6B;IACX;IAA7B,YAA6B,SAAiC;QAAjC,cAAS,GAAT,SAAS,CAAwB;IAAG,CAAC;IAElE,KAAK,CAAC,OAAO,CAAC,KAA4B;QACxC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;CACF"}
|
package/dist/langfuse.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { JsonObject } from
|
|
2
|
-
import
|
|
1
|
+
import type { JsonObject } from '@amaster.ai/pi-shared';
|
|
2
|
+
import type { TelemetryConfig } from './config.js';
|
|
3
|
+
import { type RuntimeEventExporter, type RuntimeTelemetryEvent, type RuntimeTelemetryOptions, type TelemetryEnvironment, type TelemetryFetch } from './index.js';
|
|
3
4
|
export type LangfuseExporterConfig = {
|
|
4
5
|
enabled: boolean;
|
|
5
|
-
transport:
|
|
6
|
+
transport: 'sdk' | 'ingestion';
|
|
6
7
|
publicKey: string;
|
|
7
8
|
secretKey: string;
|
|
8
9
|
baseUrl: string;
|
|
@@ -93,6 +94,8 @@ export declare class OtelRuntimeEventExporter implements RuntimeEventExporter {
|
|
|
93
94
|
private sendSpans;
|
|
94
95
|
}
|
|
95
96
|
export declare function createRuntimeEventExporterFromEnv(env: TelemetryEnvironment): RuntimeEventExporter;
|
|
97
|
+
export declare function createLangfuseExporter(telemetryConfig: TelemetryConfig): RuntimeEventExporter;
|
|
98
|
+
export declare function resolveLangfuseExporterConfig(telemetryConfig: TelemetryConfig): LangfuseExporterConfig;
|
|
96
99
|
export declare function resolveLangfuseConfig(env: TelemetryEnvironment): LangfuseExporterConfig;
|
|
97
100
|
export declare function mapRuntimeEventToLangfuse(event: RuntimeTelemetryEvent): LangfuseIngestionEvent[];
|
|
98
101
|
//# sourceMappingURL=langfuse.d.ts.map
|
package/dist/langfuse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langfuse.d.ts","sourceRoot":"","sources":["../src/langfuse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"langfuse.d.ts","sourceRoot":"","sources":["../src/langfuse.ts"],"names":[],"mappings":"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"}
|