Output: {"name": "rabbit_meadow_keyframe_crop_416x736.png", "subfolder": "", "type": "input"}


terminal

python - <<'PY'
import json
from pathlib import Path
p=Path('data/comfyui_native_wan22_rabbit_i2v_5s_workflow.json')
w=json.loads(p.read_text())
w['6']['inputs']['image']='rabbit_meadow_keyframe_crop_416x736.png'
w['12']['inputs']['filename_prefix']='autoshorts_native_wan22_rabbit_i2v_crop_5s'
w['9']['inputs']['seed']=2305202603
out=Path('data/comfyui_native_wan22_rabbit_i2v_crop_5s_workflow.json')
out.write_text(json.dumps(w, indent=2))
print(out)
PY


Output: data/comfyui_native_wan22_rabbit_i2v_crop_5s_workflow.json


python - <<'PY'
import json, urllib.request
base='http://100.101.173.25:8188'
try:
    req=urllib.request.Request(base+'/free', data=json.dumps({'unload_models': False, 'free_memory': True}).encode(), headers={'Content-Type':'application/json'})
    urllib.request.urlopen(req, timeout=20).read()
except Exception as e: print('free warning', type(e).__name__, e)
workflow=json.load(open('data/comfyui_native_wan22_rabbit_i2v_crop_5s_workflow.json'))
payload=json.dumps({'prompt': workflow, 'client_id': 'hermes-native-wan22-rabbit-i2v-crop-5s'}).encode()
req=urllib.request.Request(base+'/prompt', data=payload, headers={'Content-Type':'application/json'})
print(urllib.request.urlopen(req, timeout=30).read().decode())
PY


Output: {"prompt_id": "7fbcb6b5-8526-44f8-a127-e4b6b6f0cc0b", "number": 2, "node_errors": {}}


python - <<'PY'
import json, time, urllib.request
base='http://100.101.173.25:8188'
pid='7fbcb6b5-8526-44f8-a127-e4b6b6f0cc0b'
for i in range(220):
    q=json.load(urllib.request.urlopen(base+'/queue', timeout=10))
    s=json.load(urllib.request.urlopen(base+'/system_stats', timeout=10))
    running=len(q.get('queue_running', [])); pending=len(q.get('queue_pending', []))
    d=s['devices'][0]
    vused=(d['vram_total']-d['vram_free'])/1024**3
    print(f'poll {i:03d}: running={running} pending={pending} vram_used_gb={vused:.2f} ram_free_gb={s["system"]["ram_free"]/1024**3:.2f}', flush=True)
    if not running and not pending:
        break
    time.sleep(10)
h=json.load(urllib.request.urlopen(base+'/history/'+pid, timeout=20))
print('STATUS')
print(json.dumps(h.get(pid, {}).get('status',{}), indent=2)[:5000])
print('OUTPUTS')
print(json.dumps(h.get(pid, {}).get('outputs',{}), indent=2))
PY


Output:
poll 000: running=1 pending=0 vram_used_gb=13.09 ram_free_gb=14.59
poll 001: running=1 pending=0 vram_used_gb=13.76 ram_free_gb=14.43
poll 002: running=1 pending=0 vram_used_gb=13.76 ram_free_gb=14.45
poll 003: running=1 pending=0 vram_used_gb=13.98 ram_free_gb=14.45
poll 004: running=1 pending=0 vram_used_gb=14.02 ram_free_gb=14.46
poll 005: running=1 pending=0 vram_used_gb=14.08 ram_free_gb=14.49
poll 006: running=1 pending=0 vram_used_gb=14.07 ram_free_gb=14.52
poll 007: running=1 pending=0 vram_used_gb=13.94 ram_free_gb=14.56
poll 008: running=1 pending=0 vram_used_gb=13.73 ram_free_gb=14.48
poll 009: running=1 pending=0 vram_used_gb=13.73 ram_free_gb=14.49
poll 010: running=1 pending=0 vram_used_gb=13.73 ram_free_gb=14.51
poll 011: running=1 pending=0 vram_used_gb=13.73 ram_free_gb=14.50
poll 012: running=1 pending=0 vram_used_gb=13.73 ram_free_gb=14.47
poll 013: running=1 pending=0 vram_used_gb=13.73 ram_free_gb=14.60
poll 014: running=1 pending=0 vram_used_gb=13.69 ram_free_gb=14.64
poll 015: running=1 pending=0 vram_used_gb=13.51 ram_free_gb=14.62
poll 016: running=1 pending=0 vram_used_gb=11.85 ram_free_gb=14.60
poll 017: running=1 pending=0 vram_used_gb=11.01 ram_free_gb=14.62
poll 018: running=1 pending=0 vram_used_gb=9.80 ram_free_gb=14.58
poll 019: running=0 pending=0 vram_used_gb=9.59 ram_free_gb=14.45
STATUS
{
  "status_str": "success",
  "completed": true,
  "messages": [
    [
      "execution_start",
      {
        "prompt_id": "7fbcb6b5-8526-44f8-a127-e4b6b6f0cc0b",
        "timestamp": 1779560038761
      }
    ],
    [
      "execution_cached",
      {
        "nodes": [],
        "prompt_id": "7fbcb6b5-8526-44f8-a127-e4b6b6f0cc0b",
        "timestamp": 1779560038763
      }
    ],
    [
      "execution_success",
      {
        "prompt_id": "7fbcb6b5-8526-44f8-a127-e4b6b6f0cc0b",
        "timestamp": 1779560237518
      }
    ]
  ]
}
OUTPUTS
{
  "12": {
    "images": [
      {
        "filename": "autoshorts_native_wan22_rabbit_i2v_crop_5s_00001_.mp4",
        "subfolder": "",
        "type": "output"
      }
    ],
    "animated": [
      true
    ]
  }
}


python - <<'PY'
import urllib.parse, urllib.request, pathlib
base='http://100.101.173.25:8188'
fn='autoshorts_native_wan22_rabbit_i2v_crop_5s_00001_.mp4'
params=urllib.parse.urlencode({'filename':fn,'subfolder':'','type':'output'})
out=pathlib.Path('/home/agent/jarvis_runtime/AutoShortsBot/data/comfyui_outputs/'+fn)
out.parent.mkdir(parents=True, exist_ok=True)
out.write_bytes(urllib.request.urlopen(base+'/view?'+params, timeout=180).read())
print(out, out.stat().st_size)
PY
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,avg_frame_rate,duration -of default=nw=1:nk=1 data/comfyui_outputs/autoshorts_native_wan22_rabbit_i2v_crop_5s_00001_.mp4
ffmpeg -y -i data/comfyui_outputs/autoshorts_native_wan22_rabbit_i2v_crop_5s_00001_.mp4 -vf "select=eq(n\,24)" -frames:v 1 /tmp/autoshorts_comfy_check/rabbit_i2v_crop_mid.jpg >/dev/null 2>&1 && ls -lh /tmp/autoshorts_comfy_check/rabbit_i2v_crop_mid.jpg


Output:
/home/agent/jarvis_runtime/AutoShortsBot/data/comfyui_outputs/autoshorts_native_wan22_rabbit_i2v_crop_5s_00001_.mp4 551187
416
736
10/1
4.900000
-rw-rw-r-- 1 agent agent 27K Mai 23 20:17 /tmp/autoshorts_comfy_check/rabbit_i2v_crop_mid.jpg


Question: Beurteile knapp den zweiten I2V-Test: photorealistischer Hase auf Wiese? Keine Box? Qualität/Probleme?


Image loaded into your context — you can see it natively now. Use your built-in vision to answer the user.

Question: Beurteile knapp den zweiten I2V-Test: photorealistischer Hase auf Wiese? Keine Box? Qualität/Probleme?


Erledigt, Sir.

Ich habe jetzt **Image-to-Video** mit dem nativen Wan2.2-Workflow getestet.

## Wichtiger Hinweis

Die eingebaute Image-Generation hier war nicht verfügbar:

```text
FAL_KEY fehlt
```

Ich konnte also **kein ChatGPT/FAL-Bild direkt selbst erzeugen**. Als Ersatz habe ich ein photorealistisches Kaninchenbild aus Wikimedia Commons genommen, als 9:16-Keyframe vorbereitet und dann per Wan2.2 I2V animiert.

Nicht ideal, aber für den technischen Test sauber genug.

---

## Test 1 — verworfen

Ich hatte zuerst ein 9:16-Keyframe mit blurred background + eingefügtem Hasenbild gebaut.

Problem:

```text
sichtbarer rechteckiger Bildkasten
```

Output existiert, aber ist nicht empfehlenswert:

```text
data/comfyui_outputs/autoshorts_native_wan22_rabbit_i2v_5s_00001_.mp4
```

Video:

MEDIA:/home/agent/jarvis_runtime/AutoShortsBot/data/comfyui_outputs/autoshorts_native_wan22_rabbit_i2v_5s_00001_.mp4

---

## Test 2 — besserer I2V-Test ohne Bildkasten

Ich habe danach ein alternatives Keyframe erstellt:

```text
rabbit_meadow_keyframe_crop_416x736.png
```

Das ist ein echter 9:16-Crop ohne sichtbaren Rahmen.

Dann I2V:

```text
Native Wan2.2 TI2V 5B FP16
T5: umt5_xxl_fp8_e4m3fn_scaled.safetensors
VAE: wan2.2_vae.safetensors
Start image: rabbit_meadow_keyframe_crop_416x736.png
Resolution: 416x736
Frames: 49
FPS: 10
Duration: 4.9s
Steps: 16
CFG: 5.0
```

Output:

```text
data/comfyui_outputs/autoshorts_native_wan22_rabbit_i2v_crop_5s_00001_.mp4
```

Video:

MEDIA:/home/agent/jarvis_runtime/AutoShortsBot/data/comfyui_outputs/autoshorts_native_wan22_rabbit_i2v_crop_5s_00001_.mp4

---

## Bewertung

Dieser zweite Clip ist deutlich besser:

- photorealistischer Hase erkennbar
- Wiese erkennbar
- kein sichtbarer Rechteck-Kasten
- native Wan2.2 I2V läuft stabil
- 4.9 Sekunden, also praktisch dein gewünschter 5s-Test

Aber:

```text
Der Hase “hüpft” noch nicht überzeugend über das Feld.
```

Er bewegt sich eher leicht / morphend im Bild. Das liegt am Startbild: Der Hase sitzt sehr frontal und ist nicht in Sprungpose. Wan hält das Startbild stark fest — gut für Identität, schlecht für große Bewegung.

---

# Erkenntnis

I2V ist technisch klar besser als T2V, aber für „Hase hüpft über Feld“ brauchen wir ein besseres Keyframe:

```text
Hase seitlich sichtbar
ganzer Körper
Sprung-/Laufpose
mehr freie Wiese vor ihm
keine frontale Sitzpose
```

Das aktuelle Bild ist niedlich, aber als Startpose für „hüpfen“ ungeeignet. Ein sitzender Hase wird nicht plötzlich elegant zum BBC-Nature-Sprinter. Leider keine Magie, nur Diffusion.

---

# Nächster sinnvoller Schritt

Für einen wirklich guten Clip:

1. In ChatGPT Pro / Bildgenerator ein Keyframe erzeugen:

```text
Photorealistic vertical 9:16 wildlife photo of a cute brown rabbit mid-hop across a sunny green meadow, full body side view, all four legs visible, ears up, natural grass, shallow depth of field, bright daylight, sharp realistic fur, lots of open meadow in front of the rabbit, no text, no watermark
```

2. Dann dieses Bild hier verwenden als:

```text
start_image
```

3. Wan2.2 I2V erneut mit Prompt:

```text
The rabbit hops forward across the meadow with small realistic jumps, ears bouncing naturally, grass moving under its feet, smooth wildlife camera tracking.
```

Kurz: **I2V funktioniert. Für überzeugendes Hüpfen brauchen wir jetzt ein gutes seitliches Mid-Hop-Keyframe statt eines sitzenden frontalen Kaninchens.**

Explanation:
**Finalizing media output**

I need to wrap up by mentioning that image generation is currently unavailable, so I've used an external Wikimedia keyframe and cropped it. The user wanted something photorealistic, which we achieved. I should probably note that I have two outputs: the first included a box (which I don’t recommend), and the second does not have one. It makes sense to deliver the second option since it's cleaner. That sounds good to me!