pi-profile
Runtime profile switching for the Pi coding agent — swap model, skills, subagents, and system prompt in the same session, no restart needed.
Package details
Install pi-profile from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-profile- Package
pi-profile- Version
0.2.0- Published
- Jul 11, 2026
- Downloads
- 510/mo · 193/wk
- Author
- eddie0521
- License
- MIT
- Types
- extension
- Size
- 50.6 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-profile
A pi extension for instant identity switching — swap model, skills, subagents, and system prompt in the same session, no restart needed.
/profile researcher # switch to the researcher identity
/profile default # back to default
pi --profile researcher # start directly in a profile
Install
pi install npm:pi-profile
Example profiles (default, researcher) ship in the repo's profiles/
directory — copy them to ~/.pi/profiles/ to start, or build your own with
/profile create.
Quick start
# Use the researcher profile (ships as example)
pi --profile researcher
# Inside an interactive session
/profile researcher
# List all profiles
/profile list
How it works
pi-profile hooks into pi's extension API to switch runtime identity:
| Layer | Mechanism | Effect |
|---|---|---|
| Skills | before_agent_start + tool_call |
3-layer hard block: skills outside profile are invisible to the LLM |
| Subagents | Agent .md file sync |
Profile-defined team members available for delegation |
| Prompt | before_agent_start |
Profile's system prompt injected each turn (append mode) |
| Model | pi.setModel() |
Different profiles use different models |
| Autocomplete | addAutocompleteProvider |
/ only shows profile's skills and templates |
Identity, not security. Profile controls who the AI is — not what tools it can use or what commands are dangerous. Tool access and security policies are handled by dedicated extensions like
pi-permission-suite.
Profile files
Stored as ~/.pi/profiles/<name>.json:
{
"name": "researcher",
"label": "🔬 Deep Researcher",
"description": "Deep research mode with web search focus",
"systemPrompt": "你是一个严谨的研究助手。\n\n## 准则\n1. 每次回答必须附上来源链接\n2. 优先使用 web_search 验证事实\n3. 交叉验证多个来源后再得出结论\n4. 用结构化格式输出(列表、表格、摘要)\n5. 遇到不确定的,明确说明",
"model": {
"provider": "opencode-go",
"model": "kimi-k2.6",
"thinkingLevel": "high"
},
"skills": ["learn", "wiki-read", "wiki-write"],
"sessionName": "🔬 Research"
}
Profile interface
| Field | Type | Description |
|---|---|---|
name |
string |
Unique ID (lowercase, no spaces) |
label |
string? |
Display label (emojis OK) |
description |
string? |
One-line summary shown in profile list |
systemPrompt |
string? |
Appended to Pi's default system prompt each turn |
model |
{provider, model, thinkingLevel?} |
Optional fixed model binding |
skills |
string[]? |
Skills visible to LLM (undefined = all skills visible) |
prompts |
string[]? |
Prompt templates visible in autocomplete |
subagents |
Record<string, Subagent> |
Team members synced to Pi's agent system |
sessionName |
string? |
Auto-session label when using this profile |
Skill hard blocking (3 layers)
When skills is set, non-listed skills are completely invisible to the LLM:
| Layer | What | How |
|---|---|---|
| 1 | System prompt | <available_skills> XML filtered — LLM never sees them listed |
| 2 | Read interception | LLM calling read() on a non-profile SKILL.md is blocked |
| 3 | Autocomplete | /skill:<name> doesn't appear in auto-complete |
This means the LLM cannot know about, discover, or use skills outside the profile's scope. Skills still load at startup — profile controls visibility, not availability.
Commands
| Command | Description |
|---|---|
/profile |
Show current profile + available list |
/profile <name> |
Switch profile |
/profile list |
List all profiles |
/profile show <name> |
Show profile JSON |
/profile create |
Interactive wizard (AI-guided or manual) |
/profile rm <name> |
Delete profile |
CLI
pi --profile <name> # Start with profile
PI_PROFILE=<name> pi # Via environment variable