enh: custom headers for external tool servers

This commit is contained in:
Timothy Jaeryang Baek
2025-11-12 23:39:27 -05:00
parent 0bf686396d
commit da42850eff
5 changed files with 108 additions and 13 deletions
+10 -2
View File
@@ -312,7 +312,11 @@ async def chat_completion_tools_handler(
for message in recent_messages
)
prompt = f"History:\n{chat_history}\nQuery: {user_message}" if chat_history else f"Query: {user_message}"
prompt = (
f"History:\n{chat_history}\nQuery: {user_message}"
if chat_history
else f"Query: {user_message}"
)
return {
"model": task_model_id,
@@ -1327,7 +1331,6 @@ async def process_chat_payload(request, form_data, user, metadata, model):
continue
auth_type = mcp_server_connection.get("auth_type", "")
headers = {}
if auth_type == "bearer":
headers["Authorization"] = (
@@ -1363,6 +1366,11 @@ async def process_chat_payload(request, form_data, user, metadata, model):
log.error(f"Error getting OAuth token: {e}")
oauth_token = None
connection_headers = mcp_server_connection.get("headers", None)
if connection_headers:
for key, value in connection_headers.items():
headers[key] = value
mcp_clients[server_id] = MCPClient()
await mcp_clients[server_id].connect(
url=mcp_server_connection.get("url", ""),
+17 -8
View File
@@ -155,7 +155,9 @@ async def get_tools(
auth_type = tool_server_connection.get("auth_type", "bearer")
cookies = {}
headers = {}
headers = {
"Content-Type": "application/json",
}
if auth_type == "bearer":
headers["Authorization"] = (
@@ -177,7 +179,10 @@ async def get_tools(
f"Bearer {oauth_token.get('access_token', '')}"
)
headers["Content-Type"] = "application/json"
connection_headers = tool_server_connection.get("headers", None)
if connection_headers:
for key, value in connection_headers.items():
headers[key] = value
def make_tool_function(
function_name, tool_server_data, headers
@@ -561,20 +566,21 @@ async def get_tool_servers(request: Request):
return tool_servers
async def get_tool_server_data(token: str, url: str) -> Dict[str, Any]:
headers = {
async def get_tool_server_data(url: str, headers: Optional[dict]) -> Dict[str, Any]:
_headers = {
"Accept": "application/json",
"Content-Type": "application/json",
}
if token:
headers["Authorization"] = f"Bearer {token}"
if headers:
_headers.update(headers)
error = None
try:
timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA)
async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session:
async with session.get(
url, headers=headers, ssl=AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL
url, headers=_headers, ssl=AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL
) as response:
if response.status != 200:
error_body = await response.json()
@@ -644,7 +650,10 @@ async def get_tool_servers_data(servers: List[Dict[str, Any]]) -> List[Dict[str,
openapi_path = server.get("path", "openapi.json")
spec_url = get_tool_server_url(server_url, openapi_path)
# Fetch from URL
task = get_tool_server_data(token, spec_url)
task = get_tool_server_data(
spec_url,
{"Authorization": f"Bearer {token}"} if token else None,
)
elif spec_type == "json" and server.get("spec", ""):
# Use provided JSON spec
spec_json = None