nikkie-ftnextの日記

イベントレポートや読書メモを発信

ghcr.io の多数のDockerイメージタグから探すのにげんなりしていたときに regclient を知りました

はじめに

七尾百合子さん、お誕生日 9日目 おめでとうございます! nikkieです。

Today I Learnedです

目次

GitHubが提供するコンテナレジストリ

Docker Hubが制限を強めているので、クラウドベンダーやGitHubなどが提供するコンテナレジストリも使われていますね。
GitHubが提供するコンテナレジストリが ghcr.io です。

ghcr.ioのイメージからタグで探すの大変すぎ問題

さて、多数のイメージがある ghcr.io を見てください!

例:uv
https://github.com/astral-sh/uv/pkgs/container/uv/versions?filters%5Bversion_type%5D=tagged

1,547 tagged 6,848 untagged (※2025/03/28閲覧)

例:TGI1
https://github.com/huggingface/text-generation-inference/pkgs/container/text-generation-inference/versions?filters%5Bversion_type%5D=tagged

3,627 tagged 7,100 untagged (※2025/03/28閲覧)

ghcr.io のWeb UIには多数のタグから目的のものを検索する機能がないように見えます。
ページネーションはありますが、ページネーションだけを使って目的のタグを特定するのは、正直やりたくありません...

先人が指摘していました

このScrapboxから解決策を知り、TILとなりました。

見なよ... 俺の今日知ったregctlを...

macOS環境にHomebrewでインストール

% regctl version
VCSTag:     0.8.2

タグの一覧
https://github.com/regclient/regclient/blob/v0.8.2/docs/regctl.md#tag-commands

% regctl tag ls ghcr.io/astral-sh/uv

% regctl tag ls ghcr.io/huggingface/text-generation-inference --exclude 'sha256-.*' --exclude 'sha-.*'

lessにパイプして検索といったこともできますね

特定のイメージの確認
https://github.com/regclient/regclient/blob/v0.8.2/docs/regctl.md#image-commands

% regctl image manifest ghcr.io/huggingface/text-generation-inference:2.3
Name:                            ghcr.io/huggingface/text-generation-inference:2.3

Manifests:

  Name:                          ghcr.io/huggingface/text-generation-inference:2.3@sha256:5d8b0544ebbe7f5a9f549899419a33ae178b55ca91003a0a5292ec6c6940edaa

抜粋して表示していますが、タグの付いたイメージのSHA256を確認といったことができます

終わりに

regclientのregctlコマンドを知りました。
検索するUIがなくてghcr.ioのイメージから特定のタグを探すのは半ば諦めていましたが、regctlコマンドが劇的に救ってくれました。
開発いただき、ありがとうございます!
なおregctl以外のコマンドも提供されているようで、この記事はごくごく一部を取り上げたにすぎません。

GitHubさんは、ghcr.ioにDocker Hub同様の「Filter tags」を実装してください🙏
regctlが動くんだから、APIはあるってことですよね? ね?


  1. 触った過去の記事

Claude Codeお試し&観察記:sphinx-new-tab-linkに一緒にテストコードを書きました

はじめに

七尾百合子さん、お誕生日 8日目 おめでとうございます!1 nikkieです。

世は2025年に入ってから、大 生成AIコーディング支援ツール 時代の趣。
気になっていたClaude Codeを触りました。

目次

Claude Code

AnthropicのClaudeを使った Agentic Coding tool です(research preview)

Claude Codeが1ヶ月くらい前に発表されたときにwaitlistに登録したのですが、招待メールを見過ごしました。
招待に書かれた期間にアクセスしなかったのでexpireしていると思われたのですが、MCP素振り2で作っていたAnthropicのアカウントを設定したところ使えています。
今回は0.2.53を試しました。

なお、Claude Codeは有料サービスです。
ClaudeのAPI creditが必要になります。
無料で使う方法はないんじゃないかと思います

自作OSS sphinx-new-tab-linkにテストコードを書く

Web fetch3ができるようになったと知り、issueにタスクを日本語で記載

最近のブラウザでは不要になったと知り、直近でaタグのrel属性からnoopenerを外しました。
https://github.com/ftnext/sphinx-new-tab-link/releases/tag/v0.7.0
きっかけの記事によると、「サイト内リンクでのnoreferrer指定はアクセス解析に支障をきたす」4とのことです。
Sphinx拡張の設定値を導入して、ユーザがnoreferrerを指定しないようにできるアイデアを思いつきました。

設定値を有効にしたときにnoreferrerが外れる(rel属性がない)ことを確認するためのテストをまず書くことにしました。

Claude Codeに私が自然言語で指示しながら、テストが書かれていった様子はこちらです。
https://gist.github.com/ftnext/fc886ba4f2281822cae6713fdbdf6c25
このセッションでかかった費用は0.8ドルです

  • 最初に/initでCLAUDE.mdは作りました(Gistとは別セッションです)
  • Issueã‚’Web fetchするも、そのかしこさ5により実装が3行程度と見通せてしまったのか、初手実装
    • 採用せずに叱る
    • この小さいコードベースは完全に把握しているようなので、評判通り優秀なのだと思います
  • このリポジトリ内にテストコードの例が豊富なので、それを参考に筋よくテスト実装
    • 私からは「そのコメントは不要」とか「命名はこっちじゃないか」とか
    • テストコードからロジックをメソッドに抽出するところでClaudeは見えていない感じだった
  • 最後、依頼としてはテスト実装のみなのですが、機能も実装してきた。不採用

ちなみにこの履歴は、tool useするエージェントを考えるのに活かせるのではと残しています。

Claude Codeを試してみて

ペアプログラミングでした。
Claude Codeがドライバー、私がナビゲーターという感じです。
Claudeが見えていないと感じたら私がドライバーを取ります6。

Devinとの違いは、Claude Codeは同期、Devinは非同期ですね。
Claude Codeは、GitHub Copilotよりもっとペアプロでした。二人一緒です(つきっきりでもある)。
それに対してDevinは、お願いした後はほっといてもやってくれる感じですね

分からなかった点として、仮想環境のディレクトリ下も見に行く動きをされると課金がかさみそうだったので、

CLAUDE.mdで「しないでね」と伝えたのですが、みなさんこうやってるんですかね?

終わりに

Claude Codeを小さなタスクで試しました。
今回はナビゲータとして全体を見ながら自然言語で指示をしていて、ペアプログラミング感がありました。

もしかすると、目的に合わせて生成AIコーディング支援ツールを使い分けるのかもしれないですね。
あんまり触れていないですが、今の仮説:

  • 自分の理解を深めながら進めたいときは、サジェストやChat程度のGitHub Copilot
  • 自分がある程度知っているコードベースを生産性高く進みたいときはClaude Code(※ここは他のツールもありそう)
  • 自分は詳しく、手を動かして知見を得たいと思わないようなときはDevinにお任せ

Claude Codeはリアルタイムに要望が実現する共創感があるので、注目したいと思います(この記事では触れなかったですが、MCPサポートもあるそうです!)


  1. 高槻やよいさん、お誕生日おめでとうございます!
  2. この記事から始まる一連の
  3. 「Claude Code uses claude-3-7-sonnet-20250219 by default.」ref: https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview#core-features-and-workflows
  4. 勤務先でやっているのと同じ感覚でした

LLMのWeb APIのキーを.envにベタ書きから、1Password管理に移行する

はじめに

七尾百合子さん、お誕生日 7日目 おめでとうございます! nikkieです。

日々LLMのAPIを呼び出していますが、APIキー(例:OPENAI_API_KEY)の扱いが安全にできることに気づき、作業環境に適用しました。
この記事は、1Passwordを使っているmacOS環境での話となります。

目次

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コマンド相当も用意しよーっと(宿題は早めにね)


  1. .envファイルはsourceすると誤解していた節があります
  2. ふふ...(別記事書くかも)
  3. ふふふ...(別記事書きたいな)
  4. https://github.com/simonw/llm-gemini/tree/0.15?tab=readme-ov-file#usage

Sphinxのビルド時に、受け入れるwarning以外が出力されたら、ビルドを異常終了する

はじめに

七尾百合子さん、お誕生日 6日目 おめでとうございます! nikkieです。

発表資料はSphinx(sphinx-revealjs)で作っている私ですが、リリースビルドで想定外のwarningがあったら1そこで止められると気づきました。

目次

できたもの:発表資料をビルドしてリリースするパイプラインを落とす

発表資料はGitHub ActionsでGitHub Pagesとして公開しています。
GitHub Actionsではsphinx-buildを実行し、その結果をGitHub Pages用ブランチにpushします。

sphinx-buildに--fail-on-warningを指定して2、warningがあったらビルドを異常終了するようにしました。
これにより、不完全な資料がGitHub Pagesとして公開されることを防げます。

しかし、実はやむなく受け入れているwarningもあります。
例えば1リポジトリでディレクトリを切って複数のスライドを公開していると、ビルドはされますが、全体で1つのドキュメントとしては参照されないので[toc.not_included]が指摘されます。
受け入れるwarningは、conf.pyのsuppress_warningsに記載しました3。

suppress_warnings = ["toc.not_included"]

このコミットが本記事の結論です!

sphinx-buildの--fail-on-warningと--exception-on-warning

ヘルプを見たときに違いが分からなかったのがこの2つのフラグ。

ドキュメントによると

ロギングのレベルでいうと、errorレベルとcriticalレベルの違いのような感じでしょうか

--exception-on-warningと違って、--fail-on-warningはsuppress_warningsで動きを変えられます。
https://www.sphinx-doc.org/ja/master/usage/configuration.html#confval-suppress_warnings

  • suppress_warningsに指定されたwarningは、抑制されるのでwarningとして出ません(なのでerrorに変わることもありません)
  • 指定していないwarningは、--fail-on-warningによってerrorに変わります。

今回の場合[toc.not_included]は受け入れるのでerrorとして扱う必要がありませんが、他のtypeのwarningはerrorとして扱ってほしいのです

脱線:--exception-on-warningはなぜ登場した?

初見では紛らわしいと感じたので少し調べました。
上記のリンク先には「Added in version 8.1.」とあります

https://www.sphinx-doc.org/en/master/changes/8.1.html#features-added

#12743: Add sphinx-build --exception-on-warning, to raise an exception when warnings are emitted during the build.

Currently, using --fail-on-warnings gives a fairly hard to understand traceback (ç•¥) and means that on minor errors that are easily fixed, the entire build must be restarted, perhaps multiple times to fix errors incrementally.

--fail-on-warning(と--keep-going)を使うのが分かりづらかったので、ここで改善されたようです

(2025/03/24 この記事内のtypo修正。pull requestでは--fail-on-warningsですが、ドキュメントやヘルプメッセージからsは誤りですね)

終わりに

Sphinxでsuppress_warningsを使って特定のtypeのwarningを受け入れ、それ以外は--fail-on-warningでビルドを異常終了させられます!

先日の記事で取り上げたwarningのtype追加のおかげで、ピンポイントでsuppress_warningsに指定できるようになり、今回取り上げた知見が成立したように思われます

Sphinx(8.2.3)でビルドしたところ、warningメッセージに[toc.not_included]という出力が! どんな過程を経てwarningのtypeを出力するようになったかを調べました

はじめに

七尾百合子さん、お誕生日 5日目 おめでとうございます!1 nikkieです。

Sphinxのビルドはuvxで実行している2私ですが、ふとwarningメッセージがちょっと違うのに気づきました。

WARNING: document isn't included in any toctree [toc.not_included]

[toc.not_included]なんてこれまで出ていなかったような。
このwarningのtypeが表示されるようになった経緯を調べました。

目次

まとめ:[toc.not_included]が出力されたのは

今回触ったSphinxのバージョンはv8.2.3です。

  • Sphinx 8.0からwarningのtypeが表示されるようになった
  • Sphinx 8.2でtoc.not_includedはじめtypeが複数追加された

設定値show_warning_typesがSphinx 8.0からTrueに

conf.pyに書ける設定値show_warning_types
https://www.sphinx-doc.org/ja/master/usage/configuration.html#confval-show_warning_types

これは7.3.0で追加され3、8.0からデフォルト値がTrueになりました。

#12597: Change the default of show_warning_types from False to True.

https://www.sphinx-doc.org/en/master/changes/8.0.html#incompatible-changes

As per python/mypy#13542, here I am advocating for making this on by default.

(mypyみたいだなと私も思ったのですが、)mypyのエラーコードがデフォルトで表示されるのにならって、Sphinxのwarningのtype/subtypeもデフォルトで表示有効にしたようです

Sphinx 8.2でコードtoc.not_includedが追加

suppress_warningsという設定値について
https://www.sphinx-doc.org/ja/master/usage/configuration.html#confval-suppress_warnings

Added in version 8.2: (ç•¥), and toc.not_included.

Sphinxのwarningのコードにtoc.not_includedが追加されました。

8.2のChangelogにはpull requestの番号はありませんが
https://www.sphinx-doc.org/en/master/changes/8.2.html#release-8-2-0-released-feb-18-2025

実装は、Sphinxのロガーにtypeとsubtypeを指定しています。
https://github.com/sphinx-doc/sphinx/pull/11677/files#diff-98101714dd35d78a9bdbb8c487fc2e8d10eb3a54772b8da767f34941db21a39d

logger.warning(
    __("document isn't included in any toctree"),
    location=docname,
    type='toc',
    subtype='not_included',
)

終わりに

Sphinxのwarningメッセージに新たに見かけるようになった[<type>.<subtype>]というコードが、どのような開発の過程を経て追加されたのかを調べました。
設定値show_warning_types追加、デフォルト値変更、warningのtype追加と、小さな変更が積み重なっていました。

mypyのエラーコードのようにwarningコードが分かるので、conf.pyでsuppress_warningsに指定してよさそうですね。
私はsphinx-revealjsで1リポジトリに複数スライドでやっているので、toc.not_includedwarningは承知の上のためです


  1. 佐竹美奈子さんもおめでとうございます!
  2. ピッチスペルです!
  3. #12131 https://www.sphinx-doc.org/en/master/changes/7.3.html#features-added

OpenAIのComputer useラプソディ(2025年3月)

はじめに

七尾百合子さん、お誕生日 4日目 おめでとうございます! nikkieです。

この1週間、OpenAIのComputer useに振り回されました

※Computer useを使う方法をご存じの方は、ぜひ教えてください

目次

まとめ(教訓)

  • OpenAIが3/13 JST 未明に発表したComputer useは、全員が使えるわけではないようです
  • 私はTier 5まで課金しましたが、利用できませんでした1
  • 返金はo3-mini deep researchのおかげでストレスなく手続きできました

待望のComputer use

platform.openai.com

Proになると使えるOperator(CUA)がすごくて、Computer useのAPI提供はめちゃめちゃ胸が踊りました。
これで私もOperatorできる!(<- できなかったんですけどね...)

2025/03/13 Tier 3まで課金

computer-use-preview modelはRate limitsがTier 3 ~ 5なので

platform.openai.com

APIのcreditを購入し、Tier 1からTier 3までまず上げました。

上げ方の参考になった記事

ところが

2025/03/14 Tier 5まで課金

Tier 5から優先的に提供される可能性に賭け、躊躇せずに最高Tierまで上げます。

ところが

このときの絶望感といったらなかったです。
launchした、んですよね...?!

2025/03/21 返金対応に動く

特に期待せずにo3-miniで返金手順をdeep researchしました。
2回のcredit購入のうちTier 3 -> 5の$900だけ返金したいという要望を伝えたところ、画面操作手順から文面案まで提案してくれて、とても助かりました2。
喧伝されたComputer useが利用できなかったので、creditは手つかずです。
この点を強調するというテクをdeep researchは教えてくれました

https://platform.openai.com/settings/organization/general からサイドメニュー下のChat(deep research参照)で返金のお願いをしています

>Hi! What can we help with?

Payments and Billing (選択)

>What type of help do you need?

Request a refund (選択)

>Which product are you reaching out about?

API (選択)

>Feel free to add any additional context below 👇

(deep researchにある文面案をもとに作成)

結果、refundが通りました!!
購入したcreditは有効期限1年なので、$900が無駄にならなくて本当によかった...

終わりに

Computer use、早くavailableになってくれ!
CloseAIだから、launchと発表したものが使えない理由が謎です(地域制限を私見落としたのかな?)


  1. ただ使えている報告もあるので、謎は深まるばかりです
  2. 失墜したOpenAIへの信頼がプラマイゼロに戻りました。ただComputer useを提供してくれさえしたら、これは知らなくてもよい知見なはず

Andrew Ng先生による「What's next for AI agentic workflows」を1年遅れで視聴。私はAgentic workflowを誤解していました

はじめに

七尾百合子さん、お誕生日 3日目 おめでとうございます! nikkieです。

Today I Learnedです。
ひょんなことからNgセンセの1年前の動画を見たのですが、一次情報を確認することの重要さを思い知りました。

目次

What's next for AI agentic workflows

LLMを使ったアプリケーション開発に携わっている方には、以下の動画の最初の2分だけでも見るのをオススメします

Agentic workflowとは

LLMに文章を書かせたいとき、プロンプトで指示しますよね。
「Please type out an essay on topic X」
(もっと構造化したり、例を入れたりするかもしれませんが、ここでは省略します)

NgセンセはこれをNon-agentic workflowと呼びます。
人間でいうと、バックスペースキーを使わずに文章を最初から最後まで書き上げるようなものとのこと1。
こうとらえると、LLMが指示に沿った出力をするのは驚異的ですね(沿わないときもありますが)

Ngセンセの提案はAgentic workflow。
エッセイの例はこんな感じになるそうです。

  • Write an essay outline on topic X
  • Do you need any web research?
  • Write a first draft
  • Consider what parts need revision or more research
  • Revise your draft
  • (ç•¥)

細かい指示が並んでいますが、重要なのはRevise(修正)と理解しました。
バックスペースキーを使わせるわけです。
草稿を(バックスペースキーを使わずに)書かせた後、LLMに修正が必要な箇所を考えさせ、それを元に修正します。
これを繰り返すわけですね(動画に映るスライドにはループしている図があります)

Agentic workflowの定量評価

この後には効果が定量的に示されます。
HumanEvalを使った検証で、GPT-3.5 + Agentic workflowがGPT-4 + Non-agentic workflowを上回ったとのこと。
このことから、性能が低いがトークン生成が速いLLMにAgentic workflowを適用すると、性能が低い点を埋め、さらには多少上乗せできるのだなと理解しました。
(性能が高いLLMにAgentic workflowを適用するとより賢くなるでしょうが、所要時間がネックです)

Agentic Reasoning Design Patterns

私の中ではオプショナルという判断です(最初はとにかくAgentic workflowを押さえたいので)。
11:00前後のまとめから見るのもよいかもしれません

  1. Reflection2
  2. Tool use
  3. Planning
  4. Multi-agent collaborations

上記の例で、Reflectionは修正点を考えて直すところ、Tool useはweb researchに表れているように思われます。
この2つ(1と2)は講演時点(2024年3月頃)でrobust、残り2つ(3と4)はemerging3とされています

関連リソース

日本語で読める記事

Ng先生による、発表の記事版も見つかりました(積ん読!)

私のしくじり:Ng先生の動画を見ずに済ませようとして誤解した

上記のZennの記事は公開直後に軽く目を通していて、「Agentic workflow」は目に留まりました。
その後以下のスライドを見たときに、「Agentic workflowは、長いプロンプトを使うのではなく、細かいタスクに分解してLLMをたくさん呼び出すこと」と私は誤解しました(続くスライドまで送って見てください)

Agentic Workflowの肝は、(道具の使用や)修正を可能にする点だと思います。
プロンプトの長さはNg先生は言及していないように思われ、長くても繰り返しConsider & reviseすれば改善していくのではないかと思いました(※要検証)

終わりに

Andrew Ng先生が提唱するAgentic workflowを、動画を見て完全に理解しました。
1つのプロンプトを渡すのは、人間でいうとバックスペースキーなしでテキストを書いてもらうようなもの。
Agentic workflowでは、バックスペースキーなしで書いたテキストをレビューさせ、レビューに基づいて修正させることを繰り返すことで、バックスペースキーを使った状態となり出力の質が上がる!
これは日々書くプロンプトにも活かせそうですね。
Agentic Reasoning Design Patternsの4つは、関連論文を確認して理解を深めていきたいなと思っています。

Ngセンセが動画で提案しているのはどれも抽象で、具体のLLMが更新されたとしても影響を受けにくいように思われます。
大LLM時代、個別具体はどんどん更新されていきますが、そこを追いかけるのは持続可能じゃないように感じており、抽象の理解を深めていきたい気持ちです。
この生存戦略には一次情報が大事だなと痛感しました4


  1. 毎日書いてる私が断言しますが、そんなの無理です
  2. Reflectionの例がAI Scientistみたいです(詳しくはまたの機会に)
  3. Planningはreasoningモデル登場でかなりrobust寄りになったのでは
  4. 今回YouTubeの動画を見るのに、NotebookLMやGoogle AI Studioを試しました(書き起こしの翻訳など)