Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ The core runs on Python 3.10+ using the standard library only. Anything that nee
| **V** | Visible image logos and overlays | Mask, hole fill, dilation, inpaint, restore | Mask removal verifiable, fidelity best-effort |
| **M** | C2PA, EXIF, XMP, document properties | Format-aware metadata rewrite | Verifiable per format |
| Soft binding | Remote manifests, in-content binding | Detection and warning only | Detection only |
| SynthID | Pixel-domain SynthID-class signal | Optional external adapter | Score only |
| SynthID | Pixel-domain SynthID-class signal | Optional external adapter | Score + best-effort removal |

Optional edges, none required by the core:

Expand Down
8 changes: 4 additions & 4 deletions skills/remove-ai-marks/scripts/server.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""HTTP service exposing the watermarks-remover cleaning pipeline.
"""HTTP service exposing the watermark-remover cleaning pipeline.

Stdlib-only. The agent skill and any web app can call it over HTTP instead of
running the CLI scripts locally.
Expand Down Expand Up @@ -403,7 +403,7 @@ def openapi_spec() -> dict[str, Any]:
spec: dict[str, Any] = {
"openapi": "3.0.3",
"info": {
"title": "watermarks-remover service",
"title": "watermark-remover service",
"version": VERSION,
"description": "Strip multi-vendor AI provenance marks (Unicode, C2PA/EXIF/XMP, containers). "
"Files are passed base64-encoded in JSON; cleaned bytes come back base64-encoded.",
Expand Down Expand Up @@ -462,7 +462,7 @@ def _decode_input(body: dict[str, Any]) -> tuple[bytes, str]:


class Handler(BaseHTTPRequestHandler):
server_version = f"watermarks-remover/{VERSION}"
server_version = f"watermark-remover/{VERSION}"

def log_message(self, fmt: str, *args: object) -> None:
eprint(f"{self.address_string()} - {fmt % args}")
Expand Down Expand Up @@ -785,7 +785,7 @@ def main() -> int:
eprint("warning: no API key set — only bind to loopback or a trusted network")

server = ThreadingHTTPServer((args.host, args.port), Handler)
eprint(f"watermarks-remover service {VERSION} on http://{args.host}:{args.port}")
eprint(f"watermark-remover service {VERSION} on http://{args.host}:{args.port}")
try:
server.serve_forever()
except KeyboardInterrupt:
Expand Down
2 changes: 1 addition & 1 deletion skills/remove-ai-marks/scripts/synthid_score_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def _json_ok(payload: dict[str, Any]) -> bytes:


class Handler(BaseHTTPRequestHandler):
server_version = f"watermarks-remover-synthid/{VERSION}"
server_version = f"watermark-remover-synthid/{VERSION}"

def log_message(self, fmt: str, *args: object) -> None:
print(f"{self.address_string()} - {fmt % args}", file=sys.stderr)
Expand Down
2 changes: 1 addition & 1 deletion tests/test_http_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def test_openapi_spec_covers_all_endpoints(conn):
status, body = _get(conn, "/openapi.json")
assert status == 200
assert body["openapi"] == "3.0.3"
assert body["info"]["title"] == "watermarks-remover service"
assert body["info"]["title"] == "watermark-remover service"
expected = {
"/health": {"get"},
"/capabilities": {"get"},
Expand Down