examples.api_example

Using GitHubSearchEngine in an API.

First, build a simple API using FastAPI. The API handles indexing a repo, and searching through an indexed repo.

 1import os
 2from contextlib import asynccontextmanager
 3
 4from fastapi import FastAPI
 5from pydantic import BaseModel
 6
 7from github_search_engine.github_search_engine import GithubSearchEngine
 8
 9
10search_engine: GithubSearchEngine | None = None
11
12
13class Repository(BaseModel):
14  owner: str
15  repository_name: str
16
17
18@asynccontextmanager
19async def lifespan(app: FastAPI):
20  global search_engine
21  github_access_token = os.environ["GITHUB_PAT"]
22  search_engine = GithubSearchEngine(
23    github_access_token, qdrant_location=":memory:"
24  )
25  yield
26  del search_engine
27
28
29api = FastAPI(lifespan=lifespan)
30
31
32@api.post("/index")
33async def index(repository: Repository):
34  await search_engine.index_repository(
35    repository.owner,
36    repository.repository_name,
37  )
38  return {"message": "Repository indexed"}
39
40
41@api.get("/search")
42async def search(owner: str, repository: str, query: str):
43  results = search_engine.search(owner, repository, query)
44  summary = search_engine.summarise_results(results, owner, repository, query)
45  return summary

Then, we can launch the API with uvicorn.

1import uvicorn
2
3
4if __name__ == "__main__":
5  uvicorn.run("github_search_engine._api.api:api", host="0.0.0.0", port=8000)