Skip to main content

LlamaIndex Integration

← Docs

Use 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

See also