一站式原生AI PPT生成应用,几分钟内生成一套幻灯片; 支持上传任意模板图片,上传任意素材&智能解析,一句话/大纲/页面描述自动生成PPT,口头修改指定区域、一键导出可编辑ppt、视频等 - An AI-native slides generator based on nano banana pro🍌
This report summarizes scanner evidence for Anionex/banana-slides, a TypeScript project with 15,731 GitHub stars. SynthScan examined 146,105 lines of code across 552 source files, recording 1963 pattern matches distributed across 21 syntactic categories. The legacy adjusted pattern signal is 17.2 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1195 finding(s).
Are imports declared and package/API names verified? 230 finding(s).
Are wrappers, guards, and repeated structures necessary? 1437 finding(s).
Which changes need focused human review? 1963 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1963 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | 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/e2e/desktop-update-check.spec.ts | 5 | async function installDesktopUpdateBridge(page: Page, startWithUpdate: boolean) { | CODE |
| LOW | frontend/src/types/dataStorage.ts | 34 | export function getDataStorageElectronApi(): DataStorageElectronApi | null { | CODE |
| LOW | frontend/src/utils/index.ts | 224 | export function normalizeRenovationErrorMessage(errorMessage: string | null | undefined): string { | CODE |
| LOW | frontend/src/api/client.ts | 15 | function resolveDesktopBackendPort(): number { | CODE |
| LOW | frontend/src/pages/Settings.tsx | 260 | function toDesktopUpdateResultView(info: DesktopUpdateCheckResult): UpdateResultView { | CODE |
| LOW | frontend/src/store/useProjectStore.ts | 83 | (function cleanupLegacyTemplateLocalStorageKeys() { | CODE |
| LOW | desktop/auto-updater.js | 99 | async function checkGitHubReleaseFallback({ app, logger = console }) { | CODE |
| LOW | desktop/main.js | 53 | function configureSmokeUserDataPath() { | CODE |
| LOW | desktop/main.js | 144 | function shouldOpenInExternalBrowser(targetUrl) { | CODE |
| LOW | desktop/main.js | 291 | async function showDownloadedUpdateDialog(checkResult) { | CODE |
| LOW | desktop/update-policy.js | 68 | function selectLatestDesktopRelease(releases, currentVersion, platform, arch) { | CODE |
| LOW | desktop/update-policy.js | 100 | 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/app.py | 434 | def _reconcile_orphaned_tasks_on_startup() -> None: | 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_gpt_image_25_support.py | 327 | def test_factory_forwards_image_quality_setting(monkeypatch): | CODE |
| LOW⚡ | backend/tests/unit/test_gpt_image_25_support.py | 361 | def test_startup_loader_restores_image_quality(monkeypatch): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 76 | def test_is_gpt_image_model_matches_family_by_prefix(model, expected): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 183 | def test_resolve_quality_per_model(model, quality, expected): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 199 | def test_older_model_request_clamps_extended_quality(): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 256 | def test_apimart_default_quality_keeps_original_payload(): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 271 | def test_apimart_forwards_explicit_extended_quality(): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 286 | def test_apimart_clamps_extended_quality_for_older_model(): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 301 | def test_apimart_non_gpt_image_model_never_sends_quality(): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 343 | def test_factory_defaults_image_quality_to_auto(monkeypatch): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 379 | def test_startup_loader_falls_back_to_env_quality(monkeypatch): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 432 | def test_sync_settings_invalidates_provider_cache_on_quality_change(): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 444 | def test_update_settings_stores_explicit_auto_quality(): | CODE |
| LOW | backend/tests/unit/test_gpt_image_25_support.py | 464 | def test_codex_quality_mapping(monkeypatch): | 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_sensenova_image_provider.py | 38 | def test_sensenova_generation_uses_json_images_api(): | CODE |
| LOW⚡ | backend/tests/unit/test_sensenova_image_provider.py | 68 | def test_sensenova_edit_uses_json_image_urls(): | CODE |
| 821 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 | 15 | // ─── Mock tests ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/lazyllm-global-vendor.spec.ts | 147 | // ─── Integration tests ───────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/history-pagination.spec.ts | 83 | // ───────────────── Mock tests ───────────────── | COMMENT |
| MEDIUM | frontend/e2e/history-pagination.spec.ts | 195 | // ───────────────── Integration test ───────────────── | COMMENT |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 63 | // ── Mock tests: Outline presets ────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 226 | // ── Mock tests: Description presets ────────────────────────────────── | COMMENT |
| MEDIUM | frontend/e2e/preset-capsules.spec.ts | 284 | // ── 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 | 8 | // ─── i18n ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 36 | // ─── Types ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 41 | // ─── System presets ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/shared/PresetCapsules.tsx | 71 | // ─── Component ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | backend/tests/conftest.py | 173 | # ===================================== | COMMENT |
| MEDIUM | backend/tests/conftest.py | 175 | # ===================================== | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_gpt_image_25_support.py | 323 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_gpt_image_25_support.py | 325 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_gpt_image_25_support.py | 357 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/tests/unit/test_gpt_image_25_support.py | 359 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_gpt_image_25_support.py | 54 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_gpt_image_25_support.py | 56 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_gpt_image_25_support.py | 155 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_gpt_image_25_support.py | 157 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_gpt_image_25_support.py | 211 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/tests/unit/test_gpt_image_25_support.py | 213 | # --------------------------------------------------------------------------- | 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 | 225 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | backend/controllers/openai_oauth_controller.py | 227 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | backend/controllers/page_controller.py | 966 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/controllers/page_controller.py | 968 | # ═══════════════════════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM⚡ | backend/services/ai_service.py | 1398 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | backend/services/ai_service.py | 1400 | # ========================================================================= | 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 |
| 47 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | backend/app.py | 182 | except Exception as e: | CODE |
| LOW | backend/app.py | 412 | except Exception as e: | CODE |
| LOW | backend/app.py | 451 | except Exception as reconcile_error: # pragma: no cover - never block startup | 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 | 674 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_builder.py | 730 | except Exception as e: | CODE |
| LOW | backend/utils/pptx_builder.py | 785 | 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 | 324 | except Exception: | CODE |
| LOW | backend/models/settings.py | 327 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 112 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 165 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 231 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 296 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 499 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 505 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 645 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 650 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 673 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 717 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 762 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 814 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 853 | except Exception: | CODE |
| LOW | backend/controllers/material_controller.py | 879 | except Exception as e: | CODE |
| LOW | backend/controllers/material_controller.py | 903 | 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 | 283 | except Exception as e: | CODE |
| LOW | backend/controllers/openai_oauth_controller.py | 313 | except Exception as e: | CODE |
| LOW | backend/controllers/openai_oauth_controller.py | 399 | 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 |
| 266 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | backend/app.py | 521 | except OSError: # pragma: no cover - 写 pid 失败不影响锁 | CODE |
| HIGH | backend/app.py | 568 | except KeyboardInterrupt: | CODE |
| HIGH | backend/tests/conftest.py | 65 | except Exception: | CODE |
| HIGH | backend/tests/unit/test_task_watchdog.py | 495 | except RuntimeError: | CODE |
| HIGH | backend/tests/unit/test_tts_video_service.py | 377 | except OSError: | CODE |
| HIGH | backend/utils/path_utils.py | 45 | except (RuntimeError, ImportError, TypeError, AttributeError): | CODE |
| HIGH | backend/models/settings.py | 107 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | backend/models/settings.py | 118 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | backend/controllers/material_controller.py | 112 | except Exception: | CODE |
| HIGH | backend/controllers/openai_oauth_controller.py | 66 | except Exception: | CODE |
| HIGH | backend/controllers/reference_file_controller.py | 165 | except Exception: | CODE |
| HIGH | backend/controllers/settings_controller.py | 836 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | backend/controllers/settings_controller.py | 991 | except OSError: | CODE |
| HIGH | backend/services/ai_service.py | 1186 | except Exception: | CODE |
| HIGH | backend/services/file_service.py | 142 | except Exception: | CODE |
| HIGH | backend/services/file_service.py | 594 | except Exception: | CODE |
| HIGH | backend/services/update_check_service.py | 50 | except Exception: | CODE |
| HIGH | backend/services/tts_video_service.py | 227 | except Exception: | CODE |
| HIGH | backend/services/tts_video_service.py | 1242 | except Exception: | CODE |
| HIGH | backend/services/tts_video_service.py | 100 | except queue.Empty: | CODE |
| HIGH | backend/services/task_watchdog.py | 149 | except Exception: # pragma: no cover - 请求上下文之外 | CODE |
| HIGH | backend/services/task_watchdog.py | 416 | except Exception: # pragma: no cover - 非 ORM 对象/已分离实例 | CODE |
| HIGH | backend/services/task_watchdog.py | 511 | except Exception: # pragma: no cover - defensive | CODE |
| HIGH | backend/services/task_manager.py | 79 | except Exception: | CODE |
| HIGH | backend/services/task_manager.py | 139 | except OSError: | CODE |
| HIGH | backend/services/task_manager.py | 1525 | except Exception: | CODE |
| HIGH | backend/services/file_parser_service.py | 44 | except RuntimeError: | CODE |
| HIGH | backend/services/file_parser_service.py | 72 | except (RuntimeError, ImportError, TypeError, AttributeError): | CODE |
| HIGH | backend/services/file_parser_service.py | 763 | except OSError: | CODE |
| HIGH | backend/services/ai_providers/__init__.py | 75 | except RuntimeError: | CODE |
| HIGH | backend/services/ai_providers/__init__.py | 103 | except RuntimeError: | CODE |
| HIGH | …/services/ai_providers/ocr/baidu_table_ocr_provider.py | 273 | except RuntimeError: | CODE |
| HIGH | …rvices/ai_providers/ocr/baidu_accurate_ocr_provider.py | 363 | except RuntimeError: | CODE |
| HIGH | …rvices/ai_providers/image/baidu_inpainting_provider.py | 244 | except RuntimeError: | CODE |
| HIGH | backend/services/ai_providers/image/lazyllm_provider.py | 135 | except ValueError: | CODE |
| HIGH | backend/services/ai_providers/image/lazyllm_provider.py | 344 | except OSError: | CODE |
| HIGH | v0_demo/gemini_genai.py | 41 | except Exception: | CODE |
| 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_description_field_contract.py | 7 | CODE | |
| LOW | backend/tests/unit/test_api_project.py | 261 | 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_openai_image_multi_reference.py | 5 | CODE | |
| LOW | backend/tests/unit/test_openai_image_seedream_size.py | 10 | 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 | backend/tests/unit/test_template_auto_match.py | 516 | CODE | |
| LOW | backend/tests/integration/test_lazyllm_real_vendors.py | 16 | 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 | |
| 131 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 | 720 | # Step 1: Parse description to outline | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 725 | # Step 2: Split description into page descriptions | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 730 | # Step 3: Flatten outline to pages | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 740 | # Step 4: Delete existing pages (using ORM session to trigger cascades) | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 745 | # Step 5: Create pages with both outline and description | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 919 | # Step 2: AI extract structured content | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 923 | # Step 3: Optional layout caption | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 938 | # Step 4: Update page in database | COMMENT |
| LOW | backend/controllers/page_controller.py | 898 | # Step 1: Parse page PDF → markdown | COMMENT |
| LOW⚡ | backend/services/export_service.py | 1537 | # Step 3: 合并结果 | COMMENT |
| LOW | backend/services/export_service.py | 1306 | # Step 1: 收集所有文本元素 | COMMENT |
| LOW | backend/services/export_service.py | 1326 | # Step 2: 并行执行两种识别 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1955 | # Step 1: 准备工作 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1984 | # Step 2: 创建文字属性提取器 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1989 | # Step 3: 调用导出方法(使用项目的导出设置) | COMMENT |
| LOW | backend/services/task_manager.py | 1591 | # Step 1: Split PDF into per-page PDFs | COMMENT |
| LOW | backend/services/task_manager.py | 2011 | # 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 | 720 | # Step 1: Parse description to outline | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 725 | # Step 2: Split description into page descriptions | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 730 | # Step 3: Flatten outline to pages | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 740 | # Step 4: Delete existing pages (using ORM session to trigger cascades) | COMMENT |
| LOW⚡ | backend/controllers/project_controller.py | 745 | # Step 5: Create pages with both outline and description | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 919 | # Step 2: AI extract structured content | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 923 | # Step 3: Optional layout caption | COMMENT |
| LOW⚡ | backend/controllers/page_controller.py | 938 | # Step 4: Update page in database | COMMENT |
| LOW | backend/controllers/page_controller.py | 898 | # Step 1: Parse page PDF → markdown | COMMENT |
| LOW⚡ | backend/services/export_service.py | 1537 | # Step 3: 合并结果 | COMMENT |
| LOW | backend/services/export_service.py | 1306 | # Step 1: 收集所有文本元素 | COMMENT |
| LOW | backend/services/export_service.py | 1326 | # Step 2: 并行执行两种识别 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1955 | # Step 1: 准备工作 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1984 | # Step 2: 创建文字属性提取器 | COMMENT |
| LOW⚡ | backend/services/task_manager.py | 1989 | # Step 3: 调用导出方法(使用项目的导出设置) | COMMENT |
| LOW | backend/services/task_manager.py | 1591 | # Step 1: Split PDF into per-page PDFs | COMMENT |
| LOW | backend/services/task_manager.py | 2011 | # 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_pptx_font_size.py | 14 | CODE | |
| LOW | backend/tests/unit/test_api_project.py | 302 | 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 | 521 | CODE | |
| LOW | backend/tests/integration/test_requests_socks_proxy.py | 65 | 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/tests/integration/test_reference_file_ssrf.py | 18 | CODE | |
| LOW | backend/utils/pptx_builder.py | 709 | 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 | 381 | CODE | |
| LOW | backend/controllers/material_controller.py | 511 | CODE | |
| LOW | backend/controllers/material_controller.py | 820 | 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 | 303 | CODE | |
| LOW | backend/controllers/export_controller.py | 371 | CODE | |
| LOW | backend/controllers/project_controller.py | 336 | CODE | |
| LOW | backend/controllers/project_controller.py | 462 | CODE | |
| LOW | backend/controllers/project_controller.py | 554 | CODE | |
| LOW | backend/controllers/project_controller.py | 885 | CODE | |
| LOW | backend/controllers/project_controller.py | 1279 | CODE | |
| LOW | backend/controllers/project_controller.py | 1405 | CODE | |
| LOW | backend/controllers/project_controller.py | 577 | CODE | |
| LOW | backend/controllers/project_controller.py | 909 | CODE | |
| LOW | backend/controllers/page_controller.py | 336 | CODE | |
| LOW | backend/controllers/page_controller.py | 424 | CODE | |
| LOW | backend/controllers/page_controller.py | 609 | CODE | |
| LOW | backend/controllers/page_controller.py | 849 | CODE | |
| LOW | backend/controllers/page_controller.py | 1098 | CODE | |
| LOW | backend/controllers/settings_controller.py | 61 | CODE | |
| LOW | backend/controllers/settings_controller.py | 226 | CODE | |
| LOW | backend/controllers/settings_controller.py | 511 | CODE | |
| LOW | backend/controllers/settings_controller.py | 585 | CODE | |
| LOW | backend/controllers/settings_controller.py | 686 | CODE | |
| LOW | backend/controllers/settings_controller.py | 877 | CODE | |
| LOW | backend/controllers/settings_controller.py | 1146 | CODE | |
| LOW | backend/controllers/settings_controller.py | 1212 | CODE | |
| LOW | backend/controllers/settings_controller.py | 1323 | CODE | |
| LOW | backend/services/ai_service.py | 387 | CODE | |
| LOW | backend/services/ai_service.py | 442 | CODE | |
| LOW | backend/services/ai_service.py | 633 | CODE | |
| LOW | backend/services/ai_service.py | 1074 | CODE | |
| LOW | backend/services/ai_service.py | 1282 | CODE | |
| LOW | backend/services/ai_service.py | 502 | CODE | |
| LOW | backend/services/update_check_service.py | 177 | CODE | |
| 71 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 | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/project_controller.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/controllers/page_controller.py | 24 | 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 | 39 | 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/task_watchdog.py | 59 | 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 | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | backend/services/task_manager.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | backend/services/task_manager.py | 2424 | 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 | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | backend/services/ai_providers/__init__.py | 30 | __all__ = [ | CODE |
| LOW | backend/services/ai_providers/lazyllm_env.py | 7 | logger = logging.getLogger(__name__) | 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 | 30 | 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 | 26 | 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 |
| 8 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | backend/tests/unit/test_sensenova_image_provider.py | 63 | provider.client.chat.completions.create.assert_not_called() | CODE |
| CRITICAL⚡ | backend/tests/unit/test_sensenova_image_provider.py | 64 | provider.client.images.with_raw_response.generate.assert_not_called() | CODE |
| CRITICAL⚡ | backend/tests/unit/test_sensenova_image_provider.py | 65 | provider.client.images.with_raw_response.edit.assert_not_called() | CODE |
| CRITICAL | backend/tests/unit/test_sensenova_image_provider.py | 94 | provider.client.images.with_raw_response.edit.assert_not_called() | CODE |
| CRITICAL | backend/tests/unit/test_openai_image_multi_reference.py | 144 | provider.client.images.with_raw_response.edit.assert_not_called() | CODE |
| 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 | 388 | # Check if we have colored segments (multi-color text) | COMMENT |
| LOW | backend/utils/pptx_builder.py | 658 | # 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 | 451 | # Check if pages have generated images | COMMENT |
| LOW | backend/controllers/project_controller.py | 1311 | # Check if pages have descriptions (允许没有描述,从空开始) | COMMENT |
| LOW | backend/controllers/page_controller.py | 360 | # Check if already generated | COMMENT |
| LOW | backend/controllers/page_controller.py | 449 | # 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 | 762 | # Check if reasoning configuration changed (requires AIService cache clear) | COMMENT |
| LOW | backend/services/export_service.py | 943 | # Check if this is a table with子元素 (cells from Baidu OCR) | COMMENT |
| LOW | backend/services/export_service.py | 969 | # Check if this is a table with HTML data (legacy) | COMMENT |
| LOW | backend/services/task_manager.py | 299 | # 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 | 242 | 生成并解析JSON,如果解析失败则重新生成 Args: prompt: 生成提示词 thinking_budget: 思考预算(会根据 en | STRING |
| HIGH | backend/services/ai_service.py | 274 | 带图片输入的JSON生成,如果解析失败则重新生成(最多重试3次) Args: prompt: 生成提示词 image_path: 图片文件路 | STRING |
| HIGH | backend/services/ai_service.py | 1077 | 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 | 268 | GOOGLE_API_KEY=your-api-key-here | CODE |
| HIGH | README.md | 273 | OPENAI_API_KEY=your-api-key-here | CODE |
| HIGH | README_EN.md | 269 | GOOGLE_API_KEY=your-api-key-here | CODE |
| HIGH | README_EN.md | 276 | OPENAI_API_KEY=your-api-key-here | CODE |
| HIGH | backend/controllers/settings_controller.py | 233 | "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 | 80 | json: { success: true, data: { ...base, openai_oauth_connected: true, openai_oauth_account_id: 'user@example | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 409 | json: { success: true, data: { ...base, openai_oauth_connected: true, openai_oauth_account_id: 'user@example | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 454 | json: { success: true, data: { message: 'Connected', account_id: 'user@example.com' } }, | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 461 | json: { success: true, data: { connected: true, account_id: 'user@example.com' } }, | CODE |
| LOW | frontend/e2e/openai-oauth.spec.ts | 484 | 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_alembic_cli_target.py | 88 | conn.execute("INSERT INTO waitlist_signups VALUES (1, 'user@example.com', '2026-09-27')") | CODE |
| LOW⚡ | backend/tests/unit/test_api_settings_provider.py | 667 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 555 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 621 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 694 | assert settings.openai_oauth_account_id == 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 712 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 744 | assert settings.openai_oauth_account_id == 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 762 | settings.openai_oauth_account_id = 'user@example.com' | CODE |
| LOW | backend/tests/unit/test_api_settings_provider.py | 787 | assert settings.openai_oauth_account_id == 'user@example.com' | CODE |
| LOW | backend/services/prompts.py | 1425 | "extracted_text": "模板图上可见的真实文字:主标题 + 关键要点,≤80 字;若全是 Lorem ipsum 等占位文字则留空字符串", | CODE |
| LOW | backend/services/prompts.py | 1529 | "extracted_text": "real text visible on the template: main title + key bullets, <= 80 chars; empty string if it is all | 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 | 717 | # 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 | 1575 | CODE | |
| LOW | backend/services/task_manager.py | 727 | CODE | |
| LOW | backend/services/task_manager.py | 1365 | CODE | |
| LOW | backend/services/task_manager.py | 2073 | 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/tests/unit/test_alembic_cli_target.py | 5 | the launchd `alembic upgrade head && python app.py`) therefore migrated a scratch | STRING |
| 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 | 1714 | 6. **When unsure**: prefer `status=undecided` (template_asset_id=null) over guessing. confidence<0.5 should be undecided | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | backend/tests/unit/test_api_settings_provider.py | 208 | # so the test is robust to module import-path differences in CI. | COMMENT |
| MEDIUM | backend/services/ai_providers/image/openai_provider.py | 343 | # Build comprehensive extra_body that works with multiple providers | COMMENT |
| 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 |
|---|---|---|---|---|
| LOW | README.md | 281 | # IMAGE_API_BASE=https://token.sensenova.cn/v1 | COMMENT |
| LOW | .github/workflows/docker-publish.yml | 321 | # VERSION: ${{ inputs.version }} | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/setup-env-from-secrets.sh | 5 | # Usage: | COMMENT |