"""Tool for asking general questions via Council."""
import logging
from typing import Any, Dict
from .base import MCPTool, ToolOutput
logger = logging.getLogger(__name__)
class AskTool(MCPTool):
"""Tool for asking general questions."""
@property
def name(self) -> str:
return "ask"
@property
def description(self) -> str:
return "Ask a general question or for help with a problem"
@property
def input_schema(self) -> Dict[str, Any]:
return {
"type": "object",
"properties": {
"question": {
"type": "string",
"description": "The question or problem to ask",
},
"context": {
"type": "string",
"description": "Optional context to help understand better",
"default": "",
},
"model": {
"type": "string",
"description": (
"Optional model override (e.g., 'anthropic/claude-3-opus'). "
"Use list_models to see available options."
),
},
},
"required": ["question"],
}
async def execute(self, parameters: Dict[str, Any]) -> ToolOutput:
"""Execute the tool."""
try:
# Get parameters
question = parameters.get("question", "")
context = parameters.get("context", "")
model_override = parameters.get("model")
if not question:
return ToolOutput(success=False, error="Question is required")
# Build prompt
prompt = f"Context: {context}\n\n" if context else ""
prompt += f"Question: {question}"
# Get model manager from server instance
try:
# Try to get server instance from parent module
from .. import _server_instance
if _server_instance and _server_instance.model_manager:
model_manager = _server_instance.model_manager
else:
raise AttributeError("Server instance not available")
except (ImportError, AttributeError):
# Fallback for bundled mode - model_manager should be global
model_manager = globals().get("model_manager")
if not model_manager:
return ToolOutput(success=False, error="Model manager not available")
response_text, model_used = model_manager.generate_content(prompt, model=model_override)
formatted_response = f"🤖 Response:\n\n{response_text}"
formatted_response += f"\n\n[Model: {model_used}]"
return ToolOutput(success=True, result=formatted_response)
except Exception as e:
logger.error(f"API error: {e}")
return ToolOutput(success=False, error=f"Error: {str(e)}")