mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-09-09 11:35:21 +03:00
Updated the author name and copyright statements across the gns3_copilot module. The name has been standardized from "Guobin Yue" to "Yue Guobin (岳国宾)" to reflect the correct author attribution including Chinese characters.
125 lines
3.7 KiB
Python
125 lines
3.7 KiB
Python
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
#
|
|
# GNS3-Copilot - AI-powered Network Lab Assistant for GNS3
|
|
#
|
|
# This file is part of GNS3-Copilot project.
|
|
#
|
|
# GNS3-Copilot is free software: you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the
|
|
# Free Software Foundation, either version 3 of the License, or (at your
|
|
# option) any later version.
|
|
#
|
|
# GNS3-Copilot is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
# for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with GNS3-Copilot. If not, see <https://www.gnu.org/licenses/>.
|
|
#
|
|
# Copyright (C) 2025 Yue Guobin (岳国宾)
|
|
# Author: Yue Guobin (岳国宾)
|
|
#
|
|
# Project Home: https://github.com/yueguobin/gns3-copilot
|
|
#
|
|
|
|
"""
|
|
Request-Scoped Context Helpers for GNS3-Copilot
|
|
|
|
This module provides context variable management for request-scoped data
|
|
(JWT tokens and LLM configurations) using Python's contextvars module.
|
|
|
|
These functions are separated into their own module to avoid circular imports
|
|
between agent_service.py, gns3_copilot.py, and gns3_client modules.
|
|
|
|
Key Features:
|
|
- Thread-safe and async-safe request-scoped context management
|
|
- Automatic cleanup when request context ends
|
|
- No manual cleanup required
|
|
|
|
Usage:
|
|
from gns3server.agent.gns3_copilot.gns3_client.context_helpers import (
|
|
set_current_jwt_token,
|
|
get_current_jwt_token,
|
|
set_current_llm_config,
|
|
get_current_llm_config,
|
|
)
|
|
|
|
# In request handler
|
|
set_current_jwt_token(token)
|
|
set_current_llm_config(config)
|
|
|
|
# In downstream code
|
|
token = get_current_jwt_token()
|
|
config = get_current_llm_config()
|
|
"""
|
|
|
|
import logging
|
|
from contextvars import ContextVar
|
|
from typing import Optional
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# Context variables for request-scoped data
|
|
# Automatically cleaned up when request context ends
|
|
_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.
|
|
|
|
Args:
|
|
token: JWT token string
|
|
"""
|
|
_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.
|
|
|
|
Returns:
|
|
JWT token string if available, None otherwise
|
|
"""
|
|
token = _jwt_token_context.get()
|
|
if token:
|
|
logger.debug("JWT token retrieved from context")
|
|
else:
|
|
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.
|
|
|
|
Args:
|
|
config: LLM configuration dictionary with provider, model, api_key, etc.
|
|
"""
|
|
_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.
|
|
|
|
Returns:
|
|
LLM configuration dict if available, None otherwise
|
|
"""
|
|
config = _llm_config_context.get()
|
|
if config:
|
|
logger.debug(
|
|
"LLM config retrieved from context: provider=%s, model=%s", config.get("provider"), config.get("model")
|
|
)
|
|
else:
|
|
logger.warning("LLM config not found in context")
|
|
return config
|
|
|
|
|
|
__all__ = [
|
|
"set_current_jwt_token",
|
|
"get_current_jwt_token",
|
|
"set_current_llm_config",
|
|
"get_current_llm_config",
|
|
]
|