style: sort imports in agent and remaining compute modules

This commit is contained in:
Mark Paronyan committed 2026-10-02 12:43:26 +03:00
1 parent 3b993b464f
commit 61caa20524
46 files changed
+218 -274

No files matched your search

@@ -46,8 +46,7 @@ import logging
import os
import warnings
from pathlib import Path
from typing import Any
from typing import Callable
from typing import Any, Callable
# Configure tiktoken cache directory (must be set before importing tiktoken)
_cache_dir = Path(__file__).parent.parent / "cache" / "tiktoken"
@@ -55,9 +54,7 @@ _cache_dir.mkdir(parents=True, exist_ok=True)
os.environ["TIKTOKEN_CACHE_DIR"] = str(_cache_dir)
import tiktoken
from langchain_core.messages import BaseMessage
from langchain_core.messages import SystemMessage
from langchain_core.messages import trim_messages
from langchain_core.messages import BaseMessage, SystemMessage, trim_messages
logger = logging.getLogger(__name__)
@@ -50,17 +50,12 @@ import json
import logging
import operator
from datetime import datetime
from typing import Annotated
from typing import Literal
from typing import Annotated, Literal
# Third-party imports
from langchain.messages import AnyMessage
from langchain.messages import SystemMessage
from langchain.messages import ToolMessage
from langchain.messages import AnyMessage, SystemMessage, ToolMessage
from langchain_core.runnables import RunnableConfig
from langgraph.graph import END
from langgraph.graph import START
from langgraph.graph import StateGraph
from langgraph.graph import END, START, StateGraph
from langgraph.managed.is_last_step import RemainingSteps
from typing_extensions import TypedDict
@@ -70,8 +65,6 @@ from gns3server.agent.gns3_copilot.agent.context_manager import (
)
from gns3server.agent.gns3_copilot.agent.model_factory import (
create_base_model_with_tools,
)
from gns3server.agent.gns3_copilot.agent.model_factory import (
create_title_model,
)
from gns3server.agent.gns3_copilot.gns3_client import GNS3TopologyTool
@@ -79,27 +72,23 @@ from gns3server.agent.gns3_copilot.gns3_client.context_helpers import (
get_current_llm_config,
)
from gns3server.agent.gns3_copilot.prompts import load_system_prompt
from gns3server.agent.gns3_copilot.skills import DeviceSkillsTool, InjectionSkillsTool, PacketAnalysisSkillsTool
from gns3server.agent.gns3_copilot.skills.registry import get_prompt
from gns3server.agent.gns3_copilot.tools_v2 import (
ExecuteMultipleDeviceCommands,
)
from gns3server.agent.gns3_copilot.tools_v2 import (
ExecuteMultipleDeviceConfigCommands,
GNS3CreateNodeTool,
GNS3LinkTool,
GNS3PacketFilterTool,
GNS3StartNodeTool,
GNS3StopNodeTool,
GNS3SuspendNodeTool,
GNS3TemplateTool,
GNS3UpdateNodeNameTool,
GNS3WaitTool,
PacketAnalysisTool,
)
from gns3server.agent.gns3_copilot.tools_v2 import GNS3CreateNodeTool
from gns3server.agent.gns3_copilot.tools_v2 import GNS3LinkTool
from gns3server.agent.gns3_copilot.tools_v2 import GNS3PacketFilterTool
from gns3server.agent.gns3_copilot.tools_v2 import GNS3StartNodeTool
from gns3server.agent.gns3_copilot.tools_v2 import GNS3StopNodeTool
from gns3server.agent.gns3_copilot.tools_v2 import GNS3SuspendNodeTool
from gns3server.agent.gns3_copilot.tools_v2 import GNS3TemplateTool
from gns3server.agent.gns3_copilot.tools_v2 import GNS3UpdateNodeNameTool
from gns3server.agent.gns3_copilot.tools_v2 import GNS3WaitTool
from gns3server.agent.gns3_copilot.tools_v2.vpcs_tools_netmiko import VPCSCommands
from gns3server.agent.gns3_copilot.tools_v2 import PacketAnalysisTool
from gns3server.agent.gns3_copilot.skills import DeviceSkillsTool
from gns3server.agent.gns3_copilot.skills import InjectionSkillsTool
from gns3server.agent.gns3_copilot.skills import PacketAnalysisSkillsTool
# Set up logger for GNS3-Copilot
logger = logging.getLogger(__name__)
@@ -32,8 +32,7 @@ Configuration is passed directly from the database.
"""
import logging
from typing import Any
from typing import Optional
from typing import Any, Optional
from langchain.chat_models import init_chat_model
@@ -36,11 +36,7 @@ import json
import logging
import os
from datetime import datetime
from typing import Any
from typing import AsyncGenerator
from typing import Dict
from typing import List
from typing import Optional
from typing import Any, AsyncGenerator, Dict, List, Optional
from uuid import uuid4
import aiosqlite
@@ -53,8 +49,6 @@ from gns3server.agent.gns3_copilot.chat_sessions_repository import (
)
from gns3server.agent.gns3_copilot.gns3_client.context_helpers import (
set_current_jwt_token,
)
from gns3server.agent.gns3_copilot.gns3_client.context_helpers import (
set_current_llm_config,
)
from gns3server.agent.gns3_copilot.utils.error_handler import format_error_message
@@ -33,10 +33,7 @@ checkpoint database.
import json
import logging
from datetime import datetime
from typing import Any
from typing import Dict
from typing import List
from typing import Optional
from typing import Any, Dict, List, Optional
import aiosqlite
@@ -47,14 +47,18 @@ The connector is adapted from the upstream gns3fy project
from .api_handlers import build_gns3_ctx
from .connector import Gns3Connector
from .connector_factory import get_gns3_connector
from .connector_factory import get_gns3_connector_with_llm_config
from .connector_factory import get_gns3_server_host
from .connector_factory import get_llm_config
from .context_helpers import get_current_jwt_token
from .context_helpers import get_current_llm_config
from .context_helpers import set_current_jwt_token
from .context_helpers import set_current_llm_config
from .connector_factory import (
get_gns3_connector,
get_gns3_connector_with_llm_config,
get_gns3_server_host,
get_llm_config,
)
from .context_helpers import (
get_current_jwt_token,
get_current_llm_config,
set_current_jwt_token,
set_current_llm_config,
)
from .gns3_project_info import GNS3ProjectInfoTool
from .gns3_topology_reader import GNS3TopologyTool
@@ -47,16 +47,14 @@ Copilot-side callers build the context with :func:`build_gns3_ctx`, which
pulls the request-scoped user JWT from the context variables.
"""
from typing import Any
from concurrent.futures import ThreadPoolExecutor
import hashlib
import logging
from gns3server.services import access_ticket_service
from gns3server.services.access_tickets import DEFAULT_TICKET_TTL
from concurrent.futures import ThreadPoolExecutor
from typing import Any
from gns3server.agent.gns3_copilot.gns3_client.connector import Gns3Connector
from gns3server.services import access_ticket_service
from gns3server.services.access_tickets import DEFAULT_TICKET_TTL
log = logging.getLogger(__name__)
@@ -49,14 +49,13 @@ import logging
from typing import Optional
from uuid import UUID
from gns3server.agent.gns3_copilot.gns3_client.context_helpers import (
get_current_jwt_token,
)
# Local imports
from gns3server.agent.gns3_copilot.gns3_client.connector import (
Gns3Connector,
)
from gns3server.agent.gns3_copilot.gns3_client.context_helpers import (
get_current_jwt_token,
)
logger = logging.getLogger(__name__)
@@ -33,8 +33,7 @@ database.
import asyncio
import logging
from typing import Dict
from typing import Optional
from typing import Dict, Optional
from gns3server.agent.gns3_copilot.agent_service import AgentService
@@ -36,23 +36,23 @@ Directory Structure:
- loader.py # SkillsLoader - YAML/Markdown file loading
"""
from .loader import SkillsLoader
from .manager import SkillsManager
from .registry import (
SKILLS_REGISTRY,
INJECTION_SKILLS_REGISTRY,
get_skill,
get_injection_skill,
SKILLS_REGISTRY,
DeviceSkillsTool,
InjectionSkillsTool,
PacketAnalysisSkillsTool,
set_skills_manager,
get_injection_skill,
get_skill,
get_skills_manager,
reload_injection_skills,
reload_forbidden_commands,
reload_skills_repository,
get_skills_repository_info,
reload_forbidden_commands,
reload_injection_skills,
reload_skills_repository,
set_skills_manager,
)
from .manager import SkillsManager
from .loader import SkillsLoader
__all__ = [
"INJECTION_SKILLS_REGISTRY",
@@ -33,7 +33,7 @@ including Git operations and hot reload of skills.
import logging
import os
from pathlib import Path
from typing import Optional, Dict, Any
from typing import Any, Dict, Optional
try:
import git
@@ -43,6 +43,7 @@ except ImportError:
GIT_AVAILABLE = False
from gns3server.config import Config
from .loader import SkillsLoader
logger = logging.getLogger(__name__)
@@ -183,8 +183,8 @@ def reload_skills_repository() -> dict[str, Any]:
protocols_ok = manager.reload_packet_analysis_protocols()
# Reload forbidden commands (local import to avoid circular dependency)
from gns3server.agent.gns3_copilot.utils.command_filter import reload_forbidden_commands as _reload_fc
from gns3server.agent.gns3_copilot.utils.command_filter import get_forbidden_commands
from gns3server.agent.gns3_copilot.utils.command_filter import reload_forbidden_commands as _reload_fc
_reload_fc()
forbidden_commands = get_forbidden_commands()
@@ -300,8 +300,8 @@ def reload_forbidden_commands() -> dict[str, Any]:
}
"""
try:
from gns3server.agent.gns3_copilot.utils.command_filter import reload_forbidden_commands as _reload
from gns3server.agent.gns3_copilot.utils.command_filter import get_forbidden_commands
from gns3server.agent.gns3_copilot.utils.command_filter import reload_forbidden_commands as _reload
_reload()
commands = get_forbidden_commands()
@@ -58,8 +58,7 @@ from .gns3_create_link import GNS3LinkTool
from .gns3_create_node import GNS3CreateNodeTool
from .gns3_get_node_temp import GNS3TemplateTool
from .gns3_packet_filter import GNS3PacketFilterTool
from .gns3_start_node import GNS3StartNodeQuickTool
from .gns3_start_node import GNS3StartNodeTool
from .gns3_start_node import GNS3StartNodeQuickTool, GNS3StartNodeTool
from .gns3_stop_node import GNS3StopNodeTool
from .gns3_suspend_node import GNS3SuspendNodeTool
from .gns3_update_node_name import GNS3UpdateNodeNameTool
@@ -43,21 +43,18 @@ from langchain_core.callbacks import CallbackManagerForToolRun
from netmiko.exceptions import ReadTimeout
from nornir import InitNornir
from nornir.core import Nornir
from nornir.core.task import AggregatedResult
from nornir.core.task import Result
from nornir.core.task import Task
from nornir.core.task import AggregatedResult, Result, Task
from nornir_netmiko.tasks import netmiko_send_config
from gns3server.agent.gns3_copilot.gns3_client import get_gns3_server_host
from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology
from gns3server.agent.gns3_copilot.utils.command_filter import (
filter_forbidden_commands,
)
# Import custom Netmiko device types for GNS3 emulation
# This registers gns3_huawei_telnet_ce and other custom device types
# NOTE: Must be imported BEFORE any Nornir operations to ensure device types are registered
from gns3server.agent.gns3_copilot.utils import custom_netmiko
from gns3server.agent.gns3_copilot.utils import custom_netmiko, get_device_ports_from_topology
from gns3server.agent.gns3_copilot.utils.command_filter import (
filter_forbidden_commands,
)
# Explicitly register custom device types to ensure they are available
# This is a safety measure in case the auto-registration on import doesn't work
@@ -43,21 +43,18 @@ from langchain_core.callbacks import CallbackManagerForToolRun
from netmiko.exceptions import ReadTimeout
from nornir import InitNornir
from nornir.core import Nornir
from nornir.core.task import AggregatedResult
from nornir.core.task import Result
from nornir.core.task import Task
from nornir.core.task import AggregatedResult, Result, Task
from nornir_netmiko.tasks import netmiko_multiline
from gns3server.agent.gns3_copilot.gns3_client import get_gns3_server_host
from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology
from gns3server.agent.gns3_copilot.utils.command_filter import (
filter_forbidden_commands,
)
# Import custom Netmiko device types for GNS3 emulation
# This registers gns3_huawei_telnet_ce and other custom device types
# NOTE: Must be imported BEFORE any Nornir operations to ensure device types are registered
from gns3server.agent.gns3_copilot.utils import custom_netmiko
from gns3server.agent.gns3_copilot.utils import custom_netmiko, get_device_ports_from_topology
from gns3server.agent.gns3_copilot.utils.command_filter import (
filter_forbidden_commands,
)
# Explicitly register custom device types to ensure they are available
# This is a safety measure in case the auto-registration on import doesn't work
@@ -43,18 +43,15 @@ from langchain_core.callbacks import CallbackManagerForToolRun
from netmiko.exceptions import ReadTimeout
from nornir import InitNornir
from nornir.core import Nornir
from nornir.core.task import AggregatedResult
from nornir.core.task import Result
from nornir.core.task import Task
from nornir.core.task import AggregatedResult, Result, Task
from nornir_netmiko.tasks import netmiko_multiline
from gns3server.agent.gns3_copilot.gns3_client import get_gns3_server_host
from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology
# Import custom Netmiko device types for GNS3 emulation
# This registers gns3_vpcs_telnet and other custom device types
# NOTE: Must be imported BEFORE any Nornir operations to ensure device types are registered
from gns3server.agent.gns3_copilot.utils import custom_netmiko
from gns3server.agent.gns3_copilot.utils import custom_netmiko, get_device_ports_from_topology
# Explicitly register VPCS device type to ensure it is available
try:
@@ -39,9 +39,7 @@ Author: Yue Guobin (岳国宾)
# Import main utility functions
from .error_handler import format_error_message
from .get_gns3_device_port import get_device_ports_from_topology
from .parse_tool_content import format_tool_response
from .parse_tool_content import normalize_tool_response
from .parse_tool_content import parse_tool_content
from .parse_tool_content import format_tool_response, normalize_tool_response, parse_tool_content
# Dynamic version management
try:
@@ -31,8 +31,8 @@ Features:
import os
import sys
from typing import Dict, List, Tuple
from datetime import datetime
from typing import Dict, List, Tuple
def get_netmiko_version() -> str:
@@ -18,10 +18,10 @@ This script tests:
Run with: python test_huawei_ce.py
"""
import os
import sys
import unittest
from unittest.mock import Mock, patch
import os
# Add project root to path using relative path
test_dir = os.path.dirname(os.path.abspath(__file__))
@@ -18,10 +18,10 @@ This script tests:
Run with: python test_ruijie_telnet.py
"""
import os
import sys
import unittest
from unittest.mock import Mock, patch
import os
# Add project root to path using relative path
test_dir = os.path.dirname(os.path.abspath(__file__))
@@ -20,10 +20,10 @@ This script tests:
Run with: python test_vpcs_telnet.py
"""
import os
import sys
import unittest
from unittest.mock import Mock, patch, MagicMock
import os
from unittest.mock import MagicMock, Mock, patch
# Add project root to path using relative path
test_dir = os.path.dirname(os.path.abspath(__file__))
@@ -47,7 +47,6 @@ import time
from netmiko.base_connection import BaseConnection
logger = logging.getLogger(__name__)
# ANSI escape code pattern for stripping terminal formatting codes
@@ -31,8 +31,7 @@ Supports ellipse and rectangle shapes for two-node annotations.
"""
import math
from typing import Any
from typing import Literal
from typing import Any, Literal
# Default parameters
DEFAULT_DEVICE_WIDTH = 50
@@ -43,9 +43,7 @@ Usage:
"""
import logging
from typing import Any
from typing import Dict
from typing import Optional
from typing import Any, Dict, Optional
from uuid import UUID
from fastapi import FastAPI
@@ -31,14 +31,9 @@ Converts between LangChain messages and OpenAI-compatible format.
import json
import uuid
from typing import Any
from typing import Dict
from typing import Any, Dict
from langchain_core.messages import AIMessage
from langchain_core.messages import HumanMessage
from langchain_core.messages import SystemMessage
from langchain_core.messages import ToolCall
from langchain_core.messages import ToolMessage
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage, ToolCall, ToolMessage
def _ensure_string(content: Any) -> str: