[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F7RCFEXAHZNZBZXSWKQ5SB":3,"skill-same:01M6F7RCFEXAHZNZBZXSWKQ5SB":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6F7RCFEXAHZNZBZXSWKQ5SB","langfuse-performance-tuning",null,"Optimize Langfuse tracing performance for high-throughput applications.\nUse when experiencing latency issues, optimizing trace overhead,\nor scaling Langfuse for production workloads.\nTrigger with phrases like \"langfuse performance\", \"optimize langfuse\",\n\"langfuse latency\", \"langfuse overhead\", \"langfuse slow\".","Dicklesworthstone\u002Fpi_agent_rust","Dicklesworthstone","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35050222?v=4","01M6CG26AR942CSVMN1M5E3DSE","Jeff Emanuel","01M6CG26EPP71PSHW1VDS71121",1979,"MIT","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Flangfuse-pack\u002Fskills\u002Flangfuse-performance-tuning\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"langfuse","tuning","langfuse performance tuning","performance tuning","performance","scaling","when","overhead","for","with","throughput","high-throughput","trigger","io","latency","optimize","use","edit","write","read","applications","tracing","issues","2026-11-10 10:12:30",false,"---\nname: langfuse-performance-tuning\ndescription: |\n  Optimize Langfuse tracing performance for high-throughput applications.\n  Use when experiencing latency issues, optimizing trace overhead,\n  or scaling Langfuse for production workloads.\n  Trigger with phrases like \"langfuse performance\", \"optimize langfuse\",\n  \"langfuse latency\", \"langfuse overhead\", \"langfuse slow\".\nallowed-tools: Read, Write, Edit\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# Langfuse Performance Tuning\n\n## Overview\nOptimize Langfuse tracing for minimal overhead and maximum throughput.\n\n## Prerequisites\n- Existing Langfuse integration\n- Performance baseline measurements\n- Understanding of async patterns\n\n## Performance Targets\n\n| Metric | Target | Critical |\n|--------|--------|----------|\n| Trace creation overhead | \u003C 1ms | \u003C 5ms |\n| Flush latency | \u003C 100ms | \u003C 500ms |\n| Memory per trace | \u003C 1KB | \u003C 5KB |\n| CPU overhead | \u003C 1% | \u003C 5% |\n\n## Instructions\n\n### Step 1: Measure Baseline Performance\n\n```typescript\n\u002F\u002F scripts\u002Fbenchmark-langfuse.ts\nimport { Langfuse } from \"langfuse\";\nimport { performance } from \"perf_hooks\";\n\nasync function benchmark() {\n  const langfuse = new Langfuse();\n  const iterations = 1000;\n\n  \u002F\u002F Measure trace creation\n  const traceTimings: number[] = [];\n  for (let i = 0; i \u003C iterations; i++) {\n    const start = performance.now();\n    const trace = langfuse.trace({ name: `benchmark-${i}` });\n    traceTimings.push(performance.now() - start);\n  }\n\n  \u002F\u002F Measure generation creation\n  const genTimings: number[] = [];\n  const trace = langfuse.trace({ name: \"gen-benchmark\" });\n  for (let i = 0; i \u003C iterations; i++) {\n    const start = performance.now();\n    const gen = trace.generation({\n      name: `gen-${i}`,\n      model: \"gpt-4\",\n      input: [{ role: \"user\", content: \"test\" }],\n    });\n    gen.end({ output: \"response\" });\n    genTimings.push(performance.now() - start);\n  }\n\n  \u002F\u002F Measure flush\n  const flushStart = performance.now();\n  await langfuse.flushAsync();\n  const flushTime = performance.now() - flushStart;\n\n  \u002F\u002F Calculate stats\n  const stats = (arr: number[]) => ({\n    mean: arr.reduce((a, b) => a + b) \u002F arr.length,\n    p50: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.5)],\n    p95: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.95)],\n    p99: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.99)],\n  });\n\n  console.log(\"=== Langfuse Performance Benchmark ===\");\n  console.log(`\\nTrace Creation (${iterations} iterations):`);\n  console.log(JSON.stringify(stats(traceTimings), null, 2));\n  console.log(`\\nGeneration Creation (${iterations} iterations):`);\n  console.log(JSON.stringify(stats(genTimings), null, 2));\n  console.log(`\\nFlush Time: ${flushTime.toFixed(2)}ms`);\n\n  await langfuse.shutdownAsync();\n}\n\nbenchmark();\n```\n\n### Step 2: Optimize Batching Configuration\n\n```typescript\n\u002F\u002F High-throughput configuration\nconst langfuse = new Langfuse({\n  publicKey: process.env.LANGFUSE_PUBLIC_KEY!,\n  secretKey: process.env.LANGFUSE_SECRET_KEY!,\n\n  \u002F\u002F Batching optimization\n  flushAt: 100,           \u002F\u002F Larger batches = fewer requests\n  flushInterval: 10000,   \u002F\u002F Less frequent flushes\n\n  \u002F\u002F Timeout tuning\n  requestTimeout: 30000,  \u002F\u002F Allow time for large batches\n\n  \u002F\u002F Optional: Disable in development\n  enabled: process.env.NODE_ENV === \"production\",\n});\n```\n\n### Step 3: Implement Non-Blocking Tracing\n\n```typescript\n\u002F\u002F Trace wrapper that never blocks the main operation\nclass NonBlockingLangfuse {\n  private langfuse: Langfuse;\n  private errorCount = 0;\n  private maxErrors = 10;\n\n  constructor(config: ConstructorParameters\u003Ctypeof Langfuse>[0]) {\n    this.langfuse = new Langfuse(config);\n  }\n\n  \u002F\u002F Fire-and-forget trace\n  trace(params: Parameters\u003Ctypeof this.langfuse.trace>[0]) {\n    if (this.errorCount >= this.maxErrors) {\n      \u002F\u002F Circuit breaker: stop tracing if too many errors\n      return this.createNoOpTrace();\n    }\n\n    try {\n      return this.langfuse.trace(params);\n    } catch (error) {\n      this.errorCount++;\n      console.error(\"Langfuse trace error:\", error);\n      return this.createNoOpTrace();\n    }\n  }\n\n  private createNoOpTrace() {\n    return {\n      id: \"noop\",\n      span: () => this.createNoOpSpan(),\n      generation: () => this.createNoOpGeneration(),\n      update: () => {},\n      getTraceUrl: () => \"\",\n    };\n  }\n\n  private createNoOpSpan() {\n    return {\n      id: \"noop\",\n      span: () => this.createNoOpSpan(),\n      generation: () => this.createNoOpGeneration(),\n      end: () => {},\n    };\n  }\n\n  private createNoOpGeneration() {\n    return {\n      id: \"noop\",\n      end: () => {},\n    };\n  }\n\n  \u002F\u002F Background flush - don't await in hot path\n  flush() {\n    this.langfuse.flushAsync().catch((error) => {\n      this.errorCount++;\n      console.error(\"Langfuse flush error:\", error);\n    });\n  }\n\n  async shutdown() {\n    return this.langfuse.shutdownAsync();\n  }\n}\n```\n\n### Step 4: Optimize Data Payload Size\n\n```typescript\n\u002F\u002F Reduce trace payload size\nfunction optimizeTraceInput(input: any): any {\n  \u002F\u002F Truncate large strings\n  const MAX_STRING_LENGTH = 10000;\n\n  if (typeof input === \"string\") {\n    return input.length > MAX_STRING_LENGTH\n      ? input.slice(0, MAX_STRING_LENGTH) + \"...[truncated]\"\n      : input;\n  }\n\n  if (Array.isArray(input)) {\n    \u002F\u002F Limit array size\n    const MAX_ARRAY_LENGTH = 100;\n    const truncated = input.slice(0, MAX_ARRAY_LENGTH);\n    return truncated.map(optimizeTraceInput);\n  }\n\n  if (typeof input === \"object\" && input !== null) {\n    \u002F\u002F Remove large binary data\n    const optimized: Record\u003Cstring, any> = {};\n    for (const [key, value] of Object.entries(input)) {\n      if (value instanceof Buffer || value instanceof Uint8Array) {\n        optimized[key] = `[Binary: ${value.length} bytes]`;\n      } else {\n        optimized[key] = optimizeTraceInput(value);\n      }\n    }\n    return optimized;\n  }\n\n  return input;\n}\n\n\u002F\u002F Use in traces\nconst trace = langfuse.trace({\n  name: \"optimized-trace\",\n  input: optimizeTraceInput(largeInput),\n});\n```\n\n### Step 5: Implement Sampling for Ultra-High Volume\n\n```typescript\ninterface SamplingStrategy {\n  shouldSample(params: TraceParams): boolean;\n}\n\n\u002F\u002F Deterministic sampling based on trace attributes\nclass DeterministicSampler implements SamplingStrategy {\n  private rate: number;\n\n  constructor(rate: number) {\n    this.rate = rate;\n  }\n\n  shouldSample(params: TraceParams): boolean {\n    \u002F\u002F Always sample errors\n    if (params.level === \"ERROR\" || params.tags?.includes(\"error\")) {\n      return true;\n    }\n\n    \u002F\u002F Deterministic hash-based sampling\n    const hash = this.hashString(params.name + (params.userId || \"\"));\n    return (hash % 100) \u003C (this.rate * 100);\n  }\n\n  private hashString(str: string): number {\n    let hash = 0;\n    for (let i = 0; i \u003C str.length; i++) {\n      const char = str.charCodeAt(i);\n      hash = ((hash \u003C\u003C 5) - hash) + char;\n      hash = hash & hash;\n    }\n    return Math.abs(hash);\n  }\n}\n\n\u002F\u002F Adaptive sampling based on throughput\nclass AdaptiveSampler implements SamplingStrategy {\n  private windowMs = 60000;\n  private maxPerWindow = 1000;\n  private counts: number[] = [];\n\n  shouldSample(params: TraceParams): boolean {\n    const now = Date.now();\n    const windowStart = now - this.windowMs;\n\n    \u002F\u002F Clean old counts\n    this.counts = this.counts.filter((t) => t > windowStart);\n\n    \u002F\u002F Check if under limit\n    if (this.counts.length \u003C this.maxPerWindow) {\n      this.counts.push(now);\n      return true;\n    }\n\n    \u002F\u002F Over limit - only sample important traces\n    return params.level === \"ERROR\";\n  }\n}\n\n\u002F\u002F Apply sampling\nconst sampler = new DeterministicSampler(0.1); \u002F\u002F 10% sampling\n\nfunction sampledTrace(params: TraceParams) {\n  if (!sampler.shouldSample(params)) {\n    return createNoOpTrace();\n  }\n\n  return langfuse.trace({\n    ...params,\n    metadata: {\n      ...params.metadata,\n      sampled: true,\n    },\n  });\n}\n```\n\n### Step 6: Memory Management\n\n```typescript\n\u002F\u002F Prevent memory leaks with trace cleanup\nclass ManagedLangfuse {\n  private langfuse: Langfuse;\n  private activeTraces: Map\u003Cstring, { createdAt: Date }> = new Map();\n  private maxTraceAge = 300000; \u002F\u002F 5 minutes\n\n  constructor(config: ConstructorParameters\u003Ctypeof Langfuse>[0]) {\n    this.langfuse = new Langfuse(config);\n\n    \u002F\u002F Periodic cleanup\n    setInterval(() => this.cleanupStaleTraces(), 60000);\n  }\n\n  trace(params: Parameters\u003Ctypeof this.langfuse.trace>[0]) {\n    const trace = this.langfuse.trace(params);\n    this.activeTraces.set(trace.id, { createdAt: new Date() });\n    return trace;\n  }\n\n  private cleanupStaleTraces() {\n    const now = Date.now();\n    let cleaned = 0;\n\n    for (const [id, meta] of this.activeTraces) {\n      if (now - meta.createdAt.getTime() > this.maxTraceAge) {\n        this.activeTraces.delete(id);\n        cleaned++;\n      }\n    }\n\n    if (cleaned > 0) {\n      console.log(`Cleaned up ${cleaned} stale trace references`);\n    }\n  }\n\n  getStats() {\n    return {\n      activeTraces: this.activeTraces.size,\n      heapUsed: process.memoryUsage().heapUsed \u002F 1024 \u002F 1024,\n    };\n  }\n}\n```\n\n## Output\n- Baseline performance measurements\n- Optimized batching configuration\n- Non-blocking trace wrapper\n- Payload size optimization\n- Sampling strategies for high volume\n- Memory leak prevention\n\n## Performance Optimization Checklist\n\n| Optimization | Impact | Effort |\n|--------------|--------|--------|\n| Increase `flushAt` | High | Low |\n| Non-blocking traces | High | Medium |\n| Payload truncation | Medium | Low |\n| Sampling | High | Medium |\n| Memory management | Medium | Medium |\n\n## Error Handling\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| High latency | Small batch size | Increase `flushAt` |\n| Memory growth | No cleanup | Add trace cleanup |\n| Request timeouts | Large payloads | Truncate inputs |\n| High CPU | Sync operations | Use async patterns |\n\n## Resources\n- [Langfuse SDK Configuration](https:\u002F\u002Flangfuse.com\u002Fdocs\u002Fsdk)\n- [Node.js Performance](https:\u002F\u002Fnodejs.org\u002Fen\u002Fdocs\u002Fguides\u002Fdont-block-the-event-loop)\n- [Sampling Strategies](https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fconcepts\u002Fsampling\u002F)\n\n## Next Steps\nFor cost optimization, see `langfuse-cost-tuning`.\n","# Langfuse Performance Tuning\n\n## Overview\nOptimize Langfuse tracing for minimal overhead and maximum throughput.\n\n## Prerequisites\n- Existing Langfuse integration\n- Performance baseline measurements\n- Understanding of async patterns\n\n## Performance Targets\n\n| Metric | Target | Critical |\n|--------|--------|----------|\n| Trace creation overhead | \u003C 1ms | \u003C 5ms |\n| Flush latency | \u003C 100ms | \u003C 500ms |\n| Memory per trace | \u003C 1KB | \u003C 5KB |\n| CPU overhead | \u003C 1% | \u003C 5% |\n\n## Instructions\n\n### Step 1: Measure Baseline Performance\n\n```typescript\n\u002F\u002F scripts\u002Fbenchmark-langfuse.ts\nimport { Langfuse } from \"langfuse\";\nimport { performance } from \"perf_hooks\";\n\nasync function benchmark() {\n  const langfuse = new Langfuse();\n  const iterations = 1000;\n\n  \u002F\u002F Measure trace creation\n  const traceTimings: number[] = [];\n  for (let i = 0; i \u003C iterations; i++) {\n    const start = performance.now();\n    const trace = langfuse.trace({ name: `benchmark-${i}` });\n    traceTimings.push(performance.now() - start);\n  }\n\n  \u002F\u002F Measure generation creation\n  const genTimings: number[] = [];\n  const trace = langfuse.trace({ name: \"gen-benchmark\" });\n  for (let i = 0; i \u003C iterations; i++) {\n    const start = performance.now();\n    const gen = trace.generation({\n      name: `gen-${i}`,\n      model: \"gpt-4\",\n      input: [{ role: \"user\", content: \"test\" }],\n    });\n    gen.end({ output: \"response\" });\n    genTimings.push(performance.now() - start);\n  }\n\n  \u002F\u002F Measure flush\n  const flushStart = performance.now();\n  await langfuse.flushAsync();\n  const flushTime = performance.now() - flushStart;\n\n  \u002F\u002F Calculate stats\n  const stats = (arr: number[]) => ({\n    mean: arr.reduce((a, b) => a + b) \u002F arr.length,\n    p50: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.5)],\n    p95: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.95)],\n    p99: arr.sort((a, b) => a - b)[Math.floor(arr.length * 0.99)],\n  });\n\n  console.log(\"=== Langfuse Performance Benchmark ===\");\n  console.log(`\\nTrace Creation (${iterations} iterations):`);\n  console.log(JSON.stringify(stats(traceTimings), null, 2));\n  console.log(`\\nGeneration Creation (${iterations} iterations):`);\n  console.log(JSON.stringify(stats(genTimings), null, 2));\n  console.log(`\\nFlush Time: ${flushTime.toFixed(2)}ms`);\n\n  await langfuse.shutdownAsync();\n}\n\nbenchmark();\n```\n\n### Step 2: Optimize Batching Configuration\n\n```typescript\n\u002F\u002F High-throughput configuration\nconst langfuse = new Langfuse({\n  publicKey: process.env.LANGFUSE_PUBLIC_KEY!,\n  secretKey: process.env.LANGFUSE_SECRET_KEY!,\n\n  \u002F\u002F Batching optimization\n  flushAt: 100,           \u002F\u002F Larger batches = fewer requests\n  flushInterval: 10000,   \u002F\u002F Less frequent flushes\n\n  \u002F\u002F Timeout tuning\n  requestTimeout: 30000,  \u002F\u002F Allow time for large batches\n\n  \u002F\u002F Optional: Disable in development\n  enabled: process.env.NODE_ENV === \"production\",\n});\n```\n\n### Step 3: Implement Non-Blocking Tracing\n\n```typescript\n\u002F\u002F Trace wrapper that never blocks the main operation\nclass NonBlockingLangfuse {\n  private langfuse: Langfuse;\n  private errorCount = 0;\n  private maxErrors = 10;\n\n  constructor(config: ConstructorParameters\u003Ctypeof Langfuse>[0]) {\n    this.langfuse = new Langfuse(config);\n  }\n\n  \u002F\u002F Fire-and-forget trace\n  trace(params: Parameters\u003Ctypeof this.langfuse.trace>[0]) {\n    if (this.errorCount >= this.maxErrors) {\n      \u002F\u002F Circuit breaker: stop tracing if too many errors\n      return this.createNoOpTrace();\n    }\n\n    try {\n      return this.langfuse.trace(params);\n    } catch (error) {\n      this.errorCount++;\n      console.error(\"Langfuse trace error:\", error);\n      return this.createNoOpTrace();\n    }\n  }\n\n  private createNoOpTrace() {\n    return {\n      id: \"noop\",\n      span: () => this.createNoOpSpan(),\n      generation: () => this.createNoOpGeneration(),\n      update: () => {},\n      getTraceUrl: () => \"\",\n    };\n  }\n\n  private createNoOpSpan() {\n    return {\n      id: \"noop\",\n      span: () => this.createNoOpSpan(),\n      generation: () => this.createNoOpGeneration(),\n      end: () => {},\n    };\n  }\n\n  private createNoOpGeneration() {\n    return {\n      id: \"noop\",\n      end: () => {},\n    };\n  }\n\n  \u002F\u002F Background flush - don't await in hot path\n  flush() {\n    this.langfuse.flushAsync().catch((error) => {\n      this.errorCount++;\n      console.error(\"Langfuse flush error:\", error);\n    });\n  }\n\n  async shutdown() {\n    return this.langfuse.shutdownAsync();\n  }\n}\n```\n\n### Step 4: Optimize Data Payload Size\n\n```typescript\n\u002F\u002F Reduce trace payload size\nfunction optimizeTraceInput(input: any): any {\n  \u002F\u002F Truncate large strings\n  const MAX_STRING_LENGTH = 10000;\n\n  if (typeof input === \"string\") {\n    return input.length > MAX_STRING_LENGTH\n      ? input.slice(0, MAX_STRING_LENGTH) + \"...[truncated]\"\n      : input;\n  }\n\n  if (Array.isArray(input)) {\n    \u002F\u002F Limit array size\n    const MAX_ARRAY_LENGTH = 100;\n    const truncated = input.slice(0, MAX_ARRAY_LENGTH);\n    return truncated.map(optimizeTraceInput);\n  }\n\n  if (typeof input === \"object\" && input !== null) {\n    \u002F\u002F Remove large binary data\n    const optimized: Record\u003Cstring, any> = {};\n    for (const [key, value] of Object.entries(input)) {\n      if (value instanceof Buffer || value instanceof Uint8Array) {\n        optimized[key] = `[Binary: ${value.length} bytes]`;\n      } else {\n        optimized[key] = optimizeTraceInput(value);\n      }\n    }\n    return optimized;\n  }\n\n  return input;\n}\n\n\u002F\u002F Use in traces\nconst trace = langfuse.trace({\n  name: \"optimized-trace\",\n  input: optimizeTraceInput(largeInput),\n});\n```\n\n### Step 5: Implement Sampling for Ultra-High Volume\n\n```typescript\ninterface SamplingStrategy {\n  shouldSample(params: TraceParams): boolean;\n}\n\n\u002F\u002F Deterministic sampling based on trace attributes\nclass DeterministicSampler implements SamplingStrategy {\n  private rate: number;\n\n  constructor(rate: number) {\n    this.rate = rate;\n  }\n\n  shouldSample(params: TraceParams): boolean {\n    \u002F\u002F Always sample errors\n    if (params.level === \"ERROR\" || params.tags?.includes(\"error\")) {\n      return true;\n    }\n\n    \u002F\u002F Deterministic hash-based sampling\n    const hash = this.hashString(params.name + (params.userId || \"\"));\n    return (hash % 100) \u003C (this.rate * 100);\n  }\n\n  private hashString(str: string): number {\n    let hash = 0;\n    for (let i = 0; i \u003C str.length; i++) {\n      const char = str.charCodeAt(i);\n      hash = ((hash \u003C\u003C 5) - hash) + char;\n      hash = hash & hash;\n    }\n    return Math.abs(hash);\n  }\n}\n\n\u002F\u002F Adaptive sampling based on throughput\nclass AdaptiveSampler implements SamplingStrategy {\n  private windowMs = 60000;\n  private maxPerWindow = 1000;\n  private counts: number[] = [];\n\n  shouldSample(params: TraceParams): boolean {\n    const now = Date.now();\n    const windowStart = now - this.windowMs;\n\n    \u002F\u002F Clean old counts\n    this.counts = this.counts.filter((t) => t > windowStart);\n\n    \u002F\u002F Check if under limit\n    if (this.counts.length \u003C this.maxPerWindow) {\n      this.counts.push(now);\n      return true;\n    }\n\n    \u002F\u002F Over limit - only sample important traces\n    return params.level === \"ERROR\";\n  }\n}\n\n\u002F\u002F Apply sampling\nconst sampler = new DeterministicSampler(0.1); \u002F\u002F 10% sampling\n\nfunction sampledTrace(params: TraceParams) {\n  if (!sampler.shouldSample(params)) {\n    return createNoOpTrace();\n  }\n\n  return langfuse.trace({\n    ...params,\n    metadata: {\n      ...params.metadata,\n      sampled: true,\n    },\n  });\n}\n```\n\n### Step 6: Memory Management\n\n```typescript\n\u002F\u002F Prevent memory leaks with trace cleanup\nclass ManagedLangfuse {\n  private langfuse: Langfuse;\n  private activeTraces: Map\u003Cstring, { createdAt: Date }> = new Map();\n  private maxTraceAge = 300000; \u002F\u002F 5 minutes\n\n  constructor(config: ConstructorParameters\u003Ctypeof Langfuse>[0]) {\n    this.langfuse = new Langfuse(config);\n\n    \u002F\u002F Periodic cleanup\n    setInterval(() => this.cleanupStaleTraces(), 60000);\n  }\n\n  trace(params: Parameters\u003Ctypeof this.langfuse.trace>[0]) {\n    const trace = this.langfuse.trace(params);\n    this.activeTraces.set(trace.id, { createdAt: new Date() });\n    return trace;\n  }\n\n  private cleanupStaleTraces() {\n    const now = Date.now();\n    let cleaned = 0;\n\n    for (const [id, meta] of this.activeTraces) {\n      if (now - meta.createdAt.getTime() > this.maxTraceAge) {\n        this.activeTraces.delete(id);\n        cleaned++;\n      }\n    }\n\n    if (cleaned > 0) {\n      console.log(`Cleaned up ${cleaned} stale trace references`);\n    }\n  }\n\n  getStats() {\n    return {\n      activeTraces: this.activeTraces.size,\n      heapUsed: process.memoryUsage().heapUsed \u002F 1024 \u002F 1024,\n    };\n  }\n}\n```\n\n## Output\n- Baseline performance measurements\n- Optimized batching configuration\n- Non-blocking trace wrapper\n- Payload size optimization\n- Sampling strategies for high volume\n- Memory leak prevention\n\n## Performance Optimization Checklist\n\n| Optimization | Impact | Effort |\n|--------------|--------|--------|\n| Increase `flushAt` | High | Low |\n| Non-blocking traces | High | Medium |\n| Payload truncation | Medium | Low |\n| Sampling | High | Medium |\n| Memory management | Medium | Medium |\n\n## Error Handling\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| High latency | Small batch size | Increase `flushAt` |\n| Memory growth | No cleanup | Add trace cleanup |\n| Request timeouts | Large payloads | Truncate inputs |\n| High CPU | Sync operations | Use async patterns |\n\n## Resources\n- [Langfuse SDK Configuration](https:\u002F\u002Flangfuse.com\u002Fdocs\u002Fsdk)\n- [Node.js Performance](https:\u002F\u002Fnodejs.org\u002Fen\u002Fdocs\u002Fguides\u002Fdont-block-the-event-loop)\n- [Sampling Strategies](https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fconcepts\u002Fsampling\u002F)\n\n## Next Steps\nFor cost optimization, see `langfuse-cost-tuning`.\n",{"name":5,"author":47,"license":15,"version":48,"description":49,"allowed-tools":50},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Optimize Langfuse tracing performance for high-throughput applications.\nUse when experiencing latency issues, optimizing trace overhead,\nor scaling Langfuse for production workloads.\nTrigger with phrases like \"langfuse performance\", \"optimize langfuse\",\n\"langfuse latency\", \"langfuse overhead\", \"langfuse slow\".\n","Read, Write, Edit","main","90b50ed0778745a80fd5bfb13b1843d45b9e82f7","tests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Flangfuse-pack\u002Fskills\u002Flangfuse-performance-tuning",231,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust","https:\u002F\u002Fgithub.com\u002FDicklesworthstone","https:\u002F\u002Fwww.jeffreyemanuel.com\u002F","Building in NY","2026-11-11 01:23:40",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add Dicklesworthstone\u002Fpi_agent_rust --skill langfuse-performance-tuning",{"tool":66,"command":67},"bunx","bunx skills add Dicklesworthstone\u002Fpi_agent_rust --skill langfuse-performance-tuning",{"tool":69,"command":70},"pnpm","pnpm dlx skills add Dicklesworthstone\u002Fpi_agent_rust --skill langfuse-performance-tuning","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Fplugins-community\u002Fplugins\u002Fsaas-packs\u002Flangfuse-pack\u002Fskills\u002Flangfuse-performance-tuning\u002FSKILL.md",true,[],[75,114,137,163,190,212],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":80,"sourceHtmlUrl":81,"categories":82,"keywords":88,"publishedAt":42},"01M6FEGPPK0ZTKCCM0R3E3KS33","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FSKILL.md",[83],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,35,107,108,109,110,111,27,112,113],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","component","routing","state management","state","shadcn","file","ui","Tools","Tailwind","html","single-file","simple","ui components","multi","jsx","suite",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":118,"sourceHtmlUrl":119,"categories":120,"keywords":125,"publishedAt":42},"01M6FEE9VTK1W4GY21AKREJXRG","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FSKILL.md",[121,124],{"categoryNo":122,"categoryName":123,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},[126,127,128,94,129,130,90,131,132,133,104,134,39,135,136,28,27],"testing","webapp testing","webapp","screenshots","playwright","debugging","toolkit","browser","logs","behavior","local",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":141,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":42},"01M6FE20F7ZTQBFWKF4MPJ2SBX","neuropixels-analysis","Neuropixels neural recording analysis. Load SpikeGLX\u002FOpenEphys data, preprocess, motion correction, Kilosort4 spike sorting, quality metrics, Allen\u002FIBL curation, AI-assisted visual analysis, for Neuropixels 1.0\u002F2.0 extracellular electrophysiology. Use when working with neural recordings, spike sorting, extracellular electrophysiology, or when the user mentions Neuropixels, SpikeGLX, Open Ephys, Kilosort, quality metrics, or unit curation.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fscientific\u002Fneuropixels-analysis\u002FSKILL.md",[],[145,146,147,148,149,150,151,152,35,153,154,155,156,157,158,159,28,160,161,162,27,25],"analysis","neuropixels analysis","spike","metrics","data","open","quality","user","recordings","Neural","motion","visual","quality metrics","unit","sorting","curation","recording","load",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":167,"sourceHtmlUrl":168,"categories":169,"keywords":173,"publishedAt":42},"01M6FDP0PDK6F1GGX395C7625Z","skill-creator","Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fskill-creator\u002FSKILL.md",[170],{"categoryNo":171,"categoryName":172,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000023","Skill与智能体开发",[174,175,176,177,178,179,180,181,182,183,184,185,186,187,28,27,188,25,189],"skill creator","creator","workflows","create","update","capabilities","knowledge","tool","integrations","specialized","guide","new skill","existing skill","users","Existing","new",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":194,"sourceHtmlUrl":195,"categories":196,"keywords":198,"publishedAt":42},"01M6FDM8Y7VK7NYG9SM7QPA3PW","notebooklm","Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fnotebooklm\u002FSKILL.md",[197],{"categoryNo":171,"categoryName":172,"taxonomyType":86,"taxonomyTypeDesc":87},[192,199,200,201,202,203,204,133,205,206,35,207,208,209,210,27,211],"google","browser automation","gemini","automation","auth","code","library","management","only","document","query","Citation","source",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":216,"sourceHtmlUrl":217,"categories":218,"keywords":225,"publishedAt":42},"01M6FDHPXE10J3XGTCH5HBHS1M","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fenterprise-communication\u002Fslack-gif-creator\u002FSKILL.md",[219,222],{"categoryNo":220,"categoryName":221,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":223,"categoryName":224,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000016","图像与多媒体",[226,227,228,175,229,105,230,231,180,35,232,187,233,234,235,27,236,25],"slack gif creator","slack","gif","validation","constraints","Animation","me","make","Utilities","concepts","request"]