Wan: Open and Advanced Large-Scale Video Generative Models
This report summarizes scanner evidence for Wan-Video/Wan2.2, a Python project with 17,868 GitHub stars. SynthScan examined 20,241 lines of code across 67 source files, recording 215 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 15.5 (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? 86 finding(s).
Are imports declared and package/API names verified? 86 finding(s).
Are wrappers, guards, and repeated structures necessary? 95 finding(s).
Which changes need focused human review? 215 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
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 215 distinct pattern matches across 10 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 |
|---|---|---|---|---|
| HIGH | wan/animate.py | 0 | initializes the wan text-to-video generation model components. args: config (easydict): object containing model paramete | STRING |
| HIGH | wan/speech2video.py | 0 | initializes the wan text-to-video generation model components. args: config (easydict): object containing model paramete | STRING |
| HIGH | wan/image2video.py | 0 | initializes the wan text-to-video generation model components. args: config (easydict): object containing model paramete | STRING |
| HIGH | wan/textimage2video.py | 0 | initializes the wan text-to-video generation model components. args: config (easydict): object containing model paramete | STRING |
| HIGH | wan/text2video.py | 0 | initializes the wan text-to-video generation model components. args: config (easydict): object containing model paramete | STRING |
| HIGH | wan/animate.py | 0 | configures a model object. this includes setting evaluation modes, applying distributed parallel strategy, and handling | STRING |
| HIGH | wan/speech2video.py | 0 | configures a model object. this includes setting evaluation modes, applying distributed parallel strategy, and handling | STRING |
| HIGH | wan/textimage2video.py | 0 | configures a model object. this includes setting evaluation modes, applying distributed parallel strategy, and handling | STRING |
| HIGH | wan/text2video.py | 0 | configures a model object. this includes setting evaluation modes, applying distributed parallel strategy, and handling | STRING |
| HIGH | wan/image2video.py | 0 | configures a model object. this includes setting evaluation modes, applying distributed parallel strategy, and handling | STRING |
| HIGH | wan/modules/model.py | 0 | args: x(tensor): shape [b, l, num_heads, c / num_heads] seq_lens(tensor): shape [b] grid_sizes(tensor): shape [b, 3], th | STRING |
| HIGH | wan/modules/animate/model_animate.py | 0 | args: x(tensor): shape [b, l, num_heads, c / num_heads] seq_lens(tensor): shape [b] grid_sizes(tensor): shape [b, 3], th | STRING |
| HIGH | wan/modules/s2v/model_s2v.py | 0 | args: x(tensor): shape [b, l, num_heads, c / num_heads] seq_lens(tensor): shape [b] grid_sizes(tensor): shape [b, 3], th | STRING |
| HIGH | wan/modules/model.py | 0 | args: x(tensor): shape [b, l1, c] e(tensor): shape [b, l1, c] | STRING |
| HIGH | wan/modules/animate/model_animate.py | 0 | args: x(tensor): shape [b, l1, c] e(tensor): shape [b, l1, c] | STRING |
| HIGH | wan/modules/s2v/model_s2v.py | 0 | args: x(tensor): shape [b, l1, c] e(tensor): shape [b, l1, c] | STRING |
| HIGH | wan/modules/model.py | 0 | reconstruct video tensors from patch embeddings. args: x (list[tensor]): list of patchified features, each with shape [l | STRING |
| HIGH | wan/modules/animate/model_animate.py | 0 | reconstruct video tensors from patch embeddings. args: x (list[tensor]): list of patchified features, each with shape [l | STRING |
| HIGH | wan/modules/s2v/model_s2v.py | 0 | reconstruct video tensors from patch embeddings. args: x (list[tensor]): list of patchified features, each with shape [l | STRING |
| HIGH | wan/modules/model.py | 0 | initialize model parameters using xavier initialization. | STRING |
| HIGH | wan/modules/animate/model_animate.py | 0 | initialize model parameters using xavier initialization. | STRING |
| HIGH | wan/modules/s2v/model_s2v.py | 0 | initialize model parameters using xavier initialization. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | wan/animate.py | 19 | CODE | |
| LOW | wan/speech2video.py | 9 | CODE | |
| LOW | wan/speech2video.py | 17 | CODE | |
| LOW | wan/speech2video.py | 25 | CODE | |
| LOW | wan/speech2video.py | 25 | CODE | |
| LOW | wan/__init__.py | 2 | CODE | |
| LOW | wan/__init__.py | 2 | CODE | |
| LOW | wan/__init__.py | 2 | CODE | |
| LOW | wan/__init__.py | 3 | CODE | |
| LOW | wan/__init__.py | 4 | CODE | |
| LOW | wan/__init__.py | 5 | CODE | |
| LOW | wan/__init__.py | 6 | CODE | |
| LOW | wan/__init__.py | 7 | CODE | |
| LOW | wan/distributed/ulysses.py | 2 | CODE | |
| LOW | wan/utils/prompt_extend.py | 11 | CODE | |
| LOW | wan/utils/prompt_extend.py | 24 | CODE | |
| LOW | wan/utils/__init__.py | 2 | CODE | |
| LOW | wan/utils/__init__.py | 2 | CODE | |
| LOW | wan/utils/__init__.py | 2 | CODE | |
| LOW | wan/utils/__init__.py | 7 | CODE | |
| LOW | wan/utils/qwen_vl_utils.py | 3 | CODE | |
| LOW | wan/utils/fm_solvers_unipc.py | 19 | CODE | |
| LOW | wan/configs/wan_i2v_A14B.py | 2 | CODE | |
| LOW | wan/configs/__init__.py | 2 | CODE | |
| LOW | wan/modules/__init__.py | 2 | CODE | |
| LOW | wan/modules/__init__.py | 3 | CODE | |
| LOW | wan/modules/__init__.py | 4 | CODE | |
| LOW | wan/modules/__init__.py | 4 | CODE | |
| LOW | wan/modules/__init__.py | 4 | CODE | |
| LOW | wan/modules/__init__.py | 4 | CODE | |
| LOW | wan/modules/__init__.py | 5 | CODE | |
| LOW | wan/modules/__init__.py | 6 | CODE | |
| LOW | wan/modules/__init__.py | 7 | CODE | |
| LOW | wan/modules/animate/__init__.py | 2 | CODE | |
| LOW | wan/modules/animate/__init__.py | 3 | CODE | |
| LOW | wan/modules/animate/model_animate.py | 3 | CODE | |
| LOW | wan/modules/animate/model_animate.py | 4 | CODE | |
| LOW | wan/modules/animate/model_animate.py | 7 | CODE | |
| LOW | wan/modules/animate/model_animate.py | 15 | CODE | |
| LOW | wan/modules/animate/model_animate.py | 23 | CODE | |
| LOW | wan/modules/animate/model_animate.py | 23 | CODE | |
| LOW | wan/modules/animate/face_blocks.py | 12 | CODE | |
| LOW | wan/modules/animate/preprocess/sam_utils.py | 4 | CODE | |
| LOW | wan/modules/animate/preprocess/sam_utils.py | 5 | CODE | |
| LOW | wan/modules/animate/preprocess/sam_utils.py | 12 | CODE | |
| LOW | wan/modules/animate/preprocess/video_predictor.py | 5 | CODE | |
| LOW | wan/modules/animate/preprocess/video_predictor.py | 7 | CODE | |
| LOW | wan/modules/animate/preprocess/video_predictor.py | 7 | CODE | |
| LOW | wan/modules/animate/preprocess/video_predictor.py | 9 | CODE | |
| LOW | wan/modules/animate/preprocess/video_predictor.py | 9 | CODE | |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 2 | CODE | |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 4 | CODE | |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 2 | CODE | |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 3 | CODE | |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 5 | CODE | |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 8 | CODE | |
| LOW | wan/modules/animate/preprocess/__init__.py | 2 | CODE | |
| LOW | wan/modules/animate/preprocess/__init__.py | 3 | CODE | |
| LOW | wan/modules/animate/preprocess/utils.py | 2 | CODE | |
| LOW | wan/modules/s2v/model_s2v.py | 3 | CODE | |
| 26 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | wan/animate.py | 38 | CODE | |
| LOW | wan/animate.py | 297 | CODE | |
| LOW | wan/speech2video.py | 49 | CODE | |
| LOW | wan/speech2video.py | 392 | CODE | |
| LOW | wan/textimage2video.py | 36 | CODE | |
| LOW | wan/textimage2video.py | 162 | CODE | |
| LOW | wan/textimage2video.py | 239 | CODE | |
| LOW | wan/textimage2video.py | 413 | CODE | |
| LOW | wan/text2video.py | 33 | CODE | |
| LOW | wan/text2video.py | 203 | CODE | |
| LOW | wan/image2video.py | 35 | CODE | |
| LOW | wan/image2video.py | 206 | CODE | |
| LOW | wan/utils/fm_solvers.py | 131 | CODE | |
| LOW | wan/utils/fm_solvers_unipc.py | 79 | CODE | |
| LOW | wan/modules/attention.py | 24 | CODE | |
| LOW | wan/modules/attention.py | 133 | CODE | |
| LOW | wan/modules/model.py | 305 | CODE | |
| LOW | wan/modules/vae2_2.py | 736 | CODE | |
| LOW | wan/modules/animate/motion_encoder.py | 60 | CODE | |
| LOW | wan/modules/animate/motion_encoder.py | 202 | CODE | |
| LOW | wan/modules/animate/model_animate.py | 250 | CODE | |
| LOW | wan/modules/animate/clip.py | 434 | CODE | |
| LOW | wan/modules/animate/clip.py | 211 | CODE | |
| LOW | wan/modules/animate/clip.py | 330 | CODE | |
| LOW | wan/modules/animate/xlm_roberta.py | 81 | CODE | |
| LOW | wan/modules/animate/face_blocks.py | 109 | CODE | |
| LOW | wan/modules/animate/preprocess/pose2d.py | 69 | CODE | |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 255 | CODE | |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 586 | CODE | |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 750 | CODE | |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 757 | CODE | |
| LOW | wan/modules/animate/preprocess/process_pipepline.py | 38 | CODE | |
| LOW | wan/modules/s2v/model_s2v.py | 255 | CODE | |
| LOW | wan/modules/s2v/auxi_blocks.py | 118 | CODE | |
| LOW | wan/modules/s2v/motioner.py | 401 | CODE | |
| LOW | wan/modules/s2v/motioner.py | 619 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | generate.py | 315 | CODE | |
| LOW | wan/animate.py | 297 | CODE | |
| LOW | wan/speech2video.py | 392 | CODE | |
| LOW | wan/utils/fm_solvers.py | 417 | CODE | |
| LOW | wan/utils/fm_solvers.py | 488 | CODE | |
| LOW | wan/utils/utils.py | 172 | CODE | |
| LOW | wan/utils/qwen_vl_utils.py | 85 | CODE | |
| LOW | wan/utils/qwen_vl_utils.py | 328 | CODE | |
| LOW | wan/modules/vae2_1.py | 68 | CODE | |
| LOW | wan/modules/vae2_1.py | 101 | CODE | |
| LOW | wan/modules/t5.py | 27 | CODE | |
| LOW | wan/modules/vae2_2.py | 73 | CODE | |
| LOW | wan/modules/vae2_2.py | 112 | CODE | |
| LOW | wan/modules/animate/face_blocks.py | 32 | CODE | |
| LOW | wan/modules/animate/preprocess/pose2d.py | 207 | CODE | |
| LOW | wan/modules/animate/preprocess/pose2d.py | 357 | CODE | |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 159 | CODE | |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 369 | CODE | |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 760 | CODE | |
| LOW | wan/modules/animate/preprocess/process_pipepline.py | 280 | CODE | |
| LOW | wan/modules/animate/preprocess/pose2d_utils.py | 9 | CODE | |
| LOW | wan/modules/animate/preprocess/pose2d_utils.py | 790 | CODE | |
| LOW | wan/modules/s2v/auxi_blocks.py | 35 | CODE | |
| LOW | wan/modules/s2v/s2v_utils.py | 6 | CODE | |
| LOW | wan/modules/s2v/motioner.py | 42 | CODE | |
| LOW | wan/modules/s2v/audio_utils.py | 55 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | wan/utils/utils.py | 146 | Convert a string to a boolean. Supported true values: 'yes', 'true', 't', 'y', '1' Supported false values: | STRING |
| HIGH | wan/utils/qwen_vl_utils.py | 138 | calculate the number of frames for video used for model inputs. Args: ele (dict): a dict contains the confi | STRING |
| HIGH | wan/modules/animate/preprocess/pose2d.py | 358 | Load images from various input types. Args: inputs (Union[str, np.ndarray, List[np | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | wan/utils/__init__.py | 9 | __all__ = [ | CODE |
| LOW | wan/utils/utils.py | 14 | __all__ = ['save_video', 'save_image', 'str2bool'] | CODE |
| LOW | wan/utils/qwen_vl_utils.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | wan/modules/attention.py | 18 | __all__ = [ | CODE |
| LOW | wan/modules/vae2_1.py | 10 | __all__ = [ | CODE |
| LOW | wan/modules/t5.py | 12 | __all__ = [ | CODE |
| LOW | wan/modules/__init__.py | 9 | __all__ = [ | CODE |
| LOW | wan/modules/model.py | 11 | __all__ = ['WanModel'] | CODE |
| LOW | wan/modules/vae2_2.py | 10 | __all__ = [ | CODE |
| LOW | wan/modules/tokenizers.py | 9 | __all__ = ['HuggingfaceTokenizer'] | CODE |
| LOW | wan/modules/animate/__init__.py | 4 | __all__ = ['WanAnimateModel', 'CLIPModel'] | CODE |
| LOW | wan/modules/animate/clip.py | 15 | __all__ = [ | CODE |
| LOW | wan/modules/animate/xlm_roberta.py | 7 | __all__ = ['XLMRoberta', 'xlm_roberta_large'] | CODE |
| LOW | wan/modules/s2v/__init__.py | 5 | __all__ = ['WanModel_S2V', 'AudioEncoder'] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | wan/animate.py | 284 | def prepare_source_for_replace(self, src_bg_path, src_mask_path): | STRING |
| LOW | wan/speech2video.py | 252 | def prepare_default_cond_input(self, | STRING |
| LOW | wan/text2video.py | 169 | def _prepare_model_for_timestep(self, t, boundary, offload_model): | STRING |
| LOW | wan/image2video.py | 172 | def _prepare_model_for_timestep(self, t, boundary, offload_model): | STRING |
| LOW | wan/utils/fm_solvers.py | 417 | def dpm_solver_first_order_update( | CODE |
| LOW | wan/utils/fm_solvers.py | 488 | def multistep_dpm_solver_second_order_update( | CODE |
| LOW | wan/utils/fm_solvers.py | 598 | def multistep_dpm_solver_third_order_update( | CODE |
| LOW | wan/utils/fm_solvers_unipc.py | 352 | def multistep_uni_p_bh_update( | STRING |
| LOW | wan/utils/fm_solvers_unipc.py | 488 | def multistep_uni_c_bh_update( | STRING |
| LOW | wan/modules/t5.py | 245 | def _relative_position_bucket(self, rel_pos): | CODE |
| LOW | wan/modules/animate/preprocess/retarget_pose.py | 369 | def fix_lack_keypoints_use_sym(skeleton): | CODE |
| LOW | wan/modules/animate/preprocess/pose2d_utils.py | 757 | def keypoints_from_regression(regression_preds, center, scale, img_size): | CODE |
| LOW | wan/modules/animate/preprocess/pose2d_utils.py | 974 | def multilabel_classification_accuracy(pred, gt, mask, thr=0.5): | CODE |
| LOW | wan/modules/s2v/model_s2v.py | 484 | def process_motion_frame_pack(self, | CODE |
| LOW | wan/modules/s2v/model_s2v.py | 496 | def process_motion_transformer_motioner(self, | CODE |
| LOW | wan/modules/s2v/audio_encoder.py | 136 | def get_audio_embed_bucket_fps(self, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | wan/utils/prompt_extend.py | 185 | except Exception as e: | CODE |
| LOW | wan/utils/prompt_extend.py | 248 | except Exception as e: | CODE |
| LOW | wan/utils/utils.py | 84 | except Exception as e: | CODE |
| LOW | wan/utils/utils.py | 119 | except Exception as e: | CODE |
| LOW | wan/utils/utils.py | 141 | except Exception as e: | CODE |
| LOW | wan/modules/animate/preprocess/pose2d_utils.py | 1095 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | wan/modules/animate/preprocess/human_visualization.py | 321 | # [4, 5], # left arm | COMMENT |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 341 | # [255, 85, 0], | COMMENT |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 481 | limbSeq = [ | COMMENT |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 501 | ] | COMMENT |
| LOW | wan/modules/animate/preprocess/human_visualization.py | 521 | # [255, 0, 85], | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | wan/modules/animate/preprocess/human_visualization.py | 1277 | CODE |