diff --git a/gns3server/api/routes/compute/__init__.py b/gns3server/api/routes/compute/__init__.py
index 7606e6ddf..934243922 100644
--- a/gns3server/api/routes/compute/__init__.py
+++ b/gns3server/api/routes/compute/__init__.py
@@ -15,43 +15,44 @@
# along with this program. If not, see .
-from fastapi import FastAPI, Request, Depends
+import logging
+
+from fastapi import Depends, FastAPI, Request
from fastapi.responses import JSONResponse
from starlette.exceptions import HTTPException as StarletteHTTPException
-from gns3server.controller.gns3vm.gns3_vm_error import GNS3VMError
-from gns3server.compute.error import ImageMissingError, NodeError
-from gns3server.compute.ubridge.ubridge_error import UbridgeError
-
-from .dependencies.authentication import compute_authentication
from gns3server.compute.compute_error import (
ComputeError,
+ ComputeForbiddenError,
ComputeNotFoundError,
ComputeTimeoutError,
- ComputeForbiddenError,
ComputeUnauthorizedError,
)
+from gns3server.compute.error import ImageMissingError, NodeError
+from gns3server.compute.ubridge.ubridge_error import UbridgeError
+from gns3server.controller.gns3vm.gns3_vm_error import GNS3VMError
-from . import capabilities
-from . import compute
-from . import projects
-from . import notifications
-from . import images
-from . import atm_switch_nodes
-from . import cloud_nodes
-from . import docker_nodes
-from . import dynamips_nodes
-from . import ethernet_hub_nodes
-from . import ethernet_switch_nodes
-from . import frame_relay_switch_nodes
-from . import iou_nodes
-from . import nat_nodes
-from . import qemu_nodes
-from . import virtualbox_nodes
-from . import vmware_nodes
-from . import vpcs_nodes
-
-import logging
+from . import (
+ atm_switch_nodes,
+ capabilities,
+ cloud_nodes,
+ compute,
+ docker_nodes,
+ dynamips_nodes,
+ ethernet_hub_nodes,
+ ethernet_switch_nodes,
+ frame_relay_switch_nodes,
+ images,
+ iou_nodes,
+ nat_nodes,
+ notifications,
+ projects,
+ qemu_nodes,
+ virtualbox_nodes,
+ vmware_nodes,
+ vpcs_nodes,
+)
+from .dependencies.authentication import compute_authentication
log = logging.getLogger(__name__)
diff --git a/gns3server/api/routes/compute/atm_switch_nodes.py b/gns3server/api/routes/compute/atm_switch_nodes.py
index 1282a162d..e62a54eb1 100644
--- a/gns3server/api/routes/compute/atm_switch_nodes.py
+++ b/gns3server/api/routes/compute/atm_switch_nodes.py
@@ -18,13 +18,13 @@
API routes for ATM switch nodes.
"""
-from typing import Any
import os
+from typing import Any
+from uuid import UUID
-from fastapi import APIRouter, Depends, Body, Path, status, HTTPException
+from fastapi import APIRouter, Body, Depends, HTTPException, Path, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse
-from uuid import UUID
from gns3server import schemas
from gns3server.compute.dynamips import Dynamips
diff --git a/gns3server/api/routes/compute/capabilities.py b/gns3server/api/routes/compute/capabilities.py
index 42154d4e1..363b2906b 100644
--- a/gns3server/api/routes/compute/capabilities.py
+++ b/gns3server/api/routes/compute/capabilities.py
@@ -19,14 +19,14 @@ API routes for capabilities
"""
import sys
-import psutil
+import psutil
from fastapi import APIRouter, Request
-from gns3server.version import __version__
+from gns3server import schemas
from gns3server.compute import MODULES
from gns3server.utils.path import get_default_project_directory
-from gns3server import schemas
+from gns3server.version import __version__
router = APIRouter()
diff --git a/gns3server/api/routes/compute/cloud_nodes.py b/gns3server/api/routes/compute/cloud_nodes.py
index d0a4ead9e..53b4ed432 100644
--- a/gns3server/api/routes/compute/cloud_nodes.py
+++ b/gns3server/api/routes/compute/cloud_nodes.py
@@ -19,13 +19,13 @@ API routes for cloud nodes.
"""
import os
-
-from fastapi import APIRouter, Depends, Path, status, HTTPException
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import StreamingResponse
from typing import Any, Union
from uuid import UUID
+from fastapi import APIRouter, Depends, HTTPException, Path, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import StreamingResponse
+
from gns3server import schemas
from gns3server.compute.builtin import Builtin
from gns3server.compute.builtin.nodes.cloud import Cloud
diff --git a/gns3server/api/routes/compute/compute.py b/gns3server/api/routes/compute/compute.py
index c98b1a256..cd750edb9 100644
--- a/gns3server/api/routes/compute/compute.py
+++ b/gns3server/api/routes/compute/compute.py
@@ -20,26 +20,26 @@ API routes for compute.
"""
import os
-import psutil
-import cpuinfo
-
from functools import lru_cache
-from gns3server.config import Config
-from gns3server.utils.cpu_percent import CpuPercent
-from gns3server.version import __version__
-from gns3server.utils.path import get_default_project_directory, is_safe_path
+from typing import List, Optional
+from uuid import UUID
+
+import cpuinfo
+import psutil
+from fastapi import APIRouter, Body, HTTPException, Response, status
+from fastapi.encoders import jsonable_encoder
+
+from gns3server import schemas
from gns3server.compute.port_manager import PortManager
from gns3server.compute.project_manager import ProjectManager
-from gns3server.utils.interfaces import interfaces
from gns3server.compute.qemu import Qemu
from gns3server.compute.virtualbox import VirtualBox
from gns3server.compute.vmware import VMware
-from gns3server import schemas
-
-from fastapi import APIRouter, HTTPException, Body, Response, status
-from fastapi.encoders import jsonable_encoder
-from uuid import UUID
-from typing import Optional, List
+from gns3server.config import Config
+from gns3server.utils.cpu_percent import CpuPercent
+from gns3server.utils.interfaces import interfaces
+from gns3server.utils.path import get_default_project_directory, is_safe_path
+from gns3server.version import __version__
router = APIRouter()
diff --git a/gns3server/api/routes/compute/dependencies/authentication.py b/gns3server/api/routes/compute/dependencies/authentication.py
index 0412a4136..db5a3f0d0 100644
--- a/gns3server/api/routes/compute/dependencies/authentication.py
+++ b/gns3server/api/routes/compute/dependencies/authentication.py
@@ -14,16 +14,17 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import secrets
import base64
import binascii
import logging
+import secrets
+from typing import Optional, Union
from fastapi import Depends, HTTPException, WebSocket, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials
from fastapi.security.utils import get_authorization_scheme_param
+
from gns3server.config import Config
-from typing import Optional, Union
log = logging.getLogger(__name__)
security = HTTPBasic(auto_error=False)
diff --git a/gns3server/api/routes/compute/docker_nodes.py b/gns3server/api/routes/compute/docker_nodes.py
index 9dee90dda..37c00d5a3 100644
--- a/gns3server/api/routes/compute/docker_nodes.py
+++ b/gns3server/api/routes/compute/docker_nodes.py
@@ -19,16 +19,17 @@ API routes for Docker nodes.
"""
import os
+from typing import Any, Union
+from uuid import UUID
-from fastapi import APIRouter, WebSocket, Depends, Body, status, HTTPException
+from fastapi import APIRouter, Body, Depends, HTTPException, WebSocket, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse
-from uuid import UUID
-from typing import Any, Union
from gns3server import schemas
from gns3server.compute.docker import Docker
from gns3server.compute.docker.docker_vm import DockerVM
+
from .dependencies.authentication import compute_authentication, ws_compute_authentication
responses: dict[int | str, dict[str, Any]] = {
diff --git a/gns3server/api/routes/compute/dynamips_nodes.py b/gns3server/api/routes/compute/dynamips_nodes.py
index ccfcd58fb..99c1b53cd 100644
--- a/gns3server/api/routes/compute/dynamips_nodes.py
+++ b/gns3server/api/routes/compute/dynamips_nodes.py
@@ -19,16 +19,16 @@ API routes for Dynamips nodes.
"""
import os
-
-from fastapi import APIRouter, WebSocket, Body, Depends, status, HTTPException
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import StreamingResponse
from typing import Any, List, Optional, Union
from uuid import UUID
+from fastapi import APIRouter, Body, Depends, HTTPException, WebSocket, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import StreamingResponse
+
+from gns3server import schemas
from gns3server.compute.dynamips import Dynamips
from gns3server.compute.dynamips.nodes.router import Router
-from gns3server import schemas
from .dependencies.authentication import compute_authentication, ws_compute_authentication
diff --git a/gns3server/api/routes/compute/ethernet_hub_nodes.py b/gns3server/api/routes/compute/ethernet_hub_nodes.py
index 150d18e64..05985100c 100644
--- a/gns3server/api/routes/compute/ethernet_hub_nodes.py
+++ b/gns3server/api/routes/compute/ethernet_hub_nodes.py
@@ -18,17 +18,17 @@
API routes for Ethernet hub nodes.
"""
-from typing import Any
import os
-
-from fastapi import APIRouter, Depends, Body, Path, status, HTTPException
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import StreamingResponse
+from typing import Any
from uuid import UUID
+from fastapi import APIRouter, Body, Depends, HTTPException, Path, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import StreamingResponse
+
+from gns3server import schemas
from gns3server.compute.dynamips import Dynamips
from gns3server.compute.dynamips.nodes.ethernet_hub import EthernetHub
-from gns3server import schemas
responses: dict[int | str, dict[str, Any]] = {
404: {"model": schemas.ErrorMessage, "description": "Could not find project or Ethernet hub node"}
diff --git a/gns3server/api/routes/compute/ethernet_switch_nodes.py b/gns3server/api/routes/compute/ethernet_switch_nodes.py
index 9c7736e9c..e6e13e94d 100644
--- a/gns3server/api/routes/compute/ethernet_switch_nodes.py
+++ b/gns3server/api/routes/compute/ethernet_switch_nodes.py
@@ -22,17 +22,17 @@ through uBridge's ``brctl`` module (see
``gns3server.compute.builtin.nodes.ethernet_switch``).
"""
-from typing import Any
import os
-
-from fastapi import APIRouter, Depends, Body, Path, status, HTTPException
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import StreamingResponse
+from typing import Any
from uuid import UUID
+from fastapi import APIRouter, Body, Depends, HTTPException, Path, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import StreamingResponse
+
+from gns3server import schemas
from gns3server.compute.builtin import Builtin
from gns3server.compute.builtin.nodes.ethernet_switch import EthernetSwitch
-from gns3server import schemas
responses: dict[int | str, dict[str, Any]] = {
404: {"model": schemas.ErrorMessage, "description": "Could not find project or Ethernet switch node"}
diff --git a/gns3server/api/routes/compute/frame_relay_switch_nodes.py b/gns3server/api/routes/compute/frame_relay_switch_nodes.py
index bd8bb1f18..0c298f8b9 100644
--- a/gns3server/api/routes/compute/frame_relay_switch_nodes.py
+++ b/gns3server/api/routes/compute/frame_relay_switch_nodes.py
@@ -18,13 +18,13 @@
API routes for Frame Relay switch nodes.
"""
-from typing import Any
import os
+from typing import Any
+from uuid import UUID
-from fastapi import APIRouter, Depends, Body, Path, status, HTTPException
+from fastapi import APIRouter, Body, Depends, HTTPException, Path, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse
-from uuid import UUID
from gns3server import schemas
from gns3server.compute.dynamips import Dynamips
diff --git a/gns3server/api/routes/compute/images.py b/gns3server/api/routes/compute/images.py
index fd49974a1..966063cc8 100644
--- a/gns3server/api/routes/compute/images.py
+++ b/gns3server/api/routes/compute/images.py
@@ -20,11 +20,11 @@ API routes for images.
import os
import urllib.parse
-
-from fastapi import APIRouter, Body, Request, status, Response, HTTPException
-from fastapi.responses import FileResponse
from typing import List
+from fastapi import APIRouter, Body, HTTPException, Request, Response, status
+from fastapi.responses import FileResponse
+
from gns3server.compute.docker import Docker
from gns3server.compute.dynamips import Dynamips
from gns3server.compute.iou import IOU
diff --git a/gns3server/api/routes/compute/iou_nodes.py b/gns3server/api/routes/compute/iou_nodes.py
index 5285c07b5..50600a734 100644
--- a/gns3server/api/routes/compute/iou_nodes.py
+++ b/gns3server/api/routes/compute/iou_nodes.py
@@ -19,13 +19,13 @@ API routes for IOU nodes.
"""
import os
-
-from fastapi import APIRouter, WebSocket, Depends, Body, status, HTTPException
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import StreamingResponse
from typing import Any, Union
from uuid import UUID
+from fastapi import APIRouter, Body, Depends, HTTPException, WebSocket, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import StreamingResponse
+
from gns3server import schemas
from gns3server.compute.iou import IOU
from gns3server.compute.iou.iou_vm import IOUVM
diff --git a/gns3server/api/routes/compute/nat_nodes.py b/gns3server/api/routes/compute/nat_nodes.py
index 37d8b4401..43d1e33d5 100644
--- a/gns3server/api/routes/compute/nat_nodes.py
+++ b/gns3server/api/routes/compute/nat_nodes.py
@@ -19,13 +19,13 @@ API routes for NAT nodes.
"""
import os
-
-from fastapi import APIRouter, Depends, Path, status, HTTPException
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import StreamingResponse
from typing import Any, Union
from uuid import UUID
+from fastapi import APIRouter, Depends, HTTPException, Path, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import StreamingResponse
+
from gns3server import schemas
from gns3server.compute.builtin import Builtin
from gns3server.compute.builtin.nodes.nat import Nat
diff --git a/gns3server/api/routes/compute/notifications.py b/gns3server/api/routes/compute/notifications.py
index 66de26675..24f8ee059 100644
--- a/gns3server/api/routes/compute/notifications.py
+++ b/gns3server/api/routes/compute/notifications.py
@@ -18,14 +18,15 @@
API routes for compute notifications.
"""
-from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect
+import logging
from typing import Union
+
+from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect
from websockets.exceptions import ConnectionClosed, WebSocketException
from gns3server.compute.notification_manager import NotificationManager
-from .dependencies.authentication import ws_compute_authentication
-import logging
+from .dependencies.authentication import ws_compute_authentication
log = logging.getLogger(__name__)
diff --git a/gns3server/api/routes/compute/projects.py b/gns3server/api/routes/compute/projects.py
index 729510055..0ab1caa1f 100644
--- a/gns3server/api/routes/compute/projects.py
+++ b/gns3server/api/routes/compute/projects.py
@@ -18,28 +18,27 @@
API routes for projects.
"""
+import asyncio
+import inspect
+import logging
import os
import shutil
import urllib.parse
-import inspect
-import asyncio
-
-import logging
log = logging.getLogger()
-from fastapi import APIRouter, Depends, HTTPException, Request, Response, status, Query
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import FileResponse
from typing import List
from uuid import UUID
-from gns3server.compute.project_manager import ProjectManager
-from gns3server.compute.project import Project
-from gns3server.compute.base_manager import BaseManager
-from gns3server.utils.path import is_safe_path
-from gns3server import schemas
+from fastapi import APIRouter, Depends, HTTPException, Query, Request, Response, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import FileResponse
+from gns3server import schemas
+from gns3server.compute.base_manager import BaseManager
+from gns3server.compute.project import Project
+from gns3server.compute.project_manager import ProjectManager
+from gns3server.utils.path import is_safe_path
router = APIRouter()
diff --git a/gns3server/api/routes/compute/qemu_nodes.py b/gns3server/api/routes/compute/qemu_nodes.py
index 6f1794fb9..1f5574654 100644
--- a/gns3server/api/routes/compute/qemu_nodes.py
+++ b/gns3server/api/routes/compute/qemu_nodes.py
@@ -18,21 +18,21 @@
API routes for Qemu nodes.
"""
+import logging
import os
-
-from fastapi import APIRouter, WebSocket, Depends, Body, Path, status, HTTPException
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import StreamingResponse
from typing import Any, Union
from uuid import UUID
+from fastapi import APIRouter, Body, Depends, HTTPException, Path, WebSocket, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import StreamingResponse
+
from gns3server import schemas
from gns3server.compute import qemu
from gns3server.compute.qemu import Qemu
from gns3server.compute.qemu.qemu_vm import QemuVM
-from .dependencies.authentication import compute_authentication, ws_compute_authentication
-import logging
+from .dependencies.authentication import compute_authentication, ws_compute_authentication
log = logging.getLogger(__name__)
diff --git a/gns3server/api/routes/compute/virtualbox_nodes.py b/gns3server/api/routes/compute/virtualbox_nodes.py
index 9f137d066..49e7f7316 100644
--- a/gns3server/api/routes/compute/virtualbox_nodes.py
+++ b/gns3server/api/routes/compute/virtualbox_nodes.py
@@ -19,12 +19,12 @@ API routes for VirtualBox nodes.
"""
import os
+from typing import Any, Union
+from uuid import UUID
-from fastapi import APIRouter, WebSocket, Depends, Path, status
+from fastapi import APIRouter, Depends, Path, WebSocket, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse
-from uuid import UUID
-from typing import Any, Union
from gns3server import schemas
from gns3server.compute.virtualbox import VirtualBox
diff --git a/gns3server/api/routes/compute/vmware_nodes.py b/gns3server/api/routes/compute/vmware_nodes.py
index 61849da30..ffb476215 100644
--- a/gns3server/api/routes/compute/vmware_nodes.py
+++ b/gns3server/api/routes/compute/vmware_nodes.py
@@ -19,12 +19,12 @@ API routes for VMware nodes.
"""
import os
+from typing import Any, Union
+from uuid import UUID
-from fastapi import APIRouter, WebSocket, Depends, Path, status
+from fastapi import APIRouter, Depends, Path, WebSocket, status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse
-from uuid import UUID
-from typing import Any, Union
from gns3server import schemas
from gns3server.compute.vmware import VMware
diff --git a/gns3server/api/routes/compute/vpcs_nodes.py b/gns3server/api/routes/compute/vpcs_nodes.py
index a9f96bdc5..255ce33f6 100644
--- a/gns3server/api/routes/compute/vpcs_nodes.py
+++ b/gns3server/api/routes/compute/vpcs_nodes.py
@@ -19,16 +19,17 @@ API routes for VPCS nodes.
"""
import os
-
-from fastapi import APIRouter, WebSocket, Depends, Body, Path, status, HTTPException
-from fastapi.encoders import jsonable_encoder
-from fastapi.responses import StreamingResponse
from typing import Any, Union
from uuid import UUID
+from fastapi import APIRouter, Body, Depends, HTTPException, Path, WebSocket, status
+from fastapi.encoders import jsonable_encoder
+from fastapi.responses import StreamingResponse
+
from gns3server import schemas
from gns3server.compute.vpcs import VPCS
from gns3server.compute.vpcs.vpcs_vm import VPCSVM
+
from .dependencies.authentication import compute_authentication, ws_compute_authentication
responses: dict[int | str, dict[str, Any]] = {
diff --git a/gns3server/api/routes/index.py b/gns3server/api/routes/index.py
index 0c4719725..c06bd36b2 100644
--- a/gns3server/api/routes/index.py
+++ b/gns3server/api/routes/index.py
@@ -16,12 +16,12 @@
import os
-from fastapi import APIRouter, Request, HTTPException, status
-from fastapi.responses import RedirectResponse, HTMLResponse, FileResponse
+from fastapi import APIRouter, HTTPException, Request, status
+from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates
-from gns3server.version import __version__
from gns3server.utils.get_resource import get_resource
+from gns3server.version import __version__
router = APIRouter()
templates = Jinja2Templates(directory=os.path.join("gns3server", "templates"))
diff --git a/gns3server/config.py b/gns3server/config.py
index ed1507f4e..5b588ac4b 100644
--- a/gns3server/config.py
+++ b/gns3server/config.py
@@ -18,19 +18,19 @@
Reads the configuration file and store the settings for the server.
"""
-import sys
-import os
-import shutil
-import secrets
import configparser
-
-from enum import Enum
-from pydantic import ValidationError
-from .schemas import ServerConfig
-from .version import __version_info__
-from .utils.file_watcher import FileWatcher
-
import logging
+import os
+import secrets
+import shutil
+import sys
+from enum import Enum
+
+from pydantic import ValidationError
+
+from .schemas import ServerConfig
+from .utils.file_watcher import FileWatcher
+from .version import __version_info__
log = logging.getLogger(__name__)
diff --git a/gns3server/core/tasks.py b/gns3server/core/tasks.py
index 71d15bbb4..bb1f2edd6 100644
--- a/gns3server/core/tasks.py
+++ b/gns3server/core/tasks.py
@@ -16,21 +16,19 @@
# along with this program. If not, see .
import asyncio
-
-from fastapi import FastAPI
+import logging
from contextlib import asynccontextmanager
-from gns3server.controller import Controller
-from gns3server.config import Config
+from fastapi import FastAPI
+
from gns3server.compute import MODULES
-from gns3server.compute.port_manager import PortManager
from gns3server.compute.marker.marker_manager import MarkerManager
-from gns3server.utils.http_client import HTTPClient
-from gns3server.db.tasks import connect_to_db, get_computes, disconnect_from_db
+from gns3server.compute.port_manager import PortManager
+from gns3server.config import Config
+from gns3server.controller import Controller
+from gns3server.db.tasks import connect_to_db, disconnect_from_db, get_computes
from gns3server.services.image_reconciliation import get_image_reconciliation_service
-
-
-import logging
+from gns3server.utils.http_client import HTTPClient
log = logging.getLogger(__name__)
diff --git a/gns3server/db_migrations/env.py b/gns3server/db_migrations/env.py
index f60fef2f6..d7f5ba73b 100644
--- a/gns3server/db_migrations/env.py
+++ b/gns3server/db_migrations/env.py
@@ -2,11 +2,10 @@ import asyncio
import os
from logging.config import fileConfig
+from alembic import context
from sqlalchemy import pool
from sqlalchemy.ext.asyncio import async_engine_from_config
-from alembic import context
-
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
diff --git a/gns3server/db_migrations/versions/20260303_create_llm_model_configs_table.py b/gns3server/db_migrations/versions/20260303_create_llm_model_configs_table.py
index 27bdd04ea..47732f3c9 100644
--- a/gns3server/db_migrations/versions/20260303_create_llm_model_configs_table.py
+++ b/gns3server/db_migrations/versions/20260303_create_llm_model_configs_table.py
@@ -6,8 +6,8 @@ Create Date: 2026-03-03
"""
-from alembic import op
import sqlalchemy as sa
+from alembic import op
from sqlalchemy import inspect
# revision identifiers, used by Alembic.
diff --git a/gns3server/db_migrations/versions/7ceeddd9c9a8_init.py b/gns3server/db_migrations/versions/7ceeddd9c9a8_init.py
index 4c218cf5e..05570706e 100644
--- a/gns3server/db_migrations/versions/7ceeddd9c9a8_init.py
+++ b/gns3server/db_migrations/versions/7ceeddd9c9a8_init.py
@@ -6,9 +6,8 @@ Create Date: 2023-01-11 08:55:25.116126
"""
-from alembic import op
import sqlalchemy as sa
-
+from alembic import op
# revision identifiers, used by Alembic.
revision = "7ceeddd9c9a8"
diff --git a/gns3server/db_migrations/versions/8f2a1c4e9d3b_add_extra_configs_to_docker_templates.py b/gns3server/db_migrations/versions/8f2a1c4e9d3b_add_extra_configs_to_docker_templates.py
index 64d1489b4..d821cbe09 100644
--- a/gns3server/db_migrations/versions/8f2a1c4e9d3b_add_extra_configs_to_docker_templates.py
+++ b/gns3server/db_migrations/versions/8f2a1c4e9d3b_add_extra_configs_to_docker_templates.py
@@ -6,9 +6,8 @@ Create Date: 2026-08-14 10:00:00.000000
"""
-from alembic import op
import sqlalchemy as sa
-
+from alembic import op
# revision identifiers, used by Alembic.
revision = "8f2a1c4e9d3b"
diff --git a/gns3server/db_migrations/versions/98083573d011_add_tags_field_to_templates.py b/gns3server/db_migrations/versions/98083573d011_add_tags_field_to_templates.py
index 567aa3107..8744f9115 100644
--- a/gns3server/db_migrations/versions/98083573d011_add_tags_field_to_templates.py
+++ b/gns3server/db_migrations/versions/98083573d011_add_tags_field_to_templates.py
@@ -6,9 +6,8 @@ Create Date: 2026-02-23 18:23:59.857607
"""
-from alembic import op
import sqlalchemy as sa
-
+from alembic import op
# revision identifiers, used by Alembic.
revision = "98083573d011"
diff --git a/gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py b/gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py
index e85dc00f7..25d36675d 100644
--- a/gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py
+++ b/gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py
@@ -6,9 +6,8 @@ Create Date: 2024-09-18 17:52:53.429522
"""
-from alembic import op
import sqlalchemy as sa
-
+from alembic import op
# revision identifiers, used by Alembic.
revision = "9a5292aa4389"
diff --git a/gns3server/db_migrations/versions/a8829e6c069b_add_llm_config_privileges.py b/gns3server/db_migrations/versions/a8829e6c069b_add_llm_config_privileges.py
index fb146edd7..de87baced 100644
--- a/gns3server/db_migrations/versions/a8829e6c069b_add_llm_config_privileges.py
+++ b/gns3server/db_migrations/versions/a8829e6c069b_add_llm_config_privileges.py
@@ -6,10 +6,11 @@ Create Date: 2026-05-26
"""
-from alembic import op
-import sqlalchemy as sa
from uuid import uuid4
+import sqlalchemy as sa
+from alembic import op
+
# revision identifiers, used by Alembic.
revision = "a8829e6c069b"
down_revision = "aff810fc119a"
diff --git a/gns3server/db_migrations/versions/aff810fc119a_add_token_version_to_users_table.py b/gns3server/db_migrations/versions/aff810fc119a_add_token_version_to_users_table.py
index 8de44a283..edf5f997a 100644
--- a/gns3server/db_migrations/versions/aff810fc119a_add_token_version_to_users_table.py
+++ b/gns3server/db_migrations/versions/aff810fc119a_add_token_version_to_users_table.py
@@ -6,8 +6,8 @@ Create Date: 2026-04-06 19:49:12.155446
"""
-from alembic import op
import sqlalchemy as sa
+from alembic import op
# revision identifiers, used by Alembic.
revision = "aff810fc119a"
diff --git a/gns3server/db_migrations/versions/b3c7e2a91d4f_add_netmiko_device_type_to_templates.py b/gns3server/db_migrations/versions/b3c7e2a91d4f_add_netmiko_device_type_to_templates.py
index 661b33d69..6a98aca5c 100644
--- a/gns3server/db_migrations/versions/b3c7e2a91d4f_add_netmiko_device_type_to_templates.py
+++ b/gns3server/db_migrations/versions/b3c7e2a91d4f_add_netmiko_device_type_to_templates.py
@@ -6,9 +6,8 @@ Create Date: 2026-08-16 10:00:00.000000
"""
-from alembic import op
import sqlalchemy as sa
-
+from alembic import op
# revision identifiers, used by Alembic.
revision = "b3c7e2a91d4f"
diff --git a/gns3server/db_migrations/versions/c7e4a9f1d2b6_add_appliance_metadata_to_templates.py b/gns3server/db_migrations/versions/c7e4a9f1d2b6_add_appliance_metadata_to_templates.py
index e0725102f..7bde600dc 100644
--- a/gns3server/db_migrations/versions/c7e4a9f1d2b6_add_appliance_metadata_to_templates.py
+++ b/gns3server/db_migrations/versions/c7e4a9f1d2b6_add_appliance_metadata_to_templates.py
@@ -6,9 +6,8 @@ Create Date: 2026-08-16 12:00:00.000000
"""
-from alembic import op
import sqlalchemy as sa
-
+from alembic import op
# revision identifiers, used by Alembic.
revision = "c7e4a9f1d2b6"
diff --git a/gns3server/db_migrations/versions/ec4b7b198555_convert_pickletype_fields_to_json.py b/gns3server/db_migrations/versions/ec4b7b198555_convert_pickletype_fields_to_json.py
index d25782c13..a42aa7212 100644
--- a/gns3server/db_migrations/versions/ec4b7b198555_convert_pickletype_fields_to_json.py
+++ b/gns3server/db_migrations/versions/ec4b7b198555_convert_pickletype_fields_to_json.py
@@ -6,8 +6,8 @@ Create Date: 2026-04-03 19:51:06.173013
"""
-from alembic import op
import sqlalchemy as sa
+from alembic import op
# revision identifiers, used by Alembic.
revision = "ec4b7b198555"
@@ -21,8 +21,8 @@ def convert_pickle_to_json(conn, table_name: str, column_name: str) -> None:
Convert a PickleType column to JSON for all rows in a table.
"""
- import pickle
import json
+ import pickle
result = conn.execute(sa.text(f"SELECT template_id, {column_name} FROM {table_name}"))
for row in result:
@@ -49,8 +49,8 @@ def convert_json_to_pickle(conn, table_name: str, column_name: str) -> None:
Convert a JSON column to PickleType for all rows in a table.
"""
- import pickle
import json
+ import pickle
result = conn.execute(sa.text(f"SELECT template_id, {column_name} FROM {table_name}"))
for row in result:
diff --git a/gns3server/db_migrations/versions/f0b0de2a9_add_api_keys_table.py b/gns3server/db_migrations/versions/f0b0de2a9_add_api_keys_table.py
index a52dd05d6..50942c9ed 100644
--- a/gns3server/db_migrations/versions/f0b0de2a9_add_api_keys_table.py
+++ b/gns3server/db_migrations/versions/f0b0de2a9_add_api_keys_table.py
@@ -6,8 +6,9 @@ Create Date: 2026-06-11 10:00:00.000000
"""
-from alembic import op
import sqlalchemy as sa
+from alembic import op
+
import gns3server.db.models.base as models
# revision identifiers, used by Alembic.
diff --git a/gns3server/logger.py b/gns3server/logger.py
index 30d99bf39..50fe04017 100644
--- a/gns3server/logger.py
+++ b/gns3server/logger.py
@@ -17,12 +17,11 @@
"""Provide a pretty logging on console"""
+import gzip
import logging
-import sys
import os
import shutil
-import gzip
-
+import sys
from logging.handlers import RotatingFileHandler
diff --git a/gns3server/main.py b/gns3server/main.py
index 29a2073cf..5692fab79 100644
--- a/gns3server/main.py
+++ b/gns3server/main.py
@@ -25,14 +25,14 @@ Entry point of the server. It's support daemonize the process
# if is not writetable the application crash. It's the user fault
# because one day the user as used sudo to run an egg and break his
# filesystem permissions, but it's a common mistake.
-import gns3server.utils.get_resource
-
-import os
-import sys
-import asyncio
import argparse
+import asyncio
import logging
+import os
import resource
+import sys
+
+import gns3server.utils.get_resource
def daemonize():
diff --git a/gns3server/server.py b/gns3server/server.py
index 7d7eb3186..f9824caab 100644
--- a/gns3server/server.py
+++ b/gns3server/server.py
@@ -20,25 +20,25 @@
Start the program. Use main.py to load it.
"""
-import os
-import datetime
-import locale
-import psutil
-import sys
import asyncio
-import signal
+import datetime
import functools
-import uvicorn
+import locale
+import logging
+import os
import secrets
+import signal
import string
+import sys
+
+import psutil
+import uvicorn
+from pydantic import SecretStr, ValidationError
-from gns3server.logger import init_logger
-from gns3server.version import __version__
from gns3server.config import Config
from gns3server.crash_report import CrashReport
-from pydantic import ValidationError, SecretStr
-
-import logging
+from gns3server.logger import init_logger
+from gns3server.version import __version__
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/__init__.py b/gns3server/utils/__init__.py
index 386095757..44c224ff7 100644
--- a/gns3server/utils/__init__.py
+++ b/gns3server/utils/__init__.py
@@ -16,14 +16,14 @@
# along with this program. If not, see .
-import sys
-import re
-import shlex
-import textwrap
-import posixpath
-import socket
import errno
import hashlib
+import posixpath
+import re
+import shlex
+import socket
+import sys
+import textwrap
def force_unix_path(path):
diff --git a/gns3server/utils/application_id.py b/gns3server/utils/application_id.py
index 488fb70b8..b9241cf29 100644
--- a/gns3server/utils/application_id.py
+++ b/gns3server/utils/application_id.py
@@ -15,10 +15,10 @@
# along with this program. If not, see .
#
-from gns3server.controller.controller_error import ControllerError
-
import logging
+from gns3server.controller.controller_error import ControllerError
+
log = logging.getLogger(__name__)
# IOU draws from the lower half: uBridge's iol_bridge uses application_id + 512
diff --git a/gns3server/utils/asyncio/__init__.py b/gns3server/utils/asyncio/__init__.py
index 345cd77a8..98b72c66b 100644
--- a/gns3server/utils/asyncio/__init__.py
+++ b/gns3server/utils/asyncio/__init__.py
@@ -15,12 +15,12 @@
# along with this program. If not, see .
-import functools
import asyncio
-import sys
-import os
-import threading
+import functools
import inspect
+import os
+import sys
+import threading
async def wait_run_in_executor(func, *args, **kwargs):
diff --git a/gns3server/utils/asyncio/aiozipstream.py b/gns3server/utils/asyncio/aiozipstream.py
index b9a9d42c9..07770ed0e 100644
--- a/gns3server/utils/asyncio/aiozipstream.py
+++ b/gns3server/utils/asyncio/aiozipstream.py
@@ -22,16 +22,17 @@ Derived directly from zipfile.py and the zipstream project
https://github.com/allanlei/python-zipstream
"""
+import asyncio
import os
-import sys
import stat
import struct
+import sys
import time
import zipfile
-import asyncio
-import aiofiles
from concurrent import futures
+import aiofiles
+
structCentralDir = "<4s4B4HL2L5H2L"
structEndArchive64 = "<4sQ2H2L4Q"
structEndArchive = b"<4s4H2LH"
diff --git a/gns3server/utils/asyncio/embed_shell.py b/gns3server/utils/asyncio/embed_shell.py
index 7059c9e29..5f044222d 100644
--- a/gns3server/utils/asyncio/embed_shell.py
+++ b/gns3server/utils/asyncio/embed_shell.py
@@ -16,24 +16,24 @@
# along with this program. If not, see .
-import sys
import asyncio
import inspect
import io
+import sys
from prompt_toolkit import prompt
-from prompt_toolkit.history import InMemoryHistory
from prompt_toolkit.contrib.completers import WordCompleter
from prompt_toolkit.enums import DEFAULT_BUFFER
from prompt_toolkit.eventloop.base import EventLoop
+from prompt_toolkit.history import InMemoryHistory
+from prompt_toolkit.input import StdinInput
from prompt_toolkit.interface import CommandLineInterface
from prompt_toolkit.layout.screen import Size
-from prompt_toolkit.shortcuts import create_prompt_application, create_asyncio_eventloop
+from prompt_toolkit.shortcuts import create_asyncio_eventloop, create_prompt_application
from prompt_toolkit.terminal.vt100_output import Vt100_Output
-from prompt_toolkit.input import StdinInput
-from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer, TelnetConnection
from gns3server.utils.asyncio.input_stream import InputStream
+from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer, TelnetConnection
class EmbedShell:
diff --git a/gns3server/utils/asyncio/input_stream.py b/gns3server/utils/asyncio/input_stream.py
index 6a9c983c6..90a3398b5 100644
--- a/gns3server/utils/asyncio/input_stream.py
+++ b/gns3server/utils/asyncio/input_stream.py
@@ -5,11 +5,10 @@ Parser for VT100 input stream.
# Copied from prompt_toolkit/terminal/vt100_input.py due to dependency on termios (which is not available on Windows)
import re
+
import six
-
-
-from prompt_toolkit.keys import Keys
from prompt_toolkit.key_binding.input_processor import KeyPress
+from prompt_toolkit.keys import Keys
# __all__ = (
# 'InputStream',
diff --git a/gns3server/utils/asyncio/pool.py b/gns3server/utils/asyncio/pool.py
index 0b0b43c9f..659222f6d 100644
--- a/gns3server/utils/asyncio/pool.py
+++ b/gns3server/utils/asyncio/pool.py
@@ -15,8 +15,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
import asyncio
+import sys
class Pool:
diff --git a/gns3server/utils/asyncio/raw_command_server.py b/gns3server/utils/asyncio/raw_command_server.py
index 0b7102dc3..87e0dbb05 100644
--- a/gns3server/utils/asyncio/raw_command_server.py
+++ b/gns3server/utils/asyncio/raw_command_server.py
@@ -14,12 +14,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import re
-import copy
import asyncio
import asyncio.subprocess
-
+import copy
import logging
+import re
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/asyncio/serial.py b/gns3server/utils/asyncio/serial.py
index c142a2e38..8a20a0799 100644
--- a/gns3server/utils/asyncio/serial.py
+++ b/gns3server/utils/asyncio/serial.py
@@ -17,8 +17,8 @@
import asyncio
-from gns3server.utils.asyncio import wait_for_file_creation
from gns3server.compute.error import NodeError
+from gns3server.utils.asyncio import wait_for_file_creation
"""
This module handle connection to unix socket
diff --git a/gns3server/utils/cpu_percent.py b/gns3server/utils/cpu_percent.py
index 016c633b6..3f2f701a5 100644
--- a/gns3server/utils/cpu_percent.py
+++ b/gns3server/utils/cpu_percent.py
@@ -14,9 +14,10 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import psutil
import time
+import psutil
+
class CpuPercent:
"""
diff --git a/gns3server/utils/encryption.py b/gns3server/utils/encryption.py
index 38719a60e..0b0974859 100644
--- a/gns3server/utils/encryption.py
+++ b/gns3server/utils/encryption.py
@@ -19,9 +19,10 @@ Encryption utilities for sensitive data like API keys.
Uses Fernet symmetric encryption.
"""
-import os
import logging
+import os
from typing import Optional
+
from cryptography.fernet import Fernet
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/file_watcher.py b/gns3server/utils/file_watcher.py
index 508fda67d..d481b293c 100644
--- a/gns3server/utils/file_watcher.py
+++ b/gns3server/utils/file_watcher.py
@@ -15,11 +15,10 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import zlib
import asyncio
-import os
-
import logging
+import os
+import zlib
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/http_client.py b/gns3server/utils/http_client.py
index a6b032a82..62841e4ec 100644
--- a/gns3server/utils/http_client.py
+++ b/gns3server/utils/http_client.py
@@ -15,11 +15,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import aiohttp
-from pydantic import SecretStr
+import logging
import socket
-import logging
+import aiohttp
+from pydantic import SecretStr
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/images.py b/gns3server/utils/images.py
index d7483ec59..4f6e402bb 100644
--- a/gns3server/utils/images.py
+++ b/gns3server/utils/images.py
@@ -14,30 +14,31 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import os
-import hashlib
-import stat
-import aiofiles
import asyncio
+import hashlib
+import os
+import stat
import tempfile
-from gns3server.utils.image_inventory import fingerprint, stat_fingerprint, image_lock, publish_image, contained_path
+import aiofiles
+
+from gns3server.utils.image_inventory import contained_path, fingerprint, image_lock, publish_image, stat_fingerprint
try:
import importlib_resources
except ImportError:
from importlib import resources as importlib_resources
-from typing import List, AsyncGenerator
-from ..config import Config
-from . import force_unix_path
+import logging
from io import DEFAULT_BUFFER_SIZE
+from typing import AsyncGenerator, List
import gns3server.db.models as models
from gns3server.db.repositories.images import ImagesRepository
from gns3server.utils.asyncio import wait_run_in_executor
-import logging
+from ..config import Config
+from . import force_unix_path
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/interfaces.py b/gns3server/utils/interfaces.py
index f48db2c8a..0585028c9 100644
--- a/gns3server/utils/interfaces.py
+++ b/gns3server/utils/interfaces.py
@@ -16,9 +16,10 @@
import os
-import sys
import socket
import struct
+import sys
+
import psutil
from gns3server.compute.compute_error import ComputeError
@@ -94,8 +95,8 @@ def get_windows_interfaces():
:returns: list of windows interfaces
"""
- import win32com.client
import pywintypes
+ import win32com.client
interfaces = []
try:
diff --git a/gns3server/utils/notification_queue.py b/gns3server/utils/notification_queue.py
index b7cf93759..4c0e0d6a4 100644
--- a/gns3server/utils/notification_queue.py
+++ b/gns3server/utils/notification_queue.py
@@ -17,14 +17,14 @@
import asyncio
import json
+import logging
import time
+
import psutil
from gns3server.utils.cpu_percent import CpuPercent
from gns3server.utils.path import get_default_project_directory
-import logging
-
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/packet_filter_validation.py b/gns3server/utils/packet_filter_validation.py
index d20ac9f24..29febb2fb 100644
--- a/gns3server/utils/packet_filter_validation.py
+++ b/gns3server/utils/packet_filter_validation.py
@@ -4,7 +4,7 @@ Packet filter parameter validation utilities.
import logging
import subprocess
-from typing import Dict, List, Any, Optional
+from typing import Any, Dict, List, Optional
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/path.py b/gns3server/utils/path.py
index d567d065e..35d7cc142 100644
--- a/gns3server/utils/path.py
+++ b/gns3server/utils/path.py
@@ -16,9 +16,10 @@
# along with this program. If not, see .
import os
-
from pathlib import Path
+
from fastapi import HTTPException, status
+
from ..config import Config
diff --git a/gns3server/utils/picture.py b/gns3server/utils/picture.py
index 61df743e3..814183b05 100644
--- a/gns3server/utils/picture.py
+++ b/gns3server/utils/picture.py
@@ -15,8 +15,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import re
import io
+import re
import struct
from xml.etree.ElementTree import ElementTree, ParseError
diff --git a/gns3server/utils/port_allocator.py b/gns3server/utils/port_allocator.py
index f08954a97..015142a76 100644
--- a/gns3server/utils/port_allocator.py
+++ b/gns3server/utils/port_allocator.py
@@ -5,7 +5,6 @@
import hashlib
-
# Display/port allocation range (stable across process restarts)
DISPLAY_RANGE = 10000
DISPLAY_MODULO = 10000
diff --git a/gns3server/utils/request_utils.py b/gns3server/utils/request_utils.py
index 297a9e90b..27b8294b3 100644
--- a/gns3server/utils/request_utils.py
+++ b/gns3server/utils/request_utils.py
@@ -6,8 +6,8 @@ from ASGI scope dictionaries for logging and debugging purposes.
"""
import logging
+from typing import Any, Dict, Optional
from urllib.parse import parse_qs
-from typing import Dict, Any, Optional
log = logging.getLogger(__name__)
diff --git a/gns3server/utils/uninstall_ai_features.py b/gns3server/utils/uninstall_ai_features.py
index 8a1106bca..aa7f0ff5c 100644
--- a/gns3server/utils/uninstall_ai_features.py
+++ b/gns3server/utils/uninstall_ai_features.py
@@ -7,10 +7,10 @@ Usage:
gns3server-uninstall-ai-features -y
"""
-import os
-import sys
-import subprocess
import argparse
+import os
+import subprocess
+import sys
def _find_base_dir():
diff --git a/gns3server/utils/uuid_validator.py b/gns3server/utils/uuid_validator.py
index 08524f4c9..6b099e180 100644
--- a/gns3server/utils/uuid_validator.py
+++ b/gns3server/utils/uuid_validator.py
@@ -6,7 +6,6 @@
import argparse
import re
-
UUID_PATTERN = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.IGNORECASE)
diff --git a/gns3server/utils/vmnet.py b/gns3server/utils/vmnet.py
index c9340fc8b..9fe5f39d5 100644
--- a/gns3server/utils/vmnet.py
+++ b/gns3server/utils/vmnet.py
@@ -15,12 +15,11 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import sys
-import os
-import ipaddress
import argparse
+import ipaddress
+import os
import shutil
-
+import sys
from collections import OrderedDict
if sys.platform.startswith("darwin"):
diff --git a/gns3server/utils/zipfile_zstd/__init__.py b/gns3server/utils/zipfile_zstd/__init__.py
index f43df1493..687a808b0 100644
--- a/gns3server/utils/zipfile_zstd/__init__.py
+++ b/gns3server/utils/zipfile_zstd/__init__.py
@@ -1,7 +1,7 @@
# NOTE: this patches the standard zipfile module
-from . import _zipfile
-
from zipfile import *
+
+from . import _zipfile
from ._zipfile import (
ZIP_ZSTANDARD,
ZSTANDARD_VERSION,
diff --git a/gns3server/utils/zipfile_zstd/_zipfile.py b/gns3server/utils/zipfile_zstd/_zipfile.py
index e4bb61b03..2e26ba61e 100644
--- a/gns3server/utils/zipfile_zstd/_zipfile.py
+++ b/gns3server/utils/zipfile_zstd/_zipfile.py
@@ -1,8 +1,9 @@
-import zipfile as _zipfile_module
-import zstandard as zstd
import inspect
+import zipfile as _zipfile_module
from typing import Any
+import zstandard as zstd
+
from ._patcher import patch
zipfile: Any = _zipfile_module