pi-langfuse
Langfuse extension for Pi coding agent
Package details
Install pi-langfuse from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-langfuse- Package
pi-langfuse- Version
1.5.3- Published
- Jun 18, 2026
- Downloads
- 2,907/mo · 241/wk
- Author
- gooyoung
- License
- MIT
- Types
- extension
- Size
- 235.7 KB
- Dependencies
- 5 dependencies · 1 peer
Pi manifest JSON
{
"extensions": [
"./index.ts"
],
"image": "https://github.com/gooyoung/pi-langfuse/blob/main/image.png?raw=true"
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-langfuse
Langfuse observability extension for Pi Coding Agent. It sends complete Pi runs to Langfuse so the prompt, agent workflow, LLM generations, tool calls, final response, usage, cost, and health scores appear in one trace.
What This Adds to Pi
- One Langfuse trace per user prompt, grouped by Pi session.
- Root
agent, per-requestgeneration, and per-tooltoolobservations. - Final assistant output capture, tool error visibility, and trace-level scores.
- Privacy controls for inputs, outputs, tool I/O, system prompt, and cwd.
- Secret redaction and local path hashing before upload.
- REST fallback for self-hosted Langfuse setups where OTel spans arrive but traces do not materialize.
Prerequisites
- Node.js >= 22
- Pi Coding Agent installed and configured
- A Langfuse account (cloud or self-hosted)
Quick Start
Install the extension:
pi install npm:pi-langfuseRun Pi once. If no credentials are configured yet, Pi prompts for:
- Langfuse public key, starting with
pk-lf-... - Langfuse secret key, starting with
sk-lf-... - Langfuse host, defaulting to
https://cloud.langfuse.com
- Langfuse public key, starting with
Run Pi normally:
pi "Explain the architecture of Redis"Open Langfuse and inspect the new trace.
Configuration
Langfuse API keys are available in Langfuse Cloud -> Settings -> API Keys.
Method 1: Interactive setup
Run any pi command with the extension loaded. On first run without configuration, Pi prompts in the CLI or TUI and saves the result to ~/.pi/agent/pi-langfuse/config.json.
To run setup again:
/langfuse-setup
Method 2: Environment variables
Set these before starting Pi:
export LANGFUSE_PUBLIC_KEY="pk-lf-xxxx"
export LANGFUSE_SECRET_KEY="sk-lf-xxxx"
export LANGFUSE_BASE_URL="https://cloud.langfuse.com" # optional; LANGFUSE_HOST is also supported
Saved config takes precedence. Environment variables are only used when ~/.pi/agent/pi-langfuse/config.json is missing or incomplete.
Privacy controls can also be set through environment variables:
export LANGFUSE_PRIVACY_PRESET="full-debug"
Available presets:
| Preset | Captures |
|---|---|
metadata-only |
Metadata only; omits inputs, outputs, tool I/O, system prompt, and cwd |
prompts-only |
Prompt/provider inputs plus metadata |
conversations |
Inputs and assistant outputs, but omits tool I/O, system prompt, and cwd |
full-debug |
Full trace detail; this is the default |
Fine-grained flags override presets:
export LANGFUSE_CAPTURE_INPUTS=true
export LANGFUSE_CAPTURE_OUTPUTS=true
export LANGFUSE_CAPTURE_TOOL_IO=false
export LANGFUSE_CAPTURE_SYSTEM_PROMPT=false
export LANGFUSE_CAPTURE_CWD=false
All captured payloads are redacted before upload. The extension masks common API keys, bearer tokens, passwords, cookies, private keys, Langfuse keys, GitHub/npm/AWS-style tokens, and local absolute paths.
Method 3: Persistent config.json
Create or update ~/.pi/agent/pi-langfuse/config.json:
{
"publicKey": "pk-lf-xxxx",
"secretKey": "sk-lf-xxxx",
"host": "https://cloud.langfuse.com",
"privacyPreset": "conversations"
}
Fine-grained capture flags can also be persisted:
{
"publicKey": "pk-lf-xxxx",
"secretKey": "sk-lf-xxxx",
"host": "https://cloud.langfuse.com",
"capture": {
"LANGFUSE_PRIVACY_PRESET": "metadata-only",
"LANGFUSE_CAPTURE_INPUTS": "true"
}
}
Security: Keep
~/.pi/agent/pi-langfuse/config.jsonprivate. Never commit API keys to version control.
Verify the Extension
Check that Pi has loaded the package:
pi list
pi-langfuse should appear in the installed package list.
What Appears in Langfuse
- Each Pi session gets its own Langfuse session ID.
- Each user prompt within that session becomes a separate trace.
- The trace contains the final assistant output shown in Pi.
- Tool runs appear as tool observations with arguments, results, and error state.
- LLM requests appear as generation observations, including usage and cost when the provider exposes them.
- Trace-level scores include tool counts, tool success rate, and whether the run had errors.
The package also includes a Langfuse CLI skill, so Langfuse data can be queried directly from Pi:
/pi-langfuse-langfuse <your-query>
Source Metadata
Local prototype note: source metadata support in this installed package is a local prototype patch. A durable solution should be shipped through an upstream PR, a fork, or a maintained package version so reinstalling the extension does not lose the behavior.
For Git-backed runs, the extension attaches safe source metadata to traces:
{
"source_type": "git-repo",
"repo_identity": "owner/repo",
"repo_owner": "owner",
"repo_name": "repo",
"repo_root_name": "repo",
"git_branch": "main",
"git_commit": "abc123",
"git_remote_host": "github.com",
"git_remote_path": "owner/repo",
"metadata_source": "git-detection"
}
repo_identity is owner/repo. repo_name is the repo name only and must not contain a slash.
A Git repo may optionally provide .pi-langfuse.metadata.json. Overrides are whitelist-only; unknown keys are ignored. Allowed keys are:
repo_identity
repo_owner
repo_name
source_type
service_name
project_slug
environment
observability_owner
Repo-local overrides are used only after the working directory is confirmed to be inside a usable Git repo. If Git detection fails for any reason, including a missing Git command, corrupted repo, or non-Git folder, the extension ignores repo-local identity files and emits only:
{
"source_type": "non-git",
"metadata_source": "non-git"
}
The extension must not upload raw absolute local paths, credentialed remotes, tokens, unknown override keys, or folder names for non-Git folders.
Troubleshooting
No traces appearing?
- Verify the API keys and run
/langfuse-setupagain if needed. - Confirm the Langfuse project is active and accepts writes.
- Confirm the keys have write permission.
- Look for
📊 Langfuse:log messages in Pi output.
Extension not loading?
pi list
pi install npm:pi-langfuse
"Missing config" on startup?
- Run
/langfuse-setup. - Or set
LANGFUSE_PUBLIC_KEYandLANGFUSE_SECRET_KEYbefore starting Pi.
Model or cost not showing?
- Some providers do not expose cost information.
- Inspect the raw observation data in Langfuse traces.
- The
modelfield can come from provider events, finalized assistant messages,model_select, orctx.model.
API key errors?
- Public keys start with
pk-lf-. - Secret keys start with
sk-lf-. - For self-hosted deployments, verify the host URL.
Development Docs
Development setup, source installation, runtime architecture, trace model, tracked fields, and validation steps are documented in DEVELOPMENT.md and DEVELOPMENT_CN.md.
License
MIT
