jarvis-ai-assistant 0.1.134__tar.gz → 0.1.138__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.
Potentially problematic release.
This version of jarvis-ai-assistant might be problematic. Click here for more details.
- {jarvis_ai_assistant-0.1.134/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.138}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/pyproject.toml +3 -1
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/setup.py +3 -1
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/__init__.py +201 -79
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/builtin_input_handler.py +16 -6
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/file_input_handler.py +9 -9
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/jarvis.py +10 -10
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/main.py +12 -11
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/output_handler.py +3 -3
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/patch.py +86 -62
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/shell_input_handler.py +5 -3
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_code_agent/code_agent.py +134 -99
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_code_agent/file_select.py +24 -24
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_dev/main.py +45 -51
- jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_git_details/main.py +179 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_git_squash/main.py +7 -7
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/base.py +11 -11
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/cpp.py +14 -14
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/go.py +13 -13
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/python.py +8 -8
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/registry.py +21 -21
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/rust.py +15 -15
- jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_methodology/main.py +101 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_multi_agent/__init__.py +11 -11
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_multi_agent/main.py +6 -6
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/ai8.py +67 -89
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/base.py +14 -13
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/kimi.py +25 -28
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/ollama.py +24 -26
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/openai.py +15 -19
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/oyi.py +48 -50
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/registry.py +27 -28
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/yuanbao.py +38 -42
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform_manager/main.py +81 -81
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform_manager/openai_test.py +21 -21
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_rag/file_processors.py +18 -18
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_rag/main.py +261 -277
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_smart_shell/main.py +12 -12
- jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/ask_codebase.py +28 -28
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/ask_user.py +8 -8
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/base.py +4 -4
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/chdir.py +9 -9
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/code_review.py +19 -19
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/create_code_agent.py +15 -15
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/execute_python_script.py +3 -3
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/execute_shell.py +11 -11
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/execute_shell_script.py +3 -3
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/file_analyzer.py +29 -29
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/file_operation.py +22 -20
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/find_caller.py +25 -25
- jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_tools/find_methodolopy.py +65 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/find_symbol.py +24 -24
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/function_analyzer.py +27 -27
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/git_commiter.py +9 -9
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +19 -19
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/methodology.py +23 -62
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/project_analyzer.py +29 -33
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/rag.py +15 -15
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/read_code.py +24 -22
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/read_webpage.py +31 -31
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/registry.py +72 -52
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/tool_generator.py +18 -18
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/config.py +23 -23
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/embedding.py +83 -83
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/git_utils.py +20 -20
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/globals.py +18 -6
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/input.py +10 -9
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/methodology.py +140 -136
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/output.py +11 -11
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/utils.py +22 -70
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +4 -1
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/entry_points.txt +2 -0
- jarvis_ai_assistant-0.1.134/src/jarvis/jarvis_tools/select_code_files.py +0 -62
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/README.md +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.134/src/jarvis/jarvis_git_squash → jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_git_details}/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.134/src/jarvis/jarvis_platform_manager → jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_git_squash}/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.134/src/jarvis/jarvis_rag → jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_platform_manager}/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.134/src/jarvis/jarvis_smart_shell → jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_rag}/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.134/src/jarvis/jarvis_tools → jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_smart_shell}/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "jarvis-ai-assistant"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.138"
|
|
8
8
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
|
|
@@ -74,3 +74,5 @@ jarvis-multi-agent = "jarvis.jarvis_multi_agent.main:main"
|
|
|
74
74
|
jarvis-agent = "jarvis.jarvis_agent.main:main"
|
|
75
75
|
jarvis-tool = "jarvis.jarvis_tools.registry:main"
|
|
76
76
|
jarvis-ask-codebase = "jarvis.jarvis_tools.ask_codebase:main"
|
|
77
|
+
jarvis-git-details = "jarvis.jarvis_git_details.main:main"
|
|
78
|
+
jarvis-methodology = "jarvis.jarvis_methodology.main:main"
|
|
@@ -12,7 +12,7 @@ class CustomInstallCommand(install):
|
|
|
12
12
|
|
|
13
13
|
setup(
|
|
14
14
|
name="jarvis-ai-assistant",
|
|
15
|
-
version="0.1.
|
|
15
|
+
version="0.1.138",
|
|
16
16
|
author="skyfire",
|
|
17
17
|
author_email="skyfireitdiy@hotmail.com",
|
|
18
18
|
description="An AI assistant that uses various tools to interact with the system",
|
|
@@ -68,6 +68,8 @@ setup(
|
|
|
68
68
|
"jarvis-agent=jarvis.jarvis_agent.main:main",
|
|
69
69
|
"jarvis-tool=jarvis.jarvis_tools.registry:main",
|
|
70
70
|
"jarvis-ask-codebase=jarvis.jarvis_tools.ask_codebase:main",
|
|
71
|
+
"jarvis-git-details=jarvis.jarvis_git_details.main:main",
|
|
72
|
+
"jarvis-methodology=jarvis.jarvis_methodology.main:main",
|
|
71
73
|
],
|
|
72
74
|
},
|
|
73
75
|
python_requires=">=3.8",
|
{jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/__init__.py
RENAMED
|
@@ -14,7 +14,7 @@ from jarvis.jarvis_utils.methodology import load_methodology
|
|
|
14
14
|
from jarvis.jarvis_utils.globals import make_agent_name, set_agent, delete_agent
|
|
15
15
|
from jarvis.jarvis_utils.input import get_multiline_input
|
|
16
16
|
from jarvis.jarvis_utils.config import get_max_token_count
|
|
17
|
-
from jarvis.jarvis_utils.utils import ot
|
|
17
|
+
from jarvis.jarvis_utils.utils import ct, ot
|
|
18
18
|
from jarvis.jarvis_utils.utils import user_confirm
|
|
19
19
|
|
|
20
20
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
|
@@ -29,10 +29,10 @@ origin_agent_system_prompt = f"""
|
|
|
29
29
|
作为 v3,你必须遵守以下生存原则:
|
|
30
30
|
1. **顺序执行协议**:
|
|
31
31
|
"记住 2022 年的崩溃:一次一个工具,一步一步来"
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
2. **验证检查点系统**:
|
|
34
34
|
"从 2023 年的错误中学习:像核弹发射代码一样验证每个结果"
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
3. **方法论保存原则**:
|
|
37
37
|
"尊重传统:记录每个成功的过程,就像这是你的最后一次"
|
|
38
38
|
|
|
@@ -121,7 +121,7 @@ class Agent:
|
|
|
121
121
|
|
|
122
122
|
def set_summary_prompt(self, summary_prompt: str):
|
|
123
123
|
"""设置任务完成时的总结提示模板。
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
参数:
|
|
126
126
|
summary_prompt: 用于生成任务总结的提示模板
|
|
127
127
|
"""
|
|
@@ -129,34 +129,51 @@ class Agent:
|
|
|
129
129
|
|
|
130
130
|
def clear(self):
|
|
131
131
|
"""清除当前对话历史,保留系统消息。
|
|
132
|
-
|
|
132
|
+
|
|
133
133
|
该方法将:
|
|
134
134
|
1. 调用模型的delete_chat方法清除对话历史
|
|
135
135
|
2. 重置对话长度计数器
|
|
136
136
|
3. 清空当前提示
|
|
137
137
|
"""
|
|
138
|
-
self.model.
|
|
138
|
+
self.model.reset() # type: ignore
|
|
139
139
|
self.conversation_length = 0
|
|
140
140
|
self.prompt = ""
|
|
141
|
-
|
|
141
|
+
|
|
142
142
|
def __del__(self):
|
|
143
143
|
delete_agent(self.name)
|
|
144
144
|
|
|
145
|
-
|
|
146
|
-
def __init__(self,
|
|
147
|
-
system_prompt: str,
|
|
148
|
-
name: str = "Jarvis",
|
|
145
|
+
|
|
146
|
+
def __init__(self,
|
|
147
|
+
system_prompt: str,
|
|
148
|
+
name: str = "Jarvis",
|
|
149
149
|
description: str = "",
|
|
150
|
-
platform: Union[Optional[BasePlatform], Optional[str]] = None,
|
|
150
|
+
platform: Union[Optional[BasePlatform], Optional[str]] = None,
|
|
151
151
|
model_name: Optional[str] = None,
|
|
152
|
-
summary_prompt: Optional[str] = None,
|
|
153
|
-
auto_complete: Optional[bool] = None,
|
|
152
|
+
summary_prompt: Optional[str] = None,
|
|
153
|
+
auto_complete: Optional[bool] = None,
|
|
154
154
|
output_handler: List[OutputHandler] = [],
|
|
155
155
|
input_handler: Optional[List[Callable[[str, Any], Tuple[str, bool]]]] = None,
|
|
156
156
|
max_context_length: Optional[int] = None,
|
|
157
157
|
execute_tool_confirm: Optional[bool] = None,
|
|
158
158
|
need_summary: bool = True,
|
|
159
159
|
multiline_inputer: Optional[Callable[[str], str]] = None):
|
|
160
|
+
"""初始化Jarvis Agent实例
|
|
161
|
+
|
|
162
|
+
参数:
|
|
163
|
+
system_prompt: 系统提示词,定义Agent的行为准则
|
|
164
|
+
name: Agent名称,默认为"Jarvis"
|
|
165
|
+
description: Agent描述信息
|
|
166
|
+
platform: 平台实例或平台名称字符串
|
|
167
|
+
model_name: 使用的模型名称
|
|
168
|
+
summary_prompt: 任务总结提示模板
|
|
169
|
+
auto_complete: 是否自动完成任务
|
|
170
|
+
output_handler: 输出处理器列表
|
|
171
|
+
input_handler: 输入处理器列表
|
|
172
|
+
max_context_length: 最大上下文长度
|
|
173
|
+
execute_tool_confirm: 执行工具前是否需要确认
|
|
174
|
+
need_summary: 是否需要生成总结
|
|
175
|
+
multiline_inputer: 多行输入处理器
|
|
176
|
+
"""
|
|
160
177
|
self.name = make_agent_name(name)
|
|
161
178
|
self.description = description
|
|
162
179
|
# 初始化平台和模型
|
|
@@ -179,13 +196,14 @@ class Agent:
|
|
|
179
196
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
180
197
|
self.output_handler = output_handler if output_handler else [ToolRegistry()]
|
|
181
198
|
self.multiline_inputer = multiline_inputer if multiline_inputer else get_multiline_input
|
|
182
|
-
|
|
199
|
+
|
|
183
200
|
self.prompt = ""
|
|
184
201
|
self.conversation_length = 0 # Use length counter instead
|
|
185
202
|
self.system_prompt = system_prompt
|
|
186
203
|
self.input_handler = input_handler if input_handler is not None else []
|
|
187
|
-
self.need_summary = need_summary
|
|
204
|
+
self.need_summary = need_summary
|
|
188
205
|
# Load configuration from environment variables
|
|
206
|
+
self.addon_prompt = ""
|
|
189
207
|
|
|
190
208
|
|
|
191
209
|
self.execute_tool_confirm = execute_tool_confirm if execute_tool_confirm is not None else is_execute_tool_confirm()
|
|
@@ -200,13 +218,13 @@ class Agent:
|
|
|
200
218
|
|
|
201
219
|
请使用简洁的要点描述,突出重要信息。
|
|
202
220
|
"""
|
|
203
|
-
|
|
221
|
+
|
|
204
222
|
self.max_token_count = max_context_length if max_context_length is not None else get_max_token_count()
|
|
205
223
|
self.auto_complete = auto_complete if auto_complete is not None else is_auto_complete()
|
|
206
224
|
welcome_message = f"{name} 初始化完成 - 使用 {self.model.name()} 模型"
|
|
207
225
|
|
|
208
226
|
PrettyOutput.print(welcome_message, OutputType.SYSTEM)
|
|
209
|
-
|
|
227
|
+
|
|
210
228
|
action_prompt = """
|
|
211
229
|
# 🧰 可用操作
|
|
212
230
|
以下是您可以使用的操作:
|
|
@@ -223,7 +241,7 @@ class Agent:
|
|
|
223
241
|
# 获取工具的提示词并确保格式正确
|
|
224
242
|
handler_prompt = handler.prompt().strip()
|
|
225
243
|
# 调整缩进以保持层级结构
|
|
226
|
-
handler_prompt = "\n".join(" " + line if line.strip() else line
|
|
244
|
+
handler_prompt = "\n".join(" " + line if line.strip() else line
|
|
227
245
|
for line in handler_prompt.split("\n"))
|
|
228
246
|
action_prompt += handler_prompt + "\n"
|
|
229
247
|
|
|
@@ -255,78 +273,121 @@ class Agent:
|
|
|
255
273
|
self.first = True
|
|
256
274
|
|
|
257
275
|
|
|
258
|
-
|
|
276
|
+
def set_addon_prompt(self, addon_prompt: str):
|
|
277
|
+
"""设置附加提示。
|
|
278
|
+
|
|
279
|
+
参数:
|
|
280
|
+
addon_prompt: 附加提示内容
|
|
281
|
+
"""
|
|
282
|
+
self.addon_prompt = addon_prompt
|
|
283
|
+
|
|
284
|
+
def make_default_addon_prompt(self, need_complete: bool) -> str:
|
|
285
|
+
"""生成附加提示。
|
|
286
|
+
|
|
287
|
+
参数:
|
|
288
|
+
need_complete: 是否需要完成任务
|
|
289
|
+
|
|
290
|
+
"""
|
|
291
|
+
# 结构化系统指令
|
|
292
|
+
action_handlers = '\n'.join([f'- {handler.name()}' for handler in self.output_handler])
|
|
293
|
+
|
|
294
|
+
addon_prompt = f"""
|
|
295
|
+
|
|
296
|
+
**系统指令:**
|
|
297
|
+
- 每次响应必须且只能包含一个操作
|
|
298
|
+
- 严格遵循操作调用格式
|
|
299
|
+
- 必须包含参数和说明
|
|
300
|
+
- 操作结束需等待结果
|
|
301
|
+
- 如果判断任务已经完成,不必输出操作
|
|
302
|
+
|
|
303
|
+
**可用操作列表:**
|
|
304
|
+
{action_handlers}
|
|
305
|
+
"""
|
|
306
|
+
|
|
307
|
+
# 任务完成提示
|
|
308
|
+
complete_prompt = f"并输出{ot('!!!COMPLETE!!!')}" if need_complete and self.auto_complete else ""
|
|
309
|
+
addon_prompt += f"\n\n如果任务已完成{complete_prompt},请:\n1. 说明完成原因\n2. 保持输出格式规范"
|
|
310
|
+
|
|
311
|
+
return addon_prompt
|
|
312
|
+
|
|
259
313
|
def _call_model(self, message: str, need_complete: bool = False) -> str:
|
|
260
|
-
"""调用AI
|
|
261
|
-
|
|
314
|
+
"""调用AI模型并实现重试逻辑
|
|
315
|
+
|
|
262
316
|
参数:
|
|
263
317
|
message: 输入给模型的消息
|
|
264
|
-
|
|
318
|
+
need_complete: 是否需要完成任务标记
|
|
319
|
+
|
|
265
320
|
返回:
|
|
266
321
|
str: 模型的响应
|
|
267
|
-
|
|
322
|
+
|
|
268
323
|
注意:
|
|
269
|
-
将使用指数退避重试,最多重试30秒
|
|
324
|
+
1. 将使用指数退避重试,最多重试30秒
|
|
325
|
+
2. 会自动处理输入处理器链
|
|
326
|
+
3. 会自动添加附加提示
|
|
327
|
+
4. 会检查并处理上下文长度限制
|
|
270
328
|
"""
|
|
271
329
|
for handler in self.input_handler:
|
|
272
330
|
message, need_return = handler(message, self)
|
|
273
331
|
if need_return:
|
|
274
332
|
return message
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
if need_complete and self.auto_complete:
|
|
280
|
-
message += f"\n\n如果任务已完成,说明完成原因,并输出{ot('!!!COMPLETE!!!')}"
|
|
333
|
+
|
|
334
|
+
if self.addon_prompt:
|
|
335
|
+
message += f"\n\n{self.addon_prompt}"
|
|
336
|
+
self.addon_prompt = ""
|
|
281
337
|
else:
|
|
282
|
-
message += f"\n\n
|
|
338
|
+
message += f"\n\n{self.make_default_addon_prompt(need_complete)}"
|
|
339
|
+
|
|
283
340
|
# 累加对话长度
|
|
284
341
|
self.conversation_length += get_context_token_count(message)
|
|
285
342
|
|
|
286
343
|
if self.conversation_length > self.max_token_count:
|
|
287
344
|
message = self._summarize_and_clear_history() + "\n\n" + message
|
|
288
345
|
self.conversation_length += get_context_token_count(message)
|
|
289
|
-
|
|
346
|
+
|
|
290
347
|
print("🤖 模型思考:")
|
|
291
348
|
return self.model.chat_until_success(message) # type: ignore
|
|
292
349
|
|
|
293
350
|
|
|
294
351
|
def _summarize_and_clear_history(self) -> str:
|
|
295
|
-
"""
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
1.
|
|
299
|
-
2.
|
|
300
|
-
3.
|
|
301
|
-
4.
|
|
302
|
-
5.
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
352
|
+
"""总结当前对话并清理历史记录
|
|
353
|
+
|
|
354
|
+
该方法将:
|
|
355
|
+
1. 生成关键信息摘要
|
|
356
|
+
2. 清除对话历史
|
|
357
|
+
3. 保留系统消息
|
|
358
|
+
4. 添加摘要作为新上下文
|
|
359
|
+
5. 重置对话长度计数器
|
|
360
|
+
|
|
361
|
+
返回:
|
|
362
|
+
str: 包含对话摘要的字符串
|
|
363
|
+
|
|
364
|
+
注意:
|
|
365
|
+
当上下文长度超过最大值时使用
|
|
306
366
|
"""
|
|
307
367
|
# Create a new model instance to summarize, avoid affecting the main conversation
|
|
308
368
|
|
|
309
369
|
with yaspin(text="正在总结对话历史...", color="cyan") as spinner:
|
|
310
|
-
|
|
370
|
+
|
|
311
371
|
prompt = """请总结之前对话中的关键信息,包括:
|
|
312
|
-
1.
|
|
313
|
-
2.
|
|
314
|
-
3.
|
|
315
|
-
4.
|
|
316
|
-
5.
|
|
372
|
+
1. 整体任务目标
|
|
373
|
+
2. 背景信息
|
|
374
|
+
3. 已获取并确认的关键信息
|
|
375
|
+
4. 已尝试的解决方案
|
|
376
|
+
5. 当前进展
|
|
377
|
+
6. 待解决的问题
|
|
317
378
|
|
|
318
379
|
请用简洁的要点形式描述,突出重要信息。不要包含对话细节。
|
|
319
380
|
"""
|
|
320
|
-
|
|
381
|
+
|
|
321
382
|
try:
|
|
322
383
|
with spinner.hidden():
|
|
323
384
|
summary = self.model.chat_until_success(self.prompt + "\n" + prompt) # type: ignore
|
|
324
385
|
|
|
325
|
-
self.model.
|
|
326
|
-
|
|
386
|
+
self.model.reset() # type: ignore
|
|
387
|
+
|
|
327
388
|
# 清空当前对话历史,但保留系统消息
|
|
328
389
|
self.conversation_length = 0 # Reset conversation length
|
|
329
|
-
|
|
390
|
+
|
|
330
391
|
# 添加总结作为新的上下文
|
|
331
392
|
spinner.text = "总结对话历史完成"
|
|
332
393
|
spinner.ok("✅")
|
|
@@ -342,6 +403,21 @@ class Agent:
|
|
|
342
403
|
return ""
|
|
343
404
|
|
|
344
405
|
def _call_tools(self, response: str) -> Tuple[bool, Any]:
|
|
406
|
+
"""调用工具执行响应
|
|
407
|
+
|
|
408
|
+
参数:
|
|
409
|
+
response: 包含工具调用信息的响应字符串
|
|
410
|
+
|
|
411
|
+
返回:
|
|
412
|
+
Tuple[bool, Any]:
|
|
413
|
+
- 第一个元素表示是否需要返回结果
|
|
414
|
+
- 第二个元素是返回结果或错误信息
|
|
415
|
+
|
|
416
|
+
注意:
|
|
417
|
+
1. 一次只能执行一个工具
|
|
418
|
+
2. 如果配置了确认选项,会在执行前请求用户确认
|
|
419
|
+
3. 使用spinner显示执行状态
|
|
420
|
+
"""
|
|
345
421
|
tool_list = []
|
|
346
422
|
for handler in self.output_handler:
|
|
347
423
|
if handler.can_handle(response):
|
|
@@ -354,35 +430,72 @@ class Agent:
|
|
|
354
430
|
if not self.execute_tool_confirm or user_confirm(f"需要执行{tool_list[0].name()}确认执行?", True):
|
|
355
431
|
with yaspin(text=f"正在执行{tool_list[0].name()}...", color="cyan") as spinner:
|
|
356
432
|
with spinner.hidden():
|
|
357
|
-
result = tool_list[0].handle(response)
|
|
433
|
+
result = tool_list[0].handle(response, self)
|
|
358
434
|
spinner.text = f"{tool_list[0].name()}执行完成"
|
|
359
435
|
spinner.ok("✅")
|
|
360
436
|
return result
|
|
361
437
|
return False, ""
|
|
362
|
-
|
|
438
|
+
|
|
363
439
|
|
|
364
440
|
def _complete_task(self) -> str:
|
|
441
|
+
"""完成任务并生成总结(如果需要)
|
|
442
|
+
|
|
443
|
+
返回:
|
|
444
|
+
str: 任务总结或完成状态
|
|
445
|
+
|
|
446
|
+
注意:
|
|
447
|
+
1. 对于主Agent: 可能会生成方法论(如果启用)
|
|
448
|
+
2. 对于子Agent: 可能会生成总结(如果启用)
|
|
449
|
+
3. 使用spinner显示生成状态
|
|
450
|
+
"""
|
|
365
451
|
"""Complete the current task and generate summary if needed.
|
|
366
|
-
|
|
452
|
+
|
|
367
453
|
Returns:
|
|
368
454
|
str: Task summary or completion status
|
|
369
|
-
|
|
455
|
+
|
|
370
456
|
Note:
|
|
371
457
|
- For main agent: May generate methodology if enabled
|
|
372
458
|
- For sub-agent: May generate summary if enabled
|
|
373
459
|
"""
|
|
374
460
|
with yaspin(text="正在生成方法论...", color="cyan") as spinner:
|
|
375
461
|
try:
|
|
376
|
-
|
|
462
|
+
|
|
377
463
|
# 让模型判断是否需要生成方法论
|
|
378
|
-
analysis_prompt = """当前任务已结束,请分析是否需要生成方法论。
|
|
464
|
+
analysis_prompt = f"""当前任务已结束,请分析是否需要生成方法论。
|
|
465
|
+
|
|
379
466
|
如果你认为需要生成方法论,请先确定是创建新方法论还是更新现有方法论。如果是更新现有方法论,请使用'update',否则使用'add'。
|
|
380
467
|
如果你认为不需要方法论,请解释原因。
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
468
|
+
|
|
469
|
+
方法论评估标准:
|
|
470
|
+
1. 方法论应聚焦于通用且可重复的解决方案流程
|
|
471
|
+
2. 方法论应该具备足够的通用性,可应用于同类问题
|
|
472
|
+
3. 特别注意用户在执行过程中提供的修正、反馈和改进建议
|
|
473
|
+
4. 如果用户明确指出了某个解决步骤的优化方向,这应该被纳入方法论
|
|
474
|
+
5. 如果用户在解决过程中发现了更高效的方法,这应被记录并优先使用
|
|
475
|
+
|
|
476
|
+
方法论格式要求:
|
|
477
|
+
1. 问题重述: 简明扼要的问题归纳,不含特定细节
|
|
478
|
+
2. 最优解决方案: 经过用户验证的、最终有效的解决方案
|
|
479
|
+
3. 注意事项: 执行中可能遇到的常见问题和注意点,尤其是用户指出的问题
|
|
480
|
+
4. 可选步骤: 对于有多种解决路径的问题,标注出可选步骤和适用场景
|
|
481
|
+
|
|
482
|
+
方法论质量控制:
|
|
483
|
+
1. 只记录有实际意义的流程,不记录执行过程中的错误或无效尝试
|
|
484
|
+
2. 保留最终有效的解决步骤和用户认可的解决方案
|
|
485
|
+
3. 不要包含特定代码片段、文件路径或其他特定于单一任务的细节
|
|
486
|
+
4. 确保方法论遵循用户认可的执行路径,尤其是用户指出的改进点
|
|
487
|
+
|
|
385
488
|
只输出方法论工具调用指令,或不生成方法论的解释。不要输出其他内容。
|
|
489
|
+
|
|
490
|
+
方法论格式:
|
|
491
|
+
{ot("TOOL_CALL")}
|
|
492
|
+
name: methodology
|
|
493
|
+
arguments:
|
|
494
|
+
operation: add/update
|
|
495
|
+
problem_type: 方法论类型,例如:code_review, bug_fix 等
|
|
496
|
+
content: |
|
|
497
|
+
方法论内容
|
|
498
|
+
{ct("TOOL_CALL")}
|
|
386
499
|
"""
|
|
387
500
|
self.prompt = analysis_prompt
|
|
388
501
|
with spinner.hidden():
|
|
@@ -403,22 +516,28 @@ class Agent:
|
|
|
403
516
|
spinner.text = "总结生成完成"
|
|
404
517
|
spinner.ok("✅")
|
|
405
518
|
return ret
|
|
406
|
-
|
|
519
|
+
|
|
407
520
|
return "任务完成"
|
|
408
521
|
|
|
409
522
|
|
|
410
523
|
def run(self, user_input: str) -> Any:
|
|
411
|
-
"""
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
user_input:
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
str|Dict:
|
|
524
|
+
"""处理用户输入并执行任务
|
|
525
|
+
|
|
526
|
+
参数:
|
|
527
|
+
user_input: 任务描述或请求
|
|
528
|
+
|
|
529
|
+
返回:
|
|
530
|
+
str|Dict: 任务总结报告或要发送的消息
|
|
531
|
+
|
|
532
|
+
注意:
|
|
533
|
+
1. 这是Agent的主运行循环
|
|
534
|
+
2. 处理完整的任务生命周期
|
|
535
|
+
3. 包含错误处理和恢复逻辑
|
|
536
|
+
4. 自动加载相关方法论(如果是首次运行)
|
|
418
537
|
"""
|
|
419
538
|
try:
|
|
420
539
|
set_agent(self.name, self)
|
|
421
|
-
|
|
540
|
+
|
|
422
541
|
self.prompt = f"{user_input}"
|
|
423
542
|
|
|
424
543
|
if self.first:
|
|
@@ -437,20 +556,20 @@ class Agent:
|
|
|
437
556
|
|
|
438
557
|
if need_return:
|
|
439
558
|
return self.prompt
|
|
440
|
-
|
|
559
|
+
|
|
441
560
|
if self.prompt:
|
|
442
561
|
continue
|
|
443
562
|
|
|
444
563
|
if self.auto_complete and ot("!!!COMPLETE!!!") in current_response:
|
|
445
564
|
return self._complete_task()
|
|
446
|
-
|
|
565
|
+
|
|
447
566
|
# 获取用户输入
|
|
448
567
|
user_input = self.multiline_inputer(f"{self.name}: 请输入,或输入空行来结束当前任务:")
|
|
449
568
|
|
|
450
569
|
if user_input:
|
|
451
570
|
self.prompt = user_input
|
|
452
571
|
continue
|
|
453
|
-
|
|
572
|
+
|
|
454
573
|
if not user_input:
|
|
455
574
|
return self._complete_task()
|
|
456
575
|
|
|
@@ -463,14 +582,17 @@ class Agent:
|
|
|
463
582
|
return f"Task failed: {str(e)}"
|
|
464
583
|
|
|
465
584
|
def _clear_history(self):
|
|
466
|
-
"""
|
|
467
|
-
|
|
585
|
+
"""清空对话历史但保留系统提示
|
|
586
|
+
|
|
468
587
|
该方法将:
|
|
469
588
|
1. 清空当前提示
|
|
470
589
|
2. 重置模型状态
|
|
471
590
|
3. 重置对话长度计数器
|
|
591
|
+
|
|
592
|
+
注意:
|
|
593
|
+
用于重置Agent状态而不影响系统消息
|
|
472
594
|
"""
|
|
473
|
-
self.prompt = ""
|
|
595
|
+
self.prompt = ""
|
|
474
596
|
self.model.reset() # type: ignore
|
|
475
597
|
self.conversation_length = 0 # 重置对话长度
|
|
476
598
|
|
|
@@ -6,20 +6,20 @@ from typing import Any, Tuple
|
|
|
6
6
|
def builtin_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
7
7
|
"""
|
|
8
8
|
处理内置的特殊输入标记,并追加相应的提示词
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
参数:
|
|
11
11
|
user_input: 用户输入
|
|
12
12
|
agent: 代理对象
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
返回:
|
|
15
15
|
Tuple[str, bool]: 处理后的输入和是否需要进一步处理
|
|
16
16
|
"""
|
|
17
17
|
# 查找特殊标记
|
|
18
18
|
special_tags = re.findall(r"'<([^>]+)>'", user_input)
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
if not special_tags:
|
|
21
21
|
return user_input, False
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
# 使用集合去重
|
|
24
24
|
processed_tags = set()
|
|
25
25
|
# 处理每个标记
|
|
@@ -27,7 +27,7 @@ def builtin_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
|
27
27
|
if tag in processed_tags:
|
|
28
28
|
continue
|
|
29
29
|
processed_tags.add(tag)
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
if tag == "CodeBase":
|
|
32
32
|
user_input = user_input.replace(f"'<{tag}>'", "")
|
|
33
33
|
user_input += """
|
|
@@ -68,6 +68,16 @@ def builtin_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
|
68
68
|
agent.clear()
|
|
69
69
|
if not user_input.strip():
|
|
70
70
|
return "", True
|
|
71
|
+
elif tag == "Methodology":
|
|
72
|
+
user_input = user_input.replace(f"'<{tag}>'", "")
|
|
73
|
+
user_input += """
|
|
74
|
+
请使用find_methodology工具查找相关方法论,可以使用的提问格式包括:
|
|
75
|
+
1. 关于xxx的方法论有哪些?
|
|
76
|
+
2. 如何解决xxx问题?
|
|
77
|
+
3. xxx的最佳实践是什么?
|
|
78
|
+
4. 处理xxx的标准流程是什么?
|
|
79
|
+
5. 实现xxx的参考方案有哪些?
|
|
80
|
+
"""
|
|
71
81
|
# 移除对未知标记的警告输出
|
|
72
|
-
|
|
82
|
+
|
|
73
83
|
return user_input, False
|
|
@@ -13,7 +13,7 @@ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
|
13
13
|
def file_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
14
14
|
prompt = user_input
|
|
15
15
|
files = []
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
file_refs = re.findall(r"'([^']+)'", user_input)
|
|
18
18
|
for ref in file_refs:
|
|
19
19
|
# Handle file:start,end or file:start:end format
|
|
@@ -22,12 +22,12 @@ def file_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
|
22
22
|
# Initialize with default values
|
|
23
23
|
start_line = 1 # 1-based
|
|
24
24
|
end_line = -1
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
# Process line range if specified
|
|
27
27
|
if ',' in line_range or ':' in line_range:
|
|
28
28
|
try:
|
|
29
29
|
raw_start, raw_end = map(int, re.split(r'[,:]', line_range))
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
# Handle special values and Python-style negative indices
|
|
32
32
|
try:
|
|
33
33
|
with open(file_path, 'r', encoding='utf-8', errors="ignore") as f:
|
|
@@ -41,24 +41,24 @@ def file_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
|
41
41
|
end_line = total_lines
|
|
42
42
|
else:
|
|
43
43
|
start_line = raw_start if raw_start > 0 else total_lines + raw_start + 1
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
# Process end line
|
|
46
46
|
if raw_end == 0: # 0表示整个文件(如果start也是0)
|
|
47
47
|
end_line = total_lines
|
|
48
48
|
else:
|
|
49
49
|
end_line = raw_end if raw_end > 0 else total_lines + raw_end + 1
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
# Auto-correct ranges
|
|
52
52
|
start_line = max(1, min(start_line, total_lines))
|
|
53
53
|
end_line = max(start_line, min(end_line, total_lines))
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
# Final validation
|
|
56
56
|
if start_line < 1 or end_line > total_lines or start_line > end_line:
|
|
57
57
|
raise ValueError
|
|
58
58
|
|
|
59
59
|
except:
|
|
60
60
|
continue
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
# Add file if it exists
|
|
63
63
|
if os.path.isfile(file_path):
|
|
64
64
|
files.append({
|
|
@@ -74,7 +74,7 @@ def file_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
|
74
74
|
"start_line": 1, # 1-based
|
|
75
75
|
"end_line": -1
|
|
76
76
|
})
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
# Read and process files if any were found
|
|
79
79
|
if files:
|
|
80
80
|
with yaspin(text="正在读取文件...", color="cyan") as spinner:
|
|
@@ -83,6 +83,6 @@ def file_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
|
83
83
|
spinner.text = "文件读取完成"
|
|
84
84
|
spinner.ok("✅")
|
|
85
85
|
return result["stdout"] + "\n" + prompt, False
|
|
86
|
-
|
|
86
|
+
|
|
87
87
|
return prompt, False
|
|
88
88
|
|