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.
Files changed (276) hide show
  1. realtimex_deeptutor/__init__.py +67 -0
  2. realtimex_deeptutor-0.5.0.post1.dist-info/METADATA +1612 -0
  3. realtimex_deeptutor-0.5.0.post1.dist-info/RECORD +276 -0
  4. realtimex_deeptutor-0.5.0.post1.dist-info/WHEEL +5 -0
  5. realtimex_deeptutor-0.5.0.post1.dist-info/entry_points.txt +2 -0
  6. realtimex_deeptutor-0.5.0.post1.dist-info/licenses/LICENSE +661 -0
  7. realtimex_deeptutor-0.5.0.post1.dist-info/top_level.txt +2 -0
  8. src/__init__.py +40 -0
  9. src/agents/__init__.py +24 -0
  10. src/agents/base_agent.py +657 -0
  11. src/agents/chat/__init__.py +24 -0
  12. src/agents/chat/chat_agent.py +435 -0
  13. src/agents/chat/prompts/en/chat_agent.yaml +35 -0
  14. src/agents/chat/prompts/zh/chat_agent.yaml +35 -0
  15. src/agents/chat/session_manager.py +311 -0
  16. src/agents/co_writer/__init__.py +0 -0
  17. src/agents/co_writer/edit_agent.py +260 -0
  18. src/agents/co_writer/narrator_agent.py +423 -0
  19. src/agents/co_writer/prompts/en/edit_agent.yaml +113 -0
  20. src/agents/co_writer/prompts/en/narrator_agent.yaml +88 -0
  21. src/agents/co_writer/prompts/zh/edit_agent.yaml +113 -0
  22. src/agents/co_writer/prompts/zh/narrator_agent.yaml +88 -0
  23. src/agents/guide/__init__.py +16 -0
  24. src/agents/guide/agents/__init__.py +11 -0
  25. src/agents/guide/agents/chat_agent.py +104 -0
  26. src/agents/guide/agents/interactive_agent.py +223 -0
  27. src/agents/guide/agents/locate_agent.py +149 -0
  28. src/agents/guide/agents/summary_agent.py +150 -0
  29. src/agents/guide/guide_manager.py +500 -0
  30. src/agents/guide/prompts/en/chat_agent.yaml +41 -0
  31. src/agents/guide/prompts/en/interactive_agent.yaml +202 -0
  32. src/agents/guide/prompts/en/locate_agent.yaml +68 -0
  33. src/agents/guide/prompts/en/summary_agent.yaml +157 -0
  34. src/agents/guide/prompts/zh/chat_agent.yaml +41 -0
  35. src/agents/guide/prompts/zh/interactive_agent.yaml +626 -0
  36. src/agents/guide/prompts/zh/locate_agent.yaml +68 -0
  37. src/agents/guide/prompts/zh/summary_agent.yaml +157 -0
  38. src/agents/ideagen/__init__.py +12 -0
  39. src/agents/ideagen/idea_generation_workflow.py +426 -0
  40. src/agents/ideagen/material_organizer_agent.py +173 -0
  41. src/agents/ideagen/prompts/en/idea_generation.yaml +187 -0
  42. src/agents/ideagen/prompts/en/material_organizer.yaml +69 -0
  43. src/agents/ideagen/prompts/zh/idea_generation.yaml +187 -0
  44. src/agents/ideagen/prompts/zh/material_organizer.yaml +69 -0
  45. src/agents/question/__init__.py +24 -0
  46. src/agents/question/agents/__init__.py +18 -0
  47. src/agents/question/agents/generate_agent.py +381 -0
  48. src/agents/question/agents/relevance_analyzer.py +207 -0
  49. src/agents/question/agents/retrieve_agent.py +239 -0
  50. src/agents/question/coordinator.py +718 -0
  51. src/agents/question/example.py +109 -0
  52. src/agents/question/prompts/en/coordinator.yaml +75 -0
  53. src/agents/question/prompts/en/generate_agent.yaml +77 -0
  54. src/agents/question/prompts/en/relevance_analyzer.yaml +41 -0
  55. src/agents/question/prompts/en/retrieve_agent.yaml +32 -0
  56. src/agents/question/prompts/zh/coordinator.yaml +75 -0
  57. src/agents/question/prompts/zh/generate_agent.yaml +77 -0
  58. src/agents/question/prompts/zh/relevance_analyzer.yaml +39 -0
  59. src/agents/question/prompts/zh/retrieve_agent.yaml +30 -0
  60. src/agents/research/agents/__init__.py +23 -0
  61. src/agents/research/agents/decompose_agent.py +507 -0
  62. src/agents/research/agents/manager_agent.py +228 -0
  63. src/agents/research/agents/note_agent.py +180 -0
  64. src/agents/research/agents/rephrase_agent.py +263 -0
  65. src/agents/research/agents/reporting_agent.py +1333 -0
  66. src/agents/research/agents/research_agent.py +714 -0
  67. src/agents/research/data_structures.py +451 -0
  68. src/agents/research/main.py +188 -0
  69. src/agents/research/prompts/en/decompose_agent.yaml +89 -0
  70. src/agents/research/prompts/en/manager_agent.yaml +24 -0
  71. src/agents/research/prompts/en/note_agent.yaml +121 -0
  72. src/agents/research/prompts/en/rephrase_agent.yaml +58 -0
  73. src/agents/research/prompts/en/reporting_agent.yaml +380 -0
  74. src/agents/research/prompts/en/research_agent.yaml +173 -0
  75. src/agents/research/prompts/zh/decompose_agent.yaml +89 -0
  76. src/agents/research/prompts/zh/manager_agent.yaml +24 -0
  77. src/agents/research/prompts/zh/note_agent.yaml +121 -0
  78. src/agents/research/prompts/zh/rephrase_agent.yaml +58 -0
  79. src/agents/research/prompts/zh/reporting_agent.yaml +380 -0
  80. src/agents/research/prompts/zh/research_agent.yaml +173 -0
  81. src/agents/research/research_pipeline.py +1309 -0
  82. src/agents/research/utils/__init__.py +60 -0
  83. src/agents/research/utils/citation_manager.py +799 -0
  84. src/agents/research/utils/json_utils.py +98 -0
  85. src/agents/research/utils/token_tracker.py +297 -0
  86. src/agents/solve/__init__.py +80 -0
  87. src/agents/solve/analysis_loop/__init__.py +14 -0
  88. src/agents/solve/analysis_loop/investigate_agent.py +414 -0
  89. src/agents/solve/analysis_loop/note_agent.py +190 -0
  90. src/agents/solve/main_solver.py +862 -0
  91. src/agents/solve/memory/__init__.py +34 -0
  92. src/agents/solve/memory/citation_memory.py +353 -0
  93. src/agents/solve/memory/investigate_memory.py +226 -0
  94. src/agents/solve/memory/solve_memory.py +340 -0
  95. src/agents/solve/prompts/en/analysis_loop/investigate_agent.yaml +55 -0
  96. src/agents/solve/prompts/en/analysis_loop/note_agent.yaml +54 -0
  97. src/agents/solve/prompts/en/solve_loop/manager_agent.yaml +67 -0
  98. src/agents/solve/prompts/en/solve_loop/precision_answer_agent.yaml +62 -0
  99. src/agents/solve/prompts/en/solve_loop/response_agent.yaml +90 -0
  100. src/agents/solve/prompts/en/solve_loop/solve_agent.yaml +75 -0
  101. src/agents/solve/prompts/en/solve_loop/tool_agent.yaml +38 -0
  102. src/agents/solve/prompts/zh/analysis_loop/investigate_agent.yaml +53 -0
  103. src/agents/solve/prompts/zh/analysis_loop/note_agent.yaml +54 -0
  104. src/agents/solve/prompts/zh/solve_loop/manager_agent.yaml +66 -0
  105. src/agents/solve/prompts/zh/solve_loop/precision_answer_agent.yaml +62 -0
  106. src/agents/solve/prompts/zh/solve_loop/response_agent.yaml +90 -0
  107. src/agents/solve/prompts/zh/solve_loop/solve_agent.yaml +76 -0
  108. src/agents/solve/prompts/zh/solve_loop/tool_agent.yaml +41 -0
  109. src/agents/solve/solve_loop/__init__.py +22 -0
  110. src/agents/solve/solve_loop/citation_manager.py +74 -0
  111. src/agents/solve/solve_loop/manager_agent.py +274 -0
  112. src/agents/solve/solve_loop/precision_answer_agent.py +96 -0
  113. src/agents/solve/solve_loop/response_agent.py +301 -0
  114. src/agents/solve/solve_loop/solve_agent.py +325 -0
  115. src/agents/solve/solve_loop/tool_agent.py +470 -0
  116. src/agents/solve/utils/__init__.py +64 -0
  117. src/agents/solve/utils/config_validator.py +313 -0
  118. src/agents/solve/utils/display_manager.py +223 -0
  119. src/agents/solve/utils/error_handler.py +363 -0
  120. src/agents/solve/utils/json_utils.py +98 -0
  121. src/agents/solve/utils/performance_monitor.py +407 -0
  122. src/agents/solve/utils/token_tracker.py +541 -0
  123. src/api/__init__.py +0 -0
  124. src/api/main.py +240 -0
  125. src/api/routers/__init__.py +1 -0
  126. src/api/routers/agent_config.py +69 -0
  127. src/api/routers/chat.py +296 -0
  128. src/api/routers/co_writer.py +337 -0
  129. src/api/routers/config.py +627 -0
  130. src/api/routers/dashboard.py +18 -0
  131. src/api/routers/guide.py +337 -0
  132. src/api/routers/ideagen.py +436 -0
  133. src/api/routers/knowledge.py +821 -0
  134. src/api/routers/notebook.py +247 -0
  135. src/api/routers/question.py +537 -0
  136. src/api/routers/research.py +394 -0
  137. src/api/routers/settings.py +164 -0
  138. src/api/routers/solve.py +305 -0
  139. src/api/routers/system.py +252 -0
  140. src/api/run_server.py +61 -0
  141. src/api/utils/history.py +172 -0
  142. src/api/utils/log_interceptor.py +21 -0
  143. src/api/utils/notebook_manager.py +415 -0
  144. src/api/utils/progress_broadcaster.py +72 -0
  145. src/api/utils/task_id_manager.py +100 -0
  146. src/config/__init__.py +0 -0
  147. src/config/accessors.py +18 -0
  148. src/config/constants.py +34 -0
  149. src/config/defaults.py +18 -0
  150. src/config/schema.py +38 -0
  151. src/config/settings.py +50 -0
  152. src/core/errors.py +62 -0
  153. src/knowledge/__init__.py +23 -0
  154. src/knowledge/add_documents.py +606 -0
  155. src/knowledge/config.py +65 -0
  156. src/knowledge/example_add_documents.py +236 -0
  157. src/knowledge/extract_numbered_items.py +1039 -0
  158. src/knowledge/initializer.py +621 -0
  159. src/knowledge/kb.py +22 -0
  160. src/knowledge/manager.py +782 -0
  161. src/knowledge/progress_tracker.py +182 -0
  162. src/knowledge/start_kb.py +535 -0
  163. src/logging/__init__.py +103 -0
  164. src/logging/adapters/__init__.py +17 -0
  165. src/logging/adapters/lightrag.py +184 -0
  166. src/logging/adapters/llamaindex.py +141 -0
  167. src/logging/config.py +80 -0
  168. src/logging/handlers/__init__.py +20 -0
  169. src/logging/handlers/console.py +75 -0
  170. src/logging/handlers/file.py +201 -0
  171. src/logging/handlers/websocket.py +127 -0
  172. src/logging/logger.py +709 -0
  173. src/logging/stats/__init__.py +16 -0
  174. src/logging/stats/llm_stats.py +179 -0
  175. src/services/__init__.py +56 -0
  176. src/services/config/__init__.py +61 -0
  177. src/services/config/knowledge_base_config.py +210 -0
  178. src/services/config/loader.py +260 -0
  179. src/services/config/unified_config.py +603 -0
  180. src/services/embedding/__init__.py +45 -0
  181. src/services/embedding/adapters/__init__.py +22 -0
  182. src/services/embedding/adapters/base.py +106 -0
  183. src/services/embedding/adapters/cohere.py +127 -0
  184. src/services/embedding/adapters/jina.py +99 -0
  185. src/services/embedding/adapters/ollama.py +116 -0
  186. src/services/embedding/adapters/openai_compatible.py +96 -0
  187. src/services/embedding/client.py +159 -0
  188. src/services/embedding/config.py +156 -0
  189. src/services/embedding/provider.py +119 -0
  190. src/services/llm/__init__.py +152 -0
  191. src/services/llm/capabilities.py +313 -0
  192. src/services/llm/client.py +302 -0
  193. src/services/llm/cloud_provider.py +530 -0
  194. src/services/llm/config.py +200 -0
  195. src/services/llm/error_mapping.py +103 -0
  196. src/services/llm/exceptions.py +152 -0
  197. src/services/llm/factory.py +450 -0
  198. src/services/llm/local_provider.py +347 -0
  199. src/services/llm/providers/anthropic.py +95 -0
  200. src/services/llm/providers/base_provider.py +93 -0
  201. src/services/llm/providers/open_ai.py +83 -0
  202. src/services/llm/registry.py +71 -0
  203. src/services/llm/telemetry.py +40 -0
  204. src/services/llm/types.py +27 -0
  205. src/services/llm/utils.py +333 -0
  206. src/services/prompt/__init__.py +25 -0
  207. src/services/prompt/manager.py +206 -0
  208. src/services/rag/__init__.py +64 -0
  209. src/services/rag/components/__init__.py +29 -0
  210. src/services/rag/components/base.py +59 -0
  211. src/services/rag/components/chunkers/__init__.py +18 -0
  212. src/services/rag/components/chunkers/base.py +34 -0
  213. src/services/rag/components/chunkers/fixed.py +71 -0
  214. src/services/rag/components/chunkers/numbered_item.py +94 -0
  215. src/services/rag/components/chunkers/semantic.py +97 -0
  216. src/services/rag/components/embedders/__init__.py +14 -0
  217. src/services/rag/components/embedders/base.py +32 -0
  218. src/services/rag/components/embedders/openai.py +63 -0
  219. src/services/rag/components/indexers/__init__.py +18 -0
  220. src/services/rag/components/indexers/base.py +35 -0
  221. src/services/rag/components/indexers/graph.py +172 -0
  222. src/services/rag/components/indexers/lightrag.py +156 -0
  223. src/services/rag/components/indexers/vector.py +146 -0
  224. src/services/rag/components/parsers/__init__.py +18 -0
  225. src/services/rag/components/parsers/base.py +35 -0
  226. src/services/rag/components/parsers/markdown.py +52 -0
  227. src/services/rag/components/parsers/pdf.py +115 -0
  228. src/services/rag/components/parsers/text.py +86 -0
  229. src/services/rag/components/retrievers/__init__.py +18 -0
  230. src/services/rag/components/retrievers/base.py +34 -0
  231. src/services/rag/components/retrievers/dense.py +200 -0
  232. src/services/rag/components/retrievers/hybrid.py +164 -0
  233. src/services/rag/components/retrievers/lightrag.py +169 -0
  234. src/services/rag/components/routing.py +286 -0
  235. src/services/rag/factory.py +234 -0
  236. src/services/rag/pipeline.py +215 -0
  237. src/services/rag/pipelines/__init__.py +32 -0
  238. src/services/rag/pipelines/academic.py +44 -0
  239. src/services/rag/pipelines/lightrag.py +43 -0
  240. src/services/rag/pipelines/llamaindex.py +313 -0
  241. src/services/rag/pipelines/raganything.py +384 -0
  242. src/services/rag/service.py +244 -0
  243. src/services/rag/types.py +73 -0
  244. src/services/search/__init__.py +284 -0
  245. src/services/search/base.py +87 -0
  246. src/services/search/consolidation.py +398 -0
  247. src/services/search/providers/__init__.py +128 -0
  248. src/services/search/providers/baidu.py +188 -0
  249. src/services/search/providers/exa.py +194 -0
  250. src/services/search/providers/jina.py +161 -0
  251. src/services/search/providers/perplexity.py +153 -0
  252. src/services/search/providers/serper.py +209 -0
  253. src/services/search/providers/tavily.py +161 -0
  254. src/services/search/types.py +114 -0
  255. src/services/setup/__init__.py +34 -0
  256. src/services/setup/init.py +285 -0
  257. src/services/tts/__init__.py +16 -0
  258. src/services/tts/config.py +99 -0
  259. src/tools/__init__.py +91 -0
  260. src/tools/code_executor.py +536 -0
  261. src/tools/paper_search_tool.py +171 -0
  262. src/tools/query_item_tool.py +310 -0
  263. src/tools/question/__init__.py +15 -0
  264. src/tools/question/exam_mimic.py +616 -0
  265. src/tools/question/pdf_parser.py +211 -0
  266. src/tools/question/question_extractor.py +397 -0
  267. src/tools/rag_tool.py +173 -0
  268. src/tools/tex_chunker.py +339 -0
  269. src/tools/tex_downloader.py +253 -0
  270. src/tools/web_search.py +71 -0
  271. src/utils/config_manager.py +206 -0
  272. src/utils/document_validator.py +168 -0
  273. src/utils/error_rate_tracker.py +111 -0
  274. src/utils/error_utils.py +82 -0
  275. src/utils/json_parser.py +110 -0
  276. src/utils/network/circuit_breaker.py +79 -0
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ LocateAgent - Agent for locating and organizing knowledge points
4
+ Analyzes notebook content and generates progressive knowledge point learning plans
5
+ """
6
+
7
+ import json
8
+ from typing import Any, Optional
9
+
10
+ from src.agents.base_agent import BaseAgent
11
+
12
+
13
+ class LocateAgent(BaseAgent):
14
+ """Knowledge point location agent"""
15
+
16
+ def __init__(
17
+ self,
18
+ api_key: str,
19
+ base_url: str,
20
+ language: str = "zh",
21
+ api_version: Optional[str] = None,
22
+ binding: str = "openai",
23
+ ):
24
+ super().__init__(
25
+ module_name="guide",
26
+ agent_name="locate_agent",
27
+ api_key=api_key,
28
+ base_url=base_url,
29
+ api_version=api_version,
30
+ language=language,
31
+ binding=binding,
32
+ )
33
+
34
+ def _format_records(self, records: list[dict[str, Any]]) -> str:
35
+ """Format notebook records as readable text"""
36
+ formatted = []
37
+ for i, record in enumerate(records, 1):
38
+ record_type = record.get("type", "unknown")
39
+ title = record.get("title", "Untitled")
40
+ user_query = record.get("user_query", "")
41
+ output = record.get("output", "")
42
+
43
+ if len(output) > 2000:
44
+ output = output[:2000] + "\n...[Content truncated]..."
45
+
46
+ formatted.append(
47
+ f"""
48
+ ### Record {i} [{record_type.upper()}]
49
+ **Title**: {title}
50
+
51
+ **User Question/Input**:
52
+ {user_query}
53
+
54
+ **System Output**:
55
+ {output}
56
+ ---"""
57
+ )
58
+
59
+ return "\n".join(formatted)
60
+
61
+ async def process(
62
+ self, notebook_id: str, notebook_name: str, records: list[dict[str, Any]]
63
+ ) -> dict[str, Any]:
64
+ """
65
+ Analyze notebook content and generate knowledge point learning plan
66
+
67
+ Args:
68
+ notebook_id: Notebook ID
69
+ notebook_name: Notebook name
70
+ records: List of records in notebook
71
+
72
+ Returns:
73
+ Dictionary containing knowledge point list
74
+ """
75
+ if not records:
76
+ return {"success": False, "error": "No records in notebook", "knowledge_points": []}
77
+
78
+ system_prompt = self.get_prompt("system")
79
+ if not system_prompt:
80
+ raise ValueError(
81
+ "LocateAgent missing system prompt, please configure system in prompts/{lang}/locate_agent.yaml"
82
+ )
83
+
84
+ user_template = self.get_prompt("user_template")
85
+ if not user_template:
86
+ raise ValueError(
87
+ "LocateAgent missing user_template, please configure user_template in prompts/{lang}/locate_agent.yaml"
88
+ )
89
+
90
+ records_content = self._format_records(records)
91
+
92
+ user_prompt = user_template.format(
93
+ notebook_id=notebook_id,
94
+ notebook_name=notebook_name,
95
+ record_count=len(records),
96
+ records_content=records_content,
97
+ )
98
+
99
+ try:
100
+ response = await self.call_llm(
101
+ user_prompt=user_prompt,
102
+ system_prompt=system_prompt,
103
+ response_format={"type": "json_object"},
104
+ )
105
+
106
+ try:
107
+ result = json.loads(response)
108
+
109
+ if isinstance(result, list):
110
+ knowledge_points = result
111
+ elif isinstance(result, dict):
112
+ knowledge_points = (
113
+ result.get("knowledge_points")
114
+ or result.get("points")
115
+ or result.get("data")
116
+ or []
117
+ )
118
+ else:
119
+ knowledge_points = []
120
+
121
+ validated_points = []
122
+ for point in knowledge_points:
123
+ if isinstance(point, dict):
124
+ validated_points.append(
125
+ {
126
+ "knowledge_title": point.get(
127
+ "knowledge_title", "Unnamed knowledge point"
128
+ ),
129
+ "knowledge_summary": point.get("knowledge_summary", ""),
130
+ "user_difficulty": point.get("user_difficulty", ""),
131
+ }
132
+ )
133
+
134
+ return {
135
+ "success": True,
136
+ "knowledge_points": validated_points,
137
+ "total_points": len(validated_points),
138
+ }
139
+
140
+ except json.JSONDecodeError as e:
141
+ return {
142
+ "success": False,
143
+ "error": f"JSON parsing failed: {e!s}",
144
+ "raw_response": response,
145
+ "knowledge_points": [],
146
+ }
147
+
148
+ except Exception as e:
149
+ return {"success": False, "error": str(e), "knowledge_points": []}
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ SummaryAgent - Learning Summary Generation Agent
5
+ Generates personalized learning summary reports after users complete learning
6
+ """
7
+
8
+ from typing import Any
9
+
10
+ from src.agents.base_agent import BaseAgent
11
+
12
+
13
+ class SummaryAgent(BaseAgent):
14
+ """Learning summary agent"""
15
+
16
+ def __init__(
17
+ self,
18
+ api_key: str,
19
+ base_url: str,
20
+ language: str = "zh",
21
+ api_version: str | None = None,
22
+ binding: str = "openai",
23
+ ):
24
+ super().__init__(
25
+ module_name="guide",
26
+ agent_name="summary_agent",
27
+ api_key=api_key,
28
+ base_url=base_url,
29
+ api_version=api_version,
30
+ language=language,
31
+ )
32
+
33
+ def _format_knowledge_points(self, points: list[dict[str, Any]]) -> str:
34
+ """Format knowledge point list"""
35
+ formatted = []
36
+ for i, point in enumerate(points, 1):
37
+ formatted.append(
38
+ f"""
39
+ ### Knowledge Point {i}: {point.get("knowledge_title", "Unnamed")}
40
+ **Content Summary**: {point.get("knowledge_summary", "")}
41
+ **Potential Difficulty**: {point.get("user_difficulty", "")}
42
+ """
43
+ )
44
+ return "\n".join(formatted)
45
+
46
+ def _format_chat_history(self, history: list[dict[str, str]]) -> str:
47
+ """Format complete chat history"""
48
+ if not history:
49
+ return "(User did not ask questions during learning)"
50
+
51
+ formatted = []
52
+ current_knowledge = None
53
+
54
+ for msg in history:
55
+ role = msg.get("role", "user")
56
+ content = msg.get("content", "")
57
+ knowledge_index = msg.get("knowledge_index")
58
+
59
+ if knowledge_index is not None and knowledge_index != current_knowledge:
60
+ current_knowledge = knowledge_index
61
+ formatted.append(
62
+ f"\n--- During learning knowledge point {knowledge_index + 1} ---\n"
63
+ )
64
+
65
+ if role == "user":
66
+ formatted.append(f"**User Question**: {content}")
67
+ elif role == "assistant":
68
+ formatted.append(f"**Assistant Answer**: {content}")
69
+ elif role == "system":
70
+ formatted.append(f"_System Message: {content}_")
71
+
72
+ return "\n\n".join(formatted)
73
+
74
+ async def process(
75
+ self,
76
+ notebook_name: str,
77
+ knowledge_points: list[dict[str, Any]],
78
+ chat_history: list[dict[str, str]],
79
+ ) -> dict[str, Any]:
80
+ """
81
+ Generate learning summary report
82
+
83
+ Args:
84
+ notebook_name: Notebook name
85
+ knowledge_points: All knowledge point list
86
+ chat_history: Complete chat history
87
+
88
+ Returns:
89
+ Dictionary containing summary report
90
+ """
91
+ system_prompt = self.get_prompt("system")
92
+ if not system_prompt:
93
+ raise ValueError(
94
+ "SummaryAgent missing system prompt, please configure system in prompts/{lang}/summary_agent.yaml"
95
+ )
96
+
97
+ user_template = self.get_prompt("user_template")
98
+ if not user_template:
99
+ raise ValueError(
100
+ "SummaryAgent missing user_template, please configure user_template in prompts/{lang}/summary_agent.yaml"
101
+ )
102
+
103
+ formatted_points = self._format_knowledge_points(knowledge_points)
104
+ formatted_history = self._format_chat_history(chat_history)
105
+
106
+ user_prompt = user_template.format(
107
+ notebook_name=notebook_name,
108
+ total_points=len(knowledge_points),
109
+ all_knowledge_points=formatted_points,
110
+ full_chat_history=formatted_history,
111
+ )
112
+
113
+ try:
114
+ response = await self.call_llm(
115
+ user_prompt=user_prompt,
116
+ system_prompt=system_prompt,
117
+ )
118
+
119
+ cleaned_summary = response.strip()
120
+
121
+ import re
122
+
123
+ markdown_pattern = r"```(?:markdown)?\s*([\s\S]*?)\s*```"
124
+ match = re.search(markdown_pattern, cleaned_summary)
125
+ if match:
126
+ cleaned_summary = match.group(1).strip()
127
+
128
+ return {
129
+ "success": True,
130
+ "summary": cleaned_summary,
131
+ "notebook_name": notebook_name,
132
+ "total_points": len(knowledge_points),
133
+ "total_interactions": len([m for m in chat_history if m.get("role") == "user"]),
134
+ }
135
+
136
+ except Exception as e:
137
+ return {
138
+ "success": False,
139
+ "error": str(e),
140
+ "summary": f"""# 📊 Learning Summary
141
+
142
+ Congratulations on completing learning **{notebook_name}**!
143
+
144
+ ## Learning Overview
145
+ - Learned {len(knowledge_points)} knowledge points
146
+ - Had {len([m for m in chat_history if m.get("role") == "user"])} interactions during learning
147
+
148
+ Thank you for your hard work! Keep up this learning enthusiasm! 🎉
149
+ """,
150
+ }