Problem: open-source maintainers spend a lot of time managing duplicate/related (doppelgänger) issues & pull requests
Solution: doppelgänger compares newly submitted issues/PRs against existing ones to automatically flag duplicate/related (doppelgänger) issues/PRs
Topics: vector db, github, open-source, embedding search, rag, similarity scores
This application is a GitHub App that automatically compares newly opened issues with existing ones, closing and commenting on highly similar issues to reduce duplication. In addition, it comments feedback on PRs based on title and description for points to consider.
Doppelganger Documentation
Each issue['title'] and issue['body'] is converted into vector representation using MiniLM-L6-v2.
Each vector are persisted in ChromaDB and performs similarity search using ChromaDB's built-in cosine similarity search. Along with each vector are issue_id and issue['title'] stored using ChromaDB's metadata argument.
SIMILARITY_THRESHOLD (i.e. distance d in which we consider "similar") is configurable, and can be set to any decimal between 0 and 1 [1].
Doppelganger will close any issue when the cosine distance d between the newly submitted issue and the most similar issue is greater than this threshold. Otherwise, if the newly submitted issue is greater than (SIMILARTY_THRESHOLD*0.5), it will leave a helpful comment indicating the most similar/related issue.
[1] cosine distance
Issues and pull requests are stored in ChromaDB collections per repository.
Clone this repository:
git clone https://github.com/dannyl1u/doppelganger.git
cd doppelganger
Install dependencies:
pip install -r requirements.txt
To create a new .env file, run the following command in your terminal:
cp .env.example .envOpen the newly created .env file and update the following variables with your own values:
* APP_ID: Replace your_app_id_here with your actual app ID.
* WEBHOOK_SECRET: Replace your_webhook_secret_here with your actual webhook secret.
* OLLAMA_MODEL: Replace your_chosen_llm_model_here with your chosen LLM model (e.g. "llama3.2"). Note: it must be an Ollama supported model (see: https://ollama.com/library for supported models)
* NGROK_DOMAIN: Replace your_ngrok_domain_here with your ngrok domain if you have one
4. Place the downloaded private key in the project root and name it rsa.pem.
Start the Flask application:
python3 app.pyThe application will start running on http://localhost:4000
We will use ngrok for its simplicity
Option 1: generated public URL In a new terminal window, start ngrok to create a secure tunnel to your local server:
ngrok http 4000ngrok will generate a public URL (e.g., https://abc123.ngrok.io)
Append /webhook to the url, e.g. https://abc123.ngrok.io -> https://abc123.ngrok.io/webhook
In another terminal window, start Ollama
ollama run <an OLLAMA model here>Option 2: Using Shell Script with your own ngrok domain
Ensure environment variables are all set.
./run-dev.shOnce installed, the app will automatically:
You can adjust the similarity threshold by modifying the SIMILARITY_THRESHOLD variable in the script. The default is set to 0.5.
rsa.pem file is present and correctly formatted.Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License.