UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

134 lines (117 loc) 3.16 kB
import { diffChars } from 'diff'; import { LangfuseTraceClient } from 'langfuse-core'; import { TraceEventType } from '@/const/trace'; import { TraceEventBasePayload, TraceEventCopyMessage, TraceEventDeleteAndRegenerateMessage, TraceEventModifyMessage, TraceEventRegenerateMessage, } from '@/types/trace'; /** * trace 事件得分 */ export enum EventScore { DeleteAndRegenerate = -1, Regenerate = -0.6, Modify = -0.3, Copy = 0.6, } type EventParams<T> = T & TraceEventBasePayload; export class TraceEventClient { private _trace: LangfuseTraceClient; constructor(client: LangfuseTraceClient) { this._trace = client; } private scoreObservation(params: { name: string; observationId?: string; traceId: string; value: number; }) { const { observationId, traceId, value, name } = params; // score the observation if there is an id if (observationId) { this._trace.client.score({ name, observationId, traceId, value }); } } copyMessage({ traceId, observationId, content }: EventParams<TraceEventCopyMessage>) { const score = EventScore.Copy; // create update event this._trace?.event({ input: content, metadata: { score }, name: TraceEventType.CopyMessage, }); // score the observation if there is an id this.scoreObservation({ name: 'copy message', observationId, traceId, value: score, }); } async deleteAndRegenerateMessage({ traceId, observationId, content, }: EventParams<TraceEventDeleteAndRegenerateMessage>) { const score = EventScore.DeleteAndRegenerate; // create update event this._trace?.event({ input: content, metadata: { score }, name: TraceEventType.DeleteAndRegenerateMessage, }); // score the observation if there is an id this.scoreObservation({ name: 'delete and regenerate message', observationId, traceId, value: score, }); } async regenerateMessage({ traceId, observationId, content, }: EventParams<TraceEventRegenerateMessage>) { const score = EventScore.Regenerate; // create update event this._trace?.event({ input: content, metadata: { score }, name: TraceEventType.RegenerateMessage, }); // score the observation if there is an id this.scoreObservation({ name: 'regenerate message', observationId, traceId, value: score }); } async modifyMessage({ content: prev, nextContent: next, observationId, traceId, }: EventParams<TraceEventModifyMessage>) { const score = EventScore.Modify; // create update event const diffs = diffChars(prev, next); this._trace?.event({ input: prev, metadata: { diffs, score }, name: TraceEventType.ModifyMessage, output: next, }); this._trace.update({ output: next, // TODO: add tag when supported // tags: [TraceNameMap.UserEvents] }); // score the observation if there is an id this.scoreObservation({ name: 'modify message', observationId, traceId, value: score, }); } }