Gograph and the Limits of Grep: Agents Need Web Too
Gograph solves AI agent code navigation with AST graphs. But agents still need external context: library docs, migration guides, deprecation notices.
Gograph (111 upvotes on Reddit) solves AI agent code navigation by building an AST and call hierarchy graph database for Go codebases. Grep misses implicit Go interfaces, struct embeddings, and dynamic dispatch. But even with perfect code understanding, agents still need external context: library documentation, migration guides, deprecation notices, and upstream changelogs. Web search fills this gap that no amount of local code analysis can cover.
What Gograph solves
Go has implicit interface satisfaction: a struct implements an interface by having the right methods, without any explicit declaration. Grep cannot find these relationships. Gograph builds a graph database from the AST that captures: interface implementations, call hierarchies, struct embeddings, and type assertions. This gives coding agents a complete picture of the local codebase structure. For code navigation and refactoring within a project, this is a significant improvement over grep-based search.
Where code-level understanding hits its limit
An agent using Gograph can perfectly understand your codebase. It knows every function, every interface, every call path. But when it encounters: a deprecated function in a third-party library, a breaking change in the next version of a dependency, a bug that is documented in an upstream issue tracker, or a migration guide for a major version bump, the local code graph has no answers. The information exists on the internet, not in your repository.
Common scenarios requiring web access
- Agent refactors code using a library method that was deprecated last week
- Agent suggests a pattern that has a known security vulnerability disclosed in a CVE
- Agent needs to update a dependency but the migration guide is on the project wiki
- Agent hits a cryptic error from a third-party SDK and the fix is in a GitHub issue
- Agent generates code using an old API version because it has no access to current docs
Combining Gograph with web search
import requests, os
H = {"x-api-key": os.environ["SCAVIO_API_KEY"]}
def agent_research(code_context: str, question: str) -> dict:
"""When local code graph is insufficient, search the web."""
# First: check if this is about an external dependency
# (Gograph handles internal code navigation)
external_signals = [
"deprecated", "migration", "breaking change",
"vulnerability", "CVE", "new version", "upgrade"
]
needs_web = any(s in question.lower() for s in external_signals)
if not needs_web:
return {"source": "local", "action": "use_gograph"}
# Search for current information about the dependency
search_query = f"{code_context} {question}"
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers=H,
json={"platform": "google", "query": search_query},
timeout=10)
results = resp.json().get("organic", [])[:5]
return {
"source": "web",
"results": [{
"title": r.get("title"),
"snippet": r.get("snippet"),
"url": r.get("link")
} for r in results]
}The layered agent architecture
# Layer 1: Gograph for internal code navigation
# Layer 2: Web search for external context
# Layer 3: Combine both for complete understanding
class GoAgent:
def __init__(self, gograph_client, search_api_key):
self.graph = gograph_client
self.search_key = search_api_key
def investigate(self, question: str, file_context: str) -> dict:
"""Route question to appropriate knowledge source."""
# Internal code question: use graph
if self._is_internal(question):
implementations = self.graph.find_implementations(file_context)
callers = self.graph.find_callers(file_context)
return {"source": "gograph", "implementations": implementations, "callers": callers}
# External/dependency question: use web
if self._is_external(question):
return self._web_search(question)
# Ambiguous: check both
graph_result = self.graph.query(question)
web_result = self._web_search(question)
return {"source": "both", "local": graph_result, "web": web_result}
def _is_internal(self, q: str) -> bool:
internal_words = ["implements", "calls", "used by", "defined in", "struct"]
return any(w in q.lower() for w in internal_words)
def _is_external(self, q: str) -> bool:
external_words = ["library", "package", "dependency", "docs", "version"]
return any(w in q.lower() for w in external_words)
def _web_search(self, query: str) -> dict:
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": self.search_key},
json={"platform": "google", "query": f"golang {query}"},
timeout=10)
return resp.json().get("organic", [])[:3]The takeaway for agent builders
Code analysis tools (Gograph, tree-sitter, LSP) solve the "what is in my codebase" problem. Search APIs solve the "what is happening outside my codebase" problem. Production coding agents need both. The cost is minimal: at $0.005 per search query, even an agent making 20 external lookups per session costs $0.10. The alternative is an agent that confidently writes code against deprecated APIs because it has no way to check what changed upstream.