jarvis-ai-assistant 0.1.177__tar.gz → 0.1.178__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 (110) hide show
  1. {jarvis_ai_assistant-0.1.177/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.178}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_agent/__init__.py +22 -53
  6. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_platform/openai.py +66 -10
  7. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/ask_codebase.py +2 -1
  8. jarvis_ai_assistant-0.1.178/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  9. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/edit_file.py +34 -26
  10. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/registry.py +1 -1
  11. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/config.py +10 -1
  12. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  13. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -7
  14. jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_lsp/base.py +0 -66
  15. jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_lsp/cpp.py +0 -99
  16. jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_lsp/go.py +0 -104
  17. jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_lsp/python.py +0 -58
  18. jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_lsp/registry.py +0 -169
  19. jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_lsp/rust.py +0 -107
  20. jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -147
  21. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/LICENSE +0 -0
  22. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/MANIFEST.in +0 -0
  23. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/README.md +0 -0
  24. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/setup.cfg +0 -0
  25. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  26. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_agent/jarvis.py +0 -0
  27. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_agent/main.py +0 -0
  28. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  29. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  30. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  31. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
  32. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  33. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  34. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  35. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  36. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  37. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  38. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  39. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  40. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  41. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  42. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  43. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  44. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  45. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  46. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  47. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  48. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  49. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  50. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  51. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  52. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  53. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_data/huggingface.tar.gz +0 -0
  54. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_dev/main.py +0 -0
  55. {jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_git_details → jarvis_ai_assistant-0.1.178/src/jarvis/jarvis_event}/__init__.py +0 -0
  56. {jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_git_squash → jarvis_ai_assistant-0.1.178/src/jarvis/jarvis_git_details}/__init__.py +0 -0
  57. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_git_details/main.py +0 -0
  58. {jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_platform_manager → jarvis_ai_assistant-0.1.178/src/jarvis/jarvis_git_squash}/__init__.py +0 -0
  59. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_git_squash/main.py +0 -0
  60. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  61. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  62. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  63. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  64. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_methodology/main.py +0 -0
  65. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  66. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  67. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_platform/__init__.py +0 -0
  68. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_platform/base.py +0 -0
  69. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_platform/human.py +0 -0
  70. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_platform/kimi.py +0 -0
  71. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_platform/registry.py +0 -0
  72. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  73. {jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_smart_shell → jarvis_ai_assistant-0.1.178/src/jarvis/jarvis_platform_manager}/__init__.py +0 -0
  74. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  75. {jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_tools → jarvis_ai_assistant-0.1.178/src/jarvis/jarvis_smart_shell}/__init__.py +0 -0
  76. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  77. {jarvis_ai_assistant-0.1.177/src/jarvis/jarvis_tools/cli → jarvis_ai_assistant-0.1.178/src/jarvis/jarvis_tools}/__init__.py +0 -0
  78. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  79. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/base.py +0 -0
  80. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/chdir.py +0 -0
  81. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  82. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  83. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  84. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  85. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  86. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  87. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  88. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
  89. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  90. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/methodology.py +0 -0
  91. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/read_code.py +0 -0
  92. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  93. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  94. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/search_web.py +0 -0
  95. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  96. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/__init__.py +0 -0
  97. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  98. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/embedding.py +0 -0
  99. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  100. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  101. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/globals.py +0 -0
  102. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/input.py +0 -0
  103. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/methodology.py +0 -0
  104. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/output.py +0 -0
  105. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/tag.py +0 -0
  106. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis/jarvis_utils/utils.py +0 -0
  107. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  108. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  109. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  110. {jarvis_ai_assistant-0.1.177 → jarvis_ai_assistant-0.1.178}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.177
3
+ Version: 0.1.178
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
@@ -8,7 +8,7 @@ default = true
8
8
 
9
9
  [project]
10
10
  name = "jarvis-ai-assistant"
11
- version = "0.1.177"
11
+ version = "0.1.178"
12
12
  description = "Jarvis: An AI assistant that uses tools to interact with the system"
13
13
  readme = "README.md"
14
14
  authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
3
3
 
4
4
  setup(
5
5
  name="jarvis-ai-assistant",
6
- version="0.1.177",
6
+ version="0.1.178",
7
7
  author="skyfire",
8
8
  author_email="skyfireitdiy@hotmail.com",
9
9
  description="An AI assistant that uses various tools to interact with the system",
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.1.177"
4
+ __version__ = "0.1.178"
@@ -10,7 +10,7 @@ from jarvis.jarvis_platform.base import BasePlatform
10
10
  from jarvis.jarvis_platform.registry import PlatformRegistry
11
11
  from jarvis.jarvis_utils.output import PrettyOutput, OutputType
12
12
  from jarvis.jarvis_utils.embedding import get_context_token_count
13
- from jarvis.jarvis_utils.config import get_max_tool_call_count, is_auto_complete, is_execute_tool_confirm
13
+ from jarvis.jarvis_utils.config import get_max_tool_call_count, is_auto_complete, is_execute_tool_confirm, is_use_methodology
14
14
  from jarvis.jarvis_utils.methodology import load_methodology, upload_methodology
15
15
  from jarvis.jarvis_utils.globals import make_agent_name, set_agent, delete_agent
16
16
  from jarvis.jarvis_utils.input import get_multiline_input
@@ -150,7 +150,8 @@ class Agent:
150
150
  input_handler: Optional[List[Callable[[str, Any], Tuple[str, bool]]]] = None,
151
151
  execute_tool_confirm: Optional[bool] = None,
152
152
  need_summary: bool = True,
153
- multiline_inputer: Optional[Callable[[str], str]] = None):
153
+ multiline_inputer: Optional[Callable[[str], str]] = None,
154
+ use_methodology: Optional[bool] = None):
154
155
  """初始化Jarvis Agent实例
155
156
 
156
157
  参数:
@@ -167,6 +168,7 @@ class Agent:
167
168
  execute_tool_confirm: 执行工具前是否需要确认
168
169
  need_summary: 是否需要生成总结
169
170
  multiline_inputer: 多行输入处理器
171
+ use_methodology: 是否使用方法论
170
172
  """
171
173
  self.name = make_agent_name(name)
172
174
  self.description = description
@@ -193,6 +195,8 @@ class Agent:
193
195
 
194
196
  self.multiline_inputer = multiline_inputer if multiline_inputer else get_multiline_input
195
197
 
198
+ self.use_methodology = use_methodology if use_methodology is not None else is_use_methodology()
199
+
196
200
  self.prompt = ""
197
201
  self.conversation_length = 0 # Use length counter instead
198
202
  self.system_prompt = system_prompt
@@ -266,29 +270,12 @@ class Agent:
266
270
  5. 如果对操作使用不清楚,请请求帮助
267
271
  </rules>
268
272
  </actions>
269
- """
270
-
271
- complete_prompt = ""
272
- if self.auto_complete:
273
- complete_prompt = f"""
274
- <completion>
275
- <instruction>
276
- ## 任务完成
277
- 当任务完成时,你应该打印以下信息:
278
- </instruction>
279
-
280
- <marker>
281
- {ot("!!!COMPLETE!!!")}
282
- </marker>
283
- </completion>
284
273
  """
285
274
 
286
275
  self.model.set_system_message(f"""
287
276
  {self.system_prompt}
288
277
 
289
278
  {action_prompt}
290
-
291
- {complete_prompt}
292
279
  """)
293
280
  self.first = True
294
281
 
@@ -342,7 +329,7 @@ class Agent:
342
329
  addon_prompt = f"""
343
330
  [系统提示开始]
344
331
  请判断是否已经完成任务,如果已经完成:
345
- - 说明完成原因,不需要再有新的操作
332
+ - 直接输出完成原因,不需要再有新的操作,不要输出{ot("TOOL_CALL")}标签
346
333
  {complete_prompt}
347
334
  如果没有完成,请进行下一步操作:
348
335
  - 仅包含一个操作
@@ -524,34 +511,43 @@ class Agent:
524
511
  2. 对于子Agent: 可能会生成总结(如果启用)
525
512
  3. 使用spinner显示生成状态
526
513
  """
514
+ if self.use_methodology:
515
+ self._analysis_task()
516
+ if self.need_summary:
517
+ with yaspin(text="正在生成总结...", color="cyan") as spinner:
518
+ self.prompt = self.summary_prompt
519
+ with spinner.hidden():
520
+ ret = self.model.chat_until_success(self.prompt) # type: ignore
521
+ spinner.text = "总结生成完成"
522
+ spinner.ok("✅")
523
+ return ret
524
+
525
+ return "任务完成"
526
+
527
+ def _analysis_task(self):
527
528
  with yaspin(text="正在分析任务...", color="cyan") as spinner:
528
529
  try:
529
530
  # 让模型判断是否需要生成方法论
530
531
  analysis_prompt = f"""<task_analysis>
531
532
  <request>
532
533
  当前任务已结束,请分析该任务的解决方案:
533
-
534
534
  1. 首先检查现有工具或方法论是否已经可以完成该任务,如果可以,直接说明即可,无需生成新内容
535
535
  2. 如果现有工具/方法论不足,评估当前任务是否可以通过编写新工具来自动化解决
536
536
  3. 如果可以通过工具解决,请设计并提供工具代码
537
537
  4. 如果无法通过编写通用工具完成,评估当前的执行流程是否可以总结为通用方法论
538
538
  5. 如果以上都不可行,给出详细理由
539
-
540
539
  请根据分析结果采取相应行动:说明现有工具/方法论、创建新工具、生成新方法论或说明原因。
541
540
  </request>
542
-
543
541
  <evaluation_criteria>
544
542
  现有资源评估:
545
543
  1. 现有工具 - 检查系统中是否已有可以完成该任务的工具
546
544
  2. 现有方法论 - 检查是否已有适用于该任务的方法论
547
545
  3. 组合使用 - 评估现有工具和方法论组合使用是否可以解决问题
548
-
549
546
  工具评估标准:
550
547
  1. 通用性 - 该工具是否可以解决一类问题,而不仅仅是当前特定问题
551
548
  2. 自动化 - 该工具是否可以减少人工干预,提高效率
552
549
  3. 可靠性 - 该工具是否可以在不同场景下稳定工作
553
550
  4. 简单性 - 该工具是否易于使用,参数设计是否合理
554
-
555
551
  方法论评估标准:
556
552
  1. 方法论应聚焦于通用且可重复的解决方案流程
557
553
  2. 方法论应该具备足够的通用性,可应用于同类问题
@@ -559,7 +555,6 @@ class Agent:
559
555
  4. 如果用户明确指出了某个解决步骤的优化方向,这应该被纳入方法论
560
556
  5. 方法论要严格按照实际的执行流程来总结,不要遗漏或增加任何步骤
561
557
  </evaluation_criteria>
562
-
563
558
  <tool_requirements>
564
559
  工具代码要求:
565
560
  1. 工具类名应与工具名称保持一致
@@ -569,13 +564,11 @@ class Agent:
569
564
  5. 工具描述应详细说明用途、适用场景和使用示例
570
565
  6. 参数定义应遵循JSON Schema格式
571
566
  7. 不要包含特定任务的细节,保持通用性
572
-
573
567
  工具设计关键点:
574
568
  1. **使用PrettyOutput打印执行过程**:强烈建议在工具中使用PrettyOutput显示执行过程,
575
569
  这样用户可以了解工具在做什么,提升用户体验。示例:
576
570
  ```python
577
571
  from jarvis.jarvis_utils.output import PrettyOutput, OutputType
578
-
579
572
  # 执行中打印信息
580
573
  PrettyOutput.print("正在处理数据...", OutputType.INFO)
581
574
  # 成功信息
@@ -585,12 +578,10 @@ class Agent:
585
578
  # 错误信息
586
579
  PrettyOutput.print("操作失败", OutputType.ERROR)
587
580
  ```
588
-
589
581
  2. **结构化返回结果**:工具应该始终返回结构化的结果字典,包含以下字段:
590
582
  - success: 布尔值,表示操作是否成功
591
583
  - stdout: 字符串,包含工具的主要输出内容
592
584
  - stderr: 字符串,包含错误信息(如果有)
593
-
594
585
  3. **异常处理**:工具应该妥善处理可能发生的异常,并在失败时清理已创建的资源
595
586
  ```python
596
587
  try:
@@ -610,7 +601,6 @@ class Agent:
610
601
  }}
611
602
  ```
612
603
  </tool_requirements>
613
-
614
604
  <methodology_requirements>
615
605
  方法论格式要求:
616
606
  1. 问题重述: 简明扼要的问题归纳,不含特定细节
@@ -618,15 +608,12 @@ class Agent:
618
608
  3. 注意事项: 执行中可能遇到的常见问题和注意点,尤其是用户指出的问题
619
609
  4. 可选步骤: 对于有多种解决路径的问题,标注出可选步骤和适用场景
620
610
  </methodology_requirements>
621
-
622
611
  <output_requirements>
623
612
  根据分析结果,输出以下三种情况之一:
624
-
625
613
  1. 如果现有工具/方法论可以解决,直接输出说明:
626
614
  已有工具/方法论可以解决该问题,无需创建新内容。
627
615
  可用的工具/方法论:[列出工具名称或方法论名称]
628
616
  使用方法:[简要说明如何使用]
629
-
630
617
  2. 工具创建(如果需要创建新工具):
631
618
  {ot("TOOL_CALL")}
632
619
  want: 创建新工具来解决XXX问题
@@ -637,14 +624,12 @@ arguments:
637
624
  # -*- coding: utf-8 -*-
638
625
  from typing import Dict, Any
639
626
  from jarvis.jarvis_utils.output import PrettyOutput, OutputType
640
-
641
627
  class 工具名称:
642
628
  name = "工具名称"
643
629
  description = "Tool for text transformation"
644
630
  Tool description
645
631
  适用场景:1. 格式化文本; 2. 处理标题; 3. 标准化输出
646
632
  \"\"\"
647
-
648
633
  parameters = {{
649
634
  "type": "object",
650
635
  "properties": {{
@@ -652,19 +637,15 @@ arguments:
652
637
  }},
653
638
  "required": []
654
639
  }}
655
-
656
640
  @staticmethod
657
641
  def check() -> bool:
658
642
  return True
659
-
660
643
  def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
661
644
  try:
662
645
  # 使用PrettyOutput显示执行过程
663
646
  PrettyOutput.print("开始执行操作...", OutputType.INFO)
664
-
665
647
  # 实现逻辑
666
648
  # ...
667
-
668
649
  PrettyOutput.print("操作已完成", OutputType.SUCCESS)
669
650
  return {{
670
651
  "success": True,
@@ -679,7 +660,6 @@ arguments:
679
660
  "stderr": f"操作失败: {{str(e)}}"
680
661
  }}
681
662
  {ct("TOOL_CALL")}
682
-
683
663
  3. 方法论创建(如果需要创建新方法论):
684
664
  {ot("TOOL_CALL")}
685
665
  want: 添加/更新xxxx的方法论
@@ -690,7 +670,6 @@ arguments:
690
670
  content: |2
691
671
  方法论内容
692
672
  {ct("TOOL_CALL")}
693
-
694
673
  如果以上三种情况都不适用,则直接输出原因分析,不要使用工具调用格式。
695
674
  </output_requirements>
696
675
  </task_analysis>"""
@@ -706,16 +685,6 @@ arguments:
706
685
  except Exception as e:
707
686
  spinner.text = "分析失败"
708
687
  spinner.fail("❌")
709
- if self.need_summary:
710
- with yaspin(text="正在生成总结...", color="cyan") as spinner:
711
- self.prompt = self.summary_prompt
712
- with spinner.hidden():
713
- ret = self.model.chat_until_success(self.prompt) # type: ignore
714
- spinner.text = "总结生成完成"
715
- spinner.ok("✅")
716
- return ret
717
-
718
- return "任务完成"
719
688
 
720
689
 
721
690
  def run(self, user_input: str) -> Any:
@@ -738,7 +707,7 @@ arguments:
738
707
 
739
708
  self.prompt = f"{user_input}"
740
709
 
741
- if self.first:
710
+ if self.first and self.use_methodology:
742
711
 
743
712
  # 先尝试上传方法轮
744
713
  platform = self.model if hasattr(self.model, 'upload_files') else None
@@ -2,10 +2,6 @@
2
2
  from typing import Dict, Generator, List, Tuple
3
3
  import os
4
4
  from openai import OpenAI
5
- from rich.live import Live
6
- from rich.text import Text
7
- from rich.panel import Panel
8
- from rich import box
9
5
  from jarvis.jarvis_platform.base import BasePlatform
10
6
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
11
7
 
@@ -49,10 +45,27 @@ class OpenAIModel(BasePlatform):
49
45
  self.system_message = ""
50
46
 
51
47
  def upload_files(self, file_list: List[str]) -> bool:
48
+ """
49
+ 上传文件到OpenAI平台
50
+
51
+ 参数:
52
+ file_list: 需要上传的文件路径列表
53
+
54
+ 返回:
55
+ bool: 上传是否成功 (当前实现始终返回False)
56
+ """
52
57
  return False
53
58
 
54
59
  def get_model_list(self) -> List[Tuple[str, str]]:
55
- """Get model list"""
60
+ """
61
+ 获取可用的OpenAI模型列表
62
+
63
+ 返回:
64
+ List[Tuple[str, str]]: 模型ID和名称的元组列表
65
+
66
+ 异常:
67
+ 当API调用失败时会打印错误信息并返回空列表
68
+ """
56
69
  try:
57
70
  models = self.client.models.list()
58
71
  model_list = []
@@ -64,17 +77,41 @@ class OpenAIModel(BasePlatform):
64
77
  return []
65
78
 
66
79
  def set_model_name(self, model_name: str):
67
- """Set model name"""
80
+ """
81
+ 设置当前使用的模型名称
82
+
83
+ 参数:
84
+ model_name: 要设置的模型名称
85
+ """
68
86
 
69
87
  self.model_name = model_name
70
88
 
71
89
  def set_system_message(self, message: str):
72
- """Set system message"""
90
+ """
91
+ 设置系统消息(角色设定)
92
+
93
+ 参数:
94
+ message: 系统消息内容
95
+
96
+ 说明:
97
+ 设置后会立即添加到消息历史中
98
+ """
73
99
  self.system_message = message
74
100
  self.messages.append({"role": "system", "content": self.system_message})
75
101
 
76
102
  def chat(self, message: str) -> Generator[str, None, None]:
77
- """Execute conversation"""
103
+ """
104
+ 执行对话并返回生成器
105
+
106
+ 参数:
107
+ message: 用户输入的消息内容
108
+
109
+ 返回:
110
+ Generator[str, None, None]: 生成器,逐块返回AI响应内容
111
+
112
+ 异常:
113
+ 当API调用失败时会抛出异常并打印错误信息
114
+ """
78
115
  try:
79
116
 
80
117
  # Add user message to history
@@ -103,12 +140,25 @@ class OpenAIModel(BasePlatform):
103
140
  raise Exception(f"Chat failed: {str(e)}")
104
141
 
105
142
  def name(self) -> str:
106
- """Return model name"""
143
+ """
144
+ 获取当前使用的模型名称
145
+
146
+ 返回:
147
+ str: 当前配置的模型名称
148
+ """
107
149
  return self.model_name
108
150
 
109
151
 
110
152
  def delete_chat(self)->bool:
111
- """Delete conversation"""
153
+ """
154
+ 删除当前对话历史
155
+
156
+ 返回:
157
+ bool: 操作是否成功
158
+
159
+ 说明:
160
+ 如果设置了系统消息,会保留系统消息
161
+ """
112
162
  if self.system_message:
113
163
  self.messages = [{"role": "system", "content": self.system_message}]
114
164
  else:
@@ -116,4 +166,10 @@ class OpenAIModel(BasePlatform):
116
166
  return True
117
167
 
118
168
  def support_web(self) -> bool:
169
+ """
170
+ 检查是否支持网页访问功能
171
+
172
+ 返回:
173
+ bool: 当前是否支持网页访问 (OpenAI平台始终返回False)
174
+ """
119
175
  return False
@@ -96,7 +96,7 @@ class AskCodebaseTool:
96
96
  name=f"CodebaseAnalyzer",
97
97
  description=f"分析代码库中的功能实现和定位",
98
98
  summary_prompt=summary_prompt,
99
- platform=PlatformRegistry().get_normal_platform(),
99
+ platform=PlatformRegistry().get_thinking_platform(),
100
100
  output_handler=[tool_registry],
101
101
  execute_tool_confirm=False,
102
102
  auto_complete=self.auto_complete
@@ -160,6 +160,7 @@ class AskCodebaseTool:
160
160
  5. 根据文件内容提供具体、准确的回答
161
161
  6. 确保分析的完整性,收集充分的信息后再得出结论,不要在只掌握部分信息就得出结论
162
162
  7. 优先查阅README文件、文档目录和项目文档
163
+ 8. 给出的任意结论都要有实际的代码支撑,不能假设和杜撰
163
164
 
164
165
  ## 分析步骤
165
166
  1. **确定项目的编程语言**:
@@ -1,18 +1,21 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """
3
- 文件搜索替换工具类
3
+ 文件编辑工具类
4
4
 
5
5
  功能概述:
6
- 1. 提供精确的文件内容搜索和替换功能
6
+ 1. 提供精确的文件内容搜索和替换功能,支持多组修改
7
7
  2. 支持单个文件的编辑操作,包括创建新文件
8
8
  3. 实现原子操作:所有修改要么全部成功,要么全部回滚
9
9
  4. 严格匹配控制:每个搜索文本必须且只能匹配一次
10
+ 5. 支持两种编辑模式:快速编辑(fast_edit)和AI辅助编辑(slow_edit)
10
11
 
11
12
  核心特性:
12
13
  - 支持不存在的文件和空文件处理
13
14
  - 自动创建所需目录结构
14
15
  - 完善的错误处理和回滚机制
15
16
  - 严格的格式保持要求
17
+ - 支持大文件处理(自动上传到模型平台)
18
+ - 提供3次重试机制确保操作可靠性
16
19
  """
17
20
  from typing import List
18
21
  import re
@@ -32,28 +35,25 @@ from jarvis.jarvis_utils.utils import is_context_overflow
32
35
 
33
36
  class FileSearchReplaceTool:
34
37
  name = "edit_file"
35
- description = """代码编辑工具,用于编辑单个文件
38
+ description = """代码编辑工具,用于精确修改单个文件
36
39
 
37
- # 代码补丁生成指南
40
+ # 文件编辑工具使用指南
38
41
 
39
- ## 重要提示
40
- 此工具可以查看和修改单个文件的代码,只需提供要修改的代码片段即可。应尽量精简内容,只包含必要的上下文和修改部分。特别注意:不要提供完整文件内容,只提供需要修改的部分及其上下文!
41
42
 
42
43
  ## 基本使用
43
44
  1. 指定需要修改的文件路径
44
- 2. 提供一组或多组修改,每个修改包含"reason"、"search"和"replace"
45
- 3. 每个修改中,"search"必须包含足够的上下文确保能在文件中**唯一匹配**
45
+ 2. 提供一组或多组修改,每个修改包含:
46
+ - reason: 修改原因描述
47
+ - search: 需要查找的原始代码(必须包含足够上下文)
48
+ - replace: 替换后的新代码
49
+ 3. 工具会自动选择最适合的编辑模式
46
50
 
47
51
  ## 核心原则
48
- 1. **精准修改**:只提供需要修改的代码部分及其上下文,不需要展示整个文件内容
49
- 2. **最小补丁原则**:始终生成最小范围的补丁,只包含必要的上下文和实际修改
50
- 3. **上下文完整性**:确保提供的上下文能唯一标识修改位置,避免匹配到多处
52
+ 1. **精准修改**: 只修改必要的代码部分,保持其他部分不变
53
+ 2. **最小补丁原则**: 生成最小范围的补丁,包含必要的上下文
54
+ 3. **唯一匹配**: 确保搜索文本在文件中唯一匹配
55
+ 4. **格式保持**: 严格保持原始代码的格式风格
51
56
 
52
- ## 输出格式规范
53
- - 每个修改必须包含SEARCH部分和REPLACE部分
54
- - SEARCH部分是需要查找的原始代码,必须能在原文件中**唯一匹配**
55
- - REPLACE部分是替换后的新代码
56
- - 如果修改较大,可以使用多个修改块
57
57
 
58
58
  """
59
59
  parameters = {
@@ -93,24 +93,26 @@ class FileSearchReplaceTool:
93
93
  pass
94
94
 
95
95
  def execute(self, args: Dict) -> Dict[str, Any]:
96
- """执行文件编辑操作,包含错误处理和回滚机制。
96
+ """执行文件编辑操作,支持快速编辑和AI辅助编辑两种模式。
97
97
 
98
98
  主要功能:
99
- 1. 处理文件创建或修改
99
+ 1. 处理文件创建或修改,支持不存在的文件
100
100
  2. 原子操作:所有修改要么全部成功,要么全部回滚
101
- 3. 保存修改前后的文件状态以便回滚
102
- 4. 提供详细的执行状态输出
101
+ 3. 自动选择编辑模式(fast_edit或slow_edit)
102
+ 4. 保存修改前后的文件状态以便回滚
103
+ 5. 提供详细的执行状态输出
103
104
 
104
105
  参数:
105
106
  args: 包含以下键的字典:
106
- - file: 要修改的文件路径
107
- - changes: 修改列表,每个修改包含:
107
+ - file: 要修改的文件路径(必填)
108
+ - changes: 修改列表,每个修改包含(必填):
108
109
  - reason: 修改原因描述
109
- - patch: 修改后的代码片段
110
+ - search: 需要查找的原始代码(必须包含足够上下文)
111
+ - replace: 替换后的新代码
110
112
 
111
113
  返回:
112
114
  Dict[str, Any] 包含:
113
- - success: 操作是否成功
115
+ - success: 操作是否成功(True/False)
114
116
  - stdout: 成功时的输出消息
115
117
  - stderr: 失败时的错误消息
116
118
 
@@ -118,6 +120,14 @@ class FileSearchReplaceTool:
118
120
  1. 捕获并记录文件操作异常
119
121
  2. 失败的修改尝试回滚到原始状态
120
122
  3. 新创建的文件在失败时会被删除
123
+ 4. 提供3次重试机制确保操作可靠性
124
+ 5. 支持大文件处理(自动上传到模型平台)
125
+
126
+ 实现细节:
127
+ 1. 优先尝试fast_edit模式
128
+ 2. 如果fast_edit失败,则尝试slow_edit模式
129
+ 3. 严格检查搜索文本的唯一匹配性
130
+ 4. 保持原始代码的格式风格
121
131
  """
122
132
  import os
123
133
  from jarvis.jarvis_utils.output import PrettyOutput, OutputType
@@ -396,7 +406,6 @@ def fast_edit(filepath: str, patches: List[Dict[str,str]], spinner: Yaspin) -> T
396
406
  if search_text in modified_content:
397
407
  # 如果有多处,报错
398
408
  if modified_content.count(search_text) > 1:
399
- spinner.write(f"❌ 补丁 #{patch_count} 应用失败:找到多个匹配的代码段")
400
409
  success = False
401
410
  break
402
411
  # 应用替换
@@ -404,7 +413,6 @@ def fast_edit(filepath: str, patches: List[Dict[str,str]], spinner: Yaspin) -> T
404
413
  search_text, replace_text)
405
414
  spinner.write(f"✅ 补丁 #{patch_count} 应用成功")
406
415
  else:
407
- spinner.write(f"❌ 补丁 #{patch_count} 应用失败:无法找到匹配的代码段")
408
416
  success = False
409
417
  break
410
418
  if not success:
@@ -216,7 +216,7 @@ class ToolRegistry(OutputHandlerProtocol):
216
216
  f"工具 {missing_tools} 不存在,可用的工具有: {', '.join(self.tools.keys())}",
217
217
  OutputType.WARNING,
218
218
  )
219
- self.tools = {tool_name: self.tools[tool_name] for tool_name in name}
219
+ self.tools = {tool_name: self.tools[tool_name] for tool_name in name if tool_name in self.tools}
220
220
 
221
221
  def dont_use_tools(self, names: List[str]) -> None:
222
222
  """从注册表中移除指定工具
@@ -169,4 +169,13 @@ def get_pretty_output() -> bool:
169
169
  返回:
170
170
  bool: 如果启用PrettyOutput则返回True,默认为True
171
171
  """
172
- return os.getenv('JARVIS_PRETTY_OUTPUT', 'false') == 'true'
172
+ return os.getenv('JARVIS_PRETTY_OUTPUT', 'false') == 'true'
173
+
174
+ def is_use_methodology() -> bool:
175
+ """
176
+ 获取是否启用方法论。
177
+
178
+ 返回:
179
+ bool: 如果启用方法论则返回True,默认为True
180
+ """
181
+ return os.getenv('JARVIS_USE_METHODOLOGY', 'true') == 'true'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.177
3
+ Version: 0.1.178
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
@@ -35,17 +35,12 @@ src/jarvis/jarvis_code_analysis/checklists/swift.py
35
35
  src/jarvis/jarvis_code_analysis/checklists/web.py
36
36
  src/jarvis/jarvis_data/huggingface.tar.gz
37
37
  src/jarvis/jarvis_dev/main.py
38
+ src/jarvis/jarvis_event/__init__.py
38
39
  src/jarvis/jarvis_git_details/__init__.py
39
40
  src/jarvis/jarvis_git_details/main.py
40
41
  src/jarvis/jarvis_git_squash/__init__.py
41
42
  src/jarvis/jarvis_git_squash/main.py
42
43
  src/jarvis/jarvis_git_utils/git_commiter.py
43
- src/jarvis/jarvis_lsp/base.py
44
- src/jarvis/jarvis_lsp/cpp.py
45
- src/jarvis/jarvis_lsp/go.py
46
- src/jarvis/jarvis_lsp/python.py
47
- src/jarvis/jarvis_lsp/registry.py
48
- src/jarvis/jarvis_lsp/rust.py
49
44
  src/jarvis/jarvis_mcp/__init__.py
50
45
  src/jarvis/jarvis_mcp/sse_mcp_client.py
51
46
  src/jarvis/jarvis_mcp/stdio_mcp_client.py
@@ -77,7 +72,6 @@ src/jarvis/jarvis_tools/file_analyzer.py
77
72
  src/jarvis/jarvis_tools/file_operation.py
78
73
  src/jarvis/jarvis_tools/find_methodology.py
79
74
  src/jarvis/jarvis_tools/generate_new_tool.py
80
- src/jarvis/jarvis_tools/lsp_get_diagnostics.py
81
75
  src/jarvis/jarvis_tools/methodology.py
82
76
  src/jarvis/jarvis_tools/read_code.py
83
77
  src/jarvis/jarvis_tools/read_webpage.py