/
pickling
/
mcp-sourcecontrol-python
Обзор
Документация
Войти
/
pickling
/
mcp-sourcecontrol-python
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/mcp_sourcecontrol/tools/formatting.py
58 строк
2 KB
pickling-21
Python-порт mcp-sourcecontrol: 20 инструментов, stdio и Streamable HTTP
29 июл 2026, 02:18
29 июл 2026, 02:18
bc8bde4
Код
Авторство
О чём код?
"""LLM-ориентированное форматирование ответов API. Порт src/tools/formatting.ts.""" from __future__ import annotations import json from collections.abc import Callable from typing import Any, TypeVar TRaw = TypeVar("TRaw") TOut = TypeVar("TOut") DEFAULT_MAX_CHARS = 100_000 def to_json(value: Any) -> str: """Сериализация как JSON.stringify: без пробелов, юникод как есть.""" return json.dumps(value, ensure_ascii=False, separators=(",", ":")) def truncate_response(text: str, max_chars: int = DEFAULT_MAX_CHARS) -> str: """Усекает текстовый ответ по границе строки и добавляет предупреждение. Защищает контекстное окно LLM от гигантских diff'ов и файлов. """ if len(text) <= max_chars: return text truncated = text[:max_chars] last_newline = truncated.rfind("\n") if last_newline > 0: truncated = truncated[:last_newline] return f"{truncated}\n\n... [TRUNCATED: {len(truncated)}/{len(text)} chars shown]" def format_paginated_response( raw: dict[str, Any], mapper: Callable[[Any], Any], current_page: int = 1, ) -> dict[str, Any]: """Нормализует постраничный ответ SourceControl API и маппит каждый элемент. Понимает обе формы массива: `values` и `data` (как `raw.values ?? raw.data ?? []`). """ items = raw.get("values") if items is None: items = raw.get("data") if items is None: items = [] result: dict[str, Any] = { "data": [mapper(item) for item in items], "page": raw["page"] if raw.get("page") is not None else current_page, "isLastPage": raw["isLastPage"] if raw.get("isLastPage") is not None else True, } if raw.get("total") is not None: result["total"] = raw["total"] return result