mirror of
https://github.com/HKUDS/OpenSpace.git
synced 2026-08-28 05:15:00 +00:00
147 lines
5.1 KiB
Python
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",
|
|
]
|