description optimizerのANTHROPIC_API_KEY依存を廃止し`claude -p`サブプロセス方式に統一

anthropics/skills

skill-creatorのdescription optimizerが、anthropic Pythonライブラリによる直接API呼び出しからclaude -pサブプロセス呼び出しに変更されました。これにより、ANTHROPIC_API_KEYの個別設定なしにClaude Codeの認証セッションをそのまま再利用できるようになります。

背景

description optimizerのスクリプト群(improve_description.pyrun_loop.py)は、これまでanthropicライブラリを直接インポートし、anthropic.Anthropic()クライアントを生成してAPIを呼び出していました。この方式では、Claude Codeのセッション内で動作するskillでありながら、別途ANTHROPIC_API_KEY環境変数の設定が必要という矛盾した状態でした。

同じリポジトリのrun_eval.pyはすでにclaude -pサブプロセス方式を採用しており、Claude Codeの認証をそのまま使う設計が確立されていました。今回の変更はその設計をimprove_description.pyにも適用し、ツール群全体の認証パターンを統一するものです。

技術的な変更

improve_description.py_call_claudeヘルパー関数が新設され、anthropicライブラリへの依存が完全に除去されました。

変更前:

import anthropic

# ...
client = anthropic.Anthropic()
# client を引数として improve_description() に渡していた

変更後:

import os
import subprocess

def _call_claude(prompt: str, model: str | None, timeout: int = 300) -> str:
    cmd = ["claude", "-p", "--output-format", "text"]
    if model:
        cmd.extend(["--model", model])

    env = {k: v for k, v in os.environ.items() if k != "CLAUDECODE"}

    result = subprocess.run(
        cmd,
        input=prompt,
        capture_output=True,
        text=True,
        env=env,
        timeout=timeout,
    )
    if result.returncode != 0:
        raise RuntimeError(
            f"claude -p exited {result.returncode}\nstderr: {result.stderr}"
        )
    return result.stdout

run_loop.py側でもanthropic.Anthropic()クライアントの生成とclient引数の受け渡しが削除されています。プロンプトはargvではなくstdinで渡す設計になっており、SKILL.mdの全文を含むような長いプロンプトでも引数長の制限を受けません。

注目すべきはCLAUDECODE環境変数の除去です。Claude Codeのインタラクティブセッション内でさらにclaude -pをネストして呼び出すと競合が生じる可能性があるため、サブプロセス起動前にCLAUDECODEをenv dictから除外しています。run_eval.pyで確立された同じパターンを踏襲しています。

設計判断

anthropicライブラリを捨ててclaude -pに統一するという判断には、認証の一元化という明確な動機があります。

skill-creatorはClaude Codeのセッション内で動作することを前提とした設計であり、そのコンテキストではclaude -pが認証を自動的に引き継ぎます。anthropicライブラリを使う場合は別途ANTHROPIC_API_KEYが必要になり、ユーザーに余分なセットアップを強いることになります。run_eval.pyとの統一により、すべての外部API呼び出しが同じサブプロセスパターンを使うことになりました。

また、SKILL.mdの説明文も「extended thinkingを使ってClaudeを呼び出す」という記述から「Claudeを呼び出す」というシンプルな表現に変更されており、実装詳細への依存を減らしたドキュメント方針も読み取れます。

まとめ

本PRは、description optimizerの認証方式をrun_eval.pyと同じclaude -pサブプロセスパターンに統一したリファクタリングです。ANTHROPIC_API_KEYという外部依存を排除することで、Claude Codeのセッションのみで完結する一貫した実行環境が実現されています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
c4e8f6ad

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)、背景・技術詳細・設計判断(各論)、まとめ(結論)という「総論→各論→結論」の構成が明確で、読者の理解を助ける理想的な構造です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```python:path/to/file.py)とGitHubのPRリンク記法([#547](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

サブプロセス、環境変数、APIクライアントといった技術的なトピックを扱っており、専門知識を持つエンジニアという対象読者に適合した内容です。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション・各パラグラフが要点から始まる構成になっており、1段落1トピックの原則も守られています。非常に読みやすく、構造化された文章です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコードブロックは、提供されたDiffの内容(_call_claude関数の新設など)を正確に反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`claude -p`、サブプロセス、`ANTHROPIC_API_KEY`、`CLAUDECODE`などの技術用語が文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

認証方式の変更理由や`CLAUDECODE`環境変数を削除する意図など、技術的な説明がDiff内のコードやコメントによって裏付けられており、正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(認証方式の統一、SKILL.mdの文言変更など)がPRのタイトル、Diff、コメントで裏付けられており、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#547)や各種ファイル名(improve_description.pyなど)が正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルは、PRのタイトル「skill-creator: drop ANTHROPIC_API_KEY requirement from description optimizer」の趣旨を的確に捉え、要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に含まれない外部知識(バージョンのサポート状況、リリース日程など)の追加はなく、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「これまで」「今回の変更」といった時間表現は、PRによる変更の前後関係を正しく反映しており、誤解を招く表現はありません。