Langfuse Data HandlingSAFE
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
Overview
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
4f83675ca38aOBSERVED · 2026-10-09Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned |
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
--- name: langfuse-data-handling description: 'Manage Langfuse data export, retention, and compliance requirements. Use when exporting trace data, configuring retention policies, or implementing data compliance for LLM observability. Trigger with phrases like "langfuse data export", "langfuse retention", "langfuse GDPR", "langfuse compliance", "export langfuse traces". ' allowed-tools: Read, Write, Edit version: 1.17.0 license: MIT author: Jeremy Longshore <[email protected]> tags: - saas - langfuse - observability - llm - compliance compatibility: Designed for Claude Code --- # Langfuse Data Handling ## Overview Manage the Langfuse data lifecycle: export traces and scores via the API, configure retention policies, handle GDPR data subject requests, anonymize data for analytics, and maintain audit trails. ## Prerequisites - `@langfuse/client` installed - Langfuse API keys with appropriate permissions - Understanding of your compliance requirements (GDPR, SOC2, HIPAA) ## Instructions ### Step 1: Export Trace Data via API ```typescript import { LangfuseClient } from "@langfuse/client"; import { writeFileSync } from "fs"; const langfuse = new LangfuseClient(); async function exportTraces(options: { fromDate: string; toDate: string; outputFile: string; includeObservations?: boolean; }) { const allTraces: any[] = []; let page = 1; let hasMore = true; while (hasMore) { const result = await langfuse.api.traces.list({ fromTimestamp: options.fromDate, toTimestamp: options.toDate, limit: 100, page, }); for (const trace of result.data) { const exportItem: any = { id: trace.id, name: trace.name, timestamp: trace.timestamp, userId: trace.userId, sessionId: trace.sessionId, metadata: trace.metadata, tags: trace.tags, }; if (options.includeObservations) { const observations = await langfuse.api.observations.list({ traceId: trace.id, }); exportItem.observations = observations.data; } allTraces.push(exportItem); } hasMore = result.data.length === 100; page++; // Rate limit respect await new Promise((r) => setTimeout(r, 200)); } writeFileSync(options.outputFile, JSON.stringify(allTraces, null, 2)); console.log(`Exported ${allTraces.length} traces to ${options.outputFile}`); } // Usage await exportTraces({ fromDate: "2025-01-01T00:00:00Z", toDate: "2025-01-31T23:59:59Z", outputFile: "traces-january.json", includeObservations: true, }); ``` ### Step 2: Export Scores ```typescript async function exportScores(fromDate: string, outputFile: string) { const scores: any[] = []; let page = 1; let hasMore = true; while (hasMore) { const result = await langfuse.api.scores.list({ fromTimestamp: fromDate, limit: 100, page, }); scores.push(...result.data); hasMore = result.data.length === 100; page++; await new Promise((r) => setTimeout(r, 200)); } writeFileSync(outputFile, JSON.stringify(scores, null, 2)); console.log(`Exported ${scores.length} scores to ${outputFile}`); } ``` ### Step 3: Data Retention Configuration **Self-hosted: Set retention via environment variable:** ```yaml # docker-compose.yml services: langfuse: environment: - LANGFUSE_RETENTION_DAYS=90 ``` **Cloud: Programmatic cleanup of old data:** ```typescript async function enforceRetention(maxAgeDays: number) { const cutoff = new Date(Date.now() - maxAgeDays * 86400000).toISOString(); const oldTraces = await langfuse.api.traces.list({ toTimestamp: cutoff, limit: 100, }); console.log(`Found ${oldTraces.data.length} traces older than ${maxAgeDays} days`); for (const trace of oldTraces.data) { await langfuse.api.traces.delete(trace.id); await new Promise((r) => setTimeout(r, 100)); // Rate limit } } // Run as cron job await enforceRetention(90); ``` ### Step 4: GDPR Data Subject Requests ```typescript // Handle "Right to Access" -- export all data for a user async function handleAccessRequest(userId: string) { const traces = await langfuse.api.traces.list({ userId, limit: 1000, }); const userData = { userId, exportDate: new Date().toISOString(), traceCount: traces.data.length, traces: traces.data.map((t) => ({ id: t.id, name: t.name, timestamp: t.timestamp, input: t.input, output: t.output, metadata: t.metadata, })), }; writeFileSync(`gdpr-export-${userId}.json`, JSON.stringify(userData, null, 2)); return userData; } // Handle "Right to Erasure" -- delete all data for a user async function handleDeletionRequest(userId: string) { const traces = await langfuse.api.traces.list({ userId, limit: 1000, }); let deleted = 0; for (const trace of traces.data) { await langfuse.api.traces.delete(trace.id); deleted++; await new Promise((r) => setTimeout(r, 100)); } console.log(`Deleted ${deleted} traces for user ${userId}`); return { userId, tracesDeleted: deleted }; } ``` ### Step 5: Data Anonymization for Analytics ```typescript import crypto from "crypto"; function anonymizeTrace(trace: any): any { return { ...trace, userId: trace.userId ? crypto.createHash("sha256").update(trace.userId).digest("hex").slice(0, 16) : null, sessionId: trace.sessionId ? crypto.createHash("sha256").update(trace.sessionId).digest("hex").slice(0, 16) : null, input: "[REDACTED]", output: "[REDACTED]", metadata: { model: trace.metadata?.model, // Keep operational fields, remove PII }, }; } async function exportAnonymized(fromDate: string, outputFile: string) { const traces = await langfuse.api.traces.list({ fromTimestamp: fromDate, limit: 1000, }); const anonymized = traces.data.map(anonymizeTrace); writeFileSync(outputFile, JSON.stringify(anonymized, null, 2));
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (0)
No findings outside the package's declared scope.
Gates applied: no_behavioural_pass.
4f83675ca38afull audit observations/trust-audit/skill/jeremylongshore__langfuse-data-handling.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-09 | 4f83675ca38a | SAFE | B | 89 | first audit |
Questions
What does the Langfuse Data Handling skill do?
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
Is Langfuse Data Handling safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can Langfuse Data Handling access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
Which assistants does Langfuse Data Handling work with?
Its documentation mentions claude-code. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (4f83675ca38a), read on 2026-10-09. The repository is watched, and a new audit runs when it changes — this is the first audit.