kensaurus/cursor-kenji/audit-langfuse-llm
Claude Code and agent skill by kensaurus/cursor-kenji
- community
Checking that the SKILL.md file is still in the repository.
PDCA quality audit of LLM features: traces, prompts, costs, evals, grounding, hallucination. Use for "audit LLM quality", "check Langfuse", or "audit AI costs". Jailbreaks → audit-llm-security. Cost caps → plan-llm-cost-guardrails.
Install
npx vskill@latest install kensaurus/cursor-kenji/audit-langfuse-llmSKILL.md
Langfuse LLM Quality Audit
Degree of freedom: MIXED — Phases 0–1, 4 [HIGH freedom]; Phases 2–3 CLI traces and playwright [LOW freedom — run exactly]. Read protocol-browser-anti-stall before any browser step. Phase 0 first: Phases 2–3 verify the feature map it produces.
This skill vs neighbors
| Skill | Owns | |
|---|---|---|
| audit-langfuse-llm (this) | PDCA quality audit of LLM features: traces, prompts, costs, evals, grounding | |
audit-llm-security | Read-only OWASP LLM Top 10 audit: prompt injection, leakage, unsafe agency | |
plan-llm-cost-guardrails | Plan-only audit of runaway LLM cost and quota-abuse exposure |
How to reason
- Observe — quote the trace, prompt version, token/cost, or live output
- Interpret — is quality, cost, or the pipeline actually broken?
- Classify — missing-trace / prompt / cost / eval / grounding / correct
- Severity — pipeline break or untraced prod feature = P0; cost/eval gap = P1
Worked example
Observe: after Playwright chat,langfuse-cli api traces listshows no newrow;app/api/chat/route.tscallsopenai.chatwith no Langfuse wrap.Interpret: the live path is uninstrumented — the static map was wrong.Classify: missing instrumentation (pipeline break).Severity: P0 — prod chat is invisible.Finding: chat | P0 | no trace after live send | wrap the SDK call.
Self-critique before reporting [LOW freedom — do not skip]
- Concrete numbers — model + $/call or tokens, not "costs seem high"
- Live, not static — trigger the feature; missing post-trigger trace = P0
- Severity justified — P0 = pipeline break or untraced user-facing call
- Right owner — jailbreak/OWASP →
audit-llm-security; token caps →plan-llm-cost-guardrails - Keys stay in env — report host + presence, never secret values
Phase 0: Auto-Detect Langfuse Integration
0a. Find Langfuse Configuration
Search for environment variables and config files (in order):
.env,.env.local,.env.production— look forLANGFUSE_PUBLIC_KEY,LANGFUSE_SECRET_KEY,LANGFUSE_BASE_URL,LANGFUSE_HOSTlangfuse.config.ts,langfuse.config.js— dedicated config filesinstrumentation.ts/instrumentation.js— Next.js instrumentation with Langfuse- Supabase Edge Functions —
Glob("**/supabase/functions/**/index.ts")and search forLangfuseimports
Record: LANGFUSE_HOST, public-key present (never the secret), import sites, CLI env ready.
0b. Detect LLM Framework and Provider
Record: providers, frameworks, and the exact model ID strings in use, with each one's tier (frontier, mid, or small).
0c. Map AI Features
Build a feature map:
| Feature | File(s) | Provider | Model | Traced? | |
|---|---|---|---|---|---|
| _e.g. Chat_ | app/api/chat/route.ts | OpenAI | <model id> (frontier) | Yes |
0d. Detect Eval and Prompt Management Setup
Record: prompt source (Langfuse vs hardcoded vs config), eval setup, version/label.
Phase 1: Research LLM Best Practices
1a. Firecrawl Research
Scrape the top 2–3 results:
1b. Langfuse Documentation
Langfuse docs for the detected setup:
1c. Context7 for LLM Framework Docs
Phase 2: Audit via Langfuse CLI
Shell + Langfuse CLI. Require LANGFUSE_PUBLIC_KEY and LANGFUSE_SECRET_KEY in the env.
2a. Trace Completeness
For each AI feature identified in Phase 0c, verify:
- [ ] Trace exists with a matching name/metadata
- [ ] Trace has spans/generations (not just a top-level trace with no children)
- [ ] Trace includes input/output (not empty)
- [ ] Trace has proper metadata (userId, sessionId, tags)
- [ ] Latency is recorded
Red flags:
- AI feature exists in code but produces no traces → missing instrumentation
- Traces exist but have no generations → incomplete tracing (wrapper created but LLM call not captured)
- Traces with empty output → output not being captured (fire-and-forget pattern)
2b. Prompt Quality Audit
For each prompt:
Evaluate:
- [ ] Versioning: Are prompts versioned (v1, v2, v3+) or stuck at v1?
- [ ] Labels: Is there a
productionlabel? Are therestaging/experimentlabels for A/B testing? - [ ] System message quality: Clear role definition, constraints, output format instructions?
- [ ] Few-shot examples: Does the prompt include examples for complex tasks?
- [ ] Guardrails: Does the prompt include instructions to refuse off-topic/harmful requests?
- [ ] Variables: Are dynamic parts properly templated with
{{variables}}not string concatenation? - [ ] Freshness: When was the prompt last updated? Stale prompts may not use newer model capabilities.
If prompts are hardcoded in source code instead of managed via Langfuse:
Flag hardcoded prompts as a finding — they should be migrated to Langfuse for versioning and A/B testing.
2c. Model and Cost Efficiency
From trace data, analyze:
Build a cost table from generation details (model, tokens, latency, cost):
| Feature | Model | Avg Input Tokens | Avg Output Tokens | Avg Latency | Est. Cost/Call |
|---|
Red flags:
- Frontier-tier model used for simple classification/extraction → recommend the provider's small tier
- High input token counts → check for unnecessary context stuffing
- Output tokens much larger than needed → add an output-token cap or response format constraints
- High latency on user-facing features → consider streaming, caching, or smaller model
- Same content sent repeatedly → implement semantic caching
2d. Eval Score Health
Evaluate:
- [ ] Score existence: Are evals running at all?
- [ ] Score types: What's being measured (relevance, faithfulness, toxicity, custom)?
- [ ] Score distribution: Are scores clustered (all 1.0 = useless eval) or distributed?
- [ ] Annotation queues: Are humans reviewing AI outputs?
- [ ] Judge LLM: If using LLM-as-judge, which model? Is the judge prompt well-designed?
Red flags:
- No scores at all → no quality feedback loop
- Only manual scores, no automated → quality is not continuously monitored
- All scores are identical → eval criteria too loose or rubric too vague
- Scores declining over time → model degradation or prompt drift
2e. Session and User Attribution
Verify:
- [ ] Sessions group related interactions (multi-turn conversations have one session ID)
- [ ] User IDs are attributed (not all anonymous)
- [ ] Session metadata is useful (page, feature, user segment)
2f. Dataset Health
Evaluate:
- [ ] Datasets exist: Are there regression test datasets?
- [ ] Dataset freshness: When were items last added?
- [ ] Coverage: Do datasets cover all AI features or just one?
- [ ] Expected outputs: Do dataset items have expected outputs for automated comparison?
Phase 3: Live Verification
3a. Trigger AI Features via Playwright
For each Phase 0c feature, trigger it live. Timeouts 15s; sleep 2 → snapshot (not one long block).
Navigate to the feature, interact with it (fill form, click button, send message), and capture:
- The AI-generated response (via
snapshot) - Console messages (via
console) — look for errors - Network requests (via
requests) — look for failed API calls
3b. Verify Trace Pipeline
After triggering each feature, wait 5-10 seconds, then verify the trace landed:
Check:
- [ ] New trace appeared with correct name
- [ ] Trace has generations with model and token data
- [ ] Trace latency matches observed UX latency
- [ ] Input/output captured correctly
3c. Cross-Check with Sentry
Check for:
- LLM timeout errors
- Rate limiting (429) errors
- Token limit exceeded errors
- Langfuse SDK errors (failed to send trace)
- JSON parse errors on LLM responses
3d. Cross-Check with Supabase (if AI results stored in DB)
If the project stores AI outputs in the database:
Find tables that store AI outputs and verify data landed:
3e. Grounding / Hallucination Check
For features where the AI should reference source data (RAG, summarization, data extraction):
- Get the source data from the database (Supabase
execute_sql) - Trigger the AI feature via Playwright
- Compare the AI output against the source data
Red flags:
- AI mentions facts not in the source data → hallucination
- AI omits critical facts from the source data → incomplete extraction
- AI contradicts the source data → grounding failure
- AI generates plausible but wrong numbers → numerical hallucination
Phase 4: Report
Generate a structured report with the following sections.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/audit-langfuse-llm/SKILL.md
Popularity
- Repository stars
- 9
- 7-day trend score
- 12
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/kensaurus/cursor-kenji/audit-langfuse-llm)