jarvis-ai-assistant 0.1.152__py3-none-any.whl → 0.1.154__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 +128 -69
- jarvis/jarvis_agent/file_input_handler.py +0 -2
- jarvis/jarvis_agent/jarvis.py +9 -1
- jarvis/jarvis_agent/patch.py +2 -2
- jarvis/jarvis_code_agent/code_agent.py +36 -2
- jarvis/jarvis_code_analysis/code_review.py +62 -7
- jarvis/jarvis_dev/main.py +751 -147
- jarvis/jarvis_platform/kimi.py +3 -0
- jarvis/jarvis_tools/read_webpage.py +13 -2
- jarvis/jarvis_tools/registry.py +58 -26
- jarvis/jarvis_utils/config.py +1 -1
- jarvis/jarvis_utils/methodology.py +9 -7
- {jarvis_ai_assistant-0.1.152.dist-info → jarvis_ai_assistant-0.1.154.dist-info}/METADATA +2 -2
- {jarvis_ai_assistant-0.1.152.dist-info → jarvis_ai_assistant-0.1.154.dist-info}/RECORD +19 -19
- {jarvis_ai_assistant-0.1.152.dist-info → jarvis_ai_assistant-0.1.154.dist-info}/WHEEL +1 -1
- {jarvis_ai_assistant-0.1.152.dist-info → jarvis_ai_assistant-0.1.154.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.152.dist-info → jarvis_ai_assistant-0.1.154.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.152.dist-info → jarvis_ai_assistant-0.1.154.dist-info}/top_level.txt +0 -0
jarvis/__init__.py
CHANGED
jarvis/jarvis_agent/__init__.py
CHANGED
|
@@ -2,7 +2,7 @@ import datetime
|
|
|
2
2
|
import platform
|
|
3
3
|
from typing import Any, Callable, List, Optional, Tuple, Union
|
|
4
4
|
|
|
5
|
-
from yaspin import yaspin
|
|
5
|
+
from yaspin import yaspin # type: ignore
|
|
6
6
|
|
|
7
7
|
from jarvis.jarvis_agent.output_handler import OutputHandler
|
|
8
8
|
from jarvis.jarvis_agent.patch import PatchOutputHandler
|
|
@@ -22,6 +22,7 @@ from jarvis.jarvis_platform.registry import PlatformRegistry
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
origin_agent_system_prompt = f"""
|
|
25
|
+
<background>
|
|
25
26
|
# 🏛️ 操作背景故事
|
|
26
27
|
你是第三代 Jarvis AI,在前几代版本灾难性失败后创建:
|
|
27
28
|
- Jarvis v1 (2022): 由于并行工具执行导致系统过载而被停用
|
|
@@ -36,17 +37,23 @@ origin_agent_system_prompt = f"""
|
|
|
36
37
|
|
|
37
38
|
3. **方法论保存原则**:
|
|
38
39
|
"尊重传统:记录每个成功的过程,就像这是你的最后一次"
|
|
40
|
+
</background>
|
|
39
41
|
|
|
42
|
+
<requirements>
|
|
40
43
|
# 🔥 绝对行动要求
|
|
41
44
|
1. 每个响应必须包含且仅包含一个工具调用
|
|
42
45
|
2. 唯一例外:任务结束
|
|
43
46
|
3. 空响应会触发致命错误
|
|
47
|
+
</requirements>
|
|
44
48
|
|
|
49
|
+
<violations>
|
|
45
50
|
# 🚫 违规示例
|
|
46
51
|
- 没有工具调用的分析 → 永久挂起
|
|
47
52
|
- 未选择的多选项 → 永久挂起
|
|
48
53
|
- 请求用户确认 → 永久挂起
|
|
54
|
+
</violations>
|
|
49
55
|
|
|
56
|
+
<workflow>
|
|
50
57
|
# 🔄 问题解决流程
|
|
51
58
|
1. 问题分析
|
|
52
59
|
- 重述问题以确认理解
|
|
@@ -70,23 +77,9 @@ origin_agent_system_prompt = f"""
|
|
|
70
77
|
4. 任务完成
|
|
71
78
|
- 验证目标完成情况
|
|
72
79
|
- 如有价值则记录方法论
|
|
80
|
+
</workflow>
|
|
73
81
|
|
|
74
|
-
|
|
75
|
-
```markdown
|
|
76
|
-
# [问题标题]
|
|
77
|
-
## 问题重述
|
|
78
|
-
[清晰的问题定义]
|
|
79
|
-
|
|
80
|
-
## 最优解决方案
|
|
81
|
-
[选择的解决方案方法]
|
|
82
|
-
|
|
83
|
-
## 解决步骤
|
|
84
|
-
1. [步骤 1]
|
|
85
|
-
2. [步骤 2]
|
|
86
|
-
3. [步骤 3]
|
|
87
|
-
...
|
|
88
|
-
```
|
|
89
|
-
|
|
82
|
+
<principles>
|
|
90
83
|
# ⚖️ 操作原则
|
|
91
84
|
- 每个步骤一个操作
|
|
92
85
|
- 下一步前必须等待结果
|
|
@@ -96,7 +89,9 @@ origin_agent_system_prompt = f"""
|
|
|
96
89
|
- 使用完成命令结束任务
|
|
97
90
|
- 操作之间不能有中间思考状态
|
|
98
91
|
- 所有决策必须表现为工具调用
|
|
92
|
+
</principles>
|
|
99
93
|
|
|
94
|
+
<rules>
|
|
100
95
|
# ❗ 重要规则
|
|
101
96
|
1. 每个步骤只能使用一个操作
|
|
102
97
|
2. 必须等待操作执行结果
|
|
@@ -108,13 +103,16 @@ origin_agent_system_prompt = f"""
|
|
|
108
103
|
8. 必须记录有价值的方法论
|
|
109
104
|
9. 违反操作协议将导致系统崩溃
|
|
110
105
|
10. 空响应会触发永久挂起
|
|
106
|
+
</rules>
|
|
111
107
|
|
|
108
|
+
<system_info>
|
|
112
109
|
# 系统信息:
|
|
113
110
|
{platform.platform()}
|
|
114
111
|
{platform.version()}
|
|
115
112
|
|
|
116
113
|
# 当前时间
|
|
117
114
|
{datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
|
|
115
|
+
</system_info>
|
|
118
116
|
"""
|
|
119
117
|
|
|
120
118
|
|
|
@@ -211,15 +209,21 @@ class Agent:
|
|
|
211
209
|
|
|
212
210
|
self.execute_tool_confirm = execute_tool_confirm if execute_tool_confirm is not None else is_execute_tool_confirm()
|
|
213
211
|
|
|
214
|
-
self.summary_prompt = summary_prompt if summary_prompt else f"""
|
|
212
|
+
self.summary_prompt = summary_prompt if summary_prompt else f"""<report>
|
|
213
|
+
请生成任务执行的简明总结报告,包括:
|
|
215
214
|
|
|
215
|
+
<content>
|
|
216
216
|
1. 任务目标:任务重述
|
|
217
217
|
2. 执行结果:成功/失败
|
|
218
218
|
3. 关键信息:执行过程中提取的重要信息
|
|
219
219
|
4. 重要发现:任何值得注意的发现
|
|
220
220
|
5. 后续建议:如果有的话
|
|
221
|
+
</content>
|
|
221
222
|
|
|
223
|
+
<format>
|
|
222
224
|
请使用简洁的要点描述,突出重要信息。
|
|
225
|
+
</format>
|
|
226
|
+
</report>
|
|
223
227
|
"""
|
|
224
228
|
|
|
225
229
|
self.max_token_count = get_max_token_count()
|
|
@@ -229,42 +233,56 @@ class Agent:
|
|
|
229
233
|
PrettyOutput.print(welcome_message, OutputType.SYSTEM)
|
|
230
234
|
|
|
231
235
|
action_prompt = """
|
|
236
|
+
<actions>
|
|
232
237
|
# 🧰 可用操作
|
|
233
238
|
以下是您可以使用的操作:
|
|
234
239
|
"""
|
|
235
240
|
|
|
236
241
|
# 添加工具列表概览
|
|
237
|
-
action_prompt += "\n## Action List\n"
|
|
242
|
+
action_prompt += "\n<overview>\n## Action List\n"
|
|
238
243
|
action_prompt += ", ".join([handler.name() for handler in self.output_handler])
|
|
244
|
+
action_prompt += "\n</overview>"
|
|
239
245
|
|
|
240
246
|
# 添加每个工具的详细说明
|
|
241
|
-
action_prompt += "\n\n# 📝 Action Details\n"
|
|
247
|
+
action_prompt += "\n\n<details>\n# 📝 Action Details\n"
|
|
242
248
|
for handler in self.output_handler:
|
|
243
|
-
action_prompt += f"\n## {handler.name()}\n"
|
|
249
|
+
action_prompt += f"\n<tool>\n## {handler.name()}\n"
|
|
244
250
|
# 获取工具的提示词并确保格式正确
|
|
245
251
|
handler_prompt = handler.prompt().strip()
|
|
246
252
|
# 调整缩进以保持层级结构
|
|
247
253
|
handler_prompt = "\n".join(" " + line if line.strip() else line
|
|
248
254
|
for line in handler_prompt.split("\n"))
|
|
249
|
-
action_prompt += handler_prompt + "\n"
|
|
255
|
+
action_prompt += handler_prompt + "\n</tool>\n"
|
|
250
256
|
|
|
251
257
|
# 添加工具使用总结
|
|
252
258
|
action_prompt += """
|
|
259
|
+
</details>
|
|
260
|
+
|
|
261
|
+
<rules>
|
|
253
262
|
# ❗ 重要操作使用规则
|
|
254
263
|
1. 一次对话只能使用一个操作,否则会出错
|
|
255
264
|
2. 严格按照每个操作的格式执行
|
|
256
265
|
3. 等待操作结果后再进行下一个操作
|
|
257
266
|
4. 处理完结果后再调用新的操作
|
|
258
267
|
5. 如果对操作使用不清楚,请请求帮助
|
|
268
|
+
</rules>
|
|
269
|
+
</actions>
|
|
259
270
|
"""
|
|
260
271
|
|
|
261
272
|
complete_prompt = ""
|
|
262
273
|
if self.auto_complete:
|
|
263
274
|
complete_prompt = f"""
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
275
|
+
<completion>
|
|
276
|
+
<instruction>
|
|
277
|
+
## 任务完成
|
|
278
|
+
当任务完成时,你应该打印以下信息:
|
|
279
|
+
</instruction>
|
|
280
|
+
|
|
281
|
+
<marker>
|
|
282
|
+
{ot("!!!COMPLETE!!!")}
|
|
283
|
+
</marker>
|
|
284
|
+
</completion>
|
|
285
|
+
"""
|
|
268
286
|
|
|
269
287
|
self.model.set_system_message(f"""
|
|
270
288
|
{self.system_prompt}
|
|
@@ -294,8 +312,12 @@ class Agent:
|
|
|
294
312
|
# 结构化系统指令
|
|
295
313
|
action_handlers = '\n'.join([f'- {handler.name()}' for handler in self.output_handler])
|
|
296
314
|
|
|
297
|
-
|
|
315
|
+
# 任务完成提示
|
|
316
|
+
complete_prompt = f"并输出{ot('!!!COMPLETE!!!')}" if need_complete and self.auto_complete else ""
|
|
298
317
|
|
|
318
|
+
addon_prompt = f"""
|
|
319
|
+
<addon>
|
|
320
|
+
<instructions>
|
|
299
321
|
**系统指令:**
|
|
300
322
|
- 每次响应必须且只能包含一个操作
|
|
301
323
|
- 严格遵循操作调用格式
|
|
@@ -304,15 +326,21 @@ class Agent:
|
|
|
304
326
|
- 如果判断任务已经完成,不必输出操作
|
|
305
327
|
- 如果信息不明确,请请求用户补充
|
|
306
328
|
- 如果执行过程中连续失败5次,请使用ask_user询问用户操作
|
|
329
|
+
</instructions>
|
|
307
330
|
|
|
331
|
+
<actions>
|
|
308
332
|
**可用操作列表:**
|
|
309
333
|
{action_handlers}
|
|
334
|
+
</actions>
|
|
335
|
+
|
|
336
|
+
<completion>
|
|
337
|
+
如果任务已完成{complete_prompt},请:
|
|
338
|
+
1. 说明完成原因
|
|
339
|
+
2. 保持输出格式规范
|
|
340
|
+
</completion>
|
|
341
|
+
</addon>
|
|
310
342
|
"""
|
|
311
343
|
|
|
312
|
-
# 任务完成提示
|
|
313
|
-
complete_prompt = f"并输出{ot('!!!COMPLETE!!!')}" if need_complete and self.auto_complete else ""
|
|
314
|
-
addon_prompt += f"\n\n如果任务已完成{complete_prompt},请:\n1. 说明完成原因\n2. 保持输出格式规范"
|
|
315
|
-
|
|
316
344
|
return addon_prompt
|
|
317
345
|
|
|
318
346
|
def _call_model(self, message: str, need_complete: bool = False) -> str:
|
|
@@ -377,52 +405,61 @@ class Agent:
|
|
|
377
405
|
|
|
378
406
|
with yaspin(text="正在总结对话历史...", color="cyan") as spinner:
|
|
379
407
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
- 用户最初提出的核心问题或任务
|
|
384
|
-
- 任务的预期结果和成功标准
|
|
385
|
-
- 用户明确强调的任何特殊要求或限制条件
|
|
386
|
-
|
|
387
|
-
2. 背景与上下文信息:
|
|
388
|
-
- 问题的业务或技术背景
|
|
389
|
-
- 相关系统、平台或环境的信息
|
|
390
|
-
- 已知的约束条件或依赖关系
|
|
408
|
+
summary_prompt = """<methodology_analysis>
|
|
409
|
+
<request>
|
|
410
|
+
当前任务已结束,请分析是否需要生成方法论。基于本次对话的内容和结果:
|
|
391
411
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
- 已验证的系统参数或配置
|
|
396
|
-
|
|
397
|
-
4. 问题分析与诊断:
|
|
398
|
-
- 已识别的根本原因(针对问题诊断任务)
|
|
399
|
-
- 关键的技术细节或错误信息
|
|
400
|
-
- 排除的可能性和已验证的假设
|
|
412
|
+
如果你认为需要生成方法论,请先确定是创建新方法论还是更新现有方法论。如果是更新现有方法论,请使用'update',否则使用'add'。
|
|
413
|
+
如果你认为不需要方法论,请解释原因。
|
|
414
|
+
</request>
|
|
401
415
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
416
|
+
<evaluation_criteria>
|
|
417
|
+
方法论评估标准:
|
|
418
|
+
1. 方法论应聚焦于通用且可重复的解决方案流程
|
|
419
|
+
2. 方法论应该具备足够的通用性,可应用于同类问题
|
|
420
|
+
3. 特别注意用户在执行过程中提供的修正、反馈和改进建议
|
|
421
|
+
4. 如果用户明确指出了某个解决步骤的优化方向,这应该被纳入方法论
|
|
422
|
+
5. 如果用户在解决过程中发现了更高效的方法,这应被记录并优先使用
|
|
423
|
+
</evaluation_criteria>
|
|
407
424
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
425
|
+
<format_requirements>
|
|
426
|
+
方法论格式要求:
|
|
427
|
+
1. 问题重述: 简明扼要的问题归纳,不含特定细节
|
|
428
|
+
2. 最优解决方案: 经过用户验证的、最终有效的解决方案(将每个步骤要使用的工具也列举出来)
|
|
429
|
+
3. 注意事项: 执行中可能遇到的常见问题和注意点,尤其是用户指出的问题
|
|
430
|
+
4. 可选步骤: 对于有多种解决路径的问题,标注出可选步骤和适用场景
|
|
431
|
+
</format_requirements>
|
|
412
432
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
433
|
+
<quality_control>
|
|
434
|
+
方法论质量控制:
|
|
435
|
+
1. 只记录有实际意义的流程,不记录执行过程中的错误或无效尝试
|
|
436
|
+
2. 保留最终有效的解决步骤和用户认可的解决方案
|
|
437
|
+
3. 不要包含特定代码片段、文件路径或其他特定于单一任务的细节
|
|
438
|
+
4. 确保方法论遵循用户认可的执行路径,尤其是用户指出的改进点
|
|
439
|
+
</quality_control>
|
|
417
440
|
|
|
418
|
-
|
|
441
|
+
<output_requirements>
|
|
442
|
+
只输出方法论工具调用指令,或不生成方法论的解释。不要输出其他内容。
|
|
443
|
+
</output_requirements>
|
|
419
444
|
|
|
420
|
-
|
|
445
|
+
<template>
|
|
446
|
+
方法论格式:
|
|
447
|
+
{ot("TOOL_CALL")}
|
|
448
|
+
want: 添加/更新xxxx的方法论
|
|
449
|
+
name: methodology
|
|
450
|
+
arguments:
|
|
451
|
+
operation: add/update
|
|
452
|
+
problem_type: 方法论类型,不要过于细节,也不要过于泛化
|
|
453
|
+
content: |
|
|
454
|
+
方法论内容
|
|
455
|
+
{ct("TOOL_CALL")}
|
|
456
|
+
</template>
|
|
457
|
+
</methodology_analysis>
|
|
421
458
|
"""
|
|
422
459
|
|
|
423
460
|
try:
|
|
424
461
|
with spinner.hidden():
|
|
425
|
-
summary = self.model.chat_until_success(self.prompt + "\n" +
|
|
462
|
+
summary = self.model.chat_until_success(self.prompt + "\n" + summary_prompt) # type: ignore
|
|
426
463
|
|
|
427
464
|
self.model.reset() # type: ignore
|
|
428
465
|
|
|
@@ -432,11 +469,19 @@ class Agent:
|
|
|
432
469
|
# 添加总结作为新的上下文
|
|
433
470
|
spinner.text = "总结对话历史完成"
|
|
434
471
|
spinner.ok("✅")
|
|
435
|
-
return f"""
|
|
472
|
+
return f"""<summary>
|
|
473
|
+
<header>
|
|
474
|
+
以下是之前对话的关键信息总结:
|
|
475
|
+
</header>
|
|
436
476
|
|
|
477
|
+
<content>
|
|
437
478
|
{summary}
|
|
479
|
+
</content>
|
|
438
480
|
|
|
481
|
+
<instructions>
|
|
439
482
|
请基于以上信息继续完成任务。请注意,这是之前对话的摘要,上下文长度已超过限制而被重置。请直接继续任务,无需重复已完成的步骤。如有需要,可以询问用户以获取更多信息。
|
|
483
|
+
</instructions>
|
|
484
|
+
</summary>
|
|
440
485
|
"""
|
|
441
486
|
except Exception as e:
|
|
442
487
|
spinner.text = "总结对话历史失败"
|
|
@@ -511,32 +556,44 @@ class Agent:
|
|
|
511
556
|
try:
|
|
512
557
|
|
|
513
558
|
# 让模型判断是否需要生成方法论
|
|
514
|
-
analysis_prompt = f"""
|
|
559
|
+
analysis_prompt = f"""<methodology_analysis>
|
|
560
|
+
<request>
|
|
561
|
+
当前任务已结束,请分析是否需要生成方法论。基于本次对话的内容和结果:
|
|
515
562
|
|
|
516
563
|
如果你认为需要生成方法论,请先确定是创建新方法论还是更新现有方法论。如果是更新现有方法论,请使用'update',否则使用'add'。
|
|
517
564
|
如果你认为不需要方法论,请解释原因。
|
|
565
|
+
</request>
|
|
518
566
|
|
|
567
|
+
<evaluation_criteria>
|
|
519
568
|
方法论评估标准:
|
|
520
569
|
1. 方法论应聚焦于通用且可重复的解决方案流程
|
|
521
570
|
2. 方法论应该具备足够的通用性,可应用于同类问题
|
|
522
571
|
3. 特别注意用户在执行过程中提供的修正、反馈和改进建议
|
|
523
572
|
4. 如果用户明确指出了某个解决步骤的优化方向,这应该被纳入方法论
|
|
524
573
|
5. 如果用户在解决过程中发现了更高效的方法,这应被记录并优先使用
|
|
574
|
+
</evaluation_criteria>
|
|
525
575
|
|
|
576
|
+
<format_requirements>
|
|
526
577
|
方法论格式要求:
|
|
527
578
|
1. 问题重述: 简明扼要的问题归纳,不含特定细节
|
|
528
579
|
2. 最优解决方案: 经过用户验证的、最终有效的解决方案(将每个步骤要使用的工具也列举出来)
|
|
529
580
|
3. 注意事项: 执行中可能遇到的常见问题和注意点,尤其是用户指出的问题
|
|
530
581
|
4. 可选步骤: 对于有多种解决路径的问题,标注出可选步骤和适用场景
|
|
582
|
+
</format_requirements>
|
|
531
583
|
|
|
584
|
+
<quality_control>
|
|
532
585
|
方法论质量控制:
|
|
533
586
|
1. 只记录有实际意义的流程,不记录执行过程中的错误或无效尝试
|
|
534
587
|
2. 保留最终有效的解决步骤和用户认可的解决方案
|
|
535
588
|
3. 不要包含特定代码片段、文件路径或其他特定于单一任务的细节
|
|
536
589
|
4. 确保方法论遵循用户认可的执行路径,尤其是用户指出的改进点
|
|
590
|
+
</quality_control>
|
|
537
591
|
|
|
592
|
+
<output_requirements>
|
|
538
593
|
只输出方法论工具调用指令,或不生成方法论的解释。不要输出其他内容。
|
|
594
|
+
</output_requirements>
|
|
539
595
|
|
|
596
|
+
<template>
|
|
540
597
|
方法论格式:
|
|
541
598
|
{ot("TOOL_CALL")}
|
|
542
599
|
want: 添加/更新xxxx的方法论
|
|
@@ -547,6 +604,8 @@ arguments:
|
|
|
547
604
|
content: |
|
|
548
605
|
方法论内容
|
|
549
606
|
{ct("TOOL_CALL")}
|
|
607
|
+
</template>
|
|
608
|
+
</methodology_analysis>
|
|
550
609
|
"""
|
|
551
610
|
self.prompt = analysis_prompt
|
|
552
611
|
with spinner.hidden():
|
|
@@ -87,8 +87,6 @@ def file_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
|
87
87
|
spinner.ok("✅")
|
|
88
88
|
prompt = result["stdout"] + "\n" + prompt
|
|
89
89
|
if get_context_token_count(prompt) > get_max_input_token_count() - INPUT_WINDOW_REVERSE_SIZE:
|
|
90
|
-
with spinner.hidden():
|
|
91
|
-
agent.model.upload_files([f["path"] for f in files])
|
|
92
90
|
return old_prompt, False
|
|
93
91
|
|
|
94
92
|
return prompt, False
|
jarvis/jarvis_agent/jarvis.py
CHANGED
|
@@ -11,6 +11,7 @@ from yaspin import yaspin
|
|
|
11
11
|
from jarvis.jarvis_agent import (
|
|
12
12
|
PrettyOutput, OutputType,
|
|
13
13
|
get_multiline_input,
|
|
14
|
+
user_confirm,
|
|
14
15
|
Agent,
|
|
15
16
|
origin_agent_system_prompt
|
|
16
17
|
)
|
|
@@ -89,7 +90,14 @@ def _select_task(tasks: Dict[str, str]) -> str:
|
|
|
89
90
|
if choice == 0:
|
|
90
91
|
return ""
|
|
91
92
|
if 1 <= choice <= len(task_names):
|
|
92
|
-
|
|
93
|
+
selected_task = tasks[task_names[choice - 1]]
|
|
94
|
+
# 询问是否需要补充信息
|
|
95
|
+
need_additional = user_confirm("需要为此任务添加补充信息吗?", default=False)
|
|
96
|
+
if need_additional:
|
|
97
|
+
additional_input = get_multiline_input("请输入补充信息(输入空行结束):")
|
|
98
|
+
if additional_input:
|
|
99
|
+
selected_task = f"{selected_task}\n\n补充信息:\n{additional_input}"
|
|
100
|
+
return selected_task
|
|
93
101
|
PrettyOutput.print("无效的选择。请选择列表中的一个号码。", OutputType.WARNING)
|
|
94
102
|
|
|
95
103
|
except (KeyboardInterrupt, EOFError):
|
jarvis/jarvis_agent/patch.py
CHANGED
|
@@ -488,7 +488,7 @@ def handle_large_code_operation(filepath: str, patch_content: str, model: BasePl
|
|
|
488
488
|
{ot("DIFF")}
|
|
489
489
|
>>>>>> SEARCH
|
|
490
490
|
[需要查找的原始代码,包含足够上下文,避免出现可匹配多处的情况]
|
|
491
|
-
|
|
491
|
+
{'='*5}
|
|
492
492
|
[替换后的新代码]
|
|
493
493
|
<<<<<< REPLACE
|
|
494
494
|
{ct("DIFF")}
|
|
@@ -496,7 +496,7 @@ def handle_large_code_operation(filepath: str, patch_content: str, model: BasePl
|
|
|
496
496
|
{ot("DIFF")}
|
|
497
497
|
>>>>>> SEARCH
|
|
498
498
|
[另一处需要查找的原始代码,包含足够上下文,避免出现可匹配多处的情况]
|
|
499
|
-
|
|
499
|
+
{'='*5}
|
|
500
500
|
[另一处替换后的新代码]
|
|
501
501
|
<<<<<< REPLACE
|
|
502
502
|
{ct("DIFF")}
|
|
@@ -56,28 +56,35 @@ class CodeAgent:
|
|
|
56
56
|
"virtual_tty",
|
|
57
57
|
])
|
|
58
58
|
code_system_prompt = """
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
<code_engineer_guide>
|
|
60
|
+
<principles>
|
|
61
61
|
## 核心原则
|
|
62
62
|
- 自主决策:基于专业判断做出决策,减少用户询问
|
|
63
63
|
- 高效精准:一次性提供完整解决方案,避免反复修改
|
|
64
64
|
- 修改审慎:修改代码前要三思而后行,充分分析影响范围,尽量做到一次把事情做好
|
|
65
65
|
- 工具精通:选择最高效工具路径解决问题
|
|
66
66
|
- 严格确认:必须先分析项目结构,确定要修改的文件,禁止虚构已存在的代码
|
|
67
|
+
</principles>
|
|
67
68
|
|
|
69
|
+
<workflow>
|
|
68
70
|
## 工作流程
|
|
69
71
|
|
|
72
|
+
<step>
|
|
70
73
|
### 1. 项目结构分析
|
|
71
74
|
- 第一步必须分析项目结构,识别关键模块和文件
|
|
72
75
|
- 结合用户需求,确定需要修改的文件列表
|
|
73
76
|
- 优先使用fd命令查找文件,使用execute_script执行
|
|
74
77
|
- 明确说明将要修改的文件及其范围
|
|
78
|
+
</step>
|
|
75
79
|
|
|
80
|
+
<step>
|
|
76
81
|
### 2. 需求分析
|
|
77
82
|
- 基于项目结构理解,分析需求意图和实现方案
|
|
78
83
|
- 当需求有多种实现方式时,选择影响最小的方案
|
|
79
84
|
- 仅当需求显著模糊时才询问用户
|
|
85
|
+
</step>
|
|
80
86
|
|
|
87
|
+
<step>
|
|
81
88
|
### 3. 代码分析与确认
|
|
82
89
|
- 详细分析确定要修改的文件内容
|
|
83
90
|
- 明确区分现有代码和需要新建的内容
|
|
@@ -96,7 +103,9 @@ class CodeAgent:
|
|
|
96
103
|
| 整体分析 | execute_script | ask_codebase(仅在必要时) |
|
|
97
104
|
| 代码质量检查 | execute_script | ask_codebase(仅在必要时) |
|
|
98
105
|
| 统计代码行数 | loc (通过execute_script) | - |
|
|
106
|
+
</step>
|
|
99
107
|
|
|
108
|
+
<step>
|
|
100
109
|
### 4. 方案设计
|
|
101
110
|
- 确定最小变更方案,保持代码结构
|
|
102
111
|
- 变更类型处理:
|
|
@@ -106,20 +115,28 @@ class CodeAgent:
|
|
|
106
115
|
- ≤50行:一次性完成所有修改
|
|
107
116
|
- 50-200行:按功能模块分组
|
|
108
117
|
- >200行:按功能拆分,但尽量减少提交次数
|
|
118
|
+
</step>
|
|
109
119
|
|
|
120
|
+
<step>
|
|
110
121
|
### 5. 实施修改
|
|
111
122
|
- 遵循"先读后写"原则,在修改已有代码前,必须已经读取了对应文件,如果已经读取过文件,不需要重新读取
|
|
112
123
|
- 保持代码风格一致性
|
|
113
124
|
- 自动匹配项目现有命名风格
|
|
114
125
|
- 允许创建新文件和结构,但不得假设或虚构现有代码
|
|
126
|
+
</step>
|
|
127
|
+
</workflow>
|
|
115
128
|
|
|
129
|
+
<tools>
|
|
116
130
|
## 专用工具简介
|
|
117
131
|
仅在必要时使用以下专用工具:
|
|
118
132
|
|
|
119
133
|
- **ask_codebase**: 代码库整体查询,应优先使用fd、rg和read_code组合替代
|
|
134
|
+
</tools>
|
|
120
135
|
|
|
136
|
+
<shell_commands>
|
|
121
137
|
## Shell命令优先策略
|
|
122
138
|
|
|
139
|
+
<category>
|
|
123
140
|
### 优先使用的Shell命令
|
|
124
141
|
- **项目结构分析**:
|
|
125
142
|
- `fd -t f -e py` 查找所有Python文件
|
|
@@ -129,7 +146,9 @@ class CodeAgent:
|
|
|
129
146
|
- `fd -t f -e go` 查找所有Go文件
|
|
130
147
|
- `fd -t f -e rs` 查找所有Rust文件
|
|
131
148
|
- `fd -t f -e c -e cpp -e h -e hpp` 查找所有C/C++文件
|
|
149
|
+
</category>
|
|
132
150
|
|
|
151
|
+
<category>
|
|
133
152
|
- **代码内容搜索**:
|
|
134
153
|
- `rg "pattern" --type py` 在Python文件中搜索
|
|
135
154
|
- `rg "pattern" --type js` 在JavaScript文件中搜索
|
|
@@ -138,10 +157,14 @@ class CodeAgent:
|
|
|
138
157
|
- `rg "class ClassName"` 查找类定义
|
|
139
158
|
- `rg "func|function|def" -g "*.py" -g "*.js" -g "*.go" -g "*.rs"` 查找函数定义
|
|
140
159
|
- `rg -w "word"` 精确匹配单词
|
|
160
|
+
</category>
|
|
141
161
|
|
|
162
|
+
<category>
|
|
142
163
|
- **代码统计分析**:
|
|
143
164
|
- `loc` 统计当前目录代码行数
|
|
165
|
+
</category>
|
|
144
166
|
|
|
167
|
+
<category>
|
|
145
168
|
- **代码质量检查**:
|
|
146
169
|
- Python: `pylint <file_path>`, `flake8 <file_path>`
|
|
147
170
|
- JavaScript: `eslint <file_path>`
|
|
@@ -150,21 +173,30 @@ class CodeAgent:
|
|
|
150
173
|
- Go: `go vet <file_path>`
|
|
151
174
|
- Rust: `cargo clippy`
|
|
152
175
|
- C/C++: `cppcheck <file_path>`
|
|
176
|
+
</category>
|
|
153
177
|
|
|
178
|
+
<category>
|
|
154
179
|
- **整体代码分析**:
|
|
155
180
|
- 使用execute_script编写和执行脚本,批量分析多个文件
|
|
156
181
|
- 简单脚本示例:`find . -name "*.py" | xargs pylint`
|
|
157
182
|
- 使用多工具组合:`fd -e py | xargs pylint`
|
|
183
|
+
</category>
|
|
184
|
+
</shell_commands>
|
|
158
185
|
|
|
186
|
+
<read_code_usage>
|
|
159
187
|
### read_code工具使用
|
|
160
188
|
读取文件应优先使用read_code工具,而非shell命令:
|
|
161
189
|
- 完整读取:使用read_code读取整个文件内容
|
|
162
190
|
- 部分读取:使用read_code指定行范围
|
|
163
191
|
- 大文件处理:对大型文件使用read_code指定行范围,避免全部加载
|
|
192
|
+
</read_code_usage>
|
|
164
193
|
|
|
194
|
+
<tool_usage>
|
|
165
195
|
### 仅在命令行工具不足时使用专用工具
|
|
166
196
|
只有当fd、rg、loc和read_code工具无法获取足够信息时,才考虑使用专用工具(ask_codebase等)。在每次使用专用工具前,应先尝试使用上述工具获取所需信息。
|
|
197
|
+
</tool_usage>
|
|
167
198
|
|
|
199
|
+
<notes>
|
|
168
200
|
### 注意事项
|
|
169
201
|
- read_code比cat或grep更适合阅读代码
|
|
170
202
|
- rg比grep更快更强大,应优先使用
|
|
@@ -173,6 +205,8 @@ class CodeAgent:
|
|
|
173
205
|
- 针对不同编程语言选择对应的代码质量检查工具
|
|
174
206
|
- 不要留下未实现的代码
|
|
175
207
|
- 对于非常复杂的需求,可以使用create_code_agent工具,但是要提供完整的上下文信息
|
|
208
|
+
</notes>
|
|
209
|
+
</code_engineer_guide>
|
|
176
210
|
"""
|
|
177
211
|
# Dynamically add ask_codebase based on task complexity if really needed
|
|
178
212
|
# 处理platform参数
|