はじめに
七尾百合子さん、お誕生日 7日目 おめでとうございます! nikkieです。
日々LLMのAPIを呼び出していますが、APIキー(例:OPENAI_API_KEY)の扱いが安全にできることに気づき、作業環境に適用しました。
この記事は、1Passwordを使っているmacOS環境での話となります。
目次
- はじめに
- 目次
- LLMのAPIキーの扱い方
- azuさんの記事を思い出す
- 結論:.envの中のCredentialを1Password移行後
- macOSに1password-cliをインストール
- 1Passwordを参照するように.envを書く
- 実行(op run)
- 終わりに
LLMのAPIキーの扱い方
これまでの私は.envファイルを用意し source して使っていました1
export OPENAI_API_KEY=sk-xxxx
先日(MCPクライアント自作2の中で)python-dotenvを試しました。
sourceせずに済んで便利でしたね
OPENAI_API_KEY=sk-xxxx
いずれにせよ、LLMのAPIキーをベタ書きしたファイルを開発マシン(macOS)に置いていたのです。
azuさんの記事を思い出す
思い出した記事がありました。
私も1Passwordを使っています(マスタパスワード1つだけで済んで、とっても便利!)。
azuさん記事の「.envに入っているCredentialを1Passwordに移行する」を、私の環境のLLMのAPIキーに適用してみました。
% sw_vers ProductName: macOS ProductVersion: 14.5 BuildVersion: 23F79
1Password for Mac 8.10.68 (81068014)
結論:.envの中のCredentialを1Password移行後
以下のコマンドでLLMのAPIキーを読み込むようにしています
% op run --env-file=$HOME/.secret/llm-api/.env -- <コマンドが続く>
- 1PasswordのLLMのAPIキーを参照するように記載した
.envをマシンの中に置きました - やってみて分かったのですが、
opコマンドを使うには1Passwordアプリを開いておく必要があります
azuさんの記事にはシェルスクリプトを書いてoprコマンドを用意しているのですが、私には進み幅が大きかったので宿題事項としました
macOSに1password-cliをインストール
opコマンドは1password-cliから。
Homebrewで入ります
1password-cli インストール後、ドキュメントに沿って1Passwordの設定から「Integrate with 1Password CLI」(「1Password CLIと連携」)を有効にしました。
このあとop vault listを叩いたのですが、1Passwordアプリを閉じていたために失敗します。
[ERROR] 2025/03/24 19:30:33 connecting to desktop app: 1Password CLI couldn't connect to the 1Password desktop app. To fix this, update the 1Password app to the latest version and restart the app. If you're still having trouble, visit https://developer.1password.com/docs/cli/app-integration#troubleshooting for more help.%!(EXTRA string=/usr/local/bin/op)
1Passwordアプリを開いていると通ります
1Passwordを参照するように.envを書く
1Passwordにはログインのアイテムを作りました(命名「LLM API KEYs」)。
このセクションにパスワードのフィールドを追加します

そして、.envファイルではアイテムのフィールド名を指定します
OPENAI_API_KEY="op://Personal/LLM API KEYs/Section_ornovavrhujnorecuh6xdswuxu/OPENAI_API_KEY"
azuさんの記事ではjqを駆使して、value(秘密の値)があるフィールドについて、<label>="<reference>"という形式で出力していました。
valueは1Passwordが管理してくれるので、安心・安全です!
実行(op run)
あとはop runコマンドに.envファイルを渡して実行するだけです!
例:OPENAI_API_KEYを使って、OpenAIの新しいspeech-to-textモデルを叩く3
% op run --env-file=$HOME/.secret/llm-api/.env -- python -m speech_recognition.recognizers.whisper_api.openai --model gpt-4o-mini-transcribe sample.wav
例:simonwさんのllmも使えます!(これは拡張を自作している様子4)
% op run --env-file=$HOME/.secret/llm-api/.env -- llm --model gemini-2.0-flash-yt 'https://www.youtube.com/shorts/46ycw2pQJCA' -o task transcribe
simonw/llmではLLM_GEMINI_KEYという環境変数5なのですが、これは.envに書いたのでもう「どんな環境変数名だっけ?」となることはありません
終わりに
azuさんの記事を参考に、LLMのAPIキーを.envベタ書きから1Passwordに移行しました。
都度op runコマンドが必要になっていますが、これまでsource <.envファイルのパス>でやってきた私にとってはあまり変わりません。
op runコマンド前に1Passwordを開く必要もありますが、安全を優先したいので納得しています。
かしこいClaudeとかに教えてもらって、oprコマンド相当も用意しよーっと(宿題は早めにね)
-
.envファイルはsourceすると誤解していた節があります↩ - ↩
-
ふふ...(別記事書くかも)
↩SpeechRecognition 3.14.2 supports OpenAI's new speech-to-text models: gpt-4o-transcribe and gpt-4o-mini-transcribe. Enjoy!https://t.co/BNdjZXgIzB https://t.co/lu5nOIVJbN
— nikkie(にっきー) / にっP (@ftnext) 2025年3月23日 -
ふふふ...(別記事書きたいな)
↩我がヨーダsimonwさんのllmってCLIがあるのですが、
— nikkie(にっきー) / にっP (@ftnext) 2025年3月23日
GeminiにYouTube URLを渡して要約(summary) / 書き起こし (transcribe) するpluginを雑に作りました。https://t.co/74hPOVoUtC
llm installはGistにも対応していてすごいです。ちょっとしたスクリプトがllm pluginにできちゃう!👏 - https://github.com/simonw/llm-gemini/tree/0.15?tab=readme-ov-file#usage↩