diff --git a/docs/FLUX_9B_BETA.md b/docs/FLUX_9B_BETA.md index 5973fca..2f91e5f 100644 --- a/docs/FLUX_9B_BETA.md +++ b/docs/FLUX_9B_BETA.md @@ -94,6 +94,12 @@ curl -fsS http://192.168.1.212:8081/v1/images/generations \ }' ``` +Ohne `response_format` enthält die Antwort sowohl die abrufbare `url` als +auch `b64_json`. Das hält URL-basierte Clients kompatibel und unterstützt +OpenClaw, dessen OpenAI-Bildprovider Inline-Bilddaten erwartet. Mit explizitem +`response_format: "url"` oder `"b64_json"` liefert der Router weiterhin nur +das angeforderte Format. + Danach müssen folgende Zustände wiederhergestellt sein: ```bash @@ -126,6 +132,14 @@ erhalten. Er gehört nicht in die Desktop-App und muss auf weiteren Clients nicht erneut installiert werden. Die versionierte Quellfassung liegt unter [`integrations/hermes-athena-image`](../integrations/hermes-athena-image). +## OpenClaw + +OpenClaw verwendet den offiziellen `image_generate`-Provider mit +`openai/FLUX.2-klein-9B-fp8-beta`. Der OpenAI-kompatible Bildparser von +OpenClaw sendet kein `response_format`, benötigt in der Antwort aber +`data[].b64_json`. Deshalb liefert der Router im Standardfall zusätzlich zur +URL auch die Inline-Bilddaten. Hermes bleibt davon unberührt. + ## Rollback Die lokalen 4B-Gewichte und die kurzfristigen Rückfall-Images wurden am diff --git a/router/ai_profile_router.py b/router/ai_profile_router.py index 60a7ee8..e6ec128 100755 --- a/router/ai_profile_router.py +++ b/router/ai_profile_router.py @@ -2355,6 +2355,7 @@ class Handler(BaseHTTPRequestHandler): "invalid_request_error", "invalid_seed") return + response_format_explicit = "response_format" in data response_format = data.get("response_format", "url") if response_format not in ("url", "b64_json"): self._send_error(400, "'response_format' muss 'url' oder 'b64_json' sein", @@ -2379,9 +2380,13 @@ class Handler(BaseHTTPRequestHandler): for filename in results: path = os.path.join(IMAGE_DIR, filename) item: dict = {"url": f"{host}/images/{filename}", "b64_json": None} - if response_format == "b64_json": + # OpenClaw's OpenAI-compatible image parser requires b64_json but + # does not send response_format. Keep the URL for existing clients + # and add inline image data only when the format was omitted. + if response_format == "b64_json" or not response_format_explicit: with open(path, "rb") as f: item["b64_json"] = base64.b64encode(f.read()).decode() + if response_format == "b64_json": item["url"] = None items.append(item) payload: dict = {"created": int(time.time()), "data": items}