graph-tool-call
graph-tool-call
Los agentes LLM no pueden incluir miles de definiciones de herramientas en su contexto. La búsqueda vectorial encuentra herramientas similares, pero pierde el flujo de trabajo al que pertenecen. graph-tool-call construye un grafo de herramientas y recupera la cadena correcta, no solo una coincidencia.
Sin recuperación | graph-tool-call | |
248 herramientas (API K8s) | 12% precisión | 82% precisión |
1068 herramientas (API completa de GitHub) | desbordamiento de contexto | 78% Recall@5 |
Uso de tokens | 8,192 tok | 1,699 tok (79% ↓) |
Medido con qwen3:4b (4-bit) — benchmark completo
Por qué
Los agentes LLM necesitan herramientas. Pero a medida que aumenta el número de herramientas, dos cosas fallan:
Desbordamiento de contexto — 248 endpoints de la API de Kubernetes = 8,192 tokens de definiciones de herramientas. El LLM se bloquea y la precisión cae al 12%.
La búsqueda vectorial pierde los flujos de trabajo — Buscar "cancelar mi pedido" encuentra
cancelOrder, pero el flujo real eslistOrders → getOrder → cancelOrder → processRefund. La búsqueda vectorial devuelve una herramienta; tú necesitas la cadena.
graph-tool-call resuelve ambos problemas. Modela las relaciones de las herramientas como un grafo, recupera flujos de trabajo de varios pasos mediante búsqueda híbrida (BM25 + recorrido de grafos + embedding + anotaciones MCP) y reduce el uso de tokens entre un 64% y un 91% mientras mantiene o mejora la precisión.
Escenario | Solo vectorial | graph-tool-call |
"cancelar mi pedido" | Devuelve |
|
"leer y guardar archivo" | Devuelve |
|
"eliminar registros antiguos" | Devuelve cualquier herramienta que coincida con "delete" | Herramientas destructivas clasificadas primero mediante anotaciones MCP |
"ahora cancélalo" (después de listar pedidos) | Sin contexto del historial | Desprioriza herramientas usadas, impulsa herramientas del siguiente paso |
Múltiples especificaciones Swagger con herramientas superpuestas | Herramientas duplicadas en los resultados | Deduplicación automática entre fuentes |
1,200 endpoints de API | Lento, resultados ruidosos | Categorizado + recorrido de grafos para una recuperación precisa |
Cómo funciona
OpenAPI / MCP / Python functions → Ingest → Build tool graph → Hybrid retrieve → AgentEjemplo — El usuario dice "cancela mi pedido y procesa un reembolso"
La búsqueda vectorial encuentra cancelOrder. Pero el flujo de trabajo real es:
┌──────────┐
PRECEDES │listOrders│ PRECEDES
┌─────────┤ ├──────────┐
▼ └──────────┘ ▼
┌──────────┐ ┌───────────┐
│ getOrder │ │cancelOrder│
└──────────┘ └─────┬─────┘
│ COMPLEMENTARY
▼
┌──────────────┐
│processRefund │
└──────────────┘graph-tool-call devuelve toda la cadena, no solo una herramienta. La recuperación combina cuatro señales mediante Reciprocal Rank Fusion (wRRF) ponderado:
BM25 — coincidencia de palabras clave
Recorrido de grafos — expansión basada en relaciones (PRECEDES, REQUIRES, COMPLEMENTARY)
Similitud de embedding — búsqueda semántica (opcional, cualquier proveedor)
Anotaciones MCP — sugerencias de solo lectura / destructivas / idempotentes
Instalación
El paquete principal tiene cero dependencias — solo la biblioteca estándar de Python. Instala solo lo que necesites:
pip install graph-tool-call # core (BM25 + graph) — no dependencies
pip install graph-tool-call[embedding] # + embedding, cross-encoder reranker
pip install graph-tool-call[openapi] # + YAML support for OpenAPI specs
pip install graph-tool-call[mcp] # + MCP server / proxy mode
pip install graph-tool-call[all] # everythingExtra | Instala | Cuándo usar |
| pyyaml | Especificaciones YAML OpenAPI |
| numpy | Búsqueda semántica (conectar a Ollama/OpenAI/vLLM) |
| numpy, sentence-transformers | Modelos locales de sentence-transformers |
| rapidfuzz | Detección de duplicados |
| langchain-core | Integración con LangChain |
| pyvis, networkx | Exportación de grafo HTML, GraphML |
| dash, dash-cytoscape | Panel interactivo |
| ai-api-lint | Corrección automática de malas especificaciones API |
| mcp | Modo servidor / proxy MCP |
Inicio rápido
Pruébalo en 30 segundos (sin instalación)
uvx graph-tool-call search "user authentication" \
--source https://petstore.swagger.io/v2/swagger.jsonQuery: "user authentication"
Source: https://petstore.swagger.io/v2/swagger.json (19 tools)
Results (5):
1. getUserByName — Get user by user name
2. deleteUser — Delete user
3. createUser — Create user
4. loginUser — Logs user into the system
5. updateUser — Updated userAPI de Python
from graph_tool_call import ToolGraph
# Build a tool graph from the official Petstore API
tg = ToolGraph.from_url(
"https://petstore3.swagger.io/api/v3/openapi.json",
cache="petstore.json",
)
print(tg)
# → ToolGraph(tools=19, nodes=22, edges=100)
# Search for tools
tools = tg.retrieve("create a new pet", top_k=5)
for t in tools:
print(f"{t.name}: {t.description}")
# Search with workflow guidance
results = tg.retrieve_with_scores("process an order", top_k=5)
for r in results:
print(f"{r.tool.name} [{r.confidence}]")
for rel in r.relations:
print(f" → {rel.hint}")
# Execute an OpenAPI tool directly
result = tg.execute(
"addPet", {"name": "Buddy", "status": "available"},
base_url="https://petstore3.swagger.io/api/v3",
)Planificación de flujos de trabajo
plan_workflow() devuelve cadenas de ejecución ordenadas con requisitos previos, reduciendo los viajes de ida y vuelta del agente de 3-4 a 1.
plan = tg.plan_workflow("process a refund")
for step in plan.steps:
print(f"{step.order}. {step.tool.name} — {step.reason}")
# 1. getOrder — prerequisite for requestRefund
# 2. requestRefund — primary action
plan.save("refund_workflow.json")Edita, parametriza y visualiza flujos de trabajo: consulta la guía de la API directa.
Otras fuentes de herramientas
# From an MCP server (HTTP JSON-RPC tools/list)
tg.ingest_mcp_server("https://mcp.example.com/mcp")
# From an MCP tool list (annotations preserved)
tg.ingest_mcp_tools(mcp_tools, server_name="filesystem")
# From Python callables (type hints + docstrings)
tg.ingest_functions([read_file, write_file])Las anotaciones MCP (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) se utilizan como señales de recuperación: la intención de la consulta se clasifica automáticamente, y las consultas de lectura priorizan las herramientas de solo lectura, mientras que las consultas de eliminación priorizan las herramientas destructivas.
Elige tu integración
graph-tool-call incluye varios patrones de integración. Elige el que coincida con tu stack:
Estás usando... | Patrón | Ganancia en tokens | Guía |
Claude Code / Cursor / Windsurf | Proxy MCP (agrega N servidores MCP → 3 meta-herramientas) | ~1,200 tok/turno | |
Cualquier cliente compatible con MCP | Servidor MCP (fuente única como MCP) | varía | |
LangChain / LangGraph (más de 50 herramientas) | Herramientas Gateway (N herramientas → 2 meta-herramientas) | 92% | |
SDK de OpenAI / Anthropic (código existente) | Middleware (monkey-patch de 1 línea) | 76–91% | |
Control directo sobre la recuperación | API de Python ( | varía |
Proxy MCP (el más común)
Cuando tienes muchos servidores MCP, sus nombres de herramientas se acumulan en cada turno del LLM. Agrúpalos detrás de un servidor: 172 herramientas → 3 meta-herramientas.
# 1. Create ~/backends.json listing your MCP servers
# 2. Register the proxy with Claude Code
claude mcp add -s user tool-proxy -- \
uvx "graph-tool-call[mcp]" proxy --config ~/backends.jsonConfiguración completa, modo passthrough, transporte remoto → Guía de Proxy MCP.
Gateway de LangChain
from graph_tool_call.langchain import create_gateway_tools
# 62 tools from Slack, GitHub, Jira, MS365...
gateway = create_gateway_tools(all_tools, top_k=10)
# → [search_tools, call_tool] — only 2 tools in context
agent = create_react_agent(model=llm, tools=gateway)Reducción del 92% de tokens frente a vincular las 62 herramientas. Consulta la guía de LangChain para patrones de filtrado automático y manual.
Middleware de SDK
from graph_tool_call.middleware import patch_openai
patch_openai(client, graph=tg, top_k=5) # ← add this one line
# Existing code unchanged — 248 tools go in, only 5 relevant ones are sent
response = client.chat.completions.create(
model="gpt-4o",
tools=all_248_tools,
messages=messages,
)También funciona con Anthropic mediante patch_anthropic. Consulta la guía de Middleware.
Benchmark
Dos preguntas: (1) ¿El LLM sigue eligiendo la herramienta correcta cuando solo se le da el subconjunto recuperado? (2) ¿El recuperador clasifica las herramientas correctas en el top K?
Dataset | Herramientas | Precisión base | graph-tool-call | Reducción de tokens |
Petstore | 19 | 100% | 95% (k=5) | 64% |
GitHub | 50 | 100% | 88% (k=5) | 88% |
MCP mixto | 38 | 97% | 90% (k=5) | 83% |
Kubernetes core/v1 | 248 | 12% | 82% (k=5 + ontología) | 79% |
Hallazgo clave — con 248 herramientas, la base colapsa (desbordamiento de contexto) al 12%, mientras que graph-tool-call se recupera al 82%. A escalas más pequeñas, la base ya es sólida, por lo que el valor de graph-tool-call es el ahorro de tokens sin pérdida de precisión.
→ Resultados completos (pipeline / solo recuperación / competitivo / escala 1068 / agente LangChain de 200 herramientas en GPT y Claude): docs/benchmarks.md
# Reproduce
python -m benchmarks.run_benchmark # retrieval only
python -m benchmarks.run_benchmark --mode pipeline -m qwen3:4b # full pipelineCaracterísticas avanzadas
Búsqueda híbrida basada en embeddings
Añade búsqueda semántica sobre BM25 + grafo. No se necesitan dependencias pesadas: conéctate a cualquier servidor de embedding externo.
tg.enable_embedding("ollama/qwen3-embedding:0.6b") # Ollama (recommended)
tg.enable_embedding("openai/text-embedding-3-large") # OpenAI
tg.enable_embedding("vllm/Qwen/Qwen3-Embedding-0.6B") # vLLM
tg.enable_embedding("sentence-transformers/all-MiniLM-L6-v2") # local
tg.enable_embedding(lambda texts: my_embed_fn(texts)) # custom callableLos pesos se reequilibran automáticamente. Consulta la referencia de la API para todas las formas de proveedores.
Ajuste de recuperación
tg.enable_reranker() # cross-encoder rerank
tg.enable_diversity(lambda_=0.7) # MMR diversity
tg.set_weights(keyword=0.2, graph=0.5, embedding=0.3, annotation=0.2)Recuperación consciente del historial
Pasa las herramientas llamadas anteriormente para despriorizarlas e impulsar los candidatos del siguiente paso.
tools = tg.retrieve("now cancel it", history=["listOrders", "getOrder"])
# → [cancelOrder, processRefund, ...]Guardar / cargar (preserva embeddings + pesos)
tg.save("my_graph.json")
tg = ToolGraph.load("my_graph.json")
# Or use cache= in from_url() for automatic save/load
tg = ToolGraph.from_url(url, cache="my_graph.json")Ontología mejorada por LLM
tg.auto_organize(llm="ollama/qwen2.5:7b")
tg.auto_organize(llm="litellm/claude-sonnet-4-20250514")
tg.auto_organize(llm=openai.OpenAI())Construye categorías, relaciones y palabras clave de búsqueda más ricas. Soporta Ollama, clientes OpenAI, litellm y cualquier invocable. Consulta la referencia de la API.
Otras características
Característica | API | Docs |
Detección de duplicados entre especificaciones |
| |
Detección de conflictos |
| |
Análisis operativo |
| |
Panel interactivo |
| |
Exportación HTML / GraphML / Cypher |
| |
Corrección automática de malas especificaciones OpenAPI |
|
Documentación
Doc | Descripción |
Todos los comandos CLI de | |
Métodos | |
Servidor / proxy MCP, LangChain, middleware, API directa | |
Tablas completas de pipeline / recuperación / competitivo / escala | |
Resumen del sistema, capas de pipeline, modelo de datos | |
Diseño de algoritmos: normalización, detección de dependencias, ontología | |
Análisis competitivo, datos de escala de API | |
Proceso de lanzamiento, flujo de changelog |
Contribución
Las contribuciones son bienvenidas.
git clone https://github.com/SonAIengine/graph-tool-call.git
cd graph-tool-call
pip install poetry pre-commit
poetry install --with dev --all-extras
pre-commit install # auto-runs ruff on every commit
# Test, lint, benchmark
poetry run pytest -v
poetry run ruff check . && poetry run ruff format --check .
python -m benchmarks.run_benchmark -vLicencia
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/SonAIengine/graph-tool-call'
If you have feedback or need assistance with the MCP directory API, please join our Discord server