realtimex-deeptutor 0.5.0.post2__tar.gz → 0.5.0.post3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/PKG-INFO +1 -1
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/pyproject.toml +2 -2
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/PKG-INFO +1 -1
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/SOURCES.txt +9 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/top_level.txt +1 -0
- realtimex_deeptutor-0.5.0.post3/scripts/__init__.py +1 -0
- realtimex_deeptutor-0.5.0.post3/scripts/audit_prompts.py +179 -0
- realtimex_deeptutor-0.5.0.post3/scripts/check_install.py +460 -0
- realtimex_deeptutor-0.5.0.post3/scripts/generate_roster.py +327 -0
- realtimex_deeptutor-0.5.0.post3/scripts/install_all.py +653 -0
- realtimex_deeptutor-0.5.0.post3/scripts/migrate_kb.py +655 -0
- realtimex_deeptutor-0.5.0.post3/scripts/start.py +807 -0
- realtimex_deeptutor-0.5.0.post3/scripts/start_web.py +632 -0
- realtimex_deeptutor-0.5.0.post3/scripts/sync_prompts_from_en.py +147 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/cli/start.py +58 -66
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/config/unified_config.py +2 -2
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/LICENSE +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/README.md +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/dependency_links.txt +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/entry_points.txt +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/requires.txt +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/setup.cfg +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/base_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/chat_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/prompts/en/chat_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/prompts/zh/chat_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/session_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/edit_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/narrator_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/prompts/en/edit_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/prompts/en/narrator_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/prompts/zh/edit_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/prompts/zh/narrator_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/chat_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/interactive_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/locate_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/summary_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/guide_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/en/chat_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/en/interactive_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/en/locate_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/en/summary_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/zh/chat_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/zh/interactive_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/zh/locate_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/zh/summary_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/idea_generation_workflow.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/material_organizer_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/prompts/en/idea_generation.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/prompts/en/material_organizer.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/prompts/zh/idea_generation.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/prompts/zh/material_organizer.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/agents/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/agents/generate_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/agents/relevance_analyzer.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/agents/retrieve_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/coordinator.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/example.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/en/coordinator.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/en/generate_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/en/relevance_analyzer.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/en/retrieve_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/zh/coordinator.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/zh/generate_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/zh/relevance_analyzer.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/zh/retrieve_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/decompose_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/manager_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/note_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/rephrase_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/reporting_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/research_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/data_structures.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/main.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/decompose_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/manager_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/note_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/rephrase_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/reporting_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/research_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/decompose_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/manager_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/note_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/rephrase_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/reporting_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/research_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/research_pipeline.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/utils/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/utils/citation_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/utils/json_utils.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/utils/token_tracker.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/analysis_loop/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/analysis_loop/investigate_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/analysis_loop/note_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/main_solver.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/memory/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/memory/citation_memory.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/memory/investigate_memory.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/memory/solve_memory.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/analysis_loop/investigate_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/analysis_loop/note_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/manager_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/precision_answer_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/response_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/solve_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/tool_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/analysis_loop/investigate_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/analysis_loop/note_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/manager_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/precision_answer_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/response_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/solve_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/tool_agent.yaml +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/session_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/citation_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/manager_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/precision_answer_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/response_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/solve_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/tool_agent.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/config_validator.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/display_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/error_handler.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/json_utils.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/performance_monitor.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/token_tracker.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/main.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/agent_config.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/chat.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/co_writer.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/config.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/dashboard.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/guide.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/ideagen.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/knowledge.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/notebook.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/question.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/realtimex.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/research.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/settings.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/solve.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/system.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/run_server.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/history.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/log_interceptor.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/notebook_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/progress_broadcaster.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/task_id_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/cli/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/accessors.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/constants.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/defaults.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/schema.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/settings.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/core/errors.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/add_documents.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/config.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/example_add_documents.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/extract_numbered_items.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/initializer.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/kb.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/progress_tracker.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/start_kb.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/adapters/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/adapters/lightrag.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/adapters/llamaindex.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/config.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/handlers/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/handlers/console.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/handlers/file.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/handlers/websocket.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/logger.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/stats/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/stats/llm_stats.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/config/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/config/knowledge_base_config.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/config/loader.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/base.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/cohere.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/jina.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/ollama.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/openai_compatible.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/realtimex.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/client.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/config.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/provider.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/capabilities.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/client.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/cloud_provider.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/config.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/error_mapping.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/exceptions.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/factory.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/local_provider.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/providers/anthropic.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/providers/base_provider.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/providers/open_ai.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/realtimex_provider.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/registry.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/telemetry.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/types.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/utils.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/prompt/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/prompt/manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/base.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/base.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/fixed.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/numbered_item.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/semantic.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/embedders/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/embedders/base.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/embedders/openai.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/base.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/graph.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/lightrag.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/vector.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/base.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/markdown.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/pdf.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/text.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/base.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/dense.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/hybrid.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/lightrag.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/routing.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/factory.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipeline.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/lightrag.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/llamaindex.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/raganything.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/raganything_docling.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/service.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/types.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/utils/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/utils/image_migration.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/base.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/consolidation.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/baidu.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/exa.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/jina.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/perplexity.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/serper.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/tavily.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/types.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/settings/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/settings/interface_settings.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/setup/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/setup/init.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/tts/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/tts/config.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/code_executor.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/paper_search_tool.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/query_item_tool.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/question/__init__.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/question/exam_mimic.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/question/pdf_parser.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/question/question_extractor.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/rag_tool.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/tex_chunker.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/tex_downloader.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/web_search.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/config_manager.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/document_validator.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/error_rate_tracker.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/error_utils.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/json_parser.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/network/circuit_breaker.py +0 -0
- {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/realtimex.py +0 -0
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "realtimex-deeptutor"
|
|
10
|
-
version = "0.5.0.
|
|
10
|
+
version = "0.5.0.post3"
|
|
11
11
|
description = "RealTimeX DeepTutor - Intelligent learning companion with multi-agent collaboration and LightRAG"
|
|
12
12
|
requires-python = ">=3.10"
|
|
13
13
|
readme = "README.md"
|
|
@@ -90,7 +90,7 @@ deeptutor-backend = "src.api.run_server:main"
|
|
|
90
90
|
|
|
91
91
|
[tool.setuptools.packages.find]
|
|
92
92
|
where = ["."]
|
|
93
|
-
include = ["src*", "realtimex_deeptutor*"]
|
|
93
|
+
include = ["src*", "realtimex_deeptutor*", "scripts*"]
|
|
94
94
|
|
|
95
95
|
[tool.setuptools.package-data]
|
|
96
96
|
# Include non-Python files in the package distribution
|
|
@@ -8,6 +8,15 @@ realtimex_deeptutor.egg-info/dependency_links.txt
|
|
|
8
8
|
realtimex_deeptutor.egg-info/entry_points.txt
|
|
9
9
|
realtimex_deeptutor.egg-info/requires.txt
|
|
10
10
|
realtimex_deeptutor.egg-info/top_level.txt
|
|
11
|
+
scripts/__init__.py
|
|
12
|
+
scripts/audit_prompts.py
|
|
13
|
+
scripts/check_install.py
|
|
14
|
+
scripts/generate_roster.py
|
|
15
|
+
scripts/install_all.py
|
|
16
|
+
scripts/migrate_kb.py
|
|
17
|
+
scripts/start.py
|
|
18
|
+
scripts/start_web.py
|
|
19
|
+
scripts/sync_prompts_from_en.py
|
|
11
20
|
src/__init__.py
|
|
12
21
|
src/agents/__init__.py
|
|
13
22
|
src/agents/base_agent.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Scripts package - included for package distribution
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
Audit prompt parity between prompts/en and prompts/zh|prompts/cn.
|
|
6
|
+
|
|
7
|
+
Checks:
|
|
8
|
+
- Missing/extra keys (recursive)
|
|
9
|
+
- Placeholder drift in string templates (e.g. {question}, {context})
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
python scripts/audit_prompts.py
|
|
13
|
+
python scripts/audit_prompts.py --fail
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
from dataclasses import dataclass
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
import re
|
|
22
|
+
import sys
|
|
23
|
+
from typing import Any, Iterable
|
|
24
|
+
|
|
25
|
+
import yaml
|
|
26
|
+
|
|
27
|
+
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
|
28
|
+
AGENTS_DIR = PROJECT_ROOT / "src" / "agents"
|
|
29
|
+
|
|
30
|
+
# Template placeholders are expected to be like {topic}, {knowledge_title}, etc.
|
|
31
|
+
# Avoid false positives from LaTeX (\frac{1}{3}) and Mermaid (B{{Processing}}).
|
|
32
|
+
PLACEHOLDER_RE = re.compile(r"(?<!\{)\{[A-Za-z_][A-Za-z0-9_]*\}(?!\})")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _load_yaml(path: Path) -> Any:
|
|
36
|
+
with open(path, encoding="utf-8") as f:
|
|
37
|
+
return yaml.safe_load(f) or {}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _iter_yaml_files(root: Path) -> Iterable[Path]:
|
|
41
|
+
if not root.exists():
|
|
42
|
+
return []
|
|
43
|
+
return sorted([p for p in root.rglob("*.yaml") if p.is_file()])
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _get_placeholders(value: Any) -> set[str]:
|
|
47
|
+
found: set[str] = set()
|
|
48
|
+
if isinstance(value, str):
|
|
49
|
+
found |= set(PLACEHOLDER_RE.findall(value))
|
|
50
|
+
elif isinstance(value, dict):
|
|
51
|
+
for v in value.values():
|
|
52
|
+
found |= _get_placeholders(v)
|
|
53
|
+
elif isinstance(value, list):
|
|
54
|
+
for v in value:
|
|
55
|
+
found |= _get_placeholders(v)
|
|
56
|
+
return found
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _collect_keys(value: Any, prefix: str = "") -> set[str]:
|
|
60
|
+
"""
|
|
61
|
+
Collect dotted key paths for all dict nodes.
|
|
62
|
+
Leaves (non-dict) are also included as paths.
|
|
63
|
+
"""
|
|
64
|
+
keys: set[str] = set()
|
|
65
|
+
if isinstance(value, dict):
|
|
66
|
+
for k, v in value.items():
|
|
67
|
+
path = f"{prefix}.{k}" if prefix else str(k)
|
|
68
|
+
keys.add(path)
|
|
69
|
+
keys |= _collect_keys(v, path)
|
|
70
|
+
elif isinstance(value, list):
|
|
71
|
+
# Lists: we don't expand indices; still consider it a leaf container.
|
|
72
|
+
if prefix:
|
|
73
|
+
keys.add(prefix)
|
|
74
|
+
else:
|
|
75
|
+
if prefix:
|
|
76
|
+
keys.add(prefix)
|
|
77
|
+
return keys
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass
|
|
81
|
+
class Diff:
|
|
82
|
+
missing_zh: list[str]
|
|
83
|
+
extra_zh: list[str]
|
|
84
|
+
placeholder_missing_zh: list[str]
|
|
85
|
+
placeholder_extra_zh: list[str]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _diff(en_obj: Any, zh_obj: Any) -> Diff:
|
|
89
|
+
en_keys = _collect_keys(en_obj)
|
|
90
|
+
zh_keys = _collect_keys(zh_obj)
|
|
91
|
+
|
|
92
|
+
en_ph = _get_placeholders(en_obj)
|
|
93
|
+
zh_ph = _get_placeholders(zh_obj)
|
|
94
|
+
|
|
95
|
+
return Diff(
|
|
96
|
+
missing_zh=sorted(en_keys - zh_keys),
|
|
97
|
+
extra_zh=sorted(zh_keys - en_keys),
|
|
98
|
+
placeholder_missing_zh=sorted(en_ph - zh_ph),
|
|
99
|
+
placeholder_extra_zh=sorted(zh_ph - en_ph),
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def main() -> int:
|
|
104
|
+
parser = argparse.ArgumentParser()
|
|
105
|
+
parser.add_argument("--fail", action="store_true", help="exit non-zero on any issue")
|
|
106
|
+
args = parser.parse_args()
|
|
107
|
+
|
|
108
|
+
if not AGENTS_DIR.exists():
|
|
109
|
+
print(f"Agents directory not found: {AGENTS_DIR}", file=sys.stderr)
|
|
110
|
+
return 2
|
|
111
|
+
|
|
112
|
+
issues = 0
|
|
113
|
+
|
|
114
|
+
for module_dir in sorted([p for p in AGENTS_DIR.iterdir() if p.is_dir()]):
|
|
115
|
+
prompts_dir = module_dir / "prompts"
|
|
116
|
+
en_dir = prompts_dir / "en"
|
|
117
|
+
if not en_dir.exists():
|
|
118
|
+
continue
|
|
119
|
+
|
|
120
|
+
# Prefer zh if exists, else cn if exists (but we also compare against cn if present)
|
|
121
|
+
zh_dir = prompts_dir / "zh"
|
|
122
|
+
cn_dir = prompts_dir / "cn"
|
|
123
|
+
|
|
124
|
+
for en_file in _iter_yaml_files(en_dir):
|
|
125
|
+
rel = en_file.relative_to(en_dir)
|
|
126
|
+
candidates = []
|
|
127
|
+
if zh_dir.exists():
|
|
128
|
+
candidates.append(("zh", zh_dir / rel))
|
|
129
|
+
if cn_dir.exists():
|
|
130
|
+
candidates.append(("cn", cn_dir / rel))
|
|
131
|
+
|
|
132
|
+
if not candidates:
|
|
133
|
+
continue
|
|
134
|
+
|
|
135
|
+
en_obj = _load_yaml(en_file)
|
|
136
|
+
|
|
137
|
+
for lang_name, zh_file in candidates:
|
|
138
|
+
if not zh_file.exists():
|
|
139
|
+
issues += 1
|
|
140
|
+
print(f"[MISSING {lang_name}] {module_dir.name}: {rel.as_posix()}")
|
|
141
|
+
continue
|
|
142
|
+
|
|
143
|
+
zh_obj = _load_yaml(zh_file)
|
|
144
|
+
d = _diff(en_obj, zh_obj)
|
|
145
|
+
|
|
146
|
+
if d.missing_zh or d.extra_zh or d.placeholder_missing_zh or d.placeholder_extra_zh:
|
|
147
|
+
issues += 1
|
|
148
|
+
print(f"[DIFF {lang_name}] {module_dir.name}: {rel.as_posix()}")
|
|
149
|
+
if d.missing_zh:
|
|
150
|
+
print(" - missing keys:")
|
|
151
|
+
for k in d.missing_zh[:50]:
|
|
152
|
+
print(f" - {k}")
|
|
153
|
+
if len(d.missing_zh) > 50:
|
|
154
|
+
print(f" ... ({len(d.missing_zh) - 50} more)")
|
|
155
|
+
if d.extra_zh:
|
|
156
|
+
print(" - extra keys:")
|
|
157
|
+
for k in d.extra_zh[:50]:
|
|
158
|
+
print(f" - {k}")
|
|
159
|
+
if len(d.extra_zh) > 50:
|
|
160
|
+
print(f" ... ({len(d.extra_zh) - 50} more)")
|
|
161
|
+
if d.placeholder_missing_zh:
|
|
162
|
+
print(" - missing placeholders:")
|
|
163
|
+
for p in d.placeholder_missing_zh:
|
|
164
|
+
print(f" - {p}")
|
|
165
|
+
if d.placeholder_extra_zh:
|
|
166
|
+
print(" - extra placeholders:")
|
|
167
|
+
for p in d.placeholder_extra_zh:
|
|
168
|
+
print(f" - {p}")
|
|
169
|
+
|
|
170
|
+
if issues == 0:
|
|
171
|
+
print("OK: prompts are structurally aligned (keys/placeholders).")
|
|
172
|
+
return 0
|
|
173
|
+
|
|
174
|
+
print(f"Found {issues} prompt parity issue(s).")
|
|
175
|
+
return 1 if args.fail else 0
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
if __name__ == "__main__":
|
|
179
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
DeepTutor Installation Checker
|
|
4
|
+
|
|
5
|
+
Verifies that all required dependencies are correctly installed.
|
|
6
|
+
Run this script to diagnose installation issues.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import importlib.metadata
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
import shutil
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
# Set Windows console UTF-8 encoding
|
|
17
|
+
if sys.platform == "win32":
|
|
18
|
+
import io
|
|
19
|
+
|
|
20
|
+
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
|
|
21
|
+
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Color codes for terminal output
|
|
25
|
+
class Colors:
|
|
26
|
+
RED = "\033[0;31m"
|
|
27
|
+
GREEN = "\033[0;32m"
|
|
28
|
+
YELLOW = "\033[1;33m"
|
|
29
|
+
BLUE = "\033[0;34m"
|
|
30
|
+
CYAN = "\033[0;36m"
|
|
31
|
+
NC = "\033[0m" # No Color
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
def disable(cls):
|
|
35
|
+
"""Disable colors for non-TTY output"""
|
|
36
|
+
cls.RED = cls.GREEN = cls.YELLOW = cls.BLUE = cls.CYAN = cls.NC = ""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# Disable colors if not a TTY
|
|
40
|
+
if not sys.stdout.isatty():
|
|
41
|
+
Colors.disable()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def print_header(message: str):
|
|
45
|
+
"""Print section header"""
|
|
46
|
+
print(f"\n{'=' * 60}")
|
|
47
|
+
print(f"📋 {message}")
|
|
48
|
+
print("=" * 60)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def print_success(message: str):
|
|
52
|
+
"""Print success message"""
|
|
53
|
+
print(f"{Colors.GREEN}✅ {message}{Colors.NC}")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def print_error(message: str):
|
|
57
|
+
"""Print error message"""
|
|
58
|
+
print(f"{Colors.RED}❌ {message}{Colors.NC}")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def print_warning(message: str):
|
|
62
|
+
"""Print warning message"""
|
|
63
|
+
print(f"{Colors.YELLOW}⚠️ {message}{Colors.NC}")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def print_info(message: str):
|
|
67
|
+
"""Print info message"""
|
|
68
|
+
print(f"{Colors.CYAN}ℹ️ {message}{Colors.NC}")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def get_package_version(package_name: str) -> str | None:
|
|
72
|
+
"""Get installed package version"""
|
|
73
|
+
try:
|
|
74
|
+
return importlib.metadata.version(package_name)
|
|
75
|
+
except importlib.metadata.PackageNotFoundError:
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def check_python_environment() -> bool:
|
|
80
|
+
"""Check Python environment"""
|
|
81
|
+
print_header("Python Environment")
|
|
82
|
+
|
|
83
|
+
all_ok = True
|
|
84
|
+
|
|
85
|
+
# Python version
|
|
86
|
+
py_version = sys.version_info
|
|
87
|
+
print_info(f"Python version: {py_version.major}.{py_version.minor}.{py_version.micro}")
|
|
88
|
+
|
|
89
|
+
if py_version >= (3, 10):
|
|
90
|
+
print_success(f"Python {py_version.major}.{py_version.minor} meets requirement (>=3.10)")
|
|
91
|
+
else:
|
|
92
|
+
print_error(f"Python {py_version.major}.{py_version.minor} is below requirement (>=3.10)")
|
|
93
|
+
all_ok = False
|
|
94
|
+
|
|
95
|
+
# Python executable
|
|
96
|
+
print_info(f"Python executable: {sys.executable}")
|
|
97
|
+
|
|
98
|
+
# Virtual environment
|
|
99
|
+
in_venv = hasattr(sys, "real_prefix") or (
|
|
100
|
+
hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix
|
|
101
|
+
)
|
|
102
|
+
conda_env = os.environ.get("CONDA_DEFAULT_ENV")
|
|
103
|
+
|
|
104
|
+
if conda_env:
|
|
105
|
+
print_success(f"Conda environment: {conda_env}")
|
|
106
|
+
elif in_venv:
|
|
107
|
+
print_success(f"Virtual environment: {sys.prefix}")
|
|
108
|
+
else:
|
|
109
|
+
print_warning("No isolated environment detected (recommended: use conda or venv)")
|
|
110
|
+
|
|
111
|
+
return all_ok
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def check_backend_packages() -> tuple[bool, int, int]:
|
|
115
|
+
"""Check backend Python packages"""
|
|
116
|
+
print_header("Backend Dependencies")
|
|
117
|
+
|
|
118
|
+
# Required packages: (pip_name, import_name, min_version, is_optional)
|
|
119
|
+
packages = [
|
|
120
|
+
# Core
|
|
121
|
+
("python-dotenv", "dotenv", "1.0.0", False),
|
|
122
|
+
("PyYAML", "yaml", "6.0", False),
|
|
123
|
+
("tiktoken", "tiktoken", "0.5.0", False),
|
|
124
|
+
("jinja2", "jinja2", "3.1.0", False),
|
|
125
|
+
# HTTP & API
|
|
126
|
+
("requests", "requests", "2.32.0", False),
|
|
127
|
+
("openai", "openai", "1.30.0", False),
|
|
128
|
+
("anthropic", "anthropic", "0.30.0", False),
|
|
129
|
+
("aiohttp", "aiohttp", "3.9.0", False),
|
|
130
|
+
("httpx", "httpx", "0.27.0", False),
|
|
131
|
+
# Async
|
|
132
|
+
("nest-asyncio", "nest_asyncio", "1.5.8", False),
|
|
133
|
+
("tenacity", "tenacity", "8.0.0", False),
|
|
134
|
+
# Web framework
|
|
135
|
+
("fastapi", "fastapi", "0.100.0", False),
|
|
136
|
+
("uvicorn", "uvicorn", "0.24.0", False),
|
|
137
|
+
("websockets", "websockets", "12.0", False),
|
|
138
|
+
("pydantic", "pydantic", "2.0.0", False),
|
|
139
|
+
# RAG
|
|
140
|
+
("lightrag-hku", "lightrag", "1.0.0", False),
|
|
141
|
+
("raganything", "raganything", "0.1.0", False),
|
|
142
|
+
("llama-index", "llama_index", "0.14.0", False),
|
|
143
|
+
# Document parsing
|
|
144
|
+
("docling", "docling", "2.31.0", True), # Optional
|
|
145
|
+
("PyMuPDF", "fitz", "1.26.0", False),
|
|
146
|
+
# Academic
|
|
147
|
+
("arxiv", "arxiv", "2.0.0", False),
|
|
148
|
+
# Optional API clients
|
|
149
|
+
("perplexityai", "perplexity", "0.1.0", True),
|
|
150
|
+
("dashscope", "dashscope", "1.14.0", True),
|
|
151
|
+
]
|
|
152
|
+
|
|
153
|
+
installed = 0
|
|
154
|
+
missing = 0
|
|
155
|
+
all_ok = True
|
|
156
|
+
|
|
157
|
+
for pip_name, import_name, min_version, is_optional in packages:
|
|
158
|
+
try:
|
|
159
|
+
__import__(import_name)
|
|
160
|
+
version = get_package_version(pip_name)
|
|
161
|
+
version_str = f" (v{version})" if version else ""
|
|
162
|
+
print_success(f" ✓ {pip_name}{version_str}")
|
|
163
|
+
installed += 1
|
|
164
|
+
except ImportError:
|
|
165
|
+
if is_optional:
|
|
166
|
+
print_warning(f" ⚠ {pip_name} not installed (optional)")
|
|
167
|
+
else:
|
|
168
|
+
print_error(f" ✗ {pip_name} not installed")
|
|
169
|
+
all_ok = False
|
|
170
|
+
missing += 1
|
|
171
|
+
|
|
172
|
+
return all_ok, installed, missing
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def check_frontend_packages(project_root: Path) -> tuple[bool, int, int]:
|
|
176
|
+
"""Check frontend Node.js packages"""
|
|
177
|
+
print_header("Frontend Dependencies")
|
|
178
|
+
|
|
179
|
+
web_dir = project_root / "web"
|
|
180
|
+
node_modules = web_dir / "node_modules"
|
|
181
|
+
package_json = web_dir / "package.json"
|
|
182
|
+
|
|
183
|
+
installed = 0
|
|
184
|
+
missing = 0
|
|
185
|
+
all_ok = True
|
|
186
|
+
|
|
187
|
+
# Check npm
|
|
188
|
+
npm_path = shutil.which("npm")
|
|
189
|
+
if npm_path:
|
|
190
|
+
try:
|
|
191
|
+
result = subprocess.run(
|
|
192
|
+
["npm", "--version"],
|
|
193
|
+
capture_output=True,
|
|
194
|
+
text=True,
|
|
195
|
+
timeout=10,
|
|
196
|
+
)
|
|
197
|
+
npm_version = result.stdout.strip()
|
|
198
|
+
print_success(f"npm available (v{npm_version})")
|
|
199
|
+
except Exception:
|
|
200
|
+
print_warning("npm found but version check failed")
|
|
201
|
+
else:
|
|
202
|
+
print_error("npm not found - Node.js is required for frontend")
|
|
203
|
+
all_ok = False
|
|
204
|
+
|
|
205
|
+
# Check node
|
|
206
|
+
node_path = shutil.which("node")
|
|
207
|
+
if node_path:
|
|
208
|
+
try:
|
|
209
|
+
result = subprocess.run(
|
|
210
|
+
["node", "--version"],
|
|
211
|
+
capture_output=True,
|
|
212
|
+
text=True,
|
|
213
|
+
timeout=10,
|
|
214
|
+
)
|
|
215
|
+
node_version = result.stdout.strip()
|
|
216
|
+
print_success(f"Node.js available ({node_version})")
|
|
217
|
+
except Exception:
|
|
218
|
+
print_warning("Node.js found but version check failed")
|
|
219
|
+
else:
|
|
220
|
+
print_error("Node.js not found")
|
|
221
|
+
all_ok = False
|
|
222
|
+
|
|
223
|
+
# Check package.json exists
|
|
224
|
+
if not package_json.exists():
|
|
225
|
+
print_error(f"package.json not found: {package_json}")
|
|
226
|
+
return False, 0, 0
|
|
227
|
+
|
|
228
|
+
# Check node_modules
|
|
229
|
+
if not node_modules.exists():
|
|
230
|
+
print_error("node_modules directory does not exist")
|
|
231
|
+
print_info("Run 'npm install' in web/ directory to install dependencies")
|
|
232
|
+
return False, 0, 0
|
|
233
|
+
|
|
234
|
+
# Check key packages
|
|
235
|
+
key_packages = [
|
|
236
|
+
"next",
|
|
237
|
+
"react",
|
|
238
|
+
"react-dom",
|
|
239
|
+
"typescript",
|
|
240
|
+
"tailwindcss",
|
|
241
|
+
"@radix-ui/react-dialog",
|
|
242
|
+
"lucide-react",
|
|
243
|
+
]
|
|
244
|
+
|
|
245
|
+
print_info("Checking key frontend packages...")
|
|
246
|
+
|
|
247
|
+
for pkg in key_packages:
|
|
248
|
+
pkg_dir = node_modules / pkg
|
|
249
|
+
if pkg_dir.exists():
|
|
250
|
+
# Try to get version from package.json
|
|
251
|
+
pkg_json = pkg_dir / "package.json"
|
|
252
|
+
version = ""
|
|
253
|
+
if pkg_json.exists():
|
|
254
|
+
try:
|
|
255
|
+
import json
|
|
256
|
+
|
|
257
|
+
with open(pkg_json) as f:
|
|
258
|
+
data = json.load(f)
|
|
259
|
+
version = f" (v{data.get('version', '?')})"
|
|
260
|
+
except Exception:
|
|
261
|
+
pass
|
|
262
|
+
print_success(f" ✓ {pkg}{version}")
|
|
263
|
+
installed += 1
|
|
264
|
+
else:
|
|
265
|
+
print_error(f" ✗ {pkg} not installed")
|
|
266
|
+
missing += 1
|
|
267
|
+
all_ok = False
|
|
268
|
+
|
|
269
|
+
return all_ok, installed, missing
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def check_system_tools() -> bool:
|
|
273
|
+
"""Check system tools and utilities"""
|
|
274
|
+
print_header("System Tools")
|
|
275
|
+
|
|
276
|
+
all_ok = True
|
|
277
|
+
|
|
278
|
+
# Git
|
|
279
|
+
git_path = shutil.which("git")
|
|
280
|
+
if git_path:
|
|
281
|
+
try:
|
|
282
|
+
result = subprocess.run(
|
|
283
|
+
["git", "--version"],
|
|
284
|
+
capture_output=True,
|
|
285
|
+
text=True,
|
|
286
|
+
timeout=10,
|
|
287
|
+
)
|
|
288
|
+
git_version = result.stdout.strip()
|
|
289
|
+
print_success(f"{git_version}")
|
|
290
|
+
except Exception:
|
|
291
|
+
print_warning("git found but version check failed")
|
|
292
|
+
else:
|
|
293
|
+
print_warning("git not found (optional but recommended)")
|
|
294
|
+
|
|
295
|
+
# uv (fast Python package manager)
|
|
296
|
+
uv_path = shutil.which("uv")
|
|
297
|
+
if uv_path:
|
|
298
|
+
try:
|
|
299
|
+
result = subprocess.run(
|
|
300
|
+
["uv", "--version"],
|
|
301
|
+
capture_output=True,
|
|
302
|
+
text=True,
|
|
303
|
+
timeout=10,
|
|
304
|
+
)
|
|
305
|
+
uv_version = result.stdout.strip()
|
|
306
|
+
print_success(f"uv available ({uv_version})")
|
|
307
|
+
except Exception:
|
|
308
|
+
print_warning("uv found but version check failed")
|
|
309
|
+
else:
|
|
310
|
+
print_info("uv not found (optional, for faster package installation)")
|
|
311
|
+
|
|
312
|
+
return all_ok
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def check_env_file(project_root: Path) -> bool:
|
|
316
|
+
"""Check .env file configuration"""
|
|
317
|
+
print_header("Environment Configuration")
|
|
318
|
+
|
|
319
|
+
env_file = project_root / ".env"
|
|
320
|
+
env_example = project_root / ".env.example"
|
|
321
|
+
|
|
322
|
+
if env_file.exists():
|
|
323
|
+
print_success(".env file exists")
|
|
324
|
+
|
|
325
|
+
# Check for required keys (without revealing values)
|
|
326
|
+
required_keys = [
|
|
327
|
+
"OPENAI_API_KEY",
|
|
328
|
+
]
|
|
329
|
+
optional_keys = [
|
|
330
|
+
"ANTHROPIC_API_KEY",
|
|
331
|
+
"PERPLEXITY_API_KEY",
|
|
332
|
+
"DASHSCOPE_API_KEY",
|
|
333
|
+
]
|
|
334
|
+
|
|
335
|
+
try:
|
|
336
|
+
with open(env_file) as f:
|
|
337
|
+
content = f.read()
|
|
338
|
+
lines = content.split("\n")
|
|
339
|
+
env_vars = {}
|
|
340
|
+
for line in lines:
|
|
341
|
+
line = line.strip()
|
|
342
|
+
if line and not line.startswith("#") and "=" in line:
|
|
343
|
+
key = line.split("=")[0].strip()
|
|
344
|
+
value = line.split("=", 1)[1].strip() if "=" in line else ""
|
|
345
|
+
env_vars[key] = value
|
|
346
|
+
|
|
347
|
+
for key in required_keys:
|
|
348
|
+
if key in env_vars and env_vars[key]:
|
|
349
|
+
print_success(f" ✓ {key} is set")
|
|
350
|
+
else:
|
|
351
|
+
print_warning(f" ⚠ {key} is not set (required for most features)")
|
|
352
|
+
|
|
353
|
+
for key in optional_keys:
|
|
354
|
+
if key in env_vars and env_vars[key]:
|
|
355
|
+
print_success(f" ✓ {key} is set")
|
|
356
|
+
else:
|
|
357
|
+
print_info(f" ○ {key} is not set (optional)")
|
|
358
|
+
|
|
359
|
+
except Exception as e:
|
|
360
|
+
print_warning(f"Could not read .env file: {e}")
|
|
361
|
+
|
|
362
|
+
return True
|
|
363
|
+
else:
|
|
364
|
+
print_warning(".env file not found")
|
|
365
|
+
if env_example.exists():
|
|
366
|
+
print_info("Copy .env.example to .env and configure your API keys")
|
|
367
|
+
else:
|
|
368
|
+
print_info("Create a .env file with your API keys (e.g., OPENAI_API_KEY)")
|
|
369
|
+
return False
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def main():
|
|
373
|
+
"""Main function"""
|
|
374
|
+
print("\n" + "=" * 60)
|
|
375
|
+
print("🔍 DeepTutor Installation Checker")
|
|
376
|
+
print("=" * 60)
|
|
377
|
+
print("Checking all dependencies and configurations...")
|
|
378
|
+
|
|
379
|
+
# Get project root
|
|
380
|
+
script_dir = Path(__file__).parent
|
|
381
|
+
project_root = script_dir.parent
|
|
382
|
+
|
|
383
|
+
print_info(f"Project root: {project_root}")
|
|
384
|
+
|
|
385
|
+
# Track overall status
|
|
386
|
+
all_checks_passed = True
|
|
387
|
+
summary = []
|
|
388
|
+
|
|
389
|
+
# 1. Python environment
|
|
390
|
+
if check_python_environment():
|
|
391
|
+
summary.append(("Python Environment", "✅ OK"))
|
|
392
|
+
else:
|
|
393
|
+
summary.append(("Python Environment", "❌ Issues found"))
|
|
394
|
+
all_checks_passed = False
|
|
395
|
+
|
|
396
|
+
# 2. Backend packages
|
|
397
|
+
backend_ok, backend_installed, backend_missing = check_backend_packages()
|
|
398
|
+
if backend_ok:
|
|
399
|
+
summary.append(("Backend Dependencies", f"✅ OK ({backend_installed} packages)"))
|
|
400
|
+
else:
|
|
401
|
+
summary.append(
|
|
402
|
+
("Backend Dependencies", f"❌ {backend_missing} missing, {backend_installed} installed")
|
|
403
|
+
)
|
|
404
|
+
all_checks_passed = False
|
|
405
|
+
|
|
406
|
+
# 3. Frontend packages
|
|
407
|
+
frontend_ok, frontend_installed, frontend_missing = check_frontend_packages(project_root)
|
|
408
|
+
if frontend_ok:
|
|
409
|
+
summary.append(("Frontend Dependencies", f"✅ OK ({frontend_installed} packages)"))
|
|
410
|
+
else:
|
|
411
|
+
summary.append(
|
|
412
|
+
(
|
|
413
|
+
"Frontend Dependencies",
|
|
414
|
+
f"❌ {frontend_missing} missing, {frontend_installed} installed",
|
|
415
|
+
)
|
|
416
|
+
)
|
|
417
|
+
all_checks_passed = False
|
|
418
|
+
|
|
419
|
+
# 4. System tools
|
|
420
|
+
check_system_tools()
|
|
421
|
+
summary.append(("System Tools", "✅ Checked"))
|
|
422
|
+
|
|
423
|
+
# 5. Environment configuration
|
|
424
|
+
if check_env_file(project_root):
|
|
425
|
+
summary.append(("Environment Config", "✅ .env exists"))
|
|
426
|
+
else:
|
|
427
|
+
summary.append(("Environment Config", "⚠️ .env missing"))
|
|
428
|
+
|
|
429
|
+
# Print summary
|
|
430
|
+
print_header("Summary")
|
|
431
|
+
|
|
432
|
+
for item, status in summary:
|
|
433
|
+
print(f" {item}: {status}")
|
|
434
|
+
|
|
435
|
+
print("")
|
|
436
|
+
if all_checks_passed:
|
|
437
|
+
print_success("All required dependencies are installed!")
|
|
438
|
+
print_info("You can start DeepTutor with: python scripts/start_web.py")
|
|
439
|
+
else:
|
|
440
|
+
print_error("Some dependencies are missing!")
|
|
441
|
+
print_info("Run: python scripts/install_all.py")
|
|
442
|
+
print_info("Or manually install missing packages")
|
|
443
|
+
|
|
444
|
+
print("=" * 60 + "\n")
|
|
445
|
+
|
|
446
|
+
return 0 if all_checks_passed else 1
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
if __name__ == "__main__":
|
|
450
|
+
try:
|
|
451
|
+
sys.exit(main())
|
|
452
|
+
except KeyboardInterrupt:
|
|
453
|
+
print("\n\n⚠️ Check interrupted by user")
|
|
454
|
+
sys.exit(1)
|
|
455
|
+
except Exception as e:
|
|
456
|
+
print_error(f"\n❌ Unexpected error: {e}")
|
|
457
|
+
import traceback
|
|
458
|
+
|
|
459
|
+
traceback.print_exc()
|
|
460
|
+
sys.exit(1)
|