@anvia/langfuse 0.1.1 → 0.1.3

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/dist/index.js CHANGED
@@ -355,7 +355,113 @@ var LangfuseToolObserver = class {
355
355
  this.tool = tool;
356
356
  }
357
357
  tool;
358
+ childAgents = /* @__PURE__ */ new Map();
359
+ childGenerations = /* @__PURE__ */ new Map();
360
+ childTools = [];
361
+ streamEvent(args) {
362
+ const wrapper = args.event;
363
+ const child = isRecord(wrapper.event) ? wrapper.event : void 0;
364
+ if (child === void 0) {
365
+ return;
366
+ }
367
+ const agentId = wrapper.agentId;
368
+ const agentName = wrapper.agentName;
369
+ const childTurn = typeof child.turn === "number" ? child.turn : args.turn;
370
+ const agent = this.childAgent(agentId, agentName, args);
371
+ if (child.type === "turn_start") {
372
+ const generation = agent.startObservation(
373
+ `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,
374
+ {
375
+ input: {
376
+ prompt: child.prompt,
377
+ history: child.history
378
+ },
379
+ metadata: childMetadata(args, agentId, agentName, childTurn)
380
+ },
381
+ { asType: "generation" }
382
+ );
383
+ this.childGenerations.set(generationKey(agentId, childTurn), generation);
384
+ return;
385
+ }
386
+ if (child.type === "turn_end") {
387
+ const generation = this.childGenerations.get(generationKey(agentId, childTurn));
388
+ if (generation !== void 0) {
389
+ generation.update({
390
+ output: child.response,
391
+ ...isRecord(child.response) && isRecord(child.response.usage) ? { usageDetails: usageDetailsFromRecord(child.response.usage) } : {},
392
+ metadata: childMetadata(args, agentId, agentName, childTurn)
393
+ }).end();
394
+ this.childGenerations.delete(generationKey(agentId, childTurn));
395
+ }
396
+ return;
397
+ }
398
+ if (child.type === "tool_call" && isRecord(child.toolCall)) {
399
+ const toolCall = child.toolCall;
400
+ const toolCallFunction = isRecord(toolCall.function) ? toolCall.function : void 0;
401
+ const toolName = typeof toolCallFunction?.name === "string" ? toolCallFunction.name : "tool";
402
+ const toolCallId = typeof toolCall.callId === "string" ? toolCall.callId : typeof toolCall.id === "string" ? toolCall.id : void 0;
403
+ const childTool = agent.startObservation(
404
+ `${agentLabel(agentId, agentName)}.${toolName}`,
405
+ {
406
+ input: {
407
+ args: toolCallFunction?.arguments ?? {},
408
+ toolCall
409
+ },
410
+ metadata: {
411
+ ...childMetadata(args, agentId, agentName, childTurn),
412
+ toolName,
413
+ toolCallId
414
+ }
415
+ },
416
+ { asType: "tool" }
417
+ );
418
+ this.childTools.push({
419
+ agentId,
420
+ toolName,
421
+ ...toolCallId === void 0 ? {} : { toolCallId },
422
+ tool: childTool,
423
+ ended: false
424
+ });
425
+ return;
426
+ }
427
+ if (child.type === "tool_result") {
428
+ const toolName = typeof child.toolName === "string" ? child.toolName : "tool";
429
+ const toolCallId = typeof child.toolCallId === "string" ? child.toolCallId : void 0;
430
+ const childTool = this.findChildTool(agentId, toolName, toolCallId);
431
+ if (childTool !== void 0) {
432
+ childTool.ended = true;
433
+ childTool.tool.update({
434
+ output: typeof child.result === "string" ? child.result : child,
435
+ metadata: {
436
+ ...childMetadata(args, agentId, agentName, childTurn),
437
+ toolName,
438
+ toolCallId,
439
+ internalCallId: typeof child.internalCallId === "string" ? child.internalCallId : void 0,
440
+ args: typeof child.args === "string" ? child.args : void 0
441
+ }
442
+ }).end();
443
+ }
444
+ return;
445
+ }
446
+ if (child.type === "final") {
447
+ agent.update({
448
+ output: child.output,
449
+ ...isRecord(child.usage) ? { metadata: { usage: child.usage } } : {}
450
+ }).end();
451
+ this.childAgents.delete(agentId);
452
+ return;
453
+ }
454
+ if (child.type === "error") {
455
+ agent.update({
456
+ level: "ERROR",
457
+ statusMessage: errorMessage(child.error),
458
+ output: { error: errorMessage(child.error) }
459
+ }).end();
460
+ this.childAgents.delete(agentId);
461
+ }
462
+ }
358
463
  end(args) {
464
+ this.endOpenChildren();
359
465
  const attributes = {
360
466
  output: args.result,
361
467
  metadata: {
@@ -372,6 +478,7 @@ var LangfuseToolObserver = class {
372
478
  this.tool.update(attributes).end();
373
479
  }
374
480
  error(args) {
481
+ this.endOpenChildren();
375
482
  this.tool.update({
376
483
  level: "ERROR",
377
484
  statusMessage: errorMessage(args.error),
@@ -383,6 +490,49 @@ var LangfuseToolObserver = class {
383
490
  }
384
491
  }).end();
385
492
  }
493
+ childAgent(agentId, agentName, args) {
494
+ const existing = this.childAgents.get(agentId);
495
+ if (existing !== void 0) {
496
+ return existing;
497
+ }
498
+ const agent = this.tool.startObservation(
499
+ `${agentLabel(agentId, agentName)}.run`,
500
+ {
501
+ metadata: childMetadata(args, agentId, agentName, args.turn)
502
+ },
503
+ { asType: "agent" }
504
+ );
505
+ this.childAgents.set(agentId, agent);
506
+ return agent;
507
+ }
508
+ findChildTool(agentId, toolName, toolCallId) {
509
+ for (let index = this.childTools.length - 1; index >= 0; index -= 1) {
510
+ const childTool = this.childTools[index];
511
+ if (childTool === void 0 || childTool.ended || childTool.agentId !== agentId || childTool.toolName !== toolName) {
512
+ continue;
513
+ }
514
+ if (toolCallId === void 0 || childTool.toolCallId === toolCallId) {
515
+ return childTool;
516
+ }
517
+ }
518
+ return void 0;
519
+ }
520
+ endOpenChildren() {
521
+ for (const generation of this.childGenerations.values()) {
522
+ generation.end();
523
+ }
524
+ this.childGenerations.clear();
525
+ for (const tool of this.childTools) {
526
+ if (!tool.ended) {
527
+ tool.tool.end();
528
+ tool.ended = true;
529
+ }
530
+ }
531
+ for (const agent of this.childAgents.values()) {
532
+ agent.end();
533
+ }
534
+ this.childAgents.clear();
535
+ }
386
536
  };
387
537
  function modelParameters(request) {
388
538
  const params = {};
@@ -402,6 +552,36 @@ function usageDetails(usage) {
402
552
  cacheCreationInputTokens: usage.cacheCreationInputTokens
403
553
  };
404
554
  }
555
+ function usageDetailsFromRecord(usage) {
556
+ return {
557
+ inputTokens: numberValue(usage.inputTokens) ?? 0,
558
+ outputTokens: numberValue(usage.outputTokens) ?? 0,
559
+ totalTokens: numberValue(usage.totalTokens) ?? (numberValue(usage.inputTokens) ?? 0) + (numberValue(usage.outputTokens) ?? 0)
560
+ };
561
+ }
562
+ function childMetadata(args, agentId, agentName, childTurn) {
563
+ return {
564
+ source: "agent_tool_event",
565
+ childAgentId: agentId,
566
+ childAgentName: agentName,
567
+ childTurn,
568
+ parentToolName: args.toolName,
569
+ parentInternalCallId: args.internalCallId,
570
+ parentToolCallId: args.toolCallId
571
+ };
572
+ }
573
+ function generationKey(agentId, turn) {
574
+ return `${agentId}:${turn}`;
575
+ }
576
+ function agentLabel(agentId, agentName) {
577
+ return (agentName ?? agentId).replaceAll(/\s+/g, "_");
578
+ }
579
+ function isRecord(value) {
580
+ return typeof value === "object" && value !== null && !Array.isArray(value);
581
+ }
582
+ function numberValue(value) {
583
+ return typeof value === "number" ? value : void 0;
584
+ }
405
585
  function emptyToUndefined(value) {
406
586
  return value === void 0 || value.length === 0 ? void 0 : value;
407
587
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n type AgentGenerationEndArgs,\n type AgentGenerationErrorArgs,\n type AgentGenerationObserver,\n type AgentGenerationStartArgs,\n type AgentObserver,\n type AgentRunEndArgs,\n type AgentRunErrorArgs,\n type AgentRunObserver,\n type AgentRunStartArgs,\n type AgentToolEndArgs,\n type AgentToolErrorArgs,\n type AgentToolObserver,\n type AgentToolStartArgs,\n type AgentTraceInfo,\n type EvalOutcome,\n type EvalReportArgs,\n type EvalReporter,\n type JsonValue,\n textFromAssistantContent,\n} from \"@anvia/core\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n type LangfuseAgent,\n type LangfuseGeneration,\n LangfuseOtelSpanAttributes,\n type LangfuseSpan,\n type LangfuseTool,\n startObservation,\n} from \"@langfuse/tracing\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\n\nexport type LangfuseTracingOptions = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl?: string | undefined;\n environment?: string | undefined;\n release?: string | undefined;\n};\n\nexport type LangfuseScoreArgs = {\n traceId?: string | undefined;\n observationId?: string | undefined;\n name: string;\n value: number;\n comment?: string | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n};\n\nexport type LangfuseTracing = AgentObserver & {\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n score(args: LangfuseScoreArgs): Promise<void>;\n};\n\nexport type LangfuseEvalReporterOptions = {\n publishInvalid?: boolean | undefined;\n strict?: boolean | undefined;\n};\n\nexport const langfuse = {\n create(options: LangfuseTracingOptions = {}): LangfuseTracing {\n return new LangfuseAgentObserver(options);\n },\n};\n\nexport function createLangfuseEvalReporter<Input = unknown, Output = unknown, Expected = unknown>(\n tracing: Pick<LangfuseTracing, \"score\">,\n options: LangfuseEvalReporterOptions = {},\n): EvalReporter<Input, Output, Expected> {\n return {\n async report(args) {\n if (args.outcome.outcome === \"invalid\" && options.publishInvalid !== true) {\n return;\n }\n\n const trace = traceFromEvalReport(args);\n if (trace?.traceId === undefined || trace.traceId.length === 0) {\n if (options.strict === true) {\n throw new Error(\"Langfuse eval reporter requires traceId\");\n }\n return;\n }\n\n await tracing.score({\n traceId: trace.traceId,\n name: args.metric.name,\n value: scoreValue(args.outcome),\n metadata: {\n suiteName: args.suiteName,\n caseId: args.case.id,\n outcome: args.outcome.outcome,\n },\n ...(trace.observationId === undefined ? {} : { observationId: trace.observationId }),\n ...(scoreComment(args.outcome) === undefined\n ? {}\n : { comment: scoreComment(args.outcome) as string }),\n });\n },\n };\n}\n\nfunction scoreValue(outcome: EvalOutcome): number {\n if (outcome.outcome === \"invalid\") {\n return 0;\n }\n if (typeof outcome.score === \"number\") {\n return outcome.score;\n }\n if (typeof outcome.score === \"boolean\") {\n return outcome.score ? 1 : 0;\n }\n if (\n typeof outcome.score === \"object\" &&\n outcome.score !== null &&\n \"score\" in outcome.score &&\n typeof (outcome.score as { score?: unknown }).score === \"number\"\n ) {\n return (outcome.score as { score: number }).score;\n }\n return outcome.outcome === \"pass\" ? 1 : 0;\n}\n\nfunction scoreComment(outcome: EvalOutcome): string | undefined {\n return outcome.comment ?? (outcome.outcome === \"invalid\" ? outcome.reason : undefined);\n}\n\nfunction traceFromEvalReport<Input, Output, Expected>(\n args: EvalReportArgs<Input, Output, unknown, Expected>,\n): AgentTraceInfo | undefined {\n const outputTrace = traceFromOutput(args.output);\n if (outputTrace !== undefined) {\n return outputTrace;\n }\n const traceId = args.case.metadata?.traceId;\n const observationId = args.case.metadata?.observationId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n return {\n traceId,\n ...(typeof observationId === \"string\" ? { observationId } : {}),\n };\n}\n\nfunction traceFromOutput(output: unknown): AgentTraceInfo | undefined {\n if (typeof output !== \"object\" || output === null || !(\"trace\" in output)) {\n return undefined;\n }\n const trace = (output as { trace?: unknown }).trace;\n if (typeof trace !== \"object\" || trace === null) {\n return undefined;\n }\n const traceId = (trace as { traceId?: unknown }).traceId;\n const observationId = (trace as { observationId?: unknown }).observationId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n return {\n traceId,\n ...(typeof observationId === \"string\" ? { observationId } : {}),\n };\n}\n\nclass LangfuseAgentObserver implements LangfuseTracing {\n private readonly processor: LangfuseSpanProcessor;\n private readonly sdk: NodeSDK;\n private readonly publicKey: string | undefined;\n private readonly secretKey: string | undefined;\n private readonly baseUrl: string;\n\n constructor(options: LangfuseTracingOptions) {\n this.publicKey = emptyToUndefined(options.publicKey);\n this.secretKey = emptyToUndefined(options.secretKey);\n this.baseUrl = emptyToUndefined(options.baseUrl) ?? \"https://cloud.langfuse.com\";\n const processorOptions: ConstructorParameters<typeof LangfuseSpanProcessor>[0] = {\n baseUrl: this.baseUrl,\n };\n if (this.publicKey !== undefined) processorOptions.publicKey = this.publicKey;\n if (this.secretKey !== undefined) processorOptions.secretKey = this.secretKey;\n const environment = emptyToUndefined(options.environment);\n if (environment !== undefined) processorOptions.environment = environment;\n const release = emptyToUndefined(options.release);\n if (release !== undefined) processorOptions.release = release;\n this.processor = new LangfuseSpanProcessor(processorOptions);\n this.sdk = new NodeSDK({\n spanProcessors: [this.processor],\n });\n this.sdk.start();\n }\n\n async startRun(args: AgentRunStartArgs): Promise<AgentRunObserver> {\n const traceId = args.trace?.traceId;\n const rootAttributes: Parameters<typeof startObservation>[1] = {\n input: {\n prompt: args.prompt,\n history: args.history,\n },\n metadata: {\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n ...(args.trace?.metadata ?? {}),\n },\n };\n if (args.trace?.version !== undefined) {\n rootAttributes.version = args.trace.version;\n }\n\n const root = startObservation(\n args.agentName ?? \"agent.run\",\n rootAttributes,\n traceId === undefined\n ? { asType: \"agent\" }\n : {\n asType: \"agent\",\n parentSpanContext: {\n traceId,\n spanId: \"0000000000000001\",\n traceFlags: 1,\n },\n },\n );\n applyTraceAttributes(root, args);\n\n return new LangfuseRunObserver(root, {\n traceId: root.traceId,\n observationId: root.id,\n });\n }\n\n async flush(): Promise<void> {\n await this.processor.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.sdk.shutdown();\n }\n\n async score(args: LangfuseScoreArgs): Promise<void> {\n if (args.traceId === undefined || args.traceId.length === 0) {\n throw new Error(\"Langfuse score requires traceId\");\n }\n if (this.publicKey === undefined || this.secretKey === undefined) {\n throw new Error(\"Langfuse score requires publicKey and secretKey\");\n }\n\n const body: Record<string, unknown> = {\n traceId: args.traceId,\n name: args.name,\n value: args.value,\n };\n if (args.observationId !== undefined) body.observationId = args.observationId;\n if (args.comment !== undefined) body.comment = args.comment;\n if (args.metadata !== undefined) body.metadata = args.metadata;\n\n const response = await fetch(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n throw new Error(\n `Langfuse score failed with HTTP ${response.status}: ${await response.text()}`,\n );\n }\n }\n}\n\nfunction applyTraceAttributes(root: LangfuseAgent, args: AgentRunStartArgs): void {\n const traceName = args.trace?.name ?? args.agentName;\n if (traceName !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, traceName);\n }\n if (args.trace?.userId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, args.trace.userId);\n }\n if (args.trace?.sessionId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, args.trace.sessionId);\n }\n if (args.trace?.tags !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, args.trace.tags);\n }\n for (const [key, value] of Object.entries(args.trace?.metadata ?? {})) {\n const serialized = serializeMetadataValue(value);\n if (serialized === undefined) {\n continue;\n }\n root.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);\n }\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"<failed to serialize>\";\n }\n}\n\nclass LangfuseRunObserver implements AgentRunObserver {\n private readonly turnSpans = new Map<number, LangfuseSpan>();\n\n constructor(\n private readonly root: LangfuseAgent,\n readonly trace: AgentTraceInfo,\n ) {}\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n this.closeEarlierTurns(args.turn);\n const turn = this.turnSpan(args.turn);\n const generation = turn.startObservation(\n `model.turn.${args.turn}`,\n {\n input: args.request.chatHistory,\n model: args.request.model ?? \"default\",\n modelParameters: modelParameters(args.request),\n metadata: {\n turn: args.turn,\n toolCount: args.request.tools.length,\n hasOutputSchema: args.request.outputSchema !== undefined,\n },\n },\n { asType: \"generation\" },\n );\n return new LangfuseGenerationObserver(generation);\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const turn = this.turnSpan(args.turn);\n const tool = turn.startObservation(\n `tool.${args.toolName}`,\n {\n input: {\n args: args.args,\n toolCall: args.toolCall,\n },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n },\n },\n { asType: \"tool\" },\n );\n return new LangfuseToolObserver(tool);\n }\n\n end(args: AgentRunEndArgs): void {\n this.closeAllTurns();\n this.root\n .update({\n output: args.output,\n metadata: {\n usage: args.usage,\n messages: args.messages,\n },\n })\n .end();\n }\n\n error(args: AgentRunErrorArgs): void {\n this.closeAllTurns();\n this.root\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: {\n error: errorMessage(args.error),\n },\n metadata: {\n usage: args.usage,\n messages: args.messages,\n },\n })\n .end();\n }\n\n private turnSpan(turn: number): LangfuseSpan {\n const existing = this.turnSpans.get(turn);\n if (existing !== undefined) {\n return existing;\n }\n\n const span = this.root.startObservation(\n `turn.${turn}`,\n {\n metadata: { turn },\n },\n { asType: \"span\" },\n );\n this.turnSpans.set(turn, span);\n return span;\n }\n\n private closeEarlierTurns(currentTurn: number): void {\n for (const [turn, span] of this.turnSpans) {\n if (turn < currentTurn) {\n span.end();\n this.turnSpans.delete(turn);\n }\n }\n }\n\n private closeAllTurns(): void {\n for (const span of this.turnSpans.values()) {\n span.end();\n }\n this.turnSpans.clear();\n }\n}\n\nclass LangfuseGenerationObserver implements AgentGenerationObserver {\n constructor(private readonly generation: LangfuseGeneration) {}\n\n end(args: AgentGenerationEndArgs): void {\n this.generation\n .update({\n output: {\n messageId: args.response.messageId,\n content: args.response.choice,\n text: textFromAssistantContent(args.response.choice),\n },\n usageDetails: usageDetails(args.response.usage),\n metadata: {\n turn: args.turn,\n },\n })\n .end();\n }\n\n error(args: AgentGenerationErrorArgs): void {\n this.generation\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: { error: errorMessage(args.error) },\n metadata: { turn: args.turn },\n })\n .end();\n }\n}\n\nclass LangfuseToolObserver implements AgentToolObserver {\n constructor(private readonly tool: LangfuseTool) {}\n\n end(args: AgentToolEndArgs): void {\n const attributes: Parameters<LangfuseTool[\"update\"]>[0] = {\n output: args.result,\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped: args.skipped,\n },\n level: args.skipped ? \"WARNING\" : \"DEFAULT\",\n };\n if (args.skipped) {\n attributes.statusMessage = \"Tool call skipped by hook\";\n }\n this.tool.update(attributes).end();\n }\n\n error(args: AgentToolErrorArgs): void {\n this.tool\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: { error: errorMessage(args.error) },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n },\n })\n .end();\n }\n}\n\nfunction modelParameters(\n request: AgentGenerationStartArgs[\"request\"],\n): Record<string, string | number> {\n const params: Record<string, string | number> = {};\n if (request.temperature !== undefined) params.temperature = request.temperature;\n if (request.maxTokens !== undefined) params.maxTokens = request.maxTokens;\n if (request.toolChoice !== undefined) {\n params.toolChoice =\n typeof request.toolChoice === \"string\" ? request.toolChoice : request.toolChoice.name;\n }\n return params;\n}\n\nfunction usageDetails(usage: AgentGenerationEndArgs[\"response\"][\"usage\"]): Record<string, number> {\n return {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n cachedInputTokens: usage.cachedInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n };\n}\n\nfunction emptyToUndefined(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n type AgentGenerationEndArgs,\n type AgentGenerationErrorArgs,\n type AgentGenerationObserver,\n type AgentGenerationStartArgs,\n type AgentObserver,\n type AgentRunEndArgs,\n type AgentRunErrorArgs,\n type AgentRunObserver,\n type AgentRunStartArgs,\n type AgentToolEndArgs,\n type AgentToolErrorArgs,\n type AgentToolObserver,\n type AgentToolStartArgs,\n type AgentToolStreamEventArgs,\n type AgentTraceInfo,\n type EvalOutcome,\n type EvalReportArgs,\n type EvalReporter,\n type JsonValue,\n textFromAssistantContent,\n} from \"@anvia/core\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n type LangfuseAgent,\n type LangfuseGeneration,\n LangfuseOtelSpanAttributes,\n type LangfuseSpan,\n type LangfuseTool,\n startObservation,\n} from \"@langfuse/tracing\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\n\nexport type LangfuseTracingOptions = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl?: string | undefined;\n environment?: string | undefined;\n release?: string | undefined;\n};\n\nexport type LangfuseScoreArgs = {\n traceId?: string | undefined;\n observationId?: string | undefined;\n name: string;\n value: number;\n comment?: string | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n};\n\nexport type LangfuseTracing = AgentObserver & {\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n score(args: LangfuseScoreArgs): Promise<void>;\n};\n\nexport type LangfuseEvalReporterOptions = {\n publishInvalid?: boolean | undefined;\n strict?: boolean | undefined;\n};\n\nexport const langfuse = {\n create(options: LangfuseTracingOptions = {}): LangfuseTracing {\n return new LangfuseAgentObserver(options);\n },\n};\n\nexport function createLangfuseEvalReporter<Input = unknown, Output = unknown, Expected = unknown>(\n tracing: Pick<LangfuseTracing, \"score\">,\n options: LangfuseEvalReporterOptions = {},\n): EvalReporter<Input, Output, Expected> {\n return {\n async report(args) {\n if (args.outcome.outcome === \"invalid\" && options.publishInvalid !== true) {\n return;\n }\n\n const trace = traceFromEvalReport(args);\n if (trace?.traceId === undefined || trace.traceId.length === 0) {\n if (options.strict === true) {\n throw new Error(\"Langfuse eval reporter requires traceId\");\n }\n return;\n }\n\n await tracing.score({\n traceId: trace.traceId,\n name: args.metric.name,\n value: scoreValue(args.outcome),\n metadata: {\n suiteName: args.suiteName,\n caseId: args.case.id,\n outcome: args.outcome.outcome,\n },\n ...(trace.observationId === undefined ? {} : { observationId: trace.observationId }),\n ...(scoreComment(args.outcome) === undefined\n ? {}\n : { comment: scoreComment(args.outcome) as string }),\n });\n },\n };\n}\n\nfunction scoreValue(outcome: EvalOutcome): number {\n if (outcome.outcome === \"invalid\") {\n return 0;\n }\n if (typeof outcome.score === \"number\") {\n return outcome.score;\n }\n if (typeof outcome.score === \"boolean\") {\n return outcome.score ? 1 : 0;\n }\n if (\n typeof outcome.score === \"object\" &&\n outcome.score !== null &&\n \"score\" in outcome.score &&\n typeof (outcome.score as { score?: unknown }).score === \"number\"\n ) {\n return (outcome.score as { score: number }).score;\n }\n return outcome.outcome === \"pass\" ? 1 : 0;\n}\n\nfunction scoreComment(outcome: EvalOutcome): string | undefined {\n return outcome.comment ?? (outcome.outcome === \"invalid\" ? outcome.reason : undefined);\n}\n\nfunction traceFromEvalReport<Input, Output, Expected>(\n args: EvalReportArgs<Input, Output, unknown, Expected>,\n): AgentTraceInfo | undefined {\n const outputTrace = traceFromOutput(args.output);\n if (outputTrace !== undefined) {\n return outputTrace;\n }\n const traceId = args.case.metadata?.traceId;\n const observationId = args.case.metadata?.observationId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n return {\n traceId,\n ...(typeof observationId === \"string\" ? { observationId } : {}),\n };\n}\n\nfunction traceFromOutput(output: unknown): AgentTraceInfo | undefined {\n if (typeof output !== \"object\" || output === null || !(\"trace\" in output)) {\n return undefined;\n }\n const trace = (output as { trace?: unknown }).trace;\n if (typeof trace !== \"object\" || trace === null) {\n return undefined;\n }\n const traceId = (trace as { traceId?: unknown }).traceId;\n const observationId = (trace as { observationId?: unknown }).observationId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n return {\n traceId,\n ...(typeof observationId === \"string\" ? { observationId } : {}),\n };\n}\n\nclass LangfuseAgentObserver implements LangfuseTracing {\n private readonly processor: LangfuseSpanProcessor;\n private readonly sdk: NodeSDK;\n private readonly publicKey: string | undefined;\n private readonly secretKey: string | undefined;\n private readonly baseUrl: string;\n\n constructor(options: LangfuseTracingOptions) {\n this.publicKey = emptyToUndefined(options.publicKey);\n this.secretKey = emptyToUndefined(options.secretKey);\n this.baseUrl = emptyToUndefined(options.baseUrl) ?? \"https://cloud.langfuse.com\";\n const processorOptions: ConstructorParameters<typeof LangfuseSpanProcessor>[0] = {\n baseUrl: this.baseUrl,\n };\n if (this.publicKey !== undefined) processorOptions.publicKey = this.publicKey;\n if (this.secretKey !== undefined) processorOptions.secretKey = this.secretKey;\n const environment = emptyToUndefined(options.environment);\n if (environment !== undefined) processorOptions.environment = environment;\n const release = emptyToUndefined(options.release);\n if (release !== undefined) processorOptions.release = release;\n this.processor = new LangfuseSpanProcessor(processorOptions);\n this.sdk = new NodeSDK({\n spanProcessors: [this.processor],\n });\n this.sdk.start();\n }\n\n async startRun(args: AgentRunStartArgs): Promise<AgentRunObserver> {\n const traceId = args.trace?.traceId;\n const rootAttributes: Parameters<typeof startObservation>[1] = {\n input: {\n prompt: args.prompt,\n history: args.history,\n },\n metadata: {\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n ...(args.trace?.metadata ?? {}),\n },\n };\n if (args.trace?.version !== undefined) {\n rootAttributes.version = args.trace.version;\n }\n\n const root = startObservation(\n args.agentName ?? \"agent.run\",\n rootAttributes,\n traceId === undefined\n ? { asType: \"agent\" }\n : {\n asType: \"agent\",\n parentSpanContext: {\n traceId,\n spanId: \"0000000000000001\",\n traceFlags: 1,\n },\n },\n );\n applyTraceAttributes(root, args);\n\n return new LangfuseRunObserver(root, {\n traceId: root.traceId,\n observationId: root.id,\n });\n }\n\n async flush(): Promise<void> {\n await this.processor.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.sdk.shutdown();\n }\n\n async score(args: LangfuseScoreArgs): Promise<void> {\n if (args.traceId === undefined || args.traceId.length === 0) {\n throw new Error(\"Langfuse score requires traceId\");\n }\n if (this.publicKey === undefined || this.secretKey === undefined) {\n throw new Error(\"Langfuse score requires publicKey and secretKey\");\n }\n\n const body: Record<string, unknown> = {\n traceId: args.traceId,\n name: args.name,\n value: args.value,\n };\n if (args.observationId !== undefined) body.observationId = args.observationId;\n if (args.comment !== undefined) body.comment = args.comment;\n if (args.metadata !== undefined) body.metadata = args.metadata;\n\n const response = await fetch(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n throw new Error(\n `Langfuse score failed with HTTP ${response.status}: ${await response.text()}`,\n );\n }\n }\n}\n\nfunction applyTraceAttributes(root: LangfuseAgent, args: AgentRunStartArgs): void {\n const traceName = args.trace?.name ?? args.agentName;\n if (traceName !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, traceName);\n }\n if (args.trace?.userId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, args.trace.userId);\n }\n if (args.trace?.sessionId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, args.trace.sessionId);\n }\n if (args.trace?.tags !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, args.trace.tags);\n }\n for (const [key, value] of Object.entries(args.trace?.metadata ?? {})) {\n const serialized = serializeMetadataValue(value);\n if (serialized === undefined) {\n continue;\n }\n root.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);\n }\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"<failed to serialize>\";\n }\n}\n\nclass LangfuseRunObserver implements AgentRunObserver {\n private readonly turnSpans = new Map<number, LangfuseSpan>();\n\n constructor(\n private readonly root: LangfuseAgent,\n readonly trace: AgentTraceInfo,\n ) {}\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n this.closeEarlierTurns(args.turn);\n const turn = this.turnSpan(args.turn);\n const generation = turn.startObservation(\n `model.turn.${args.turn}`,\n {\n input: args.request.chatHistory,\n model: args.request.model ?? \"default\",\n modelParameters: modelParameters(args.request),\n metadata: {\n turn: args.turn,\n toolCount: args.request.tools.length,\n hasOutputSchema: args.request.outputSchema !== undefined,\n },\n },\n { asType: \"generation\" },\n );\n return new LangfuseGenerationObserver(generation);\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const turn = this.turnSpan(args.turn);\n const tool = turn.startObservation(\n `tool.${args.toolName}`,\n {\n input: {\n args: args.args,\n toolCall: args.toolCall,\n },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n },\n },\n { asType: \"tool\" },\n );\n return new LangfuseToolObserver(tool);\n }\n\n end(args: AgentRunEndArgs): void {\n this.closeAllTurns();\n this.root\n .update({\n output: args.output,\n metadata: {\n usage: args.usage,\n messages: args.messages,\n },\n })\n .end();\n }\n\n error(args: AgentRunErrorArgs): void {\n this.closeAllTurns();\n this.root\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: {\n error: errorMessage(args.error),\n },\n metadata: {\n usage: args.usage,\n messages: args.messages,\n },\n })\n .end();\n }\n\n private turnSpan(turn: number): LangfuseSpan {\n const existing = this.turnSpans.get(turn);\n if (existing !== undefined) {\n return existing;\n }\n\n const span = this.root.startObservation(\n `turn.${turn}`,\n {\n metadata: { turn },\n },\n { asType: \"span\" },\n );\n this.turnSpans.set(turn, span);\n return span;\n }\n\n private closeEarlierTurns(currentTurn: number): void {\n for (const [turn, span] of this.turnSpans) {\n if (turn < currentTurn) {\n span.end();\n this.turnSpans.delete(turn);\n }\n }\n }\n\n private closeAllTurns(): void {\n for (const span of this.turnSpans.values()) {\n span.end();\n }\n this.turnSpans.clear();\n }\n}\n\nclass LangfuseGenerationObserver implements AgentGenerationObserver {\n constructor(private readonly generation: LangfuseGeneration) {}\n\n end(args: AgentGenerationEndArgs): void {\n this.generation\n .update({\n output: {\n messageId: args.response.messageId,\n content: args.response.choice,\n text: textFromAssistantContent(args.response.choice),\n },\n usageDetails: usageDetails(args.response.usage),\n metadata: {\n turn: args.turn,\n },\n })\n .end();\n }\n\n error(args: AgentGenerationErrorArgs): void {\n this.generation\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: { error: errorMessage(args.error) },\n metadata: { turn: args.turn },\n })\n .end();\n }\n}\n\nclass LangfuseToolObserver implements AgentToolObserver {\n private readonly childAgents = new Map<string, LangfuseAgent>();\n private readonly childGenerations = new Map<string, LangfuseGeneration>();\n private readonly childTools: Array<{\n agentId: string;\n toolName: string;\n toolCallId?: string;\n tool: LangfuseTool;\n ended: boolean;\n }> = [];\n\n constructor(private readonly tool: LangfuseTool) {}\n\n streamEvent(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : args.turn;\n const agent = this.childAgent(agentId, agentName, args);\n\n if (child.type === \"turn_start\") {\n const generation = agent.startObservation(\n `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n {\n input: {\n prompt: child.prompt,\n history: child.history,\n },\n metadata: childMetadata(args, agentId, agentName, childTurn),\n },\n { asType: \"generation\" },\n );\n this.childGenerations.set(generationKey(agentId, childTurn), generation);\n return;\n }\n\n if (child.type === \"turn_end\") {\n const generation = this.childGenerations.get(generationKey(agentId, childTurn));\n if (generation !== undefined) {\n generation\n .update({\n output: child.response,\n ...(isRecord(child.response) && isRecord(child.response.usage)\n ? { usageDetails: usageDetailsFromRecord(child.response.usage) }\n : {}),\n metadata: childMetadata(args, agentId, agentName, childTurn),\n })\n .end();\n this.childGenerations.delete(generationKey(agentId, childTurn));\n }\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const toolCall = child.toolCall;\n const toolCallFunction = isRecord(toolCall.function) ? toolCall.function : undefined;\n const toolName = typeof toolCallFunction?.name === \"string\" ? toolCallFunction.name : \"tool\";\n const toolCallId =\n typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : typeof toolCall.id === \"string\"\n ? toolCall.id\n : undefined;\n const childTool = agent.startObservation(\n `${agentLabel(agentId, agentName)}.${toolName}`,\n {\n input: {\n args: toolCallFunction?.arguments ?? {},\n toolCall,\n },\n metadata: {\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n },\n },\n { asType: \"tool\" },\n );\n this.childTools.push({\n agentId,\n toolName,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n tool: childTool,\n ended: false,\n });\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const childTool = this.findChildTool(agentId, toolName, toolCallId);\n if (childTool !== undefined) {\n childTool.ended = true;\n childTool.tool\n .update({\n output: typeof child.result === \"string\" ? child.result : child,\n metadata: {\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n internalCallId:\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined,\n args: typeof child.args === \"string\" ? child.args : undefined,\n },\n })\n .end();\n }\n return;\n }\n\n if (child.type === \"final\") {\n agent\n .update({\n output: child.output,\n ...(isRecord(child.usage) ? { metadata: { usage: child.usage } } : {}),\n })\n .end();\n this.childAgents.delete(agentId);\n return;\n }\n\n if (child.type === \"error\") {\n agent\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(child.error),\n output: { error: errorMessage(child.error) },\n })\n .end();\n this.childAgents.delete(agentId);\n }\n }\n\n end(args: AgentToolEndArgs): void {\n this.endOpenChildren();\n const attributes: Parameters<LangfuseTool[\"update\"]>[0] = {\n output: args.result,\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped: args.skipped,\n },\n level: args.skipped ? \"WARNING\" : \"DEFAULT\",\n };\n if (args.skipped) {\n attributes.statusMessage = \"Tool call skipped by hook\";\n }\n this.tool.update(attributes).end();\n }\n\n error(args: AgentToolErrorArgs): void {\n this.endOpenChildren();\n this.tool\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: { error: errorMessage(args.error) },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n },\n })\n .end();\n }\n\n private childAgent(\n agentId: string,\n agentName: string | undefined,\n args: AgentToolStartArgs,\n ): LangfuseAgent {\n const existing = this.childAgents.get(agentId);\n if (existing !== undefined) {\n return existing;\n }\n const agent = this.tool.startObservation(\n `${agentLabel(agentId, agentName)}.run`,\n {\n metadata: childMetadata(args, agentId, agentName, args.turn),\n },\n { asType: \"agent\" },\n );\n this.childAgents.set(agentId, agent);\n return agent;\n }\n\n private findChildTool(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.childTools)[number] | undefined {\n for (let index = this.childTools.length - 1; index >= 0; index -= 1) {\n const childTool = this.childTools[index];\n if (\n childTool === undefined ||\n childTool.ended ||\n childTool.agentId !== agentId ||\n childTool.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || childTool.toolCallId === toolCallId) {\n return childTool;\n }\n }\n return undefined;\n }\n\n private endOpenChildren(): void {\n for (const generation of this.childGenerations.values()) {\n generation.end();\n }\n this.childGenerations.clear();\n for (const tool of this.childTools) {\n if (!tool.ended) {\n tool.tool.end();\n tool.ended = true;\n }\n }\n for (const agent of this.childAgents.values()) {\n agent.end();\n }\n this.childAgents.clear();\n }\n}\n\nfunction modelParameters(\n request: AgentGenerationStartArgs[\"request\"],\n): Record<string, string | number> {\n const params: Record<string, string | number> = {};\n if (request.temperature !== undefined) params.temperature = request.temperature;\n if (request.maxTokens !== undefined) params.maxTokens = request.maxTokens;\n if (request.toolChoice !== undefined) {\n params.toolChoice =\n typeof request.toolChoice === \"string\" ? request.toolChoice : request.toolChoice.name;\n }\n return params;\n}\n\nfunction usageDetails(usage: AgentGenerationEndArgs[\"response\"][\"usage\"]): Record<string, number> {\n return {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n cachedInputTokens: usage.cachedInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n };\n}\n\nfunction usageDetailsFromRecord(usage: Record<string, unknown>): Record<string, number> {\n return {\n inputTokens: numberValue(usage.inputTokens) ?? 0,\n outputTokens: numberValue(usage.outputTokens) ?? 0,\n totalTokens:\n numberValue(usage.totalTokens) ??\n (numberValue(usage.inputTokens) ?? 0) + (numberValue(usage.outputTokens) ?? 0),\n };\n}\n\nfunction childMetadata(\n args: AgentToolStartArgs,\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n): Record<string, unknown> {\n return {\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: args.toolName,\n parentInternalCallId: args.internalCallId,\n parentToolCallId: args.toolCallId,\n };\n}\n\nfunction generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nfunction agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction emptyToUndefined(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/langfuse",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Langfuse tracing adapter for Anvia.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
@@ -17,21 +17,21 @@
17
17
  "import": "./dist/index.js"
18
18
  }
19
19
  },
20
+ "scripts": {
21
+ "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
22
+ "test": "vitest run",
23
+ "typecheck": "tsc --noEmit"
24
+ },
20
25
  "dependencies": {
26
+ "@anvia/core": "workspace:*",
21
27
  "@langfuse/otel": "^5.3.0",
22
28
  "@langfuse/tracing": "^5.3.0",
23
- "@opentelemetry/sdk-node": "^0.216.0",
24
- "@anvia/core": "0.1.3"
29
+ "@opentelemetry/sdk-node": "^0.217.0"
25
30
  },
26
31
  "devDependencies": {
27
32
  "@types/node": "^24.9.1",
28
33
  "tsup": "^8.5.0",
29
34
  "typescript": "^5.9.3",
30
35
  "vitest": "^4.0.8"
31
- },
32
- "scripts": {
33
- "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
34
- "test": "vitest run",
35
- "typecheck": "tsc --noEmit"
36
36
  }
37
- }
37
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Indra Zulfi
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.