feat: remove redundant project attribution comments from GNS3-Copilot modules

Removed repetitive "This module is part of the GNS3-Copilot project" and GitHub URL comments from multiple module docstrings. These comments were redundant since the project information is already established in the main package documentation. This cleanup improves code readability and reduces maintenance overhead by eliminating duplicate attribution statements across the codebase.
This commit is contained in:
YueGuobin 2026-03-05 11:26:54 +08:00
parent d12b2df306
commit 2779734de4
32 changed files with 0 additions and 166 deletions

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3-Copilot - AI-powered network automation assistant for GNS3.
This package provides a command-line interface for launching the GNS3-Copilot

View File

@ -26,8 +26,6 @@ GNS3-Copilot Agent Package
This package contains the main GNS3-Copilot agent implementation for
network automation tasks using LangGraph workflow orchestration.
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
from .gns3_copilot import agent_builder

View File

@ -32,8 +32,6 @@ including:
- Tool definition token estimation
- Template variable injection for topology info
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
import json
@ -49,7 +47,6 @@ from langchain_core.messages import (
logger = logging.getLogger(__name__)
# ============================================================================
# Constants
# ============================================================================
@ -63,7 +60,6 @@ CONTEXT_STRATEGY_RATIOS = {
DEFAULT_CONTEXT_STRATEGY = "balanced"
# ============================================================================
# Token Counting - Using tiktoken for accuracy
# ============================================================================
@ -71,7 +67,6 @@ DEFAULT_CONTEXT_STRATEGY = "balanced"
# Global tiktoken encoding cache (lazy loading)
_tiktoken_encoding = None
def _get_tiktoken_encoding():
"""
Get tiktoken encoding instance (cached).
@ -98,7 +93,6 @@ def _get_tiktoken_encoding():
)
return _tiktoken_encoding
def count_tokens_accurately(text: str) -> int:
"""
Count tokens in text accurately using tiktoken.
@ -122,7 +116,6 @@ def count_tokens_accurately(text: str) -> int:
logger.error("tiktoken encoding failed: %s", e)
raise
def count_messages_tokens(messages: list[Any]) -> int:
"""
Count total tokens in a list of messages accurately.
@ -144,7 +137,6 @@ def count_messages_tokens(messages: list[Any]) -> int:
total += count_tokens_accurately(content)
return total
# ============================================================================
# Tool Definition Token Estimation
# ============================================================================
@ -208,7 +200,6 @@ def estimate_tool_tokens(tools: list[Any]) -> int:
logger.info("Tool definitions estimated at ~%d total tokens (%d tools)", total_tokens, len(tools))
return total_tokens
# ============================================================================
# Model Context Limits
# ============================================================================
@ -227,7 +218,6 @@ def estimate_tool_tokens(tools: list[Any]) -> int:
#
# Always verify current limits from official provider documentation.
def get_model_context_limit(
model_name: str,
llm_config: dict[str, Any] | None = None
@ -277,7 +267,6 @@ def get_model_context_limit(
f"Refer to the model provider's documentation for the current context window size."
)
def calculate_max_tokens(
model_limit: int,
strategy: Literal["conservative", "balanced", "aggressive"] = DEFAULT_CONTEXT_STRATEGY
@ -305,7 +294,6 @@ def calculate_max_tokens(
return max_tokens
# ============================================================================
# Message Trimming
# ============================================================================
@ -414,7 +402,6 @@ def trim_messages_for_context(
return trimmed
def _trim_to_token_limit(messages: list[Any], max_tokens: int) -> list[Any]:
"""
Trim messages to fit within token limit using tiktoken.
@ -448,7 +435,6 @@ def _trim_to_token_limit(messages: list[Any], max_tokens: int) -> list[Any]:
return trimmed
# ============================================================================
# Token Usage Summary
# ============================================================================
@ -504,7 +490,6 @@ def get_token_usage_summary(
"needs_trimming": usage_percentage > 80,
}
# ============================================================================
# Main Entry Point - Context Preparation with Template Injection
# ============================================================================
@ -634,7 +619,6 @@ def prepare_context_messages(
return trimmed_messages
# ============================================================================
# Module Test
# ============================================================================

View File

@ -35,8 +35,6 @@ The agent provides:
- Automatic conversation title generation
- Integration with GNS3 topology management
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
import operator
@ -101,7 +99,6 @@ DEFAULT_CONVERSATION_TITLE = "New Conversation"
UNTITLED_SESSION_FALLBACK = "Untitled Session"
TITLE_MAX_LENGTH = 40
# Define state
class MessagesState(TypedDict):
"""
@ -130,7 +127,6 @@ class MessagesState(TypedDict):
# Store GNS3 topology information
topology_info: dict | None
# Define llm call node
def llm_call(state: dict, config: RunnableConfig | None = None):
"""LLM decides whether to call a tool or not"""
@ -232,7 +228,6 @@ def llm_call(state: dict, config: RunnableConfig | None = None):
"topology_info": topology_info,
}
# Define generate title node
def generate_title(state: MessagesState, config: RunnableConfig | None = None) -> dict:
"""
@ -317,7 +312,6 @@ def generate_title(state: MessagesState, config: RunnableConfig | None = None) -
# Title already exists → no update needed
return {}
# Define tool node
def tool_node(state: dict, config: RunnableConfig | None = None):
"""Performs the tool call"""
@ -344,7 +338,6 @@ def tool_node(state: dict, config: RunnableConfig | None = None):
))
return {"messages": result}
# Routing logic after the LLM node
def should_continue(
state: MessagesState,
@ -370,7 +363,6 @@ def should_continue(
# Normal completion (multi-turn conversation or title already exists)
return END
# Routing logic after the tool node, Check remaining_steps
def recursion_limit_continue(state: MessagesState) -> Literal["llm_call", END]:
"""
@ -397,7 +389,6 @@ def recursion_limit_continue(state: MessagesState) -> Literal["llm_call", END]:
return END
# Build and compile the agent
# Build workflow
agent_builder = StateGraph(MessagesState)

View File

@ -26,8 +26,6 @@ Model Factory for GNS3-Copilot Agent
This module provides factory functions to create fresh LLM model instances.
Configuration is passed directly from the database.
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
import logging
@ -37,7 +35,6 @@ from langchain.chat_models import init_chat_model
logger = logging.getLogger(__name__)
def _load_llm_config(
llm_config: Optional[dict[str, Any]] = None,
) -> dict[str, str]:
@ -70,7 +67,6 @@ def _load_llm_config(
"temperature": str(llm_config.get("temperature", "0")),
}
def create_base_model(
llm_config: Optional[dict[str, Any]] = None,
) -> Any:
@ -124,7 +120,6 @@ def create_base_model(
logger.error("Failed to create base model: %s", e)
raise RuntimeError(f"Failed to create base model: {e}") from e
def create_title_model(
llm_config: Optional[dict[str, Any]] = None,
) -> Any:
@ -180,7 +175,6 @@ def create_title_model(
logger.error("Failed to create title model: %s", e)
raise RuntimeError(f"Failed to create title model: {e}") from e
def create_model_with_tools(
model: Any,
tools: list[Any],
@ -206,7 +200,6 @@ def create_model_with_tools(
logger.error("Failed to bind tools to model: %s", e)
raise RuntimeError(f"Failed to bind tools to model: {e}") from e
def create_base_model_with_tools(
tools: list[Any],
llm_config: Optional[dict[str, Any]] = None,

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3 Copilot Agent Service
Provides project-level Agent instances with SQLite checkpoint management.
@ -48,7 +46,6 @@ from gns3server.agent.gns3_copilot.utils.message_converters import convert_langc
log = logging.getLogger(__name__)
class AgentService:
"""
Project-level Agent Service with async checkpoint management.

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
Chat Sessions Repository for managing chat session data.
Provides CRUD operations for the chat_sessions table in the project's
@ -39,7 +37,6 @@ import aiosqlite
log = logging.getLogger(__name__)
class ChatSession:
"""Chat session model."""
@ -100,7 +97,6 @@ class ChatSession:
"pinned": self.pinned,
}
class ChatSessionsRepository:
"""
Repository for managing chat sessions in the checkpoint database.

View File

@ -41,9 +41,6 @@ Main functions:
- get_gns3_server_host: Get GNS3 server hostname from Controller or Config
- get_llm_config: Get LLM model configuration for a user
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
Upstream gns3fy: https://github.com/davidban77/gns3fy
"""

View File

@ -32,8 +32,6 @@ Features:
- Fallback URL strategy for flexible deployment
- LLM configuration retrieval for users
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
import logging
@ -47,13 +45,11 @@ logger = logging.getLogger(__name__)
_jwt_token_context: ContextVar[Optional[str]] = ContextVar("_jwt_token_context", default=None)
_llm_config_context: ContextVar[Optional[dict]] = ContextVar("_llm_config_context", default=None)
def set_current_jwt_token(token: str) -> None:
"""Set the JWT token for the current request context."""
_jwt_token_context.set(token)
logger.debug("JWT token set in context")
def get_current_jwt_token() -> Optional[str]:
"""Get the JWT token for the current request context."""
token = _jwt_token_context.get()
@ -63,14 +59,12 @@ def get_current_jwt_token() -> Optional[str]:
logger.warning("JWT token not found in context")
return token
def set_current_llm_config(config: dict) -> None:
"""Set the LLM config for the current request context."""
_llm_config_context.set(config)
logger.debug("LLM config set in context: provider=%s, model=%s",
config.get("provider"), config.get("model"))
def get_current_llm_config() -> Optional[dict]:
"""Get the LLM config for the current request context."""
config = _llm_config_context.get()
@ -87,7 +81,6 @@ from gns3server.agent.gns3_copilot.gns3_client.custom_gns3fy import Gns3Connecto
# Fallback default URL
DEFAULT_GNS3_URL = "http://127.0.0.1:3080"
def _get_url_from_controller() -> Optional[str]:
"""Try to get GNS3 server URL from running Controller instance.
@ -122,7 +115,6 @@ def _get_url_from_controller() -> Optional[str]:
logger.warning("Unexpected error getting URL from Controller: %s", str(e))
return None
def _get_url_from_config() -> Optional[str]:
"""Try to get GNS3 server URL from Config settings.
@ -152,7 +144,6 @@ def _get_url_from_config() -> Optional[str]:
logger.warning("Unexpected error getting URL from Config: %s", str(e))
return None
def get_gns3_connector(jwt_token: Optional[str] = None, url: Optional[str] = None) -> Optional[Gns3Connector]:
"""Create and return a Gns3Connector instance with JWT authentication.
@ -239,7 +230,6 @@ def get_gns3_connector(jwt_token: Optional[str] = None, url: Optional[str] = Non
logger.error("Failed to create Gns3Connector: %s", str(e), exc_info=True)
return None
async def get_gns3_connector_with_llm_config(
user_id,
jwt_token: str,
@ -327,7 +317,6 @@ async def get_gns3_connector_with_llm_config(
logger.error(f"Failed to get GNS3 connector with LLM config: {e}", exc_info=True)
return None
def _detect_url_for_api() -> Optional[str]:
"""
Detect GNS3 server URL for API calls.
@ -358,7 +347,6 @@ def _detect_url_for_api() -> Optional[str]:
logger.debug("Using fallback URL for API call: %s", DEFAULT_GNS3_URL)
return DEFAULT_GNS3_URL
def get_gns3_server_host() -> str:
"""
Get GNS3 server hostname from Controller or Config.
@ -395,7 +383,6 @@ def get_gns3_server_host() -> str:
logger.warning("Failed to extract host from URL %s: %s, using fallback", url, e)
return DEFAULT_GNS3_URL.split("://")[1].split(":")[0]
def get_llm_config(user_id, jwt_token: str, app=None) -> Optional[dict]:
"""
Get LLM model configuration for a user.

View File

@ -35,9 +35,6 @@ Modifications made for GNS3-Copilot:
Note: This file is adapted from upstream gns3fy for compatibility with
GNS3-Copilot's architecture.
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
Upstream: https://github.com/davidban77/gns3fy
"""
@ -68,7 +65,6 @@ F = TypeVar("F", bound=Callable[..., Any])
config = ConfigDict(validate_assignment=True, extra="ignore")
NODE_TYPES = [
"cloud",
"nat",
@ -99,7 +95,6 @@ CONSOLE_TYPES = [
LINK_TYPES = ["ethernet", "serial"]
class Gns3Connector:
"""
Connector to be use for interaction against GNS3 server controller API.
@ -730,7 +725,6 @@ class Gns3Connector:
return cast(dict[str, Any], _response_data)
def verify_connector_and_id(f: F) -> F:
"""
Main checker for connector object and respective object's ID for their retrieval
@ -773,7 +767,6 @@ def verify_connector_and_id(f: F) -> F:
return cast(F, wrapper)
@dataclass(config=config)
class Link:
"""
@ -973,7 +966,6 @@ class Link:
# Update object
self._update(_response.json())
@dataclass(config=config)
class Node:
"""
@ -1501,7 +1493,6 @@ class Node:
_conn.http_call("post", _url, data=data)
@dataclass(config=config)
class Project:
"""

View File

@ -27,8 +27,6 @@ This module provides a LangChain BaseTool to retrieve basic information of a
specific GNS3 project by project ID. Returns project name, status, node count,
and link count.
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
import logging
@ -41,7 +39,6 @@ from gns3server.agent.gns3_copilot.gns3_client import Project, get_gns3_connecto
# Configure logging
logger = logging.getLogger(__name__)
class GNS3ProjectInfoTool(BaseTool):
"""LangChain tool for retrieving GNS3 project basic information."""
@ -133,7 +130,6 @@ class GNS3ProjectInfoTool(BaseTool):
logger.error("Error retrieving GNS3 project info: %s", str(e))
return {"error": f"Failed to retrieve project info: {str(e)}"}
if __name__ == "__main__":
from pprint import pprint

View File

@ -26,8 +26,6 @@ GNS3 Topology Reader Tool
This module provides a LangChain BaseTool to retrieve the topology of a
specific GNS3 project by project ID. Returns nodes, links, and project metadata.
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
import copy
@ -41,7 +39,6 @@ from gns3server.agent.gns3_copilot.gns3_client import Project, get_gns3_connecto
# Configure logging
logger = logging.getLogger(__name__)
# Define LangChain tool class
class GNS3TopologyTool(BaseTool):
"""LangChain tool for retrieving GNS3 project topology information."""
@ -143,7 +140,6 @@ class GNS3TopologyTool(BaseTool):
]
return data
if __name__ == "__main__":
from pprint import pprint

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
Project Agent Manager
Manages AgentService instances for GNS3 projects using a singleton pattern.
@ -37,7 +35,6 @@ from gns3server.agent.gns3_copilot.agent_service import AgentService
log = logging.getLogger(__name__)
class ProjectAgentManager:
"""
Singleton manager for project-level Agent services.
@ -124,12 +121,10 @@ class ProjectAgentManager:
"""
return list(self._agents.keys())
# Global singleton instance
_project_agent_manager: Optional[ProjectAgentManager] = None
_manager_lock = asyncio.Lock()
async def get_project_agent_manager() -> ProjectAgentManager:
"""
Get the global ProjectAgentManager singleton instance.

View File

@ -26,8 +26,6 @@ Prompts Module for GNS3-Copilot
This package contains system prompts and prompt loading utilities for
the GNS3-Copilot AI agent.
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
from .base_prompt import SYSTEM_PROMPT

View File

@ -28,8 +28,6 @@ to guide network diagnostics and teaching activities.
CRITICAL: This assistant has DIAGNOSIS permissions only, NO configuration permissions.
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
# System prompt for LangChain v1.0 agent

View File

@ -27,8 +27,6 @@ This module provides utilities for loading system prompts.
Can be extended to support multiple prompt variants based on
environment variables (e.g., ENGLISH_LEVEL).
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
import logging
@ -38,7 +36,6 @@ from .base_prompt import SYSTEM_PROMPT
logger = logging.getLogger(__name__)
def load_system_prompt() -> str:
"""
Load the system prompt for GNS3-Copilot.

View File

@ -26,8 +26,6 @@ Title Generation Prompt for GNS3-Copilot
Prompt template for generating conversation titles.
Generates concise Chinese or English titles based on conversation language.
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
"""
TITLE_PROMPT = """

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3-Copilot Tools Package
This package provides various tools for interacting with GNS3 network simulator, including:

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
This module provides a tool to execute configuration commands on multiple devices
in a GNS3 topology using Nornir.
"""
@ -47,13 +45,11 @@ from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology
# config log
logger = logging.getLogger(__name__)
# Local Nornir configuration functions for Cisco IOS Telnet devices
def _get_nornir_defaults() -> dict[str, Any]:
"""Get Nornir default configuration for Cisco IOS."""
return {"data": {"location": "gns3"}}
def _get_nornir_groups_config() -> dict[str, dict[str, Any]]:
"""Get Nornir groups configuration for Cisco IOS Telnet devices."""
return {
@ -69,13 +65,11 @@ def _get_nornir_groups_config() -> dict[str, dict[str, Any]]:
},
}
def _get_nornir_group(group_name: str = "cisco_IOSv_telnet") -> dict[str, Any]:
"""Get Nornir group configuration for a specific group."""
all_groups = _get_nornir_groups_config()
return all_groups.get(group_name, {})
class ExecuteMultipleDeviceConfigCommands(BaseTool):
"""
A tool to execute configuration commands on multiple devices in a GNS3 topology using Nornir.
@ -481,7 +475,6 @@ class ExecuteMultipleDeviceConfigCommands(BaseTool):
return results
if __name__ == "__main__":
# Example usage with new format
# example tool_input with project_id

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
This module provides a tool to execute display commands on multiple devices
in a GNS3 topology using Nornir.
"""
@ -48,13 +46,11 @@ from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology
# config log
logger = logging.getLogger(__name__)
# Local Nornir configuration functions for Cisco IOS Telnet devices
def _get_nornir_defaults() -> dict[str, Any]:
"""Get Nornir default configuration for Cisco IOS."""
return {"data": {"location": "gns3"}}
def _get_nornir_groups_config() -> dict[str, dict[str, Any]]:
"""Get Nornir groups configuration for Cisco IOS Telnet devices."""
return {
@ -70,13 +66,11 @@ def _get_nornir_groups_config() -> dict[str, dict[str, Any]]:
},
}
def _get_nornir_group(group_name: str = "cisco_IOSv_telnet") -> dict[str, Any]:
"""Get Nornir group configuration for a specific group."""
all_groups = _get_nornir_groups_config()
return all_groups.get(group_name, {})
class ExecuteMultipleDeviceCommands(BaseTool):
"""
A READ-ONLY diagnostic tool for viewing network device configurations and protocol states.
@ -495,7 +489,6 @@ class ExecuteMultipleDeviceCommands(BaseTool):
return results
if __name__ == "__main__":
# Example usage with new format
device_commands = json.dumps(

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3 link creation tool for connecting network nodes.
Provides functionality to create links between nodes in GNS3 projects
@ -42,7 +40,6 @@ from gns3server.agent.gns3_copilot.gns3_client import Link, get_gns3_connector
# Configure logging
logger = logging.getLogger(__name__)
class GNS3LinkTool(BaseTool):
"""
Tool for creating network links between GNS3 nodes.
@ -249,7 +246,6 @@ class GNS3LinkTool(BaseTool):
logger.error("Failed to process link creation: %s", e)
return [{"error": f"Failed to process link creation: {str(e)}"}]
if __name__ == "__main__":
# Test with single link
single_link_input = json.dumps(

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3 node creation tool for network topology building.
Provides functionality to create multiple nodes in GNS3 projects
@ -42,7 +40,6 @@ from gns3server.agent.gns3_copilot.gns3_client import Node, get_gns3_connector
# Configure logging
logger = logging.getLogger(__name__)
class GNS3CreateNodeTool(BaseTool):
"""
A LangChain tool to create multiple nodes in a GNS3 project
@ -267,7 +264,6 @@ class GNS3CreateNodeTool(BaseTool):
logger.error("Failed to process node creation request: %s", e)
return {"error": f"Failed to process node creation request: {str(e)}"}
if __name__ == "__main__":
# Test the tool locally with multiple nodes
test_input = json.dumps(

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3 template retrieval tool for device discovery.
Provides functionality to retrieve all available device templates
@ -42,7 +40,6 @@ from gns3server.agent.gns3_copilot.gns3_client import get_gns3_connector
# Configure logging
logger = logging.getLogger(__name__)
class GNS3TemplateTool(BaseTool):
"""
A LangChain tool to retrieve all available device templates from a GNS3 server.
@ -133,7 +130,6 @@ class GNS3TemplateTool(BaseTool):
)
return {"error": f"Failed to retrieve templates: {str(e)}"}
if __name__ == "__main__":
# Test's tool locally
tool = GNS3TemplateTool()

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3 node startup tool for network device activation.
Provides functionality to start one or multiple nodes in GNS3 projects
@ -43,7 +41,6 @@ from gns3server.agent.gns3_copilot.gns3_client import Node, get_gns3_connector
# Configure logging
logger = logging.getLogger(__name__)
def show_progress_bar(
duration: int = 120, interval: int = 1, node_count: int = 1
) -> None:
@ -73,7 +70,6 @@ def show_progress_bar(
print(f"\n{node_count} node(s) startup completed!")
class GNS3StartNodeTool(BaseTool):
"""
A LangChain tool to start one or multiple nodes in a GNS3 project.
@ -224,7 +220,6 @@ class GNS3StartNodeTool(BaseTool):
logger.error("Failed to start nodes: %s", e)
return {"error": f"Failed to start nodes: {str(e)}"}
class GNS3StartNodeQuickTool(BaseTool):
"""
A LangChain tool to start one or multiple nodes in a GNS3 project WITHOUT waiting.
@ -373,7 +368,6 @@ class GNS3StartNodeQuickTool(BaseTool):
logger.error("Failed to start nodes: %s", e)
return {"error": f"Failed to start nodes: {str(e)}"}
if __name__ == "__main__":
# Test with single node
print("=== Testing single node startup ===")

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3 node name update tool for renaming network devices.
Provides functionality to update the name of one or multiple nodes in GNS3 projects.
@ -41,7 +39,6 @@ from gns3server.agent.gns3_copilot.gns3_client import Node, get_gns3_connector
# Configure logging
logger = logging.getLogger(__name__)
class GNS3UpdateNodeNameTool(BaseTool):
"""
A LangChain tool to update the name of one or multiple nodes in a GNS3 project.
@ -205,7 +202,6 @@ class GNS3UpdateNodeNameTool(BaseTool):
logger.error("Failed to update node names: %s", e)
return {"error": f"Failed to update node names: {str(e)}"}
if __name__ == "__main__":
# Test with single node
print("=== Testing single node name update ===")

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
Multi-device VPCS command execution tool using telnetlib3 with threading.
Supports concurrent execution of multiple command groups across multiple VPCS devices.
"""
@ -44,7 +42,6 @@ from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology
logger = logging.getLogger(__name__)
class VPCSMultiCommands(BaseTool):
"""
A tool for VPCS (Virtual PC Simulator) devices to view PC configurations and test connectivity.
@ -426,7 +423,6 @@ class VPCSMultiCommands(BaseTool):
return results
if __name__ == "__main__":
# Example usage
command_groups = json.dumps(

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
GNS3-Copilot Public Model Package
This package provides reusable public models and utilities for GNS3 network automation tasks.
@ -55,7 +53,6 @@ __author__ = "Guobin Yue"
__description__ = "AI-powered network automation assistant for GNS3"
__url__ = "https://github.com/yueguobin/gns3-copilot"
# Export main utility functions
__all__ = [
"get_device_ports_from_topology",

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
Public module for getting device port information from GNS3 topology
"""
@ -31,7 +29,6 @@ from typing import Any
logger = logging.getLogger(__name__)
def get_device_ports_from_topology(
device_names: list[str],
project_id: str | None = None,

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
Drawing utility functions for GNS3 area annotations.
Calculates drawing parameters and generates SVG content for network area annotations.
@ -102,7 +100,6 @@ COLOR_SCHEMES = {
},
}
def calculate_two_node_shape(
node1: dict,
node2: dict,
@ -241,7 +238,6 @@ def calculate_two_node_shape(
"metadata": metadata,
}
def generate_ellipse_svg(
rx: int,
ry: int,
@ -252,7 +248,6 @@ def generate_ellipse_svg(
"""Generate SVG for ellipse."""
return f'''<svg width="{svg_width}" height="{svg_height}"><ellipse cx="{rx}" cy="{ry}" rx="{rx}" ry="{ry}" fill="{color_scheme["fill"]}" fill-opacity="{color_scheme["fill_opacity"]}"/></svg>'''
def generate_rectangle_svg(
width: int,
height: int,
@ -261,7 +256,6 @@ def generate_rectangle_svg(
"""Generate SVG for rectangle."""
return f'''<svg width="{width}" height="{height}"><rect x="0" y="0" width="{width}" height="{height}" fill="{color_scheme["fill"]}" fill-opacity="{color_scheme["fill_opacity"]}"/></svg>'''
def generate_text_svg(text: str, color_scheme: dict[str, Any]) -> str:
"""Generate SVG for text label."""
text_width = len(text) * 8 + 20
@ -269,7 +263,6 @@ def generate_text_svg(text: str, color_scheme: dict[str, Any]) -> str:
return f'''<svg width="{text_width}" height="{text_height}"><text font-family="TypeWriter" font-size="{DEFAULT_FONT_SIZE}.0" font-weight="bold" fill="{color_scheme["stroke"]}" text-anchor="middle" x="{text_width / 2}" y="{text_height / 2 + 4}">{text}</text></svg>'''
def _hsv_to_hex(h: int, s: int, v: int) -> str:
"""Convert HSV to HEX color."""
h_norm = (h % 360) / 360
@ -303,7 +296,6 @@ def _hsv_to_hex(h: int, s: int, v: int) -> str:
return f"#{r:02x}{g:02x}{b:02x}"
def calculate_z_order(area_size: float) -> int:
"""
Calculate z-order based on area size for proper layering.
@ -321,7 +313,6 @@ def calculate_z_order(area_size: float) -> int:
else:
return 3
def _get_color_scheme(area_name: str) -> dict[str, Any]:
"""
Get color scheme based on area name using keyword inference.
@ -410,7 +401,6 @@ def _get_color_scheme(area_name: str) -> dict[str, Any]:
return COLOR_SCHEMES["DEFAULT"]
def calculate_two_node_ellipse(
node1: dict,
node2: dict,
@ -431,7 +421,6 @@ def calculate_two_node_ellipse(
"metadata": result["metadata"],
}
def calculate_two_node_rectangle(
node1: dict,
node2: dict,

View File

@ -21,8 +21,6 @@
#
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
LLM Model Configuration Helper for GNS3 Copilot
This module provides utility functions to retrieve LLM model configurations
@ -47,7 +45,6 @@ from fastapi import FastAPI
logger = logging.getLogger(__name__)
async def get_user_llm_config_with_app(
user_id: UUID,
app: FastAPI

View File

@ -17,8 +17,6 @@
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
Message format converters for OpenAI-compatible message format.
Converts between LangChain messages and OpenAI-compatible format.
"""
@ -27,7 +25,6 @@ import uuid
from datetime import datetime
from typing import Dict, Any
def _ensure_string(content: Any) -> str:
"""Ensure content is a string, converting dicts/lists to JSON if needed."""
if isinstance(content, str):
@ -37,7 +34,6 @@ def _ensure_string(content: Any) -> str:
else:
return str(content)
def convert_langchain_to_openai(lc_message) -> Dict[str, Any]:
"""
Convert LangChain message to OpenAI-compatible format.
@ -126,7 +122,6 @@ def convert_langchain_to_openai(lc_message) -> Dict[str, Any]:
"content": str(lc_message)
}
def convert_openai_to_langchain(msg: Dict[str, Any]):
"""
Convert OpenAI-compatible format to LangChain message.
@ -175,7 +170,6 @@ def convert_openai_to_langchain(msg: Dict[str, Any]):
# Fallback to HumanMessage for unknown roles
return HumanMessage(content=content)
def convert_stream_event_to_openai(event: Dict[str, Any]) -> Dict[str, Any]:
"""
Convert LangGraph streaming event to OpenAI-compatible format.

View File

@ -60,9 +60,6 @@ Standard Tool Response Format:
Author: Guobin Yue
"""
This module is part of the GNS3-Copilot project.
GitHub: https://github.com/yueguobin/gns3-copilot
import ast
import json
import logging
@ -70,7 +67,6 @@ from typing import Any
logger = logging.getLogger(__name__)
def parse_tool_content(
content: str | dict | list | int | float | bool | None,
fallback_to_raw: bool = True,
@ -227,7 +223,6 @@ def parse_tool_content(
logger.info("Returning error: %s", result)
return result
def format_tool_response(
content: str | dict | list | int | float | bool | None, indent: int = 2
) -> str:
@ -277,7 +272,6 @@ def format_tool_response(
logger.info("format_tool_response returning error: %s", result)
return result
def normalize_tool_response(
response: dict | list | str,
tool_name: str = "unknown"
@ -456,7 +450,6 @@ def normalize_tool_response(
"metadata": metadata
}
# Test function to verify the implementation
def _test_parse_tool_content() -> None:
"""Test function to verify parse_tool_content works correctly with all input types"""
@ -515,6 +508,5 @@ def _test_parse_tool_content() -> None:
valid = ""
print(f"Format Test {i + 1}: {valid} Input: {repr(input_data)} -> {result}")
if __name__ == "__main__":
_test_parse_tool_content()