Spaces:
Sleeping
Sleeping
| # scripts/test_llm.py | |
| """ | |
| Скрипт для тестирования работы LLM-клиента. | |
| Обращается к локальному серверу vLLM и проверяет генерацию JSON для раскладки. | |
| Обновлен для работы с новым API generate_layout (добавлены габариты и каталог оборудования). | |
| """ | |
| import logging | |
| import os | |
| import sys | |
| from typing import Any, Dict, List, Optional | |
| import hydra | |
| from omegaconf import DictConfig | |
| # Добавляем корень проекта в PYTHONPATH, чтобы импорты из src работали корректно | |
| sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) | |
| from src.llm.client import InventoryLLMClient | |
| # Настройка подробного логирования | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format="%(asctime)s [%(levelname)s] %(message)s", | |
| datefmt="%H:%M:%S" | |
| ) | |
| logger: logging.Logger = logging.getLogger(__name__) | |
| def main(cfg: DictConfig) -> None: | |
| """ | |
| Основная функция для выполнения тестового запроса к запущенному серверу vLLM. | |
| Args: | |
| cfg (DictConfig): Конфигурация проекта, загруженная через Hydra. | |
| """ | |
| logger.info("🚀 Запуск тестирования LLM-клиента...") | |
| # Инициализируем клиент (он сам достанет url и модель из cfg.llm) | |
| client: InventoryLLMClient = InventoryLLMClient(cfg) | |
| # Задаем тестовый набор категорий | |
| test_categories: List[str] = ["BEER", "CHIPS", "ENERGY_DRINKS", "WATER", "WINE"] | |
| logger.info(f"🛒 Доступные категории для теста: {test_categories}") | |
| # Подготавливаем тестовые данные для габаритов и оборудования | |
| test_size_n: float = 6.0 | |
| test_size_m: float = 6.0 | |
| test_equipment: str = ( | |
| "- showcase_glb (Холодильник): 1.55m x 0.9m\n" | |
| "- shelf_beer (Стеллаж): 1.55m x 0.55m" | |
| ) | |
| logger.info(f"📏 Габариты комнаты: {test_size_n}x{test_size_m}м") | |
| logger.info(f"📦 Каталог оборудования:\n{test_equipment}") | |
| # Формируем тестовый запрос | |
| test_request: str = "Сделай стенд для вечеринки: нужно много пива, чипсов и немного энергетиков. Поставь два стеллажа и один холодильник." | |
| logger.info(f"🗣️ Тестовый промпт: '{test_request}'") | |
| # Отправляем запрос на сервер с новыми обязательными параметрами | |
| result: Optional[Dict[str, Any]] = client.generate_layout( | |
| user_request=test_request, | |
| available_categories=test_categories, | |
| equipment_catalog=test_equipment, | |
| size_n=test_size_n, | |
| size_m=test_size_m | |
| ) | |
| if result: | |
| logger.info("✅ Успешный ответ от нейросети:") | |
| # Выводим структуру полученного графа | |
| nodes: List[Dict[str, Any]] = result.get("nodes", []) | |
| edges: List[Dict[str, Any]] = result.get("edges", []) | |
| logger.info(f"Сгенерировано узлов: {len(nodes)}") | |
| for node in nodes: | |
| logger.info(f" - Узел: {node.get('id')} ({node.get('type')}) на координатах ({node.get('draft_cx')}, {node.get('draft_cy')})") | |
| logger.info(f"Сгенерировано связей: {len(edges)}") | |
| for edge in edges: | |
| logger.info(f" - Связь: {edge.get('source')} -> {edge.get('target')} ({edge.get('relation')})") | |
| else: | |
| logger.error("❌ Нейросеть не вернула результат. Проверь логи сервера vLLM.") | |
| if __name__ == "__main__": | |
| main() |