Opiniated RAG for integrating GenAI in your apps 🧠 Focus on your product rather than the RAG. Easy integration in existing products with customisation! Any LLM: GPT4, Groq, Llama. Any Vectorstore: PGVector, Faiss. Any Files. Anyway you want.
This report presents the forensic synthetic code analysis of The-Vibe-Company/Quivr, a Python project with 39,452 GitHub stars. SynthScan v2.0 examined 20,189 lines of code across 177 source files, recording 137 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 9.4 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 137 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/tests/test_brain.py | 14 | def test_brain_empty_files_no_vectordb(fake_llm, embedder): | CODE |
| LOW | core/tests/test_brain.py | 37 | async def test_brain_from_files_success( | CODE |
| LOW | core/tests/test_brain.py | 60 | async def test_brain_from_langchain_docs(embedder, fake_llm, mem_vector_store): | CODE |
| LOW⚡ | core/tests/test_utils.py | 13 | def test_model_supports_function_calling(): | CODE |
| LOW⚡ | core/tests/test_utils.py | 18 | def test_get_prev_message_incorrect_message(): | CODE |
| LOW⚡ | core/tests/test_utils.py | 27 | def test_get_prev_message_str(): | CODE |
| LOW | core/tests/test_utils.py | 44 | def test_parse_chunk_response_nofunc_calling(): | CODE |
| LOW | core/tests/test_utils.py | 62 | def test_parse_chunk_response_func_calling(chunks_stream_answer): | CODE |
| LOW | core/tests/test_chat_history.py | 19 | def test_chat_history_constructor(): | CODE |
| LOW | core/tests/test_chat_history.py | 37 | def test_chat_history_get_history(ai_message: AIMessage, human_message: HumanMessage): | CODE |
| LOW | core/tests/test_chat_history.py | 56 | def test_chat_history_iter_pairs_invalid( | CODE |
| LOW | core/tests/test_chat_history.py | 66 | def test_chat_history_iter_pais(ai_message: AIMessage, human_message: HumanMessage): | CODE |
| LOW | core/tests/test_llm_endpoint.py | 11 | def test_llm_endpoint_from_config_default(): | CODE |
| LOW | core/tests/test_llm_endpoint.py | 29 | def test_llm_endpoint_from_config(): | CODE |
| LOW | core/tests/test_llm_endpoint.py | 42 | def test_llm_endpoint_constructor(): | CODE |
| LOW | core/tests/test_config.py | 21 | def test_default_retrievalconfig(): | CODE |
| LOW | core/tests/test_quivr_file.py | 25 | def test_create_file_add_metadata(): | CODE |
| LOW | core/tests/processor/test_registry.py | 26 | def test_get_default_processors_cls(): | CODE |
| LOW | core/tests/processor/test_registry.py | 38 | def test_get_default_processors_cls_core(): | CODE |
| LOW | core/tests/processor/test_registry.py | 46 | def test_append_proc_mapping_empty(): | CODE |
| LOW | core/tests/processor/test_registry.py | 63 | def test_append_proc_mapping_priority(): | CODE |
| LOW⚡ | core/tests/processor/test_registry.py | 142 | def test_get_processor_cls_import_error(caplog): | CODE |
| LOW⚡ | core/tests/processor/test_registry.py | 150 | def test_get_processor_cls_error(): | CODE |
| LOW⚡ | core/tests/processor/test_registry.py | 156 | def test_register_new_proc_noappend(): | CODE |
| LOW⚡ | core/tests/processor/test_registry.py | 162 | def test_register_new_proc_append(caplog): | CODE |
| LOW | core/tests/processor/test_registry.py | 191 | def test_register_non_processor(): | CODE |
| LOW | core/tests/processor/test_registry.py | 199 | def test_register_override_proc(): | CODE |
| LOW | core/tests/processor/test_registry.py | 215 | def test_register_override_error(): | CODE |
| LOW | core/tests/processor/test_registry.py | 233 | def test_available_processors(): | CODE |
| LOW | core/tests/processor/test_simple_txt_processor.py | 11 | def test_recursive_character_splitter(): | CODE |
| LOW | core/tests/processor/test_tika_processor.py | 18 | async def test_send_parse_tika_exception(quivr_pdf): | CODE |
| LOW | …tests/processor/pdf/test_unstructured_pdf_processor.py | 14 | async def test_unstructured_pdf_processor(): | CODE |
| LOW | …tests/processor/pdf/test_unstructured_pdf_processor.py | 34 | async def test_unstructured_pdf_processor_fail(ext): | CODE |
| LOW | …e/tests/processor/community/test_markdown_processor.py | 30 | async def test_markdown_processor_fail(quivr_txt): | CODE |
| LOW | core/quivr_core/llm/llm_endpoint.py | 66 | def _calculate_tokenizer_size(self) -> int: | CODE |
| LOW | …core/processor/implementations/simple_txt_processor.py | 12 | def recursive_character_splitter( | CODE |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 198 | def has_non_completable_tasks(self) -> bool: | CODE |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 521 | def filter_chunks_by_relevance(self, chunks: List[Document], **kwargs): | CODE |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 770 | async def retrieve_full_documents_context(self, state: AgentState) -> AgentState: | CODE |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 1157 | def _is_final_node_and_chat_model_stream(self, event: StreamEvent) -> bool: | CODE |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 1175 | async def ainvoke_structured_output( | CODE |
| LOW | core/quivr_core/rag/utils.py | 26 | def model_supports_function_calling(model_name: str): | CODE |
| LOW | core/quivr_core/rag/utils.py | 32 | def format_history_to_openai_mesages( | CODE |
| LOW | core/quivr_core/rag/utils.py | 117 | def get_answers_from_tool_calls(tool_calls): | CODE |
| LOW | core/quivr_core/rag/entities/config.py | 24 | def normalize_to_env_variable_name(name: str) -> str: | CODE |
| LOW | core/quivr_core/rag/entities/config.py | 281 | def get_supplier_by_model_name(cls, model: str) -> DefaultModelSuppliers | None: | CODE |
| LOW | core/quivr_core/rag/entities/config.py | 510 | def resolve_special_edges_in_name_and_edges(self): | CODE |
| LOW | core/quivr_core/rag/entities/config.py | 563 | def check_first_node_is_start(self): | CODE |
| LOW | core/quivr_core/brain/brain.py | 402 | async def afrom_langchain_documents( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | core/quivr_core/rag/prompts.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | core/quivr_core/rag/prompts.py | 35 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | core/quivr_core/rag/prompts.py | 57 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | core/quivr_core/rag/prompts.py | 59 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | core/quivr_core/rag/prompts.py | 111 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | core/quivr_core/rag/prompts.py | 113 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | core/quivr_core/rag/prompts.py | 119 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | core/quivr_core/rag/prompts.py | 121 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | core/quivr_core/rag/prompts.py | 142 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | core/quivr_core/rag/prompts.py | 144 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | core/quivr_core/rag/prompts.py | 166 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | core/quivr_core/rag/prompts.py | 168 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | core/quivr_core/rag/prompts.py | 196 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | core/quivr_core/rag/prompts.py | 198 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | core/quivr_core/rag/prompts.py | 233 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | core/quivr_core/rag/prompts.py | 235 | # --------------------------------------------------------------------------- | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/chatbot/.chainlit/translations/mr.json | 125 | "placeholder": "\u0924\u0941\u092e\u091a\u093e \u092e\u0947\u0938\u0947\u091c \u0907\u0925\u0947 | CODE |
| LOW | examples/chatbot/.chainlit/translations/bn.json | 125 | "placeholder": "\u098f\u0996\u09be\u09a8\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09be\u09b0 | CODE |
| LOW | examples/chatbot/.chainlit/translations/ta.json | 125 | "placeholder": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0baf\ | CODE |
| LOW | examples/chatbot/.chainlit/translations/zh-CN.json | 123 | "placeholder": "\u5728\u8fd9\u91cc\u8f93\u5165\u60a8\u7684\u6d88\u606f..." | CODE |
| LOW | examples/chatbot/.chainlit/translations/ml.json | 125 | "placeholder": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d28\u0d4d\u0d26\ | CODE |
| LOW | examples/chatbot/.chainlit/translations/kn.json | 125 | "placeholder": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0cb5\u0ca8\u0ccd\ | CODE |
| LOW | examples/chatbot/.chainlit/translations/gu.json | 125 | "placeholder": "\u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0acb \u0a85\u0ab9 | CODE |
| LOW | examples/chatbot/.chainlit/translations/hi.json | 125 | "placeholder": "\u0905\u092a\u0928\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0939\u093e\u0901 | CODE |
| LOW | examples/chatbot/.chainlit/translations/te.json | 125 | "placeholder": "\u0c2e\u0c40 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c07 | CODE |
| LOW | examples/chatbot/.chainlit/translations/he-IL.json | 125 | "placeholder": "\u05db\u05ea\u05d5\u05d1 \u05d4\u05d5\u05d3\u05e2\u05d4 \u05db\u05d0\u05df..." | CODE |
| LOW | examples/chatbot/.chainlit/translations/en-US.json | 123 | "placeholder": "Type your message here..." | CODE |
| LOW | examples/chatbot_voice/.chainlit/translations/mr.json | 125 | "placeholder": "\u0924\u0941\u092e\u091a\u093e \u092e\u0947\u0938\u0947\u091c \u0907\u0925\u0947 | CODE |
| LOW | examples/chatbot_voice/.chainlit/translations/bn.json | 125 | "placeholder": "\u098f\u0996\u09be\u09a8\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09be\u09b0 | CODE |
| LOW | examples/chatbot_voice/.chainlit/translations/ta.json | 125 | "placeholder": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0baf\ | CODE |
| LOW | …amples/chatbot_voice/.chainlit/translations/zh-CN.json | 123 | "placeholder": "\u5728\u8fd9\u91cc\u8f93\u5165\u60a8\u7684\u6d88\u606f..." | CODE |
| LOW | examples/chatbot_voice/.chainlit/translations/ml.json | 125 | "placeholder": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d28\u0d4d\u0d26\ | CODE |
| LOW | examples/chatbot_voice/.chainlit/translations/kn.json | 125 | "placeholder": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0cb5\u0ca8\u0ccd\ | CODE |
| LOW | examples/chatbot_voice/.chainlit/translations/gu.json | 125 | "placeholder": "\u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0acb \u0a85\u0ab9 | CODE |
| LOW | examples/chatbot_voice/.chainlit/translations/hi.json | 125 | "placeholder": "\u0905\u092a\u0928\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0939\u093e\u0901 | CODE |
| LOW | examples/chatbot_voice/.chainlit/translations/te.json | 125 | "placeholder": "\u0c2e\u0c40 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c07 | CODE |
| LOW | …amples/chatbot_voice/.chainlit/translations/he-IL.json | 125 | "placeholder": "\u05db\u05ea\u05d5\u05d1 \u05d4\u05d5\u05d3\u05e2\u05d4 \u05db\u05d0\u05df..." | CODE |
| LOW | …amples/chatbot_voice/.chainlit/translations/en-US.json | 123 | "placeholder": "Type your message here..." | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 80 | #### Basic RAG | COMMENT |
| MEDIUM⚡ | core/quivr_core/rag/prompts.py | 58 | # Prompt for RAG | COMMENT |
| MEDIUM | core/quivr_core/brain/brain.py | 132 | # RAG dependencies: | COMMENT |
| MEDIUM | docs/docs/workflows/examples/basic_rag.md | 1 | # Basic RAG | COMMENT |
| MEDIUM | docs/docs/workflows/examples/rag_with_web_search.md | 1 | # RAG with web search | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/quivr_core/llm/llm_endpoint.py | 101 | # Check if adding this would exceed either cache limit | COMMENT |
| LOW | core/quivr_core/llm/llm_endpoint.py | 162 | # Check if the model name matches or starts with the base model name | COMMENT |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 980 | # Check if there is a system message in messages | COMMENT |
| LOW | core/quivr_core/rag/entities/config.py | 28 | # Check if the normalized name starts with a digit | COMMENT |
| LOW | core/quivr_core/rag/entities/config.py | 284 | # Check if the model name or a base part of the model name is in the supplier's models | COMMENT |
| LOW | core/quivr_core/rag/entities/config.py | 353 | # Check if the corresponding API key environment variable is set | COMMENT |
| LOW | core/quivr_core/rag/entities/config.py | 458 | # Check if the corresponding API key environment variable is set | COMMENT |
| LOW | examples/simple_question_megaparse.py | 33 | # Check if user wants to exit | COMMENT |
| LOW | examples/pdf_parsing_tika.py | 30 | # Check if user wants to exit | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/quivr_core/__init__.py | 9 | CODE | |
| LOW | core/quivr_core/llm/llm_endpoint.py | 145 | CODE | |
| LOW | core/quivr_core/llm/llm_endpoint.py | 212 | CODE | |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 393 | CODE | |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 844 | CODE | |
| LOW | core/quivr_core/rag/quivr_rag_langgraph.py | 1164 | CODE | |
| LOW | core/quivr_core/rag/utils.py | 130 | CODE | |
| LOW | core/quivr_core/rag/quivr_rag.py | 188 | CODE | |
| LOW | core/quivr_core/rag/entities/config.py | 478 | CODE | |
| LOW | core/quivr_core/rag/entities/config.py | 510 | CODE | |
| LOW | core/quivr_core/rag/entities/config.py | 574 | CODE | |
| LOW | core/quivr_core/brain/brain.py | 47 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/quivr_core/__init__.py | 3 | CODE | |
| LOW | core/quivr_core/__init__.py | 4 | CODE | |
| LOW | core/quivr_core/llm/__init__.py | 1 | CODE | |
| LOW | core/quivr_core/files/__init__.py | 1 | CODE | |
| LOW | core/quivr_core/brain/__init__.py | 1 | CODE | |
| LOW | examples/quivr-whisper/app.py | 5 | CODE | |
| LOW | examples/quivr-whisper/app.py | 8 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/docs/vectorstores/pgvector.md | 1 | # PGVector | COMMENT |
| LOW | docs/docs/vectorstores/faiss.md | 1 | # Faiss | COMMENT |
| LOW | docs/docs/examples/index.md | 1 | # Examples | COMMENT |
| LOW | examples/chatbot/basic_rag_workflow.yaml | 21 | # Maximum number of previous conversation iterations | COMMENT |
| LOW | examples/chatbot/.chainlit/config.toml | 61 | # Large size content are by default collapsed for a cleaner ui | COMMENT |
| LOW | examples/chatbot_voice/basic_rag_workflow.yaml | 21 | max_history: 10 | COMMENT |
| LOW | examples/chatbot_voice/.chainlit/config.toml | 61 | # Large size content are by default collapsed for a cleaner ui | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | core/scripts/run_tests_buildx.sh | 19 | # Create the builder if it doesn't exist | COMMENT |
| MEDIUM | core/quivr_core/rag/quivr_rag_langgraph.py | 658 | # Create a tuple of the retrieval task and task_id | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | core/quivr_core/brain/brain.py | 50 | Process files in storage. This function takes a StorageBase and return a list of langchain documents. Args: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/quivr_core/__init__.py | 6 | __all__ = ["Brain", "registry", "register_processor"] | CODE |
| LOW | core/quivr_core/llm/__init__.py | 3 | __all__ = ["LLMEndpoint"] | CODE |
| LOW | core/quivr_core/files/__init__.py | 3 | __all__ = ["QuivrFile"] | CODE |
| LOW | core/quivr_core/brain/__init__.py | 3 | __all__ = ["Brain"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/quivr_core/llm/llm_endpoint.py | 185 | except Exception as e: | CODE |
| LOW | …quivr_core/processor/implementations/tika_processor.py | 62 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | core/quivr_core/rag/quivr_rag.py | 186 | CODE |