mcpField
D
dev-avatar-service

dev-avatar-service

github.com/picsart開発6312 回インストール2 日前に更新
リポジトリ

dev-avatar-service について

dev-avatar-serviceは、固定シードとフォールバック順序を使うブランドアバターのエンドポイント構築スキルです。生成、キャッシュ、イニシャル入りSVGへのフォールバック、既存ユーザー向けの一括準備を扱います。

主な機能

  1. 01シードに基づく一貫したアバター
  2. 02写真と生成アバターのフォールバック
  3. 03シード単位のURLキャッシュ
  4. 04イニシャル入りSVGへのフォールバック
  5. 05キャッシュの一括事前生成

活用シーン

  1. 01サインアップ時のアバター提供
  2. 02フォーラムやディレクトリの画像補完
  3. 03オンボーディング中のプレースホルダー表示
  4. 04ステージングデモ用アバターの準備

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/picsart/gen-ai-skills --skill dev-avatar-service

インストール後、Claude Code で/dev-avatar-serviceを入力して読み込まれたか確認します。

詳細

アバターサービス

あらゆるユーザー向けに、ブランドイメージに合ったアバター(フォトリアル、イラスト、ピクセルアート)を返すサービスエンドポイントです。シード(ユーザー ID/メールアドレスのハッシュ/イニシャル)から結果が決まります。フォールバックの優先順位(実際の写真 → アップロード画像 → イニシャルから AI 生成 → 静的なデフォルト画像)を軸に構築され、シードごとにキャッシュするため、ユーザーごとの費用は一度だけです。

使用する場面

  • すぐにプロフィール画像が必要な新規ユーザー登録。
  • デフォルトでグラバターを使用するコメントシステムやフォーラム。
  • アップロードされた写真がないチームページ、ディレクトリ、リーダーボード。
  • ユーザーがアバターを選ぶ前のオンボーディング中に表示するプレースホルダーアバター。
  • Gravatar/UI Avatars/DiceBear の代わりとなる、ブランドに合ったアバター。
  • ステージング/デモ環境用のモックデータ。

対象外:1 枚の写真から実在の人物のディープフェイクを作成すること(ツールも倫理も不適切です)、またはすでに素晴らしいアップロード済み写真をスタイライズすること(ユーザーが自分の写真をそのまま使えるようにしてください)。

前提条件

構築を始める前に、以下の 5 つの質問を 1 回のメッセージで確認してください。

  1. シードのソース:ユーザー ID、メールアドレスのハッシュ、ユーザー名、イニシャルのどれですか?永久に変わらない値ですか?
  2. スタイル:フォトリアルなポートレート、イラスト(Pixar/Disney 風)、フラットベクター、ピクセルアート、クレイモーフィズム、モノグラムのどれですか?
  3. ブランドパレット:背景とモノグラムのフォールバックに使うアクセントカラーは何ですか?
  4. ストレージとキャッシュ:S3/CDN と DB カラム、Picsart Drive URL、KV キーのどれですか?TTL はどうしますか?
  5. フォールバックの順序:写真 → AI アバター → 色付き背景にイニシャル → デフォルト SVG のどれにしますか?順序が重要です。

ユーザーが詳細なブリーフを渡してくれた場合は、省略してください。

実行方法

  1. **まずフォールバックの優先順位を決めます。**サービス全体の要となる部分です。

    1. user.photo_url          → return as-is
    2. cache.get(seed)         → return stored AI avatar URL
    3. gen-ai generate         → store URL + return
    4. initials on brand color → SVG fallback (no credits)
    5. static /default.png     → last resort
    
  2. モデルを見積もり、検証します。

    gen-ai models info recraftv4
    gen-ai pricing recraftv4
    gen-ai generate -m recraftv4 -p "illustrated avatar, seed abc123" \
      --aspect-ratio 1:1 --dry-run --debug
    
  3. **決定的なシード → プロンプト。**シードをハッシュ化して、固定の属性を選びます。Math.random() やタイムスタンプは絶対に埋め込まないでください。

    SEED="u_482c91"
    # Pick palette + mood from the seed, not from RNG
    HUE=$(printf "%s" "$SEED" | shasum | cut -c1-2)   # 0-255 from hash
    gen-ai generate -m recraftv4 \
      -p "illustrated profile avatar, round frame, abstract humanoid silhouette, HSL hue ${HUE}, friendly neutral expression, flat vector, centered composition, studio background" \
      --aspect-ratio 1:1 \
      --negative-prompt "text, watermark, letters, realistic face, specific person" \
      --save-to-drive --drive-folder avatars \
      --json --no-input | jq -r '.url'
    
  4. シードをキーにして、バイナリではなく URL をキャッシュします。保存先には、Redis、KV、Postgres カラム、または固定ファイル名を使う S3 を利用できます。

  5. **イニシャルへのフォールバック(クレジット不要)。**生成 AI が停止中、レート制限中、または予算超過の場合は、同じシードから導出した色相を背景にユーザーのイニシャルを配置した SVG を返します。ユーザーに壊れた画像を見せることはありません。

    const initials = name.split(' ').map(p => p[0]).slice(0, 2).join('').toUpperCase();
    const hue = parseInt(sha1(seed).slice(0, 2), 16);
    const svg = `<svg viewBox="0 0 64 64"><rect width="64" height="64" fill="hsl(${hue} 70% 45%)"/><text x="32" y="40" text-anchor="middle" font-size="28" fill="#fff" font-family="system-ui">${initials}</text></svg>`;
    
  6. エンドポイントを接続します。/avatar/:seed → 写真を確認 → キャッシュを確認 → 生成 AI → イニシャル。成功時は CDN URL に 302 リダイレクトし、フォールバック時はインライン SVG を返します。

  7. **既存ユーザー分のキャッシュをバッチで事前にウォームアップします。**これにより、本番環境へのリリース時に生成 AI へ大量のリクエストが集中するのを防げます。

    gen-ai batch run avatars-backfill.json -c 4 -o ./avatars-out
    

クイックリファレンス

既存ユーザー 500 人分をバックフィルします。

{
  "defaults": {
    "model": "recraftv4",
    "aspectRatio": "1:1",
    "negativePrompt": "text, watermark, letters, realistic face, specific person"
  },
  "jobs": [
    { "id": "u_482c91", "prompt": "illustrated profile avatar, round frame, flat vector, hue 42, friendly neutral, studio background" },
    { "id": "u_91ac3b", "prompt": "illustrated profile avatar, round frame, flat vector, hue 128, calm expression, studio background" },
    { "id": "u_7de119", "prompt": "illustrated profile avatar, round frame, flat vector, hue 201, warm smile, studio background" }
  ]
}

出力は ./avatars-out/<user-id>.webp に保存されます。同じキーで CDN にアップロードしてください。results.json はシード → URL のルックアップテーブルになります。

クイックリファレンス

サブタスクモデル理由
イラスト/ベクター/フラットなアバターrecraftv4きれいで一貫性があり、低コスト。デフォルトに最適です
フォトリアルなポートレート(合成、一般的な人物)flux-2-pro顔の品質が最高です。一般的な特徴の記述だけで使用してください
ピクセルアートのアバターピクセルスタイルのプロンプトを使った recraftv4クレジット消費が最も少なく、スタイルを制御できます
アップロードされた実際の写真のスタイライズ(オプトイン)flux-kontext-pro + -i photo.jpg編集モデルは本人の特徴を維持します
低コストのドラフト/スタイルの検討gemini-3.1-flash-image呼び出しごとのコストが最も低くなります
サイズ違いでも本人の特徴を固定したバリエーションideogram-character + -i master.png複数のアバターで同じ顔を維持します

gen-ai models --mode image で、利用可能な最新の ID を確認してください。

手順

  • 決定性=キャッシュ可能性です。 すべての可変属性(色相、ポーズ、表情)をシードのハッシュから導出します。同じシード → 同じプロンプト → 同じ画像 → クレジット消費は一度だけです。
  • プロンプトテンプレートにバージョンを付けます。 スタイルを変更したら、キャッシュキーの V=2 を更新します。古いアバターは順次失効し、新しいアバターは要求に応じて再生成されます。
  • フォールバックは必須です。 イニシャルを色相付きで表示する SVG は、常に動作する必要があります。gen-ai が 429 を返したからといって、UI で壊れたアバターを表示してはいけません。
  • ネガティブプロンプトは重要です。 常に text, watermark, letters, realistic face of specific person を除外します。アバターが実在の有名人に似たり、意図せず文字を描画したりしないようにします。
  • ページを読み込むたびに生成しないでください。 シードごとに一度生成し、キャッシュを永続的に保持します(テンプレートのバージョンを上げる場合を除きます)。登録が急増しても、gen-ai の呼び出しが急増しないようにします。
  • 保存には Drive を使用します。 --save-to-drive --drive-folder avatars を指定すると、追加のインフラなしで安定した CDN URL を利用できます。
  • ローンチ前にウォームアップします。 既存ユーザー分を一括生成します。キャッシュが空の状態で、稼働中のトラフィックを移行しないでください。
  • ユーザーのアップロードを尊重します。 ユーザーが実際の写真をアップロードしている場合は、それを返し、決して上書きしないでください。AI アバターは写真がない場合にのみ使用します。
  • エッジでレート制限します。 IP ごとの gen-ai 呼び出しを 1 時間あたりで制限します。/avatar/:random を試すボットが、数分でクレジット予算を使い切る可能性があります。

注意点

注意点対処方法
更新するたびにアバターが異なるプロンプトが非決定的です。シードをハッシュ化し、属性を導出して、乱数やタイムスタンプを使わないでください
スタイル変更後もキャッシュが無効にならないプロンプトテンプレートにバージョンを付けます(キャッシュキーで V=3 を指定)
AI が有名人に似たリアルな顔を生成するnegativePrompt: "realistic face of specific person, celebrity, known individual" を追加します
アバターにテキストやウォーターマークが表示されるnegativePrompt: "text, watermark, letters, logos" を追加します
ボットのトラフィックがクレジット予算を使い切るIP ごとにレート制限します。認証済みユーザーのみがジェネレーターを利用できるようにし、匿名ユーザーにはイニシャルを表示するフォールバックを使用します
Gen-ai の 429 によってアバター UI が壊れるSVG のイニシャル表示によるフォールバックを、処理チェーンの最後の手順にします
一括バックフィルが一部失敗するgen-ai batch resume <out> を実行すると、失敗分のみ再試行します
アプリ内でアバターのスタイルが統一されないプロンプトテンプレートをコミットし、呼び出し元から生のプロンプトを渡せないようにします

検証

gen-ai whoami を実行して認証を確認し、その後、失敗したコマンドを --debug を付けて再実行します。

コストと時間

タスククレジット時間
アバター 1 枚(Recraft V4、イラスト)1-2約 4-8 秒
アバター 1 枚(Flux 2 Pro、フォトリアル)3-5約 10-15 秒
アバター 1 枚(Gemini 3.1 Flash、下書き)1約 3-5 秒
イニシャルの SVG フォールバック0<1ms
キャッシュ読み取り(KV/Redis ヒット)0約 2-5ms
同時実行数 4 で 500 件を一括処理約 750-1000約 15-20 分

通常の状態では、キャッシュヒット率が 99% を超え、継続的なコストはほぼゼロになる見込みです。

関連項目

  • gen-ai-use.md — CLI リファレンス、認証、--json --no-input / jq を使用したスクリプト作成
  • gen-ai-batch.md — マニフェストの形式、一括処理の再開、レート制限戦略、Cloudflare Worker のパターン
  • gen-ai-workflows.md — アップロードされた写真のスタイル変更については Workflow 6(ヘッドショットスタジオ)を参照
  • dev-og-image-service — OG カード向けの同じキャッシュおよび決定性のパターン

コメント