DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/.
This report presents the forensic synthetic code analysis of HKUDS/DeepTutor, a Python project with 31,800 GitHub stars. SynthScan v2.0 examined 366,073 lines of code across 1734 source files, recording 8035 pattern matches distributed across 20 syntactic categories. The overall adjusted score of 30.9 places this repository in the Strong 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).
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.
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.
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.
The scanner identified 8035 distinct pattern matches across 20 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.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | docker-compose.ghcr.yml | 1 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.ghcr.yml | 3 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.ghcr.yml | 22 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.ghcr.yml | 24 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.ghcr.yml | 37 | # ============================================ | COMMENT |
| MEDIUM | requirements.txt | 1 | # ============================================ | COMMENT |
| MEDIUM | requirements.txt | 3 | # ============================================ | COMMENT |
| MEDIUM⚡ | .pre-commit-config.yaml | 13 | # ============================================ | COMMENT |
| MEDIUM⚡ | .pre-commit-config.yaml | 15 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 39 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 41 | # ============================================ | COMMENT |
| MEDIUM⚡ | .pre-commit-config.yaml | 52 | # ============================================ | COMMENT |
| MEDIUM⚡ | .pre-commit-config.yaml | 54 | # ============================================ | COMMENT |
| MEDIUM⚡ | .pre-commit-config.yaml | 63 | # ============================================ | COMMENT |
| MEDIUM⚡ | .pre-commit-config.yaml | 65 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 92 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 94 | # ============================================ | COMMENT |
| MEDIUM | pyproject.toml | 265 | # ============================================ | COMMENT |
| MEDIUM | pyproject.toml | 267 | # ============================================ | COMMENT |
| MEDIUM⚡ | pyproject.toml | 389 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 391 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 397 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 399 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 406 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 408 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 412 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 414 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 292 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 294 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 430 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 432 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 458 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 460 | # ============================================ | STRING |
| MEDIUM⚡ | docker-compose.dev.yml | 1 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.dev.yml | 3 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.dev.yml | 10 | # ============================================ | COMMENT |
| MEDIUM⚡ | compose.yaml | 1 | # ============================================ | COMMENT |
| MEDIUM⚡ | compose.yaml | 3 | # ============================================ | COMMENT |
| MEDIUM⚡ | compose.yaml | 63 | # ============================================ | COMMENT |
| MEDIUM⚡ | compose.yaml | 68 | # ---------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | compose.yaml | 70 | # ---------------------------------------------------------- | COMMENT |
| MEDIUM | compose.yaml | 112 | # ---------------------------------------------------------- | COMMENT |
| MEDIUM | compose.yaml | 114 | # ---------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 1 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 3 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 19 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 22 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 26 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 51 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 53 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 101 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 103 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 177 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 179 | # ============================================ | COMMENT |
| MEDIUM | web/app/(workspace)/partners/new/page.tsx | 53 | // ── form state ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/partners/new/page.tsx | 166 | // ── review summary helpers ──────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/book/page.tsx | 107 | // ── Data loaders ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/book/page.tsx | 135 | // ── Live WS event handling ───────────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/book/page.tsx | 162 | // ── Selectors ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/book/page.tsx | 175 | // ── Handlers ─────────────────────────────────────────────────────── | COMMENT |
| 1062 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/context/app-shell-storage.ts | 31 | export function readStoredChatResponseTimeout(): number { | CODE |
| LOW | web/context/app-shell-storage.ts | 45 | export function writeStoredChatResponseTimeout(seconds: number): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 91 | export function readStoredActiveSessionId(): string | null { | CODE |
| LOW | web/context/app-shell-storage.ts | 100 | export function writeStoredActiveSessionId(sessionId: string | null): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 118 | export function readStoredSidebarCollapsed(): boolean { | CODE |
| LOW | web/context/app-shell-storage.ts | 127 | export function writeStoredSidebarCollapsed(collapsed: boolean): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 166 | export function writeStoredCodeBlockTheme(theme: string): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 183 | export function normalizeCodeBlockShowLineNumbers( | CODE |
| LOW | web/context/app-shell-storage.ts | 191 | export function readStoredCodeBlockShowLineNumbers(): boolean { | CODE |
| LOW | web/context/app-shell-storage.ts | 204 | export function writeStoredCodeBlockShowLineNumbers(show: boolean): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 221 | export function normalizeCodeBlockWrapLongLines( | CODE |
| LOW | web/context/app-shell-storage.ts | 229 | export function readStoredCodeBlockWrapLongLines(): boolean { | CODE |
| LOW | web/context/app-shell-storage.ts | 241 | export function writeStoredCodeBlockWrapLongLines(wrap: boolean): void { | CODE |
| LOW | web/context/UnifiedChatContext.tsx | 850 | function hydrateMessageAttachments( | CODE |
| LOW | web/context/UnifiedChatContext.tsx | 893 | function normalizeSelectedBranches(value: unknown): Record<string, number> { | CODE |
| LOW | web/context/QuizFollowupContext.tsx | 564 | export function useQuizFollowupController(): QuizFollowupController { | CODE |
| LOW | web/app/(workspace)/playground/page.tsx | 196 | function normalizeDeepQuestionConfig( | CODE |
| LOW | web/app/(utility)/settings/network/page.tsx | 103 | function ChatResponseTimeoutSection() { | CODE |
| LOW | web/app/(utility)/settings/agents/claude-code/page.tsx | 5 | export default function ClaudeCodeAgentSettingsPage() { | CODE |
| LOW | web/app/(utility)/settings/agents/opencode/page.tsx | 5 | export default function OpencodeAgentSettingsPage() { | CODE |
| LOW | web/app/(utility)/settings/document-parsing/page.tsx | 43 | export default function DocumentParsingSettingsPage() { | CODE |
| LOW | web/tests/settings-context-ui-sync.test.ts | 56 | function readSettingsContextSource() { | CODE |
| LOW | web/tests/settings-context-boolean-hydration.test.ts | 20 | function readSettingsContextSource() { | CODE |
| LOW | web/components/settings/ServiceConfigEditor.tsx | 897 | function ContextWindowDetectionBanner({ | CODE |
| LOW | web/components/settings/shared.tsx | 51 | export function formatContextWindowSource( | CODE |
| LOW | web/components/settings/shared.tsx | 62 | export function formatContextWindowUpdatedAt( | CODE |
| LOW | web/components/settings/SettingsContext.tsx | 129 | export function syncLoadedCodeBlockSettingsToAppShell( | CODE |
| LOW | web/components/settings/SettingsContext.tsx | 414 | function readStoredDiagnosticsResults(): Partial< | CODE |
| LOW | web/components/chat/home/CapabilityConfigCard.tsx | 56 | function CapabilityConfigCardInner({ | CODE |
| LOW | web/components/chat/home/SessionViewerPanel.tsx | 205 | function attachmentToPreviewSource(a: MessageAttachment): FilePreviewSource { | CODE |
| LOW | web/components/chat/home/TracePanels.tsx | 2157 | function getDeepResearchStatusLabel( | CODE |
| LOW | web/components/chat/home/TracePanels.tsx | 2217 | function getExploreContextStatusLabel( | CODE |
| LOW | web/components/chat/home/TracePanels.tsx | 2625 | function formatResearchStageSummary(events: StreamEvent[], fallback: string) { | CODE |
| LOW | web/components/common/RichCodeBlock.tsx | 18 | function getCodeBlockThemeForeground( | CODE |
| LOW | web/components/common/code-block-themes.ts | 196 | export function getCodeBlockThemeBackground( | CODE |
| LOW | web/components/partners/PartnerChannels.tsx | 31 | function stripLegacyGlobalDelivery(channels: Record<string, unknown>) { | CODE |
| LOW | web/components/partners/PartnerChat.tsx | 94 | function normalizeHistoryAttachments( | CODE |
| LOW | web/components/partners/PartnerChat.tsx | 115 | function sentAttachmentsForMessage( | CODE |
| LOW | web/hooks/useVoiceAutoplay.ts | 74 | export function useVoiceAutoplayPreference() { | CODE |
| LOW | web/lib/research-types.ts | 27 | export function createEmptyResearchConfig(): DeepResearchFormConfig { | CODE |
| LOW | web/lib/quiz-types.ts | 95 | export function extractStreamingQuizQuestions( | CODE |
| LOW | web/lib/latex.ts | 53 | function normalizeEditorMdHeadings(content: string): string { | CODE |
| LOW | web/lib/latex.ts | 68 | function normalizeEditorMdInlineMath(content: string): string { | CODE |
| LOW | web/lib/latex.ts | 185 | function injectEditorMdTableOfContents(content: string): string { | CODE |
| LOW | web/lib/latex.ts | 195 | export function convertFlowFenceToMermaid(source: string): string | null { | CODE |
| LOW | web/lib/latex.ts | 265 | export function convertSequenceFenceToMermaid(source: string): string | null { | CODE |
| LOW | web/lib/math-animator-types.ts | 41 | export function extractMathAnimatorResult( | CODE |
| LOW | web/lib/playground-config.ts | 21 | export function loadCapabilityPlaygroundConfigs(): CapabilityPlaygroundConfigMap { | CODE |
| LOW | web/lib/playground-config.ts | 25 | export function resolveCapabilityPlaygroundConfig( | CODE |
| LOW | web/lib/playground-config.ts | 41 | export function saveCapabilityPlaygroundConfig( | CODE |
| LOW | web/lib/llm-options.ts | 63 | export function invalidateLLMOptionsCache(): void { | CODE |
| LOW | web/lib/knowledge-api.ts | 224 | export function invalidateKnowledgeCaches() { | CODE |
| LOW | web/lib/knowledge-api.ts | 495 | export function knowledgeBaseFilePreviewTextPath( | CODE |
| LOW | web/lib/quiz-question-type.ts | 45 | export function normalizeQuizQuestionType( | CODE |
| LOW | web/lib/quiz-question-type.ts | 63 | export function isFillInBlankQuizQuestion(value: unknown): boolean { | CODE |
| LOW | web/lib/tools-settings.ts | 9 | async function fetchEnabledOptionalTools(): Promise<string[]> { | CODE |
| LOW | web/lib/tools-settings.ts | 33 | export function invalidateEnabledOptionalToolsCache(): void { | CODE |
| LOW | web/lib/learning-api.ts | 170 | export async function generateModulesFromNotebook( | CODE |
| LOW | web/lib/think-segments.ts | 79 | export function parseModelThinkingSegments(input: string): ContentSegment[] { | CODE |
| LOW | web/lib/ask-user-state.ts | 71 | export function hasPendingAskUserInMessages( | CODE |
| 3401 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 5 | CODE | |
| LOW | tests/tools/test_web_search.py | 3 | CODE | |
| LOW | tests/tools/test_github_query.py | 7 | CODE | |
| LOW | tests/tools/test_github_query.py | 10 | CODE | |
| LOW | tests/tools/test_github_query.py | 14 | CODE | |
| LOW | tests/tools/test_ask_user.py | 8 | CODE | |
| LOW | tests/tools/test_kb_files_tool.py | 9 | CODE | |
| LOW | tests/tools/test_mineru.py | 1 | CODE | |
| LOW | tests/tools/test_rag_tool.py | 3 | CODE | |
| LOW | tests/tools/test_mineru_models.py | 1 | CODE | |
| LOW | tests/tools/test_write_note.py | 3 | CODE | |
| LOW | tests/tools/test_question_extractor.py | 1 | CODE | |
| LOW | tests/tools/test_list_notebook.py | 3 | CODE | |
| LOW | tests/tools/test_file_tools.py | 1 | CODE | |
| LOW | tests/tools/test_web_fetch.py | 3 | CODE | |
| LOW | tests/tools/test_web_fetch.py | 7 | CODE | |
| LOW | tests/tools/test_web_fetch.py | 7 | CODE | |
| LOW | tests/core/test_record_streamed_usage.py | 8 | CODE | |
| LOW | tests/core/test_labeled_step_image_fallback.py | 9 | CODE | |
| LOW | tests/core/test_prompt_parity.py | 1 | CODE | |
| LOW | tests/core/test_labeled_step_think_prelude.py | 19 | CODE | |
| LOW | tests/core/test_stream_bus.py | 3 | CODE | |
| LOW | tests/core/test_math_animator_capability.py | 1 | CODE | |
| LOW | tests/core/test_agentic_client_provider_kwargs.py | 1 | CODE | |
| LOW | tests/core/test_turn_event_store.py | 1 | CODE | |
| LOW | tests/core/test_agentic_loop_intermediate.py | 11 | CODE | |
| LOW | tests/core/test_context.py | 3 | CODE | |
| LOW | tests/core/test_agentic_messages.py | 1 | CODE | |
| LOW | tests/core/test_capabilities_runtime.py | 3 | CODE | |
| LOW | tests/core/test_capabilities_runtime.py | 284 | CODE | |
| LOW | tests/core/test_builtin_tools.py | 3 | CODE | |
| LOW | tests/core/test_labeled_step_tool_fallback.py | 1 | CODE | |
| LOW | tests/core/test_labeled_step_finish_usage.py | 1 | CODE | |
| LOW | tests/core/agentic/test_tool_dispatch_events.py | 17 | CODE | |
| LOW | tests/core/agentic/test_tool_provider_trace.py | 10 | CODE | |
| LOW | tests/capabilities/test_status_i18n_consistency.py | 16 | CODE | |
| LOW | tests/capabilities/test_obsidian_capability.py | 3 | CODE | |
| LOW | tests/capabilities/test_solve_capability.py | 3 | CODE | |
| LOW | tests/capabilities/test_subagent_capability.py | 10 | CODE | |
| LOW | tests/capabilities/test_explore_context_capability.py | 3 | CODE | |
| LOW | tests/capabilities/test_rag_consistency.py | 19 | CODE | |
| LOW | tests/capabilities/test_rag_consistency.py | 29 | CODE | |
| LOW | tests/multi_user/test_resource_isolation.py | 1 | CODE | |
| LOW | tests/multi_user/test_settings_status_redaction.py | 3 | CODE | |
| LOW | tests/multi_user/conftest.py | 9 | CODE | |
| LOW | tests/multi_user/test_login_username_contract.py | 10 | CODE | |
| LOW | tests/multi_user/test_skill_resolution_scoped.py | 3 | CODE | |
| LOW | tests/multi_user/test_rag_tool_no_kb_fallback.py | 9 | CODE | |
| LOW | tests/multi_user/test_kb_manifest_access.py | 9 | CODE | |
| LOW | tests/multi_user/test_profile_avatar.py | 3 | CODE | |
| LOW | tests/multi_user/test_registration_invite_only.py | 3 | CODE | |
| LOW | tests/multi_user/test_tool_access.py | 3 | CODE | |
| LOW | tests/multi_user/test_owner_path_service.py | 9 | CODE | |
| LOW | tests/multi_user/test_identity_and_paths.py | 1 | CODE | |
| LOW | tests/multi_user/test_partner_access.py | 3 | CODE | |
| LOW | tests/multi_user/test_ui_language_scoping.py | 3 | CODE | |
| LOW | tests/multi_user/test_profile_router.py | 9 | CODE | |
| LOW | tests/runtime/test_import_layering.py | 15 | CODE | |
| LOW | tests/runtime/test_orchestrator.py | 3 | CODE | |
| LOW | tests/runtime/test_request_contracts_subagent.py | 9 | CODE | |
| 1321 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 43 | except Exception: # pragma: no cover | CODE |
| LOW⚡ | tests/multi_user/test_registration_invite_only.py | 35 | except Exception: | CODE |
| MEDIUM | tests/multi_user/test_registration_invite_only.py | 31 | def _save(name): | CODE |
| LOW | tests/api/test_skills_hub_router.py | 18 | except Exception: # pragma: no cover - optional dependency in lightweight envs | CODE |
| LOW | tests/api/test_knowledge_router.py | 13 | except Exception: # pragma: no cover - optional dependency in lightweight envs | CODE |
| LOW | tests/api/test_subagents_router.py | 19 | except Exception: # pragma: no cover - optional dependency in lightweight envs | CODE |
| LOW | tests/api/test_plugins_api_partner.py | 15 | except Exception: # pragma: no cover | CODE |
| LOW | tests/api/test_partners_router.py | 15 | except Exception: # pragma: no cover | CODE |
| LOW | tests/services/llm/test_llm_live.py | 94 | except Exception as exc: | CODE |
| LOW | tests/services/llm/test_llm_live.py | 129 | except Exception as exc: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 137 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 190 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 223 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 252 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 286 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 296 | except Exception as e: | CODE |
| LOW | scripts/docker_compose.py | 32 | except Exception: | CODE |
| LOW | scripts/_cli_kit.py | 10 | except Exception: | CODE |
| MEDIUM | scripts/_cli_kit.py | 6 | def _ensure_replace_errors() -> None: | CODE |
| LOW | scripts/pb_setup.py | 62 | except Exception: | CODE |
| LOW | scripts/pb_setup.py | 73 | except Exception as exc: | CODE |
| MEDIUM | scripts/pb_setup.py | 45 | def _get_client(): | CODE |
| LOW | deeptutor_cli/provider_cmd.py | 100 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/config_cmd.py | 65 | except Exception: | CODE |
| LOW⚡ | deeptutor_cli/init_cmd.py | 34 | except Exception: | CODE |
| LOW⚡ | deeptutor_cli/init_cmd.py | 40 | except Exception: | CODE |
| LOW⚡ | deeptutor_cli/init_cmd.py | 46 | except Exception: | CODE |
| LOW | deeptutor_cli/skill_login.py | 123 | except Exception: | CODE |
| LOW | deeptutor_cli/chat.py | 88 | except Exception: | CODE |
| LOW | deeptutor_cli/common.py | 298 | except Exception: | CODE |
| MEDIUM | deeptutor_cli/common.py | 295 | def _stdin_interactive() -> bool: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 582 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 685 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 809 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 831 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 123 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 134 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 180 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 219 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 242 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 275 | except Exception as exc: | CODE |
| LOW | deeptutor/tools/paper_search_tool.py | 103 | except Exception: | CODE |
| LOW | deeptutor/tools/paper_search_tool.py | 108 | except Exception: | CODE |
| LOW | deeptutor/tools/web_fetch.py | 133 | except Exception as exc: # pragma: no cover — defensive | CODE |
| LOW | deeptutor/tools/tex_chunker.py | 34 | except Exception: | CODE |
| LOW | deeptutor/tools/tex_chunker.py | 43 | except Exception: | CODE |
| LOW | deeptutor/tools/tex_chunker.py | 62 | except Exception as e: | CODE |
| LOW | deeptutor/tools/file_tools.py | 105 | except Exception as exc: | CODE |
| LOW | deeptutor/tools/file_tools.py | 130 | except Exception as exc: | CODE |
| LOW | deeptutor/tools/file_tools.py | 185 | except Exception as exc: | CODE |
| LOW | deeptutor/tools/file_tools.py | 261 | except Exception as exc: | CODE |
| LOW | deeptutor/tools/list_notebook.py | 130 | except Exception as exc: # pragma: no cover — defensive | CODE |
| LOW | deeptutor/tools/write_note.py | 231 | except Exception as exc: | CODE |
| LOW | deeptutor/tools/write_note.py | 339 | except Exception as exc: | CODE |
| LOW | deeptutor/tools/tex_downloader.py | 131 | except Exception as e: | CODE |
| LOW | deeptutor/tools/tex_downloader.py | 146 | except Exception: | CODE |
| LOW | deeptutor/tools/tex_downloader.py | 154 | except Exception: | CODE |
| LOW | deeptutor/tools/tex_downloader.py | 209 | except Exception: | CODE |
| LOW | deeptutor/tools/tex_downloader.py | 221 | except Exception as e: | CODE |
| LOW | deeptutor/tools/media_gen_tool.py | 233 | except Exception: # progress is best-effort; never fail the render | CODE |
| 894 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_capabilities_runtime.py | 197 | def set_trace_callback(self, callback) -> None: | CODE |
| LOW | tests/utils/test_document_extractor.py | 384 | def set_limits(max_file: int, max_total: int) -> None: | CODE |
| LOW | tests/api/test_knowledge_router.py | 53 | def update_kb_status(self, name: str, status: str, progress: dict | None = None) -> None: | CODE |
| LOW | tests/api/test_knowledge_router.py | 894 | def set_kb_config(self, kb_name: str, config: dict) -> None: | CODE |
| LOW | tests/api/test_knowledge_router.py | 923 | def set_kb_config(self, kb_name: str, config: dict) -> None: | CODE |
| LOW | tests/api/test_knowledge_router.py | 956 | def set_kb_config(self, kb_name: str, config: dict) -> None: | CODE |
| LOW | scripts/_cli_kit.py | 31 | __all__ = ["banner", "log_error", "log_success"] | CODE |
| LOW | deeptutor_cli/skill_prompts.py | 208 | __all__ = ["collect_classification", "select_domains", "select_many", "select_one"] | CODE |
| LOW | deeptutor_cli/_tool_result.py | 159 | __all__ = [ | CODE |
| LOW | deeptutor_cli/skill_login.py | 134 | __all__ = ["LoginResult", "hub_origin_from_base", "oauth_start_url", "run_login"] | CODE |
| LOW | deeptutor_cli/common.py | 608 | def _settle_round(self, call_id: str, *, role: str) -> None: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 898 | __all__ = [ | CODE |
| LOW | deeptutor/tools/paper_search_tool.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/partner_memory.py | 301 | __all__ = [ | CODE |
| LOW | deeptutor/tools/web_fetch.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/web_fetch.py | 258 | __all__ = [ | CODE |
| LOW | deeptutor/tools/brainstorm.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/ask_user.py | 260 | __all__ = [ | CODE |
| LOW | deeptutor/tools/file_tools.py | 290 | __all__ = ["EditFileTool", "ListDirTool", "ReadFileTool", "WriteFileTool"] | CODE |
| LOW | deeptutor/tools/exec_tool.py | 156 | __all__ = ["ExecTool"] | CODE |
| LOW | deeptutor/tools/reason.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/list_notebook.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/list_notebook.py | 206 | __all__ = [ | CODE |
| LOW | deeptutor/tools/solve_tool.py | 16 | __all__ = [ | CODE |
| LOW | deeptutor/tools/write_note.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/write_note.py | 456 | __all__ = [ | CODE |
| LOW | deeptutor/tools/tex_downloader.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/media_gen_tool.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/media_gen_tool.py | 261 | __all__ = ["ImagegenTool", "VideogenTool"] | CODE |
| LOW | deeptutor/tools/github_query.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/github_query.py | 224 | __all__ = [ | CODE |
| LOW | deeptutor/tools/web_search.py | 47 | __all__ = [ | CODE |
| LOW | deeptutor/tools/cron_tool.py | 142 | __all__ = ["CronActionOutcome", "run_cron_action"] | CODE |
| LOW | deeptutor/tools/mastery_tool.py | 19 | __all__ = [ | CODE |
| LOW | deeptutor/tools/prompting/__init__.py | 230 | __all__ = ["ToolPromptComposer", "compose_prompt_text", "load_prompt_hints"] | CODE |
| LOW | deeptutor/tools/vision/image_utils.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/vision/__init__.py | 43 | __all__ = [ | CODE |
| LOW | deeptutor/tools/question/__init__.py | 30 | __all__ = [ | CODE |
| LOW | deeptutor/tools/builtin/__init__.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/builtin/__init__.py | 1673 | __all__ = [ | CODE |
| LOW | deeptutor/co_writer/storage.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/co_writer/storage.py | 245 | __all__ = [ | CODE |
| LOW | deeptutor/core/trace.py | 85 | __all__ = [ | CODE |
| LOW | deeptutor/core/__init__.py | 17 | __all__ = [ | CODE |
| LOW | deeptutor/core/i18n.py | 133 | __all__ = ["current_language", "t"] | CODE |
| LOW | deeptutor/core/agentic/tool_dispatch.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/core/agentic/__init__.py | 45 | __all__ = [ | STRING |
| LOW | deeptutor/core/agentic/messages.py | 30 | __all__ = ["assistant_message_with_tool_calls"] | CODE |
| LOW | deeptutor/core/agentic/loop.py | 438 | __all__ = [ | CODE |
| LOW | deeptutor/core/agentic/usage.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/capabilities/registry.py | 47 | __all__ = [ | CODE |
| LOW | deeptutor/capabilities/protocol.py | 116 | __all__ = ["KnowledgeCapability", "LoopCapability", "PromptBlock"] | CODE |
| LOW | deeptutor/capabilities/__init__.py | 21 | __all__ = [ | CODE |
| LOW | deeptutor/capabilities/solve/tools.py | 285 | __all__ = [ | CODE |
| LOW | deeptutor/capabilities/solve/session.py | 48 | def set_plan(self, analysis: str, steps: list[tuple[str, str]]) -> None: | CODE |
| LOW | deeptutor/capabilities/solve/session.py | 95 | __all__ = [ | CODE |
| LOW | deeptutor/capabilities/solve/__init__.py | 6 | __all__ = ["SOLVE_TOOL_NAMES", "SOLVE_TOOL_TYPES", "SolveLoopCapability"] | CODE |
| LOW | deeptutor/capabilities/solve/capability.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/capabilities/solve/capability.py | 91 | __all__ = ["DeepSolveCapability", "resolve_solve_session_id"] | CODE |
| LOW | deeptutor/capabilities/solve/loop.py | 91 | __all__ = ["SolveLoopCapability"] | CODE |
| 554 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 15 | # RAG extras (graphrag, rag-lightrag) already carry a `python_version < '3.14'` | COMMENT |
| MEDIUM | pyproject.toml | 86 | # RAG (LlamaIndex) | COMMENT |
| MEDIUM | pyproject.toml | 203 | # RAG-Anything (HKUDS/RAG-Anything). Optional, heavy (pulls MinerU transitively — | COMMENT |
| MEDIUM | README.md | 64 | > **[2026.7.19]** [v1.5.2](https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.2) — Configurable chat attachment limits | CODE |
| MEDIUM | README.md | 100 | > **[2026.5.22]** [v1.4.0](https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.0) — GA cut of v1.4: Auto Mode, three-la | CODE |
| MEDIUM | README.md | 102 | > **[2026.5.21]** [v1.4.0-beta](https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.0-beta) — Three-layer Memory workbe | CODE |
| MEDIUM⚡ | docker-compose.yml | 4 | # This file provides orchestration for DeepTutor services | COMMENT |
| MEDIUM | tests/core/test_labeled_step_think_prelude.py | 403 | # No reasoning trace events emitted for a clean FINISH. | COMMENT |
| MEDIUM | tests/agents/chat/test_agent_loop.py | 409 | # The pre-pass streamed THINKING (reasoning trace), never CONTENT — the | COMMENT |
| MEDIUM⚡ | tests/services/skill/test_skill_hub.py | 361 | # ── orchestration ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/services/rag/test_pageindex_pipeline.py | 178 | # Constructing a real LlamaIndexPipeline resolves the active embedding model | COMMENT |
| MEDIUM | tests/services/rag/__init__.py | 1 | # Tests for RAG pipeline | COMMENT |
| MEDIUM | tests/services/rag/test_lightrag_pipeline.py | 250 | self.parser = "mineru" # RAG-Anything's default | CODE |
| MEDIUM | requirements/cli.txt | 39 | # --- RAG (LlamaIndex) --- | COMMENT |
| MEDIUM | assets/releases/ver1-5-5.md | 21 | ### Traceable RAG citations | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-3.md | 99 | ### RAG and Knowledge Base Resilience | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-4-0.md | 49 | ### 🧩 RAG Module Decoupling | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-4-0.md | 104 | ├── rag/ # 🆕 Decoupled RAG system | CODE |
| MEDIUM | assets/releases/past_releases/ver0-4-0.md | 109 | │ └── components/ # Modular RAG components | CODE |
| MEDIUM | assets/releases/past_releases/ver0-5-1.md | 9 | ### 📄 Docling Support for RAG-Anything | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-4-0-beta.md | 86 | ### Chat Capability & LlamaIndex RAG Refactor | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-6.md | 38 | ### RAG and Knowledge Reliability | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-5-0.md | 46 | ### RAG Pipeline Selection | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-5-0.md | 101 | ### RAG System | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-2.md | 42 | ### RAG Re-index and Retrieval Resilience | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-5-0.md | 116 | - #532 — RAG chat could not return information from the selected knowledge base | CODE |
| MEDIUM | assets/releases/past_releases/ver1-5-0.md | 118 | - #552 — RAG chat on a 250 MB knowledge base returned nothing | CODE |
| MEDIUM | assets/releases/past_releases/ver1-3-5.md | 26 | ### More Reliable RAG Tool Calls | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-1.md | 11 | ### Safer RAG and Knowledge Base Routing | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-6-0.md | 21 | ### Flexible RAG Pipeline Import | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-4.md | 57 | ### RAG, Documents, and Knowledge Base Recovery | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-1-2.md | 16 | ### RAG Simplified to a Single Pipeline | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-5-2.md | 7 | ### Docling Support for RAG-Anything | COMMENT |
| MEDIUM | deeptutor_cli/README.md | 11 | # 仅 CLI(本地源码安装,含 RAG / 文档解析 / 各家 LLM provider SDK) | COMMENT |
| MEDIUM | deeptutor/tools/web_fetch.py | 45 | # pages. For JS-heavy SPAs the tool will return the bare HTML scaffold — | COMMENT |
| MEDIUM | deeptutor/tools/list_notebook.py | 29 | # context window. The cap is recorded in the rendered output so the | COMMENT |
| MEDIUM | deeptutor/core/agentic/labeled_step.py | 462 | # Reasoning models that surface chain-of-thought via the dedicated | COMMENT |
| MEDIUM | deeptutor/core/agentic/labeled_step.py | 468 | # see only the answer with no reasoning trace. Route the reasoning | COMMENT |
| MEDIUM | deeptutor/core/agentic/usage.py | 85 | # Local import keeps ``core.agentic`` import-light at module load. | COMMENT |
| MEDIUM | deeptutor/capabilities/explore_context/explorer.py | 149 | # ---- agentic loop ---------------------------------------------------- | COMMENT |
| MEDIUM | deeptutor/capabilities/explore_context/capability.py | 128 | # ``core.agentic``, and this capability is constructed at | COMMENT |
| MEDIUM | deeptutor/learning/prompts.py | 54 | # scaffolding. The directive — the same one book, quiz and Deep Research | COMMENT |
| MEDIUM | deeptutor/agents/research/pipeline.py | 135 | # Per-block research: the headline agentic loop. ``APPEND`` is the | COMMENT |
| MEDIUM | deeptutor/agents/research/pipeline.py | 243 | knowledge: str # accumulated FINISH text from the block's agentic loop | CODE |
| MEDIUM | deeptutor/agents/research/utils/citation_manager.py | 306 | # Common fields in RAG responses: chunks, documents, sources, context | COMMENT |
| MEDIUM | deeptutor/agents/research/utils/citation_manager.py | 690 | # For RAG/web_search/etc: each citation gets unique ref_number | COMMENT |
| MEDIUM⚡ | deeptutor/agents/research/prompts/zh/pipeline.yaml | 132 | # Phase 3 — Per-block research (agentic loop) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/research/prompts/en/pipeline.yaml | 85 | # Phase 1 — Rephrase (mini agentic loop with ask_user) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/research/prompts/en/pipeline.yaml | 141 | # Phase 3 — Per-block research (agentic loop) | COMMENT |
| MEDIUM | deeptutor/agents/chat/chat_agent.py | 180 | # RAG retrieval | COMMENT |
| MEDIUM | deeptutor/agents/visualize/capability.py | 115 | # using its own multi-agent pipeline + Manim subprocess. | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/zh/pipeline.yaml | 18 | # 阶段 1:探索(agentic loop —— 沿用 chat 风格工具集) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/zh/pipeline.yaml | 172 | # 阶段 3:出题(每道题一个 agentic loop) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/en/pipeline.yaml | 4 | # * explore.step — agentic loop with ``THINK`` / ``TOOL`` / | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/en/pipeline.yaml | 13 | # * quiz_step — agentic loop with ``THINK`` / ``TOOL`` / | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/en/pipeline.yaml | 35 | # Phase 1: Explore (agentic loop — chat-style tools) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/en/pipeline.yaml | 191 | # Phase 3: Quiz step (one agentic loop per question) | COMMENT |
| MEDIUM | deeptutor/utils/json_parser.py | 121 | # Strategy 1b: strip chain-of-thought <think> reasoning that models like | COMMENT |
| MEDIUM | deeptutor/knowledge/manifest.py | 49 | # call, capped so a pathological KB cannot flood the context window. | COMMENT |
| MEDIUM | deeptutor/knowledge/manager.py | 1358 | # or a stale handle from a failed RAG init can block removal. | COMMENT |
| 22 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_prompt_parity.py | 33 | CODE | |
| LOW | tests/core/test_prompt_parity.py | 62 | CODE | |
| LOW | tests/api/test_plugins_api_partner.py | 24 | CODE | |
| LOW | tests/services/memory/test_modes.py | 260 | CODE | |
| LOW | tests/services/memory/test_modes.py | 279 | CODE | |
| LOW | tests/services/rag/test_pipeline_integration.py | 327 | CODE | |
| LOW | deeptutor_cli/provider_cmd.py | 36 | CODE | |
| LOW | deeptutor_cli/init_cmd.py | 288 | CODE | |
| LOW | deeptutor_cli/memory.py | 20 | CODE | |
| LOW | deeptutor_cli/memory.py | 64 | CODE | |
| LOW | deeptutor_cli/chat.py | 80 | CODE | |
| LOW | deeptutor_cli/chat.py | 182 | CODE | |
| LOW | deeptutor_cli/init_wizard.py | 548 | CODE | |
| LOW | deeptutor_cli/init_wizard.py | 655 | CODE | |
| LOW | deeptutor/tools/tex_chunker.py | 90 | CODE | |
| LOW | deeptutor/tools/tex_chunker.py | 203 | CODE | |
| LOW | deeptutor/tools/prompting/__init__.py | 169 | CODE | |
| LOW | deeptutor/tools/vision/image_utils.py | 113 | CODE | |
| LOW | deeptutor/tools/vision/block_parser.py | 121 | CODE | |
| LOW | deeptutor/core/agentic/loop.py | 173 | CODE | |
| LOW | deeptutor/core/agentic/labeled_step.py | 104 | CODE | |
| LOW | deeptutor/core/agentic/usage.py | 101 | CODE | |
| LOW | deeptutor/learning/service.py | 96 | CODE | |
| LOW | deeptutor/learning/policy.py | 158 | CODE | |
| LOW | deeptutor/runtime/launcher.py | 234 | CODE | |
| LOW | deeptutor/runtime/launcher.py | 363 | CODE | |
| LOW | deeptutor/runtime/launcher.py | 767 | CODE | |
| LOW | deeptutor/agents/research/pipeline.py | 2034 | CODE | |
| LOW | deeptutor/agents/research/pipeline.py | 975 | CODE | |
| LOW | deeptutor/agents/research/pipeline.py | 1384 | CODE | |
| LOW | deeptutor/agents/research/pipeline.py | 1795 | CODE | |
| LOW | deeptutor/agents/research/mode_strategy.py | 76 | CODE | |
| LOW | deeptutor/agents/research/data_structures.py | 95 | CODE | |
| LOW | deeptutor/agents/research/utils/citation_manager.py | 113 | CODE | |
| LOW | deeptutor/agents/research/utils/citation_manager.py | 135 | CODE | |
| LOW | deeptutor/agents/research/utils/citation_manager.py | 234 | CODE | |
| LOW | deeptutor/agents/research/utils/citation_manager.py | 288 | CODE | |
| LOW | deeptutor/agents/research/utils/citation_manager.py | 344 | CODE | |
| LOW | deeptutor/agents/research/utils/citation_manager.py | 717 | CODE | |
| LOW | deeptutor/agents/chat/agentic_pipeline.py | 118 | CODE | |
| LOW | deeptutor/agents/chat/agentic_pipeline.py | 916 | CODE | |
| LOW | deeptutor/agents/chat/agentic_pipeline.py | 1300 | CODE | |
| LOW | deeptutor/agents/chat/agent_loop.py | 234 | CODE | |
| LOW | deeptutor/agents/chat/context_budget.py | 270 | CODE | |
| LOW | deeptutor/agents/visualize/capability.py | 63 | CODE | |
| LOW | …ptutor/agents/visualize/agents/code_generator_agent.py | 31 | CODE | |
| LOW | deeptutor/agents/question/capability.py | 330 | CODE | |
| LOW | deeptutor/agents/question/capability.py | 331 | CODE | |
| LOW | deeptutor/agents/question/pipeline.py | 1086 | CODE | |
| LOW | deeptutor/agents/question/pipeline.py | 1313 | CODE | |
| LOW | deeptutor/agents/question/pipeline.py | 1357 | CODE | |
| LOW | deeptutor/agents/question/pipeline.py | 1533 | CODE | |
| LOW | deeptutor/agents/math_animator/retry_manager.py | 43 | CODE | |
| LOW | deeptutor/utils/config_manager.py | 69 | CODE | |
| LOW | deeptutor/utils/error_utils.py | 10 | CODE | |
| LOW | deeptutor/utils/error_utils.py | 46 | CODE | |
| LOW | deeptutor/utils/document_extractor.py | 168 | CODE | |
| LOW | deeptutor/utils/document_extractor.py | 233 | CODE | |
| LOW | deeptutor/utils/document_extractor.py | 308 | CODE | |
| LOW | deeptutor/utils/document_extractor.py | 401 | CODE | |
| 163 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | deeptutor/partners/channels/feishu.py | 991 | response = self._client.cardkit.v1.card_element.content(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 448 | response = self._client.im.v1.message_reaction.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 730 | response = self._client.im.v1.image.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 764 | response = self._client.im.v1.file.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 792 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 827 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 906 | response = self._client.im.v1.message.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 946 | response = self._client.cardkit.v1.card.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1028 | response = self._client.cardkit.v1.card.settings(request) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | deeptutor/tools/vision/image_utils.py | 62 | Download image from URL. Args: url: Image URL Returns: (image bytes, MIME type) Raises: | STRING |
| HIGH | deeptutor/tools/vision/image_utils.py | 156 | Convert image URL to base64 data URL. Args: url: Image URL Returns: data:image/...;base64,... | STRING |
| HIGH | deeptutor/tools/vision/image_utils.py | 175 | Resolve image input to base64 format. Prioritizes image_base64, falls back to downloading from image_url. Args | STRING |
| HIGH | deeptutor/utils/document_validator.py | 61 | Validate file upload safety Args: filename: Name of the file file_size: Size o | STRING |
| HIGH | deeptutor/utils/document_validator.py | 143 | Validate that a file exists, is readable, and has valid content. Args: path: Path to the f | STRING |
| HIGH | deeptutor/utils/archive_extractor.py | 74 | Extract ``zip_path`` into ``target_dir``, flattening to safe basenames. Args: zip_path: Path to the ``.zip` | STRING |
| HIGH | deeptutor/knowledge/manager.py | 1450 | Link a local folder to a knowledge base. Args: kb_name: Knowledge base name fo | STRING |
| HIGH | deeptutor/book/blocks/_prompts.py | 30 | Load a YAML prompt bundle for the ``book`` module. Args: name: File stem under ``deeptutor/book/prompts/{la | STRING |
| HIGH | deeptutor/services/llm/local_provider.py | 34 | Extract message content from a local provider payload. Args: payload: Provider response payload. Return | STRING |
| HIGH | deeptutor/services/llm/registry.py | 36 | Get a registered provider class by name. Args: name: Provider name Returns: Provider clas | STRING |
| HIGH | deeptutor/services/llm/providers/anthropic.py | 109 | Initialize the Anthropic provider. Args: config: Provider configuration object. R | STRING |
| HIGH | deeptutor/services/llm/providers/anthropic.py | 138 | Generate a completion using Anthropic. Args: prompt: User prompt content. **kw | STRING |
| HIGH | deeptutor/services/llm/providers/anthropic.py | 190 | Stream a completion from Anthropic. Args: prompt: User prompt content. **kwarg | STRING |
| HIGH | deeptutor/services/embedding/adapters/base.py | 161 | Generate embeddings for a list of texts. Args: request: EmbeddingRequest with texts and pa | STRING |
| HIGH | deeptutor/services/setup/init.py | 266 | Get both backend and frontend ports from configuration. Args: project_root: Project root directory (if | STRING |
| HIGH | deeptutor/services/search/providers/__init__.py | 43 | Get a provider instance by name. Args: name: Provider name (case-insensitive). **kwargs: Argum | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/core/test_config_manager.py | 84 | "embedding": {"active_profile_id": null, "active_model_id": null, "profiles": []}, | STRING |
| HIGH | tests/core/test_config_manager.py | 85 | "search": {"active_profile_id": null, "profiles": []} | STRING |
| HIGH⚡ | tests/api/test_partners_channel_schema.py | 108 | # Pydantic's ``Optional[str]`` becomes ``anyOf: [{type: string}, {type: null}]``. | COMMENT |
| HIGH | tests/services/test_model_catalog.py | 74 | "search": {"active_profile_id": null, "profiles": []} | STRING |
| HIGH⚡ | tests/services/embedding/test_extract_embeddings.py | 164 | """When a provider returns {"embedding": null}, use [] instead of None. | STRING |
| HIGH⚡ | tests/services/cli_apps/test_models.py | 98 | "cd sketch/agent-harness && npm install && npm link", | CODE |
| HIGH⚡ | tests/services/sandbox/test_argv_exec.py | 172 | result = runner_server.execute({"command": "echo a && echo b", "limits": {"timeout_s": 10}}) | CODE |
| HIGH | scripts/update.py | 341 | hints.append("Frontend dependencies changed: consider running cd web && npm install") | CODE |
| HIGH | deeptutor/runtime/launcher.py | 601 | "npm not found. Source installs require Node.js/npm and `cd web && npm install`." | CODE |
| HIGH⚡ | deeptutor/api/routers/quiz_judge.py | 218 | ] | null, | STRING |
| HIGH⚡ | deeptutor/api/routers/quiz_judge.py | 219 | "user_answer_image": str | null, # legacy single-image form | STRING |
| HIGH⚡ | deeptutor/api/routers/quiz_judge.py | 220 | "image_filename": str | null, # legacy filename for the above | STRING |
| HIGH | deeptutor/api/routers/quiz_judge.py | 207 | "options": dict | null, | STRING |
| HIGH | deeptutor/services/partners/manager.py | 141 | #: YAML null: a bare ``mcp_tools:`` key parses as null, and a hand-edit that | COMMENT |
| HIGH | deeptutor/services/partners/manager.py | 154 | ``mcp_tools`` key), a bare key (YAML null), and a malformed value all read | STRING |
| HIGH | deeptutor/services/session/turn_runtime.py | 1549 | # with explicit null). Otherwise let the store auto-append. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.ghcr.yml | 1 | # ============================================ | COMMENT |
| LOW | docker-compose.ghcr.yml | 21 | # | COMMENT |
| LOW | requirements.txt | 1 | # ============================================ | COMMENT |
| LOW | .pre-commit-config.yaml | 1 | # Pre-commit hooks configuration for AI-Tutor project | COMMENT |
| LOW | pyproject.toml | 141 | "zulip>=0.8.0,<1.0.0", | COMMENT |
| LOW | pyproject.toml | 181 | COMMENT | |
| LOW | pyproject.toml | 461 | [tool.bandit] | COMMENT |
| LOW | docker-compose.dev.yml | 41 | COMMENT | |
| LOW | SKILL.md | 41 | # chat, deep_solve, deep_question, deep_research, visualize, math_animator, mastery_path | COMMENT |
| LOW | compose.yaml | 1 | # ============================================ | COMMENT |
| LOW | compose.yaml | 21 | # picks this file up without -f. | COMMENT |
| LOW | compose.yaml | 41 | # the `sandbox_allow_subprocess` setting in system.json. See | COMMENT |
| LOW | compose.yaml | 181 | networks: | COMMENT |
| LOW | compose.yaml | 201 | COMMENT | |
| LOW | docker-compose.yml | 1 | # ============================================ | COMMENT |
| LOW | docker-compose.yml | 61 | ports: | COMMENT |
| LOW | docker-compose.yml | 101 | # ============================================ | COMMENT |
| LOW | docker-compose.yml | 121 | # /app/data/user/workspace (admin) or /app/data/users/<uid> (per-user) | COMMENT |
| LOW | web/next.config.js | 121 | // Transpile mermaid and related packages for proper ESM handling | COMMENT |
| LOW | web/next-env.d.ts | 1 | /// <reference types="next" /> | COMMENT |
| LOW | web/app/(workspace)/home/[[...sessionId]]/page.tsx | 461 | // Capability-config confirmation gate. | COMMENT |
| LOW | web/app/(workspace)/home/[[...sessionId]]/page.tsx | 2001 | <div | COMMENT |
| LOW | web/tests/rich-code-block.test.ts | 181 | // react-syntax-highlighter's highlight.js (lines 99-103) forces each | COMMENT |
| LOW | web/components/settings/search-providers.ts | 1 | // Which connection fields a web-search provider actually uses. | COMMENT |
| LOW | web/components/settings/SettingsTourOverlay.tsx | 1 | "use client"; | COMMENT |
| LOW | web/components/settings/profile-naming.ts | 1 | // Auto-naming for connection profiles. | COMMENT |
| LOW | web/components/memory/MemoryWorkbench.tsx | 41 | // m_xxx footnote to scroll the user back to the citing bullet. Convert | COMMENT |
| LOW | web/components/chat/home/ChatMessages.tsx | 1201 | COMMENT | |
| LOW | web/components/chat/home/ChatComposer.tsx | 541 | // "+" menu. Knowledge is excluded: it no longer lives in this menu — | COMMENT |
| LOW | web/components/chat/home/TracePanels.tsx | 2101 | // the quizzing phase is active. | COMMENT |
| LOW | web/components/chat/preview/FilePreviewDrawer.tsx | 61 | // the slide-out transition. | COMMENT |
| LOW | web/hooks/useChatAutoScroll.ts | 101 | // ``next/dynamic`` chunks all change the height of the message | COMMENT |
| LOW | web/hooks/useChatAutoScroll.ts | 221 | shouldAutoScrollRef.current = distanceFromBottom < 80; | COMMENT |
| LOW | requirements/partners.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/cli.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/dev.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/matrix.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/math-animator.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/server.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/matrix-e2e.txt | 1 | # ============================================ | COMMENT |
| LOW | .github/workflows/pypi-release.yml | 1 | name: PyPI Release | COMMENT |
| LOW | deeptutor/tools/__init__.py | 41 | # Question generation tools (lazy import to avoid circular dependencies) | COMMENT |
| LOW | deeptutor/tools/builtin/__init__.py | 1581 | CronTool, | COMMENT |
| LOW | deeptutor/core/agentic/tool_dispatch.py | 101 | stage=stage, | COMMENT |
| LOW | deeptutor/core/agentic/tool_dispatch.py | 461 | "terminate_turn": getattr(result, "terminate_turn", False), | COMMENT |
| LOW | deeptutor/core/agentic/labeled_step.py | 61 | COMMENT | |
| LOW | deeptutor/core/agentic/labeled_step.py | 461 | COMMENT | |
| LOW | deeptutor/multi_user/grants.py | 21 | "knowledge_bases": [], | COMMENT |
| LOW | deeptutor/runtime/providers/scope.py | 21 | #: it, and an administrator to the deployment id. Deliberately not "the | COMMENT |
| LOW | deeptutor/agents/chat/agent_loop.py | 481 | # What this request actually carried, pinned now: the loop keeps | COMMENT |
| LOW | deeptutor/agents/question/prompts/en/pipeline.yaml | 1 | # QuestionPipeline prompts (English) | COMMENT |
| LOW | deeptutor/knowledge/kb_types.py | 61 | # No path on disk — ``agent_kind`` names the backend, optional ``cwd`` is the | COMMENT |
| LOW | deeptutor/api/main.py | 241 | # Access logging is funneled through this one middleware. uvicorn's own | COMMENT |
| LOW | deeptutor/api/routers/tools.py | 61 | class BuiltinToolPayload(BaseModel): | COMMENT |
| LOW | deeptutor/services/config/runtime_settings.py | 21 | "cors_origin": "", | COMMENT |
| LOW | deeptutor/services/config/runtime_settings.py | 61 | "version": 1, | COMMENT |
| LOW | deeptutor/services/config/runtime_settings.py | 201 | # LlamaIndex local RAG engine. These are the retrieval + chunking knobs the | COMMENT |
| LOW | deeptutor/services/cli_apps/provider.py | 41 | COMMENT | |
| LOW | deeptutor/services/partners/manager.py | 181 | language: str = "" | COMMENT |
| LOW | deeptutor/services/subagent/config.py | 41 | # from the CLI (models/efforts change over time). CC: --model / --effort; | COMMENT |
| 2 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | web/package-lock.json | 9341 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | web/components/common/GeogebraOpenCTA.tsx | 37 | // robust even if the assistant doesn't bother emitting an explicit | COMMENT |
| MEDIUM | tests/capabilities/test_explore_context_capability.py | 279 | """A loop that errors before producing anything degrades to the robust | STRING |
| MEDIUM | tests/utils/test_json_parser.py | 1 | """Tests for robust JSON parsing utilities.""" | STRING |
| MEDIUM | tests/services/cli_apps/test_installer.py | 40 | target: str = "git+https://example.invalid/x.git@abc#subdirectory=demo/agent-harness", | CODE |
| MEDIUM⚡ | tests/services/cli_apps/test_models.py | 36 | f"pip install git+{HARNESS_REPO}#subdirectory=blender/agent-harness", app_id="blender" | CODE |
| MEDIUM⚡ | tests/services/cli_apps/test_models.py | 41 | assert plan.target == f"git+{HARNESS_REPO}@{PIN}#subdirectory=blender/agent-harness" | CODE |
| MEDIUM⚡ | tests/services/cli_apps/test_models.py | 47 | assert plan.target.endswith("#subdirectory=zotero/agent-harness") | CODE |
| MEDIUM | deeptutor/capabilities/explore_context/explorer.py | 138 | # Non-native providers, or a failed/empty loop, degrade to the robust | COMMENT |
| MEDIUM | deeptutor/agents/research/pipeline.py | 1449 | """Make report planning robust to partial / invalid block maps. | STRING |
| MEDIUM | deeptutor/partners/channels/dingtalk.py | 54 | # Parse using SDK's ChatbotMessage for robust handling | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 655 | # If quoted message is media, just pass the text | COMMENT |
| MEDIUM | deeptutor/book/blocks/_llm_writer.py | 143 | """Run a structured JSON LLM call with robust parsing and one safe retry. | STRING |
| LOW | deeptutor/api/main.py | 306 | # Fallback: just create the main directory if it doesn't exist | COMMENT |
| MEDIUM | deeptutor/services/cli_apps/models.py | 142 | #: harness, a URL for several public entries, or "" — read from the | COMMENT |
| MEDIUM⚡ | deeptutor/services/cli_apps/provider.py | 44 | #: Where an installed harness keeps its agent-facing guide, most specific first. | COMMENT |
| MEDIUM⚡ | deeptutor/services/cli_apps/provider.py | 47 | #: harness publishes ``cli_anything/<package>/skills/SKILL.md``, which is six | COMMENT |
| MEDIUM⚡ | deeptutor/services/cli_apps/provider.py | 55 | #: exactly one harness, so the glob resolves to one directory. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deeptutor_cli/chat.py | 43 | CODE | |
| LOW | deeptutor_cli/main.py | 76 | CODE | |
| LOW | deeptutor/tools/write_note.py | 61 | CODE | |
| LOW | deeptutor/core/trace.py | 44 | CODE | |
| LOW | deeptutor/core/agentic/tool_dispatch.py | 74 | CODE | |
| LOW | deeptutor/agents/base_agent.py | 51 | CODE | |
| LOW | deeptutor/agents/base_agent.py | 348 | CODE | |
| LOW | deeptutor/agents/base_agent.py | 511 | CODE | |
| LOW | deeptutor/agents/question/coordinator.py | 39 | CODE | |
| LOW | deeptutor/knowledge/progress_tracker.py | 133 | CODE | |
| LOW | deeptutor/book/engine.py | 200 | CODE | |
| LOW | deeptutor/book/inputs.py | 308 | CODE | |
| LOW | deeptutor/services/llm/factory.py | 337 | CODE | |
| LOW | deeptutor/services/llm/factory.py | 401 | CODE | |
| LOW | …r/services/llm/provider_core/openai_compat_provider.py | 735 | CODE | |
| LOW | …/services/llm/provider_core/github_copilot_provider.py | 197 | CODE | |
| LOW | …or/services/llm/provider_core/azure_openai_provider.py | 134 | CODE | |
| LOW | …or/services/llm/provider_core/openai_codex_provider.py | 149 | CODE | |
| LOW | …tutor/services/llm/provider_core/anthropic_provider.py | 513 | CODE | |
| LOW | deeptutor/services/llm/provider_core/base.py | 220 | CODE | |
| LOW | deeptutor/services/llm/provider_core/base.py | 341 | CODE | |
| LOW | deeptutor/services/llm/provider_core/base.py | 390 | CODE | |
| LOW | deeptutor/services/rag/linked_kb.py | 68 | CODE | |
| LOW | deeptutor/services/search/providers/tavily.py | 37 | CODE | |
| LOW | deeptutor/services/search/providers/openrouter.py | 165 | CODE | |
| LOW | deeptutor/services/search/providers/exa.py | 41 | CODE | |
| LOW | deeptutor/services/search/providers/perplexity.py | 153 | CODE | |
| LOW | deeptutor/services/search/providers/baidu.py | 33 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | compose.yaml | 10 | # This file is `podman-compose` 1.5+ compatible. | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 4 | # This file provides orchestration for DeepTutor services | COMMENT |
| MEDIUM⚡ | tests/services/session/test_regenerate.py | 255 | # Create a running turn directly via the store. | COMMENT |
| MEDIUM | deeptutor/tools/vision/block_parser.py | 95 | # Create the block with validated content | COMMENT |
| MEDIUM | deeptutor/api/routers/mastery_path.py | 29 | # Create a fresh store + service per request to avoid object-level race conditions. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/tools/test_ask_user.py | 196 | payload, _ = build_ask_user_payload(questions=[{"prompt": "x", "placeholder": "type here"}]) | CODE |
| LOW | tests/tools/test_ask_user.py | 321 | "placeholder": None, | CODE |
| LOW | tests/tools/test_ask_user.py | 330 | "placeholder": None, | CODE |
| LOW | tests/knowledge/test_document_adder_provider.py | 25 | (output_dir / "entities.parquet").write_bytes(b"placeholder") | CODE |
| LOW | tests/services/config/test_runtime_settings.py | 96 | "pocketbase_admin_email": "admin@example.com", | CODE |
| LOW | tests/services/rag/test_index_probe.py | 93 | (out / "entities.parquet").write_bytes(b"placeholder") | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 99 | ch = _make_channel(allow_from=["user@example.com"]) | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 129 | assert ch._is_own_message({"sender_email": "user@example.com", "sender_id": 200}) is False | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 504 | "sender_email": "user@example.com", | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 507 | assert req["to"] == ["user@example.com"] | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 517 | "sender_email": "user@example.com", | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 520 | {"id": 42, "email": "user@example.com"}, | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 951 | "sender_email": "user@example.com", | CODE |
| LOW | deeptutor_cli/common.py | 587 | placeholder=str(question.get("placeholder") or "").strip(), | CODE |
| LOW | deeptutor/tools/ask_user.py | 73 | "placeholder": self.placeholder, | CODE |
| LOW | deeptutor/tools/ask_user.py | 207 | placeholder_raw = raw.get("placeholder") | CODE |
| LOW | deeptutor/tools/builtin/__init__.py | 1271 | "placeholder": { | CODE |
| LOW | deeptutor/api/routers/space_mcp.py | 381 | "placeholder": field.placeholder, | CODE |
| LOW | deeptutor/services/mcp/catalog/loader.py | 228 | placeholder=str(row.get("placeholder", "")), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deeptutor/tools/tex_chunker.py | 141 | # Check if can merge into current chunk | STRING |
| LOW | deeptutor/tools/tex_chunker.py | 244 | # Check if can merge | STRING |
| LOW | deeptutor/tools/vision/ggb_validator.py | 207 | # Check if anything was fixed | COMMENT |
| LOW | deeptutor/tools/vision/block_parser.py | 156 | # Check if we might be at the start of a block pattern | COMMENT |
| LOW | deeptutor/tools/vision/block_parser.py | 159 | # Check if this could be a block start | COMMENT |
| LOW | deeptutor/agents/base_agent.py | 708 | # Check if this is a nested lookup (section.field pattern) | COMMENT |
| LOW | deeptutor/knowledge/manager.py | 580 | # Check if this is a valid KB directory (flat versions or legacy stores) | COMMENT |
| LOW | deeptutor/knowledge/manager.py | 1497 | # Check if already linked | COMMENT |
| LOW | deeptutor/knowledge/manager.py | 1650 | # Check if modified since last sync | COMMENT |
| LOW | deeptutor/partners/channels/discord.py | 465 | # Check if bot was mentioned in the message | COMMENT |
| LOW | deeptutor/services/llm/local_provider.py | 256 | # Check if closed immediately in same chunk | COMMENT |
| LOW | deeptutor/services/llm/cloud_provider.py | 621 | # Check if closed immediately in same chunk | COMMENT |
| LOW | deeptutor/services/llm/capabilities.py | 11 | # Check if a provider supports response_format | STRING |
| LOW | deeptutor/services/sandbox/runner/server.py | 143 | # Open file descriptors. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | web/app/(workspace)/co-writer/sampleTemplate.ts | 66 | print("DeepTutor is ready.") | CODE |
| HIGH | web/app/(utility)/settings/appearance/page.tsx | 31 | print(summary) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | docker-compose.ghcr.yml | 7 | # Usage: | COMMENT |
| LOW⚡ | .pre-commit-config.yaml | 8 | # Usage: | COMMENT |
| LOW⚡ | docker-compose.yml | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deeptutor/partners/channels/weixin.py | 1349 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 1373 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 1401 | # Step 3: Send message with the media item | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deeptutor/partners/channels/weixin.py | 1349 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 1373 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 1401 | # Step 3: Send message with the media item | COMMENT |