Browse Source

Merge pull request #13738 from dataway/dev

fix: allow non-root jupyter base_url
Tim Jaeryang Baek 1 month ago
parent
commit
7bfe4c6a43
1 changed files with 9 additions and 7 deletions
  1. 9 7
      backend/open_webui/utils/code_interpreter.py

+ 9 - 7
backend/open_webui/utils/code_interpreter.py

@@ -44,12 +44,14 @@ class JupyterCodeExecuter:
         :param password: Jupyter password (optional)
         :param timeout: WebSocket timeout in seconds (default: 60s)
         """
-        self.base_url = base_url.rstrip("/")
+        self.base_url = base_url
         self.code = code
         self.token = token
         self.password = password
         self.timeout = timeout
         self.kernel_id = ""
+        if self.base_url[-1] != '/':
+            self.base_url += '/'
         self.session = aiohttp.ClientSession(trust_env=True, base_url=self.base_url)
         self.params = {}
         self.result = ResultModel()
@@ -61,7 +63,7 @@ class JupyterCodeExecuter:
         if self.kernel_id:
             try:
                 async with self.session.delete(
-                    f"/api/kernels/{self.kernel_id}", params=self.params
+                    f"api/kernels/{self.kernel_id}", params=self.params
                 ) as response:
                     response.raise_for_status()
             except Exception as err:
@@ -81,7 +83,7 @@ class JupyterCodeExecuter:
     async def sign_in(self) -> None:
         # password authentication
         if self.password and not self.token:
-            async with self.session.get("/login") as response:
+            async with self.session.get("login") as response:
                 response.raise_for_status()
                 xsrf_token = response.cookies["_xsrf"].value
                 if not xsrf_token:
@@ -89,7 +91,7 @@ class JupyterCodeExecuter:
                 self.session.cookie_jar.update_cookies(response.cookies)
                 self.session.headers.update({"X-XSRFToken": xsrf_token})
             async with self.session.post(
-                "/login",
+                "login",
                 data={"_xsrf": xsrf_token, "password": self.password},
                 allow_redirects=False,
             ) as response:
@@ -102,16 +104,16 @@ class JupyterCodeExecuter:
 
     async def init_kernel(self) -> None:
         async with self.session.post(
-            url="/api/kernels", params=self.params
+            url="api/kernels", params=self.params
         ) as response:
             response.raise_for_status()
             kernel_data = await response.json()
             self.kernel_id = kernel_data["id"]
 
     def init_ws(self) -> (str, dict):
-        ws_base = self.base_url.replace("http", "ws")
+        ws_base = self.base_url.replace("http", "ws", 1)
         ws_params = "?" + "&".join([f"{key}={val}" for key, val in self.params.items()])
-        websocket_url = f"{ws_base}/api/kernels/{self.kernel_id}/channels{ws_params if len(ws_params) > 1 else ''}"
+        websocket_url = f"{ws_base}api/kernels/{self.kernel_id}/channels{ws_params if len(ws_params) > 1 else ''}"
         ws_headers = {}
         if self.password and not self.token:
             ws_headers = {