Reaper MCP Server

import json import os from functools import lru_cache from pathlib import Path from typing import Any, Dict, Optional class PromptLoader: """Утилита для загрузки и управления промптами""" def __init__(self, prompts_dir: str = None): self.prompts_dir = prompts_dir or os.path.join( os.path.dirname(os.path.dirname(__file__)), "prompts" ) @lru_cache(maxsize=None) def load_prompts(self, prompt_type: str) -> Dict[str, Any]: """Загрузка промптов из JSON файла Args: prompt_type: Тип промптов (system_prompts/user_prompts) Returns: Dict с промптами """ file_path = os.path.join(self.prompts_dir, f"{prompt_type}.json") try: with open(file_path, "r", encoding="utf-8") as f: return json.load(f) except Exception as e: print(f"Error loading prompts from {file_path}: {str(e)}") return {} def get_system_prompt(self, prompt_type: str) -> Optional[Dict[str, Any]]: """Получение системного промпта по типу""" prompts = self.load_prompts("system_prompts") return prompts.get(prompt_type) def get_user_prompt(self, prompt_name: str) -> Optional[Dict[str, Any]]: """Получение пользовательского промпта по имени""" prompts = self.load_prompts("user_prompts") return prompts.get(prompt_name) def format_system_prompt(self, prompt_type: str) -> str: """Форматирование системного промпта""" prompt = self.get_system_prompt(prompt_type) if not prompt: return "" content = prompt["content"] return f"""You are a {content['description']} with expertise in: {chr(10).join(f'- {cap}' for cap in content['capabilities'])} {content['instruction']}""" def format_user_prompt( self, prompt_name: str, **kwargs ) -> Optional[Dict[str, Any]]: """Форматирование пользовательского промпта с аргументами""" prompt = self.get_user_prompt(prompt_name) if not prompt: return None # Проверяем обязательные аргументы required_args = { arg["name"] for arg in prompt["arguments"] if arg.get("required", False) } missing_args = required_args - set(kwargs.keys()) if missing_args: raise ValueError( f"Missing required arguments: {', '.join(missing_args)}" ) return { "name": prompt["name"], "description": prompt["description"], "arguments": kwargs, } # Создаем глобальный экземпляр загрузчика промптов prompt_loader = PromptLoader()