一个基于nano banana pro🍌的原生AI PPT生成应用,迈向"Vibe PPT"; 支持上传任意模板图片,上传任意素材&智能解析,一句话/大纲/页面描述自动生成PPT,口头修改指定区域、一键导出可编辑ppt - An AI-native slides generator based on nano banana pro🍌
1110 matches across 16 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | TODO_video_narration_fixes.md | 23 | def _sanitize_ass_dialogue_text(text: str) -> str: |
| LOW | frontend/e2e/material-aspect-ratio.spec.ts | 24 | async function openMaterialGeneratorModal(page: Page) { |
| LOW | backend/tests/unit/test_lazyllm_vlm_only_model.py | 53 | def test_llm_model_initializes_with_llm_type(self, patch_env): |
| LOW | backend/tests/unit/test_lazyllm_vlm_only_model.py | 62 | def test_vlm_model_detected_as_vlm_only(self, patch_env): |
| LOW | backend/tests/unit/test_lazyllm_vlm_only_model.py | 71 | def test_vlm_only_generate_with_image_reuses_client(self, patch_env): |
| LOW | backend/tests/unit/test_lazyllm_vlm_only_model.py | 83 | def test_normal_model_generate_with_image_creates_vlm_client(self, patch_env): |
| LOW | backend/tests/unit/test_lazyllm_vlm_only_model.py | 97 | def test_ai_service_init_succeeds_with_vlm_caption_model(self, patch_env): |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 90 | def test_standard_images_response(self): |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 102 | def test_result_is_raw_string_url(self): |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 110 | def test_result_is_dict_with_data_list(self): |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 122 | def test_result_is_flat_dict_url(self): |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 131 | def test_result_data_is_empty_list_falls_through(self): |
| LOW | backend/tests/unit/test_openai_image_proxy_compat.py | 138 | def test_unsupported_type_raises(self): |
| LOW | backend/tests/unit/test_material_process.py | 20 | def test_blend_region_into_source_changes_only_selected_area(): |
| LOW | backend/tests/unit/test_material_process.py | 31 | def test_aspect_ratio_from_size_maps_to_supported_ratio(): |
| LOW | backend/tests/unit/test_material_process.py | 38 | def test_process_material_requires_source_for_region_edit(client, sample_project): |
| 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): |
| LOW | backend/tests/unit/test_api_health.py | 11 | def test_health_check_returns_ok(self, client): |
| LOW | backend/tests/unit/test_api_health.py | 20 | def test_health_check_response_format(self, client): |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 38 | def test_wait_task_emits_progress_events(): |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 57 | def test_run_jobs_writes_state_file(tmp_path: Path, monkeypatch): |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 153 | def test_run_jobs_done_marker_skips_completed_job(tmp_path: Path, monkeypatch): |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 237 | def test_cmd_monitor_reads_snapshot(tmp_path: Path): |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 254 | def test_cmd_monitor_watch_until_completed(monkeypatch): |
| LOW | backend/tests/unit/test_api_material.py | 25 | def test_upload_material_without_caption(self, client): |
| LOW | backend/tests/unit/test_api_material.py | 38 | def test_upload_material_with_caption(self, mock_caption, client): |
| LOW | backend/tests/unit/test_api_material.py | 53 | def test_upload_material_caption_failure_still_succeeds(self, mock_caption, client): |
| LOW | backend/tests/unit/test_api_material.py | 67 | def test_upload_material_caption_false_param(self, mock_caption, client): |
| LOW | backend/tests/unit/test_api_material.py | 79 | def test_upload_material_invalid_file_type(self, client): |
| LOW | backend/tests/unit/test_api_material.py | 88 | def test_upload_material_chinese_filename_uses_content_type_and_uuid_storage(self, client): |
| LOW | backend/tests/unit/test_api_material.py | 104 | def test_upload_material_spoofed_extension_still_uses_detected_image_format(self, client): |
| LOW | backend/tests/unit/test_api_material.py | 118 | def test_upload_material_svg_detection_does_not_parse_entities(self, client): |
| LOW | backend/tests/unit/test_api_material.py | 138 | def test_upload_material_text_mentioning_svg_is_rejected(self, client): |
| LOW | backend/tests/unit/test_api_material.py | 149 | def test_upload_material_corrupted_image_errors_are_rejected(self, mock_image_open, client): |
| LOW | backend/tests/unit/test_api_material.py | 161 | def test_upload_material_no_file(self, client): |
| LOW | backend/tests/unit/test_api_material.py | 174 | def test_caption_returns_empty_on_missing_gemini_key(self, app): |
| LOW | backend/tests/unit/test_api_material.py | 193 | def test_caption_returns_empty_on_missing_openai_key(self, app): |
| LOW | backend/tests/unit/test_api_material.py | 211 | def test_caption_returns_empty_on_invalid_file(self, app): |
| LOW | backend/tests/unit/test_api_material.py | 221 | def test_caption_gemini_success(self, mock_client_class, app): |
| LOW | backend/tests/unit/test_app_factory.py | 4 | def test_create_app_respects_database_url_env(monkeypatch, tmp_path): |
| LOW | backend/tests/unit/test_lazyllm_seedream5_patch.py | 132 | def test_conditional_removal_based_on_runtime_model(self, mock_lazyllm): |
| LOW | backend/tests/unit/test_renovation_filename.py | 94 | def test_chinese_filename_saved_as_original_pdf(self, client, app): |
| LOW | backend/tests/unit/test_renovation_filename.py | 121 | def test_task_manager_can_discover_pdf(self, client, app): |
| LOW | backend/tests/unit/test_renovation_filename.py | 146 | def test_ascii_filename_also_works(self, client, app): |
| LOW | backend/tests/unit/test_ai_mock.py | 14 | def test_ai_service_is_mocked(self, mock_ai_service): |
| LOW | backend/tests/unit/test_ai_mock.py | 26 | def test_description_generation_mocked(self, mock_ai_service): |
| LOW | backend/tests/unit/test_ai_mock.py | 35 | def test_image_generation_mocked(self, mock_ai_service): |
| LOW | backend/tests/unit/test_lazyllm_image_content_type.py | 54 | def test_fallback_on_content_type_error(self): |
| LOW | backend/tests/unit/test_lazyllm_image_content_type.py | 80 | def test_untrusted_host_is_not_fetched(self): |
| LOW | backend/tests/unit/test_lazyllm_image_content_type.py | 96 | def test_non_content_type_error_is_reraised(self): |
| LOW | backend/tests/unit/test_lazyllm_image_content_type.py | 121 | def test_ssrf_bypass_attempts_are_rejected(self, malicious_url): |
| LOW | backend/tests/unit/test_lazyllm_image_content_type.py | 156 | def test_allowlisted_urls_accepted(self, url): |
| LOW | backend/tests/unit/test_lazyllm_image_content_type.py | 159 | def test_reported_ssrf_bypass_regression(self): |
| LOW | backend/tests/unit/test_lazyllm_image_content_type.py | 203 | def test_attack_payloads_rejected(self, url): |
| LOW | backend/tests/unit/test_cli_loader.py | 51 | def test_load_csv_jobs_with_options_json(tmp_path: Path): |
| LOW | backend/tests/unit/test_cli_interactive_builder.py | 23 | def test_interactive_generate_two_jobs(tmp_path: Path): |
| LOW | backend/tests/unit/test_cli_interactive_builder.py | 86 | def test_interactive_generate_decline_overwrite(tmp_path: Path): |
| LOW | backend/tests/unit/test_file_parser_service.py | 21 | def test_generate_single_caption_uses_provider_factory(): |
| LOW | backend/tests/unit/test_file_parser_service.py | 47 | def test_can_generate_captions_returns_false_when_factory_fails(): |
| LOW | backend/tests/unit/test_file_parser_service.py | 60 | def test_can_generate_captions_returns_true_when_factory_succeeds(): |
| 282 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | frontend/e2e/generation-requirements.spec.ts | 53 | // ── Mock tests ────────────────────────────────────────────────────── |
| MEDIUM | frontend/e2e/generation-requirements.spec.ts | 191 | // ── Integration tests ─────────────────────────────────────────────── |
| MEDIUM | frontend/e2e/lazyllm-global-vendor.spec.ts | 12 | // ─── Mock tests ──────────────────────────────────────────────────── |
| MEDIUM | frontend/e2e/lazyllm-global-vendor.spec.ts | 148 | // ─── Integration tests ───────────────────────────────────────────── |
| MEDIUM | frontend/e2e/history-pagination.spec.ts | 83 | // ───────────────── Mock tests ───────────────── |
| MEDIUM | frontend/e2e/history-pagination.spec.ts | 192 | // ───────────────── Integration test ───────────────── |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 46 | // ── Mock tests: Outline presets ────────────────────────────────────── |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 144 | // ── Mock tests: Description presets ────────────────────────────────── |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 184 | // ── Integration tests ──────────────────────────────────────────────── |
| MEDIUM | frontend/e2e/material-textarea-picker.spec.ts | 64 | // ── Mock tests: Upload button dropdown on Home page ────────────────── |
| MEDIUM | frontend/e2e/material-textarea-picker.spec.ts | 150 | // ── Mock tests: Upload button dropdown on OutlineEditor ────────────── |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 7 | // ─── i18n ──────────────────────────────────────────────────────────────────── |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 35 | // ─── Types ─────────────────────────────────────────────────────────────────── |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 43 | // ─── System presets ────────────────────────────────────────────────────────── |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 70 | // ─── Component ─────────────────────────────────────────────────────────────── |
| MEDIUM | backend/tests/conftest.py | 163 | # ===================================== |
| MEDIUM | backend/tests/conftest.py | 165 | # ===================================== |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 18 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 20 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 52 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 54 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 99 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_image_retry.py | 101 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 21 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 24 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 51 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 53 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 88 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 90 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 111 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 113 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 170 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_codex_text_retry.py | 172 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/tests/unit/test_tts_video_service.py | 69 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/tests/unit/test_tts_video_service.py | 71 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/tests/unit/test_tts_video_service.py | 561 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/tests/unit/test_tts_video_service.py | 564 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/tests/unit/test_tts_video_service.py | 23 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/tests/unit/test_tts_video_service.py | 25 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/controllers/openai_oauth_controller.py | 214 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/controllers/openai_oauth_controller.py | 216 | # --------------------------------------------------------------------------- |
| MEDIUM | backend/controllers/page_controller.py | 859 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/controllers/page_controller.py | 861 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 233 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 235 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 24 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 26 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 323 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 325 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 778 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 780 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 1031 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 1033 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 1400 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 1402 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 1483 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/tts_video_service.py | 1485 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/prompts.py | 275 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/prompts.py | 277 | # ═══════════════════════════════════════════════════════════════════════════════ |
| MEDIUM | backend/services/prompts.py | 24 | # ═══════════════════════════════════════════════════════════════════════════════ |
| 31 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | backend/app.py | 324 | except Exception as e: |
| LOW | backend/tests/conftest.py | 63 | except Exception: |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 63 | except Exception as e: |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 97 | except Exception as e: |
| LOW | …kend/tests/integration/test_codex_retry_integration.py | 28 | except Exception: |
| LOW | backend/tests/integration/test_api_full_flow.py | 79 | except Exception as e: |
| LOW | backend/tests/integration/test_api_full_flow.py | 134 | except Exception as e: |
| LOW | backend/tests/integration/test_api_full_flow.py | 160 | except Exception as e: |
| LOW | backend/utils/latex_utils.py | 174 | except Exception as e: |
| LOW | backend/utils/latex_utils.py | 216 | except Exception as e: |
| LOW | backend/utils/pptx_builder.py | 103 | except Exception as e: |
| LOW | backend/utils/pptx_builder.py | 131 | except Exception as e: |
| LOW | backend/utils/pptx_builder.py | 167 | except Exception as e: |
| LOW | backend/utils/pptx_builder.py | 536 | except Exception as e: |
| LOW | backend/utils/pptx_builder.py | 592 | except Exception as e: |
| LOW | backend/utils/pptx_builder.py | 647 | except Exception as e: |
| LOW | backend/utils/path_utils.py | 41 | except Exception as e: |
| LOW | backend/utils/mask_utils.py | 220 | except Exception as e: |
| LOW | backend/utils/mask_utils.py | 326 | except Exception as e: |
| LOW | backend/models/settings.py | 216 | except Exception: |
| LOW | backend/controllers/material_controller.py | 112 | except Exception: |
| LOW | backend/controllers/material_controller.py | 164 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 230 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 295 | except Exception: |
| LOW | backend/controllers/material_controller.py | 498 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 504 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 644 | except Exception: |
| LOW | backend/controllers/material_controller.py | 649 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 672 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 716 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 761 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 813 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 852 | except Exception: |
| LOW | backend/controllers/material_controller.py | 878 | except Exception as e: |
| LOW | backend/controllers/material_controller.py | 902 | except Exception as e: |
| LOW | backend/controllers/file_controller.py | 47 | except Exception as e: |
| LOW | backend/controllers/file_controller.py | 80 | except Exception as e: |
| LOW | backend/controllers/file_controller.py | 112 | except Exception as e: |
| LOW | backend/controllers/file_controller.py | 137 | except Exception: |
| LOW | backend/controllers/file_controller.py | 154 | except Exception: |
| LOW | backend/controllers/file_controller.py | 160 | except Exception as e: |
| LOW | backend/controllers/openai_oauth_controller.py | 190 | except Exception as e: |
| LOW | backend/controllers/openai_oauth_controller.py | 268 | except Exception as e: |
| LOW | backend/controllers/openai_oauth_controller.py | 329 | except Exception: |
| LOW | backend/controllers/reference_file_controller.py | 93 | except Exception as e: |
| LOW | backend/controllers/reference_file_controller.py | 102 | except Exception as db_error: |
| LOW | backend/controllers/reference_file_controller.py | 137 | except Exception: |
| LOW | backend/controllers/reference_file_controller.py | 209 | except Exception as e: |
| LOW | backend/controllers/reference_file_controller.py | 230 | except Exception as e: |
| LOW | backend/controllers/reference_file_controller.py | 255 | except Exception as e: |
| LOW | backend/controllers/reference_file_controller.py | 266 | except Exception as e: |
| LOW | backend/controllers/reference_file_controller.py | 304 | except Exception as e: |
| LOW | backend/controllers/reference_file_controller.py | 360 | except Exception as e: |
| LOW | backend/controllers/reference_file_controller.py | 403 | except Exception as e: |
| LOW | backend/controllers/reference_file_controller.py | 433 | except Exception as e: |
| LOW | backend/controllers/export_controller.py | 74 | except Exception as e: |
| LOW | backend/controllers/export_controller.py | 151 | except Exception as e: |
| LOW | backend/controllers/export_controller.py | 225 | except Exception as e: |
| LOW | backend/controllers/export_controller.py | 293 | except Exception as e: |
| LOW | backend/controllers/export_controller.py | 435 | except Exception as e: |
| 213 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | backend/config.py | 5 | |
| LOW | backend/config.py | 6 | |
| LOW | backend/tests/unit/test_api_health.py | 5 | |
| LOW | backend/tests/unit/test_cli_run_monitor.py | 3 | |
| LOW | backend/tests/unit/test_api_material.py | 9 | |
| LOW | backend/tests/unit/test_renovation_filename.py | 11 | |
| LOW | backend/tests/unit/test_ai_mock.py | 7 | |
| LOW | backend/tests/unit/test_ai_mock.py | 8 | |
| LOW | backend/tests/unit/test_ai_mock.py | 8 | |
| LOW | backend/tests/unit/test_cli_loader.py | 3 | |
| LOW | backend/tests/unit/test_cli_interactive_builder.py | 3 | |
| LOW | backend/tests/unit/test_api_project.py | 10 | |
| LOW | backend/tests/unit/test_api_project.py | 90 | |
| LOW | backend/tests/unit/test_icon_subject_extraction.py | 11 | |
| LOW | backend/tests/unit/test_cli_plain_help.py | 3 | |
| LOW | backend/tests/unit/test_smart_merge.py | 2 | |
| LOW | backend/tests/unit/test_cli_resolve.py | 3 | |
| LOW | backend/tests/unit/test_cli_resolve.py | 5 | |
| LOW | backend/tests/unit/test_cli_resolve.py | 6 | |
| LOW | backend/tests/unit/test_cli_resolve.py | 11 | |
| LOW | backend/tests/unit/test_cli_config.py | 3 | |
| LOW | backend/tests/integration/test_full_workflow.py | 7 | |
| LOW | backend/tests/integration/test_full_workflow.py | 8 | |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 15 | |
| LOW | backend/tests/integration/test_api_full_flow.py | 23 | |
| LOW | backend/utils/__init__.py | 2 | |
| LOW | backend/utils/__init__.py | 2 | |
| LOW | backend/utils/__init__.py | 2 | |
| LOW | backend/utils/__init__.py | 2 | |
| LOW | backend/utils/__init__.py | 2 | |
| LOW | backend/utils/__init__.py | 2 | |
| LOW | backend/utils/__init__.py | 2 | |
| LOW | backend/utils/__init__.py | 11 | |
| LOW | backend/utils/__init__.py | 11 | |
| LOW | backend/utils/__init__.py | 11 | |
| LOW | backend/utils/__init__.py | 12 | |
| LOW | backend/utils/__init__.py | 12 | |
| LOW | backend/utils/__init__.py | 12 | |
| LOW | backend/utils/__init__.py | 13 | |
| LOW | backend/utils/__init__.py | 14 | |
| LOW | backend/utils/__init__.py | 14 | |
| LOW | backend/utils/__init__.py | 14 | |
| LOW | backend/utils/response.py | 5 | |
| LOW | backend/utils/response.py | 5 | |
| LOW | backend/utils/pptx_builder.py | 8 | |
| LOW | backend/utils/pptx_builder.py | 14 | |
| LOW | backend/utils/pptx_builder.py | 14 | |
| LOW | backend/utils/page_utils.py | 4 | |
| LOW | backend/models/__init__.py | 19 | |
| LOW | backend/models/__init__.py | 20 | |
| LOW | backend/models/__init__.py | 21 | |
| LOW | backend/models/__init__.py | 22 | |
| LOW | backend/models/__init__.py | 23 | |
| LOW | backend/models/__init__.py | 24 | |
| LOW | backend/models/__init__.py | 25 | |
| LOW | backend/models/__init__.py | 26 | |
| LOW | backend/models/__init__.py | 27 | |
| LOW | backend/controllers/openai_oauth_controller.py | 11 | |
| LOW | backend/controllers/openai_oauth_controller.py | 16 | |
| LOW | backend/controllers/__init__.py | 2 | |
| 117 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | frontend/e2e/ui-full-flow.spec.ts | 40 | // Step 1: Visit homepage |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 55 | // Step 2: Ensure "一句话生成" tab is selected (it's selected by default) |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 68 | // Step 3: Enter idea and click "Next" |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 83 | // Step 4: Click batch generate outline button on outline editor page |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 124 | // Step 5: Wait for outline generation to complete (smart wait) |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 153 | // Step 6: Click "Next" to go to description editor page |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 166 | // Step 7: Click batch generate descriptions button |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 178 | // Step 8: Wait for descriptions to generate (smart wait) |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 193 | // Step 9: Test retry single card functionality |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 254 | // Step 10: Click "生成图片" to go to image generation page |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 346 | // Step 11: Select template (required before generating images) |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 438 | // Step 12: Click batch generate images button |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 625 | // Step 14: Export PPT |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 632 | // Step 1: Wait for export button to be enabled (it's disabled until all images are generated) |
| LOW | frontend/e2e/ui-full-flow.spec.ts | 643 | // Step 2: Click "导出为 PPTX" in the dropdown menu |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 132 | // Step 1: Visit homepage |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 140 | // Step 2: Ensure "一句话生成" tab is selected (it's selected by default) |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 151 | // Step 3: Enter idea and click "Next" |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 165 | // Step 4: Verify outline editor page loaded |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 172 | // Step 5: Click generate outline (mocked) |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 183 | // Step 6: Verify UI shows outline (mocked data) |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 192 | // Step 7: Navigate to description editor |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 203 | // Step 8: Test description generation UI (mocked) |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 213 | // Step 9: Navigate to image generation |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 224 | // Step 10: Test image generation UI (mocked) |
| LOW | frontend/e2e/ui-full-flow-mocked.spec.ts | 236 | // Step 11: Test export UI |
| LOW | backend/tests/integration/test_api_full_flow.py | 184 | # Step 1: Create project |
| LOW | backend/tests/integration/test_api_full_flow.py | 223 | # Step 2: Generate outline |
| LOW | backend/tests/integration/test_api_full_flow.py | 236 | # Step 3: Wait for outline completion |
| LOW | backend/tests/integration/test_api_full_flow.py | 249 | # Step 4: Generate descriptions |
| LOW | backend/tests/integration/test_api_full_flow.py | 269 | # Step 5: Generate images |
| LOW | backend/tests/integration/test_api_full_flow.py | 306 | # Step 6: Export PPT |
| LOW | backend/tests/integration/test_api_full_flow.py | 321 | # Step 7: Verify PPT can be downloaded |
| LOW | backend/controllers/project_controller.py | 685 | # Step 1: Parse description to outline |
| LOW | backend/controllers/project_controller.py | 690 | # Step 2: Split description into page descriptions |
| LOW | backend/controllers/project_controller.py | 695 | # Step 3: Flatten outline to pages |
| LOW | backend/controllers/project_controller.py | 705 | # Step 4: Delete existing pages (using ORM session to trigger cascades) |
| LOW | backend/controllers/project_controller.py | 710 | # Step 5: Create pages with both outline and description |
| LOW | backend/controllers/page_controller.py | 791 | # Step 1: Parse page PDF → markdown |
| LOW | backend/controllers/page_controller.py | 812 | # Step 2: AI extract structured content |
| LOW | backend/controllers/page_controller.py | 816 | # Step 3: Optional layout caption |
| LOW | backend/controllers/page_controller.py | 831 | # Step 4: Update page in database |
| LOW | backend/services/export_service.py | 981 | # Step 1: 收集所有文本元素 |
| LOW | backend/services/export_service.py | 1001 | # Step 2: 并行执行两种识别 |
| LOW | backend/services/export_service.py | 1121 | # Step 3: 合并结果 |
| LOW | backend/services/task_manager.py | 1344 | # Step 1: Split PDF into per-page PDFs |
| LOW | backend/services/task_manager.py | 1663 | # Step 1: 准备工作 |
| LOW | backend/services/task_manager.py | 1692 | # Step 2: 创建文字属性提取器 |
| LOW | backend/services/task_manager.py | 1697 | # Step 3: 调用导出方法(使用项目的导出设置) |
| LOW | backend/services/task_manager.py | 1718 | # Step 4: 标记任务完成 |
| LOW | backend/services/file_parser_service.py | 133 | # Step 1: Get upload URL |
| LOW | backend/services/file_parser_service.py | 141 | # Step 2: Upload file |
| LOW | backend/services/file_parser_service.py | 149 | # Step 3: Poll for parsing result |
| LOW | backend/services/file_parser_service.py | 157 | # Step 4: Enhance markdown with image captions |
| LOW | backend/services/image_editability/inpaint_providers.py | 377 | # Step 1: 百度图像修复 - 精确去除文字 |
| LOW | backend/services/image_editability/inpaint_providers.py | 393 | # Step 2: 生成式画质提升(可选) |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | backend/app.py | 196 | |
| LOW | backend/tests/unit/test_api_project.py | 131 | |
| LOW | backend/tests/unit/test_api_settings_provider.py | 30 | |
| LOW | backend/tests/unit/test_api_settings_provider.py | 48 | |
| LOW | backend/tests/integration/test_api_full_flow.py | 38 | |
| LOW | backend/tests/integration/test_api_full_flow.py | 90 | |
| LOW | backend/utils/pptx_builder.py | 250 | |
| LOW | backend/utils/pptx_builder.py | 571 | |
| LOW | backend/utils/path_utils.py | 75 | |
| LOW | backend/utils/mask_utils.py | 59 | |
| LOW | backend/utils/mask_utils.py | 109 | |
| LOW | backend/utils/mask_utils.py | 274 | |
| LOW | backend/controllers/material_controller.py | 44 | |
| LOW | backend/controllers/material_controller.py | 380 | |
| LOW | backend/controllers/material_controller.py | 510 | |
| LOW | backend/controllers/material_controller.py | 819 | |
| LOW | backend/controllers/file_controller.py | 117 | |
| LOW | backend/controllers/reference_file_controller.py | 38 | |
| LOW | backend/controllers/reference_file_controller.py | 107 | |
| LOW | backend/controllers/reference_file_controller.py | 272 | |
| LOW | backend/controllers/export_controller.py | 230 | |
| LOW | backend/controllers/project_controller.py | 301 | |
| LOW | backend/controllers/project_controller.py | 427 | |
| LOW | backend/controllers/project_controller.py | 519 | |
| LOW | backend/controllers/project_controller.py | 850 | |
| LOW | backend/controllers/project_controller.py | 1227 | |
| LOW | backend/controllers/project_controller.py | 1351 | |
| LOW | backend/controllers/project_controller.py | 542 | |
| LOW | backend/controllers/project_controller.py | 874 | |
| LOW | backend/controllers/page_controller.py | 237 | |
| LOW | backend/controllers/page_controller.py | 325 | |
| LOW | backend/controllers/page_controller.py | 502 | |
| LOW | backend/controllers/page_controller.py | 742 | |
| LOW | backend/controllers/page_controller.py | 991 | |
| LOW | backend/controllers/settings_controller.py | 32 | |
| LOW | backend/controllers/settings_controller.py | 172 | |
| LOW | backend/controllers/settings_controller.py | 443 | |
| LOW | backend/controllers/settings_controller.py | 516 | |
| LOW | backend/controllers/settings_controller.py | 617 | |
| LOW | backend/controllers/settings_controller.py | 803 | |
| LOW | backend/controllers/settings_controller.py | 1026 | |
| LOW | backend/controllers/settings_controller.py | 1081 | |
| LOW | backend/services/ai_service.py | 344 | |
| LOW | backend/services/ai_service.py | 391 | |
| LOW | backend/services/ai_service.py | 877 | |
| LOW | backend/services/ai_service.py | 448 | |
| LOW | backend/services/inpainting_service.py | 87 | |
| LOW | backend/services/tts_video_service.py | 366 | |
| LOW | backend/services/tts_video_service.py | 815 | |
| LOW | backend/services/tts_video_service.py | 1045 | |
| LOW | backend/services/tts_video_service.py | 1426 | |
| LOW | backend/services/tts_video_service.py | 1488 | |
| LOW | backend/services/prompts.py | 117 | |
| LOW | backend/services/ai_service_manager.py | 88 | |
| LOW | backend/services/export_service.py | 700 | |
| LOW | backend/services/export_service.py | 791 | |
| LOW | backend/services/export_service.py | 932 | |
| LOW | backend/services/export_service.py | 1159 | |
| LOW | backend/services/export_service.py | 1396 | |
| LOW | backend/services/task_manager.py | 362 | |
| 48 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | backend/run.sh | 10 | # Check if .env exists |
| LOW | backend/run.sh | 18 | # Check if virtual environment exists |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 13 | # Check if lazyllm is available |
| LOW | backend/tests/integration/test_seedream5_real_api.py | 66 | # Check if it's the guidance_scale error |
| LOW | backend/utils/pptx_builder.py | 186 | # Check if dimensions exceed python-pptx limits and scale down if needed |
| LOW | backend/utils/pptx_builder.py | 329 | # Check if it fits |
| LOW | backend/utils/pptx_builder.py | 372 | # Check if we have colored segments (multi-color text) |
| LOW | backend/utils/pptx_builder.py | 520 | # Check if image exists |
| LOW | backend/controllers/file_controller.py | 35 | # Check if directory exists |
| LOW | backend/controllers/file_controller.py | 39 | # Check if file exists |
| LOW | backend/controllers/file_controller.py | 68 | # Check if directory exists |
| LOW | backend/controllers/file_controller.py | 72 | # Check if file exists |
| LOW | backend/controllers/file_controller.py | 100 | # Check if directory exists |
| LOW | backend/controllers/file_controller.py | 104 | # Check if file exists |
| LOW | backend/controllers/file_controller.py | 133 | # Check if the path is trying to escape the root directory |
| LOW | backend/controllers/reference_file_controller.py | 119 | # Check if file is in request |
| LOW | backend/controllers/export_controller.py | 350 | # Check if pages have generated images |
| LOW | backend/controllers/project_controller.py | 1259 | # Check if pages have descriptions (允许没有描述,从空开始) |
| LOW | backend/controllers/page_controller.py | 261 | # Check if already generated |
| LOW | backend/controllers/page_controller.py | 350 | # Check if already generated |
| LOW | backend/controllers/template_controller.py | 32 | # Check if file is in request |
| LOW | backend/controllers/template_controller.py | 125 | # Check if file is in request |
| LOW | backend/controllers/settings_controller.py | 702 | # Check if reasoning configuration changed (requires AIService cache clear) |
| LOW | backend/services/export_service.py | 621 | # Check if this is a table with子元素 (cells from Baidu OCR) |
| LOW | backend/services/export_service.py | 647 | # Check if this is a table with HTML data (legacy) |
| LOW | backend/services/task_manager.py | 124 | # Check if task raised an exception |
| LOW | backend/services/file_parser_service.py | 118 | # Check if it's a plain text file that doesn't need MinerU parsing |
| LOW | backend/services/file_parser_service.py | 125 | # Check if it's a spreadsheet file (xlsx, csv) - use markitdown |
| LOW | backend/services/file_parser_service.py | 187 | # Read file content |
| LOW | backend/services/file_parser_service.py | 195 | # Check if content has markdown images |
| LOW | scripts/setup-env-from-secrets.sh | 56 | # Check if this configuration item exists in .env file |
| LOW | scripts/test_docker_environment.sh | 255 | # Check if project still exists |
| LOW | scripts/run-local-ci.sh | 147 | # Check if Docker is running |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | backend/services/ai_service.py | 208 | 生成并解析JSON,如果解析失败则重新生成 Args: prompt: 生成提示词 thinking_budget: 思考预算(会根据 en |
| HIGH | backend/services/ai_service.py | 240 | 带图片输入的JSON生成,如果解析失败则重新生成(最多重试3次) Args: prompt: 生成提示词 image_path: 图片文件路 |
| HIGH | backend/services/ai_service.py | 880 | Generate image using configured image provider Based on gemini_genai.py gen_image() Ar |
| HIGH | backend/services/image_editability/service.py | 92 | 将图片转换为可编辑结构(递归) 线程安全:此方法可以被多个线程并行调用 Args: image_path: 图片路径 |
| HIGH | backend/services/image_editability/factories.py | 313 | 创建基于生成式大模型的Inpaint提供者 使用生成式大模型(如Gemini图片编辑)通过自然语言指令移除图片中的文字和图标。 适用于不需要精确bbox的场景,大模型自动理 |
| HIGH | backend/services/image_editability/factories.py | 506 | 从默认参数创建配置 默认配置(推荐用于导出PPTX): - 元素提取:混合提取器(MinerU版面分析 + 百度高精度OCR) - 背景生成:混合Inpai |
| HIGH | backend/services/image_editability/factories.py | 702 | 创建基于Caption Model的文字属性提取器 使用视觉语言模型(如Gemini)分析文字区域图像, 通过生成JSON的方式获取字体颜色、是否粗体、是否斜体等属性。 |
| HIGH | backend/services/image_editability/factories.py | 730 | 创建文字属性提取器注册表 支持动态注册新元素类型,不限于预定义类型。 Args: caption_extractor: Capti |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | README.md | 242 | GOOGLE_API_KEY=your-api-key-here |
| HIGH | README.md | 247 | OPENAI_API_KEY=your-api-key-here |
| HIGH | README_EN.md | 245 | GOOGLE_API_KEY=your-api-key-here |
| HIGH | README_EN.md | 252 | OPENAI_API_KEY=your-api-key-here |
| HIGH | backend/controllers/settings_controller.py | 179 | "api_key": "your-api-key", |
| HIGH | scripts/setup-env-from-secrets.sh | 76 | sed -i '/^GOOGLE_API_KEY=/s/your-api-key-here/mock-api-key/' "$ENV_FILE" |
| HIGH | v0_demo/lazyllm_genai.py | 22 | export BANANA_QWEN_API_KEY = "your-api-key" |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | backend/tests/unit/test_api_material.py | 180 | # Create a temp image |
| MEDIUM | backend/tests/integration/test_api_full_flow.py | 206 | # Create a simple test template image |
| MEDIUM | backend/controllers/page_controller.py | 610 | # Create a temporary directory in the project's upload folder |
| MEDIUM | scripts/test_docker_environment.sh | 236 | # Create a project |
| MEDIUM | v0_demo/lazyllm_genai.py | 196 | # Create a test image if it doesn't exist |
| Severity | File | Line | Snippet |
|---|---|---|---|
| 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 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | backend/models/material.py | 20 | caption = db.Column(db.String(500), nullable=True) # AI-generated image description |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | frontend/e2e/file-preview-scrollbar.spec.ts | 12 | const LONG_MARKDOWN = '# Test Document\n\n' + 'Lorem ipsum dolor sit amet. '.repeat(200) + |
| LOW | frontend/e2e/file-preview-scrollbar.spec.ts | 12 | const LONG_MARKDOWN = '# Test Document\n\n' + 'Lorem ipsum dolor sit amet. '.repeat(200) + |
| LOW | frontend/e2e/openai-oauth.spec.ts | 48 | json: { success: true, data: { ...base, openai_oauth_connected: true, openai_oauth_account_id: 'user@example |
| LOW | frontend/e2e/openai-oauth.spec.ts | 117 | json: { success: true, data: { ...base, openai_oauth_connected: true, openai_oauth_account_id: 'user@example |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | backend/services/ai_providers/image/openai_provider.py | 160 | # Build comprehensive extra_body that works with multiple providers |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | README.md | 241 | # Gemini 格式配置(当 AI_PROVIDER_FORMAT=gemini 时使用) |
| LOW | .github/workflows/docker-publish.yml | 321 | # VERSION: ${{ inputs.version }} |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | scripts/setup-env-from-secrets.sh | 5 | # Usage: |