chore(home/pi): update codex image generation

Update to 0.1.12 for upstream image editing support and remove the local reference-image patch.

Assisted-by: pi (gpt-5.6-sol)
This commit is contained in:
Gabriel Fontes
2026-08-05 17:26:42 -03:00
parent e97f232361
commit 1b7c2e91d5
2 changed files with 2 additions and 144 deletions
@@ -1,141 +0,0 @@
--- a/extensions/index.ts
+++ b/extensions/index.ts
@@ -28,6 +28,7 @@
type SaveMode = (typeof SAVE_MODES)[number];
const OUTPUT_FORMATS = ["png", "jpeg", "webp"] as const;
+const ACTIONS = ["auto", "generate", "edit"] as const;
type OutputFormat = (typeof OUTPUT_FORMATS)[number];
// --- #1: Retry helpers with exponential backoff + jitter ---
@@ -46,6 +47,12 @@
const TOOL_PARAMS = Type.Object({
prompt: Type.String({ description: "The image prompt. Be specific about subject, composition, style, text, and constraints." }),
+ referenceImages: Type.Optional(
+ Type.Array(Type.String({ description: "Absolute or workspace-relative path to an input image." })),
+ ),
+ action: Type.Optional(
+ StringEnum(ACTIONS, { description: "Whether to automatically choose, generate, or edit an image." }),
+ ),
model: Type.Optional(
Type.String({ description: `Codex model that should invoke image generation. Defaults to ${DEFAULT_MODEL}.` }),
),
@@ -214,7 +221,25 @@
// #7: parallel_tool_calls: false
// #14: include removed (not needed without reasoning)
-function buildRequestBody(params: ToolParams, model: string, outputFormat: OutputFormat, sessionId: string) {
+function mimeForPath(path: string): string {
+ const lower = path.toLowerCase();
+ if (lower.endsWith(".jpg") || lower.endsWith(".jpeg")) return "image/jpeg";
+ if (lower.endsWith(".webp")) return "image/webp";
+ if (lower.endsWith(".gif")) return "image/gif";
+ return "image/png";
+}
+
+function buildRequestBody(params: ToolParams, model: string, outputFormat: OutputFormat, sessionId: string, cwd: string) {
+ const content: Array<Record<string, unknown>> = [{ type: "input_text", text: params.prompt }];
+ for (const imagePath of params.referenceImages || []) {
+ const resolvedPath = resolveUnderCwd(cwd, imagePath);
+ const data = readFileSync(resolvedPath).toString("base64");
+ content.push({
+ type: "input_image",
+ image_url: `data:${mimeForPath(resolvedPath)};base64,${data}`,
+ detail: "original",
+ });
+ }
return {
model,
store: false,
@@ -225,10 +250,10 @@
input: [
{
role: "user",
- content: [{ type: "input_text", text: params.prompt }],
+ content,
},
],
- tools: [{ type: "image_generation", output_format: outputFormat }],
+ tools: [{ type: "image_generation", output_format: outputFormat, action: params.action || "auto" }],
tool_choice: "auto",
parallel_tool_calls: false,
text: { verbosity: "low" },
@@ -346,9 +371,10 @@
model: string,
outputFormat: OutputFormat,
sessionId: string,
+ cwd: string,
signal?: AbortSignal,
): Promise<ParsedCodexResponse> {
- const body = JSON.stringify(buildRequestBody(params, model, outputFormat, sessionId));
+ const body = JSON.stringify(buildRequestBody(params, model, outputFormat, sessionId, cwd));
const headers: Record<string, string> = {
Authorization: `Bearer ${token}`,
"chatgpt-account-id": accountId,
@@ -393,7 +419,7 @@
name: "codex_generate_image",
label: "Codex Image",
description:
- "Generate an image with the OpenAI Codex ChatGPT backend built-in image_generation tool (gpt-image-2). Uses the existing openai-codex login; does not require OPENAI_API_KEY.",
+ "Generate or edit an image, optionally using image file references, with the OpenAI Codex ChatGPT backend built-in image_generation tool (gpt-image-2). Uses the existing openai-codex login; does not require OPENAI_API_KEY.",
promptSnippet: "Generate bitmap images via the OpenAI Codex ChatGPT backend gpt-image-2 image_generation tool.",
promptGuidelines: [
"Use codex_generate_image when the user asks to generate a raster image, illustration, photo, sprite, icon draft, banner, or other bitmap asset with OpenAI/Codex image generation.",
@@ -418,7 +444,7 @@
details: { provider: PROVIDER, model, outputFormat },
});
- const parsed = await requestImage(params, token, accountId, model, outputFormat, sessionId, signal);
+ const parsed = await requestImage(params, token, accountId, model, outputFormat, sessionId, ctx.cwd, signal);
if (!parsed.image) {
const text = parsed.text.join("").trim();
throw new Error(text ? `Codex did not return an image. Response text: ${text}` : "Codex did not return an image.");
--- a/README.md
+++ b/README.md
@@ -95,8 +95,10 @@
| Parameter | Type | Required | Description |
| -------------- | ------ | -------- | ------------------------------------------------------------------ |
-| `prompt` | string | ✅ | The image generation prompt. |
-| `model` | string | — | Override the Codex model. Defaults to config or `gpt-5.5`. |
+| `prompt` | string | ✅ | The image generation or editing prompt. |
+| `referenceImages` | string[] | — | Absolute or workspace-relative paths to input images. |
+| `action` | string | — | `auto` (default), `generate`, or `edit`. |
+| `model` | string | — | Override the Codex model. Defaults to config or `gpt-5.5`. |
| `outputFormat` | string | — | `png` (default), `jpeg`, or `webp`. |
| `save` | string | — | Override save mode for this call. |
| `saveDir` | string | — | Directory when `save=custom`. Relative paths resolve under CWD. |
--- a/skills/imagegen/SKILL.md
+++ b/skills/imagegen/SKILL.md
@@ -15,7 +15,7 @@
This skill has exactly two top-level modes:
-- **Default Pi tool mode (preferred):** Pi `codex_generate_image` tool for normal image generation, editing, and simple transparent-image requests. Does not require `OPENAI_API_KEY`.
+- **Default Pi tool mode (preferred):** Pi `codex_generate_image` tool for normal image generation, reference-image generation, filesystem-path image editing, and simple transparent-image requests. Does not require `OPENAI_API_KEY`.
- **Fallback CLI mode:** `scripts/image_gen.py` CLI. Use when the user explicitly asks for the CLI/API/model path, or after the user explicitly confirms a true model-native transparency fallback with `gpt-image-1.5`. Requires `OPENAI_API_KEY`.
Within CLI fallback, the CLI exposes three subcommands:
@@ -82,9 +82,9 @@
- If the user provides no images, treat the request as **generate**.
Pi edit semantics:
-- The current Pi `codex_generate_image` tool is for new image generation. Do not promise arbitrary filesystem-path editing through the Pi tool.
-- If the user wants to edit an existing image, use the explicit CLI fallback only when the user asks for it or confirms it.
-- If a local file needs direct file-path control, masks, or other explicit CLI-only parameters, use the explicit CLI fallback only after confirmation.
+- The Pi `codex_generate_image` tool accepts local image paths through `referenceImages`; relative paths resolve under the workspace.
+- Set `action` to `edit` for edits, `generate` for reference-guided generation, or `auto` when either behavior is acceptable.
+- If a local edit needs masks or other explicit CLI-only parameters, use the explicit CLI fallback only after confirmation.
- For edits, preserve invariants aggressively and save non-destructively by default.
Execution strategy:
@@ -104,7 +104,7 @@
- reference image
- edit target
- supporting insert/style/compositing input
-7. If the edit target is only on the local filesystem, use CLI fallback for direct edits only after the user asks for or confirms fallback mode.
+7. Pass local edit targets and reference images to Pi `codex_generate_image` through `referenceImages`, label each image's role in the prompt, and set `action` appropriately.
8. If the user asked for a photo, illustration, sprite, product image, banner, or other explicitly raster-style asset, use `codex_generate_image` rather than substituting SVG/HTML/CSS placeholders. If the request is for an icon, logo, or UI graphic that should match existing repo-native SVG/vector/code assets, prefer editing those directly instead.
9. Augment the prompt based on specificity:
- If the user's prompt is already specific and detailed, normalize it into a clear spec without adding creative requirements.
@@ -1,13 +1,12 @@
{pkgs, ...}: let
version = "0.1.10";
version = "0.1.12";
piCodexImageGen = pkgs.buildPiPackage {
pname = "pi-codex-image-gen";
inherit version;
src = builtins.fetchTarball {
url = "https://registry.npmjs.org/pi-codex-image-gen/-/pi-codex-image-gen-${version}.tgz";
sha256 = "1bvp3csw0scc5c5i2hc7glh5igiryjf2946zq28lsc6ls49inbyd";
sha256 = "1f1jzaf29zyd522r4dnmq3624hmx7ikmihc5s4n4k1jyxxrmslzf";
};
patches = [./pi-codex-image-gen-references.patch];
dontNpmInstall = true;
};
in {