Talk to any LLM with hands-free voice interaction, voice interruption, and Live2D avatar running locally across platforms
This report summarizes scanner evidence for Open-LLM-VTuber/Open-LLM-VTuber, a Python project with 14,039 GitHub stars. SynthScan examined 53,024 lines of code across 208 source files, recording 439 pattern matches distributed across 20 syntactic categories. The legacy adjusted pattern signal is 11.0 (Moderate 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? 231 finding(s).
Are imports declared and package/API names verified? 52 finding(s).
Are wrappers, guards, and repeated structures necessary? 198 finding(s).
Which changes need focused human review? 439 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 439 distinct pattern matches across 20 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 | run_server.py | 99 | except Exception as e: | CODE |
| LOW | run_server.py | 133 | except Exception as e: | CODE |
| LOW | run_server.py | 153 | except Exception as e: | CODE |
| LOW | upgrade_codes/version_manager.py | 91 | except Exception as e: | CODE |
| LOW | upgrade_codes/config_sync.py | 117 | except Exception as e: | CODE |
| LOW | upgrade_codes/config_sync.py | 307 | except Exception as e: | CODE |
| MEDIUM | upgrade_codes/config_sync.py | 108 | def merge_and_update_user_config(self): | CODE |
| LOW | upgrade_codes/upgrade_core/comment_sync.py | 55 | except Exception as e: | CODE |
| MEDIUM | upgrade_codes/upgrade_core/comment_sync.py | 23 | def sync(self) -> None: | CODE |
| LOW | upgrade_codes/upgrade_core/upgrade_utils.py | 35 | except Exception as e: | CODE |
| LOW | upgrade_codes/upgrade_core/upgrade_utils.py | 142 | except Exception as e: | CODE |
| LOW | upgrade_codes/upgrade_core/language.py | 24 | except Exception: | CODE |
| LOW | upgrade_codes/upgrade_core/language.py | 38 | except Exception: | CODE |
| LOW | upgrade_codes/from_version/v_1_1_1.py | 111 | except Exception as e: | CODE |
| MEDIUM | upgrade_codes/from_version/v_1_1_1.py | 77 | def _upgrade_conf_yaml(self): | CODE |
| LOW | scripts/run_bilibili_live.py | 49 | except Exception as e: | CODE |
| LOW | prompts/prompt_loader.py | 51 | except Exception as e: | CODE |
| LOW | prompts/prompt_loader.py | 62 | except Exception as e: | CODE |
| LOW | prompts/prompt_loader.py | 72 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_message_queue.py | 128 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_message_queue.py | 150 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/service_context.py | 149 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/service_context.py | 319 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/service_context.py | 403 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/service_context.py | 548 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 128 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 225 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 235 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 611 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/live2d_model.py | 79 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/live2d_model.py | 123 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 64 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 84 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 87 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 116 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 143 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 241 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 244 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 288 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 85 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 126 | except Exception: | CODE |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 165 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 204 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 229 | except Exception: | CODE |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 245 | except Exception as e: | CODE |
| LOW⚡ | src/open_llm_vtuber/chat_history_manager.py | 288 | except Exception as e: | CODE |
| LOW⚡ | src/open_llm_vtuber/chat_history_manager.py | 298 | except Exception as e: | CODE |
| LOW⚡ | src/open_llm_vtuber/chat_history_manager.py | 306 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 349 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 372 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_group.py | 197 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_group.py | 230 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_group.py | 258 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/chat_group.py | 298 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/routes.py | 40 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/routes.py | 66 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/routes.py | 191 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/routes.py | 244 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/routes.py | 250 | except Exception as e: | CODE |
| LOW | src/open_llm_vtuber/mcpp/tool_adapter.py | 72 | except Exception as e: | CODE |
| 73 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | requirements.txt | 1 | # This file was autogenerated by uv via the following command: | COMMENT |
| LOW | requirements.txt | 21 | # httpx | COMMENT |
| LOW | requirements.txt | 41 | cartesia==2.0.17 | COMMENT |
| LOW | requirements.txt | 61 | # via | COMMENT |
| LOW | requirements.txt | 81 | distlib==0.4.0 | COMMENT |
| LOW | requirements.txt | 101 | # fastapi | COMMENT |
| LOW | requirements.txt | 121 | # aiohttp | COMMENT |
| LOW | requirements.txt | 141 | # fastapi | COMMENT |
| LOW | requirements.txt | 161 | # requests | COMMENT |
| LOW | requirements.txt | 181 | loguru==0.7.3 | COMMENT |
| LOW | requirements.txt | 201 | networkx==3.6.1 ; (python_full_version >= '3.11' and platform_machine == 'arm64') or (python_full_version >= '3.11' and | COMMENT |
| LOW | requirements.txt | 221 | # via torch | COMMENT |
| LOW | requirements.txt | 241 | # via | COMMENT |
| LOW | requirements.txt | 261 | # via | COMMENT |
| LOW | requirements.txt | 281 | pydantic-core==2.41.5 | COMMENT |
| LOW | requirements.txt | 301 | # via pyttsx3 | COMMENT |
| LOW | requirements.txt | 321 | # pyobjc-framework-avrouting | COMMENT |
| LOW | requirements.txt | 341 | # pyobjc-framework-coredata | COMMENT |
| LOW | requirements.txt | 361 | # pyobjc-framework-dvdplayback | COMMENT |
| LOW | requirements.txt | 381 | # pyobjc-framework-instantmessage | COMMENT |
| LOW | requirements.txt | 401 | # pyobjc-framework-mediaplayer | COMMENT |
| LOW | requirements.txt | 421 | # pyobjc-framework-pencilkit | COMMENT |
| LOW | requirements.txt | 441 | # pyobjc-framework-securityui | COMMENT |
| LOW | requirements.txt | 461 | # pyobjc-framework-videotoolbox | COMMENT |
| LOW | requirements.txt | 481 | pyobjc-framework-applicationservices==12.1 ; sys_platform == 'darwin' | COMMENT |
| LOW | requirements.txt | 521 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 541 | # pyobjc-framework-automaticassessmentconfiguration | COMMENT |
| LOW | requirements.txt | 561 | # pyobjc-framework-coreaudio | COMMENT |
| LOW | requirements.txt | 581 | # pyobjc-framework-discrecordingui | COMMENT |
| LOW | requirements.txt | 601 | # pyobjc-framework-installerplugins | COMMENT |
| LOW | requirements.txt | 621 | # pyobjc-framework-metalkit | COMMENT |
| LOW | requirements.txt | 641 | # pyobjc-framework-quicklookthumbnailing | COMMENT |
| LOW | requirements.txt | 661 | # pyobjc-framework-spritekit | COMMENT |
| LOW | requirements.txt | 681 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 701 | # pyobjc-framework-cloudkit | COMMENT |
| LOW | requirements.txt | 721 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 741 | # pyobjc-framework-applicationservices | COMMENT |
| LOW | requirements.txt | 761 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 781 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 801 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 821 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 841 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 861 | # pyobjc-framework-metalfx | COMMENT |
| LOW | requirements.txt | 901 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 921 | # pyobjc-framework-gamekit | COMMENT |
| LOW | requirements.txt | 941 | pyobjc-framework-safetykit==12.1 ; platform_release >= '22.0' and sys_platform == 'darwin' | COMMENT |
| LOW | requirements.txt | 961 | # pyobjc-framework-securityui | COMMENT |
| LOW | requirements.txt | 981 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 1001 | # via pyobjc | COMMENT |
| LOW | requirements.txt | 1021 | # via pyttsx3 | COMMENT |
| LOW | requirements.txt | 1041 | # pyttsx3 | COMMENT |
| LOW | requirements.txt | 1061 | # via | COMMENT |
| LOW | requirements.txt | 1081 | # via torch | COMMENT |
| LOW | requirements.txt | 1101 | # via | COMMENT |
| LOW | requirements.txt | 1121 | # open-llm-vtuber | COMMENT |
| LOW | requirements.txt | 1141 | # exceptiongroup | COMMENT |
| LOW | requirements.txt | 1161 | # mcp | COMMENT |
| LOW | requirements.txt | 1181 | websocket-client==1.9.0 | COMMENT |
| LOW | config_templates/conf.ZH.default.yaml | 1 | # =========================== | COMMENT |
| LOW | config_templates/conf.ZH.default.yaml | 221 | # ASR 模型下载:https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models | COMMENT |
| 21 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | run_server.py | 50 | CODE | |
| LOW | upgrade_codes/config_sync.py | 159 | CODE | |
| LOW | upgrade_codes/config_sync.py | 180 | CODE | |
| LOW | upgrade_codes/upgrade_core/comment_sync.py | 23 | CODE | |
| LOW | upgrade_codes/upgrade_core/comment_sync.py | 30 | CODE | |
| LOW | upgrade_codes/upgrade_core/upgrade_utils.py | 105 | CODE | |
| LOW | upgrade_codes/upgrade_core/comment_diff_fn.py | 6 | CODE | |
| LOW | upgrade_codes/upgrade_core/language.py | 9 | CODE | |
| LOW | src/open_llm_vtuber/proxy_message_queue.py | 91 | CODE | |
| LOW | src/open_llm_vtuber/websocket_handler.py | 489 | CODE | |
| LOW | src/open_llm_vtuber/proxy_handler.py | 71 | CODE | |
| LOW | src/open_llm_vtuber/proxy_handler.py | 92 | CODE | |
| LOW | src/open_llm_vtuber/proxy_handler.py | 206 | CODE | |
| LOW | src/open_llm_vtuber/chat_history_manager.py | 250 | CODE | |
| LOW | src/open_llm_vtuber/chat_group.py | 163 | CODE | |
| LOW | src/open_llm_vtuber/routes.py | 73 | CODE | |
| LOW | src/open_llm_vtuber/routes.py | 97 | CODE | |
| LOW | src/open_llm_vtuber/routes.py | 202 | CODE | |
| LOW | src/open_llm_vtuber/mcpp/server_registry.py | 48 | CODE | |
| LOW | src/open_llm_vtuber/mcpp/tool_adapter.py | 85 | CODE | |
| LOW | src/open_llm_vtuber/mcpp/tool_adapter.py | 137 | CODE | |
| LOW | src/open_llm_vtuber/mcpp/mcp_client.py | 101 | CODE | |
| LOW | src/open_llm_vtuber/mcpp/tool_executor.py | 78 | CODE | |
| LOW | src/open_llm_vtuber/mcpp/tool_executor.py | 155 | CODE | |
| LOW | src/open_llm_vtuber/mcpp/tool_executor.py | 303 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/tts.py | 775 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/asr.py | 263 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/asr.py | 356 | CODE | |
| LOW | src/open_llm_vtuber/utils/sentence_divider.py | 213 | CODE | |
| LOW | src/open_llm_vtuber/utils/sentence_divider.py | 405 | CODE | |
| LOW | src/open_llm_vtuber/utils/tts_preprocessor.py | 108 | CODE | |
| LOW | src/open_llm_vtuber/agent/agent_factory.py | 17 | CODE | |
| LOW | src/open_llm_vtuber/agent/transformers.py | 103 | CODE | |
| LOW | src/open_llm_vtuber/agent/transformers.py | 108 | CODE | |
| LOW | src/open_llm_vtuber/agent/transformers.py | 119 | CODE | |
| LOW | …c/open_llm_vtuber/agent/stateless_llm/llama_cpp_llm.py | 34 | CODE | |
| LOW | …lm_vtuber/agent/stateless_llm/openai_compatible_llm.py | 60 | CODE | |
| LOW | src/open_llm_vtuber/agent/stateless_llm/claude_llm.py | 43 | CODE | |
| LOW | src/open_llm_vtuber/agent/stateless_llm/claude_llm.py | 84 | CODE | |
| LOW | …ber/agent/stateless_llm/stateless_llm_with_template.py | 121 | CODE | |
| LOW | src/open_llm_vtuber/agent/agents/basic_memory_agent.py | 290 | CODE | |
| LOW | src/open_llm_vtuber/agent/agents/basic_memory_agent.py | 403 | CODE | |
| LOW | src/open_llm_vtuber/agent/agents/basic_memory_agent.py | 581 | CODE | |
| LOW | src/open_llm_vtuber/agent/agents/basic_memory_agent.py | 594 | CODE | |
| LOW | src/open_llm_vtuber/agent/agents/hume_ai.py | 157 | CODE | |
| LOW | …c/open_llm_vtuber/conversations/single_conversation.py | 25 | CODE | |
| LOW | …/open_llm_vtuber/conversations/conversation_handler.py | 146 | CODE | |
| LOW | src/open_llm_vtuber/conversations/group_conversation.py | 29 | CODE | |
| LOW | src/open_llm_vtuber/asr/sherpa_onnx_asr.py | 89 | CODE | |
| LOW | src/open_llm_vtuber/asr/asr_factory.py | 7 | CODE | |
| LOW | src/open_llm_vtuber/asr/azure_asr.py | 67 | CODE | |
| LOW | src/open_llm_vtuber/live/bilibili_live.py | 207 | CODE | |
| LOW | src/open_llm_vtuber/tts/tts_factory.py | 7 | CODE | |
| LOW | src/open_llm_vtuber/tts/minimax_tts.py | 26 | CODE | |
| LOW | src/open_llm_vtuber/tts/azure_tts.py | 65 | CODE | |
| LOW | src/open_llm_vtuber/vad/silero.py | 127 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | prompts/prompt_loader.py | 13 | Load the content of a file with robust encoding handling. Args: file_path: Path to the file to load | STRING |
| HIGH | src/open_llm_vtuber/live2d_model.py | 85 | Find the model information from the model dictionary and return the information about the matched model. | STRING |
| HIGH | src/open_llm_vtuber/mcpp/utils/path.py | 8 | Check if the file path is valid. Args: file_path (str | Path): The path to the file. suffix (str): | STRING |
| HIGH | src/open_llm_vtuber/config_manager/utils.py | 17 | Read the specified YAML configuration file with environment variable substitution and guess encoding. Return th | STRING |
| HIGH | src/open_llm_vtuber/config_manager/utils.py | 56 | Validate configuration data against the Config model. Args: config_data: Configuration data to validat | STRING |
| HIGH | src/open_llm_vtuber/config_manager/i18n.py | 62 | Creates a Description instance from plain strings, assuming English as the default language. Args: | STRING |
| HIGH | …_vtuber/agent/stateless_llm/stateless_llm_interface.py | 28 | Generates a chat completion asynchronously and return an iterator to the response. This function does n | STRING |
| HIGH | …lm_vtuber/agent/stateless_llm/openai_compatible_llm.py | 66 | Generates a chat completion using the OpenAI API asynchronously. Parameters: - messages (List[ | STRING |
| HIGH | …ber/agent/stateless_llm/stateless_llm_with_template.py | 124 | Generates a chat completion using the OpenAI API asynchronously. Parameters: - messages (List[ | STRING |
| HIGH | src/open_llm_vtuber/asr/azure_asr.py | 68 | Asynchronously transcribe audio data using Azure Speech Services with auto language detection. Args: | STRING |
| HIGH | src/open_llm_vtuber/asr/azure_asr.py | 128 | Synchronously transcribe audio data using Azure Speech Services. Args: audio (np.ndarray): | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | upgrade_codes/upgrade_core/language.py | 24 | except Exception: | CODE |
| HIGH | upgrade_codes/upgrade_core/language.py | 38 | except Exception: | CODE |
| HIGH | prompts/prompt_loader.py | 49 | except UnicodeDecodeError: | CODE |
| HIGH | src/open_llm_vtuber/live2d_model.py | 77 | except UnicodeDecodeError: | CODE |
| HIGH | src/open_llm_vtuber/proxy_handler.py | 172 | except asyncio.CancelledError: | CODE |
| HIGH | src/open_llm_vtuber/asr/fun_asr.py | 95 | except ValueError: | CODE |
| HIGH | src/open_llm_vtuber/live/bilibili_live.py | 341 | except asyncio.CancelledError: | CODE |
| HIGH | src/open_llm_vtuber/tts/melo_tts.py | 67 | except AttributeError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 9 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 10 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 11 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 12 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 12 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 13 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 13 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 13 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 18 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 18 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 18 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 18 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 18 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 18 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 18 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 18 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 28 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 41 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 41 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 45 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 45 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 45 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 46 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 46 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 46 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 47 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 47 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 47 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 47 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 47 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 47 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 47 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 47 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 59 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 59 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 59 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 59 | CODE | |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 59 | CODE | |
| LOW | src/open_llm_vtuber/tts/cartesia_tts.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | upgrade_codes/config_sync.py | 108 | def merge_and_update_user_config(self): | CODE |
| LOW | upgrade_codes/upgrade_core/constants.py | 27 | def get_current_script_version(): | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 204 | async def handle_websocket_communication( | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 318 | async def _cleanup_failed_connection(self, client_uid: str) -> None: | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 394 | async def _handle_history_list_request( | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 513 | async def _handle_conversation_trigger( | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 550 | async def _handle_fetch_backgrounds( | CODE |
| LOW | src/open_llm_vtuber/websocket_handler.py | 585 | async def _handle_init_config_request( | CODE |
| LOW | src/open_llm_vtuber/chat_group.py | 138 | def cleanup_disconnected_clients(self, connected_clients: Set[str]): | CODE |
| LOW | src/open_llm_vtuber/mcpp/tool_adapter.py | 85 | def construct_mcp_prompt_string( | CODE |
| LOW | src/open_llm_vtuber/mcpp/mcp_client.py | 43 | async def _ensure_server_running_and_get_session( | CODE |
| LOW | src/open_llm_vtuber/mcpp/tool_executor.py | 124 | def process_tool_from_prompt_json( | CODE |
| LOW | src/open_llm_vtuber/config_manager/utils.py | 77 | def load_text_file_with_guess_encoding(file_path: str) -> str | None: | CODE |
| LOW | src/open_llm_vtuber/config_manager/utils.py | 127 | def scan_config_alts_directory(config_alts_dir: str) -> list[dict]: | CODE |
| LOW | src/open_llm_vtuber/config_manager/character.py | 73 | def check_default_persona_prompt(cls, v): | CODE |
| LOW | src/open_llm_vtuber/config_manager/character.py | 81 | def set_default_character_name(cls, v, values): | CODE |
| LOW⚡ | src/open_llm_vtuber/utils/tts_preprocessor.py | 83 | def remove_special_characters(text: str) -> str: | CODE |
| LOW | src/open_llm_vtuber/utils/install_utils.py | 86 | def install_conda_dependencies(self): | CODE |
| LOW | src/open_llm_vtuber/agent/agents/basic_memory_agent.py | 290 | async def _claude_tool_interaction_loop( | CODE |
| LOW | src/open_llm_vtuber/agent/agents/basic_memory_agent.py | 403 | async def _openai_tool_interaction_loop( | CODE |
| LOW | …c/open_llm_vtuber/conversations/single_conversation.py | 25 | async def process_single_conversation( | CODE |
| LOW | …/open_llm_vtuber/conversations/conversation_handler.py | 19 | async def handle_conversation_trigger( | CODE |
| LOW | …/open_llm_vtuber/conversations/conversation_handler.py | 112 | async def handle_individual_interrupt( | CODE |
| LOW | src/open_llm_vtuber/conversations/group_conversation.py | 29 | async def process_group_conversation( | CODE |
| LOW | src/open_llm_vtuber/conversations/group_conversation.py | 156 | def init_group_conversation_state( | CODE |
| LOW | src/open_llm_vtuber/conversations/group_conversation.py | 168 | def init_group_conversation_contexts( | CODE |
| LOW | src/open_llm_vtuber/conversations/conversation_utils.py | 133 | async def send_conversation_start_signals(websocket_send: WebSocketSend) -> None: | CODE |
| LOW | src/open_llm_vtuber/conversations/conversation_utils.py | 162 | async def finalize_conversation_turn( | CODE |
| LOW | src/open_llm_vtuber/conversations/conversation_utils.py | 193 | async def send_conversation_end_signal( | CODE |
| LOW | src/open_llm_vtuber/asr/utils.py | 121 | def check_and_extract_local_file(url: str, output_dir: str) -> Path | None: | CODE |
| LOW | src/open_llm_vtuber/asr/azure_asr.py | 46 | def _create_speech_recognizer(self, uses_default_microphone: bool = True): | CODE |
| LOW | src/open_llm_vtuber/tts/azure_tts.py | 65 | def __speak_with_audio_config( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | upgrade_codes/config_sync.py | 49 | # Create a backup of the user config file | COMMENT |
| MEDIUM | src/open_llm_vtuber/server.py | 22 | # Create a custom StaticFiles class that adds CORS headers | COMMENT |
| MEDIUM | src/open_llm_vtuber/live2d_model.py | 7 | # This class is **Not responsible** for sending the payload to the server | COMMENT |
| MEDIUM | src/open_llm_vtuber/agent/agent_factory.py | 58 | # Create the stateless LLM | COMMENT |
| MEDIUM | src/open_llm_vtuber/agent/agent_factory.py | 70 | # Create the agent with the LLM and live2d_model | COMMENT |
| MEDIUM | src/open_llm_vtuber/agent/stateless_llm_factory.py | 81 | # Creating an LLM instance using a factory | COMMENT |
| MEDIUM | …lm_vtuber/agent/stateless_llm/openai_compatible_llm.py | 196 | # Create a ToolCallObject instance from a dictionary using the from_dict method. | COMMENT |
| MEDIUM | src/open_llm_vtuber/conversations/tts_manager.py | 181 | # Create a new queue to clear any pending items | COMMENT |
| MEDIUM | src/open_llm_vtuber/asr/utils.py | 63 | # Create the output directory if it doesn't exist | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | run_server.py | 127 | # Check if the frontend submodule is initialized | COMMENT |
| LOW⚡ | upgrade_codes/config_sync.py | 41 | # Check if the user config file exists | COMMENT |
| LOW | scripts/run_bilibili_live.py | 30 | # Check if room IDs are provided | COMMENT |
| LOW | src/open_llm_vtuber/proxy_handler.py | 216 | if not msg.data: # Check if data is empty | CODE |
| LOW | src/open_llm_vtuber/proxy_handler.py | 220 | if not data: # Check if parsed data is empty | CODE |
| LOW | src/open_llm_vtuber/chat_group.py | 36 | # Check if invitee exists in client map (connected) | COMMENT |
| LOW | src/open_llm_vtuber/chat_group.py | 40 | # Check if invitee is already in a group | COMMENT |
| LOW | src/open_llm_vtuber/chat_group.py | 71 | # Check if target is in a group | COMMENT |
| LOW | src/open_llm_vtuber/mcpp/tool_executor.py | 343 | # Check if the first content item is an error reported by MCPClient | COMMENT |
| LOW | src/open_llm_vtuber/agent/stateless_llm/claude_llm.py | 183 | # Check if this stop corresponds to the active tool call | COMMENT |
| LOW | src/open_llm_vtuber/conversations/group_conversation.py | 90 | # Check if we should skip storing this input to history | COMMENT |
| LOW | src/open_llm_vtuber/asr/utils.py | 74 | # Check if the extracted directory already exists | COMMENT |
| LOW | src/open_llm_vtuber/asr/utils.py | 137 | # Check if the compressed file exists and is a tar.bz2 archive | COMMENT |
| LOW | src/open_llm_vtuber/tts/gpt_sovits_tts.py | 53 | # Check if the request was successful | COMMENT |
| LOW | src/open_llm_vtuber/tts/coqui_tts.py | 50 | # Check if model is multi-speaker | COMMENT |
| LOW | src/open_llm_vtuber/tts/piper_tts.py | 65 | # Check if model file exists | COMMENT |
| LOW | src/open_llm_vtuber/tts/x_tts.py | 32 | # Check if the request was successful | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/open_llm_vtuber/tts/edge_tts.py | 0 | generate speech audio file using tts. text: str the text to speak file_name_no_ext: str name of the file without extensi | STRING |
| HIGH | src/open_llm_vtuber/tts/melo_tts.py | 0 | generate speech audio file using tts. text: str the text to speak file_name_no_ext: str name of the file without extensi | STRING |
| HIGH | src/open_llm_vtuber/tts/azure_tts.py | 0 | generate speech audio file using tts. text: str the text to speak file_name_no_ext: str name of the file without extensi | STRING |
| HIGH | src/open_llm_vtuber/tts/bark_tts.py | 0 | generate speech audio file using tts. text: str the text to speak file_name_no_ext: str name of the file without extensi | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/open_llm_vtuber/tts/tts_factory.py | 219 | # tts_engine = TTSFactory.get_tts_engine("azure", api_key="your_api_key", region="your_region", voice="your_voice") | COMMENT |
| HIGH | src/open_llm_vtuber/tts/elevenlabs_tts.py | 137 | # api_key="your_api_key", | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | config_templates/conf.ZH.default.yaml | 1 | # =========================== | COMMENT |
| MEDIUM | config_templates/conf.ZH.default.yaml | 5 | # =========================== | COMMENT |
| MEDIUM | src/open_llm_vtuber/config_manager/agent.py | 119 | # ================================= | COMMENT |
| MEDIUM | src/open_llm_vtuber/config_manager/agent.py | 148 | # ================================= | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/open_llm_vtuber/server.py | 53 | CODE | |
| LOW | src/open_llm_vtuber/mcpp/mcp_client.py | 155 | CODE | |
| LOW | src/open_llm_vtuber/agent/agents/basic_memory_agent.py | 38 | CODE | |
| LOW | src/open_llm_vtuber/asr/sherpa_onnx_asr.py | 11 | CODE | |
| LOW | src/open_llm_vtuber/asr/fun_asr.py | 40 | CODE | |
| LOW | src/open_llm_vtuber/tts/sherpa_onnx_tts.py | 14 | CODE | |
| LOW | src/open_llm_vtuber/tts/cosyvoice_tts.py | 7 | CODE | |
| LOW | src/open_llm_vtuber/tts/gpt_sovits_tts.py | 12 | CODE | |
| LOW | src/open_llm_vtuber/tts/cosyvoice2_tts.py | 7 | CODE | |
| LOW | src/open_llm_vtuber/tts/piper_tts.py | 28 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/open_llm_vtuber/tts/openai_tts.py | 91 | self.client.audio.speech.with_streaming_response.create( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | upgrade_codes/config_sync.py | 60 | # Step 1: Update config fields | COMMENT |
| LOW⚡ | upgrade_codes/config_sync.py | 66 | # Step 2: Sync comments | COMMENT |
| LOW⚡ | upgrade_codes/config_sync.py | 79 | # Step 3: Determine whether upgrade is needed | COMMENT |
| LOW⚡ | upgrade_codes/config_sync.py | 84 | # Step 4: Run upgrade if needed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | upgrade_codes/config_sync.py | 60 | # Step 1: Update config fields | COMMENT |
| LOW⚡ | upgrade_codes/config_sync.py | 66 | # Step 2: Sync comments | COMMENT |
| LOW⚡ | upgrade_codes/config_sync.py | 79 | # Step 3: Determine whether upgrade is needed | COMMENT |
| LOW⚡ | upgrade_codes/config_sync.py | 84 | # Step 4: Run upgrade if needed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | config_templates/conf.default.yaml | 209 | # Or you can use sherpa onnx asr or Faster-Whisper for complete offline experience | COMMENT |
| MEDIUM | .github/workflows/codeql.yml | 54 | # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how | COMMENT |
| LOW | …lm_vtuber/agent/stateless_llm/openai_compatible_llm.py | 192 | # If stream ends while still in a tool call, make sure to yield the tool call | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | upgrade_codes/config_sync.py | 52 | def update_user_config(self) -> None: | CODE |
| LOW | src/open_llm_vtuber/live2d_model.py | 35 | def set_model(self, model_name: str) -> None: | CODE |
| LOW | src/open_llm_vtuber/config_manager/__init__.py | 67 | __all__ = [ | CODE |
| LOW | src/open_llm_vtuber/agent/agents/basic_memory_agent.py | 176 | def set_memory_from_history(self, conf_uid: str, history_uid: str) -> None: | CODE |
| LOW | src/open_llm_vtuber/agent/agents/letta_agent.py | 53 | def set_memory_from_history(self, conf_uid: str, history_uid: str) -> None: | CODE |
| LOW | src/open_llm_vtuber/agent/agents/hume_ai.py | 122 | def set_memory_from_history(self, conf_uid: str, history_uid: str) -> None: | CODE |
| LOW | src/open_llm_vtuber/agent/agents/agent_interface.py | 46 | def set_memory_from_history(self, conf_uid: str, history_uid: str) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/open_llm_vtuber/mcpp/json_detector.py | 139 | # Usage example | COMMENT |
| LOW | src/open_llm_vtuber/utils/stream_audio.py | 85 | # Example usage: | COMMENT |
| LOW | src/open_llm_vtuber/tts/tts_factory.py | 218 | # Example usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/open_llm_vtuber/live2d_model.py | 56 | """Load the content of a file with robust encoding handling.""" | STRING |