convex-langfuse 0.0.1

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 (52) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +334 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +3 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/index.d.ts +166 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +223 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/component/_generated/api.d.ts +34 -0
  12. package/dist/component/_generated/api.d.ts.map +1 -0
  13. package/dist/component/_generated/api.js +31 -0
  14. package/dist/component/_generated/api.js.map +1 -0
  15. package/dist/component/_generated/component.d.ts +157 -0
  16. package/dist/component/_generated/component.d.ts.map +1 -0
  17. package/dist/component/_generated/component.js +11 -0
  18. package/dist/component/_generated/component.js.map +1 -0
  19. package/dist/component/_generated/dataModel.d.ts +46 -0
  20. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  21. package/dist/component/_generated/dataModel.js +11 -0
  22. package/dist/component/_generated/dataModel.js.map +1 -0
  23. package/dist/component/_generated/server.d.ts +133 -0
  24. package/dist/component/_generated/server.d.ts.map +1 -0
  25. package/dist/component/_generated/server.js +80 -0
  26. package/dist/component/_generated/server.js.map +1 -0
  27. package/dist/component/convex.config.d.ts +3 -0
  28. package/dist/component/convex.config.d.ts.map +1 -0
  29. package/dist/component/convex.config.js +4 -0
  30. package/dist/component/convex.config.js.map +1 -0
  31. package/dist/component/lib.d.ts +133 -0
  32. package/dist/component/lib.d.ts.map +1 -0
  33. package/dist/component/lib.js +214 -0
  34. package/dist/component/lib.js.map +1 -0
  35. package/dist/component/schema.d.ts +83 -0
  36. package/dist/component/schema.d.ts.map +1 -0
  37. package/dist/component/schema.js +48 -0
  38. package/dist/component/schema.js.map +1 -0
  39. package/package.json +106 -0
  40. package/src/client/_generated/_ignore.ts +1 -0
  41. package/src/client/index.ts +322 -0
  42. package/src/client/setup.test.ts +26 -0
  43. package/src/component/_generated/api.ts +50 -0
  44. package/src/component/_generated/component.ts +222 -0
  45. package/src/component/_generated/dataModel.ts +60 -0
  46. package/src/component/_generated/server.ts +169 -0
  47. package/src/component/convex.config.ts +5 -0
  48. package/src/component/lib.test.ts +130 -0
  49. package/src/component/lib.ts +252 -0
  50. package/src/component/schema.ts +66 -0
  51. package/src/component/setup.test.ts +11 -0
  52. package/src/test.ts +18 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ declare const _default: import("convex/server").SchemaDefinition<{
2
+ traces: import("convex/server").TableDefinition<import("convex/values").VObject<{
3
+ sessionId?: string | undefined;
4
+ userId?: string | undefined;
5
+ metadata?: string | undefined;
6
+ release?: string | undefined;
7
+ tags?: string[] | undefined;
8
+ traceId: string;
9
+ name: string;
10
+ createdAt: number;
11
+ updatedAt: number;
12
+ }, {
13
+ traceId: import("convex/values").VString<string, "required">;
14
+ name: import("convex/values").VString<string, "required">;
15
+ userId: import("convex/values").VString<string | undefined, "optional">;
16
+ sessionId: import("convex/values").VString<string | undefined, "optional">;
17
+ tags: import("convex/values").VArray<string[] | undefined, import("convex/values").VString<string, "required">, "optional">;
18
+ metadata: import("convex/values").VString<string | undefined, "optional">;
19
+ release: import("convex/values").VString<string | undefined, "optional">;
20
+ createdAt: import("convex/values").VFloat64<number, "required">;
21
+ updatedAt: import("convex/values").VFloat64<number, "required">;
22
+ }, "required", "traceId" | "sessionId" | "userId" | "metadata" | "name" | "release" | "tags" | "createdAt" | "updatedAt">, {
23
+ by_traceId: ["traceId", "_creationTime"];
24
+ by_userId: ["userId", "_creationTime"];
25
+ by_sessionId: ["sessionId", "_creationTime"];
26
+ }, {}, {}>;
27
+ observations: import("convex/server").TableDefinition<import("convex/values").VObject<{
28
+ input?: string | undefined;
29
+ inputTokens?: number | undefined;
30
+ metadata?: string | undefined;
31
+ model?: string | undefined;
32
+ output?: string | undefined;
33
+ outputTokens?: number | undefined;
34
+ statusMessage?: string | undefined;
35
+ traceId: string;
36
+ endedAt: number;
37
+ level: "DEBUG" | "DEFAULT" | "WARNING" | "ERROR";
38
+ name: string;
39
+ observationId: string;
40
+ startedAt: number;
41
+ type: "span" | "generation" | "event" | "embedding" | "agent" | "tool" | "chain" | "retriever" | "guardrail" | "evaluator";
42
+ createdAt: number;
43
+ }, {
44
+ observationId: import("convex/values").VString<string, "required">;
45
+ traceId: import("convex/values").VString<string, "required">;
46
+ type: import("convex/values").VUnion<"span" | "generation" | "event" | "embedding" | "agent" | "tool" | "chain" | "retriever" | "guardrail" | "evaluator", [import("convex/values").VLiteral<"span", "required">, import("convex/values").VLiteral<"generation", "required">, import("convex/values").VLiteral<"event", "required">, import("convex/values").VLiteral<"embedding", "required">, import("convex/values").VLiteral<"agent", "required">, import("convex/values").VLiteral<"tool", "required">, import("convex/values").VLiteral<"chain", "required">, import("convex/values").VLiteral<"retriever", "required">, import("convex/values").VLiteral<"guardrail", "required">, import("convex/values").VLiteral<"evaluator", "required">], "required", never>;
47
+ name: import("convex/values").VString<string, "required">;
48
+ input: import("convex/values").VString<string | undefined, "optional">;
49
+ output: import("convex/values").VString<string | undefined, "optional">;
50
+ model: import("convex/values").VString<string | undefined, "optional">;
51
+ inputTokens: import("convex/values").VFloat64<number | undefined, "optional">;
52
+ outputTokens: import("convex/values").VFloat64<number | undefined, "optional">;
53
+ level: import("convex/values").VUnion<"DEBUG" | "DEFAULT" | "WARNING" | "ERROR", [import("convex/values").VLiteral<"DEBUG", "required">, import("convex/values").VLiteral<"DEFAULT", "required">, import("convex/values").VLiteral<"WARNING", "required">, import("convex/values").VLiteral<"ERROR", "required">], "required", never>;
54
+ statusMessage: import("convex/values").VString<string | undefined, "optional">;
55
+ metadata: import("convex/values").VString<string | undefined, "optional">;
56
+ startedAt: import("convex/values").VFloat64<number, "required">;
57
+ endedAt: import("convex/values").VFloat64<number, "required">;
58
+ createdAt: import("convex/values").VFloat64<number, "required">;
59
+ }, "required", "traceId" | "endedAt" | "input" | "inputTokens" | "level" | "metadata" | "model" | "name" | "observationId" | "output" | "outputTokens" | "startedAt" | "statusMessage" | "type" | "createdAt">, {
60
+ by_observationId: ["observationId", "_creationTime"];
61
+ by_traceId: ["traceId", "_creationTime"];
62
+ }, {}, {}>;
63
+ scores: import("convex/server").TableDefinition<import("convex/values").VObject<{
64
+ comment?: string | undefined;
65
+ traceId: string;
66
+ name: string;
67
+ scoreId: string;
68
+ value: number;
69
+ createdAt: number;
70
+ }, {
71
+ scoreId: import("convex/values").VString<string, "required">;
72
+ traceId: import("convex/values").VString<string, "required">;
73
+ name: import("convex/values").VString<string, "required">;
74
+ value: import("convex/values").VFloat64<number, "required">;
75
+ comment: import("convex/values").VString<string | undefined, "optional">;
76
+ createdAt: import("convex/values").VFloat64<number, "required">;
77
+ }, "required", "traceId" | "name" | "comment" | "scoreId" | "value" | "createdAt">, {
78
+ by_scoreId: ["scoreId", "_creationTime"];
79
+ by_traceId: ["traceId", "_creationTime"];
80
+ }, {}, {}>;
81
+ }, true>;
82
+ export default _default;
83
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,wBA8DG"}
@@ -0,0 +1,48 @@
1
+ import { defineSchema, defineTable } from "convex/server";
2
+ import { v } from "convex/values";
3
+ export default defineSchema({
4
+ traces: defineTable({
5
+ traceId: v.string(),
6
+ name: v.string(),
7
+ userId: v.optional(v.string()),
8
+ sessionId: v.optional(v.string()),
9
+ tags: v.optional(v.array(v.string())),
10
+ metadata: v.optional(v.string()),
11
+ release: v.optional(v.string()),
12
+ createdAt: v.number(),
13
+ updatedAt: v.number(),
14
+ })
15
+ .index("by_traceId", ["traceId"])
16
+ .index("by_userId", ["userId"])
17
+ .index("by_sessionId", ["sessionId"]),
18
+ observations: defineTable({
19
+ observationId: v.string(),
20
+ traceId: v.string(),
21
+ type: v.union(v.literal("span"), v.literal("generation"), v.literal("event"), v.literal("embedding"), v.literal("agent"), v.literal("tool"), v.literal("chain"), v.literal("retriever"), v.literal("guardrail"), v.literal("evaluator")),
22
+ name: v.string(),
23
+ input: v.optional(v.string()),
24
+ output: v.optional(v.string()),
25
+ model: v.optional(v.string()),
26
+ inputTokens: v.optional(v.number()),
27
+ outputTokens: v.optional(v.number()),
28
+ level: v.union(v.literal("DEBUG"), v.literal("DEFAULT"), v.literal("WARNING"), v.literal("ERROR")),
29
+ statusMessage: v.optional(v.string()),
30
+ metadata: v.optional(v.string()),
31
+ startedAt: v.number(),
32
+ endedAt: v.number(),
33
+ createdAt: v.number(),
34
+ })
35
+ .index("by_observationId", ["observationId"])
36
+ .index("by_traceId", ["traceId"]),
37
+ scores: defineTable({
38
+ scoreId: v.string(),
39
+ traceId: v.string(),
40
+ name: v.string(),
41
+ value: v.number(),
42
+ comment: v.optional(v.string()),
43
+ createdAt: v.number(),
44
+ })
45
+ .index("by_scoreId", ["scoreId"])
46
+ .index("by_traceId", ["traceId"]),
47
+ });
48
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,106 @@
1
+ {
2
+ "name": "convex-langfuse",
3
+ "description": "Send LLM traces, generations, and scores from your Convex app to Langfuse over OpenTelemetry, with reactive local queries.",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/sholajegede/convex-langfuse.git"
7
+ },
8
+ "homepage": "https://github.com/sholajegede/convex-langfuse#readme",
9
+ "bugs": {
10
+ "url": "https://github.com/sholajegede/convex-langfuse/issues"
11
+ },
12
+ "version": "0.0.1",
13
+ "license": "Apache-2.0",
14
+ "keywords": [
15
+ "convex",
16
+ "component",
17
+ "langfuse",
18
+ "observability",
19
+ "llm",
20
+ "opentelemetry",
21
+ "tracing",
22
+ "ai"
23
+ ],
24
+ "type": "module",
25
+ "scripts": {
26
+ "dev": "run-p -r 'dev:*'",
27
+ "dev:backend": "convex dev --typecheck-components",
28
+ "dev:frontend": "cd example && vite --clearScreen false",
29
+ "dev:build": "chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial",
30
+ "predev": "path-exists .env.local dist || (npm run build && convex dev --once)",
31
+ "build": "tsc --project ./tsconfig.build.json",
32
+ "build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
33
+ "build:clean": "rm -rf dist *.tsbuildinfo && npm run build:codegen",
34
+ "typecheck": "tsc --noEmit && tsc -p example && tsc -p example/convex",
35
+ "lint": "eslint .",
36
+ "all": "run-p -r 'dev:*' 'test:watch'",
37
+ "test": "vitest run --typecheck",
38
+ "test:watch": "vitest --typecheck --clearScreen false",
39
+ "test:debug": "vitest --inspect-brk --no-file-parallelism",
40
+ "test:coverage": "vitest run --coverage --coverage.reporter=text",
41
+ "preversion": "npm install --legacy-peer-deps && npm run build:clean && run-p test lint typecheck",
42
+ "prepublishOnly": "npm whoami || npm login",
43
+ "alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
44
+ "release": "npm version patch && npm publish && git push --follow-tags",
45
+ "version": "vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
46
+ },
47
+ "files": [
48
+ "dist",
49
+ "src"
50
+ ],
51
+ "exports": {
52
+ "./package.json": "./package.json",
53
+ ".": {
54
+ "types": "./dist/client/index.d.ts",
55
+ "default": "./dist/client/index.js"
56
+ },
57
+ "./test": "./src/test.ts",
58
+ "./_generated/component.js": {
59
+ "types": "./dist/component/_generated/component.d.ts"
60
+ },
61
+ "./_generated/component": {
62
+ "types": "./dist/component/_generated/component.d.ts"
63
+ },
64
+ "./convex.config.js": {
65
+ "types": "./dist/component/convex.config.d.ts",
66
+ "default": "./dist/component/convex.config.js"
67
+ },
68
+ "./convex.config": {
69
+ "types": "./dist/component/convex.config.d.ts",
70
+ "default": "./dist/component/convex.config.js"
71
+ }
72
+ },
73
+ "peerDependencies": {
74
+ "convex": "^1.34.1"
75
+ },
76
+ "devDependencies": {
77
+ "@convex-dev/eslint-plugin": "^1.2.0",
78
+ "@edge-runtime/vm": "^5.0.0",
79
+ "@eslint/eslintrc": "^3.3.5",
80
+ "@eslint/js": "9.39.4",
81
+ "@types/node": "^24.12.0",
82
+ "@types/react": "^19.2.14",
83
+ "@types/react-dom": "^19.2.3",
84
+ "@vitejs/plugin-react": "^5.2.0",
85
+ "chokidar-cli": "3.0.0",
86
+ "convex": "1.45.0",
87
+ "convex-test": "0.0.41",
88
+ "eslint": "9.39.4",
89
+ "eslint-plugin-react": "^7.37.5",
90
+ "eslint-plugin-react-hooks": "^7.0.1",
91
+ "eslint-plugin-react-refresh": "^0.5.2",
92
+ "globals": "^17.4.0",
93
+ "npm-run-all2": "8.0.4",
94
+ "path-exists-cli": "2.0.0",
95
+ "pkg-pr-new": "^0.0.66",
96
+ "prettier": "3.8.1",
97
+ "react": "^19.2.4",
98
+ "react-dom": "^19.2.4",
99
+ "typescript": "5.9.3",
100
+ "typescript-eslint": "8.57.1",
101
+ "vite": "7.3.1",
102
+ "vitest": "4.1.0"
103
+ },
104
+ "types": "./dist/client/index.d.ts",
105
+ "module": "./dist/client/index.js"
106
+ }
@@ -0,0 +1 @@
1
+ // This is only here so convex-test can detect a _generated folder
@@ -0,0 +1,322 @@
1
+ import type { GenericActionCtx, GenericDataModel } from "convex/server";
2
+ import type { ComponentApi } from "../component/_generated/component.js";
3
+
4
+ export type LangfuseOptions = {
5
+ publicKey: string;
6
+ secretKey: string;
7
+ /** Defaults to the EU Langfuse Cloud region. */
8
+ baseUrl?: string;
9
+ };
10
+
11
+ export type ObservationLevel = "DEBUG" | "DEFAULT" | "WARNING" | "ERROR";
12
+
13
+ export type LogObservationArgs = {
14
+ /** Continue an existing trace, or omit to start a new one. */
15
+ traceId?: string;
16
+ traceName?: string;
17
+ userId?: string;
18
+ sessionId?: string;
19
+ tags?: string[];
20
+ release?: string;
21
+ traceMetadata?: Record<string, unknown>;
22
+
23
+ name: string;
24
+ input?: unknown;
25
+ output?: unknown;
26
+ model?: string;
27
+ inputTokens?: number;
28
+ outputTokens?: number;
29
+ level?: ObservationLevel;
30
+ statusMessage?: string;
31
+ metadata?: Record<string, unknown>;
32
+ startTime?: number;
33
+ endTime?: number;
34
+ };
35
+
36
+ export type LogObservationResult = {
37
+ traceId: string;
38
+ observationId: string;
39
+ };
40
+
41
+ function randomHex(byteLength: number): string {
42
+ const bytes = new Uint8Array(byteLength);
43
+ crypto.getRandomValues(bytes);
44
+ return Array.from(bytes)
45
+ .map((b) => b.toString(16).padStart(2, "0"))
46
+ .join("");
47
+ }
48
+
49
+ type OtlpAttribute = { key: string; value: Record<string, unknown> };
50
+
51
+ function attr(key: string, value: unknown): OtlpAttribute | null {
52
+ if (value === undefined || value === null) return null;
53
+ if (typeof value === "string") return { key, value: { stringValue: value } };
54
+ if (typeof value === "number") {
55
+ return Number.isInteger(value)
56
+ ? { key, value: { intValue: String(value) } }
57
+ : { key, value: { doubleValue: value } };
58
+ }
59
+ if (typeof value === "boolean") return { key, value: { boolValue: value } };
60
+ if (Array.isArray(value)) {
61
+ return {
62
+ key,
63
+ value: {
64
+ arrayValue: {
65
+ values: value.map((v) => ({ stringValue: String(v) })),
66
+ },
67
+ },
68
+ };
69
+ }
70
+ return { key, value: { stringValue: JSON.stringify(value) } };
71
+ }
72
+
73
+ function flattenMetadata(prefix: string, metadata: Record<string, unknown> | undefined): OtlpAttribute[] {
74
+ if (!metadata) return [];
75
+ return Object.entries(metadata)
76
+ .map(([k, v]) => attr(`${prefix}.${k}`, typeof v === "object" ? JSON.stringify(v) : v))
77
+ .filter((a): a is OtlpAttribute => a !== null);
78
+ }
79
+
80
+ /**
81
+ * Send LLM traces, generations, and scores to Langfuse over its OpenTelemetry
82
+ * ingestion endpoint (the legacy `/api/public/ingestion` batch API sunsets on
83
+ * Langfuse Cloud in November 2026), while keeping a reactive local copy in Convex.
84
+ */
85
+ export class Langfuse {
86
+ constructor(
87
+ private component: ComponentApi,
88
+ private options: LangfuseOptions,
89
+ ) {}
90
+
91
+ private authHeader(): string {
92
+ return `Basic ${btoa(`${this.options.publicKey}:${this.options.secretKey}`)}`;
93
+ }
94
+
95
+ private baseUrl(): string {
96
+ return this.options.baseUrl ?? "https://cloud.langfuse.com";
97
+ }
98
+
99
+ private async exportSpan(args: {
100
+ traceId: string;
101
+ spanId: string;
102
+ name: string;
103
+ startTimeUnixNano: string;
104
+ endTimeUnixNano: string;
105
+ attributes: OtlpAttribute[];
106
+ }): Promise<void> {
107
+ const body = {
108
+ resourceSpans: [
109
+ {
110
+ resource: {
111
+ attributes: [{ key: "service.name", value: { stringValue: "convex-langfuse" } }],
112
+ },
113
+ scopeSpans: [
114
+ {
115
+ scope: { name: "convex-langfuse" },
116
+ spans: [
117
+ {
118
+ traceId: args.traceId,
119
+ spanId: args.spanId,
120
+ name: args.name,
121
+ kind: 1,
122
+ startTimeUnixNano: args.startTimeUnixNano,
123
+ endTimeUnixNano: args.endTimeUnixNano,
124
+ attributes: args.attributes,
125
+ },
126
+ ],
127
+ },
128
+ ],
129
+ },
130
+ ],
131
+ };
132
+
133
+ const res = await fetch(`${this.baseUrl()}/api/public/otel/v1/traces`, {
134
+ method: "POST",
135
+ headers: {
136
+ Authorization: this.authHeader(),
137
+ "Content-Type": "application/json",
138
+ "x-langfuse-ingestion-version": "4",
139
+ },
140
+ body: JSON.stringify(body),
141
+ });
142
+
143
+ if (!res.ok) {
144
+ throw new Error(`Failed to export span to Langfuse: ${res.status} ${await res.text()}`);
145
+ }
146
+ }
147
+
148
+ private async logObservation(
149
+ ctx: GenericActionCtx<GenericDataModel>,
150
+ type:
151
+ | "span"
152
+ | "generation"
153
+ | "event"
154
+ | "embedding"
155
+ | "agent"
156
+ | "tool"
157
+ | "chain"
158
+ | "retriever"
159
+ | "guardrail"
160
+ | "evaluator",
161
+ args: LogObservationArgs,
162
+ ): Promise<LogObservationResult> {
163
+ const traceId = args.traceId ?? randomHex(16);
164
+ const spanId = randomHex(8);
165
+ const startTime = args.startTime ?? Date.now();
166
+ const endTime = args.endTime ?? startTime;
167
+
168
+ const attributes: OtlpAttribute[] = [
169
+ attr("langfuse.trace.name", args.traceName ?? args.name),
170
+ attr("langfuse.user.id", args.userId),
171
+ attr("langfuse.session.id", args.sessionId),
172
+ attr("langfuse.trace.tags", args.tags),
173
+ attr("langfuse.release", args.release),
174
+ attr("langfuse.observation.type", type),
175
+ attr("langfuse.observation.input", args.input !== undefined ? JSON.stringify(args.input) : undefined),
176
+ attr("langfuse.observation.output", args.output !== undefined ? JSON.stringify(args.output) : undefined),
177
+ attr("langfuse.observation.model.name", args.model),
178
+ attr("langfuse.observation.level", args.level ?? "DEFAULT"),
179
+ attr("langfuse.observation.status_message", args.statusMessage),
180
+ ...(args.inputTokens !== undefined || args.outputTokens !== undefined
181
+ ? [
182
+ attr(
183
+ "langfuse.observation.usage_details",
184
+ // Langfuse's usage details object uses "input"/"output"/"total",
185
+ // not "input_tokens"/"output_tokens" — the latter is silently
186
+ // ignored, so the generation shows no token usage or cost.
187
+ JSON.stringify({
188
+ input: args.inputTokens ?? 0,
189
+ output: args.outputTokens ?? 0,
190
+ total: (args.inputTokens ?? 0) + (args.outputTokens ?? 0),
191
+ }),
192
+ ),
193
+ ]
194
+ : []),
195
+ ...flattenMetadata("langfuse.trace.metadata", args.traceMetadata),
196
+ ...flattenMetadata("langfuse.observation.metadata", args.metadata),
197
+ ].filter((a): a is OtlpAttribute => a !== null);
198
+
199
+ await this.exportSpan({
200
+ traceId,
201
+ spanId,
202
+ name: args.name,
203
+ startTimeUnixNano: String(startTime * 1_000_000),
204
+ endTimeUnixNano: String(endTime * 1_000_000),
205
+ attributes,
206
+ });
207
+
208
+ await ctx.runMutation(this.component.lib.recordTrace, {
209
+ traceId,
210
+ name: args.traceName ?? args.name,
211
+ userId: args.userId,
212
+ sessionId: args.sessionId,
213
+ tags: args.tags,
214
+ metadata: args.traceMetadata ? JSON.stringify(args.traceMetadata) : undefined,
215
+ release: args.release,
216
+ });
217
+
218
+ await ctx.runMutation(this.component.lib.recordObservation, {
219
+ observationId: spanId,
220
+ traceId,
221
+ type,
222
+ name: args.name,
223
+ input: args.input !== undefined ? JSON.stringify(args.input) : undefined,
224
+ output: args.output !== undefined ? JSON.stringify(args.output) : undefined,
225
+ model: args.model,
226
+ inputTokens: args.inputTokens,
227
+ outputTokens: args.outputTokens,
228
+ level: args.level ?? "DEFAULT",
229
+ statusMessage: args.statusMessage,
230
+ metadata: args.metadata ? JSON.stringify(args.metadata) : undefined,
231
+ startedAt: startTime,
232
+ endedAt: endTime,
233
+ });
234
+
235
+ return { traceId, observationId: spanId };
236
+ }
237
+
238
+ /** Log a completed LLM call (model, input, output, token usage) as a Langfuse generation. */
239
+ async logGeneration(
240
+ ctx: GenericActionCtx<GenericDataModel>,
241
+ args: LogObservationArgs,
242
+ ): Promise<LogObservationResult> {
243
+ return await this.logObservation(ctx, "generation", args);
244
+ }
245
+
246
+ /** Log a non-LLM step (a tool call, a retrieval, a chain step) as a Langfuse span. */
247
+ async logSpan(
248
+ ctx: GenericActionCtx<GenericDataModel>,
249
+ args: LogObservationArgs,
250
+ ): Promise<LogObservationResult> {
251
+ return await this.logObservation(ctx, "span", args);
252
+ }
253
+
254
+ /** Attach an evaluation score to a trace, via Langfuse's Scores API. */
255
+ async recordScore(
256
+ ctx: GenericActionCtx<GenericDataModel>,
257
+ args: { traceId: string; name: string; value: number; comment?: string },
258
+ ): Promise<{ scoreId: string }> {
259
+ const scoreId = randomHex(16);
260
+
261
+ const res = await fetch(`${this.baseUrl()}/api/public/scores`, {
262
+ method: "POST",
263
+ headers: {
264
+ Authorization: this.authHeader(),
265
+ "Content-Type": "application/json",
266
+ },
267
+ body: JSON.stringify({
268
+ id: scoreId,
269
+ traceId: args.traceId,
270
+ name: args.name,
271
+ value: args.value,
272
+ comment: args.comment,
273
+ }),
274
+ });
275
+
276
+ if (!res.ok) {
277
+ throw new Error(`Failed to record Langfuse score: ${res.status} ${await res.text()}`);
278
+ }
279
+
280
+ await ctx.runMutation(this.component.lib.recordScore, {
281
+ scoreId,
282
+ traceId: args.traceId,
283
+ name: args.name,
284
+ value: args.value,
285
+ comment: args.comment,
286
+ });
287
+
288
+ return { scoreId };
289
+ }
290
+
291
+ async getTrace(ctx: RunQueryCtx, args: { traceId: string }) {
292
+ return await ctx.runQuery(this.component.lib.getTrace, args);
293
+ }
294
+
295
+ async listTracesByUser(ctx: RunQueryCtx, args: { userId: string; limit?: number }) {
296
+ return await ctx.runQuery(this.component.lib.listTracesByUser, args);
297
+ }
298
+
299
+ async listTracesBySession(ctx: RunQueryCtx, args: { sessionId: string; limit?: number }) {
300
+ return await ctx.runQuery(this.component.lib.listTracesBySession, args);
301
+ }
302
+
303
+ async listObservations(ctx: RunQueryCtx, args: { traceId: string }) {
304
+ return await ctx.runQuery(this.component.lib.listObservations, args);
305
+ }
306
+
307
+ async listScores(ctx: RunQueryCtx, args: { traceId: string }) {
308
+ return await ctx.runQuery(this.component.lib.listScores, args);
309
+ }
310
+
311
+ async getStats(ctx: RunQueryCtx) {
312
+ return await ctx.runQuery(this.component.lib.getStats, {});
313
+ }
314
+
315
+ async listRecentTraces(ctx: RunQueryCtx, args: { limit?: number } = {}) {
316
+ return await ctx.runQuery(this.component.lib.listRecentTraces, args);
317
+ }
318
+ }
319
+
320
+ type RunQueryCtx = {
321
+ runQuery: GenericActionCtx<GenericDataModel>["runQuery"];
322
+ };
@@ -0,0 +1,26 @@
1
+ /// <reference types="vite/client" />
2
+ import { test } from "vitest";
3
+ import { convexTest } from "convex-test";
4
+ export const modules = import.meta.glob("./**/*.*s");
5
+
6
+ import {
7
+ defineSchema,
8
+ type GenericSchema,
9
+ type SchemaDefinition,
10
+ } from "convex/server";
11
+ import { type ComponentApi } from "../component/_generated/component.js";
12
+ import { componentsGeneric } from "convex/server";
13
+ import { register } from "../test.js";
14
+
15
+ export function initConvexTest<
16
+ Schema extends SchemaDefinition<GenericSchema, boolean>,
17
+ >(schema?: Schema) {
18
+ const t = convexTest(schema ?? defineSchema({}), modules);
19
+ register(t);
20
+ return t;
21
+ }
22
+ export const components = componentsGeneric() as unknown as {
23
+ convexLangfuse: ComponentApi;
24
+ };
25
+
26
+ test("setup", () => {});