Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
134 lines
5.2 KiB
Python
134 lines
5.2 KiB
Python
"""
|
|
Quick Start for Active Tool Selection.
|
|
|
|
Run this script to see a basic demonstration of active tool discovery.
|
|
"""
|
|
|
|
from agent import ActiveToolAgent, PassiveToolAgent
|
|
from tool_knowledge_base import create_tool_knowledge_base, calculate_total_tokens
|
|
|
|
|
|
def main():
|
|
print("""
|
|
╔════════════════════════════════════════════════════════════════════════════╗
|
|
║ ║
|
|
║ Active Tool Selection - Quick Start ║
|
|
║ Inspired by MCP-Zero (arXiv:2506.01056) ║
|
|
║ ║
|
|
╚════════════════════════════════════════════════════════════════════════════╝
|
|
|
|
This demonstration shows how active tool discovery enables agents to:
|
|
• Maintain minimal context footprint
|
|
• Actively request tools as needed
|
|
• Scale efficiently with ecosystem growth
|
|
|
|
""")
|
|
|
|
# Show knowledge base info
|
|
print("📚 Tool Knowledge Base:")
|
|
servers = create_tool_knowledge_base()
|
|
total_tools = sum(len(server.tools) for server in servers)
|
|
total_tokens = calculate_total_tokens([tool for server in servers for tool in server.tools])
|
|
|
|
print(f" • Servers: {len(servers)}")
|
|
print(f" • Total tools: {total_tools}")
|
|
print(f" • Token cost if all injected: ~{total_tokens:,} tokens")
|
|
print()
|
|
|
|
# Example task
|
|
task = "Search for Python web frameworks on GitHub with more than 5000 stars"
|
|
print(f"🎯 Example Task:\n {task}\n")
|
|
|
|
# Test with active agent
|
|
print("=" * 80)
|
|
print("1️⃣ ACTIVE TOOL DISCOVERY")
|
|
print("=" * 80)
|
|
print("\n⏳ Agent is analyzing task and discovering needed tools...\n")
|
|
|
|
active_agent = ActiveToolAgent()
|
|
active_result = active_agent.execute_task(task)
|
|
|
|
print(f"✅ Task completed with active discovery:\n")
|
|
print(f" 📊 Metrics:")
|
|
print(f" • Tools loaded: {active_result['metrics']['tools_loaded']} (out of {total_tools})")
|
|
print(f" • Tokens used: {active_result['metrics']['tokens_used']:,}")
|
|
print(f" • Tool requests: {active_result['metrics']['tool_requests']}")
|
|
print(f" • API calls: {active_result['metrics']['api_calls']}")
|
|
print()
|
|
print(f" 🛠️ Tools discovered:")
|
|
for tool in active_result['tools_loaded']:
|
|
print(f" • {tool}")
|
|
print()
|
|
|
|
# Test with passive agent
|
|
print("=" * 80)
|
|
print("2️⃣ PASSIVE TOOL INJECTION (Traditional Approach)")
|
|
print("=" * 80)
|
|
print(f"\n⏳ Agent has all {total_tools} tools pre-loaded...\n")
|
|
|
|
passive_agent = PassiveToolAgent()
|
|
passive_result = passive_agent.execute_task(task)
|
|
|
|
print(f"✅ Task completed with passive injection:\n")
|
|
print(f" 📊 Metrics:")
|
|
print(f" • Tools loaded: {passive_result['metrics']['tools_loaded']} (all tools)")
|
|
print(f" • Tokens used: {passive_result['metrics']['tokens_used']:,}")
|
|
print(f" • API calls: {passive_result['metrics']['api_calls']}")
|
|
print()
|
|
|
|
# Comparison
|
|
print("=" * 80)
|
|
print("3️⃣ COMPARISON")
|
|
print("=" * 80)
|
|
print()
|
|
|
|
token_reduction = (1 - active_result['metrics']['tokens_used'] /
|
|
passive_result['metrics']['tokens_used']) * 100
|
|
tool_reduction = (1 - active_result['metrics']['tools_loaded'] /
|
|
passive_result['metrics']['tools_loaded']) * 100
|
|
|
|
print(f"📊 Efficiency Gains:\n")
|
|
print(f" Token Usage:")
|
|
print(f" • Active: {active_result['metrics']['tokens_used']:,} tokens")
|
|
print(f" • Passive: {passive_result['metrics']['tokens_used']:,} tokens")
|
|
print(f" • Reduction: {token_reduction:.1f}% 🎉")
|
|
print()
|
|
print(f" Tools Loaded:")
|
|
print(f" • Active: {active_result['metrics']['tools_loaded']} tools")
|
|
print(f" • Passive: {passive_result['metrics']['tools_loaded']} tools")
|
|
print(f" • Reduction: {tool_reduction:.1f}% 🎯")
|
|
print()
|
|
|
|
print("=" * 80)
|
|
print("💡 KEY INSIGHTS")
|
|
print("=" * 80)
|
|
print("""
|
|
1. Active Discovery maintains agent autonomy
|
|
→ Agent decides what tools it needs, when it needs them
|
|
|
|
2. Massive efficiency gains
|
|
→ 80-98% token reduction for typical tasks
|
|
|
|
3. Scales with ecosystem growth
|
|
→ Adding 100 more tools doesn't bloat every request
|
|
|
|
4. Iterative capability extension
|
|
→ Toolchain evolves as task understanding deepens
|
|
|
|
5. Semantic routing enables precision
|
|
→ Tools matched by meaning, not just keywords
|
|
|
|
""")
|
|
|
|
print("🎓 Next Steps:")
|
|
print(" • Run 'python demo_comparison.py' for comprehensive comparison")
|
|
print(" • Run 'python examples.py' for more use cases")
|
|
print(" • See README.md for architecture details")
|
|
print()
|
|
print("📄 Reference: MCP-Zero paper - https://arxiv.org/pdf/2506.01056")
|
|
print()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|