·tips

Pi coding agentで複数アカウントを切り替える

PI_CODING_AGENT_DIRを切り替えるwrapperでpiのauth.jsonだけを分離し、sessionsや設定は共有する

3 min read
Writing style

まとめ

  • piは~/.pi/agent(PI_CODING_AGENT_DIRで変更可)配下にauth.json、settings.json、models.json、sessions等を置く
  • auth.jsonはprovider 1つにつき1credentialなので、同じproviderの複数アカウントは持てない(#1391)
  • 別のPI_CODING_AGENT_DIRを作ってauth.json以外をデフォルト側へsymlinkすれば、認証だけ分けてsessionsや設定は共有できる
  • PI_PROFILEはpi標準の環境変数ではないが、wrapperでPI_PROFILE → PI_CODING_AGENT_DIRへ変換すればCodex CLIと同じ感覚で使える
  • シェル関数だとsh -cやスクリプトから呼んだときに効かないので、PATH上のwrapperにする

auth.json以外を共有する

cd ~/.pi
mkdir -p agent/prompts agent/themes agent/tools
mkdir -p agent-alternate && chmod 700 agent-alternate

for f in bin extensions skills prompts themes tools sessions \
  settings.json models.json models-store.json keybindings.json mcp.json trust.json; do
  ln -s "../agent/$f" "agent-alternate/$f"
done

prompts・themes・toolsのようにまだ無いディレクトリは先に作っておく。mcp.jsonなどのファイルはリンク先が無くても、piが書き込むときに作られる。

PI_PROFILEで切り替える

binary版のpiは~/.local/share/pi/piが本体で、~/.local/bin/piはそこへのsymlinkになっている。~/bin/piにwrapperを置く。

#!/bin/sh
# PI_PROFILE=<name> pi [...]
set -eu

real="$HOME/.local/share/pi/pi"

case "${PI_PROFILE:-default}" in
  default)   dir="$HOME/.pi/agent" ;;
  alternate) dir="$HOME/.pi/agent-alternate" ;;
  *)
    echo "unknown PI_PROFILE: ${PI_PROFILE}" >&2
    echo "expected: default or alternate" >&2
    exit 2 ;;
esac

export PI_CODING_AGENT_DIR="$dir"
exec "$real" "$@"

~/.local/binが~/binよりPATH前方にあっても必ずwrapperを通るように、~/.local/bin/piをwrapperへのsymlinkに張り替える。

chmod +x ~/bin/pi
ln -sfn ~/bin/pi ~/.local/bin/pi
pi
PI_PROFILE=alternate pi        # 起動して /login
PI_PROFILE=alternate pi auth check --provider openai
PI_PROFILE=alternate bash -c 'pi -p "hello"'   # 非対話shellからも効く

注意点

  • auth.jsonは共有しない。OAuthのrefresh tokenはrefreshのたびに更新されるので、同じアカウントを複数のdirに置くと片方が失効する
  • piはsettings.json等をrenameせずにその場で書き込むので、symlinkは壊れない
  • sessionsは混ざる。そのかわり、どのprofileからでも-cで同じsessionを再開できる
  • MCPのOAuth credential(mcp-auth.json)はprofile別のまま。共有したければsymlinkする
  • binary版のpi updateはreleasesへの案内を出すだけで~/.local/bin/piを作り直さないので、wrapperは残る
  • oh-my-zshのpnpm pluginはalias pi='pnpm init'を定義する。~/.zshrcでunalias piしておく

ref