- harness/es.py: append-only event store + проекции (образец — кооп-портал) - harness/levels.py: уровни 1с/1м/1ч/1д, контекст ∝ масштабу - harness/scheduler.py: уровневые потоки, идемпотентные тики, absorbed-стабы - harness/isolated_runner.py + _llm_worker.py: LLM-тик в сабпроцессе (глобальный asyncio-рантайм Strands не переживает 2+ create_harness) - cli.py: init/task/tasks/status/events + requeue (написан самим минутным агентом) - 9router: отдельный ключ sk-simbiot, модель auto (glm-5.3 первым)
67 lines
2 KiB
Python
67 lines
2 KiB
Python
"""Prompt management functionality."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING, Any
|
|
|
|
from mcp_types import InputRequiredResult
|
|
|
|
from mcp.server.mcpserver.prompts.base import Message, Prompt
|
|
from mcp.server.mcpserver.utilities.logging import get_logger
|
|
|
|
if TYPE_CHECKING:
|
|
from mcp.server.context import LifespanContextT, RequestT
|
|
from mcp.server.mcpserver.context import Context
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
class PromptManager:
|
|
"""Manages MCPServer prompts."""
|
|
|
|
def __init__(self, warn_on_duplicate_prompts: bool = True):
|
|
self._prompts: dict[str, Prompt] = {}
|
|
self.warn_on_duplicate_prompts = warn_on_duplicate_prompts
|
|
|
|
def get_prompt(self, name: str) -> Prompt | None:
|
|
"""Get prompt by name."""
|
|
return self._prompts.get(name)
|
|
|
|
def list_prompts(self) -> list[Prompt]:
|
|
"""List all registered prompts."""
|
|
return list(self._prompts.values())
|
|
|
|
def add_prompt(
|
|
self,
|
|
prompt: Prompt,
|
|
) -> Prompt:
|
|
"""Add a prompt to the manager."""
|
|
|
|
# Check for duplicates
|
|
existing = self._prompts.get(prompt.name)
|
|
if existing:
|
|
if self.warn_on_duplicate_prompts:
|
|
logger.warning(f"Prompt already exists: {prompt.name}")
|
|
return existing
|
|
|
|
self._prompts[prompt.name] = prompt
|
|
return prompt
|
|
|
|
def remove_prompt(self, name: str) -> None:
|
|
"""Remove a prompt by name."""
|
|
if name not in self._prompts:
|
|
raise ValueError(f"Unknown prompt: {name}")
|
|
del self._prompts[name]
|
|
|
|
async def render_prompt(
|
|
self,
|
|
name: str,
|
|
arguments: dict[str, Any] | None,
|
|
context: Context[LifespanContextT, RequestT],
|
|
) -> list[Message] | InputRequiredResult:
|
|
"""Render a prompt by name with arguments."""
|
|
prompt = self.get_prompt(name)
|
|
if not prompt:
|
|
raise ValueError(f"Unknown prompt: {name}")
|
|
|
|
return await prompt.render(arguments, context)
|