aboutsummaryrefslogtreecommitdiff
path: root/devkit/fake_open_webui.py
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2026-10-17 12:52:42 +0200
committerFelix Morgner <felix.morgner@gmail.com>2026-10-17 12:52:42 +0200
commit5edb6e2fd048f369828984aaae6f7ce83d683201 (patch)
tree50de87735605b4936d0378754c3d51602e8f0c20 /devkit/fake_open_webui.py
parent3f88638e4d1c380d730274f46bac6670b1c6a35e (diff)
downloadcomfier-5edb6e2fd048f369828984aaae6f7ce83d683201.tar.xz
comfier-5edb6e2fd048f369828984aaae6f7ce83d683201.zip
claude: improved dev-setup
Diffstat (limited to 'devkit/fake_open_webui.py')
-rw-r--r--devkit/fake_open_webui.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/devkit/fake_open_webui.py b/devkit/fake_open_webui.py
new file mode 100644
index 0000000..eb0a1b0
--- /dev/null
+++ b/devkit/fake_open_webui.py
@@ -0,0 +1,96 @@
+"""Fake `fastapi` / `open_webui.*` modules, installed into `sys.modules`."""
+
+import pathlib
+import sys
+import time
+import types
+from dataclasses import dataclass, field
+from types import SimpleNamespace
+from typing import Any
+
+
+@dataclass
+class FakeEnv:
+ """Stand-in for the Open WebUI configuration the tool reads."""
+
+ comfyui_url: str
+ workflow: str
+ api_key: str = ""
+ nodes: list[dict[str, Any]] = field(default_factory=list)
+ image_size: str = "1024x1024"
+ image_steps: int = 25
+ output_dir: pathlib.Path = pathlib.Path("test_out")
+ stored: list[pathlib.Path] = field(default_factory=list)
+
+
+def _module(name: str, **attrs: Any) -> types.ModuleType:
+ mod = types.ModuleType(name)
+ for key, value in attrs.items():
+ setattr(mod, key, value)
+ return mod
+
+
+def install(env: FakeEnv) -> None:
+ """Register fake modules. Call before importing `comfier`."""
+
+ class Request: ...
+
+ class Config:
+ @staticmethod
+ async def get(key: str, default: Any = None) -> Any:
+ return default
+
+ class UsersTable:
+ async def get_user_by_id(self, id: str, db: Any = None) -> Any:
+ return SimpleNamespace(id=id, name="dev")
+
+ Users = UsersTable()
+
+ async def get_image_config() -> Any:
+ return SimpleNamespace(
+ COMFYUI_BASE_URL=env.comfyui_url,
+ COMFYUI_API_KEY=env.api_key,
+ COMFYUI_WORKFLOW=env.workflow,
+ COMFYUI_WORKFLOW_NODES=env.nodes,
+ IMAGE_SIZE=env.image_size,
+ IMAGE_STEPS=env.image_steps,
+ )
+
+ async def upload_image(
+ request: Any,
+ image_data: bytes,
+ content_type: str,
+ metadata: dict[str, Any],
+ user: Any,
+ ) -> Any:
+ env.output_dir.mkdir(parents=True, exist_ok=True)
+ ext = ".png" if "png" in content_type else ".jpg"
+ file_id = f"seed_{metadata.get('seed', 'unknown')}_{time.monotonic_ns()}"
+ out_file = env.output_dir / f"{file_id}{ext}"
+ out_file.write_bytes(image_data)
+ env.stored.append(out_file)
+ print(f" [Storage] Saved {len(image_data)} bytes -> {out_file}")
+ # Open WebUI 0.12 returns (file_item, {id, url, name, content_type})
+ return SimpleNamespace(id=file_id), {
+ "id": file_id,
+ "url": f"/api/v1/files/{file_id}/content",
+ }
+
+ modules = {
+ "fastapi": _module("fastapi", Request=Request),
+ "open_webui": _module("open_webui"),
+ "open_webui.models": _module("open_webui.models"),
+ "open_webui.routers": _module("open_webui.routers"),
+ "open_webui.models.config": _module("open_webui.models.config", Config=Config),
+ "open_webui.models.users": _module("open_webui.models.users", Users=Users),
+ "open_webui.routers.images": _module(
+ "open_webui.routers.images",
+ get_image_config=get_image_config,
+ upload_image=upload_image,
+ ),
+ }
+ sys.modules.pop("comfier", None)
+ sys.modules.update(modules)
+
+
+__all__ = ["FakeEnv", "install"]