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,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
|
+
}
|