◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-04-20中級

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

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

Claude API128個人開発130アプリ開発8壁紙アプリ3多言語コンテンツキュレーション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-09-17
画像は20枚ずつ送っています — 21枚目から全画像に別の上限がかかると知った日
素材フォルダの62枚を一度に送ったら invalid_request_error で落ちました。容量ではなく枚数が原因です。視覚トークンを28pxのパッチで数え直し、枚数・寸法・ペイロードの3つの上限を同時に見てバッチを組むまでの記録です。
⬡ API & SDK2026-09-06
訳文は自然なのに、実行時に落ちる翻訳がありました
多言語アプリの文言を Claude API で訳したとき、意味は正しいのに書式指定子だけが壊れることがあります。重大度で分けた受け入れ検査と、壊れた行だけを訳し直す修復ループを実装と実測でまとめました。
⬡ API & SDK2026-05-15
壁紙アプリの一括カテゴリ分類を Claude Vision API で自動化した話 — 実運用で見えた精度と限界
個人開発の壁紙アプリで画像のカテゴリ分類をClaude Vision APIに任せた実体験の記録です。SonnetとHaikuのモデル選択、75枚の手動検証で確かめた分類精度、実運用で踏んだ落とし穴、途中で落ちても再開できるバッチ設計、そして実際にかかったコストの感覚まで正直に書きました。