update tag-autocomplete

Signed-off-by: vladmandic <mandic00@live.com>
This commit is contained in:
vladmandic
2026-04-13 11:54:59 +02:00
parent 3195bd6287
commit a6c726f8d6
7 changed files with 74 additions and 32 deletions
+1 -1
View File
@@ -121,7 +121,7 @@ class Api:
# autocomplete api
from modules.api import autocomplete as autocomplete_api
autocomplete_api.init(getattr(shared.opts, 'autocomplete_dir', '') or os.path.join(paths.models_path, 'autocomplete'))
autocomplete_api.register_api(self.app)
autocomplete_api.register_api(self)
# gallery api
from modules.api import gallery
+10 -11
View File
@@ -14,9 +14,9 @@ from fastapi.exceptions import HTTPException
from modules.api.models import ItemAutocomplete, ItemAutocompleteContent, ItemAutocompleteRemote
from modules.logger import log
autocomplete_dir: str = ""
cache: dict[str, dict] = {}
HF_REPO = "CalamitousFelicitousness/prompt-vocab"
HF_BASE = f"https://huggingface.co/datasets/{HF_REPO}/resolve/main"
MANIFEST_CACHE_SEC = 300 # re-fetch manifest every 5 minutes
@@ -40,7 +40,7 @@ def get_cached(name: str) -> dict:
try:
manifest = fetch_manifest_sync()
if any(e.get('name') == name for e in manifest):
log.info(f"Auto-downloading autocomplete: {name}")
log.info(f'Autocomplete: name="{name}" auto-download')
download_sync(name)
else:
raise HTTPException(status_code=404, detail=f"Not found: {name}")
@@ -139,7 +139,7 @@ def fetch_manifest_sync() -> list[dict]:
manifest_cache['fetched_at'] = now
return entries
except Exception as e:
log.warning(f"Failed to fetch autocomplete manifest: {e}")
log.warning(f"Autocomplete: Failed to fetch manifest: {e}")
return manifest_cache.get('data', [])
@@ -202,7 +202,6 @@ def download_sync(name: str) -> str:
raise HTTPException(status_code=400, detail="Invalid name")
os.makedirs(autocomplete_dir, exist_ok=True)
url = f"{HF_BASE}/{name}.json"
log.info(f"Downloading autocomplete: {url}")
try:
resp = requests.get(url, timeout=120, stream=True)
resp.raise_for_status()
@@ -217,7 +216,7 @@ def download_sync(name: str) -> str:
size += len(chunk)
os.replace(tmp, target)
cache.pop(name, None)
log.info(f"Downloaded autocomplete: {name} ({size / 1024 / 1024:.1f} MB)")
log.info(f'Autocomplete: name="{name}" url={url} ({size / 1024 / 1024:.2f}MB) downloaded')
return target
@@ -247,9 +246,9 @@ async def delete(name: str):
return {"status": "deleted", "name": name}
def register_api(app):
app.add_api_route("/sdapi/v1/autocomplete", list_all, methods=["GET"], response_model=list[ItemAutocomplete], tags=["Enumerators"])
app.add_api_route("/sdapi/v1/autocomplete/remote", list_remote, methods=["GET"], response_model=list[ItemAutocompleteRemote], tags=["Enumerators"])
app.add_api_route("/sdapi/v1/autocomplete/{name}", get_content, methods=["GET"], response_model=ItemAutocompleteContent, tags=["Enumerators"])
app.add_api_route("/sdapi/v1/autocomplete/{name}/download", download, methods=["POST"], response_model=ItemAutocomplete, tags=["Enumerators"])
app.add_api_route("/sdapi/v1/autocomplete/{name}", delete, methods=["DELETE"], tags=["Enumerators"])
def register_api(api):
api.add_api_route("/sdapi/v1/autocomplete", list_all, methods=["GET"], response_model=list[ItemAutocomplete], tags=["Enumerators"])
api.add_api_route("/sdapi/v1/autocomplete/remote", list_remote, methods=["GET"], response_model=list[ItemAutocompleteRemote], tags=["Enumerators"])
api.add_api_route("/sdapi/v1/autocomplete/{name}", get_content, methods=["GET"], response_model=ItemAutocompleteContent, tags=["Enumerators"])
api.add_api_route("/sdapi/v1/autocomplete/{name}/download", download, methods=["POST"], response_model=ItemAutocomplete, tags=["Enumerators"])
api.add_api_route("/sdapi/v1/autocomplete/{name}", delete, methods=["DELETE"], tags=["Enumerators"])