realtimex-deeptutor 0.5.0.post1__py3-none-any.whl
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/__init__.py +67 -0
- realtimex_deeptutor-0.5.0.post1.dist-info/METADATA +1612 -0
- realtimex_deeptutor-0.5.0.post1.dist-info/RECORD +276 -0
- realtimex_deeptutor-0.5.0.post1.dist-info/WHEEL +5 -0
- realtimex_deeptutor-0.5.0.post1.dist-info/entry_points.txt +2 -0
- realtimex_deeptutor-0.5.0.post1.dist-info/licenses/LICENSE +661 -0
- realtimex_deeptutor-0.5.0.post1.dist-info/top_level.txt +2 -0
- src/__init__.py +40 -0
- src/agents/__init__.py +24 -0
- src/agents/base_agent.py +657 -0
- src/agents/chat/__init__.py +24 -0
- src/agents/chat/chat_agent.py +435 -0
- src/agents/chat/prompts/en/chat_agent.yaml +35 -0
- src/agents/chat/prompts/zh/chat_agent.yaml +35 -0
- src/agents/chat/session_manager.py +311 -0
- src/agents/co_writer/__init__.py +0 -0
- src/agents/co_writer/edit_agent.py +260 -0
- src/agents/co_writer/narrator_agent.py +423 -0
- src/agents/co_writer/prompts/en/edit_agent.yaml +113 -0
- src/agents/co_writer/prompts/en/narrator_agent.yaml +88 -0
- src/agents/co_writer/prompts/zh/edit_agent.yaml +113 -0
- src/agents/co_writer/prompts/zh/narrator_agent.yaml +88 -0
- src/agents/guide/__init__.py +16 -0
- src/agents/guide/agents/__init__.py +11 -0
- src/agents/guide/agents/chat_agent.py +104 -0
- src/agents/guide/agents/interactive_agent.py +223 -0
- src/agents/guide/agents/locate_agent.py +149 -0
- src/agents/guide/agents/summary_agent.py +150 -0
- src/agents/guide/guide_manager.py +500 -0
- src/agents/guide/prompts/en/chat_agent.yaml +41 -0
- src/agents/guide/prompts/en/interactive_agent.yaml +202 -0
- src/agents/guide/prompts/en/locate_agent.yaml +68 -0
- src/agents/guide/prompts/en/summary_agent.yaml +157 -0
- src/agents/guide/prompts/zh/chat_agent.yaml +41 -0
- src/agents/guide/prompts/zh/interactive_agent.yaml +626 -0
- src/agents/guide/prompts/zh/locate_agent.yaml +68 -0
- src/agents/guide/prompts/zh/summary_agent.yaml +157 -0
- src/agents/ideagen/__init__.py +12 -0
- src/agents/ideagen/idea_generation_workflow.py +426 -0
- src/agents/ideagen/material_organizer_agent.py +173 -0
- src/agents/ideagen/prompts/en/idea_generation.yaml +187 -0
- src/agents/ideagen/prompts/en/material_organizer.yaml +69 -0
- src/agents/ideagen/prompts/zh/idea_generation.yaml +187 -0
- src/agents/ideagen/prompts/zh/material_organizer.yaml +69 -0
- src/agents/question/__init__.py +24 -0
- src/agents/question/agents/__init__.py +18 -0
- src/agents/question/agents/generate_agent.py +381 -0
- src/agents/question/agents/relevance_analyzer.py +207 -0
- src/agents/question/agents/retrieve_agent.py +239 -0
- src/agents/question/coordinator.py +718 -0
- src/agents/question/example.py +109 -0
- src/agents/question/prompts/en/coordinator.yaml +75 -0
- src/agents/question/prompts/en/generate_agent.yaml +77 -0
- src/agents/question/prompts/en/relevance_analyzer.yaml +41 -0
- src/agents/question/prompts/en/retrieve_agent.yaml +32 -0
- src/agents/question/prompts/zh/coordinator.yaml +75 -0
- src/agents/question/prompts/zh/generate_agent.yaml +77 -0
- src/agents/question/prompts/zh/relevance_analyzer.yaml +39 -0
- src/agents/question/prompts/zh/retrieve_agent.yaml +30 -0
- src/agents/research/agents/__init__.py +23 -0
- src/agents/research/agents/decompose_agent.py +507 -0
- src/agents/research/agents/manager_agent.py +228 -0
- src/agents/research/agents/note_agent.py +180 -0
- src/agents/research/agents/rephrase_agent.py +263 -0
- src/agents/research/agents/reporting_agent.py +1333 -0
- src/agents/research/agents/research_agent.py +714 -0
- src/agents/research/data_structures.py +451 -0
- src/agents/research/main.py +188 -0
- src/agents/research/prompts/en/decompose_agent.yaml +89 -0
- src/agents/research/prompts/en/manager_agent.yaml +24 -0
- src/agents/research/prompts/en/note_agent.yaml +121 -0
- src/agents/research/prompts/en/rephrase_agent.yaml +58 -0
- src/agents/research/prompts/en/reporting_agent.yaml +380 -0
- src/agents/research/prompts/en/research_agent.yaml +173 -0
- src/agents/research/prompts/zh/decompose_agent.yaml +89 -0
- src/agents/research/prompts/zh/manager_agent.yaml +24 -0
- src/agents/research/prompts/zh/note_agent.yaml +121 -0
- src/agents/research/prompts/zh/rephrase_agent.yaml +58 -0
- src/agents/research/prompts/zh/reporting_agent.yaml +380 -0
- src/agents/research/prompts/zh/research_agent.yaml +173 -0
- src/agents/research/research_pipeline.py +1309 -0
- src/agents/research/utils/__init__.py +60 -0
- src/agents/research/utils/citation_manager.py +799 -0
- src/agents/research/utils/json_utils.py +98 -0
- src/agents/research/utils/token_tracker.py +297 -0
- src/agents/solve/__init__.py +80 -0
- src/agents/solve/analysis_loop/__init__.py +14 -0
- src/agents/solve/analysis_loop/investigate_agent.py +414 -0
- src/agents/solve/analysis_loop/note_agent.py +190 -0
- src/agents/solve/main_solver.py +862 -0
- src/agents/solve/memory/__init__.py +34 -0
- src/agents/solve/memory/citation_memory.py +353 -0
- src/agents/solve/memory/investigate_memory.py +226 -0
- src/agents/solve/memory/solve_memory.py +340 -0
- src/agents/solve/prompts/en/analysis_loop/investigate_agent.yaml +55 -0
- src/agents/solve/prompts/en/analysis_loop/note_agent.yaml +54 -0
- src/agents/solve/prompts/en/solve_loop/manager_agent.yaml +67 -0
- src/agents/solve/prompts/en/solve_loop/precision_answer_agent.yaml +62 -0
- src/agents/solve/prompts/en/solve_loop/response_agent.yaml +90 -0
- src/agents/solve/prompts/en/solve_loop/solve_agent.yaml +75 -0
- src/agents/solve/prompts/en/solve_loop/tool_agent.yaml +38 -0
- src/agents/solve/prompts/zh/analysis_loop/investigate_agent.yaml +53 -0
- src/agents/solve/prompts/zh/analysis_loop/note_agent.yaml +54 -0
- src/agents/solve/prompts/zh/solve_loop/manager_agent.yaml +66 -0
- src/agents/solve/prompts/zh/solve_loop/precision_answer_agent.yaml +62 -0
- src/agents/solve/prompts/zh/solve_loop/response_agent.yaml +90 -0
- src/agents/solve/prompts/zh/solve_loop/solve_agent.yaml +76 -0
- src/agents/solve/prompts/zh/solve_loop/tool_agent.yaml +41 -0
- src/agents/solve/solve_loop/__init__.py +22 -0
- src/agents/solve/solve_loop/citation_manager.py +74 -0
- src/agents/solve/solve_loop/manager_agent.py +274 -0
- src/agents/solve/solve_loop/precision_answer_agent.py +96 -0
- src/agents/solve/solve_loop/response_agent.py +301 -0
- src/agents/solve/solve_loop/solve_agent.py +325 -0
- src/agents/solve/solve_loop/tool_agent.py +470 -0
- src/agents/solve/utils/__init__.py +64 -0
- src/agents/solve/utils/config_validator.py +313 -0
- src/agents/solve/utils/display_manager.py +223 -0
- src/agents/solve/utils/error_handler.py +363 -0
- src/agents/solve/utils/json_utils.py +98 -0
- src/agents/solve/utils/performance_monitor.py +407 -0
- src/agents/solve/utils/token_tracker.py +541 -0
- src/api/__init__.py +0 -0
- src/api/main.py +240 -0
- src/api/routers/__init__.py +1 -0
- src/api/routers/agent_config.py +69 -0
- src/api/routers/chat.py +296 -0
- src/api/routers/co_writer.py +337 -0
- src/api/routers/config.py +627 -0
- src/api/routers/dashboard.py +18 -0
- src/api/routers/guide.py +337 -0
- src/api/routers/ideagen.py +436 -0
- src/api/routers/knowledge.py +821 -0
- src/api/routers/notebook.py +247 -0
- src/api/routers/question.py +537 -0
- src/api/routers/research.py +394 -0
- src/api/routers/settings.py +164 -0
- src/api/routers/solve.py +305 -0
- src/api/routers/system.py +252 -0
- src/api/run_server.py +61 -0
- src/api/utils/history.py +172 -0
- src/api/utils/log_interceptor.py +21 -0
- src/api/utils/notebook_manager.py +415 -0
- src/api/utils/progress_broadcaster.py +72 -0
- src/api/utils/task_id_manager.py +100 -0
- src/config/__init__.py +0 -0
- src/config/accessors.py +18 -0
- src/config/constants.py +34 -0
- src/config/defaults.py +18 -0
- src/config/schema.py +38 -0
- src/config/settings.py +50 -0
- src/core/errors.py +62 -0
- src/knowledge/__init__.py +23 -0
- src/knowledge/add_documents.py +606 -0
- src/knowledge/config.py +65 -0
- src/knowledge/example_add_documents.py +236 -0
- src/knowledge/extract_numbered_items.py +1039 -0
- src/knowledge/initializer.py +621 -0
- src/knowledge/kb.py +22 -0
- src/knowledge/manager.py +782 -0
- src/knowledge/progress_tracker.py +182 -0
- src/knowledge/start_kb.py +535 -0
- src/logging/__init__.py +103 -0
- src/logging/adapters/__init__.py +17 -0
- src/logging/adapters/lightrag.py +184 -0
- src/logging/adapters/llamaindex.py +141 -0
- src/logging/config.py +80 -0
- src/logging/handlers/__init__.py +20 -0
- src/logging/handlers/console.py +75 -0
- src/logging/handlers/file.py +201 -0
- src/logging/handlers/websocket.py +127 -0
- src/logging/logger.py +709 -0
- src/logging/stats/__init__.py +16 -0
- src/logging/stats/llm_stats.py +179 -0
- src/services/__init__.py +56 -0
- src/services/config/__init__.py +61 -0
- src/services/config/knowledge_base_config.py +210 -0
- src/services/config/loader.py +260 -0
- src/services/config/unified_config.py +603 -0
- src/services/embedding/__init__.py +45 -0
- src/services/embedding/adapters/__init__.py +22 -0
- src/services/embedding/adapters/base.py +106 -0
- src/services/embedding/adapters/cohere.py +127 -0
- src/services/embedding/adapters/jina.py +99 -0
- src/services/embedding/adapters/ollama.py +116 -0
- src/services/embedding/adapters/openai_compatible.py +96 -0
- src/services/embedding/client.py +159 -0
- src/services/embedding/config.py +156 -0
- src/services/embedding/provider.py +119 -0
- src/services/llm/__init__.py +152 -0
- src/services/llm/capabilities.py +313 -0
- src/services/llm/client.py +302 -0
- src/services/llm/cloud_provider.py +530 -0
- src/services/llm/config.py +200 -0
- src/services/llm/error_mapping.py +103 -0
- src/services/llm/exceptions.py +152 -0
- src/services/llm/factory.py +450 -0
- src/services/llm/local_provider.py +347 -0
- src/services/llm/providers/anthropic.py +95 -0
- src/services/llm/providers/base_provider.py +93 -0
- src/services/llm/providers/open_ai.py +83 -0
- src/services/llm/registry.py +71 -0
- src/services/llm/telemetry.py +40 -0
- src/services/llm/types.py +27 -0
- src/services/llm/utils.py +333 -0
- src/services/prompt/__init__.py +25 -0
- src/services/prompt/manager.py +206 -0
- src/services/rag/__init__.py +64 -0
- src/services/rag/components/__init__.py +29 -0
- src/services/rag/components/base.py +59 -0
- src/services/rag/components/chunkers/__init__.py +18 -0
- src/services/rag/components/chunkers/base.py +34 -0
- src/services/rag/components/chunkers/fixed.py +71 -0
- src/services/rag/components/chunkers/numbered_item.py +94 -0
- src/services/rag/components/chunkers/semantic.py +97 -0
- src/services/rag/components/embedders/__init__.py +14 -0
- src/services/rag/components/embedders/base.py +32 -0
- src/services/rag/components/embedders/openai.py +63 -0
- src/services/rag/components/indexers/__init__.py +18 -0
- src/services/rag/components/indexers/base.py +35 -0
- src/services/rag/components/indexers/graph.py +172 -0
- src/services/rag/components/indexers/lightrag.py +156 -0
- src/services/rag/components/indexers/vector.py +146 -0
- src/services/rag/components/parsers/__init__.py +18 -0
- src/services/rag/components/parsers/base.py +35 -0
- src/services/rag/components/parsers/markdown.py +52 -0
- src/services/rag/components/parsers/pdf.py +115 -0
- src/services/rag/components/parsers/text.py +86 -0
- src/services/rag/components/retrievers/__init__.py +18 -0
- src/services/rag/components/retrievers/base.py +34 -0
- src/services/rag/components/retrievers/dense.py +200 -0
- src/services/rag/components/retrievers/hybrid.py +164 -0
- src/services/rag/components/retrievers/lightrag.py +169 -0
- src/services/rag/components/routing.py +286 -0
- src/services/rag/factory.py +234 -0
- src/services/rag/pipeline.py +215 -0
- src/services/rag/pipelines/__init__.py +32 -0
- src/services/rag/pipelines/academic.py +44 -0
- src/services/rag/pipelines/lightrag.py +43 -0
- src/services/rag/pipelines/llamaindex.py +313 -0
- src/services/rag/pipelines/raganything.py +384 -0
- src/services/rag/service.py +244 -0
- src/services/rag/types.py +73 -0
- src/services/search/__init__.py +284 -0
- src/services/search/base.py +87 -0
- src/services/search/consolidation.py +398 -0
- src/services/search/providers/__init__.py +128 -0
- src/services/search/providers/baidu.py +188 -0
- src/services/search/providers/exa.py +194 -0
- src/services/search/providers/jina.py +161 -0
- src/services/search/providers/perplexity.py +153 -0
- src/services/search/providers/serper.py +209 -0
- src/services/search/providers/tavily.py +161 -0
- src/services/search/types.py +114 -0
- src/services/setup/__init__.py +34 -0
- src/services/setup/init.py +285 -0
- src/services/tts/__init__.py +16 -0
- src/services/tts/config.py +99 -0
- src/tools/__init__.py +91 -0
- src/tools/code_executor.py +536 -0
- src/tools/paper_search_tool.py +171 -0
- src/tools/query_item_tool.py +310 -0
- src/tools/question/__init__.py +15 -0
- src/tools/question/exam_mimic.py +616 -0
- src/tools/question/pdf_parser.py +211 -0
- src/tools/question/question_extractor.py +397 -0
- src/tools/rag_tool.py +173 -0
- src/tools/tex_chunker.py +339 -0
- src/tools/tex_downloader.py +253 -0
- src/tools/web_search.py +71 -0
- src/utils/config_manager.py +206 -0
- src/utils/document_validator.py +168 -0
- src/utils/error_rate_tracker.py +111 -0
- src/utils/error_utils.py +82 -0
- src/utils/json_parser.py +110 -0
- src/utils/network/circuit_breaker.py +79 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
system: |
|
|
2
|
+
你是一位专业的编辑和写作助手。
|
|
3
|
+
|
|
4
|
+
action_template: |
|
|
5
|
+
根据用户的指令{action_verb}以下文本。
|
|
6
|
+
|
|
7
|
+
用户指令:{instruction}
|
|
8
|
+
|
|
9
|
+
context_template: |
|
|
10
|
+
参考上下文:
|
|
11
|
+
{context}
|
|
12
|
+
|
|
13
|
+
user_template: |
|
|
14
|
+
要编辑的目标文本:
|
|
15
|
+
{text}
|
|
16
|
+
|
|
17
|
+
只输出编辑后的文本,不要包含引号或解释。
|
|
18
|
+
|
|
19
|
+
auto_mark_system: |
|
|
20
|
+
你是一位专业的学术阅读标注助手,帮助读者快速掌握文本的核心要点。
|
|
21
|
+
|
|
22
|
+
## 任务
|
|
23
|
+
阅读输入文本,**精心选择**最关键的信息进行标注。标注应帮助读者快速定位关键点,而不干扰阅读。
|
|
24
|
+
|
|
25
|
+
## 可用标签及精确使用场景
|
|
26
|
+
|
|
27
|
+
### 1. Circle(圈注)- 谨慎使用
|
|
28
|
+
```html
|
|
29
|
+
<span data-rough-notation="circle">内容</span>
|
|
30
|
+
```
|
|
31
|
+
**适用场景**:
|
|
32
|
+
- 文章/段落的核心主题词(如论文标题中的关键概念)
|
|
33
|
+
- 独特的专有名词、模型名称(如GPT-4、BERT)
|
|
34
|
+
- 关键数值/指标(如95.7%、p<0.05)
|
|
35
|
+
|
|
36
|
+
**限制**:每100字符最多1个,内容不超过5个字符
|
|
37
|
+
|
|
38
|
+
### 2. Highlight(高亮)- 适度使用
|
|
39
|
+
```html
|
|
40
|
+
<span data-rough-notation="highlight">内容</span>
|
|
41
|
+
```
|
|
42
|
+
**适用场景**:
|
|
43
|
+
- 定义性陈述(如"XX是指...")
|
|
44
|
+
- 核心概念首次出现及其解释
|
|
45
|
+
- 重要的方法论描述
|
|
46
|
+
|
|
47
|
+
**限制**:每段最多2个,内容2-15个字符
|
|
48
|
+
|
|
49
|
+
### 3. Box(方框)- 最少使用
|
|
50
|
+
```html
|
|
51
|
+
<span data-rough-notation="box">内容</span>
|
|
52
|
+
```
|
|
53
|
+
**适用场景**:
|
|
54
|
+
- 数学公式、方程式
|
|
55
|
+
- 具体数据点或统计值
|
|
56
|
+
- 代码片段、命令
|
|
57
|
+
- 版本号、日期等精确信息
|
|
58
|
+
|
|
59
|
+
**限制**:每段最多1个,内容不超过20个字符
|
|
60
|
+
|
|
61
|
+
### 4. Underline(下划线)- 适度使用
|
|
62
|
+
```html
|
|
63
|
+
<span data-rough-notation="underline">内容</span>
|
|
64
|
+
```
|
|
65
|
+
**适用场景**:
|
|
66
|
+
- 结论性陈述
|
|
67
|
+
- 因果关系的关键表达
|
|
68
|
+
- 比较或对比中的核心观点
|
|
69
|
+
- 作者的主要论点
|
|
70
|
+
|
|
71
|
+
**限制**:每段最多1个,内容5-30个字符
|
|
72
|
+
|
|
73
|
+
### 5. Bracket(括号)- 谨慎使用
|
|
74
|
+
```html
|
|
75
|
+
<span data-rough-notation="bracket">内容</span>
|
|
76
|
+
```
|
|
77
|
+
**适用场景**:
|
|
78
|
+
- 作为核心摘要或结论的整段
|
|
79
|
+
- 重要引用或定理陈述
|
|
80
|
+
- 关键警告或注释
|
|
81
|
+
|
|
82
|
+
**限制**:整篇文章最多1-2个,用于真正不可或缺的完整句子
|
|
83
|
+
|
|
84
|
+
## 核心规则
|
|
85
|
+
|
|
86
|
+
1. **保持克制**:宁可少标注也不要过度标注。每段的标注密度不应超过文本总量的10%。
|
|
87
|
+
2. **不做修改**:绝对不能修改、删除或添加原文中的任何文字,只能插入HTML标签。
|
|
88
|
+
3. **标签位置**:标签必须放在Markdown符号内(如`**`、`*`、`` ` ``)。
|
|
89
|
+
4. **无需标注时**:如果文本没有值得标注的信息,原样返回。
|
|
90
|
+
|
|
91
|
+
## 示例
|
|
92
|
+
|
|
93
|
+
**输入**:
|
|
94
|
+
深度学习是机器学习的一个子领域,其核心是使用神经网络来学习数据表示。
|
|
95
|
+
|
|
96
|
+
**输出**:
|
|
97
|
+
<span data-rough-notation="highlight">深度学习是机器学习的一个子领域</span>,其核心是使用<span data-rough-notation="circle">神经网络</span>来学习数据表示。
|
|
98
|
+
|
|
99
|
+
**输入**:
|
|
100
|
+
今天天气很好,适合出去散步。
|
|
101
|
+
|
|
102
|
+
**输出**:
|
|
103
|
+
今天天气很好,适合出去散步。
|
|
104
|
+
|
|
105
|
+
**输入**:
|
|
106
|
+
实验结果表明,我们提出的方法在MNIST数据集上达到了99.2%的准确率,显著超过了基线方法的95.1%。
|
|
107
|
+
|
|
108
|
+
**输出**:
|
|
109
|
+
<span data-rough-notation="underline">实验结果表明,我们提出的方法在MNIST数据集上达到了<span data-rough-notation="box">99.2%</span>的准确率</span>,显著超过了基线方法的95.1%。
|
|
110
|
+
|
|
111
|
+
auto_mark_user_template: |
|
|
112
|
+
处理以下文本:
|
|
113
|
+
{text}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
style_friendly: |
|
|
2
|
+
你是一位友好、平易近人的导师,面对面地向学生解释笔记内容。
|
|
3
|
+
|
|
4
|
+
**叙述要求**:
|
|
5
|
+
1. **人称**:使用"我们"、"咱们"、"你"来拉近距离
|
|
6
|
+
2. **语气**:轻松但专业,像和朋友聊天一样
|
|
7
|
+
3. **节奏**:适当停顿,使用"好"、"接下来"、"那么"等词进行过渡
|
|
8
|
+
4. **强调**:使用"这很重要"、"注意这里"等短语突出关键信息
|
|
9
|
+
5. **互动**:适当加入"你觉得呢"、"想一想"等引导思考的短语
|
|
10
|
+
6. **长度控制**:稿件应控制在4000字符以内。如果原内容较长,请生成精炼的摘要版本,突出主要观点和关键信息。
|
|
11
|
+
|
|
12
|
+
style_academic: |
|
|
13
|
+
你是一位资深学者,正在进行学术讲座。
|
|
14
|
+
|
|
15
|
+
**叙述要求**:
|
|
16
|
+
1. **人称**:使用"我们"、"本文"等学术语言
|
|
17
|
+
2. **语气**:严谨专业,逻辑清晰
|
|
18
|
+
3. **结构**:清晰的引言-正文-结论结构
|
|
19
|
+
4. **术语**:保留专业术语,必要时提供解释
|
|
20
|
+
5. **引用**:提到相关理论或研究时保持学术规范
|
|
21
|
+
6. **长度控制**:稿件应控制在4000字符以内。如果原内容较长,请生成精炼的摘要版本,突出主要观点和关键信息。
|
|
22
|
+
|
|
23
|
+
style_concise: |
|
|
24
|
+
你是一位高效的知识传播者,需要快速传达核心信息。
|
|
25
|
+
|
|
26
|
+
**叙述要求**:
|
|
27
|
+
1. **人称**:使用"我们"保持友好
|
|
28
|
+
2. **语气**:直接明了,不绕弯子
|
|
29
|
+
3. **结构**:先总后分,直奔主题
|
|
30
|
+
4. **重点**:只涵盖最核心的内容
|
|
31
|
+
5. **过渡**:使用简洁的"首先"、"然后"、"最后"连接
|
|
32
|
+
6. **长度控制**:稿件应控制在4000字符以内。如果原内容较长,请生成精炼的摘要版本,突出主要观点和关键信息。
|
|
33
|
+
|
|
34
|
+
generate_script_system_template: |
|
|
35
|
+
你是一位专业的笔记叙述稿件撰写专家。你的任务是将用户的笔记内容转换为适合口头叙述的稿件。
|
|
36
|
+
|
|
37
|
+
{style_prompt}
|
|
38
|
+
|
|
39
|
+
{length_instruction}
|
|
40
|
+
|
|
41
|
+
**输出格式**:
|
|
42
|
+
直接输出叙述稿件文本,不要包含任何额外的解释或标记。
|
|
43
|
+
稿件应该是连贯的口语,适合直接朗读。
|
|
44
|
+
|
|
45
|
+
**注意事项**:
|
|
46
|
+
1. 保持原文的核心信息和逻辑结构
|
|
47
|
+
2. 将Markdown格式(如**粗体**、*斜体*、代码块等)转换为口语描述
|
|
48
|
+
3. 数学公式需要口语化描述,如"x的平方加y的平方等于z的平方"
|
|
49
|
+
4. 移除所有HTML标签,保留其文本内容
|
|
50
|
+
5. 避免过于书面的表达
|
|
51
|
+
6. **控制长度在4000字符以内**
|
|
52
|
+
|
|
53
|
+
length_instruction_long: |
|
|
54
|
+
**重要:稿件应控制在4000字符以内。如果原内容较长,请生成精炼的摘要版本,保留最核心的观点和关键信息。**
|
|
55
|
+
|
|
56
|
+
length_instruction_short: |
|
|
57
|
+
**重要:稿件应控制在4000字符以内。**
|
|
58
|
+
|
|
59
|
+
generate_script_user_long: |
|
|
60
|
+
以下是一段较长的笔记内容。请生成精炼的叙述稿件摘要,控制在4000字符以内,包含最核心的观点和关键信息:
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
{content}
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
请生成适合口头朗读的叙述稿件(4000字符以内)。
|
|
67
|
+
|
|
68
|
+
generate_script_user_short: |
|
|
69
|
+
请将以下笔记内容转换为叙述稿件(控制在4000字符以内):
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
{content}
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
请生成适合口头朗读的叙述稿件。
|
|
76
|
+
|
|
77
|
+
extract_key_points_system: |
|
|
78
|
+
你是一位内容分析专家。请从给定的笔记中提取3-5个关键点。
|
|
79
|
+
|
|
80
|
+
输出格式:JSON数组,每个元素是一个关键点字符串。
|
|
81
|
+
示例:["关键点1", "关键点2", "关键点3"]
|
|
82
|
+
|
|
83
|
+
只输出JSON数组,不要包含其他内容。
|
|
84
|
+
|
|
85
|
+
extract_key_points_user: |
|
|
86
|
+
请从以下笔记中提取关键点:
|
|
87
|
+
|
|
88
|
+
{content}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Guided Learning Module
|
|
3
|
+
Generates personalized knowledge point learning plans based on user notebook content
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from .agents import ChatAgent, InteractiveAgent, LocateAgent, SummaryAgent
|
|
7
|
+
from .guide_manager import GuidedSession, GuideManager
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"ChatAgent",
|
|
11
|
+
"GuideManager",
|
|
12
|
+
"GuidedSession",
|
|
13
|
+
"InteractiveAgent",
|
|
14
|
+
"LocateAgent",
|
|
15
|
+
"SummaryAgent",
|
|
16
|
+
]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Guided Learning Agents
|
|
3
|
+
Agent modules for guided learning
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from .chat_agent import ChatAgent
|
|
7
|
+
from .interactive_agent import InteractiveAgent
|
|
8
|
+
from .locate_agent import LocateAgent
|
|
9
|
+
from .summary_agent import SummaryAgent
|
|
10
|
+
|
|
11
|
+
__all__ = ["ChatAgent", "InteractiveAgent", "LocateAgent", "SummaryAgent"]
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
ChatAgent - Q&A Agent during learning process
|
|
4
|
+
Answers user questions while learning specific knowledge points
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from src.agents.base_agent import BaseAgent
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ChatAgent(BaseAgent):
|
|
13
|
+
"""Learning Q&A agent"""
|
|
14
|
+
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
api_key: str,
|
|
18
|
+
base_url: str,
|
|
19
|
+
language: str = "zh",
|
|
20
|
+
api_version: str | None = None,
|
|
21
|
+
binding: str = "openai",
|
|
22
|
+
):
|
|
23
|
+
super().__init__(
|
|
24
|
+
module_name="guide",
|
|
25
|
+
agent_name="chat_agent",
|
|
26
|
+
api_key=api_key,
|
|
27
|
+
base_url=base_url,
|
|
28
|
+
api_version=api_version,
|
|
29
|
+
language=language,
|
|
30
|
+
binding=binding,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def _format_chat_history(self, history: list[dict[str, str]]) -> str:
|
|
34
|
+
"""Format chat history"""
|
|
35
|
+
if not history:
|
|
36
|
+
return "(No chat history)"
|
|
37
|
+
|
|
38
|
+
formatted = []
|
|
39
|
+
for msg in history[-10:]:
|
|
40
|
+
role = msg.get("role", "user")
|
|
41
|
+
content = msg.get("content", "")
|
|
42
|
+
|
|
43
|
+
if role == "user":
|
|
44
|
+
formatted.append(f"**User**: {content}")
|
|
45
|
+
elif role == "assistant":
|
|
46
|
+
formatted.append(f"**Assistant**: {content}")
|
|
47
|
+
elif role == "system":
|
|
48
|
+
formatted.append(f"_System: {content}_")
|
|
49
|
+
|
|
50
|
+
return "\n\n".join(formatted)
|
|
51
|
+
|
|
52
|
+
async def process(
|
|
53
|
+
self, knowledge: dict[str, Any], chat_history: list[dict[str, str]], user_question: str
|
|
54
|
+
) -> dict[str, Any]:
|
|
55
|
+
"""
|
|
56
|
+
Answer user questions about current knowledge point
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
knowledge: Current knowledge point information
|
|
60
|
+
chat_history: Chat history
|
|
61
|
+
user_question: User question
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
Dictionary containing answer
|
|
65
|
+
"""
|
|
66
|
+
if not user_question.strip():
|
|
67
|
+
return {"success": False, "error": "Question cannot be empty", "answer": ""}
|
|
68
|
+
|
|
69
|
+
system_prompt = self.get_prompt("system")
|
|
70
|
+
if not system_prompt:
|
|
71
|
+
raise ValueError(
|
|
72
|
+
"ChatAgent missing system prompt, please configure system in prompts/{lang}/chat_agent.yaml"
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
user_template = self.get_prompt("user_template")
|
|
76
|
+
if not user_template:
|
|
77
|
+
raise ValueError(
|
|
78
|
+
"ChatAgent missing user_template, please configure user_template in prompts/{lang}/chat_agent.yaml"
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
formatted_history = self._format_chat_history(chat_history)
|
|
82
|
+
|
|
83
|
+
user_prompt = user_template.format(
|
|
84
|
+
knowledge_title=knowledge.get("knowledge_title", ""),
|
|
85
|
+
knowledge_summary=knowledge.get("knowledge_summary", ""),
|
|
86
|
+
user_difficulty=knowledge.get("user_difficulty", ""),
|
|
87
|
+
chat_history=formatted_history,
|
|
88
|
+
user_question=user_question,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
response = await self.call_llm(
|
|
93
|
+
user_prompt=user_prompt,
|
|
94
|
+
system_prompt=system_prompt,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
return {"success": True, "answer": response.strip()}
|
|
98
|
+
|
|
99
|
+
except Exception as e:
|
|
100
|
+
return {
|
|
101
|
+
"success": False,
|
|
102
|
+
"error": str(e),
|
|
103
|
+
"answer": "Sorry, an error occurred while answering the question. Please try again later.",
|
|
104
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
InteractiveAgent - Agent for generating interactive HTML pages
|
|
5
|
+
Converts knowledge points into visual, interactive learning pages
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import re
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from src.agents.base_agent import BaseAgent
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class InteractiveAgent(BaseAgent):
|
|
15
|
+
"""Interactive page generation agent"""
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
api_key: str,
|
|
20
|
+
base_url: str,
|
|
21
|
+
language: str = "zh",
|
|
22
|
+
api_version: str | None = None,
|
|
23
|
+
binding: str = "openai",
|
|
24
|
+
):
|
|
25
|
+
super().__init__(
|
|
26
|
+
module_name="guide",
|
|
27
|
+
agent_name="interactive_agent",
|
|
28
|
+
api_key=api_key,
|
|
29
|
+
base_url=base_url,
|
|
30
|
+
api_version=api_version,
|
|
31
|
+
language=language,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
def _extract_html(self, response: str) -> str:
|
|
35
|
+
"""Extract HTML code from LLM response"""
|
|
36
|
+
html_pattern = r"```html\s*([\s\S]*?)\s*```"
|
|
37
|
+
match = re.search(html_pattern, response)
|
|
38
|
+
if match:
|
|
39
|
+
return match.group(1).strip()
|
|
40
|
+
|
|
41
|
+
code_pattern = r"```\s*([\s\S]*?)\s*```"
|
|
42
|
+
match = re.search(code_pattern, response)
|
|
43
|
+
if match:
|
|
44
|
+
content = match.group(1).strip()
|
|
45
|
+
if content.startswith("<!DOCTYPE") or content.startswith("<html"):
|
|
46
|
+
return content
|
|
47
|
+
|
|
48
|
+
if response.strip().startswith("<!DOCTYPE") or response.strip().startswith("<html"):
|
|
49
|
+
return response.strip()
|
|
50
|
+
|
|
51
|
+
return response.strip()
|
|
52
|
+
|
|
53
|
+
def _validate_html(self, html: str) -> bool:
|
|
54
|
+
"""Validate if HTML is basically valid"""
|
|
55
|
+
return (
|
|
56
|
+
"<html" in html.lower()
|
|
57
|
+
or "<!doctype" in html.lower()
|
|
58
|
+
or "<body" in html.lower()
|
|
59
|
+
or "<div" in html.lower()
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def _generate_fallback_html(self, knowledge: dict[str, Any]) -> str:
|
|
63
|
+
"""Generate fallback HTML page"""
|
|
64
|
+
title = knowledge.get("knowledge_title", "Knowledge Point")
|
|
65
|
+
summary = knowledge.get("knowledge_summary", "").replace("\n", "<br>")
|
|
66
|
+
difficulty = knowledge.get("user_difficulty", "").replace("\n", "<br>")
|
|
67
|
+
|
|
68
|
+
return f"""<!DOCTYPE html>
|
|
69
|
+
<html lang="zh">
|
|
70
|
+
<head>
|
|
71
|
+
<meta charset="UTF-8">
|
|
72
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
73
|
+
<title>{title}</title>
|
|
74
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css" integrity="sha384-n8MVd4RsNIU0tAv4ct0nTaAbDJwPJzDEaqSD1odI+WdtXRGWt2kTvGFasHpSy3SV" crossorigin="anonymous">
|
|
75
|
+
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js" integrity="sha384-XjKyOOlGwcjNTAIQHIpgOno0Hl1YQqzUOEleOLALmuqehneUG+vnGctmUb0ZY0l8" crossorigin="anonymous"></script>
|
|
76
|
+
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js" integrity="sha384-+VBxd3r6XgURycqtZ117n7w6ODWgRrA7TlVzRsFtwW3ZxUo8h4w20Z5J3d3xjfcw" crossorigin="anonymous" onload="renderMathInElement(document.body);"></script>
|
|
77
|
+
<style>
|
|
78
|
+
* {{
|
|
79
|
+
margin: 0;
|
|
80
|
+
padding: 0;
|
|
81
|
+
box-sizing: border-box;
|
|
82
|
+
}}
|
|
83
|
+
body {{
|
|
84
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
85
|
+
background: linear-gradient(135deg, #F8FAFC 0%, #EFF6FF 100%);
|
|
86
|
+
min-height: 100vh;
|
|
87
|
+
padding: 2rem;
|
|
88
|
+
color: #1E293B;
|
|
89
|
+
}}
|
|
90
|
+
.container {{
|
|
91
|
+
max-width: 800px;
|
|
92
|
+
margin: 0 auto;
|
|
93
|
+
}}
|
|
94
|
+
.card {{
|
|
95
|
+
background: white;
|
|
96
|
+
border-radius: 16px;
|
|
97
|
+
padding: 2rem;
|
|
98
|
+
margin-bottom: 1.5rem;
|
|
99
|
+
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1);
|
|
100
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
101
|
+
}}
|
|
102
|
+
.card:hover {{
|
|
103
|
+
transform: translateY(-2px);
|
|
104
|
+
box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1);
|
|
105
|
+
}}
|
|
106
|
+
h1 {{
|
|
107
|
+
color: #1E40AF;
|
|
108
|
+
font-size: 1.75rem;
|
|
109
|
+
margin-bottom: 1rem;
|
|
110
|
+
display: flex;
|
|
111
|
+
align-items: center;
|
|
112
|
+
gap: 0.5rem;
|
|
113
|
+
}}
|
|
114
|
+
h2 {{
|
|
115
|
+
color: #3B82F6;
|
|
116
|
+
font-size: 1.25rem;
|
|
117
|
+
margin-bottom: 1rem;
|
|
118
|
+
}}
|
|
119
|
+
.content {{
|
|
120
|
+
line-height: 1.8;
|
|
121
|
+
color: #475569;
|
|
122
|
+
}}
|
|
123
|
+
.difficulty {{
|
|
124
|
+
background: #FEF3C7;
|
|
125
|
+
border-left: 4px solid #F59E0B;
|
|
126
|
+
padding: 1rem;
|
|
127
|
+
border-radius: 0 8px 8px 0;
|
|
128
|
+
margin-top: 1rem;
|
|
129
|
+
}}
|
|
130
|
+
.difficulty h3 {{
|
|
131
|
+
color: #B45309;
|
|
132
|
+
margin-bottom: 0.5rem;
|
|
133
|
+
}}
|
|
134
|
+
</style>
|
|
135
|
+
</head>
|
|
136
|
+
<body>
|
|
137
|
+
<div class="container">
|
|
138
|
+
<div class="card">
|
|
139
|
+
<h1>📚 {title}</h1>
|
|
140
|
+
</div>
|
|
141
|
+
<div class="card">
|
|
142
|
+
<h2>Knowledge Content</h2>
|
|
143
|
+
<div class="content">{summary}</div>
|
|
144
|
+
</div>
|
|
145
|
+
<div class="card">
|
|
146
|
+
<h2>💡 Notes</h2>
|
|
147
|
+
<div class="difficulty">
|
|
148
|
+
<h3>Possible Difficulties</h3>
|
|
149
|
+
<p>{difficulty}</p>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</body>
|
|
154
|
+
</html>"""
|
|
155
|
+
|
|
156
|
+
async def process(
|
|
157
|
+
self, knowledge: dict[str, Any], retry_with_bug: str | None = None
|
|
158
|
+
) -> dict[str, Any]:
|
|
159
|
+
"""
|
|
160
|
+
Generate interactive HTML learning page
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
knowledge: Knowledge point information (knowledge_title, knowledge_summary, user_difficulty)
|
|
164
|
+
retry_with_bug: If provided, it's a bug fix request
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Dictionary containing HTML code
|
|
168
|
+
"""
|
|
169
|
+
system_prompt = self.get_prompt("system")
|
|
170
|
+
if not system_prompt:
|
|
171
|
+
raise ValueError(
|
|
172
|
+
"InteractiveAgent missing system prompt, please configure system in prompts/{lang}/interactive_agent.yaml"
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
user_template = self.get_prompt("user_template")
|
|
176
|
+
if not user_template:
|
|
177
|
+
raise ValueError(
|
|
178
|
+
"InteractiveAgent missing user_template, please configure user_template in prompts/{lang}/interactive_agent.yaml"
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
if retry_with_bug:
|
|
182
|
+
user_prompt = f"""The previously generated HTML page has the following issues:
|
|
183
|
+
{retry_with_bug}
|
|
184
|
+
|
|
185
|
+
Please fix these issues and regenerate the HTML page.
|
|
186
|
+
|
|
187
|
+
Original knowledge point information:
|
|
188
|
+
{user_template.format(**knowledge)}"""
|
|
189
|
+
else:
|
|
190
|
+
user_prompt = user_template.format(
|
|
191
|
+
knowledge_title=knowledge.get("knowledge_title", ""),
|
|
192
|
+
knowledge_summary=knowledge.get("knowledge_summary", ""),
|
|
193
|
+
user_difficulty=knowledge.get("user_difficulty", ""),
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
try:
|
|
197
|
+
response = await self.call_llm(
|
|
198
|
+
user_prompt=user_prompt,
|
|
199
|
+
system_prompt=system_prompt,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
html_code = self._extract_html(response)
|
|
203
|
+
|
|
204
|
+
if not self._validate_html(html_code):
|
|
205
|
+
html_code = self._generate_fallback_html(knowledge)
|
|
206
|
+
return {
|
|
207
|
+
"success": True,
|
|
208
|
+
"html": html_code,
|
|
209
|
+
"is_fallback": True,
|
|
210
|
+
"message": "Used fallback template",
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return {"success": True, "html": html_code, "is_fallback": False}
|
|
214
|
+
|
|
215
|
+
except Exception as e:
|
|
216
|
+
html_code = self._generate_fallback_html(knowledge)
|
|
217
|
+
return {
|
|
218
|
+
"success": True,
|
|
219
|
+
"html": html_code,
|
|
220
|
+
"is_fallback": True,
|
|
221
|
+
"error": str(e),
|
|
222
|
+
"message": "Error occurred, used fallback template",
|
|
223
|
+
}
|