一个基于nano banana pro🍌的原生AI PPT生成应用,迈向"Vibe PPT"; 支持上传任意模板图片,上传任意素材&智能解析,一句话/大纲/页面描述自动生成PPT,口头修改指定区域、一键导出可编辑ppt - An AI-native slides generator based on nano banana pro🍌
This report presents the forensic synthetic code analysis of Anionex/banana-slides, a Python project with 15,167 GitHub stars. SynthScan v2.0 examined 119,777 lines of code across 458 source files, recording 1598 pattern matches distributed across 19 syntactic categories. The overall adjusted score of 16.1 places this repository in the Moderate 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).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
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 1598 distinct pattern matches across 19 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 | TODO_video_narration_fixes.md | 23 | def _sanitize_ass_dialogue_text(text: str) -> str: | CODE |
| LOW | frontend/e2e/material-aspect-ratio.spec.ts | 24 | async function openMaterialGeneratorModal(page: Page) { | CODE |
| LOW | frontend/src/api/client.ts | 14 | function resolveDesktopBackendPort(): number { | CODE |
| LOW | frontend/src/store/useProjectStore.ts | 83 | (function cleanupLegacyTemplateLocalStorageKeys() { | CODE |
| LOW | desktop/main.js | 125 | function shouldOpenInExternalBrowser(targetUrl) { | CODE |
| LOW | desktop/update-policy.js | 23 | function resolveCurrentBuildTimestamp(buildMeta) { | CODE |
| LOW | desktop/scripts/test-markdown-image-macos.js | 29 | function assertSafeOutputDirectory(outputDir) { | CODE |
| LOW | desktop/scripts/prepare-artifacts.js | 37 | function copyDirDereferenceSymlinks(src, dest) { | CODE |
| LOW | desktop/scripts/prepare-artifacts.js | 244 | async function prepareWindowsFfmpegArtifacts() { | CODE |
| LOW | backend/desktop_bootstrap.py | 6 | def repair_desktop_settings_schema(db): | CODE |
| LOW | backend/tests/unit/test_pptx_transitions.py | 23 | def test_create_pptx_from_images_adds_selected_transition_effects(tmp_path): | CODE |
| LOW | backend/tests/unit/test_pptx_transitions.py | 58 | def test_create_pptx_from_images_maps_page_turn_to_cover(tmp_path): | CODE |
| LOW | backend/tests/unit/test_pptx_transitions.py | 74 | def test_create_pptx_from_images_omits_transition_when_disabled(tmp_path): | CODE |
| LOW | backend/tests/unit/test_inferera_domain_defaults.py | 5 | def test_config_openai_api_base_defaults_to_inferera(monkeypatch): | CODE |
| LOW | backend/tests/unit/test_inferera_domain_defaults.py | 16 | def test_openai_provider_fallbacks_use_inferera(monkeypatch): | CODE |
| LOW⚡ | backend/tests/unit/test_lazyllm_vlm_only_model.py | 53 | def test_llm_model_initializes_with_llm_type(self, patch_env): | CODE |
| LOW⚡ | backend/tests/unit/test_lazyllm_vlm_only_model.py | 62 | def test_vlm_model_detected_as_vlm_only(self, patch_env): | CODE |
| LOW⚡ | backend/tests/unit/test_lazyllm_vlm_only_model.py | 71 | def test_vlm_only_generate_with_image_reuses_client(self, patch_env): | CODE |
| LOW | backend/tests/unit/test_lazyllm_vlm_only_model.py | 83 | def test_normal_model_generate_with_image_creates_vlm_client(self, patch_env): | CODE |
| LOW | backend/tests/unit/test_lazyllm_vlm_only_model.py | 97 | def test_ai_service_init_succeeds_with_vlm_caption_model(self, patch_env): | CODE |
| LOW | backend/tests/unit/test_template_analysis.py | 71 | def test_analyze_template_persists_nine_field_schema(client, stub_submit_task, app): | CODE |
| LOW | backend/tests/unit/test_template_analysis.py | 101 | def test_analyze_template_handles_not_a_slide(client, stub_submit_task, app): | CODE |
| LOW | backend/tests/unit/test_template_analysis.py | 116 | def test_reanalyze_resets_status_to_pending(client, stub_submit_task, app): | CODE |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 90 | def test_standard_images_response(self): | CODE |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 102 | def test_result_is_raw_string_url(self): | CODE |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 110 | def test_result_is_dict_with_data_list(self): | CODE |
| LOW⚡ | backend/tests/unit/test_openai_image_proxy_compat.py | 122 | def test_result_is_flat_dict_url(self): | CODE |
| LOW⚡ | backend/tests/unit/test_openai_image_proxy_compat.py | 131 | def test_result_data_is_empty_list_falls_through(self): | CODE |
| LOW⚡ | backend/tests/unit/test_openai_image_proxy_compat.py | 138 | def test_unsupported_type_raises(self): | CODE |
| LOW | backend/tests/unit/test_material_process.py | 20 | def test_blend_region_into_source_changes_only_selected_area(): | CODE |
| LOW | backend/tests/unit/test_material_process.py | 31 | def test_aspect_ratio_from_size_maps_to_supported_ratio(): | CODE |
| LOW | backend/tests/unit/test_material_process.py | 38 | def test_process_material_requires_source_for_region_edit(client, sample_project): | CODE |
| LOW | backend/tests/unit/test_material_process.py | 57 | def test_process_material_region_edit_enqueues_task(mock_submit_task, mock_get_ai_service, client, sample_project): | CODE |
| LOW | backend/tests/unit/test_api_health.py | 11 | def test_health_check_returns_ok(self, client): | CODE |
| LOW | backend/tests/unit/test_api_health.py | 20 | def test_health_check_response_format(self, client): | CODE |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 38 | def test_wait_task_emits_progress_events(): | CODE |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 57 | def test_run_jobs_writes_state_file(tmp_path: Path, monkeypatch): | CODE |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 153 | def test_run_jobs_done_marker_skips_completed_job(tmp_path: Path, monkeypatch): | CODE |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 237 | def test_cmd_monitor_reads_snapshot(tmp_path: Path): | CODE |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 254 | def test_cmd_monitor_watch_until_completed(monkeypatch): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 25 | def test_upload_material_without_caption(self, client): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 38 | def test_upload_material_with_caption(self, mock_caption, client): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 53 | def test_upload_material_caption_failure_still_succeeds(self, mock_caption, client): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 67 | def test_upload_material_caption_false_param(self, mock_caption, client): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 79 | def test_upload_material_invalid_file_type(self, client): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 88 | def test_upload_material_chinese_filename_uses_content_type_and_uuid_storage(self, client): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 104 | def test_upload_material_spoofed_extension_still_uses_detected_image_format(self, client): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 118 | def test_upload_material_svg_detection_does_not_parse_entities(self, client): | CODE |
| LOW | backend/tests/unit/test_api_material.py | 138 | def test_upload_material_text_mentioning_svg_is_rejected(self, client): | STRING |
| LOW | backend/tests/unit/test_api_material.py | 149 | def test_upload_material_corrupted_image_errors_are_rejected(self, mock_image_open, client): | STRING |
| LOW | backend/tests/unit/test_api_material.py | 161 | def test_upload_material_no_file(self, client): | STRING |
| LOW | backend/tests/unit/test_api_material.py | 174 | def test_caption_returns_empty_on_missing_gemini_key(self, app): | STRING |
| LOW | backend/tests/unit/test_api_material.py | 193 | def test_caption_returns_empty_on_missing_openai_key(self, app): | STRING |
| LOW⚡ | backend/tests/unit/test_api_material.py | 211 | def test_caption_returns_empty_on_invalid_file(self, app): | STRING |
| LOW⚡ | backend/tests/unit/test_api_material.py | 221 | def test_caption_gemini_success(self, mock_client_class, app): | STRING |
| LOW | …nd/tests/unit/test_task_manager_image_prompt_fields.py | 12 | def restore_image_prompt_fields(client): | CODE |
| LOW | …nd/tests/unit/test_task_manager_image_prompt_fields.py | 31 | def test_image_prompt_field_names_fallback_to_default_when_not_set(client): | CODE |
| LOW | …nd/tests/unit/test_task_manager_image_prompt_fields.py | 40 | def test_append_extra_fields_filters_by_allowlist(client): | CODE |
| LOW | …nd/tests/unit/test_task_manager_image_prompt_fields.py | 55 | def test_append_extra_fields_respects_empty_allowlist(client): | CODE |
| LOW | …nd/tests/unit/test_task_manager_image_prompt_fields.py | 69 | def test_append_extra_fields_uses_prefetched_allowlist(monkeypatch): | CODE |
| 546 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/e2e/generation-requirements.spec.ts | 53 | // ── Mock tests ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/generation-requirements.spec.ts | 191 | // ── Integration tests ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/lazyllm-global-vendor.spec.ts | 12 | // ─── Mock tests ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/lazyllm-global-vendor.spec.ts | 148 | // ─── Integration tests ───────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/history-pagination.spec.ts | 83 | // ───────────────── Mock tests ───────────────── | COMMENT |
| MEDIUM | frontend/e2e/history-pagination.spec.ts | 192 | // ───────────────── Integration test ───────────────── | COMMENT |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 46 | // ── Mock tests: Outline presets ────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 144 | // ── Mock tests: Description presets ────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 184 | // ── Integration tests ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/material-textarea-picker.spec.ts | 64 | // ── Mock tests: Upload button dropdown on Home page ────────────────── | COMMENT |
| MEDIUM | frontend/e2e/material-textarea-picker.spec.ts | 150 | // ── Mock tests: Upload button dropdown on OutlineEditor ────────────── | COMMENT |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 7 | // ─── i18n ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 35 | // ─── Types ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 43 | // ─── System presets ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 70 | // ─── Component ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | backend/tests/conftest.py | 173 | # ===================================== | COMMENT |
| MEDIUM | backend/tests/conftest.py | 175 | # ===================================== | COMMENT |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 20 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 52 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 54 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_image_retry.py | 99 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_image_retry.py | 101 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 21 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_text_retry.py | 51 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_text_retry.py | 53 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_text_retry.py | 88 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_text_retry.py | 90 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_text_retry.py | 111 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_text_retry.py | 113 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_text_retry.py | 170 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_codex_text_retry.py | 172 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_tts_video_service.py | 71 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_tts_video_service.py | 73 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_tts_video_service.py | 626 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_tts_video_service.py | 629 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/tests/unit/test_tts_video_service.py | 24 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/tests/unit/test_tts_video_service.py | 26 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/controllers/openai_oauth_controller.py | 223 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/controllers/openai_oauth_controller.py | 225 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/controllers/page_controller.py | 949 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/controllers/page_controller.py | 951 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/services/ai_service.py | 1223 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | backend/services/ai_service.py | 1225 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | backend/services/tts_video_service.py | 24 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/services/tts_video_service.py | 26 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/services/tts_video_service.py | 233 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/services/tts_video_service.py | 235 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 332 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 334 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 787 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 789 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 1040 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 1042 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 1409 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 1411 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 1492 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | backend/services/tts_video_service.py | 1494 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/services/prompts.py | 24 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| 37 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/app.py | 182 | except Exception as e: | CODE |
| LOW | backend/app.py | 396 | except Exception as e: | CODE |
| LOW | backend/tests/conftest.py | 65 | except Exception: | CODE |
| LOW | backend/tests/unit/test_desktop_backend_startup.py | 68 | except Exception: | CODE |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 63 | except Exception as e: | CODE |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 97 | except Exception as e: | CODE |
| LOW | …kend/tests/integration/test_codex_retry_integration.py | 28 | except Exception: | CODE |
| LOW | backend/tests/integration/test_api_full_flow.py | 83 | except Exception as e: | CODE |
| LOW | backend/tests/integration/test_api_full_flow.py | 138 | except Exception as e: | CODE |
| LOW | backend/tests/integration/test_api_full_flow.py | 164 | except Exception as e: | CODE |
| LOW | backend/utils/latex_utils.py | 175 | except Exception as e: | CODE |
| LOW | backend/utils/latex_utils.py | 217 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_builder.py | 109 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_builder.py | 137 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_builder.py | 173 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_builder.py | 668 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_builder.py | 724 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_builder.py | 779 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_math.py | 165 | except Exception as exc: | CODE |
| LOW | backend/utils/path_utils.py | 97 | except Exception as e: | CODE |
| LOW | backend/utils/mask_utils.py | 220 | except Exception as e: | CODE |
| LOW | backend/utils/mask_utils.py | 326 | except Exception as e: | CODE |
| LOW | backend/models/settings.py | 313 | except Exception: | CODE |
| LOW | backend/models/settings.py | 316 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 112 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 164 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 230 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 295 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 498 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 504 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 644 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 649 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 672 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 716 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 761 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 813 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 852 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 878 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 902 | except Exception as e: | CODE |
| LOW | backend/controllers/template_asset_controller.py | 107 | except Exception as exc: | CODE |
| LOW | backend/controllers/template_asset_controller.py | 230 | except Exception as exc: | CODE |
| LOW | backend/controllers/template_asset_controller.py | 252 | except Exception as exc: | CODE |
| LOW | backend/controllers/template_asset_controller.py | 571 | except Exception as exc: | CODE |
| LOW⚡ | backend/controllers/file_controller.py | 49 | except Exception as e: | CODE |
| LOW | backend/controllers/file_controller.py | 85 | except Exception as e: | CODE |
| LOW⚡ | backend/controllers/file_controller.py | 118 | except Exception as e: | CODE |
| LOW⚡ | backend/controllers/file_controller.py | 150 | except Exception as e: | CODE |
| LOW | backend/controllers/file_controller.py | 175 | except Exception: | CODE |
| LOW | backend/controllers/file_controller.py | 192 | except Exception: | CODE |
| LOW | backend/controllers/file_controller.py | 198 | except Exception as e: | CODE |
| LOW | backend/controllers/openai_oauth_controller.py | 66 | except Exception: | CODE |
| LOW | backend/controllers/openai_oauth_controller.py | 281 | except Exception as e: | CODE |
| LOW | backend/controllers/openai_oauth_controller.py | 311 | except Exception as e: | CODE |
| LOW | backend/controllers/openai_oauth_controller.py | 397 | except Exception: | CODE |
| MEDIUM | backend/controllers/openai_oauth_controller.py | 77 | def _parse_expires_in(value) -> int: | CODE |
| LOW⚡ | backend/controllers/reference_file_controller.py | 445 | except Exception as img_err: | CODE |
| LOW⚡ | backend/controllers/reference_file_controller.py | 453 | except Exception as e: | CODE |
| LOW | backend/controllers/reference_file_controller.py | 108 | except Exception as img_err: | CODE |
| LOW | backend/controllers/reference_file_controller.py | 120 | except Exception as e: | CODE |
| LOW | backend/controllers/reference_file_controller.py | 130 | except Exception as db_error: | CODE |
| 248 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/config.py | 5 | CODE | |
| LOW | backend/config.py | 6 | CODE | |
| LOW | backend/tests/unit/test_template_analysis.py | 7 | CODE | |
| LOW | backend/tests/unit/test_api_health.py | 5 | CODE | |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 3 | CODE | |
| LOW | backend/tests/unit/test_api_material.py | 9 | CODE | |
| LOW | backend/tests/unit/test_renovation_filename.py | 11 | CODE | |
| LOW | backend/tests/unit/test_pdf_image_service.py | 2 | CODE | |
| LOW | backend/tests/unit/test_ai_mock.py | 7 | CODE | |
| LOW | backend/tests/unit/test_ai_mock.py | 8 | CODE | |
| LOW | backend/tests/unit/test_ai_mock.py | 8 | CODE | |
| LOW | backend/tests/unit/test_cli_loader.py | 3 | CODE | |
| LOW | backend/tests/unit/test_cli_interactive_builder.py | 3 | CODE | |
| LOW | backend/tests/unit/test_template_asset_model.py | 12 | CODE | |
| LOW | backend/tests/unit/test_template_asset_file_service.py | 11 | CODE | |
| LOW | backend/tests/unit/test_api_project.py | 10 | CODE | |
| LOW | backend/tests/unit/test_api_project.py | 196 | CODE | |
| LOW | backend/tests/unit/test_icon_subject_extraction.py | 11 | CODE | |
| LOW | backend/tests/unit/test_cli_plain_help.py | 3 | CODE | |
| LOW | backend/tests/unit/test_smart_merge.py | 2 | CODE | |
| LOW | backend/tests/unit/test_template_assets_api.py | 8 | CODE | |
| LOW | backend/tests/unit/test_cli_resolve.py | 3 | CODE | |
| LOW | backend/tests/unit/test_cli_resolve.py | 5 | CODE | |
| LOW | backend/tests/unit/test_cli_resolve.py | 6 | CODE | |
| LOW | backend/tests/unit/test_cli_resolve.py | 11 | CODE | |
| LOW | backend/tests/unit/test_cli_config.py | 3 | CODE | |
| LOW | …ckend/tests/integration/test_migration_019_backfill.py | 13 | CODE | |
| LOW | …ckend/tests/integration/test_migration_019_backfill.py | 14 | CODE | |
| LOW | …ckend/tests/integration/test_migration_019_backfill.py | 16 | CODE | |
| LOW | backend/tests/integration/test_full_workflow.py | 7 | CODE | |
| LOW | backend/tests/integration/test_full_workflow.py | 8 | CODE | |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 15 | CODE | |
| LOW | backend/tests/integration/test_api_full_flow.py | 23 | CODE | |
| LOW | backend/utils/__init__.py | 2 | CODE | |
| LOW | backend/utils/__init__.py | 2 | CODE | |
| LOW | backend/utils/__init__.py | 2 | CODE | |
| LOW | backend/utils/__init__.py | 2 | CODE | |
| LOW | backend/utils/__init__.py | 2 | CODE | |
| LOW | backend/utils/__init__.py | 2 | CODE | |
| LOW | backend/utils/__init__.py | 2 | CODE | |
| LOW | backend/utils/__init__.py | 11 | CODE | |
| LOW | backend/utils/__init__.py | 11 | CODE | |
| LOW | backend/utils/__init__.py | 11 | CODE | |
| LOW | backend/utils/__init__.py | 12 | CODE | |
| LOW | backend/utils/__init__.py | 12 | CODE | |
| LOW | backend/utils/__init__.py | 12 | CODE | |
| LOW | backend/utils/__init__.py | 13 | CODE | |
| LOW | backend/utils/__init__.py | 14 | CODE | |
| LOW | backend/utils/__init__.py | 14 | CODE | |
| LOW | backend/utils/__init__.py | 14 | CODE | |
| LOW | backend/utils/pptx_builder.py | 8 | CODE | |
| LOW | backend/utils/pptx_builder.py | 16 | CODE | |
| LOW | backend/utils/pptx_builder.py | 16 | CODE | |
| LOW | backend/utils/page_utils.py | 4 | CODE | |
| LOW | backend/models/__init__.py | 19 | CODE | |
| LOW | backend/models/__init__.py | 20 | CODE | |
| LOW | backend/models/__init__.py | 21 | CODE | |
| LOW | backend/models/__init__.py | 22 | CODE | |
| LOW | backend/models/__init__.py | 23 | CODE | |
| LOW | backend/models/__init__.py | 24 | CODE | |
| 126 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | frontend/e2e/ui-full-flow.spec.ts | 674 | // Step 2: Click "导出为 PPTX" in the dropdown menu | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow.spec.ts | 680 | // Step 3: In the PPTX export settings panel, click "开始导出" | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 40 | // Step 1: Visit homepage | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 55 | // Step 2: Ensure "一句话生成" tab is selected (it's selected by default) | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 68 | // Step 3: Enter idea and click "Next" | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 83 | // Step 4: Click batch generate outline button on outline editor page | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 124 | // Step 5: Wait for outline generation to complete (smart wait) | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 153 | // Step 6: Click "Next" to go to description editor page | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 166 | // Step 7: Click batch generate descriptions button | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 178 | // Step 8: Wait for descriptions to generate (smart wait) | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 193 | // Step 9: Test retry single card functionality | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 254 | // Step 10: Click "生成图片" to go to image generation page | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 346 | // Step 11: Select template (required before generating images) | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 438 | // Step 12: Click batch generate images button | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 625 | // Step 14: Export PPT | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 663 | // Step 1: Wait for export button to be enabled (it's disabled until all images are generated) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 132 | // Step 1: Visit homepage | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 140 | // Step 2: Ensure "一句话生成" tab is selected (it's selected by default) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 165 | // Step 4: Verify outline editor page loaded | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 172 | // Step 5: Click generate outline (mocked) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 183 | // Step 6: Verify UI shows outline (mocked data) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 192 | // Step 7: Navigate to description editor | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 203 | // Step 8: Test description generation UI (mocked) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 213 | // Step 9: Navigate to image generation | COMMENT |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 151 | // Step 3: Enter idea and click "Next" | COMMENT |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 224 | // Step 10: Test image generation UI (mocked) | COMMENT |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 236 | // Step 11: Test export UI | COMMENT |
| LOW⚡ | backend/tests/integration/test_api_full_flow.py | 188 | # Step 1: Create project | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 227 | # Step 2: Generate outline | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 240 | # Step 3: Wait for outline completion | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 253 | # Step 4: Generate descriptions | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 273 | # Step 5: Generate images | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 310 | # Step 6: Export PPT | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 325 | # Step 7: Verify PPT can be downloaded | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 686 | # Step 1: Parse description to outline | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 691 | # Step 2: Split description into page descriptions | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 696 | # Step 3: Flatten outline to pages | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 706 | # Step 4: Delete existing pages (using ORM session to trigger cascades) | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 711 | # Step 5: Create pages with both outline and description | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 902 | # Step 2: AI extract structured content | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 906 | # Step 3: Optional layout caption | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 921 | # Step 4: Update page in database | COMMENT |
| LOW | backend/controllers/page_controller.py | 881 | # Step 1: Parse page PDF → markdown | COMMENT |
| LOW⚡ | backend/services/export_service.py | 1211 | # Step 3: 合并结果 | COMMENT |
| LOW | backend/services/export_service.py | 1071 | # Step 1: 收集所有文本元素 | COMMENT |
| LOW | backend/services/export_service.py | 1091 | # Step 2: 并行执行两种识别 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1874 | # Step 1: 准备工作 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1903 | # Step 2: 创建文字属性提取器 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1908 | # Step 3: 调用导出方法(使用项目的导出设置) | COMMENT |
| LOW | backend/services/task_manager.py | 1555 | # Step 1: Split PDF into per-page PDFs | COMMENT |
| LOW | backend/services/task_manager.py | 1929 | # Step 4: 标记任务完成 | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 187 | # Step 1: Get upload URL | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 195 | # Step 2: Upload file | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 203 | # Step 3: Poll for parsing result | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 211 | # Step 4: Enhance markdown with image captions | COMMENT |
| LOW | backend/services/image_editability/inpaint_providers.py | 377 | # Step 1: 百度图像修复 - 精确去除文字 | COMMENT |
| LOW | backend/services/image_editability/inpaint_providers.py | 393 | # Step 2: 生成式画质提升(可选) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | frontend/e2e/ui-full-flow.spec.ts | 674 | // Step 2: Click "导出为 PPTX" in the dropdown menu | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow.spec.ts | 680 | // Step 3: In the PPTX export settings panel, click "开始导出" | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 40 | // Step 1: Visit homepage | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 55 | // Step 2: Ensure "一句话生成" tab is selected (it's selected by default) | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 68 | // Step 3: Enter idea and click "Next" | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 83 | // Step 4: Click batch generate outline button on outline editor page | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 124 | // Step 5: Wait for outline generation to complete (smart wait) | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 153 | // Step 6: Click "Next" to go to description editor page | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 166 | // Step 7: Click batch generate descriptions button | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 178 | // Step 8: Wait for descriptions to generate (smart wait) | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 193 | // Step 9: Test retry single card functionality | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 254 | // Step 10: Click "生成图片" to go to image generation page | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 346 | // Step 11: Select template (required before generating images) | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 438 | // Step 12: Click batch generate images button | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 625 | // Step 14: Export PPT | COMMENT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 663 | // Step 1: Wait for export button to be enabled (it's disabled until all images are generated) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 132 | // Step 1: Visit homepage | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 140 | // Step 2: Ensure "一句话生成" tab is selected (it's selected by default) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 165 | // Step 4: Verify outline editor page loaded | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 172 | // Step 5: Click generate outline (mocked) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 183 | // Step 6: Verify UI shows outline (mocked data) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 192 | // Step 7: Navigate to description editor | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 203 | // Step 8: Test description generation UI (mocked) | COMMENT |
| LOW⚡ | frontend/e2e/ui-full-flow-mocked.spec.ts | 213 | // Step 9: Navigate to image generation | COMMENT |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 151 | // Step 3: Enter idea and click "Next" | COMMENT |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 224 | // Step 10: Test image generation UI (mocked) | COMMENT |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 236 | // Step 11: Test export UI | COMMENT |
| LOW⚡ | backend/tests/integration/test_api_full_flow.py | 188 | # Step 1: Create project | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 227 | # Step 2: Generate outline | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 240 | # Step 3: Wait for outline completion | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 253 | # Step 4: Generate descriptions | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 273 | # Step 5: Generate images | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 310 | # Step 6: Export PPT | COMMENT |
| LOW | backend/tests/integration/test_api_full_flow.py | 325 | # Step 7: Verify PPT can be downloaded | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 686 | # Step 1: Parse description to outline | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 691 | # Step 2: Split description into page descriptions | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 696 | # Step 3: Flatten outline to pages | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 706 | # Step 4: Delete existing pages (using ORM session to trigger cascades) | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 711 | # Step 5: Create pages with both outline and description | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 902 | # Step 2: AI extract structured content | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 906 | # Step 3: Optional layout caption | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 921 | # Step 4: Update page in database | COMMENT |
| LOW | backend/controllers/page_controller.py | 881 | # Step 1: Parse page PDF → markdown | COMMENT |
| LOW⚡ | backend/services/export_service.py | 1211 | # Step 3: 合并结果 | COMMENT |
| LOW | backend/services/export_service.py | 1071 | # Step 1: 收集所有文本元素 | COMMENT |
| LOW | backend/services/export_service.py | 1091 | # Step 2: 并行执行两种识别 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1874 | # Step 1: 准备工作 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1903 | # Step 2: 创建文字属性提取器 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1908 | # Step 3: 调用导出方法(使用项目的导出设置) | COMMENT |
| LOW | backend/services/task_manager.py | 1555 | # Step 1: Split PDF into per-page PDFs | COMMENT |
| LOW | backend/services/task_manager.py | 1929 | # Step 4: 标记任务完成 | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 187 | # Step 1: Get upload URL | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 195 | # Step 2: Upload file | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 203 | # Step 3: Poll for parsing result | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 211 | # Step 4: Enhance markdown with image captions | COMMENT |
| LOW | backend/services/image_editability/inpaint_providers.py | 377 | # Step 1: 百度图像修复 - 精确去除文字 | COMMENT |
| LOW | backend/services/image_editability/inpaint_providers.py | 393 | # Step 2: 生成式画质提升(可选) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/desktop_bootstrap.py | 6 | CODE | |
| LOW | backend/app.py | 62 | CODE | |
| LOW | backend/app.py | 266 | CODE | |
| LOW | backend/tests/unit/test_api_project.py | 237 | CODE | |
| LOW | backend/tests/unit/test_api_settings_provider.py | 86 | CODE | |
| LOW | backend/tests/unit/test_api_settings_provider.py | 104 | CODE | |
| LOW | backend/tests/unit/test_api_settings_provider.py | 351 | CODE | |
| LOW | backend/tests/integration/test_api_full_flow.py | 42 | CODE | |
| LOW | backend/tests/integration/test_api_full_flow.py | 94 | CODE | |
| LOW | backend/utils/pptx_builder.py | 256 | CODE | |
| LOW | backend/utils/pptx_builder.py | 703 | CODE | |
| LOW | backend/utils/pptx_math.py | 309 | CODE | |
| LOW | backend/utils/path_utils.py | 26 | CODE | |
| LOW | backend/utils/path_utils.py | 142 | CODE | |
| LOW | backend/utils/mask_utils.py | 59 | CODE | |
| LOW | backend/utils/mask_utils.py | 109 | CODE | |
| LOW | backend/utils/mask_utils.py | 274 | CODE | |
| LOW | backend/controllers/material_controller.py | 44 | CODE | |
| LOW | backend/controllers/material_controller.py | 380 | CODE | |
| LOW | backend/controllers/material_controller.py | 510 | CODE | |
| LOW | backend/controllers/material_controller.py | 819 | CODE | |
| LOW | backend/controllers/file_controller.py | 155 | CODE | |
| LOW | backend/controllers/openai_oauth_controller.py | 51 | CODE | |
| LOW | backend/controllers/reference_file_controller.py | 41 | CODE | |
| LOW | backend/controllers/reference_file_controller.py | 135 | CODE | |
| LOW | backend/controllers/reference_file_controller.py | 300 | CODE | |
| LOW | backend/controllers/reference_file_controller.py | 394 | CODE | |
| LOW | backend/controllers/export_controller.py | 301 | CODE | |
| LOW | backend/controllers/project_controller.py | 302 | CODE | |
| LOW | backend/controllers/project_controller.py | 428 | CODE | |
| LOW | backend/controllers/project_controller.py | 520 | CODE | |
| LOW | backend/controllers/project_controller.py | 851 | CODE | |
| LOW | backend/controllers/project_controller.py | 1238 | CODE | |
| LOW | backend/controllers/project_controller.py | 1362 | CODE | |
| LOW | backend/controllers/project_controller.py | 543 | CODE | |
| LOW | backend/controllers/project_controller.py | 875 | CODE | |
| LOW | backend/controllers/page_controller.py | 325 | CODE | |
| LOW | backend/controllers/page_controller.py | 413 | CODE | |
| LOW | backend/controllers/page_controller.py | 592 | CODE | |
| LOW | backend/controllers/page_controller.py | 832 | CODE | |
| LOW | backend/controllers/page_controller.py | 1081 | CODE | |
| LOW | backend/controllers/settings_controller.py | 59 | CODE | |
| LOW | backend/controllers/settings_controller.py | 220 | CODE | |
| LOW | backend/controllers/settings_controller.py | 495 | CODE | |
| LOW | backend/controllers/settings_controller.py | 569 | CODE | |
| LOW | backend/controllers/settings_controller.py | 670 | CODE | |
| LOW | backend/controllers/settings_controller.py | 854 | CODE | |
| LOW | backend/controllers/settings_controller.py | 1121 | CODE | |
| LOW | backend/controllers/settings_controller.py | 1187 | CODE | |
| LOW | backend/controllers/settings_controller.py | 1293 | CODE | |
| LOW | backend/services/ai_service.py | 346 | CODE | |
| LOW | backend/services/ai_service.py | 393 | CODE | |
| LOW | backend/services/ai_service.py | 927 | CODE | |
| LOW | backend/services/ai_service.py | 450 | CODE | |
| LOW | backend/services/update_check_service.py | 177 | CODE | |
| LOW | backend/services/update_check_service.py | 217 | CODE | |
| LOW | backend/services/inpainting_service.py | 87 | CODE | |
| LOW | backend/services/tts_video_service.py | 375 | CODE | |
| LOW | backend/services/tts_video_service.py | 824 | CODE | |
| LOW | backend/services/tts_video_service.py | 1054 | CODE | |
| 63 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/utils/latex_utils.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/__init__.py | 16 | __all__ = [ | CODE |
| LOW | backend/utils/pptx_builder.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/pptx_builder.py | 163 | def _set_core_properties(prs: Presentation) -> None: | CODE |
| LOW | backend/utils/pptx_math.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/path_utils.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/utils/mask_utils.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/models/project_template_asset.py | 70 | def set_analysis(self, data) -> None: | CODE |
| LOW | backend/models/__init__.py | 30 | __all__ = ['db', 'Project', 'Page', 'Task', 'UserTemplate', 'PageImageVersion', 'Material', 'ReferenceFile', 'Settings', | CODE |
| LOW | backend/controllers/material_controller.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/template_asset_controller.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/openai_oauth_controller.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/reference_file_controller.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/__init__.py | 15 | __all__ = ['project_bp', 'style_bp', 'page_bp', 'template_bp', | CODE |
| LOW | backend/controllers/export_controller.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/project_controller.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/page_controller.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/template_controller.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/settings_controller.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_service.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/pdf_service.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/inpainting_service.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/__init__.py | 6 | __all__ = ['AIService', 'ProjectContext', 'FileService', 'ExportService'] | CODE |
| LOW⚡ | backend/services/tts_video_service.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | backend/services/prompts.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_service_manager.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/export_service.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | backend/services/task_manager.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | backend/services/task_manager.py | 2358 | def _set_task_processing(task_id: str) -> None: | CODE |
| LOW | backend/services/pdf_image_service.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/file_parser_service.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/material_import_service.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/image_editability/service.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | …ervices/image_editability/text_attribute_extractors.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/image_editability/extractors.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/image_editability/inpaint_providers.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/image_editability/__init__.py | 90 | __all__ = [ | CODE |
| LOW | backend/services/image_editability/factories.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/image_editability/hybrid_extractor.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/image_editability/helpers.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/genai_client.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/__init__.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/__init__.py | 29 | __all__ = [ | CODE |
| LOW | …/services/ai_providers/ocr/baidu_table_ocr_provider.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | …rvices/ai_providers/ocr/baidu_accurate_ocr_provider.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/ocr/__init__.py | 12 | __all__ = [ | CODE |
| LOW | …s/ai_providers/image/volcengine_inpainting_provider.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/image/codex_provider.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/image/__init__.py | 12 | __all__ = [ | CODE |
| LOW | …vices/ai_providers/image/gemini_inpainting_provider.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/image/openai_provider.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/image/genai_provider.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | …kend/services/ai_providers/image/anthropic_provider.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | …rvices/ai_providers/image/baidu_inpainting_provider.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/image/lazyllm_provider.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | …vices/ai_providers/image/rmbg_segmentation_provider.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/text/codex_provider.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/text/__init__.py | 9 | __all__ = ['TextProvider', 'GenAITextProvider', 'OpenAITextProvider', 'AnthropicTextProvider', 'LazyLLMTextProvider', 'C | CODE |
| LOW | backend/services/ai_providers/text/openai_provider.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/text/genai_provider.py | 17 | logger = logging.getLogger(__name__) | CODE |
| 6 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/run.sh | 10 | # Check if .env exists | COMMENT |
| LOW | backend/run.sh | 18 | # Check if virtual environment exists | COMMENT |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 13 | # Check if lazyllm is available | COMMENT |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 66 | # Check if it's the guidance_scale error | COMMENT |
| LOW | backend/utils/pptx_builder.py | 192 | # Check if dimensions exceed python-pptx limits and scale down if needed | COMMENT |
| LOW | backend/utils/pptx_builder.py | 335 | # Check if it fits | COMMENT |
| LOW | backend/utils/pptx_builder.py | 382 | # Check if we have colored segments (multi-color text) | COMMENT |
| LOW | backend/utils/pptx_builder.py | 652 | # Check if image exists | COMMENT |
| LOW⚡ | backend/controllers/file_controller.py | 35 | # Check if directory exists | COMMENT |
| LOW⚡ | backend/controllers/file_controller.py | 39 | # Check if file exists | COMMENT |
| LOW⚡ | backend/controllers/file_controller.py | 106 | # Check if directory exists | COMMENT |
| LOW⚡ | backend/controllers/file_controller.py | 110 | # Check if file exists | COMMENT |
| LOW⚡ | backend/controllers/file_controller.py | 138 | # Check if directory exists | COMMENT |
| LOW⚡ | backend/controllers/file_controller.py | 142 | # Check if file exists | COMMENT |
| LOW | backend/controllers/file_controller.py | 171 | # Check if the path is trying to escape the root directory | COMMENT |
| LOW | backend/controllers/reference_file_controller.py | 147 | # Check if file is in request | COMMENT |
| LOW | backend/controllers/export_controller.py | 421 | # Check if pages have generated images | COMMENT |
| LOW | backend/controllers/project_controller.py | 1270 | # Check if pages have descriptions (允许没有描述,从空开始) | COMMENT |
| LOW | backend/controllers/page_controller.py | 349 | # Check if already generated | COMMENT |
| LOW | backend/controllers/page_controller.py | 438 | # Check if already generated | COMMENT |
| LOW | backend/controllers/template_controller.py | 32 | # Check if file is in request | COMMENT |
| LOW | backend/controllers/template_controller.py | 125 | # Check if file is in request | COMMENT |
| LOW | backend/controllers/settings_controller.py | 739 | # Check if reasoning configuration changed (requires AIService cache clear) | COMMENT |
| LOW | backend/services/export_service.py | 711 | # Check if this is a table with子元素 (cells from Baidu OCR) | COMMENT |
| LOW | backend/services/export_service.py | 737 | # Check if this is a table with HTML data (legacy) | COMMENT |
| LOW | backend/services/task_manager.py | 276 | # Check if task raised an exception | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 172 | # Check if it's a plain text file that doesn't need MinerU parsing | COMMENT |
| LOW⚡ | backend/services/file_parser_service.py | 179 | # Check if it's a spreadsheet file (xlsx, csv) - use markitdown | COMMENT |
| LOW | backend/services/file_parser_service.py | 241 | # Read file content | COMMENT |
| LOW | backend/services/file_parser_service.py | 249 | # Check if content has markdown images | COMMENT |
| LOW | scripts/setup-env-from-secrets.sh | 56 | # Check if this configuration item exists in .env file | COMMENT |
| LOW | scripts/test_docker_environment.sh | 255 | # Check if project still exists | COMMENT |
| LOW | scripts/run-local-ci.sh | 147 | # Check if Docker is running | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/services/ai_service.py | 210 | 生成并解析JSON,如果解析失败则重新生成 Args: prompt: 生成提示词 thinking_budget: 思考预算(会根据 en | STRING |
| HIGH | backend/services/ai_service.py | 242 | 带图片输入的JSON生成,如果解析失败则重新生成(最多重试3次) Args: prompt: 生成提示词 image_path: 图片文件路 | STRING |
| HIGH | backend/services/ai_service.py | 930 | Generate image using configured image provider Based on gemini_genai.py gen_image() Ar | STRING |
| HIGH | backend/services/image_editability/service.py | 92 | 将图片转换为可编辑结构(递归) 线程安全:此方法可以被多个线程并行调用 Args: image_path: 图片路径 | STRING |
| HIGH | backend/services/image_editability/factories.py | 313 | 创建基于生成式大模型的Inpaint提供者 使用生成式大模型(如Gemini图片编辑)通过自然语言指令移除图片中的文字和图标。 适用于不需要精确bbox的场景,大模型自动理 | STRING |
| HIGH | backend/services/image_editability/factories.py | 506 | 从默认参数创建配置 默认配置(推荐用于导出PPTX): - 元素提取:混合提取器(MinerU版面分析 + 百度高精度OCR) - 背景生成:混合Inpai | STRING |
| HIGH | backend/services/image_editability/factories.py | 702 | 创建基于Caption Model的文字属性提取器 使用视觉语言模型(如Gemini)分析文字区域图像, 通过生成JSON的方式获取字体颜色、是否粗体、是否斜体等属性。 | STRING |
| HIGH | backend/services/image_editability/factories.py | 730 | 创建文字属性提取器注册表 支持动态注册新元素类型,不限于预定义类型。 Args: caption_extractor: Capti | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | README.md | 257 | GOOGLE_API_KEY=your-api-key-here | CODE |
| HIGH | README.md | 262 | OPENAI_API_KEY=your-api-key-here | CODE |
| HIGH | README_EN.md | 260 | GOOGLE_API_KEY=your-api-key-here | CODE |
| HIGH | README_EN.md | 267 | OPENAI_API_KEY=your-api-key-here | CODE |
| HIGH | backend/controllers/settings_controller.py | 227 | "api_key": "your-api-key", | STRING |
| HIGH | scripts/setup-env-from-secrets.sh | 76 | sed -i '/^GOOGLE_API_KEY=/s/your-api-key-here/mock-api-key/' "$ENV_FILE" | CODE |
| HIGH | v0_demo/lazyllm_genai.py | 22 | export BANANA_QWEN_API_KEY = "your-api-key" | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/e2e/settings-backfill.spec.ts | 67 | const placeholder = await apiKeyInput.getAttribute('placeholder') | CODE |
| LOW | frontend/e2e/settings-backfill.spec.ts | 116 | const placeholder = await apiKeyInput.getAttribute('placeholder') | CODE |
| LOW | …nd/e2e/settings-per-model-provider-integration.spec.ts | 63 | const placeholder = await apiKeyInput.getAttribute('placeholder') | CODE |
| LOW | frontend/e2e/file-preview-scrollbar.spec.ts | 12 | const LONG_MARKDOWN = '# Test Document\n\n' + 'Lorem ipsum dolor sit amet. '.repeat(200) + | CODE |
| LOW | frontend/e2e/file-preview-scrollbar.spec.ts | 12 | const LONG_MARKDOWN = '# Test Document\n\n' + 'Lorem ipsum dolor sit amet. '.repeat(200) + | CODE |
| LOW | frontend/e2e/per-model-startup-creds.spec.ts | 100 | const placeholder = await apiKeyInput.getAttribute('placeholder') | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 76 | json: { success: true, data: { ...base, openai_oauth_connected: true, openai_oauth_account_id: 'user@example | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 387 | json: { success: true, data: { ...base, openai_oauth_connected: true, openai_oauth_account_id: 'user@example | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 432 | json: { success: true, data: { message: 'Connected', account_id: 'user@example.com' } }, | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 439 | json: { success: true, data: { connected: true, account_id: 'user@example.com' } }, | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 462 | json: { success: true, data: { ...base, openai_oauth_connected: true, openai_oauth_account_id: 'user@example | CODE |
| LOW | frontend/src/components/shared/AccessCodeGuard.tsx | 103 | placeholder={t('placeholder')} | CODE |
| LOW⚡ | backend/tests/unit/test_api_material.py | 215 | app.config['GOOGLE_API_KEY'] = 'fake-key' | STRING |
| LOW⚡ | backend/tests/unit/test_api_settings_provider.py | 497 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 385 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 451 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 524 | assert settings.openai_oauth_account_id == 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 542 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 574 | assert settings.openai_oauth_account_id == 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 592 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 617 | assert settings.openai_oauth_account_id == 'user@example.com' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | backend/tests/unit/test_api_material.py | 180 | # Create a temp image | STRING |
| MEDIUM | backend/tests/integration/test_api_full_flow.py | 210 | # Create a simple test template image | COMMENT |
| MEDIUM | backend/controllers/page_controller.py | 700 | # Create a temporary directory in the project's upload folder | COMMENT |
| MEDIUM | scripts/test_docker_environment.sh | 236 | # Create a project | COMMENT |
| MEDIUM⚡ | v0_demo/lazyllm_genai.py | 196 | # Create a test image if it doesn't exist | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/utils/latex_utils.py | 158 | CODE | |
| LOW | backend/services/tts_video_service.py | 824 | CODE | |
| LOW | backend/services/tts_video_service.py | 941 | CODE | |
| LOW | backend/services/tts_video_service.py | 1497 | CODE | |
| LOW | backend/services/export_service.py | 1249 | CODE | |
| LOW | backend/services/task_manager.py | 703 | CODE | |
| LOW | backend/services/task_manager.py | 1329 | CODE | |
| LOW | backend/services/task_manager.py | 2007 | CODE | |
| LOW | backend/services/file_parser_service.py | 97 | CODE | |
| LOW | backend/services/image_editability/factories.py | 494 | CODE | |
| LOW | backend/services/image_editability/data_models.py | 106 | CODE | |
| LOW | …rvices/ai_providers/ocr/baidu_accurate_ocr_provider.py | 82 | CODE | |
| LOW | cli/banana_cli/config.py | 91 | CODE | |
| LOW | cli/banana_cli/commands/exports.py | 93 | CODE | |
| LOW | cli/banana_cli/commands/workflows.py | 149 | CODE | |
| LOW | cli/banana_cli/commands/projects.py | 44 | CODE | |
| LOW | cli/banana_cli/commands/projects.py | 73 | CODE | |
| LOW | v0_demo/lazyllm_genai.py | 66 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/models/material.py | 16 | project_id = db.Column(db.String(36), db.ForeignKey('projects.id'), nullable=True) # Can be null, for global materi | CODE |
| HIGH | backend/services/prompts.py | 1568 | 4. **When unsure**: prefer `status=undecided` (template_asset_id=null) over guessing. confidence<0.5 should be undecided | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/models/material.py | 20 | caption = db.Column(db.String(500), nullable=True) # AI-generated image description | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | backend/services/ai_providers/image/openai_provider.py | 161 | # Build comprehensive extra_body that works with multiple providers | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/setup-env-from-secrets.sh | 5 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/docker-publish.yml | 321 | # VERSION: ${{ inputs.version }} | COMMENT |