"RAG-Anything: All-in-One RAG Framework"
This report summarizes scanner evidence for HKUDS/RAG-Anything, a Python project with 23,515 GitHub stars. SynthScan examined 40,144 lines of code across 115 source files, recording 1059 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 37.6 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 737 finding(s).
Are imports declared and package/API names verified? 57 finding(s).
Are wrappers, guards, and repeated structures necessary? 812 finding(s).
Which changes need focused human review? 1059 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1059 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 476 | async def process_multimodal_content(): | CODE |
| LOW | README.md | 603 | async def process_multimodal_content(self, modal_content, content_type, file_path, entity_name): | STRING |
| LOW | README.md | 821 | async def insert_content_list_example(): | CODE |
| LOW | README_zh.md | 456 | async def process_multimodal_content(): | CODE |
| LOW | README_zh.md | 585 | async def process_multimodal_content(self, modal_content, content_type, file_path, entity_name): | STRING |
| LOW | README_zh.md | 802 | async def insert_content_list_example(): | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 46 | def get_accuracy_evaluation_prompt( | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 491 | async def evaluate_multiple_results( | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 848 | async def evaluate_standard_rag_results( | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 1058 | def generate_evaluation_report(self, total_time: float): | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 1489 | def load_existing_evaluations(self): | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 1544 | def update_evaluation_results_list(self, new_results: List[Dict[str, Any]]): | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 1566 | def persist_single_evaluation(self, evaluation_result: Dict[str, Any]): | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 89 | def get_comprehensive_evaluation_prompt( | STRING |
| LOW | reproduce/llm_answer_evaluator.py | 213 | def create_fallback_evaluation(self, response: str) -> Dict[str, Any]: | STRING |
| LOW | tests/test_media_file_routing.py | 78 | async def test_audio_file_becomes_single_audio_item(tmp_path, ext): | CODE |
| LOW | tests/test_media_file_routing.py | 97 | async def test_video_file_becomes_single_video_item(tmp_path, ext): | CODE |
| LOW | tests/test_media_file_routing.py | 110 | async def test_media_items_classify_as_multimodal(tmp_path): | CODE |
| LOW | tests/test_media_file_routing.py | 123 | async def test_replacing_media_bytes_changes_doc_id(tmp_path): | CODE |
| LOW | tests/test_media_file_routing.py | 140 | async def test_media_parse_is_cached(tmp_path): | CODE |
| LOW | tests/test_media_file_routing.py | 153 | async def test_non_media_files_still_use_the_parser(tmp_path): | CODE |
| LOW | tests/test_full_entities_merge.py | 10 | def _load_merge_logic_function_source(): | CODE |
| LOW | tests/test_full_entities_merge.py | 52 | def test_implementation_preserves_existing_metadata_fields(): | CODE |
| LOW | tests/test_full_entities_merge.py | 59 | def test_create_new_full_entities_entry(): | CODE |
| LOW | tests/test_full_entities_merge.py | 74 | def test_preserves_existing_fields_when_merging_multimodal_entities(): | CODE |
| LOW | tests/test_full_entities_merge.py | 95 | def test_deduplicates_new_entity_names_without_reordering_existing_ones(): | CODE |
| LOW | tests/test_callbacks.py | 36 | def on_multimodal_item_complete( | CODE |
| LOW | tests/test_callbacks.py | 64 | def test_register_and_dispatch(self): | CODE |
| LOW⚡ | tests/test_callbacks.py | 90 | def test_register_rejects_non_callback(self): | CODE |
| LOW⚡ | tests/test_callbacks.py | 95 | def test_dispatch_handles_callback_errors(self): | CODE |
| LOW⚡ | tests/test_callbacks.py | 105 | def test_dispatch_unknown_event(self): | CODE |
| LOW⚡ | tests/test_callbacks.py | 113 | def test_event_log_disabled_by_default(self): | CODE |
| LOW | tests/test_callbacks.py | 184 | def test_process_document_emits_callbacks(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_callbacks.py | 255 | def test_query_emits_callbacks(self, monkeypatch): | CODE |
| LOW | tests/test_image_caption_string_normalization.py | 69 | async def test_string_captions_are_not_joined_per_character(processor): | CODE |
| LOW | tests/test_image_caption_string_normalization.py | 92 | async def test_list_captions_keep_working(processor): | CODE |
| LOW | tests/test_image_caption_string_normalization.py | 111 | def test_context_extractor_string_caption_is_not_joined_per_character(): | CODE |
| LOW | tests/test_multimodal_chunks_list_merge.py | 32 | def _install_minimal_lightrag_stubs(): | CODE |
| LOW | tests/test_multimodal_chunks_list_merge.py | 93 | def test_merge_appends_new_chunk_ids_and_updates_count(): | CODE |
| LOW | tests/test_multimodal_chunks_list_merge.py | 108 | def test_reprocessing_same_ids_does_not_duplicate(): | CODE |
| LOW | tests/test_multimodal_chunks_list_merge.py | 122 | def test_partial_overlap_appends_only_missing_ids(): | CODE |
| LOW | tests/test_multimodal_chunks_list_merge.py | 137 | def test_missing_record_warns_instead_of_silently_skipping(): | CODE |
| LOW | tests/test_vlm_query_flags.py | 29 | async def _ensure_lightrag_initialized(self): | CODE |
| LOW | tests/test_vlm_query_flags.py | 72 | async def test_retrieval_only_returns_unmodified_lightrag_result( | CODE |
| LOW | tests/test_vlm_query_flags.py | 103 | async def test_answer_queries_still_send_retrieved_images_to_vision( | CODE |
| LOW | tests/test_vlm_query_flags.py | 119 | async def test_explicit_false_flags_preserve_text_fallback(harness, entrypoint): | CODE |
| LOW | tests/test_initialization_lifecycle.py | 57 | async def initialize_pipeline_status(): | CODE |
| LOW | tests/test_initialization_lifecycle.py | 90 | async def test_concurrent_initialization_waits_for_ready_storages( | CODE |
| LOW | tests/test_initialization_lifecycle.py | 124 | async def test_failed_cache_initialization_is_retried( | CODE |
| LOW | tests/test_mineru_content.py | 416 | def test_layout_option_isolated_in_parse_cache_key(tmp_path): | CODE |
| LOW | tests/test_mineru_content.py | 442 | def test_parse_pdf_wires_layout_option_to_output_reader(tmp_path): | CODE |
| LOW | tests/test_mineru_content.py | 457 | def test_parse_image_wires_layout_option_to_output_reader(tmp_path): | CODE |
| LOW | tests/test_parse_options.py | 7 | def test_processor_uses_the_shared_whitelist(): | CODE |
| LOW | tests/test_parse_options.py | 11 | def test_processor_normalisation_delegates_to_shared_helper(): | CODE |
| LOW | tests/test_resilience.py | 22 | def test_retries_on_transient_error(self): | CODE |
| LOW | tests/test_resilience.py | 40 | def test_raises_after_max_attempts(self): | CODE |
| LOW | tests/test_resilience.py | 52 | def test_does_not_retry_non_retryable(self): | CODE |
| LOW | tests/test_resilience.py | 95 | def test_jitter_respects_max_delay(self, monkeypatch): | CODE |
| LOW | tests/test_resilience.py | 136 | async def test_retries_on_transient_error(self): | CODE |
| LOW | tests/test_resilience.py | 155 | async def test_raises_after_max_attempts(self): | CODE |
| 482 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | requirements.txt | 3 | # <1.5 is permanent: RAG-Anything was merged upstream into LightRAG 1.5+, and | COMMENT |
| MEDIUM | README.md | 7 | # 🚀 RAG-Anything: All-in-One RAG Framework | COMMENT |
| MEDIUM | README.md | 1010 | written to the old one — see [#154](https://github.com/HKUDS/RAG-Anything/issues/154). | CODE |
| MEDIUM | README.md | 1107 | - See **[docs/multimodal_rag_failure_modes.md](docs/multimodal_rag_failure_modes.md)** for a short checklist of common p | CODE |
| MEDIUM | README.md | 1120 | After parsing, each non-empty `img_path`, `table_img_path`, or `equation_img_path` may gain a sibling field `*_public_ur | CODE |
| MEDIUM | README.md | 1362 | <span style="color: #00d9ff; font-size: 18px;">Thank you for visiting RAG-Anything!</span> | CODE |
| MEDIUM | README_zh.md | 7 | # 🚀 RAG-Anything: All-in-One RAG System | COMMENT |
| MEDIUM | README_zh.md | 986 | 默认情况下,`process_document_complete` 和 `insert_content_list` 会跳过已标记为"完全处理完成"文档的多模态(图像/表格/公式)处理,以避免重复的 LLM 调用。如果您切换到了**新的**图 | CODE |
| MEDIUM | reproduce/query.py | 315 | # Process with RAG | COMMENT |
| MEDIUM | reproduce/index.py | 263 | # Process with RAG | COMMENT |
| MEDIUM⚡ | reproduce/llm_answer_evaluator.py | 1419 | # Check the RAG hybrid result error. | COMMENT |
| MEDIUM⚡ | reproduce/llm_answer_evaluator.py | 1426 | # Check the RAG mix result error. | COMMENT |
| MEDIUM⚡ | reproduce/llm_answer_evaluator.py | 1433 | # Check the RAG naive result error. | COMMENT |
| MEDIUM | reproduce/llm_answer_evaluator.py | 472 | # Load RAG evaluation results. | COMMENT |
| MEDIUM | reproduce/llm_answer_evaluator.py | 1465 | # RAG errors. | COMMENT |
| MEDIUM | reproduce/llm_answer_evaluator.py | 1743 | # Support multiple result-file inputs (RAG/VLM), which can coexist with the QA directory option. | COMMENT |
| MEDIUM | reproduce/llm_answer_evaluator.py | 616 | else: # RAG results | CODE |
| MEDIUM | docs/offline_setup.md | 1 | # Running RAG-Anything in an Offline Environment | COMMENT |
| MEDIUM | docs/batch_processing.md | 102 | ### Integration with RAG-Anything | COMMENT |
| MEDIUM | docs/batch_processing.md | 120 | ### Process Documents with RAG Integration | COMMENT |
| MEDIUM | docs/batch_processing.md | 123 | # Process documents in batch and then add them to RAG | COMMENT |
| MEDIUM | docs/enhanced_markdown.md | 294 | ## Integration with RAG-Anything | COMMENT |
| MEDIUM | docs/enhanced_markdown.md | 301 | # Initialize RAG-Anything | COMMENT |
| MEDIUM | docs/enhanced_markdown.md | 314 | # before being processed by the RAG system | COMMENT |
| MEDIUM | docs/multimodal_rag_failure_modes.md | 1 | # Multimodal RAG: common failure modes and quick checks | COMMENT |
| MEDIUM | docs/multimodal_rag_failure_modes.md | 5 | It is meant to stay small and easy to maintain (see discussion in [#207](https://github.com/HKUDS/RAG-Anything/issues/20 | CODE |
| MEDIUM | docs/multimodal_rag_failure_modes.md | 59 | - [#48](https://github.com/HKUDS/RAG-Anything/issues/48) style: large PDFs and OCR are inherently heavy—batch size and h | CODE |
| MEDIUM | docs/vllm_integration.md | 1 | # vLLM Integration Guide for RAG-Anything | COMMENT |
| MEDIUM | docs/vllm_integration.md | 94 | ### Qwen 2.5 (Recommended for RAG) | COMMENT |
| MEDIUM | docs/vllm_integration.md | 148 | # RAG chunks are typically <4K tokens; 8192 is often sufficient | COMMENT |
| MEDIUM | raganything/modalprocessors.py | 163 | # Check if item is within context window and matches filter criteria | COMMENT |
| MEDIUM | raganything/omml_extractor.py | 534 | # equation searchable for downstream RAG even when the operator is | COMMENT |
| MEDIUM⚡ | raganything/batch.py | 386 | # Step 2: Process with RAG | COMMENT |
| MEDIUM⚡ | raganything/batch.py | 387 | # Initialize RAG system | COMMENT |
| MEDIUM⚡ | raganything/batch.py | 394 | # Then, process each successful file with RAG | COMMENT |
| MEDIUM⚡ | raganything/batch.py | 402 | # Process files with RAG (this could be parallelized in the future) | COMMENT |
| MEDIUM⚡ | raganything/batch.py | 405 | # Process the successfully parsed file with RAG | COMMENT |
| MEDIUM⚡ | raganything/batch.py | 414 | # This would require additional tracking in the RAG system | COMMENT |
| MEDIUM | examples/ollama_integration_example.py | 19 | ollama pull nomic-embed-text # embedding model (768-dim) | STRING |
| MEDIUM | examples/ollama_integration_example.py | 39 | # RAG-Anything imports | COMMENT |
| MEDIUM | examples/raganything_example.py | 317 | # Process with RAG | COMMENT |
| MEDIUM⚡ | examples/batch_processing_example.py | 245 | # Initialize RAG-Anything with temporary storage | COMMENT |
| MEDIUM | examples/batch_processing_example.py | 262 | # Demonstrate batch processing with RAG integration | COMMENT |
| MEDIUM | examples/batch_processing_example.py | 265 | # Use the RAG-integrated batch processing | COMMENT |
| MEDIUM | examples/batch_processing_example.py | 281 | # Demonstrate batch processing with full RAG integration | COMMENT |
| MEDIUM | examples/batch_processing_example.py | 515 | # RAG integration | COMMENT |
| MEDIUM | examples/vllm_integration_example.py | 45 | # RAG-Anything imports | COMMENT |
| MEDIUM | examples/vllm_integration_example.py | 110 | # RAG-Anything configuration | COMMENT |
| MEDIUM | examples/vllm_integration_example.py | 331 | # Initialize RAG | COMMENT |
| MEDIUM | examples/minimax_integration_example.py | 44 | # RAG-Anything imports | COMMENT |
| MEDIUM | examples/minimax_integration_example.py | 57 | # Embedding configuration (MiniMax does not provide an embedding model; | COMMENT |
| MEDIUM | examples/minimax_integration_example.py | 137 | # RAG-Anything configuration | COMMENT |
| MEDIUM | examples/lmstudio_integration_example.py | 31 | # RAG-Anything imports | COMMENT |
| MEDIUM | examples/lmstudio_integration_example.py | 88 | # RAG-Anything configuration | COMMENT |
| MEDIUM | examples/lmstudio_integration_example.py | 318 | # Initialize RAG | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | reproduce/query.py | 270 | except Exception as e: | CODE |
| LOW | reproduce/index.py | 218 | except Exception as e: | CODE |
| MEDIUM⚡ | reproduce/llm_answer_evaluator.py | 1810 | print(f"Error: result file does not exist: {file_path}") | CODE |
| MEDIUM | reproduce/llm_answer_evaluator.py | 1797 | print("Error: an OpenAI API key is required") | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 442 | except Exception as e: | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 1518 | except Exception as e: | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 1601 | except Exception as e: | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 1621 | except Exception: | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 1868 | except Exception as e: | CODE |
| LOW | reproduce/llm_answer_evaluator.py | 209 | except Exception as e: | STRING |
| LOW⚡ | tests/test_close_event_loop.py | 37 | except Exception: | CODE |
| LOW⚡ | tests/test_close_event_loop.py | 41 | except Exception: | CODE |
| LOW | tests/testparser_kwargs.py | 77 | except Exception: | CODE |
| LOW | tests/test_text_chunk_page_idx.py | 138 | except Exception: # split_by_character_only piece over the limit | CODE |
| LOW | docs/enhanced_markdown.md | 487 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 116 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 450 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 517 | except Exception: | CODE |
| LOW | raganything/modalprocessors.py | 1014 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 1081 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 1214 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 1276 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 1402 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 1459 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 1576 | except Exception as e: | CODE |
| LOW | raganything/modalprocessors.py | 1622 | except Exception as e: | CODE |
| LOW | raganything/raganything.py | 187 | except Exception: | CODE |
| LOW | raganything/raganything.py | 191 | except Exception: | CODE |
| LOW | raganything/raganything.py | 401 | except Exception as e: | CODE |
| LOW | raganything/raganything.py | 475 | except Exception as e: | CODE |
| LOW | raganything/raganything.py | 480 | except Exception as e: | CODE |
| LOW⚡ | raganything/raganything.py | 533 | except Exception as e: | CODE |
| LOW | raganything/raganything.py | 632 | except Exception as e: | CODE |
| LOW | raganything/raganything.py | 670 | except Exception as e: | CODE |
| LOW | raganything/omml_extractor.py | 197 | except Exception as e: # pragma: no cover - defensive | CODE |
| LOW | raganything/query.py | 198 | except Exception as exc: | CODE |
| LOW | raganything/query.py | 320 | except Exception as e: | CODE |
| LOW | raganything/query.py | 365 | except Exception as e: | CODE |
| LOW | raganything/query.py | 378 | except Exception as e: | CODE |
| LOW | raganything/query.py | 507 | except Exception as e: | CODE |
| LOW | raganything/query.py | 544 | except Exception as e: | CODE |
| LOW | raganything/query.py | 696 | except Exception: | CODE |
| LOW | raganything/query.py | 706 | except Exception: | CODE |
| LOW | raganything/query.py | 740 | except Exception as e: | CODE |
| LOW | raganything/query.py | 864 | except Exception as e: | CODE |
| LOW⚡ | raganything/batch.py | 417 | except Exception as e: | CODE |
| LOW | raganything/batch.py | 144 | except Exception as e: | CODE |
| LOW | raganything/batch.py | 298 | except Exception: | CODE |
| LOW⚡ | raganything/processor.py | 183 | except Exception: | CODE |
| LOW | raganything/processor.py | 316 | except Exception as exc: | CODE |
| LOW | raganything/processor.py | 549 | except Exception as e: | CODE |
| LOW | raganything/processor.py | 604 | except Exception as e: | CODE |
| LOW | raganything/processor.py | 794 | except Exception as e: | CODE |
| LOW | raganything/processor.py | 934 | except Exception as e: | CODE |
| LOW | raganything/processor.py | 971 | except Exception as e: | CODE |
| LOW | raganything/processor.py | 1065 | except Exception as e: | CODE |
| LOW | raganything/processor.py | 1137 | except Exception: | CODE |
| LOW | raganything/processor.py | 1224 | except Exception as e: | CODE |
| LOW | raganything/processor.py | 1470 | except Exception as e: | CODE |
| LOW | raganything/processor.py | 1490 | except Exception as e: | CODE |
| 116 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | reproduce/llm_answer_evaluator.py | 278 | except ValueError: | CODE |
| HIGH | tests/test_close_event_loop.py | 41 | except Exception: | CODE |
| HIGH | tests/test_close_event_loop.py | 37 | except Exception: | CODE |
| HIGH | tests/testparser_kwargs.py | 77 | except Exception: | CODE |
| HIGH | raganything/modalprocessors.py | 517 | except Exception: | CODE |
| HIGH | raganything/raganything.py | 191 | except Exception: | CODE |
| HIGH | raganything/raganything.py | 187 | except Exception: | CODE |
| HIGH | raganything/query.py | 696 | except Exception: | CODE |
| HIGH | raganything/__init__.py | 15 | except ImportError: | CODE |
| HIGH | raganything/__init__.py | 26 | except ModuleNotFoundError: | CODE |
| HIGH | raganything/__init__.py | 29 | except ImportError: | CODE |
| HIGH | raganything/__init__.py | 41 | except ModuleNotFoundError: | CODE |
| HIGH | raganything/__init__.py | 43 | except ImportError: | CODE |
| HIGH | raganything/__init__.py | 52 | except ImportError: | CODE |
| HIGH | raganything/__init__.py | 62 | except ImportError: | CODE |
| HIGH | raganything/__init__.py | 75 | except ModuleNotFoundError: | CODE |
| HIGH | raganything/__init__.py | 77 | except ImportError: | CODE |
| HIGH | raganything/parser.py | 1428 | except Empty: | CODE |
| HIGH | raganything/parser.py | 1442 | except Empty: | CODE |
| HIGH | raganything/parser.py | 571 | except Exception: | CODE |
| HIGH | raganything/parser.py | 1387 | except Empty: | CODE |
| HIGH | raganything/parser.py | 1403 | except Empty: | CODE |
| HIGH | raganything/parser.py | 2804 | except Exception: | CODE |
| HIGH | raganything/parser.py | 2003 | except Exception: | CODE |
| HIGH | raganything/parser.py | 2949 | except Exception: | CODE |
| HIGH | raganything/resilience.py | 43 | except ImportError: | CODE |
| HIGH | raganything/resilience.py | 55 | except ImportError: | CODE |
| HIGH | examples/vllm_integration_example.py | 154 | except Exception: | CODE |
| HIGH | examples/vllm_integration_example.py | 185 | except Exception: | CODE |
| HIGH | examples/lmstudio_integration_example.py | 171 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_close_event_loop.py | 15 | # ── Replicate the close() logic under test ────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_close_event_loop.py | 45 | # ── Tests ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_md_image_blocks.py | 150 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_md_image_blocks.py | 153 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_queued_text_insert.py | 286 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_queued_text_insert.py | 288 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_core_modules.py | 118 | # ── Content Separation Tests ───────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_core_modules.py | 177 | # ── Image Encoding Tests ───────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_core_modules.py | 23 | # ── DocStatus Tests ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_core_modules.py | 44 | # ── RAGAnythingConfig Tests ────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_core_modules.py | 201 | # ── Image Validation Tests ─────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_core_modules.py | 258 | # ── Processor Type Mapping Tests ───────────────────────────────── | COMMENT |
| MEDIUM | tests/test_core_modules.py | 309 | # ── BatchProcessingResult Tests ────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_core_modules.py | 372 | # ── BatchParser Initialization Tests ───────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_minimax_integration.py | 167 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_minimax_integration.py | 169 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_minimax_integration.py | 367 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_minimax_integration.py | 369 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_minimax_integration.py | 21 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_minimax_integration.py | 23 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_minimax_integration.py | 113 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_minimax_integration.py | 115 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_minimax_integration.py | 282 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_minimax_integration.py | 284 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_text_chunk_page_idx.py | 101 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_text_chunk_page_idx.py | 103 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_text_chunk_page_idx.py | 274 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_text_chunk_page_idx.py | 276 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_text_chunk_page_idx.py | 395 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_text_chunk_page_idx.py | 397 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | raganything/batch.py | 30 | # ========================================== | COMMENT |
| MEDIUM⚡ | raganything/batch.py | 32 | # ========================================== | COMMENT |
| MEDIUM | raganything/batch.py | 179 | # ========================================== | COMMENT |
| MEDIUM | raganything/batch.py | 181 | # ========================================== | COMMENT |
| MEDIUM | raganything/callbacks.py | 71 | # ── Parsing stage ───────────────────────────────────────────── | COMMENT |
| MEDIUM | raganything/callbacks.py | 90 | # ── Text insertion stage ────────────────────────────────────── | COMMENT |
| MEDIUM | raganything/callbacks.py | 101 | # ── Multimodal processing stage ─────────────────────────────── | COMMENT |
| MEDIUM | raganything/callbacks.py | 126 | # ── Query stage ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | raganything/callbacks.py | 149 | # ── Document complete ───────────────────────────────────────── | COMMENT |
| MEDIUM | raganything/callbacks.py | 168 | # ── Batch processing ────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | README.md | 338 | api_key = "your-api-key" | CODE |
| HIGH | README.md | 478 | api_key = "your-api-key" | CODE |
| HIGH | README.md | 696 | api_key = "your-api-key" | CODE |
| HIGH | README.md | 823 | api_key = "your-api-key" | CODE |
| HIGH | README.md | 1058 | python examples/raganything_example.py path/to/document.pdf --api-key YOUR_API_KEY --parser mineru | CODE |
| HIGH | README.md | 1061 | python examples/modalprocessors_example.py --api-key YOUR_API_KEY | CODE |
| HIGH | README_zh.md | 316 | api_key = "your-api-key" | CODE |
| HIGH | README_zh.md | 458 | api_key = "your-api-key" | CODE |
| HIGH | README_zh.md | 677 | api_key = "your-api-key" | CODE |
| HIGH | README_zh.md | 804 | api_key = "your-api-key" | CODE |
| HIGH | README_zh.md | 1031 | python examples/raganything_example.py path/to/document.pdf --api-key YOUR_API_KEY --parser mineru | CODE |
| HIGH | README_zh.md | 1034 | python examples/modalprocessors_example.py --api-key YOUR_API_KEY | CODE |
| HIGH | examples/minimax_integration_example.py | 29 | export MINIMAX_API_KEY=your-api-key | STRING |
| HIGH | examples/minimax_integration_example.py | 72 | "Set it with: export MINIMAX_API_KEY=your-api-key" | CODE |
| HIGH | examples/minimax_integration_example.py | 154 | print(" Set it with: export MINIMAX_API_KEY=your-api-key") | CODE |
| HIGH | examples/minimax_integration_example.py | 266 | " MINIMAX_API_KEY=your-api-key\n" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.py | 14 | CODE | |
| LOW | reproduce/query.py | 90 | CODE | |
| LOW | reproduce/llm_answer_evaluator.py | 159 | CODE | |
| LOW | reproduce/llm_answer_evaluator.py | 213 | CODE | |
| LOW | reproduce/llm_answer_evaluator.py | 286 | CODE | |
| LOW | reproduce/llm_answer_evaluator.py | 491 | CODE | |
| LOW | reproduce/llm_answer_evaluator.py | 759 | CODE | |
| LOW | reproduce/llm_answer_evaluator.py | 848 | CODE | |
| LOW | reproduce/llm_answer_evaluator.py | 1058 | CODE | |
| LOW | tests/test_full_entities_merge.py | 10 | CODE | |
| LOW | tests/test_resilience.py | 474 | CODE | |
| LOW | tests/test_close_event_loop.py | 18 | CODE | |
| LOW | raganything/modalprocessors.py | 68 | CODE | |
| LOW | raganything/modalprocessors.py | 139 | CODE | |
| LOW | raganything/modalprocessors.py | 179 | CODE | |
| LOW | raganything/modalprocessors.py | 212 | CODE | |
| LOW | raganything/modalprocessors.py | 246 | CODE | |
| LOW | raganything/modalprocessors.py | 287 | CODE | |
| LOW | raganything/modalprocessors.py | 666 | CODE | |
| LOW | raganything/raganything.py | 161 | CODE | |
| LOW | raganything/raganything.py | 319 | CODE | |
| LOW | raganything/omml_extractor.py | 112 | CODE | |
| LOW | raganything/omml_extractor.py | 219 | CODE | |
| LOW | raganything/query.py | 59 | CODE | |
| LOW | raganything/query.py | 221 | CODE | |
| LOW | raganything/query.py | 518 | CODE | |
| LOW | raganything/query.py | 632 | CODE | |
| LOW | raganything/query.py | 751 | CODE | |
| LOW | raganything/query.py | 661 | CODE | |
| LOW | raganything/processor.py | 451 | CODE | |
| LOW | raganything/processor.py | 607 | CODE | |
| LOW | raganything/processor.py | 850 | CODE | |
| LOW | raganything/processor.py | 982 | CODE | |
| LOW | raganything/processor.py | 1365 | CODE | |
| LOW | raganything/processor.py | 1588 | CODE | |
| LOW | raganything/processor.py | 1677 | CODE | |
| LOW | raganything/processor.py | 2463 | CODE | |
| LOW | raganything/parser.py | 3209 | CODE | |
| LOW | raganything/parser.py | 150 | CODE | |
| LOW | raganything/parser.py | 252 | CODE | |
| LOW | raganything/parser.py | 297 | CODE | |
| LOW | raganything/parser.py | 467 | CODE | |
| LOW | raganything/parser.py | 723 | CODE | |
| LOW | raganything/parser.py | 846 | CODE | |
| LOW | raganything/parser.py | 1230 | CODE | |
| LOW | raganything/parser.py | 1602 | CODE | |
| LOW | raganything/parser.py | 1776 | CODE | |
| LOW | raganything/parser.py | 1862 | CODE | |
| LOW | raganything/parser.py | 2047 | CODE | |
| LOW | raganything/parser.py | 2240 | CODE | |
| LOW | raganything/parser.py | 2520 | CODE | |
| LOW | raganything/parser.py | 2784 | CODE | |
| LOW | raganything/parser.py | 2901 | CODE | |
| LOW | raganything/parser.py | 2933 | CODE | |
| LOW | raganything/parser.py | 2796 | CODE | |
| LOW | raganything/enhanced_markdown.py | 370 | CODE | |
| LOW | raganything/enhanced_markdown.py | 403 | CODE | |
| LOW | raganything/utils.py | 175 | CODE | |
| LOW | raganything/utils.py | 703 | CODE | |
| LOW | raganything/batch_parser.py | 636 | CODE | |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | reproduce/llm_answer_evaluator.py | 1813 | # Create the configuration. | COMMENT |
| MEDIUM⚡ | reproduce/llm_answer_evaluator.py | 1816 | # Create the evaluator. | COMMENT |
| MEDIUM | raganything/query.py | 74 | # Create a normalized representation of the query parameters | COMMENT |
| MEDIUM | raganything/processor.py | 482 | # Create a content signature | COMMENT |
| MEDIUM | raganything/parser.py | 192 | # Create a temporary file with the correct extension | COMMENT |
| MEDIUM | raganything/batch_parser.py | 193 | # Create a deterministic, file-specific output directory. The path | COMMENT |
| MEDIUM⚡ | examples/batch_processing_example.py | 323 | # Create a directory structure with nested files | COMMENT |
| MEDIUM⚡ | examples/batch_processing_example.py | 326 | # Create main directory files | COMMENT |
| MEDIUM | scripts/create_tiktoken_cache.py | 4 | # Define the directory where you want to store the cache | COMMENT |
| MEDIUM | scripts/create_tiktoken_cache.py | 8 | # Create the directory if it doesn't exist | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_asset_urls.py | 3 | CODE | |
| LOW | tests/test_raganything_example.py | 1 | CODE | |
| LOW | tests/test_lmstudio_integration_example.py | 1 | CODE | |
| LOW | tests/test_modalprocessors_config.py | 11 | CODE | |
| LOW | tests/test_omml_extractor.py | 8 | CODE | |
| LOW | raganything/omml_extractor.py | 40 | CODE | |
| LOW | raganything/batch.py | 16 | CODE | |
| LOW | raganything/prompt_manager.py | 18 | CODE | |
| LOW | raganything/__init__.py | 1 | CODE | |
| LOW | raganything/__init__.py | 2 | CODE | |
| LOW | raganything/__init__.py | 5 | CODE | |
| LOW | raganything/__init__.py | 9 | CODE | |
| LOW | raganything/__init__.py | 9 | CODE | |
| LOW | raganything/__init__.py | 9 | CODE | |
| LOW | raganything/__init__.py | 9 | CODE | |
| LOW | raganything/__init__.py | 21 | CODE | |
| LOW | raganything/__init__.py | 21 | CODE | |
| LOW | raganything/__init__.py | 21 | CODE | |
| LOW | raganything/__init__.py | 35 | CODE | |
| LOW | raganything/__init__.py | 35 | CODE | |
| LOW | raganything/__init__.py | 35 | CODE | |
| LOW | raganything/__init__.py | 35 | CODE | |
| LOW | raganything/__init__.py | 48 | CODE | |
| LOW | raganything/__init__.py | 48 | CODE | |
| LOW | raganything/__init__.py | 58 | CODE | |
| LOW | raganything/__init__.py | 58 | CODE | |
| LOW | raganything/__init__.py | 68 | CODE | |
| LOW | raganything/__init__.py | 68 | CODE | |
| LOW | raganything/__init__.py | 68 | CODE | |
| LOW | raganything/__init__.py | 68 | CODE | |
| LOW | raganything/__init__.py | 68 | CODE | |
| LOW | raganything/processor.py | 7 | CODE | |
| LOW | raganything/processor.py | 31 | CODE | |
| LOW | raganything/parser.py | 24 | CODE | |
| LOW | raganything/asset_urls.py | 14 | CODE | |
| LOW | raganything/utils.py | 7 | CODE | |
| LOW | raganything/callbacks.py | 23 | CODE | |
| LOW | raganything/prompts_zh.py | 11 | CODE | |
| LOW | raganything/prompt.py | 8 | CODE | |
| LOW | raganything/resilience.py | 11 | CODE | |
| LOW | raganything/mineru_content.py | 9 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | reproduce/query.py | 0 | example script demonstrating parser integration with raganything this example shows how to: 1. process documents with ra | STRING |
| HIGH | reproduce/index.py | 0 | example script demonstrating parser integration with raganything this example shows how to: 1. process documents with ra | STRING |
| HIGH | examples/raganything_example.py | 0 | example script demonstrating parser integration with raganything this example shows how to: 1. process documents with ra | STRING |
| HIGH | reproduce/query.py | 0 | process document with raganything args: file_path: path to the document output_dir: output directory for rag results api | STRING |
| HIGH | reproduce/index.py | 0 | process document with raganything args: file_path: path to the document output_dir: output directory for rag results api | STRING |
| HIGH | examples/raganything_example.py | 0 | process document with raganything args: file_path: path to the document output_dir: output directory for rag results api | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | reproduce/query.py | 305 | # Check if API key is provided | COMMENT |
| LOW | reproduce/index.py | 253 | # Check if API key is provided | COMMENT |
| LOW | raganything/modalprocessors.py | 163 | # Check if item is within context window and matches filter criteria | COMMENT |
| LOW | raganything/query.py | 151 | # Check if VLM enhanced query should be used | COMMENT |
| LOW | raganything/query.py | 679 | # Check if it's in the current working directory or subdirectories | COMMENT |
| LOW | raganything/processor.py | 909 | # Check if multimodal content is already processed | COMMENT |
| LOW | raganything/parser.py | 2264 | # Check if input is a URL | COMMENT |
| LOW | raganything/enhanced_markdown.py | 36 | # Check if pandoc module exists (not used directly, just for detection) | COMMENT |
| LOW | raganything/enhanced_markdown.py | 104 | # Check if pandoc is installed on system | COMMENT |
| LOW | raganything/enhanced_markdown.py | 511 | # Check if input file is provided | COMMENT |
| LOW | raganything/utils.py | 537 | # Check if file exists and is not a symlink (for security) | COMMENT |
| LOW | examples/office_document_test.py | 55 | # Check if file exists and is a supported Office format | COMMENT |
| LOW | examples/raganything_example.py | 307 | # Check if API key is provided | COMMENT |
| LOW | examples/batch_processing_example.py | 162 | # Display results | COMMENT |
| LOW⚡ | examples/batch_processing_example.py | 220 | # Display results | COMMENT |
| LOW⚡ | examples/image_format_test.py | 60 | # Check if file exists and is a supported image format | COMMENT |
| LOW | examples/insert_content_list_example.py | 415 | # Check if API key is provided | COMMENT |
| LOW | examples/text_format_test.py | 43 | # Check if file exists and is a supported text format | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | raganything/batch.py | 386 | # Step 2: Process with RAG | COMMENT |
| LOW | raganything/batch.py | 374 | # Step 1: Parse documents in batch | COMMENT |
| LOW⚡ | raganything/processor.py | 2020 | # Step 1: Parse document | COMMENT |
| LOW⚡ | raganything/processor.py | 2029 | # Step 2: Separate text and multimodal content | COMMENT |
| LOW | raganything/processor.py | 2055 | # Step 3: Insert pure text content with all parameters | COMMENT |
| LOW | raganything/processor.py | 2104 | # Step 4: Process multimodal content (using specialized processors) | COMMENT |
| LOW | raganything/processor.py | 2312 | # Step 1: Parse document | COMMENT |
| LOW | raganything/processor.py | 2355 | # Step 2: Separate text and multimodal content | COMMENT |
| LOW | raganything/processor.py | 2383 | # Step 3: Insert pure text content and multimodal content with all parameters | COMMENT |
| LOW | raganything/processor.py | 2550 | # Step 1: Separate text and multimodal content | COMMENT |
| LOW | raganything/processor.py | 2576 | # Step 2: Insert pure text content with all parameters | COMMENT |
| LOW | raganything/processor.py | 2624 | # Step 3: Process multimodal content (using specialized processors) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | raganything/batch.py | 386 | # Step 2: Process with RAG | COMMENT |
| LOW | raganything/batch.py | 374 | # Step 1: Parse documents in batch | COMMENT |
| LOW⚡ | raganything/processor.py | 2020 | # Step 1: Parse document | COMMENT |
| LOW⚡ | raganything/processor.py | 2029 | # Step 2: Separate text and multimodal content | COMMENT |
| LOW | raganything/processor.py | 2055 | # Step 3: Insert pure text content with all parameters | COMMENT |
| LOW | raganything/processor.py | 2104 | # Step 4: Process multimodal content (using specialized processors) | COMMENT |
| LOW | raganything/processor.py | 2312 | # Step 1: Parse document | COMMENT |
| LOW | raganything/processor.py | 2355 | # Step 2: Separate text and multimodal content | COMMENT |
| LOW | raganything/processor.py | 2383 | # Step 3: Insert pure text content and multimodal content with all parameters | COMMENT |
| LOW | raganything/processor.py | 2550 | # Step 1: Separate text and multimodal content | COMMENT |
| LOW | raganything/processor.py | 2576 | # Step 2: Insert pure text content with all parameters | COMMENT |
| LOW | raganything/processor.py | 2624 | # Step 3: Process multimodal content (using specialized processors) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | raganything/query.py | 229 | Multimodal query - combines text and multimodal content for querying Args: query: Base que | STRING |
| HIGH | raganything/parser.py | 3178 | Get a parser instance by name. Checks built-in parsers first, then falls back to the custom parser registry pop | STRING |
| HIGH | raganything/mineru_content.py | 71 | Convert MinerU's page-grouped v2 output to RAG-Anything's flat schema. Args: payload: Parsed JSON value. Th | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | reproduce/llm_answer_evaluator.py | 270 | # For comprehensive evaluation, try to extract additional metrics. | COMMENT |
| LOW | tests/test_custom_parser.py | 167 | # Do not touch the filesystem; just return a dummy result. | COMMENT |
| MEDIUM | raganything/modalprocessors.py | 1474 | """Parse equation analysis response with robust JSON handling""" | STRING |
| MEDIUM | raganything/omml_extractor.py | 53 | # them to construct fully qualified tag names so that lookups are robust to | COMMENT |
| MEDIUM | examples/enhanced_markdown_example.py | 30 | """Create comprehensive sample markdown content for testing""" | STRING |
| MEDIUM⚡ | examples/enhanced_markdown_example.py | 898 | # Demonstrate robust conversion with fallbacks | STRING |
| MEDIUM | examples/enhanced_markdown_example.py | 920 | # Test robust conversion | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | raganything/omml_extractor.py | 49 | logger = logging.getLogger(__name__) | CODE |
| LOW | raganything/omml_extractor.py | 768 | __all__ = [ | CODE |
| LOW | raganything/prompt_manager.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | raganything/prompt_manager.py | 84 | def set_prompt_language(language: str) -> None: | CODE |
| LOW | raganything/__init__.py | 84 | __all__ = [ | CODE |
| LOW⚡ | raganything/processor.py | 420 | async def _set_multimodal_status_record(self, doc_id: str, processed: bool) -> None: | CODE |
| LOW | raganything/asset_urls.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | raganything/callbacks.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | raganything/modalprocessors_audio.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | raganything/modalprocessors_video.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | raganything/resilience.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | raganything/mineru_content.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | raganything/mineru_content.py | 509 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | raganything/batch.py | 34 | CODE | |
| LOW | raganything/processor.py | 1961 | CODE | |
| LOW | raganything/processor.py | 2155 | CODE | |
| LOW | raganything/parser.py | 1230 | CODE | |
| LOW | raganything/modalprocessors_video.py | 103 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | requirements.txt | 1 | huggingface_hub | COMMENT |