chore(skills): asset/tooling skills sweep — atlas/glb-gen/image-gen/audio-gen/sprite-gen/bug-report/ticket (T-1103)

Live-command corrections (atlas corridor-status, real body-ID naming), failure-proofed glb-gen/sprite-gen render scripts, Trellis API reference extracted. image-gen: fixed the output-path bug and de-forked the local image_connector.py to the canonical tooling/db/ copy. ticket skill consolidated to point at ticket-cli.md (setparent-none fix applied there too). Part of T-1099.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 12:16:49 +02:00
co-authored by Claude Fable 5
parent 32021bd550
commit 33c14531da
17 changed files with 386 additions and 442 deletions
+15 -10
View File
@@ -2,7 +2,7 @@
"""
Gemini image generator connector — direct API wrapper.
Generates images via Google's Gemini 2.0 Flash image generation API.
Generates images via Google's gemini-2.5-flash-image generation API.
API key from GEMINI_API_KEY env var or config.json.
Usage:
@@ -87,13 +87,13 @@ def generate(prompt, output=None, aspect_ratio="1:1", image_size=None,
# Add input image if provided (image-to-image)
if input_image:
if not os.path.isfile(input_image):
print(json.dumps({"ok": False, "error": f"Input image not found: {input_image}"}), indent=2)
print(json.dumps({"ok": False, "error": f"Input image not found: {input_image}"}, indent=2))
sys.exit(1)
with open(input_image, "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
# Detect mime type
ext = os.path.splitext(input_image)[1].lower()
mime = {"png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
mime = {".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg",
".webp": "image/webp"}.get(ext, "image/png")
parts.append({
"inlineData": {
@@ -102,20 +102,25 @@ def generate(prompt, output=None, aspect_ratio="1:1", image_size=None,
}
})
# Build enhanced prompt with aspect ratio and size hints
# Build enhanced prompt with a size hint. Unlike aspect ratio below, Gemini
# has no dedicated resolution parameter for this model — this is a
# best-effort prompt hint only and may not be honored.
enhanced_prompt = prompt
if aspect_ratio and aspect_ratio != "1:1":
enhanced_prompt += f" Aspect ratio: {aspect_ratio}."
if image_size:
enhanced_prompt += f" Resolution: {image_size}."
parts.append({"text": enhanced_prompt})
generation_config = {"responseModalities": ["TEXT", "IMAGE"]}
if aspect_ratio:
# Real API parameter (not a prompt hint). Valid values: 1:1, 3:2,
# 2:3, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9.
# https://ai.google.dev/gemini-api/docs/image-generation
generation_config["imageConfig"] = {"aspectRatio": aspect_ratio}
payload = json.dumps({
"contents": [{"parts": parts}],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
}
"generationConfig": generation_config
})
req = urllib.request.Request(
@@ -142,7 +147,7 @@ def generate(prompt, output=None, aspect_ratio="1:1", image_size=None,
}, indent=2))
sys.exit(1)
except Exception as e:
print(json.dumps({"ok": False, "error": str(e)}), indent=2)
print(json.dumps({"ok": False, "error": str(e)}, indent=2))
sys.exit(1)
# Extract image data from response