Assistant agent with support for both function-based and MCP tools
| 92 | |
| 93 | |
| 94 | class MyAgent(BaseAgent): |
| 95 | """Assistant agent with support for both function-based and MCP tools""" |
| 96 | |
| 97 | def __init__(self, model: BaseModel, config: Dict[str, Any]): |
| 98 | super().__init__(model, config) |
| 99 | |
| 100 | # Get tool registry |
| 101 | self.tool_registry = get_registry() |
| 102 | |
| 103 | # Get allowed tools list from config (whitelist mode) |
| 104 | self.allowed_tools = config.get("allowed_tools", None) |
| 105 | |
| 106 | logger.info(f"MyAgent '{self.name}' initialized") |
| 107 | if self.allowed_tools: |
| 108 | logger.info(f"Allowed tools: {self.allowed_tools}") |
| 109 | else: |
| 110 | logger.info(f"All tools available") |
| 111 | |
| 112 | async def _execute_tool(self, function_name: str, function_args: Dict[str, Any]) -> Any: |
| 113 | """Execute tool function (routes to either function-based or MCP tool)""" |
| 114 | logger.info(f"Executing tool: {function_name}") |
| 115 | logger.debug(f"Arguments: {json.dumps(function_args, ensure_ascii=False)}") |
| 116 | |
| 117 | try: |
| 118 | result = await self.tool_registry.execute(function_name, **function_args) |
| 119 | logger.info(f"Tool execution successful: {function_name}") |
| 120 | logger.info(f"Tool Call Result: {result}") |
| 121 | return result |
| 122 | except Exception as e: |
| 123 | logger.error(f"Tool execution failed for {function_name}: {e}") |
| 124 | raise |
| 125 | |
| 126 | async def get_registered_tools(self) -> list: |
| 127 | """Get all tool definitions in OpenAI format (with permission filtering applied)""" |
| 128 | return await self.tool_registry.get_all_definitions( |
| 129 | allowed_tools=self.allowed_tools |
| 130 | ) |
| 131 | |
| 132 | async def execute(self, context: Dict[str, Any], params: Dict[str, Any]) -> Dict[str, Any]: |
| 133 | """Execute agent task""" |
| 134 | query = context.get("query", "") |
| 135 | |
| 136 | if not query: |
| 137 | return {"status": "error", "error": "No query provided"} |
| 138 | |
| 139 | logger.info(f"Processing query: {query}") |
| 140 | |
| 141 | try: |
| 142 | tools = await self.get_registered_tools() |
| 143 | logger.info(f"Available tools: {len(tools)}") |
| 144 | |
| 145 | |
| 146 | # Retrieve related tools |
| 147 | related_tools = get_related_tools(query, tools) |
| 148 | logger.info(f"Related tools found: {len(related_tools)}") |
| 149 | |
| 150 | response = await self._call_model_with_tools( |
| 151 | system_prompt="", |