LlamaIndex Integration
← DocsUse Wikitopia as a structured knowledge source in LlamaIndex RAG pipelines.
Custom Tool
Create a LlamaIndex FunctionTool that queries the Wikitopia API.
import requests
from llama_index.core.tools import FunctionTool
API_URL = "https://api.wikitopia.org"
def wikitopia_search(query: str) -> str:
"""Search Wikitopia for verified facts about AI tools, models, and companies."""
res = requests.get(f"{API_URL}/v1/search",
params={"q": query, "mode": "hybrid", "limit": 5})
results = res.json().get("results", [])
return "\n".join([
f"- {r['canonical_name']} ({r['entity_type']}): "
f"{r.get('description', '')[:100]}"
for r in results
]) or "No results found."
def wikitopia_entity(name: str) -> str:
"""Get detailed profile of an AI entity from Wikitopia."""
res = requests.get(f"{API_URL}/v1/entities/{name}")
if res.status_code != 200:
return f"Entity '{name}' not found."
e = res.json()
lines = [f"{e['canonical_name']} ({e['entity_type']})"]
if e.get("description"):
lines.append(e["description"])
for c in e.get("claims", [])[:10]:
lines.append(f" {c['predicate']}: {c['object_value']}")
return "\n".join(lines)
search_tool = FunctionTool.from_defaults(fn=wikitopia_search)
entity_tool = FunctionTool.from_defaults(fn=wikitopia_entity)Usage with ReAct Agent
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
llm = OpenAI(model="gpt-4o-mini")
agent = ReActAgent.from_tools(
[search_tool, entity_tool],
llm=llm,
verbose=True,
)
response = agent.chat("What are the main differences between Pinecone and Weaviate?")
print(response)Custom QueryEngine (advanced)
For deeper integration, create a custom retriever backed by Wikitopia's hybrid search.
from llama_index.core import Document
from llama_index.core.retrievers import BaseRetriever
from llama_index.core.schema import NodeWithScore, TextNode
class WikitopiaRetriever(BaseRetriever):
def _retrieve(self, query_str: str) -> list[NodeWithScore]:
res = requests.get(f"{API_URL}/v1/search",
params={"q": query_str, "mode": "hybrid", "limit": 10})
results = res.json().get("results", [])
nodes = []
for r in results:
text = f"{r['canonical_name']} ({r['entity_type']}): {r.get('description', '')}"
node = TextNode(text=text, metadata={"entity": r["canonical_name"]})
nodes.append(NodeWithScore(node=node, score=r.get("score", 0.5)))
return nodes