OpenSpace/openspace/tools/brief_tool.py
2026-07-17 11:43:42 +08:00

147 lines
5.1 KiB
Python

"""BriefTool - turn/session response style control.
OpenSpace keeps normal assistant text as the primary user-visible channel, so
this tool toggles concise response style in the current runtime context without
changing permissions or user settings.
"""
from __future__ import annotations
from typing import Any, Literal, Mapping
from openspace.grounding.core.permissions.types import PermissionAllow
from openspace.grounding.core.tool.base import BaseTool
from openspace.grounding.core.types import BackendType, ToolResult, ToolSchema, ToolStatus
BRIEF_TOOL_NAME = "brief"
BRIEF_TOOL_ALIAS = "Brief"
BRIEF_MAX_RESULT_SIZE_CHARS = 100_000
ResponseStyleMode = Literal["brief", "normal"]
DESCRIPTION = "Toggle concise assistant responses for this session"
PROMPT = """Use this tool to switch the assistant's response style for future text.
Set enabled=true or mode='brief' when the user asks for shorter answers or when low-value explanation should be minimized. Set enabled=false or mode='normal' to restore the default response style.
This only changes assistant text style. It does not change permissions, tools, or user configuration files."""
def make_input_schema() -> dict[str, Any]:
return {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"description": "True for brief mode, false to restore normal mode.",
},
"mode": {
"type": "string",
"enum": ["brief", "normal"],
"description": "Explicit response style mode.",
},
},
"additionalProperties": False,
}
def resolve_response_style(input_data: Mapping[str, Any]) -> tuple[ResponseStyleMode | None, str | None]:
has_enabled = "enabled" in input_data and input_data.get("enabled") is not None
has_mode = "mode" in input_data and input_data.get("mode") is not None
if has_enabled and has_mode:
enabled_style = "brief" if bool(input_data.get("enabled")) else "normal"
mode_style = str(input_data.get("mode")).strip().lower()
if mode_style != enabled_style:
return None, "enabled and mode disagree."
if has_mode:
mode = str(input_data.get("mode")).strip().lower()
if mode not in {"brief", "normal"}:
return None, "mode must be brief or normal."
return mode, None # type: ignore[return-value]
if has_enabled:
return ("brief" if bool(input_data.get("enabled")) else "normal"), None
return "brief", None
class BriefTool(BaseTool):
_name = BRIEF_TOOL_NAME
_description = DESCRIPTION
backend_type = BackendType.META
aliases = [BRIEF_TOOL_ALIAS, "BriefTool"]
_is_read_only = True
_is_concurrency_safe = True
should_defer = True
search_hint = "concise response style"
max_result_size_chars = BRIEF_MAX_RESULT_SIZE_CHARS
def __init__(self) -> None:
self._current_context: Any | None = None
super().__init__(
schema=ToolSchema(
name=self._name,
description=DESCRIPTION,
parameters=make_input_schema(),
backend_type=self.backend_type,
)
)
def set_context(self, context: Any) -> None:
self._current_context = context
def get_prompt(self, context: Any = None) -> str:
return PROMPT
async def validate_input(self, input: dict[str, Any], context: Any = None) -> str | None:
_, error = resolve_response_style(input)
return error
async def check_permissions(self, input: dict[str, Any], context: Any = None) -> PermissionAllow:
return PermissionAllow(updated_input=dict(input))
async def _arun(
self,
enabled: bool | None = None,
mode: str | None = None,
) -> ToolResult:
input_data: dict[str, Any] = {}
if enabled is not None:
input_data["enabled"] = enabled
if mode is not None:
input_data["mode"] = mode
style, error = resolve_response_style(input_data)
if error or style is None:
return ToolResult(status=ToolStatus.ERROR, content=error or "Invalid response style.", error=error)
context = self._current_context
if context is not None:
try:
context.response_style = style
except Exception:
pass
session_metadata = getattr(context, "session_metadata", None) if context is not None else None
if isinstance(session_metadata, dict):
session_metadata["response_style"] = style
data = {
"response_style": style,
"enabled": style == "brief",
}
content = (
"Brief response mode enabled."
if style == "brief"
else "Normal response mode restored."
)
return ToolResult(
status=ToolStatus.SUCCESS,
content=content,
metadata={"tool": self.name, "data": data},
)
__all__ = [
"BRIEF_TOOL_NAME",
"BRIEF_MAX_RESULT_SIZE_CHARS",
"BriefTool",
"BRIEF_TOOL_ALIAS",
"resolve_response_style",
]