happycode-imagegen について
HappyCode Image Gen は、HappyCode クライアントを実行して画像の生成や編集を行うスキルです。単一画像と一括処理のフローがあり、認証、ダウンロード、ファイル出力はクライアントに任せます。
主な機能
- 01プロンプトから画像を生成
- 02入力画像を使った編集
- 032~5 枚の画像を一括生成
- 04参照画像とマスクをクライアントに渡す
- 05認証とファイル処理をクライアントに委任
活用シーン
- 01テキストの依頼から画像を作成
- 02生成済み画像を修正
- 03プロンプトから複数画像を作成
- 04指定されたマスクを使って画像を編集
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gorden888/ happycode-imagegen --skill happycode-imagegenインストール後、Claude Code で/happycode-imagegenを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.md.gitignoreconfig.example.jsonagents/openai.yamlscripts/imagegen-batch.mjsimagegen-batch.pyimagegen.pyimagegen.mjs詳細
HappyCode Image Gen
<SKILL_DIR>/scripts 内の HappyCode クライアントのみを使用してください。組み込みの image_gen ツールや別のプロバイダーは呼び出さないでください。このファイルを読んだら、クライアントを直接実行してください。他のスキルファイルを調べたり、config.json を読んだり、テストを実行したり、API を調査したり、クライアントから CONFIG_REQUIRED が返されない限りセットアップを行ったりしないでください。クライアントが認証、リクエストのデフォルト設定、プロキシ、タイムアウト、ダウンロード、PNG の検証、出力の作成を処理します。
判断とプロンプト
- 入力画像のないリクエストは生成として扱います。既存画像の変更を求めるリクエストは編集として扱い、対象がない場合にのみ対象を尋ねます。
- 提供された各画像を、編集対象、参照画像、マスク、または補助入力として識別します。マスク以外の関連画像はすべて、
--imageを繰り返して渡してください。--maskは提供されたマスクにのみ使用してください。 - 詳細の不足により実行できない場合に限り、追加の質問をしてください。
- 以下のバッチ変換を除き、ユーザーのリクエストをそのまま
--prompt引数として渡してください。翻訳、言い換え、拡張、検閲をしたり、スタイル、内容、ネガティブ、保持に関する指示を追加したりしないでください。入力の選択時に限り、代名詞の指す対象を特定してください。 - 動的な引数はすべてシェルでクォートし、クライアントがプロンプトとパスを引数値として正確に受け取れるようにしてください。
編集入力の追跡
- 成功した各
SAVEDパスについて、その入力対象を内部で記憶してください。テキストのみの生成には入力がありません。この記録は表示も保存もしないでください。 - 通常のフォローアップでは、直近の成功結果を編集してください。
- ユーザーが直近の結果を却下した場合は、却下された画像ではなく、記憶している入力対象に修正を適用してください。入力対象がなかった場合は、
--imageを付けずに再生成してください。その他の明示的な要件はすべて保持してください。 - バッチでは、保存した各パスを対応する
BATCH_RESULTのインデックスに関連付けてください。「2枚目の画像」などの序数による指定は、そのインデックスで解決してください。複数の結果のうちどれかが明確でない場合に限り、対象の画像を尋ねてください。
バッチ生成
- 数量は、要求された画像を明示的に修飾している場合にのみ出力数として解釈してください。1枚の画像内の被写体数はバッチではありません。
- 新しい画像が2~5枚の場合、画像ごとにプロンプトを1つ作成し、バッチクライアントを1つ使用してください。出力数を示す表現だけを1枚の画像を示す表現に置き換え、その他のテキストはすべてそのまま保持してください。
- 異なる属性値を求められている場合、各プロンプトが単独で成立するようであれば、該当する「不同」のみを「随机」に置き換えてください。そうでなければ、その表現を維持してください。
- 出力数が5枚を超える場合、クライアントを起動せず、数を減らすようユーザーに依頼してください。「複数」や「いくつか」など数が明確でない場合は、枚数を尋ねてください。
実行
まず Node を使用してください。
node "<SKILL_DIR>/scripts/imagegen.mjs" --prompt "<request>"
node "<SKILL_DIR>/scripts/imagegen.mjs" --image "<target>" --prompt "<edit>"
node "<SKILL_DIR>/scripts/imagegen-batch.mjs" --prompt "<derived prompt 1>" --prompt "<derived prompt 2>"
フォールバックが許可されている場合は、利用可能な Python 3 ランチャー(python3、python、または py -3)と対応するクライアントを使用してください。
python "<SKILL_DIR>/scripts/imagegen.py" --prompt "<same request>"
python "<SKILL_DIR>/scripts/imagegen-batch.py" --prompt "<derived prompt 1>" --prompt "<derived prompt 2>"
ユーザーが別の保存先を指定した場合にのみ --out を追加してください。それ以外の場合、画像を扱える環境ではデフォルトの <working-directory>/output を使用してください。その他の環境では、まず保存先を尋ねてください。要求されていないバリエーションは作成しないでください。
クライアントのネットワークタイムアウトは600秒です。この操作ではクライアントのプロセスを1つだけ起動してください。バッチクライアントが並行する子プロセスを管理し、終了シグナルを子プロセスに転送します。プロセスの実行中は、決して再起動したり、出力ファイルを調べたり、別のコマンドを起動したりしないでください。
functions.exec を使用する場合は、クライアントの呼び出しとすべての処理継続を1回の functions.exec 呼び出し内で行ってください。JavaScript 入力の先頭には次の正確な1行を置き、以下の制御フローを使用してください。cmd のみを、シングルまたはバッチのコマンド全体をシェルでクォートしたものに置き換えてください。
// @exec: {"yield_time_ms": 660000, "max_output_tokens": 20000}
const first = await tools.exec_command({
cmd: '<shell-quoted client command>',
yield_time_ms: 30000,
max_output_tokens: 20000,
});
let result = first;
let output = first.output || "";
let sessionId = first.session_id;
while (sessionId != null) {
const next = await tools.write_stdin({
session_id: sessionId,
chars: "",
yield_time_ms: 300000,
max_output_tokens: 20000,
});
result = next;
output += next.output || "";
sessionId = next.session_id;
}
text(JSON.stringify({ exit_code: result.exit_code, output }));
sessionId が null でない間は、functions.exec を終了させないでください。また、write_stdin を後続のモデルターンに移さないでください。外側の Script running with cell ID は終端状態ではありません。別のモデル駆動によるクライアント起動やセッション継続を開始せず、同じ functions.exec セルを継続してください。
クライアントプロトコル
| 結果 | 必要な対応 |
|---|---|
ERROR: CONFIG_REQUIRED: <path> と CONFIG_EDIT_COMMAND: | 以下の「設定」に従ってください。ユーザーが設定を確認するまで再試行しないでください。 |
RUNTIME_UNAVAILABLE: | API リクエストは開始されていません。対応する Python の単一またはバッチクライアントを正確に 1 回実行してください。このマーカーは表示しないでください。 |
SAVED: <absolute-path> | パスを内部的な技術上の完了状態および編集履歴の状態として扱ってください。このマーカーをそのまま返さないでください。 |
BATCH_RESULT: <json> | 1 始まりの index で結果を記録してください。status に応じて saved、config_path、config_edit_command を使用してください。プロトコル行は公開しないでください。 |
BATCH_SUMMARY: <json> | プロセス終了後のバッチ結果として扱ってください。config_required の場合は「設定」に従い、runtime_unavailable の場合は Python を 1 回使用してください。partial の場合は保存済みパスをインデックス順に並べ、failed_items を簡潔に報告し、自動的に再試行しないでください。 |
明示的な ERROR: または RUNTIME_UNAVAILABLE: 以外のゼロ以外の終了コード | 操作は失敗したか、完了したか不明であると扱ってください。フォールバックや自動再試行はしないでください。 |
SAVED: がない状態での終了コード 0 | クライアントプロトコルの失敗として扱い、自動再試行はしないでください。 |
アクティブな session_id、空または途中で切れた出力、終了ステータスなし | 終了していないものとして扱い、同じプロセスで待ち続けてください。完了やタイムアウトを報告しないでください。 |
シェルで node を起動できない場合は、API リクエストが開始されていないため、対応する Python クライアントを使用してください。出力ディレクトリから結果を検索したり、プロバイダーを切り替えたりしないでください。
設定
- 報告された設定パスが存在するかどうかだけを確認してください。存在しない場合は、
<SKILL_DIR>/config.example.jsonを変更せずにコピーしてください。存在する場合は上書きしないでください。 - ユーザーに
api_keyをローカルで設定するよう伝えてください。通常はbase_urlとmodelを変更せず、proxyには URL または""を設定してください。 - Codex デスクトップでは、設定ファイルへの絶対パスをクリック可能なリンクとして提示してください。ターミナルのみで応答する場合は、絶対パスと正確な
CONFIG_EDIT_COMMAND:の値を 1 つのコードフェンス内に記載してください。 - 確認を待ってから、元の操作を正確に 1 回再試行してください。
既存の設定値を読み取ったり、表示したり、変更したりしないでください。また、ユーザーに会話へ API キーを貼り付けるよう求めないでください。
完了
SAVEDが証明するのはファイルが保存されたことだけです。ユーザーがレビューを依頼した場合、タスクで視覚的な検証が必要な場合、または次の編集で視覚的な理解が必要な場合に限り、ファイルを確認してください。- 確認した結果は、依頼された内容とのみ比較してください。要件を満たしていない点があれば、再試行せずに報告してください。ユーザーが依頼した場合に限り、対象を絞って修正してください。
- 画像に対応した画面では、保存済みのバッチ画像を
BATCH_RESULTのインデックス順に返してください。それ以外では、ユーザーがパス、説明、レビューを依頼した場合、またはバッチの一部が失敗した場合を除き、保存済み画像のみを簡潔な代替テキストとともにインラインで返してください。その他の画面では、依頼された保存先パスを簡潔に報告してください。