CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-04-20中級

壁紙・ヒーリングアプリに Claude API を実装した全記録 — コンテンツキュレーションから多言語説明文生成まで

2014年から個人で壁紙・ヒーリング系アプリを開発してきた視点から、Claude APIを実際に組み込んだ実装例を全記録。コンテンツキュレーション・App Store文生成・タグ自動付与の3つの実装パターンをコード付きで解説します。

Claude API115個人開発110アプリ開発8壁紙アプリ3多言語2コンテンツキュレーションAPI実装

プレミアム記事

2014年からiOSとAndroidの壁紙・ヒーリング系アプリを個人で開発してきて、今では複数のアプリを運営しています。この分野で長く続けてこられた理由のひとつは、コンテンツの量と質をどう維持するかという問題に向き合い続けてきたことだと思っています。

Claude APIを自分のアプリに組み込んでみたのは、その延長線上でした。「AIで壁紙を生成する」という方向ではなく、「すでにある大量のコンテンツをより賢く扱う」ための実装です。

ここでは私が実際に行った3つの実装パターンを、コードと一緒に記録します。壁紙アプリに限らず、画像コンテンツを扱う個人開発者の方に参考になる部分があると思っています。

背景:なぜ Claude API を選んだか

壁紙アプリのコンテンツ管理で長年困っていたのは、大量の画像に対するメタデータ管理です。カテゴリ分類、説明文生成、タグ付与、多言語対応——これらを人手でやると膨大な時間がかかります。

画像生成AIを使えばコンテンツ自体を自動化できますが、私のアプリは独自の世界観とキュレーションで差別化してきたので、そこは変えたくありません。欲しかったのは「既存のコンテンツを賢く整理し、説明する」機能でした。

Claude APIを選んだ理由はいくつかあります。日本語の扱いがよいこと、長いコンテキストで一貫した判断ができること、そして何より「トーンの指定」が効くことです。ヒーリング系アプリの文脈では、文体のトーンが重要です。「おだやかに」「自然体で」という指示が実際に反映される点が、他のモデルと比べて私には合っていました。

実装1:コンテンツキュレーションスコアリング

最初に実装したのは、新しい壁紙画像をライブラリに追加するときのキュレーションスコアリングです。

画像そのものをClaudeに渡すのではなく、人間が付けた簡易なメモ(色調、モチーフ、撮影条件など)をテキストとして渡して、アプリのコンセプトとの適合度を評価してもらうアプローチを取りました。

import anthropic
import json
 
client = anthropic.Anthropic()
 
CURATION_SYSTEM_PROMPT = """
あなたは癒し系・ミニマリスト系の壁紙アプリのコンテンツキュレーターです。
以下の基準でコンテンツを評価してください。
 
アプリのコンセプト:
- テーマ: 静寂、自然、ミニマリズム、感情的な余白
- ターゲット: 日々の疲れを感じている20〜40代のユーザー
- 避けるべき要素: 派手な色使い、商業的なグラフィック、情報量の多い構図
 
スコアリング基準(0-10の整数):
- concept_fit: アプリコンセプトとの適合度
- calm_factor: 落ち着きを感じさせる度合い
- uniqueness: 差別化できる独自性
 
必ずJSON形式で返してください。
"""
 
def score_wallpaper_content(content_metadata: dict) -> dict:
    """
    壁紙コンテンツのキュレーションスコアを取得する
    
    Args:
        content_metadata: 画像のメタデータ辞書
            {
                "filename": "sunrise_mist_001.jpg",
                "colors": "ソフトオレンジ、薄いグレー、白",
                "motif": "朝霧の中の湖面",
                "mood_memo": "穏やか、少し物悲しい",
                "season": "秋",
                "composition": "水平線が中央、余白多め"
            }
    
    Returns:
        スコアと選定理由を含む辞書
    """
    prompt = f"""
以下の壁紙コンテンツを評価してください。
 
ファイル名: {content_metadata.get('filename', '不明')}
色調: {content_metadata.get('colors', '不明')}
モチーフ: {content_metadata.get('motif', '不明')}
雰囲気メモ: {content_metadata.get('mood_memo', '不明')}
季節: {content_metadata.get('season', '不明')}
構図: {content_metadata.get('composition', '不明')}
 
以下のJSON形式で返してください:
{{
  "scores": {{
    "concept_fit": <0-10>,
    "calm_factor": <0-10>,
    "uniqueness": <0-10>
  }},
  "total": <合計0-30>,
  "recommendation": "add" | "review" | "skip",
  "reason": "<選定理由を日本語で1〜2文>"
}}
"""
    
    try:
        message = client.messages.create(
            model="claude-haiku-4-5-20251001",  # コスト効率のため Haiku を使用
            max_tokens=300,
            system=CURATION_SYSTEM_PROMPT,
            messages=[{"role": "user", "content": prompt}]
        )
        
        response_text = message.content[0].text.strip()
        
        # JSON抽出(前後に余分なテキストがある場合の対処)
        start = response_text.find('{')
        end = response_text.rfind('}') + 1
        if start >= 0 and end > start:
            result = json.loads(response_text[start:end])
            result['filename'] = content_metadata.get('filename')
            return result
        else:
            raise ValueError(f"JSONが見つかりません: {response_text}")
            
    except json.JSONDecodeError as e:
        # JSONパースエラー時はスキップ推奨として返す
        return {
            "filename": content_metadata.get('filename'),
            "scores": {"concept_fit": 0, "calm_factor": 0, "uniqueness": 0},
            "total": 0,
            "recommendation": "review",
            "reason": f"評価エラー: {str(e)}"
        }
 
# 使用例
if __name__ == "__main__":
    sample = {
        "filename": "autumn_lake_morning.jpg",
        "colors": "テラコッタ、薄いグレー、霧のような白",
        "motif": "秋の朝霧に包まれた静かな湖",
        "mood_memo": "懐かしさと静けさが混在する",
        "season": "秋",
        "composition": "湖面が画面の60%を占め、空との境界がぼやけている"
    }
    
    result = score_wallpaper_content(sample)
    print(json.dumps(result, ensure_ascii=False, indent=2))
    
    # 期待する出力例:
    # {
    #   "scores": { "concept_fit": 9, "calm_factor": 8, "uniqueness": 7 },
    #   "total": 24,
    #   "recommendation": "add",
    #   "reason": "アプリのコンセプトに高い適合度。霧のテクスチャが独自性を持つ。",
    #   "filename": "autumn_lake_morning.jpg"
    # }

このスコアリングをバッチで実行すると、100枚の画像評価が10〜15分で終わります。以前は1枚ずつ自分で判断していたので、この自動化だけで週に数時間が返ってきました。

実装で注意したこと: Haikuモデルを使っているのは、このタスクではSonnetほどの能力が必要なく、コストを10分の1以下に抑えられるからです。キュレーション判断は最終的に人間が確認するので、スコアの参考値として使う分には十分です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
1画像あたりの実測トークン数と月次コストの内訳(Haiku/Sonnet 使い分け前提の現実的な数字)
1,000枚規模のバッチ処理を途中で落とさないための指数バックオフ付き完全実装
JSON 破損・レート制限・多言語品質ばらつきを本番で吸収する運用設計のチェックリスト
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-06-01
Crashlyticsのクラッシュを根本原因ごとに束ねる — Claude APIで作るトリアージの設計メモ
Crashlyticsの「Issue」は同じ原因を別物として散らしてしまうことがあります。累計5,000万DLのアプリ運用で溜まったクラッシュを、Claude APIで根本原因ごとに束ね直して優先順位をつける設計を、動くコードと実測値とともに共有します。
API & SDK2026-05-12
App Storeのレビュー1,000件をClaude APIで分析したら、自分のアプリの本当の問題が見えてきた
個人開発10年超・累計5,000万DLの経験から語る。App StoreレビューをClaude APIでバッチ分析し、次の改善優先順位を自動生成する実装パターンと、試して気づいた落とし穴を共有します。
API & SDK2026-07-14
ユーザーに届くAI生成の短文を、公開前に二段ゲートで止める
アプリでユーザーに配信するAI生成の短文に、決定的ルール層とClaude分類層の二段公開ゲートを組む設計です。fail-closed・生成時検疫・コスト設計まで、実装コード付きで整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →