mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-11 22:51:28 +00:00
144 lines
4.9 KiB
Python
144 lines
4.9 KiB
Python
"""
|
|
Interactive Claude Agent SDK CLI with MCP Support
|
|
|
|
This example demonstrates an interactive CLI chat with the Anthropic Agent SDK using LiteLLM as a proxy,
|
|
with MCP (Model Context Protocol) server integration for enhanced capabilities.
|
|
"""
|
|
|
|
import asyncio
|
|
import os
|
|
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
|
|
from common import (
|
|
Config,
|
|
fetch_available_models,
|
|
setup_litellm_env,
|
|
print_header,
|
|
handle_model_list,
|
|
handle_model_switch,
|
|
stream_response,
|
|
)
|
|
|
|
|
|
async def interactive_chat_with_mcp():
|
|
"""
|
|
Interactive CLI chat with the agent and MCP server
|
|
"""
|
|
config = Config()
|
|
|
|
# Configure Anthropic SDK to point to LiteLLM gateway
|
|
litellm_base_url = setup_litellm_env(config)
|
|
|
|
# Fetch available models from proxy
|
|
available_models = await fetch_available_models(
|
|
litellm_base_url, config.LITELLM_API_KEY
|
|
)
|
|
|
|
current_model = config.LITELLM_MODEL
|
|
|
|
# MCP server configuration
|
|
mcp_server_url = f"{litellm_base_url}/mcp/deepwiki2"
|
|
use_mcp = os.getenv("USE_MCP", "true").lower() == "true"
|
|
|
|
if not use_mcp:
|
|
print("⚠️ MCP disabled via USE_MCP=false")
|
|
|
|
print_header(litellm_base_url, current_model, has_mcp=use_mcp)
|
|
|
|
while True:
|
|
# Configure agent options
|
|
if use_mcp:
|
|
try:
|
|
# Try with MCP server (HTTP transport)
|
|
# Using McpHttpServerConfig format from Agent SDK
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="You are a helpful AI assistant with access to DeepWiki for research. Be concise, accurate, and friendly.",
|
|
model=current_model,
|
|
max_turns=50,
|
|
mcp_servers={
|
|
"deepwiki2": {
|
|
"type": "http",
|
|
"url": mcp_server_url,
|
|
"headers": {
|
|
"Authorization": f"Bearer {config.LITELLM_API_KEY}"
|
|
},
|
|
}
|
|
},
|
|
)
|
|
except Exception as e:
|
|
print(f"⚠️ Warning: Could not configure MCP server: {e}")
|
|
print("Continuing without MCP...\n")
|
|
use_mcp = False
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="You are a helpful AI assistant. Be concise, accurate, and friendly.",
|
|
model=current_model,
|
|
max_turns=50,
|
|
)
|
|
else:
|
|
# Without MCP
|
|
options = ClaudeAgentOptions(
|
|
system_prompt="You are a helpful AI assistant. Be concise, accurate, and friendly.",
|
|
model=current_model,
|
|
max_turns=50,
|
|
)
|
|
|
|
# Create agent client
|
|
try:
|
|
async with ClaudeSDKClient(options=options) as client:
|
|
conversation_active = True
|
|
|
|
while conversation_active:
|
|
# Get user input
|
|
try:
|
|
user_input = input("\n👤 You: ").strip()
|
|
except (EOFError, KeyboardInterrupt):
|
|
print("\n\n👋 Goodbye!")
|
|
return
|
|
|
|
# Handle commands
|
|
if user_input.lower() in ["quit", "exit"]:
|
|
print("\n👋 Goodbye!")
|
|
return
|
|
|
|
if user_input.lower() == "clear":
|
|
print("\n🔄 Starting new conversation...\n")
|
|
conversation_active = False
|
|
continue
|
|
|
|
if user_input.lower() == "models":
|
|
handle_model_list(available_models, current_model)
|
|
continue
|
|
|
|
if user_input.lower() == "model":
|
|
new_model, should_restart = handle_model_switch(
|
|
available_models, current_model
|
|
)
|
|
if should_restart:
|
|
current_model = new_model
|
|
conversation_active = False
|
|
continue
|
|
|
|
if not user_input:
|
|
continue
|
|
|
|
# Stream response from agent
|
|
await stream_response(client, user_input)
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ Error creating agent client: {e}")
|
|
print("This might be an MCP configuration issue. Try running without MCP:")
|
|
print(" USE_MCP=false python agent_with_mcp.py")
|
|
print("\nOr use the basic agent:")
|
|
print(" python main.py")
|
|
return
|
|
|
|
|
|
def main():
|
|
"""Run interactive chat with MCP"""
|
|
try:
|
|
asyncio.run(interactive_chat_with_mcp())
|
|
except KeyboardInterrupt:
|
|
print("\n\n👋 Goodbye!")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|