Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9a09fa2

Browse files
authored
fix(ingestion-service): skip tokenization for obs level ERROR (#9133)
1 parent 43e0644 commit 9a09fa2

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed

worker/src/services/IngestionService/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
import { Cluster, Redis } from "ioredis";
22
import { v4 } from "uuid";
3-
import { Model, Price, PrismaClient, Prompt } from "@langfuse/shared";
3+
import {
4+
Model,
5+
ObservationLevel,
6+
Price,
7+
PrismaClient,
8+
Prompt,
9+
} from "@langfuse/shared";
410
import {
511
ClickhouseClientType,
612
convertDateToClickhouseDateTime,
@@ -803,9 +809,10 @@ export class IngestionService {
803809
);
804810

805811
if (
806-
// Manual tokenisation when no user provided usage
812+
// Manual tokenisation when no user provided usage and generation has not status ERROR
807813
model &&
808-
Object.keys(providedUsageDetails).length === 0
814+
Object.keys(providedUsageDetails).length === 0 &&
815+
observationRecord.level !== ObservationLevel.ERROR
809816
) {
810817
let newInputCount: number | undefined;
811818
let newOutputCount: number | undefined;

worker/src/services/IngestionService/tests/calculateTokenCost.unit.test.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,4 +1201,61 @@ describe("Token Cost Calculation", () => {
12011201
expect(generation.usage_details.output).toBe(generationUsage1.usage.output);
12021202
expect(generation.usage_details.total).toBe(generationUsage1.usage.total);
12031203
});
1204+
1205+
it("should skip tokenization and cost calculation if generation status is ERROR", async () => {
1206+
const generationUsage1 = {
1207+
model: modelName,
1208+
input: "hello world",
1209+
output: "hey whassup",
1210+
usage: null,
1211+
level: "ERROR",
1212+
};
1213+
1214+
const events = [
1215+
{
1216+
id: uuidv4(),
1217+
type: "generation-create",
1218+
timestamp: new Date().toISOString(),
1219+
body: {
1220+
id: generationId,
1221+
startTime: new Date().toISOString(),
1222+
...generationUsage1,
1223+
},
1224+
},
1225+
];
1226+
1227+
await (mockIngestionService as any).processObservationEventList({
1228+
projectId,
1229+
entityId: generationId,
1230+
createdAtTimestamp: new Date(),
1231+
observationEventList: events,
1232+
});
1233+
1234+
expect(mockAddToClickhouseWriter).toHaveBeenCalled();
1235+
const args = mockAddToClickhouseWriter.mock.calls[0];
1236+
const tableName = args[0];
1237+
const generation = args[1];
1238+
1239+
expect(tableName).toBe("observations");
1240+
expect(generation).toBeDefined();
1241+
expect(generation.type).toBe("GENERATION");
1242+
expect(generation.level).toBe("ERROR");
1243+
1244+
// Model name should be matched
1245+
expect(generation.internal_model_id).toBe(tokenModelData.id);
1246+
1247+
// No user provided cost
1248+
expect(generation.provided_cost_details.input).toBeUndefined();
1249+
expect(generation.provided_cost_details.output).toBeUndefined();
1250+
expect(generation.provided_cost_details.total).toBeUndefined();
1251+
1252+
// No calculated cost
1253+
expect(generation.cost_details.input).toBeUndefined();
1254+
expect(generation.cost_details.output).toBeUndefined();
1255+
expect(generation.cost_details.total).toBeUndefined();
1256+
1257+
expect(generation.usage_details.input).toBeUndefined();
1258+
expect(generation.usage_details.output).toBeUndefined();
1259+
expect(generation.usage_details.total).toBeUndefined();
1260+
});
12041261
});

0 commit comments

Comments
 (0)