gns3-server/docs/gns3-copilot/implemented/ai-assistant-overview.en.md

5.9 KiB

GNS3-Copilot AI Assistant Overview

Overall Architecture

flowchart TB
    subgraph "Client"
        A["Web UI"] --> B["SSE Streaming"]
    end

    subgraph "FastAPI Route Layer"
        B --> C["POST /chat/stream\nPOST /chat/inject"]
        C --> D["Auth + LLM Config Loading\nSet ContextVars"]
    end

    subgraph "AgentService (Project-level)"
        D --> E["LangGraph Agent\nStateGraph"]
        E --> F["SQLite Checkpointer\ncopilot_checkpoints.db"]
    end

    subgraph "LangGraph Workflow"
        E --> G["llm_call node\nmodel invocation"]
        E --> H["tool_node\ntool execution"]
        E --> I["title_generator_node\nauto title"]
        E --> J["abort_handler_node\ninterrupt handling"]
    end

    subgraph "Three Copilot Modes"
        G --> K["teaching_assistant\ndiagnostic read-only"]
        G --> L["lab_automation_assistant\nfull control"]
        G --> M["troubleshooting_injection\nfault injection"]
    end

    subgraph "LLM Config System"
        D --> N["User configs\nGroup config inheritance\nAPI key encryption"]
    end

API Endpoints

Endpoint Function
POST /v3/projects/{pid}/chat/stream Streaming conversation (SSE), supports three copilot modes
POST /v3/projects/{pid}/chat/inject Fault injection entry, auto-switches to troubleshooting_injection mode
GET /v3/projects/{pid}/chat/sessions List sessions (supports filtering, pagination)
DELETE /v3/projects/{pid}/chat/sessions/{sid} Delete session
PATCH /v3/projects/{pid}/chat/sessions/{sid} Update session (rename, pin)
POST /v3/projects/{pid}/chat/sessions/{sid}/abort Abort an active session

LangGraph Agent Workflow

sequenceDiagram
    participant U as User
    participant API as FastAPI
    participant AS as AgentService
    participant LLM as LLM Node
    participant Tool as Tool Node
    participant TGen as Title Node

    U->>API: send message
    API->>AS: stream_chat()
    AS->>AS: set ContextVars<br/>(jwt_token, llm_config)

    Note over AS,LLM: llm_call node
    AS->>LLM: invoke pre-compiled model
    LLM->>LLM: pre_model_hook<br/>inject topology + trim context
    LLM-->>AS: AI reply (may include tool_calls)

    opt has tool calls
        AS->>Tool: execute tools
        Tool-->>AS: tool results
        AS->>LLM: continue LLM call
    end

    opt first turn and no title
        AS->>TGen: auto-generate title
        TGen-->>AS: session title
    end

    AS-->>API: SSE streaming response
    API-->>U: stream output

Three Copilot Modes

Mode Comparison

Mode Tool Scope Use Case
teaching_assistant (default) Diagnostic read-only + packet analysis + node management Teaching demos, troubleshooting guidance
lab_automation_assistant All tools (including config changes) Lab automation, device configuration
troubleshooting_injection Fault injection tool set Troubleshooting practice, fault simulation

Tool Binding Details

Tool teaching_assistant lab_automation_assistant troubleshooting_injection
GNS3TemplateTool get templates
GNS3CreateNodeTool create nodes
GNS3LinkTool create links
GNS3StartNodeTool start nodes
GNS3UpdateNodeNameTool rename
GNS3StopNodeTool stop nodes
GNS3SuspendNodeTool suspend nodes
ExecuteMultipleDeviceCommands read-only commands
ExecuteMultipleDeviceConfigCommands config commands
VPCSCommands VPCS commands
PacketAnalysisTool live packet analysis
PacketAnalysisSkillsTool protocol knowledge
DeviceSkillsTool device skills
GNS3PacketFilterTool link filters
InjectionSkillsTool fault injection skills
GNS3TopologyTool topology info

The mode is selected in the llm_call node via copilot_mode, which picks the corresponding tool list and binds it to the LLM model instance through create_base_model_with_tools(mode_tools, llm_config).

Context Window Management

flowchart LR
    A["LLM call triggered"] --> B["pre_model_hook"]
    B --> C["Inject topology\ninto System Prompt"]
    B --> D["Estimate tool definition\ntoken cost"]
    B --> E["trim_messages\nby strategy"]
    E --> F["conservative 60%\nbalanced 75%\naggressive 85%"]
    F --> G["Invoke LLM"]
  • Accurate token counting via tiktoken (cl100k_base)
  • Three trimming strategies: conservative / balanced / aggressive
  • Auto-injects {{topology_info}} into System Prompt

Session Management

  • Per-project independent SQLite database (gns3-copilot/copilot_checkpoints.db)
  • Supports pin, rename, delete, history query
  • Auto-records token usage, message count, LLM call count

LLM Config System

Feature Description
User-level configs Each user can independently configure provider / model / api_key
Group inheritance Users auto-inherit group config when no personal config is set
API key encryption Auto-encrypted at database storage
Optimistic locking version field prevents concurrent modification conflicts

Key Design Points

  1. Project-level Isolation — Each GNS3 project has its own Agent instance and SQLite storage
  2. ContextVars Safe Passing — JWT token, API key exist only in memory, auto-cleared when request ends
  3. LangGraph StateGraph — Custom nodes + conditional edges, supports ReAct loop and recursion limits
  4. SSE Streaming — Real-time push of content / tool_call / tool_start / tool_end / error / done events
  5. Hot Reload — System Prompt, Skills, Protocols all support runtime reload
  6. Mode-based Tool Sets — Three copilot modes bind different tools, safely isolated by scenario