diff --git a/gns3server/agent/gns3_copilot/agent/gns3_copilot.py b/gns3server/agent/gns3_copilot/agent/gns3_copilot.py index f8271a287..f941cfad1 100644 --- a/gns3server/agent/gns3_copilot/agent/gns3_copilot.py +++ b/gns3server/agent/gns3_copilot/agent/gns3_copilot.py @@ -43,17 +43,17 @@ from typing_extensions import TypedDict import logging -from gns3_copilot.agent.model_factory import ( +from gns3server.agent.gns3_copilot.agent.model_factory import ( create_base_model_with_tools, create_title_model, ) -from gns3_copilot.gns3_client import GNS3TopologyTool -from gns3_copilot.prompts import TITLE_PROMPT, load_system_prompt +from gns3server.agent.gns3_copilot.gns3_client import GNS3TopologyTool +from gns3server.agent.gns3_copilot.prompts import TITLE_PROMPT, load_system_prompt import sys from pathlib import Path # Add backend to path for prompt_manager sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / "backend")) -from gns3_copilot.tools_v2 import ( +from gns3server.agent.gns3_copilot.tools_v2 import ( ExecuteMultipleDeviceCommands, GNS3CreateNodeTool, GNS3LinkTool, diff --git a/gns3server/agent/gns3_copilot/agent/model_factory.py b/gns3server/agent/gns3_copilot/agent/model_factory.py index 6467a055e..17354b42b 100644 --- a/gns3server/agent/gns3_copilot/agent/model_factory.py +++ b/gns3server/agent/gns3_copilot/agent/model_factory.py @@ -12,7 +12,7 @@ from uuid import UUID from langchain.chat_models import init_chat_model -from gns3_copilot.gns3_client import get_llm_config +from gns3server.agent.gns3_copilot.gns3_client import get_llm_config logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/agent_service.py b/gns3server/agent/gns3_copilot/agent_service.py index c1c288771..410a5a00a 100644 --- a/gns3server/agent/gns3_copilot/agent_service.py +++ b/gns3server/agent/gns3_copilot/agent_service.py @@ -16,7 +16,7 @@ import aiosqlite from langchain_core.messages import HumanMessage, AIMessage, ToolMessage from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver -from gns3_copilot.agent.gns3_copilot import agent_builder +from gns3server.agent.gns3_copilot.agent.gns3_copilot import agent_builder log = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/gns3_client/connector_factory.py b/gns3server/agent/gns3_copilot/gns3_client/connector_factory.py index d817d265a..659cb88c1 100644 --- a/gns3server/agent/gns3_copilot/gns3_client/connector_factory.py +++ b/gns3server/agent/gns3_copilot/gns3_client/connector_factory.py @@ -14,7 +14,7 @@ Main Functions: get_gns3_connector: Create a Gns3Connector with JWT token Example: - from gns3_copilot.gns3_client import get_gns3_connector + from gns3server.agent.gns3_copilot.gns3_client import get_gns3_connector # Auto-detect URL from Controller or Config connector = get_gns3_connector(jwt_token="your_token") @@ -29,7 +29,7 @@ Authentication: import logging from typing import Optional -from gns3_copilot.gns3_client.custom_gns3fy import Gns3Connector +from gns3server.agent.gns3_copilot.gns3_client.custom_gns3fy import Gns3Connector logger = logging.getLogger(__name__) @@ -241,7 +241,7 @@ async def get_gns3_connector_with_llm_config( url = _detect_url_for_api() # Step 3: Get LLM config - from gns3_copilot.utils.llm_config_helper import get_user_llm_config + from gns3server.agent.gns3_copilot.utils.llm_config_helper import get_user_llm_config llm_config = await get_user_llm_config( user_id=user_id, @@ -316,7 +316,7 @@ def get_gns3_server_host() -> str: Hostname/IP address string Example: - from gns3_copilot.gns3_client import get_gns3_server_host + from gns3server.agent.gns3_copilot.gns3_client import get_gns3_server_host host = get_gns3_server_host() print(f"GNS3 server host: {host}") @@ -353,7 +353,7 @@ def get_llm_config(user_id, jwt_token: str) -> Optional[dict]: or None if not found. Example: - from gns3_copilot.gns3_client import get_llm_config + from gns3server.agent.gns3_copilot.gns3_client import get_llm_config config = get_llm_config(user_id, jwt_token) if config: @@ -372,7 +372,7 @@ def get_llm_config(user_id, jwt_token: str) -> Optional[dict]: url = _detect_url_for_api() # Import the async helper - from gns3_copilot.utils.llm_config_helper import get_user_llm_config + from gns3server.agent.gns3_copilot.utils.llm_config_helper import get_user_llm_config # Run async function in sync context loop = asyncio.get_event_loop() diff --git a/gns3server/agent/gns3_copilot/gns3_client/gns3_topology_reader.py b/gns3server/agent/gns3_copilot/gns3_client/gns3_topology_reader.py index c9d094433..939144133 100644 --- a/gns3server/agent/gns3_copilot/gns3_client/gns3_topology_reader.py +++ b/gns3server/agent/gns3_copilot/gns3_client/gns3_topology_reader.py @@ -9,7 +9,7 @@ from typing import Any from langchain.tools import BaseTool -from gns3_copilot.gns3_client import Project, get_gns3_connector +from gns3server.agent.gns3_copilot.gns3_client import Project, get_gns3_connector # Configure logging logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py b/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py index 762c73b7e..496536daf 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py +++ b/gns3server/agent/gns3_copilot/tools_v2/config_tools_nornir.py @@ -8,7 +8,7 @@ import logging import os from typing import Any -from gns3_copilot.gns3_client import get_gns3_server_host +from gns3server.agent.gns3_copilot.gns3_client import get_gns3_server_host from langchain.tools import BaseTool from langchain_core.callbacks import CallbackManagerForToolRun @@ -18,7 +18,7 @@ from nornir.core import Nornir from nornir.core.task import AggregatedResult, Result, Task from nornir_netmiko.tasks import netmiko_send_config -from gns3_copilot.utils import get_device_ports_from_topology +from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology # config log logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py b/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py index 35f4ea10e..c7ce08404 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py +++ b/gns3server/agent/gns3_copilot/tools_v2/display_tools_nornir.py @@ -9,7 +9,7 @@ import os import re from typing import Any -from gns3_copilot.gns3_client import get_gns3_server_host +from gns3server.agent.gns3_copilot.gns3_client import get_gns3_server_host from langchain.tools import BaseTool from langchain_core.callbacks import CallbackManagerForToolRun @@ -19,7 +19,7 @@ from nornir.core import Nornir from nornir.core.task import AggregatedResult, Result, Task from nornir_netmiko.tasks import netmiko_multiline -from gns3_copilot.utils import get_device_ports_from_topology +from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology # config log logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_create_link.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_create_link.py index 206455e82..556e9efd9 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_create_link.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_create_link.py @@ -13,7 +13,7 @@ from typing import Any from langchain.tools import BaseTool from langchain_core.callbacks import CallbackManagerForToolRun -from gns3_copilot.gns3_client import Link, get_gns3_connector +from gns3server.agent.gns3_copilot.gns3_client import Link, get_gns3_connector # Configure logging logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_create_node.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_create_node.py index c7e53418d..82b9a35d6 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_create_node.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_create_node.py @@ -13,7 +13,7 @@ from typing import Any from langchain.tools import BaseTool from langchain_core.callbacks import CallbackManagerForToolRun -from gns3_copilot.gns3_client import Node, get_gns3_connector +from gns3server.agent.gns3_copilot.gns3_client import Node, get_gns3_connector # Configure logging logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_get_node_temp.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_get_node_temp.py index ae8370621..88bf62862 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_get_node_temp.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_get_node_temp.py @@ -13,7 +13,7 @@ from typing import Any from langchain.tools import BaseTool from langchain_core.callbacks import CallbackManagerForToolRun -from gns3_copilot.gns3_client import get_gns3_connector +from gns3server.agent.gns3_copilot.gns3_client import get_gns3_connector # Configure logging logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_start_node.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_start_node.py index 1b556c110..4a539d0fc 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_start_node.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_start_node.py @@ -14,7 +14,7 @@ from typing import Any from langchain.tools import BaseTool from langchain_core.callbacks import CallbackManagerForToolRun -from gns3_copilot.gns3_client import Node, get_gns3_connector +from gns3server.agent.gns3_copilot.gns3_client import Node, get_gns3_connector # Configure logging logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/tools_v2/gns3_update_node_name.py b/gns3server/agent/gns3_copilot/tools_v2/gns3_update_node_name.py index b0bb45113..983ef5f51 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/gns3_update_node_name.py +++ b/gns3server/agent/gns3_copilot/tools_v2/gns3_update_node_name.py @@ -12,7 +12,7 @@ from typing import Any from langchain.tools import BaseTool from langchain_core.callbacks import CallbackManagerForToolRun -from gns3_copilot.gns3_client import Node, get_gns3_connector +from gns3server.agent.gns3_copilot.gns3_client import Node, get_gns3_connector # Configure logging logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_telnetlib3.py b/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_telnetlib3.py index 215cea76d..8d4ea969c 100644 --- a/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_telnetlib3.py +++ b/gns3server/agent/gns3_copilot/tools_v2/vpcs_tools_telnetlib3.py @@ -15,8 +15,8 @@ from langchain.tools import BaseTool from langchain_core.callbacks import CallbackManagerForToolRun from telnetlib3 import Telnet -from gns3_copilot.gns3_client import get_gns3_server_host -from gns3_copilot.utils import get_device_ports_from_topology +from gns3server.agent.gns3_copilot.gns3_client import get_gns3_server_host +from gns3server.agent.gns3_copilot.utils import get_device_ports_from_topology logger = logging.getLogger(__name__) diff --git a/gns3server/agent/gns3_copilot/utils/get_gns3_device_port.py b/gns3server/agent/gns3_copilot/utils/get_gns3_device_port.py index fa2685efb..368b9d7bd 100644 --- a/gns3server/agent/gns3_copilot/utils/get_gns3_device_port.py +++ b/gns3server/agent/gns3_copilot/utils/get_gns3_device_port.py @@ -34,7 +34,7 @@ def get_device_ports_from_topology( try: # Lazy import to avoid circular dependency - from gns3_copilot.gns3_client import GNS3TopologyTool + from gns3server.agent.gns3_copilot.gns3_client import GNS3TopologyTool # Get topology information topo = GNS3TopologyTool() diff --git a/gns3server/agent/gns3_copilot/utils/llm_config_helper.py b/gns3server/agent/gns3_copilot/utils/llm_config_helper.py index 748feb986..3b5df270a 100644 --- a/gns3server/agent/gns3_copilot/utils/llm_config_helper.py +++ b/gns3server/agent/gns3_copilot/utils/llm_config_helper.py @@ -11,7 +11,7 @@ This allows the copilot module to access API keys that are hidden from API respo while leveraging the API's default_config selection logic. Usage: - from gns3_copilot.utils.llm_config_helper import get_user_llm_config + from gns3server.agent.gns3_copilot.utils.llm_config_helper import get_user_llm_config # Get user's default LLM config (with API key) config = get_user_llm_config(user_id, jwt_token, gns3_url) @@ -232,7 +232,7 @@ def _detect_gns3_url() -> Optional[str]: GNS3 server URL, or None if detection failed """ try: - from gns3_copilot.gns3_client.connector_factory import ( + from gns3server.agent.gns3_copilot.gns3_client.connector_factory import ( _get_url_from_controller, _get_url_from_config, DEFAULT_GNS3_URL diff --git a/gns3server/api/routes/controller/chat.py b/gns3server/api/routes/controller/chat.py index 856162b75..093aeebde 100644 --- a/gns3server/api/routes/controller/chat.py +++ b/gns3server/api/routes/controller/chat.py @@ -21,7 +21,7 @@ API routes for GNS3 Copilot Chat integration. import json import logging import uuid -from typing import Optional +from typing import Optional, List from fastapi import APIRouter, Depends, HTTPException, Request, status from fastapi.responses import StreamingResponse diff --git a/gns3server/schemas/__init__.py b/gns3server/schemas/__init__.py index 33f4c7337..843349891 100644 --- a/gns3server/schemas/__init__.py +++ b/gns3server/schemas/__init__.py @@ -39,6 +39,14 @@ from .controller.llm_model_configs import ( LLMModelConfigInheritedResponse, LLMModelConfigListResponse ) +from .controller.chat import ( + OpenAIToolCall, + ChatRequest, + ChatResponse, + OpenAIMessage, + ConversationHistory, + ChatSession +) from .controller.rbac import RoleCreate, RoleUpdate, Role, Privilege, ACECreate, ACEUpdate, ACE from .controller.pools import Resource, ResourceCreate, ResourcePoolCreate, ResourcePoolUpdate, ResourcePool from .controller.tokens import Token