فهرست منبع

feat: cancel download from backend

Timothy J. Baek 1 سال پیش
والد
کامیت
e008738f30
1فایلهای تغییر یافته به همراه18 افزوده شده و 2 حذف شده
  1. 18 2
      backend/apps/ollama/main.py

+ 18 - 2
backend/apps/ollama/main.py

@@ -234,11 +234,26 @@ async def pull_model(
     def get_request():
     def get_request():
         nonlocal url
         nonlocal url
         nonlocal r
         nonlocal r
+
+        request_id = str(uuid.uuid4())
         try:
         try:
+            REQUEST_POOL.append(request_id)
 
 
             def stream_content():
             def stream_content():
-                for chunk in r.iter_content(chunk_size=8192):
-                    yield chunk
+                try:
+                    yield json.dumps({"id": request_id, "done": False}) + "\n"
+
+                    for chunk in r.iter_content(chunk_size=8192):
+                        if request_id in REQUEST_POOL:
+                            yield chunk
+                        else:
+                            print("User: canceled request")
+                            break
+                finally:
+                    if hasattr(r, "close"):
+                        r.close()
+                        if request_id in REQUEST_POOL:
+                            REQUEST_POOL.remove(request_id)
 
 
             r = requests.request(
             r = requests.request(
                 method="POST",
                 method="POST",
@@ -259,6 +274,7 @@ async def pull_model(
 
 
     try:
     try:
         return await run_in_threadpool(get_request)
         return await run_in_threadpool(get_request)
+
     except Exception as e:
     except Exception as e:
         print(e)
         print(e)
         error_detail = "Open WebUI: Server Connection Error"
         error_detail = "Open WebUI: Server Connection Error"