{"id":52057429,"url":"https://github.com/pirjademl/vento-bot","last_synced_at":"2026-08-02T20:01:42.489Z","repository":{"id":355192851,"uuid":"1224625446","full_name":"pirjademl/vento-bot","owner":"pirjademl","description":"A AI native event driven code reviewer for your multi-language codebases","archived":false,"fork":false,"pushed_at":"2026-06-20T13:03:00.000Z","size":65,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-20T15:06:19.297Z","etag":null,"topics":["ai-agent","code-review","event-driven","golang","qdrant","qdrant-vector-database","rag","vector-database"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pirjademl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-29T13:16:43.000Z","updated_at":"2026-06-20T13:03:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pirjademl/vento-bot","commit_stats":null,"previous_names":["pirjademl/vento-bot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pirjademl/vento-bot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pirjademl%2Fvento-bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pirjademl%2Fvento-bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pirjademl%2Fvento-bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pirjademl%2Fvento-bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pirjademl","download_url":"https://codeload.github.com/pirjademl/vento-bot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pirjademl%2Fvento-bot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36206768,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-08-02T02:00:06.915Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","code-review","event-driven","golang","qdrant","qdrant-vector-database","rag","vector-database"],"created_at":"2026-08-02T20:01:41.717Z","updated_at":"2026-08-02T20:01:42.483Z","avatar_url":"https://github.com/pirjademl.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Vento Bot\n\nAn AI code reviewer that lives inside your GitHub repo. Install it as a GitHub App, and it reviews every pull request and push using context from your *actual codebase* — not just the diff in isolation.\n\nMost AI review bots only look at the changed lines. Vento Bot indexes your whole repo into a vector database first, so when it reviews a PR it can tell you \"this duplicates the retry logic in `utils/retry.go`\" or \"this breaks the error-handling convention used everywhere else in this package.\" It's reviewing against your codebase's actual patterns, not a generic style guide.\n\n## How it works\n\n1. **You install the GitHub App** on a repo.\n2. Vento Bot clones the repo and chunks it — for Go files, it walks the AST and chunks per function/struct/interface/global var, so each chunk is a complete, meaningful unit instead of an arbitrary 50-line slice. Other languages (`.ts`, `.tsx`, `.js`, `.jsx`, `.py`, `.java`) fall back to fixed-size line chunking.\n3. Each chunk gets embedded (Gemini `gemini-embedding-2`, truncated to 768 dims) and upserted into Qdrant, scoped by `repo_id`.\n4. On every **pull request** (opened/reopened) and every **push**, Vento Bot pulls the diff, embeds it, and queries Qdrant for the most relevant existing code in that repo.\n5. That retrieved context + the diff goes to an LLM with a strict reviewer system prompt (intent verification → consistency/redundancy → style, in that priority order). Primary model is Gemini 2.0 Flash; if that call fails, it falls back to Groq (`openai/gpt-oss-120b`) automatically.\n6. The prose review gets run through a second extraction pass that pulls out file+line-anchored findings as structured JSON, so issues get posted as **real inline PR review comments** on the exact lines, with a general comment for anything that doesn't anchor to a line. If extraction fails, it gracefully degrades to one big comment instead of losing the review.\n7. On every push to the default branch, only the changed/removed files get re-chunked and re-synced into Qdrant — it doesn't re-index the whole repo on every commit.\n8. Mention `@vento-bot` in any issue or PR comment and it'll answer using the repo's indexed code, the history of past AI insights on that PR, and the last few comments in the thread for conversational context.\n\n## Architecture\n\n```\nGitHub Webhook (installation / push / pull_request / issue_comment)\n        │\n        ▼\n  JWT auth (RS256) → GitHub App installation token\n        │\n        ▼\n   handlers.WebHookHandler (event router)\n        │\n   ┌────┴─────────────────────────────────┐\n   │                                       │\ninstall/push/PR                     issue_comment (@vento-bot)\n   │                                       │\n   ▼                                       ▼\nclone/fetch changed files          fetch past insights + thread\nAST-aware chunking (Go) /                  │\nline chunking (other langs)                ▼\n   │                              SearchRelatedCode (Qdrant)\n   ▼                                       │\nGemini embeddings → Qdrant upsert          ▼\n   │                              Gemini/Groq → answer\n   ▼                                       │\nSearchRelatedCode (Qdrant)                 ▼\n   │                              posted as issue comment\n   ▼\nGemini → (fallback) Groq review\n   │\n   ▼\nExtract structured JSON (line comments + general comment)\n   │\n   ▼\nPosted as inline PR review + general comment\n```\n\n## Stack\n\n- **Go** — entire service\n- **GitHub Apps API** (`go-github`) — webhooks, installation auth, PR/issue comments, line-level reviews\n- **Qdrant** — vector store, per-repo filtered search\n- **Google Gemini** — embeddings (`gemini-embedding-2`) and primary review/extraction model (`gemini-2.0-flash`)\n- **Groq** (`openai/gpt-oss-120b`) — fallback review and extraction model when Gemini fails\n- **PostgreSQL** (`pgx`) — installations, indexed repos, AI insight history\n- **JWT (RS256)** — GitHub App authentication\n\n## Features\n\n- Real AST-level chunking for Go — functions, structs, interfaces, imports, and global vars are indexed as distinct, complete units\n- Per-repo vector isolation — no cross-repo leakage in retrieval\n- Incremental re-indexing — pushes only re-embed what changed, not the whole repo\n- Dual-LLM fallback — Gemini first, Groq second, so a single provider outage doesn't kill reviews\n- Inline, line-anchored PR comments — not just a wall of text dumped in one comment\n- Conversational memory — `@vento-bot` Q\u0026A pulls in past AI insights and recent thread comments\n- Graceful degradation — if structured extraction fails, the review still posts as prose instead of disappearing\n\n## Setup\n\nYou'll need:\n\n```\nDATABASE_URL\nDATABASE_USER\nDATABASE_NAME\nDATABASE_PASSWORD\nQDRANT_HOST\nQDRANT_API_KEY\nGEMINI_API_KEY\nGROQ_API_KEY\nGROQ_ENDPOINT\nCLIENT_ID                          # GitHub App client ID\nPEM_FILE_PATH                      # path to your GitHub App private key\nPULL_REQUEST_SYSTEM_INSTRUCTION    # reviewer system prompt for the Gemini path\n```\n\n```bash\ngo mod download\ngo run main.go\n```\n\nThe server exposes a single webhook endpoint at `/webhook` — point your GitHub App's webhook URL there.\n\n## Status\n\nActively developed. Currently single-binary, no test suite yet, no deployment config checked in.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpirjademl%2Fvento-bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpirjademl%2Fvento-bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpirjademl%2Fvento-bot/lists"}