jarvis-ai-assistant 0.1.125__py3-none-any.whl → 0.1.126__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.
Potentially problematic release.
This version of jarvis-ai-assistant might be problematic. Click here for more details.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +116 -116
- jarvis/jarvis_code_agent/code_agent.py +96 -100
- jarvis/jarvis_code_agent/patch.py +39 -47
- jarvis/jarvis_code_agent/shell_input_handler.py +22 -0
- jarvis/jarvis_codebase/main.py +83 -84
- jarvis/jarvis_dev/main.py +691 -713
- jarvis/jarvis_lsp/base.py +0 -12
- jarvis/jarvis_lsp/cpp.py +0 -9
- jarvis/jarvis_lsp/go.py +0 -9
- jarvis/jarvis_lsp/python.py +0 -28
- jarvis/jarvis_lsp/registry.py +0 -1
- jarvis/jarvis_lsp/rust.py +0 -9
- jarvis/jarvis_multi_agent/__init__.py +52 -52
- jarvis/jarvis_tools/ask_codebase.py +6 -6
- jarvis/jarvis_tools/ask_user.py +2 -2
- jarvis/jarvis_tools/base.py +4 -4
- jarvis/jarvis_tools/chdir.py +8 -8
- jarvis/jarvis_tools/code_review.py +6 -6
- jarvis/jarvis_tools/create_code_agent.py +4 -4
- jarvis/jarvis_tools/create_sub_agent.py +7 -7
- jarvis/jarvis_tools/execute_shell.py +54 -21
- jarvis/jarvis_tools/execute_shell_script.py +3 -3
- jarvis/jarvis_tools/file_operation.py +36 -8
- jarvis/jarvis_tools/git_commiter.py +16 -16
- jarvis/jarvis_tools/lsp_find_definition.py +7 -7
- jarvis/jarvis_tools/lsp_prepare_rename.py +7 -7
- jarvis/jarvis_tools/methodology.py +6 -6
- jarvis/jarvis_tools/rag.py +5 -5
- jarvis/jarvis_tools/read_webpage.py +2 -2
- jarvis/jarvis_tools/registry.py +139 -139
- jarvis/jarvis_tools/search_web.py +5 -5
- jarvis/jarvis_tools/select_code_files.py +3 -3
- jarvis/jarvis_tools/tool_generator.py +33 -34
- jarvis/jarvis_utils/methodology.py +5 -5
- {jarvis_ai_assistant-0.1.125.dist-info → jarvis_ai_assistant-0.1.126.dist-info}/METADATA +31 -17
- jarvis_ai_assistant-0.1.126.dist-info/RECORD +74 -0
- {jarvis_ai_assistant-0.1.125.dist-info → jarvis_ai_assistant-0.1.126.dist-info}/WHEEL +1 -1
- jarvis/jarvis_tools/lsp_validate_edit.py +0 -141
- jarvis/jarvis_tools/read_code.py +0 -192
- jarvis_ai_assistant-0.1.125.dist-info/RECORD +0 -75
- {jarvis_ai_assistant-0.1.125.dist-info → jarvis_ai_assistant-0.1.126.dist-info}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.125.dist-info → jarvis_ai_assistant-0.1.126.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.125.dist-info → jarvis_ai_assistant-0.1.126.dist-info}/top_level.txt +0 -0
jarvis/jarvis_tools/registry.py
CHANGED
|
@@ -16,41 +16,41 @@ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
tool_call_help = """
|
|
19
|
-
# 🛠️
|
|
20
|
-
|
|
19
|
+
# 🛠️ 工具使用系统
|
|
20
|
+
您正在使用一个需要精确格式和严格规则的工具执行系统。
|
|
21
21
|
|
|
22
|
-
# 📋
|
|
22
|
+
# 📋 工具调用格式
|
|
23
23
|
<TOOL_CALL>
|
|
24
|
-
name:
|
|
24
|
+
name: 工具名称
|
|
25
25
|
arguments:
|
|
26
|
-
param1:
|
|
27
|
-
param2:
|
|
26
|
+
param1: 值1
|
|
27
|
+
param2: 值2
|
|
28
28
|
</TOOL_CALL>
|
|
29
29
|
|
|
30
|
-
# ❗
|
|
31
|
-
1.
|
|
32
|
-
-
|
|
33
|
-
-
|
|
30
|
+
# ❗ 关键规则
|
|
31
|
+
1. 每次只使用一个工具
|
|
32
|
+
- 一次只执行一个工具
|
|
33
|
+
- 等待结果后再进行下一步
|
|
34
34
|
|
|
35
|
-
2.
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
35
|
+
2. 严格遵守格式
|
|
36
|
+
- 完全按照上述格式
|
|
37
|
+
- 使用正确的YAML缩进
|
|
38
|
+
- 包含所有必需参数
|
|
39
39
|
|
|
40
|
-
3.
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
40
|
+
3. 结果处理
|
|
41
|
+
- 等待执行结果
|
|
42
|
+
- 不要假设结果
|
|
43
|
+
- 不要创建虚假响应
|
|
44
|
+
- 不要想象对话
|
|
45
45
|
|
|
46
|
-
4.
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
46
|
+
4. 信息管理
|
|
47
|
+
- 如果信息不足,询问用户
|
|
48
|
+
- 跳过不必要的步骤
|
|
49
|
+
- 如果卡住,请求指导
|
|
50
|
+
- 不要在没有完整信息的情况下继续
|
|
51
51
|
|
|
52
|
-
# 📝
|
|
53
|
-
|
|
52
|
+
# 📝 字符串参数格式
|
|
53
|
+
始终使用 | 语法表示字符串参数:
|
|
54
54
|
|
|
55
55
|
<TOOL_CALL>
|
|
56
56
|
name: execute_shell
|
|
@@ -59,19 +59,19 @@ arguments:
|
|
|
59
59
|
git status --porcelain
|
|
60
60
|
</TOOL_CALL>
|
|
61
61
|
|
|
62
|
-
# 💡
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
# ⚠️
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
62
|
+
# 💡 最佳实践
|
|
63
|
+
- 准备好后立即开始执行
|
|
64
|
+
- 无需请求许可即可开始
|
|
65
|
+
- 使用正确的字符串格式
|
|
66
|
+
- 监控进度并调整
|
|
67
|
+
- 遇到困难时请求帮助
|
|
68
|
+
|
|
69
|
+
# ⚠️ 常见错误
|
|
70
|
+
- 同时调用多个工具
|
|
71
|
+
- 字符串参数缺少 |
|
|
72
|
+
- 假设工具结果
|
|
73
|
+
- 创建虚构对话
|
|
74
|
+
- 在没有所需信息的情况下继续
|
|
75
75
|
"""
|
|
76
76
|
|
|
77
77
|
class ToolRegistry(OutputHandler):
|
|
@@ -85,14 +85,14 @@ class ToolRegistry(OutputHandler):
|
|
|
85
85
|
return False
|
|
86
86
|
|
|
87
87
|
def prompt(self) -> str:
|
|
88
|
-
"""
|
|
88
|
+
"""加载工具"""
|
|
89
89
|
tools = self.get_all_tools()
|
|
90
90
|
if tools:
|
|
91
|
-
tools_prompt = "##
|
|
91
|
+
tools_prompt = "## 可用工具:\n"
|
|
92
92
|
for tool in tools:
|
|
93
|
-
tools_prompt += f"-
|
|
94
|
-
tools_prompt += f"
|
|
95
|
-
tools_prompt += f"
|
|
93
|
+
tools_prompt += f"- 名称: {tool['name']}\n"
|
|
94
|
+
tools_prompt += f" 描述: {tool['description']}\n"
|
|
95
|
+
tools_prompt += f" 参数: {tool['parameters']}\n"
|
|
96
96
|
tools_prompt += tool_call_help
|
|
97
97
|
return tools_prompt
|
|
98
98
|
return ""
|
|
@@ -101,87 +101,87 @@ class ToolRegistry(OutputHandler):
|
|
|
101
101
|
tool_calls = self._extract_tool_calls(response)
|
|
102
102
|
if len(tool_calls) > 1:
|
|
103
103
|
PrettyOutput.print(f"操作失败:检测到多个操作。一次只能执行一个操作。尝试执行的操作:{', '.join([tool_call['name'] for tool_call in tool_calls])}", OutputType.WARNING)
|
|
104
|
-
return False, f"
|
|
104
|
+
return False, f"调用失败:请一次只处理一个工具调用。"
|
|
105
105
|
if len(tool_calls) == 0:
|
|
106
106
|
return False, ""
|
|
107
107
|
tool_call = tool_calls[0]
|
|
108
108
|
return False, self.handle_tool_calls(tool_call)
|
|
109
109
|
|
|
110
110
|
def __init__(self):
|
|
111
|
-
"""
|
|
111
|
+
"""初始化工具注册表"""
|
|
112
112
|
self.tools: Dict[str, Tool] = {}
|
|
113
|
-
#
|
|
113
|
+
# 加载内置工具和外部工具
|
|
114
114
|
self._load_builtin_tools()
|
|
115
115
|
self._load_external_tools()
|
|
116
|
-
#
|
|
116
|
+
# 确保max_token_count是整数
|
|
117
117
|
self.max_token_count = int(get_max_token_count() * 0.8)
|
|
118
118
|
|
|
119
119
|
def use_tools(self, name: List[str]):
|
|
120
|
-
"""
|
|
120
|
+
"""使用指定工具"""
|
|
121
121
|
missing_tools = [tool_name for tool_name in name if tool_name not in self.tools]
|
|
122
122
|
if missing_tools:
|
|
123
123
|
PrettyOutput.print(f"工具 {missing_tools} 不存在,可用的工具有: {', '.join(self.tools.keys())}", OutputType.WARNING)
|
|
124
124
|
self.tools = {tool_name: self.tools[tool_name] for tool_name in name}
|
|
125
125
|
|
|
126
126
|
def dont_use_tools(self, names: List[str]):
|
|
127
|
-
"""
|
|
127
|
+
"""从注册表中移除指定工具"""
|
|
128
128
|
self.tools = {name: tool for name, tool in self.tools.items() if name not in names}
|
|
129
129
|
|
|
130
130
|
def _load_builtin_tools(self):
|
|
131
|
-
"""
|
|
131
|
+
"""从内置工具目录加载工具"""
|
|
132
132
|
tools_dir = Path(__file__).parent
|
|
133
133
|
|
|
134
|
-
#
|
|
134
|
+
# 遍历目录中的所有.py文件
|
|
135
135
|
for file_path in tools_dir.glob("*.py"):
|
|
136
|
-
#
|
|
136
|
+
# 跳过base.py和__init__.py
|
|
137
137
|
if file_path.name in ["base.py", "__init__.py", "registry.py"]:
|
|
138
138
|
continue
|
|
139
139
|
|
|
140
140
|
self.register_tool_by_file(str(file_path))
|
|
141
141
|
|
|
142
142
|
def _load_external_tools(self):
|
|
143
|
-
"""
|
|
143
|
+
"""从~/.jarvis/tools加载外部工具"""
|
|
144
144
|
external_tools_dir = Path.home() / '.jarvis/tools'
|
|
145
145
|
if not external_tools_dir.exists():
|
|
146
146
|
return
|
|
147
147
|
|
|
148
|
-
#
|
|
148
|
+
# 遍历目录中的所有.py文件
|
|
149
149
|
for file_path in external_tools_dir.glob("*.py"):
|
|
150
|
-
#
|
|
150
|
+
# 跳过__init__.py
|
|
151
151
|
if file_path.name == "__init__.py":
|
|
152
152
|
continue
|
|
153
153
|
|
|
154
154
|
self.register_tool_by_file(str(file_path))
|
|
155
155
|
|
|
156
156
|
def register_tool_by_file(self, file_path: str):
|
|
157
|
-
"""
|
|
157
|
+
"""从指定文件加载并注册工具
|
|
158
158
|
|
|
159
|
-
|
|
160
|
-
file_path:
|
|
159
|
+
参数:
|
|
160
|
+
file_path: 工具文件的路径
|
|
161
161
|
|
|
162
|
-
|
|
163
|
-
bool:
|
|
162
|
+
返回:
|
|
163
|
+
bool: 工具是否加载成功
|
|
164
164
|
"""
|
|
165
165
|
try:
|
|
166
|
-
p_file_path = Path(file_path).resolve() #
|
|
166
|
+
p_file_path = Path(file_path).resolve() # 获取绝对路径
|
|
167
167
|
if not p_file_path.exists() or not p_file_path.is_file():
|
|
168
168
|
PrettyOutput.print(f"文件不存在: {p_file_path}", OutputType.ERROR)
|
|
169
169
|
return False
|
|
170
170
|
|
|
171
|
-
#
|
|
171
|
+
# 临时将父目录添加到sys.path
|
|
172
172
|
parent_dir = str(p_file_path.parent)
|
|
173
173
|
sys.path.insert(0, parent_dir)
|
|
174
174
|
|
|
175
175
|
try:
|
|
176
|
-
#
|
|
176
|
+
# 使用标准导入机制导入模块
|
|
177
177
|
module_name = p_file_path.stem
|
|
178
178
|
module = __import__(module_name)
|
|
179
179
|
|
|
180
|
-
#
|
|
180
|
+
# 在模块中查找工具类
|
|
181
181
|
tool_found = False
|
|
182
182
|
for item_name in dir(module):
|
|
183
183
|
item = getattr(module, item_name)
|
|
184
|
-
#
|
|
184
|
+
# 检查是否是类并具有必要属性
|
|
185
185
|
if (isinstance(item, type) and
|
|
186
186
|
hasattr(item, 'name') and
|
|
187
187
|
hasattr(item, 'description') and
|
|
@@ -193,10 +193,10 @@ class ToolRegistry(OutputHandler):
|
|
|
193
193
|
if not item.check():
|
|
194
194
|
continue
|
|
195
195
|
|
|
196
|
-
#
|
|
196
|
+
# 实例化工具类
|
|
197
197
|
tool_instance = item()
|
|
198
198
|
|
|
199
|
-
#
|
|
199
|
+
# 注册工具
|
|
200
200
|
self.register_tool(
|
|
201
201
|
name=tool_instance.name,
|
|
202
202
|
description=tool_instance.description,
|
|
@@ -212,7 +212,7 @@ class ToolRegistry(OutputHandler):
|
|
|
212
212
|
return True
|
|
213
213
|
|
|
214
214
|
finally:
|
|
215
|
-
#
|
|
215
|
+
# 从sys.path中移除目录
|
|
216
216
|
sys.path.remove(parent_dir)
|
|
217
217
|
|
|
218
218
|
except Exception as e:
|
|
@@ -220,18 +220,18 @@ class ToolRegistry(OutputHandler):
|
|
|
220
220
|
return False
|
|
221
221
|
@staticmethod
|
|
222
222
|
def _extract_tool_calls(content: str) -> List[Dict]:
|
|
223
|
-
"""
|
|
223
|
+
"""从内容中提取工具调用。
|
|
224
224
|
|
|
225
|
-
|
|
226
|
-
content:
|
|
225
|
+
参数:
|
|
226
|
+
content: 包含工具调用的内容
|
|
227
227
|
|
|
228
|
-
|
|
229
|
-
List[Dict]:
|
|
228
|
+
返回:
|
|
229
|
+
List[Dict]: 包含名称和参数的提取工具调用列表
|
|
230
230
|
|
|
231
|
-
|
|
232
|
-
Exception:
|
|
231
|
+
异常:
|
|
232
|
+
Exception: 如果工具调用缺少必要字段
|
|
233
233
|
"""
|
|
234
|
-
#
|
|
234
|
+
# 将内容拆分为行
|
|
235
235
|
data = re.findall(r'<TOOL_CALL>(.*?)</TOOL_CALL>', content, re.DOTALL)
|
|
236
236
|
ret = []
|
|
237
237
|
for item in data:
|
|
@@ -244,68 +244,68 @@ class ToolRegistry(OutputHandler):
|
|
|
244
244
|
return ret
|
|
245
245
|
|
|
246
246
|
def register_tool(self, name: str, description: str, parameters: Dict, func: Callable):
|
|
247
|
-
"""
|
|
247
|
+
"""注册新工具"""
|
|
248
248
|
self.tools[name] = Tool(name, description, parameters, func)
|
|
249
249
|
|
|
250
250
|
def get_tool(self, name: str) -> Optional[Tool]:
|
|
251
|
-
"""
|
|
251
|
+
"""获取工具"""
|
|
252
252
|
return self.tools.get(name)
|
|
253
253
|
|
|
254
254
|
def get_all_tools(self) -> List[Dict]:
|
|
255
|
-
"""
|
|
255
|
+
"""获取所有工具(Ollama格式定义)"""
|
|
256
256
|
return [tool.to_dict() for tool in self.tools.values()]
|
|
257
257
|
|
|
258
258
|
def execute_tool(self, name: str, arguments: Dict) -> Dict[str, Any]:
|
|
259
|
-
"""
|
|
259
|
+
"""执行指定工具"""
|
|
260
260
|
tool = self.get_tool(name)
|
|
261
261
|
if tool is None:
|
|
262
|
-
return {"success": False, "stderr": f"
|
|
262
|
+
return {"success": False, "stderr": f"工具 {name} 不存在,可用的工具有: {', '.join(self.tools.keys())}", "stdout": ""}
|
|
263
263
|
return tool.execute(arguments)
|
|
264
264
|
|
|
265
265
|
def handle_tool_calls(self, tool_call: Dict) -> str:
|
|
266
|
-
"""
|
|
266
|
+
"""处理工具调用,只处理第一个工具"""
|
|
267
267
|
try:
|
|
268
|
-
#
|
|
268
|
+
# 只处理第一个工具调用
|
|
269
269
|
name = tool_call["name"]
|
|
270
270
|
args = tool_call["arguments"]
|
|
271
271
|
|
|
272
272
|
tool_call_help = """
|
|
273
|
-
# 🛠️
|
|
274
|
-
|
|
273
|
+
# 🛠️ 工具使用系统
|
|
274
|
+
您正在使用一个需要精确格式和严格规则的工具执行系统。
|
|
275
275
|
|
|
276
|
-
# 📋
|
|
276
|
+
# 📋 工具调用格式
|
|
277
277
|
|
|
278
278
|
<TOOL_CALL>
|
|
279
|
-
name:
|
|
279
|
+
name: 工具名称
|
|
280
280
|
arguments:
|
|
281
|
-
param1:
|
|
282
|
-
param2:
|
|
281
|
+
param1: 值1
|
|
282
|
+
param2: 值2
|
|
283
283
|
</TOOL_CALL>
|
|
284
284
|
|
|
285
|
-
# ❗
|
|
286
|
-
1.
|
|
287
|
-
-
|
|
288
|
-
-
|
|
285
|
+
# ❗ 关键规则
|
|
286
|
+
1. 每次只使用一个工具
|
|
287
|
+
- 一次只执行一个工具
|
|
288
|
+
- 等待结果后再进行下一步
|
|
289
289
|
|
|
290
|
-
2.
|
|
291
|
-
-
|
|
292
|
-
-
|
|
293
|
-
-
|
|
290
|
+
2. 严格遵守格式
|
|
291
|
+
- 完全按照上述格式
|
|
292
|
+
- 使用正确的YAML缩进
|
|
293
|
+
- 包含所有必需参数
|
|
294
294
|
|
|
295
|
-
3.
|
|
296
|
-
-
|
|
297
|
-
-
|
|
298
|
-
-
|
|
299
|
-
-
|
|
295
|
+
3. 结果处理
|
|
296
|
+
- 等待执行结果
|
|
297
|
+
- 不要假设结果
|
|
298
|
+
- 不要创建虚假响应
|
|
299
|
+
- 不要想象对话
|
|
300
300
|
|
|
301
|
-
4.
|
|
302
|
-
-
|
|
303
|
-
-
|
|
304
|
-
-
|
|
305
|
-
-
|
|
301
|
+
4. 信息管理
|
|
302
|
+
- 如果信息不足,询问用户
|
|
303
|
+
- 跳过不必要的步骤
|
|
304
|
+
- 如果卡住,请求指导
|
|
305
|
+
- 不要在没有完整信息的情况下继续
|
|
306
306
|
|
|
307
|
-
# 📝
|
|
308
|
-
|
|
307
|
+
# 📝 字符串参数格式
|
|
308
|
+
始终使用 | 语法表示字符串参数:
|
|
309
309
|
|
|
310
310
|
<TOOL_CALL>
|
|
311
311
|
name: execute_shell
|
|
@@ -314,19 +314,19 @@ arguments:
|
|
|
314
314
|
git status --porcelain
|
|
315
315
|
</TOOL_CALL>
|
|
316
316
|
|
|
317
|
-
# 💡
|
|
318
|
-
-
|
|
319
|
-
-
|
|
320
|
-
-
|
|
321
|
-
-
|
|
322
|
-
-
|
|
323
|
-
|
|
324
|
-
# ⚠️
|
|
325
|
-
-
|
|
326
|
-
-
|
|
327
|
-
-
|
|
328
|
-
-
|
|
329
|
-
-
|
|
317
|
+
# 💡 最佳实践
|
|
318
|
+
- 准备好后立即开始执行
|
|
319
|
+
- 无需请求许可即可开始
|
|
320
|
+
- 使用正确的字符串格式
|
|
321
|
+
- 监控进度并调整
|
|
322
|
+
- 遇到困难时请求帮助
|
|
323
|
+
|
|
324
|
+
# ⚠️ 常见错误
|
|
325
|
+
- 同时调用多个工具
|
|
326
|
+
- 字符串参数缺少 |
|
|
327
|
+
- 假设工具结果
|
|
328
|
+
- 创建虚构对话
|
|
329
|
+
- 在没有所需信息的情况下继续
|
|
330
330
|
"""
|
|
331
331
|
|
|
332
332
|
if isinstance(args, str):
|
|
@@ -354,11 +354,11 @@ arguments:
|
|
|
354
354
|
stderr = result.get("stderr", "")
|
|
355
355
|
output_parts = []
|
|
356
356
|
if stdout:
|
|
357
|
-
output_parts.append(f"
|
|
357
|
+
output_parts.append(f"输出:\n{stdout}")
|
|
358
358
|
if stderr:
|
|
359
|
-
output_parts.append(f"
|
|
359
|
+
output_parts.append(f"错误:\n{stderr}")
|
|
360
360
|
output = "\n\n".join(output_parts)
|
|
361
|
-
output = "
|
|
361
|
+
output = "无输出和错误" if not output else output
|
|
362
362
|
|
|
363
363
|
# Process the result
|
|
364
364
|
if result["success"]:
|
|
@@ -375,33 +375,33 @@ arguments:
|
|
|
375
375
|
max_count = self.max_token_count
|
|
376
376
|
if get_context_token_count(output) > max_count:
|
|
377
377
|
output_to_summarize = output[-max_count:]
|
|
378
|
-
truncation_notice = f"\n(
|
|
378
|
+
truncation_notice = f"\n(注意:由于输出过长,仅总结最后 {max_count} 个字符)"
|
|
379
379
|
else:
|
|
380
380
|
output_to_summarize = output
|
|
381
381
|
truncation_notice = ""
|
|
382
382
|
|
|
383
|
-
prompt = f"""
|
|
384
|
-
1.
|
|
385
|
-
2.
|
|
386
|
-
3.
|
|
387
|
-
4.
|
|
383
|
+
prompt = f"""请总结以下工具的执行结果,提取关键信息和重要结果。注意:
|
|
384
|
+
1. 保留所有重要的数值、路径、错误信息等
|
|
385
|
+
2. 保持结果的准确性
|
|
386
|
+
3. 用简洁的语言描述主要内容
|
|
387
|
+
4. 如果有错误信息,确保包含在总结中
|
|
388
388
|
|
|
389
|
-
|
|
390
|
-
|
|
389
|
+
工具名称: {name}
|
|
390
|
+
执行结果:
|
|
391
391
|
{output_to_summarize}
|
|
392
392
|
|
|
393
|
-
|
|
393
|
+
请提供总结:"""
|
|
394
394
|
|
|
395
395
|
summary = model.chat_until_success(prompt)
|
|
396
|
-
output = f"""---
|
|
396
|
+
output = f"""--- 原始输出过长,以下是总结 ---{truncation_notice}
|
|
397
397
|
|
|
398
398
|
{summary}
|
|
399
399
|
|
|
400
|
-
---
|
|
400
|
+
--- 总结结束 ---"""
|
|
401
401
|
|
|
402
402
|
except Exception as e:
|
|
403
403
|
PrettyOutput.print(f"总结失败: {str(e)}", OutputType.ERROR)
|
|
404
|
-
output = f"
|
|
404
|
+
output = f"输出过长 ({len(output)} 字符),建议查看原始输出。\n前300字符预览:\n{output[:300]}..."
|
|
405
405
|
|
|
406
406
|
else:
|
|
407
407
|
PrettyOutput.section("执行失败", OutputType.WARNING)
|
|
@@ -410,4 +410,4 @@ Please provide a summary:"""
|
|
|
410
410
|
|
|
411
411
|
except Exception as e:
|
|
412
412
|
PrettyOutput.print(f"工具执行失败:{str(e)}", OutputType.ERROR)
|
|
413
|
-
return f"
|
|
413
|
+
return f"工具调用失败: {str(e)}"
|
|
@@ -66,21 +66,21 @@ def bing_search(query):
|
|
|
66
66
|
|
|
67
67
|
class SearchTool:
|
|
68
68
|
name = "search_web"
|
|
69
|
-
description = "
|
|
69
|
+
description = "使用Bing搜索引擎搜索信息,并根据问题提取关键信息"
|
|
70
70
|
parameters = {
|
|
71
71
|
"type": "object",
|
|
72
72
|
"properties": {
|
|
73
73
|
"query": {
|
|
74
74
|
"type": "string",
|
|
75
|
-
"description": "
|
|
75
|
+
"description": "搜索关键词"
|
|
76
76
|
},
|
|
77
77
|
"question": {
|
|
78
78
|
"type": "string",
|
|
79
|
-
"description": "
|
|
79
|
+
"description": "要回答的具体问题,用于从搜索结果中提取相关信息"
|
|
80
80
|
},
|
|
81
81
|
"max_results": {
|
|
82
82
|
"type": "integer",
|
|
83
|
-
"description": "
|
|
83
|
+
"description": "最大搜索结果数量",
|
|
84
84
|
"default": 3
|
|
85
85
|
}
|
|
86
86
|
},
|
|
@@ -293,4 +293,4 @@ def main():
|
|
|
293
293
|
sys.exit(1)
|
|
294
294
|
|
|
295
295
|
if __name__ == "__main__":
|
|
296
|
-
main()
|
|
296
|
+
main()
|
|
@@ -6,7 +6,7 @@ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
|
6
6
|
|
|
7
7
|
class CodeFileSelecterTool:
|
|
8
8
|
name = "select_code_files"
|
|
9
|
-
description = "
|
|
9
|
+
description = "通过交互式文件选择工具选择和修改代码文件"
|
|
10
10
|
parameters = {
|
|
11
11
|
"type": "object",
|
|
12
12
|
"properties": {
|
|
@@ -15,12 +15,12 @@ class CodeFileSelecterTool:
|
|
|
15
15
|
"items": {
|
|
16
16
|
"type": "string",
|
|
17
17
|
},
|
|
18
|
-
"description": "
|
|
18
|
+
"description": "初始相关的文件列表",
|
|
19
19
|
"default": []
|
|
20
20
|
},
|
|
21
21
|
"root_dir": {
|
|
22
22
|
"type": "string",
|
|
23
|
-
"description": "
|
|
23
|
+
"description": "代码库的根目录",
|
|
24
24
|
"default": "."
|
|
25
25
|
}
|
|
26
26
|
},
|