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.

Files changed (93) hide show
  1. {jarvis_ai_assistant-0.1.134/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.138}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/pyproject.toml +3 -1
  3. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/setup.py +3 -1
  4. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/__init__.py +201 -79
  6. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/builtin_input_handler.py +16 -6
  7. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/file_input_handler.py +9 -9
  8. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/jarvis.py +10 -10
  9. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/main.py +12 -11
  10. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/output_handler.py +3 -3
  11. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/patch.py +86 -62
  12. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_agent/shell_input_handler.py +5 -3
  13. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_code_agent/code_agent.py +134 -99
  14. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_code_agent/file_select.py +24 -24
  15. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_dev/main.py +45 -51
  16. jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_git_details/main.py +179 -0
  17. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_git_squash/main.py +7 -7
  18. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/base.py +11 -11
  19. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/cpp.py +14 -14
  20. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/go.py +13 -13
  21. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/python.py +8 -8
  22. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/registry.py +21 -21
  23. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_lsp/rust.py +15 -15
  24. jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_methodology/main.py +101 -0
  25. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_multi_agent/__init__.py +11 -11
  26. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_multi_agent/main.py +6 -6
  27. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/__init__.py +1 -1
  28. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/ai8.py +67 -89
  29. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/base.py +14 -13
  30. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/kimi.py +25 -28
  31. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/ollama.py +24 -26
  32. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/openai.py +15 -19
  33. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/oyi.py +48 -50
  34. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/registry.py +27 -28
  35. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform/yuanbao.py +38 -42
  36. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform_manager/main.py +81 -81
  37. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_platform_manager/openai_test.py +21 -21
  38. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_rag/file_processors.py +18 -18
  39. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_rag/main.py +261 -277
  40. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_smart_shell/main.py +12 -12
  41. jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_tools/__init__.py +0 -0
  42. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/ask_codebase.py +28 -28
  43. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/ask_user.py +8 -8
  44. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/base.py +4 -4
  45. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/chdir.py +9 -9
  46. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/code_review.py +19 -19
  47. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/create_code_agent.py +15 -15
  48. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/execute_python_script.py +3 -3
  49. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/execute_shell.py +11 -11
  50. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/execute_shell_script.py +3 -3
  51. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/file_analyzer.py +29 -29
  52. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/file_operation.py +22 -20
  53. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/find_caller.py +25 -25
  54. jarvis_ai_assistant-0.1.138/src/jarvis/jarvis_tools/find_methodolopy.py +65 -0
  55. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/find_symbol.py +24 -24
  56. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/function_analyzer.py +27 -27
  57. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/git_commiter.py +9 -9
  58. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +19 -19
  59. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/methodology.py +23 -62
  60. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/project_analyzer.py +29 -33
  61. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/rag.py +15 -15
  62. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/read_code.py +24 -22
  63. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/read_webpage.py +31 -31
  64. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/registry.py +72 -52
  65. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/tool_generator.py +18 -18
  66. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/config.py +23 -23
  67. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/embedding.py +83 -83
  68. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/git_utils.py +20 -20
  69. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/globals.py +18 -6
  70. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/input.py +10 -9
  71. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/methodology.py +140 -136
  72. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/output.py +11 -11
  73. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/utils.py +22 -70
  74. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  75. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +4 -1
  76. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/entry_points.txt +2 -0
  77. jarvis_ai_assistant-0.1.134/src/jarvis/jarvis_tools/select_code_files.py +0 -62
  78. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/LICENSE +0 -0
  79. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/MANIFEST.in +0 -0
  80. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/README.md +0 -0
  81. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/setup.cfg +0 -0
  82. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  89. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_tools/search_web.py +0 -0
  90. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis/jarvis_utils/__init__.py +0 -0
  91. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  92. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  93. {jarvis_ai_assistant-0.1.134 → jarvis_ai_assistant-0.1.138}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.134
3
+ Version: 0.1.138
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.1.134"
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.134",
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",
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.134"
3
+ __version__ = "0.1.138"
@@ -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.delete_chat() # type: ignore
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
- actions = '、'.join([o.name() for o in self.output_handler])
278
- message += f"\n\n系统指令:请严格输出且仅输出一个操作的完整调用格式,不要输出多个操作;需要输出解释、分析和思考过程。确保输出格式正确且可直接执行。每次响应必须且只能包含一个操作。可用的操作:{actions}"
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
- """Summarize current conversation and clear history.
296
-
297
- This method will:
298
- 1. Generate a summary of key information
299
- 2. Clear the conversation history
300
- 3. Keep the system message
301
- 4. Add summary as new context
302
- 5. Reset conversation length
303
-
304
- Note:
305
- Used when context length exceeds maximum
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.delete_chat() # type: ignore
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
- """Process user input and execute the task.
412
-
413
- Args:
414
- user_input: My task description or request
415
-
416
- Returns:
417
- str|Dict: Task summary report or message to send
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