mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-26 19:24:27 +00:00
working MCP tool call logging
This commit is contained in:
parent
a4a083041d
commit
b7b9f9d9da
3 changed files with 47 additions and 9 deletions
|
@ -1099,7 +1099,7 @@ class Logging(LiteLLMLoggingBaseClass):
|
||||||
standard_built_in_tools_params=self.standard_built_in_tools_params,
|
standard_built_in_tools_params=self.standard_built_in_tools_params,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif isinstance(result, dict): # pass-through endpoints
|
elif isinstance(result, dict) or isinstance(result, list):
|
||||||
## STANDARDIZED LOGGING PAYLOAD
|
## STANDARDIZED LOGGING PAYLOAD
|
||||||
self.model_call_details["standard_logging_object"] = (
|
self.model_call_details["standard_logging_object"] = (
|
||||||
get_standard_logging_object_payload(
|
get_standard_logging_object_payload(
|
||||||
|
|
|
@ -6,6 +6,7 @@ This class is responsible for managing MCP SSE clients.
|
||||||
This is a Proxy
|
This is a Proxy
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
import json
|
import json
|
||||||
from typing import Any, Dict, List, Optional
|
from typing import Any, Dict, List, Optional
|
||||||
|
|
||||||
|
@ -60,6 +61,8 @@ class MCPServerManager:
|
||||||
f"Loaded MCP Servers: {json.dumps(self.mcp_servers, indent=4, default=str)}"
|
f"Loaded MCP Servers: {json.dumps(self.mcp_servers, indent=4, default=str)}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.initialize_tool_name_to_mcp_server_name_mapping()
|
||||||
|
|
||||||
async def list_tools(self) -> List[MCPTool]:
|
async def list_tools(self) -> List[MCPTool]:
|
||||||
"""
|
"""
|
||||||
List all tools available across all MCP Servers.
|
List all tools available across all MCP Servers.
|
||||||
|
@ -102,6 +105,29 @@ class MCPServerManager:
|
||||||
|
|
||||||
return tools_result.tools
|
return tools_result.tools
|
||||||
|
|
||||||
|
def initialize_tool_name_to_mcp_server_name_mapping(self):
|
||||||
|
"""
|
||||||
|
On startup, initialize the tool name to MCP server name mapping
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
if asyncio.get_running_loop():
|
||||||
|
asyncio.create_task(
|
||||||
|
self._initialize_tool_name_to_mcp_server_name_mapping()
|
||||||
|
)
|
||||||
|
except RuntimeError as e: # no running event loop
|
||||||
|
verbose_logger.exception(
|
||||||
|
f"No running event loop - skipping tool name to MCP server name mapping initialization: {str(e)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
async def _initialize_tool_name_to_mcp_server_name_mapping(self):
|
||||||
|
"""
|
||||||
|
Call list_tools for each server and update the tool name to MCP server name mapping
|
||||||
|
"""
|
||||||
|
for server in self.mcp_servers:
|
||||||
|
tools = await self._get_tools_from_server(server)
|
||||||
|
for tool in tools:
|
||||||
|
self.tool_name_to_mcp_server_name_mapping[tool.name] = server.name
|
||||||
|
|
||||||
async def call_tool(self, name: str, arguments: Dict[str, Any]):
|
async def call_tool(self, name: str, arguments: Dict[str, Any]):
|
||||||
"""
|
"""
|
||||||
Call a tool with the given name and arguments
|
Call a tool with the given name and arguments
|
||||||
|
|
|
@ -3,7 +3,7 @@ LiteLLM MCP Server Routes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from typing import Any, Dict, List, Union
|
from typing import Any, Dict, List, Optional, Union
|
||||||
|
|
||||||
from anyio import BrokenResourceError
|
from anyio import BrokenResourceError
|
||||||
from fastapi import APIRouter, Depends, HTTPException, Request
|
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||||
|
@ -11,10 +11,12 @@ from fastapi.responses import StreamingResponse
|
||||||
from pydantic import ValidationError
|
from pydantic import ValidationError
|
||||||
|
|
||||||
from litellm._logging import verbose_logger
|
from litellm._logging import verbose_logger
|
||||||
|
from litellm.proxy._types import UserAPIKeyAuth
|
||||||
from litellm.proxy.auth.user_api_key_auth import user_api_key_auth
|
from litellm.proxy.auth.user_api_key_auth import user_api_key_auth
|
||||||
from litellm.types.mcp_server.mcp_server_manager import (
|
from litellm.types.mcp_server.mcp_server_manager import (
|
||||||
ListMCPToolsRestAPIResponseObject,
|
ListMCPToolsRestAPIResponseObject,
|
||||||
)
|
)
|
||||||
|
from litellm.utils import client
|
||||||
|
|
||||||
# Check if MCP is available
|
# Check if MCP is available
|
||||||
# "mcp" requires python 3.10 or higher, but several litellm users use python 3.8
|
# "mcp" requires python 3.10 or higher, but several litellm users use python 3.8
|
||||||
|
@ -110,8 +112,9 @@ if MCP_AVAILABLE:
|
||||||
)
|
)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
@client
|
||||||
async def call_mcp_tool(
|
async def call_mcp_tool(
|
||||||
name: str, arguments: Dict[str, Any] | None
|
name: str, arguments: Optional[Dict[str, Any]] = None, **kwargs: Any
|
||||||
) -> List[Union[MCPTextContent, MCPImageContent, MCPEmbeddedResource]]:
|
) -> List[Union[MCPTextContent, MCPImageContent, MCPEmbeddedResource]]:
|
||||||
"""
|
"""
|
||||||
Call a specific tool with the provided arguments
|
Call a specific tool with the provided arguments
|
||||||
|
@ -221,14 +224,23 @@ if MCP_AVAILABLE:
|
||||||
return list_tools_result
|
return list_tools_result
|
||||||
|
|
||||||
@router.post("/tools/call", dependencies=[Depends(user_api_key_auth)])
|
@router.post("/tools/call", dependencies=[Depends(user_api_key_auth)])
|
||||||
async def call_tool_rest_api(request: Request):
|
async def call_tool_rest_api(
|
||||||
|
request: Request,
|
||||||
|
user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth),
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
REST API to call a specific MCP tool with the provided arguments
|
||||||
|
"""
|
||||||
|
from litellm.proxy.proxy_server import add_litellm_data_to_request, proxy_config
|
||||||
|
|
||||||
data = await request.json()
|
data = await request.json()
|
||||||
name = data.get("name")
|
data = await add_litellm_data_to_request(
|
||||||
arguments = data.get("arguments")
|
data=data,
|
||||||
return await call_mcp_tool(
|
request=request,
|
||||||
name=name,
|
user_api_key_dict=user_api_key_dict,
|
||||||
arguments=arguments,
|
proxy_config=proxy_config,
|
||||||
)
|
)
|
||||||
|
return await call_mcp_tool(**data)
|
||||||
|
|
||||||
options = InitializationOptions(
|
options = InitializationOptions(
|
||||||
server_name="litellm-mcp-server",
|
server_name="litellm-mcp-server",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue