Repository Analysis

harry0703/MoneyPrinterTurbo

利用 AI 大模型和自动化工作流,根据主题或关键词一键生成高清短视频。Generate HD short videos from a topic or keyword with an automated AI workflow.

21.4 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of harry0703/MoneyPrinterTurbo, a Python project with 117,975 GitHub stars. SynthScan v2.0 examined 56,724 lines of code across 136 source files, recording 1261 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 21.4 places this repository in the Moderate AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

21.4
Adjusted Score
21.4
Raw Score
100%
Time Factor
2026-08-28
Last Push
118.0K
Stars
Python
Language
56.7K
Lines of Code
136
Files
1.3K
Pattern Hits
2026-08-29
Scan Date
0.02
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 3MEDIUM 53LOW 1205

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 1261 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers982 hits · 859 pts
SeverityFileLineSnippetContext
LOWcli.py645def _resolve_subtitle_enabled(args: argparse.Namespace, ui_config) -> bool:STRING
LOWcli.py880def _validate_batch_entry_fields(STRING
LOWcli.py915def _resolve_batch_entry_paths(STRING
LOWcli.py939def _validate_batch_task_params(STRING
LOWcli.py1157def _path_is_within_directory(file_path: str, directory: str) -> bool:STRING
LOWcli.py1167def _resolve_managed_resource_file(STRING
LOWcli.py1296def _remove_cli_material_copies(created_paths: Sequence[str]) -> None:CODE
LOWapp/asgi.py56def validation_exception_handler(request: Request, e: RequestValidationError):CODE
LOWapp/asgi.py89async def protect_generated_task_files(request: Request, call_next):CODE
LOWapp/config/config.py91def update_config_nonblocking(config_section, key, value):CODE
LOWapp/config/config.py127def delete_config_nonblocking(config_section, key):CODE
LOWapp/config/config.py153def _apply_pending_config_updates_locked():CODE
LOWapp/config/config.py168def snapshot_config_with_pending(config_section):CODE
LOWapp/config/config.py189def _flush_pending_config_locked(*, suppress_save_errors):CODE
LOWapp/config/config.py215def _run_deferred_config_flush():CODE
LOWapp/config/config.py234def _schedule_deferred_config_flush():CODE
LOWapp/config/config.py348def _decode_linux_route_gateway(hex_gateway: str) -> str:CODE
LOWapp/config/config.py361def get_container_default_gateway_ip(route_path: str = "/proc/net/route") -> str:CODE
LOWapp/config/config.py395def get_default_ollama_base_url() -> str:CODE
LOWapp/utils/utils.py250def time_convert_seconds_to_hmsm(seconds) -> str:CODE
LOWapp/utils/utils.py281def split_string_by_punctuations(s):STRING
LOWapp/utils/utils.py323def normalize_script_for_subtitle_matching(video_script: str) -> str:STRING
LOWapp/utils/file_security.py4def resolve_path_within_directory(CODE
LOWapp/utils/logging_utils.py63def configure_terminal_logger(sink, level: str, colorize: bool = True) -> int:CODE
LOWapp/models/llm_provider.py66 def endpoint_selector_label_key(self) -> str:CODE
LOWapp/models/llm_provider.py70 def endpoint_selector_help_key(self) -> str:CODE
LOWapp/models/llm_provider.py115 def international_service_endpoint(self) -> LLMProviderEndpoint | None:CODE
LOWapp/models/llm_provider.py120 def effective_default_base_url(self) -> str:CODE
LOWapp/models/llm_provider.py125 def preferred_service_endpoint(CODE
LOWapp/models/llm_provider.py436def normalize_provider_override(value: str | None, default_value: str | None) -> str:CODE
LOWapp/controllers/v1/llm.py59def generate_video_social_metadata(CODE
LOWapp/controllers/v1/video.py72def _sanitize_upload_filename(filename: str, request_id: str) -> str:CODE
LOWapp/controllers/v1/video.py85def _resolve_path_within_directory(base_dir: str, unsafe_path: str, request_id: str) -> str:CODE
LOWapp/controllers/v1/video.py424def upload_video_material_file(request: Request, file: UploadFile = File(...)):CODE
LOWapp/services/task.py122def _register_cross_post_future(task_id: str, future: Future) -> None:CODE
LOWapp/services/task.py128def _unregister_cross_post_future(task_id: str, future: Future | None = None) -> None:CODE
LOWapp/services/task.py137def _is_cross_post_active_in_process(task_id: str) -> bool:CODE
LOWapp/services/task.py144def _is_windows_process_alive(process_id: int) -> bool:CODE
LOWapp/services/task.py1142def _run_cross_post_with_slot(*args) -> None:CODE
LOWapp/services/task.py197def _is_cross_post_owner_alive(owner: str | None) -> bool:CODE
LOWapp/services/task.py360def resolve_custom_audio_file(CODE
LOWapp/services/task.py418def _resolve_reusable_voice_preview(CODE
LOWapp/services/task.py752def _record_loomloom_run_reference(CODE
LOWapp/services/task.py928def _record_cross_post_failure(CODE
LOWapp/services/task.py945def _ensure_cross_post_terminal_state(task_id: str) -> None:CODE
LOWapp/services/task.py971def recover_interrupted_cross_posts(page_size: int = 100) -> int | None:CODE
LOWapp/services/task.py1157def _finalize_cross_post_future(task_id: str, future: Future) -> None:CODE
LOWapp/services/material.py1052def _search_videos_with_cache(CODE
LOWapp/services/material.py112def _persist_material_sources(CODE
LOWapp/services/material.py265def _filter_materials_by_aspect(CODE
LOWapp/services/material.py656def _is_wavespeed_retryable_error(error: Exception) -> bool:CODE
LOWapp/services/material.py678def _wavespeed_duration_bounds() -> tuple[int, int]:CODE
LOWapp/services/material.py699def generate_videos_wavespeed(CODE
LOWapp/services/material.py853def _wait_for_wavespeed_prediction(CODE
LOWapp/services/material.py954def _save_generated_video_with_retry(CODE
LOWapp/services/material.py1290def _download_videos_wavespeed_on_demand(CODE
LOWapp/services/material.py1362def _download_videos_seedance_on_demand(CODE
LOWapp/services/material.py1475def _download_videos_by_script_order(CODE
LOWapp/services/elevenlabs_music.py161def validate_generation_access() -> None:CODE
LOWapp/services/cache_manager.py57def _iter_video_cache_entries() -> Iterator[_VideoCacheEntry]:CODE
922 more matches not shown…
Decorative Section Separators40 hits · 128 pts
SeverityFileLineSnippetContext
MEDIUMconfig.example.toml141# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml143# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml345# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml347# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml384# =============================================================================COMMENT
MEDIUMconfig.example.toml386# =============================================================================COMMENT
MEDIUMconfig.example.toml395# =============================================================================COMMENT
MEDIUMconfig.example.toml397# =============================================================================COMMENT
MEDIUMconfig.example.toml463# ── Model & Pricing Notice ───────────────────────────────────────────────────COMMENT
MEDIUMconfig.example.toml469# =============================================================================COMMENT
MEDIUMconfig.example.toml471# =============================================================================COMMENT
MEDIUMconfig.example.toml5# =============================================================================COMMENT
MEDIUMconfig.example.toml7# =============================================================================COMMENT
MEDIUMconfig.example.toml28# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml30# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml61# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml63# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml296# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml298# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml320# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml322# -----------------------------------------------------------------------------COMMENT
MEDIUMconfig.example.toml367# =============================================================================COMMENT
MEDIUMconfig.example.toml369# =============================================================================COMMENT
MEDIUMconfig.example.toml452# ── Voice selection ──────────────────────────────────────────────────────────COMMENT
MEDIUMapp/models/schema.py237# ---------------------------COMMENT
MEDIUMapp/models/schema.py239# ---------------------------COMMENT
MEDIUMapp/services/llm.py707# =============================================================================STRING
MEDIUMapp/services/llm.py712# =============================================================================STRING
MEDIUMwebui/Main.py2252# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py2254# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py3058# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py3060# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py207# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py209# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py563# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py565# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py1548# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py1550# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py2565# -----------------------------------------------------------------------------COMMENT
MEDIUMwebui/Main.py2567# -----------------------------------------------------------------------------COMMENT
Excessive Try-Catch Wrapping119 hits · 102 pts
SeverityFileLineSnippetContext
LOWcli.py1119 except Exception:STRING
LOWcli.py1365 except Exception:CODE
LOWcli.py1398 except Exception as exc:CODE
LOWcli.py1481 except Exception as exc:CODE
LOWapp/config/config.py204 except Exception as exc:CODE
LOWapp/utils/utils.py57 except Exception as e:CODE
LOWapp/utils/utils.py176 except Exception as exc:CODE
LOWapp/utils/utils.py221 except Exception as exc:CODE
LOWapp/utils/utils.py242 except Exception as e:CODE
MEDIUMapp/utils/utils.py29def to_json(obj):CODE
MEDIUMapp/utils/utils.py239def run():CODE
LOWapp/controllers/v1/video.py220 except Exception:CODE
LOWapp/controllers/manager/base_manager.py34 except Exception:CODE
LOWapp/controllers/manager/base_manager.py87 except Exception:CODE
LOWapp/services/webui_task.py88 except Exception as exc:CODE
LOWapp/services/webui_task.py157 except Exception as exc:CODE
LOWapp/services/task.py1135 except Exception as exc:CODE
LOWapp/services/task.py1146 except Exception as exc:CODE
LOWapp/services/task.py249 except Exception as exc:CODE
LOWapp/services/task.py769 except Exception as exc:CODE
LOWapp/services/task.py907 except Exception as exc:CODE
LOWapp/services/task.py949 except Exception as exc:CODE
LOWapp/services/task.py986 except Exception as exc:CODE
LOWapp/services/task.py1173 except Exception as exc:CODE
LOWapp/services/task.py1529 except Exception as exc:CODE
MEDIUMapp/services/material.py1073def load_cache_safely() -> List[MaterialInfo] | None:CODE
LOWapp/services/material.py1033 except Exception as e:CODE
LOWapp/services/material.py1037 except Exception as remove_error:CODE
LOWapp/services/material.py1045 except Exception as close_error:CODE
LOWapp/services/material.py133 except Exception as exc:CODE
LOWapp/services/material.py369 except Exception as e:CODE
LOWapp/services/material.py494 except Exception as e:CODE
LOWapp/services/material.py599 except Exception as e:CODE
LOWapp/services/material.py755 except Exception as e:CODE
LOWapp/services/material.py773 except Exception as e:CODE
LOWapp/services/material.py841 except Exception as e:CODE
LOWapp/services/material.py904 except Exception as e:CODE
LOWapp/services/material.py969 except Exception as e:CODE
LOWapp/services/material.py1076 except Exception as exc:CODE
LOWapp/services/material.py1137 except Exception as exc:CODE
LOWapp/services/material.py1264 except Exception as source_error:CODE
LOWapp/services/material.py1279 except Exception as e:CODE
LOWapp/services/material.py1337 except Exception as source_error:CODE
LOWapp/services/material.py1451 except Exception as source_error:CODE
LOWapp/services/material.py1552 except Exception as source_error:CODE
LOWapp/services/material.py1565 except Exception as e:CODE
LOWapp/services/version_checker.py179 except Exception:CODE
LOWapp/services/task_artifacts.py90 except Exception as exc:CODE
LOWapp/services/llm.py406 except Exception as e:CODE
LOWapp/services/llm.py571 except Exception as e:STRING
LOWapp/services/llm.py685 except Exception as e:STRING
LOWapp/services/llm.py692 except Exception as e:STRING
LOWapp/services/llm.py879 except Exception:STRING
LOWapp/services/llm.py957 except Exception as e:STRING
LOWapp/services/bgm.py215 except Exception as exc:CODE
LOWapp/services/subtitle.py40 except Exception as e:CODE
LOWapp/services/material_upload.py221 except Exception as exc:CODE
MEDIUMapp/services/voice.py752def _produce_chunks():CODE
LOWapp/services/voice.py196 except Exception as e:CODE
LOWapp/services/voice.py757 except Exception as e:CODE
59 more matches not shown…
Deep Nesting79 hits · 56 pts
SeverityFileLineSnippetContext
LOWcli.py681CODE
LOWcli.py1196CODE
LOWcli.py1309CODE
LOWcli.py1370CODE
LOWapp/config/config.py476CODE
LOWapp/utils/utils.py29CODE
LOWapp/utils/utils.py407CODE
LOWapp/utils/utils.py32CODE
LOWapp/controllers/manager/redis_manager.py50CODE
LOWapp/services/material.py296CODE
LOWapp/services/material.py378CODE
LOWapp/services/material.py992CODE
LOWapp/services/material.py1145CODE
LOWapp/services/material.py1475CODE
LOWapp/services/elevenlabs_music.py292CODE
LOWapp/services/upload_post.py44CODE
LOWapp/services/cache_manager.py57CODE
LOWapp/services/llm.py142CODE
LOWapp/services/llm.py599CODE
LOWapp/services/bgm.py169CODE
LOWapp/services/subtitle.py22CODE
LOWapp/services/subtitle.py147CODE
LOWapp/services/subtitle.py202CODE
LOWapp/services/material_upload.py91CODE
LOWapp/services/material_upload.py171CODE
LOWapp/services/voice.py455CODE
LOWapp/services/voice.py733CODE
LOWapp/services/voice.py833CODE
LOWapp/services/voice.py888CODE
LOWapp/services/voice.py1004CODE
LOWapp/services/voice.py1235CODE
LOWapp/services/voice.py1566CODE
LOWapp/services/sonilo.py271CODE
LOWapp/services/loomloom.py784CODE
LOWapp/services/material_cache.py383CODE
LOWapp/services/video.py453CODE
LOWapp/services/video.py538CODE
LOWapp/services/video.py991CODE
LOWtest/services/test_sonilo.py194CODE
LOWtest/services/test_sonilo.py229CODE
LOWtest/services/test_sonilo.py375CODE
LOWtest/services/test_sonilo.py480CODE
LOWtest/services/test_material_upload.py147CODE
LOWtest/services/test_material_upload.py168CODE
LOWtest/services/test_task.py752CODE
LOWtest/services/test_task.py834CODE
LOWtest/services/test_llm.py513CODE
LOWtest/services/test_bgm.py134CODE
LOWtest/services/test_bgm.py292CODE
LOWtest/services/test_controller_video.py67CODE
LOWtest/services/test_controller_video.py357CODE
LOWtest/services/test_controller_video.py543CODE
LOWtest/services/test_video.py572CODE
LOWtest/services/test_video.py806CODE
LOWtest/services/test_schema.py24CODE
LOWtest/services/test_config.py195CODE
LOWtest/services/test_volcengine_seedance.py70CODE
LOWtest/services/test_volcengine_seedance.py177CODE
LOWtest/services/test_volcengine_seedance.py253CODE
LOWtest/services/test_volcengine_seedance.py460CODE
19 more matches not shown…
Self-Referential Comments7 hits · 24 pts
SeverityFileLineSnippetContext
MEDIUMconfig.example.toml134# Create a key at https://platform.sonilo.com/dashboard. The WebUI can also saveCOMMENT
MEDIUMconfig.example.toml350# Create an account and API key at https://upload-post.com/COMMENT
MEDIUMconfig.example.toml100# Create an Ark API key at:COMMENT
MEDIUMconfig.example.toml120# Create an API key at https://playground.twelvelabs.io/COMMENT
MEDIUMapp/utils/utils.py31 # Define a helper function to handle different types of objectsCOMMENT
MEDIUMapp/services/video.py1364 # Create an image clip and set its duration to 3 secondsCOMMENT
MEDIUMtest/services/test_cli.py353 # Create a minimal valid video file for testingCOMMENT
Magic Placeholder Names3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHREADME-ja.md433upload_post_api_key = "your-api-key"CODE
HIGHREADME.md450upload_post_api_key = "your-api-key"CODE
HIGHREADME-en.md455upload_post_api_key = "your-api-key"CODE
Over-Commented Block15 hits · 9 pts
SeverityFileLineSnippetContext
LOWconfig.example.toml1# MoneyPrinterTurbo configuration example.COMMENT
LOWconfig.example.toml21# 配置后客户端必须通过 x-api-key 请求头传入同一个值。COMMENT
LOWconfig.example.toml61# -----------------------------------------------------------------------------COMMENT
LOWconfig.example.toml81pixabay_api_keys = []COMMENT
LOWconfig.example.toml121twelvelabs_api_keys = []COMMENT
LOWconfig.example.toml301mimo_tts_model_name = "mimo-v2.5-tts"COMMENT
LOWconfig.example.toml361# Maximum number of running and queued cross-post jobs per process. When theCOMMENT
LOWconfig.example.toml381# Leave empty to disable.COMMENT
LOWconfig.example.toml441# Voice names exposed by the configured Chatterbox server.COMMENT
LOWconfig.example.toml461voices = []COMMENT
LOWconfig.example.toml481# The WebUI writes the remaining preferences automatically. Uncomment valuesCOMMENT
LOWconfig.example.toml501# bgm_type = "random"COMMENT
LOWdocker-compose.gpu.yml1# GPU override fileCOMMENT
LOWapp/config/__init__.py21 # rotation="00:00",COMMENT
LOWtest/services/__init__.py1# Unit test package for servicesCOMMENT
Unused Imports6 hits · 6 pts
SeverityFileLineSnippetContext
LOWcli.py1CODE
LOWapp/services/task_artifacts.py3CODE
LOWapp/services/cache_manager.py3CODE
LOWapp/services/loomloom.py8CODE
LOWapp/services/material_cache.py3CODE
LOWdocs/skill/mpt_agent.py4CODE
Fake / Example Data5 hits · 6 pts
SeverityFileLineSnippetContext
LOWtest/services/test_voice.py1347 result = vs.get_elevenlabs_voices("fake-key")CODE
LOWtest/services/test_voice.py1383 mock_config.elevenlabs.get.return_value = "fake-key"CODE
LOW…loom/moneyprinterturbo-script-candidates.template.json36 "placeholder": "例如:普通人如何用 AI 提高工作效率"CODE
LOW…loom/moneyprinterturbo-script-candidates.template.json48 "placeholder": "输出语言:zh-CN\n目标时长(秒):60\n风格或附加要求:开头制造反差"CODE
LOW…oom/moneyprinterturbo-ai-video-materials.template.json44 "placeholder": "例如:现代办公室中的工作人员使用 AI 助手,自然光,缓慢推进镜头"CODE
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMwebui.sh3# If you could not download the model from the official site, you can use the mirror site.COMMENT
Overly Generic Function Names2 hits · 2 pts
SeverityFileLineSnippetContext
LOWapp/controllers/manager/base_manager.py54 def execute_task(self, func: Callable, *args: Any, **kwargs: Any):CODE
LOWapp/controllers/manager/base_manager.py60 def run_task(self, func: Callable, *args: Any, **kwargs: Any):CODE
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWapp/utils/utils.py320CODE
Redundant / Tautological Comments1 hit · 1 pts
SeverityFileLineSnippetContext
LOWconfig.example.toml269# Set model_name to a model installed by `ollama pull` or shown by `ollama list`.COMMENT