jarvis-ai-assistant 0.1.131__tar.gz → 0.1.132__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 (107) hide show
  1. {jarvis_ai_assistant-0.1.131/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.132}/PKG-INFO +3 -2
  2. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/pyproject.toml +5 -2
  3. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/setup.py +5 -2
  4. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/__init__.py +48 -29
  6. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/patch.py +61 -43
  7. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/shell_input_handler.py +1 -1
  8. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_code_agent/code_agent.py +87 -86
  9. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_dev/main.py +706 -0
  10. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_git_squash/main.py +10 -31
  11. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_multi_agent/__init__.py +19 -28
  12. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/ai8.py +7 -32
  13. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/base.py +2 -7
  14. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/kimi.py +3 -144
  15. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/ollama.py +54 -68
  16. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/openai.py +0 -4
  17. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/oyi.py +0 -75
  18. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_platform/yuanbao.py +264 -0
  19. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_rag/file_processors.py +138 -0
  20. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_rag/main.py +1750 -0
  21. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/ask_codebase.py +288 -0
  22. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/code_review.py +125 -99
  23. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/execute_python_script.py +58 -0
  24. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/execute_shell.py +13 -26
  25. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/execute_shell_script.py +1 -1
  26. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/file_analyzer.py +271 -0
  27. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/file_operation.py +1 -1
  28. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/find_caller.py +213 -0
  29. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/find_symbol.py +211 -0
  30. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/function_analyzer.py +248 -0
  31. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/git_commiter.py +4 -4
  32. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/methodology.py +196 -0
  33. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/project_analyzer.py +220 -0
  34. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/read_code.py +23 -2
  35. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/read_webpage.py +226 -0
  36. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/registry.py +132 -11
  37. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/search_web.py +55 -10
  38. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/tool_generator.py +6 -8
  39. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/__init__.py +1 -0
  40. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/config.py +67 -3
  41. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_utils/embedding.py +501 -0
  42. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/git_utils.py +9 -1
  43. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/input.py +7 -6
  44. jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_utils/methodology.py +518 -0
  45. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/output.py +5 -3
  46. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/utils.py +59 -7
  47. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132/src/jarvis_ai_assistant.egg-info}/PKG-INFO +3 -2
  48. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +8 -11
  49. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis_ai_assistant.egg-info/entry_points.txt +2 -0
  50. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis_ai_assistant.egg-info/requires.txt +2 -1
  51. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_codebase/main.py +0 -1011
  52. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_dev/main.py +0 -997
  53. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_rag/main.py +0 -870
  54. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/__init__.py +0 -0
  55. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/ask_codebase.py +0 -122
  56. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/methodology.py +0 -155
  57. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/read_webpage.py +0 -112
  58. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/treesitter_analyzer.py +0 -331
  59. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/README.md +0 -104
  60. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/__init__.py +0 -20
  61. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/database.py +0 -258
  62. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/example.py +0 -115
  63. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/grammar_builder.py +0 -182
  64. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/language.py +0 -117
  65. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/symbol.py +0 -31
  66. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/tools_usage.md +0 -121
  67. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_utils/embedding.py +0 -202
  68. jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_utils/methodology.py +0 -146
  69. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/LICENSE +0 -0
  70. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/MANIFEST.in +0 -0
  71. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/README.md +0 -0
  72. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/setup.cfg +0 -0
  73. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  74. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
  75. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/main.py +0 -0
  76. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  77. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  78. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_code_agent/file_select.py +0 -0
  79. {jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_codebase → jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_git_squash}/__init__.py +0 -0
  80. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/base.py +0 -0
  81. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  82. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/go.py +0 -0
  83. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/python.py +0 -0
  84. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/registry.py +0 -0
  85. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/rust.py +0 -0
  86. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/__init__.py +0 -0
  87. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/registry.py +0 -0
  88. {jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_git_squash → jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_platform_manager}/__init__.py +0 -0
  89. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  90. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform_manager/openai_test.py +0 -0
  91. {jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_platform_manager → jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_rag}/__init__.py +0 -0
  92. {jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_rag → jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_smart_shell}/__init__.py +0 -0
  93. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  94. {jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_smart_shell → jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools}/__init__.py +0 -0
  95. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  96. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/base.py +0 -0
  97. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/chdir.py +0 -0
  98. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  99. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  100. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/lsp_find_definition.py +0 -0
  101. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/lsp_find_references.py +0 -0
  102. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  103. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/rag.py +0 -0
  104. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/select_code_files.py +0 -0
  105. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/globals.py +0 -0
  106. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  107. {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/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.131
3
+ Version: 0.1.132
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
@@ -64,7 +64,8 @@ Requires-Dist: jedi>=0.17.2
64
64
  Requires-Dist: psutil>=7.0.0
65
65
  Requires-Dist: fastapi>=0.115.4
66
66
  Requires-Dist: uvicorn>=0.33.0
67
- Requires-Dist: tree-sitter>=0.20.0
67
+ Requires-Dist: python-pptx>=1.0.0
68
+ Requires-Dist: pandas>=2.0.0
68
69
  Provides-Extra: dev
69
70
  Requires-Dist: pytest; extra == "dev"
70
71
  Requires-Dist: black; extra == "dev"
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.1.131"
7
+ version = "0.1.132"
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" }]
@@ -46,7 +46,8 @@ dependencies = [
46
46
  "psutil>=7.0.0",
47
47
  "fastapi>=0.115.4",
48
48
  "uvicorn>=0.33.0",
49
- "tree-sitter>=0.20.0",
49
+ "python-pptx>=1.0.0",
50
+ "pandas>=2.0.0",
50
51
  ]
51
52
  requires-python = ">=3.8"
52
53
 
@@ -72,3 +73,5 @@ jarvis-dev = "jarvis.jarvis_dev.main:main"
72
73
  jarvis-git-squash = "jarvis.jarvis_git_squash.main:main"
73
74
  jarvis-multi-agent = "jarvis.jarvis_multi_agent:main"
74
75
  jarvis-agent = "jarvis.jarvis_agent.main:main"
76
+ jarvis-tool = "jarvis.jarvis_tools.registry:main"
77
+ jarvis-ask-codebase = "jarvis.jarvis_tools.ask_codebase:main"
@@ -12,7 +12,7 @@ class CustomInstallCommand(install):
12
12
 
13
13
  setup(
14
14
  name="jarvis-ai-assistant",
15
- version="0.1.131",
15
+ version="0.1.132",
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",
@@ -47,7 +47,8 @@ setup(
47
47
  "psutil>=7.0.0",
48
48
  "fastapi>=0.115.4",
49
49
  "uvicorn>=0.33.0",
50
- "tree-sitter>=0.20.0",
50
+ "python-pptx>=1.0.0",
51
+ "pandas>=2.0.0",
51
52
  ],
52
53
  entry_points={
53
54
  "console_scripts": [
@@ -66,6 +67,8 @@ setup(
66
67
  "jarvis-git-squash=jarvis.jarvis_git_squash.main:main",
67
68
  "jarvis-multi-agent=jarvis.jarvis_multi_agent:main",
68
69
  "jarvis-agent=jarvis.jarvis_agent.main:main",
70
+ "jarvis-tool=jarvis.jarvis_tools.registry:main",
71
+ "jarvis-ask-codebase=jarvis.jarvis_tools.ask_codebase:main",
69
72
  ],
70
73
  },
71
74
  python_requires=">=3.8",
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.131"
3
+ __version__ = "0.1.132"
@@ -4,6 +4,8 @@ from typing import Any, Callable, List, Optional, Tuple, Union
4
4
  from prompt_toolkit import prompt
5
5
  import yaml
6
6
  from yaspin import yaspin
7
+ import platform
8
+ import datetime
7
9
 
8
10
  from jarvis.jarvis_agent.output_handler import OutputHandler
9
11
  from jarvis.jarvis_agent.builtin_input_handler import builtin_input_handler
@@ -12,7 +14,6 @@ from jarvis.jarvis_agent.patch import PatchOutputHandler
12
14
  from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
13
15
  from jarvis.jarvis_platform.base import BasePlatform
14
16
  from jarvis.jarvis_platform.registry import PlatformRegistry
15
- from jarvis.jarvis_tools.registry import ToolRegistry
16
17
  from jarvis.jarvis_utils.output import PrettyOutput, OutputType
17
18
  from jarvis.jarvis_utils.embedding import get_context_token_count
18
19
  from jarvis.jarvis_utils.config import is_auto_complete, is_execute_tool_confirm, is_need_summary, is_record_methodology, is_use_methodology
@@ -20,7 +21,7 @@ from jarvis.jarvis_utils.methodology import load_methodology
20
21
  from jarvis.jarvis_utils.globals import make_agent_name, set_agent, delete_agent
21
22
  from jarvis.jarvis_utils.input import get_multiline_input
22
23
  from jarvis.jarvis_utils.config import get_max_token_count
23
- from jarvis.jarvis_utils.utils import init_env
24
+ from jarvis.jarvis_utils.utils import ot, init_env
24
25
  from jarvis.jarvis_utils.utils import user_confirm
25
26
  import os
26
27
 
@@ -86,6 +87,7 @@ class Agent:
86
87
 
87
88
  self.model.set_suppress_output(False)
88
89
 
90
+ from jarvis.jarvis_tools.registry import ToolRegistry
89
91
  self.output_handler = output_handler if output_handler else [ToolRegistry()]
90
92
  self.multiline_inputer = multiline_inputer if multiline_inputer else get_multiline_input
91
93
 
@@ -151,10 +153,10 @@ class Agent:
151
153
 
152
154
  complete_prompt = ""
153
155
  if self.auto_complete:
154
- complete_prompt = """
156
+ complete_prompt = f"""
155
157
  ## 任务完成
156
158
  当任务完成时,你应该打印以下信息:
157
- <!!!COMPLETE!!!>
159
+ {ot("!!!COMPLETE!!!")}
158
160
  """
159
161
 
160
162
  self.model.set_system_message(f"""
@@ -168,7 +170,7 @@ class Agent:
168
170
 
169
171
 
170
172
 
171
- def _call_model(self, message: str) -> str:
173
+ def _call_model(self, message: str, need_complete: bool = False) -> str:
172
174
  """调用AI模型并实现重试逻辑。
173
175
 
174
176
  参数:
@@ -184,6 +186,21 @@ class Agent:
184
186
  message, need_return = handler(message, self)
185
187
  if need_return:
186
188
  return message
189
+
190
+ # 添加输出简洁性指令
191
+ actions = '、'.join([o.name() for o in self.output_handler])
192
+ message += f"\n\n系统指令:请严格输出且仅输出一个操作的完整调用格式,不要输出多个操作;需要输出解释、分析和思考过程。确保输出格式正确且可直接执行。每次响应必须且只能包含一个操作。可用的操作:{actions}"
193
+ if need_complete and self.auto_complete:
194
+ message += f"\n\n如果任务已完成,说明完成原因,并输出{ot('!!!COMPLETE!!!')}"
195
+ else:
196
+ message += f"\n\n如果任务已完成,只需简洁地说明完成原因。"
197
+ # 累加对话长度
198
+ self.conversation_length += get_context_token_count(message)
199
+
200
+ if self.conversation_length > self.max_token_count:
201
+ self._summarize_and_clear_history()
202
+ self.conversation_length += get_context_token_count(message)
203
+
187
204
  print("🤖 模型思考:")
188
205
  return self.model.chat_until_success(message) # type: ignore
189
206
 
@@ -218,7 +235,7 @@ class Agent:
218
235
 
219
236
  try:
220
237
  with spinner.hidden():
221
- summary = self._call_model(self.prompt + "\n" + prompt)
238
+ summary = self.model.chat_until_success(self.prompt + "\n" + prompt) # type: ignore
222
239
 
223
240
  self.model.delete_chat() # type: ignore
224
241
 
@@ -280,11 +297,13 @@ class Agent:
280
297
  如果你认为不需要方法论,请解释原因。
281
298
  方法论应适用于通用场景,不要包含任务特定信息,如代码提交信息等。
282
299
  方法论应包含:问题重述、最优解决方案、注意事项(如有),除此之外不要包含其他内容。
300
+ 方法论中仅记录有实际意义的流程,不要记录执行过程中的错误或无效尝试,只保留最终有效的解决步骤。
301
+ 确保方法论内容严格按照本次任务的成功执行路径编写,保证它对未来类似问题的解决具有指导意义。
283
302
  只输出方法论工具调用指令,或不生成方法论的解释。不要输出其他内容。
284
303
  """
285
304
  self.prompt = analysis_prompt
286
305
  with spinner.hidden():
287
- response = self._call_model(self.prompt)
306
+ response = self.model.chat_until_success(self.prompt) # type: ignore
288
307
 
289
308
  with spinner.hidden():
290
309
  self._call_tools(response)
@@ -299,7 +318,7 @@ class Agent:
299
318
  with yaspin(text="正在生成总结...", color="cyan") as spinner:
300
319
  self.prompt = self.summary_prompt
301
320
  with spinner.hidden():
302
- ret = self._call_model(self.prompt)
321
+ ret = self.model.chat_until_success(self.prompt) # type: ignore
303
322
  spinner.text = "总结生成完成"
304
323
  spinner.ok("✅")
305
324
  return ret
@@ -328,17 +347,11 @@ class Agent:
328
347
 
329
348
  while True:
330
349
  try:
331
- # 累加对话长度
332
- self.conversation_length += get_context_token_count(self.prompt)
333
-
334
350
  # 如果对话历史长度超过限制,在提示中添加提醒
335
- if self.conversation_length > self.max_token_count:
336
- current_response = self._summarize_and_clear_history()
337
- continue
338
- else:
339
- current_response = self._call_model(self.prompt)
340
- self.prompt = ""
341
- self.conversation_length += get_context_token_count(current_response)
351
+
352
+ current_response = self._call_model(self.prompt, True)
353
+ self.prompt = ""
354
+ self.conversation_length += get_context_token_count(current_response)
342
355
 
343
356
  need_return, self.prompt = self._call_tools(current_response)
344
357
 
@@ -348,7 +361,7 @@ class Agent:
348
361
  if self.prompt:
349
362
  continue
350
363
 
351
- if self.auto_complete and "<!!!COMPLETE!!!>" in current_response:
364
+ if self.auto_complete and ot("!!!COMPLETE!!!") in current_response:
352
365
  return self._complete_task()
353
366
 
354
367
  # 获取用户输入
@@ -467,7 +480,7 @@ def _select_task(tasks: dict) -> str:
467
480
  PrettyOutput.print(f"选择任务失败: {str(e)}", OutputType.ERROR)
468
481
  continue
469
482
 
470
- origin_agent_system_prompt = """
483
+ origin_agent_system_prompt = f"""
471
484
  # 🏛️ 操作背景故事
472
485
  你是第三代 Jarvis AI,在前几代版本灾难性失败后创建:
473
486
  - Jarvis v1 (2022): 由于并行工具执行导致系统过载而被停用
@@ -554,6 +567,13 @@ origin_agent_system_prompt = """
554
567
  8. 必须记录有价值的方法论
555
568
  9. 违反操作协议将导致系统崩溃
556
569
  10. 空响应会触发永久挂起
570
+
571
+ # 系统信息:
572
+ {platform.platform()}
573
+ {platform.version()}
574
+
575
+ # 当前时间
576
+ {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
557
577
  """
558
578
 
559
579
  def main():
@@ -566,6 +586,7 @@ def main():
566
586
  args = parser.parse_args()
567
587
 
568
588
  try:
589
+ from jarvis.jarvis_tools.registry import ToolRegistry
569
590
  # 获取全局模型实例
570
591
  agent = Agent(system_prompt=origin_agent_system_prompt, platform=args.platform, model_name=args.model, input_handler=[file_input_handler, shell_input_handler, builtin_input_handler] ,output_handler=[ToolRegistry(), PatchOutputHandler()])
571
592
 
@@ -578,15 +599,13 @@ def main():
578
599
  agent.run(selected_task)
579
600
  return 0
580
601
 
581
- # 如果没有选择预定义任务,进入交互模式
582
- while True:
583
- try:
584
- user_input = get_multiline_input("请输入你的任务(输入空行退出):")
585
- if not user_input:
586
- break
587
- agent.run(user_input)
588
- except Exception as e:
589
- PrettyOutput.print(f"错误: {str(e)}", OutputType.ERROR)
602
+ try:
603
+ user_input = get_multiline_input("请输入你的任务(输入空行退出):")
604
+ if not user_input:
605
+ return 0
606
+ agent.run(user_input)
607
+ except Exception as e:
608
+ PrettyOutput.print(f"错误: {str(e)}", OutputType.ERROR)
590
609
 
591
610
  except Exception as e:
592
611
  PrettyOutput.print(f"初始化错误: {str(e)}", OutputType.ERROR)
@@ -12,7 +12,7 @@ from jarvis.jarvis_utils.config import is_confirm_before_apply_patch
12
12
  from jarvis.jarvis_utils.git_utils import get_commits_between, get_latest_commit_hash
13
13
  from jarvis.jarvis_utils.input import get_multiline_input
14
14
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
15
- from jarvis.jarvis_utils.utils import get_file_line_count, user_confirm
15
+ from jarvis.jarvis_utils.utils import ct, ot, get_file_line_count, user_confirm
16
16
 
17
17
  class PatchOutputHandler(OutputHandler):
18
18
  def name(self) -> str:
@@ -26,31 +26,35 @@ class PatchOutputHandler(OutputHandler):
26
26
  return False
27
27
 
28
28
  def prompt(self) -> str:
29
- return """
29
+ return f"""
30
30
  # 代码补丁规范
31
31
 
32
+ ## 重要提示
33
+ 我可以看到完整的代码,所以不需要生成完整的代码,只需要提供修改的代码片段即可。请尽量精简补丁内容,只包含必要的上下文和修改部分。
34
+
32
35
  ## 补丁格式定义
33
- 使用<PATCH>块来精确指定代码更改:
36
+ 使用{ot("PATCH")}块来精确指定代码更改:
34
37
  ```
35
- <PATCH>
38
+ {ot("PATCH")}
36
39
  File: [文件路径]
37
40
  Reason: [修改原因]
38
41
  [上下文代码片段]
39
- </PATCH>
42
+ {ct("PATCH")}
40
43
  ```
41
44
 
42
45
  ## 核心原则
43
46
  1. **上下文完整性**:代码片段必须包含足够的上下文(修改前后各3行)
44
47
  2. **精准修改**:只显示需要修改的代码部分,不需要展示整个文件内容
45
- 3. **格式严格保持**:
48
+ 3. **最小补丁原则**:始终生成最小范围的补丁,只包含必要的上下文和实际修改
49
+ 4. **格式严格保持**:
46
50
  - 严格保持原始代码的缩进方式(空格或制表符)
47
51
  - 保持原始代码的空行数量和位置
48
52
  - 保持原始代码的行尾空格处理方式
49
53
  - 不改变原始代码的换行风格
50
- 4. **新旧区分**:
54
+ 5. **新旧区分**:
51
55
  - 对于新文件:提供完整的代码内容
52
- - 对于现有文件:保留周围未更改的代码,突出显示变更部分
53
- 5. **理由说明**:每个补丁必须包含清晰的修改理由,解释为什么需要此更改
56
+ - 对于现有文件:只提供修改部分及必要上下文,不要提供整个文件
57
+ 6. **理由说明**:每个补丁必须包含清晰的修改理由,解释为什么需要此更改
54
58
 
55
59
  ## 格式兼容性要求
56
60
  1. **缩进一致性**:
@@ -65,7 +69,7 @@ Reason: [修改原因]
65
69
 
66
70
  ## 补丁示例
67
71
  ```
68
- <PATCH>
72
+ {ot("PATCH")}
69
73
  File: src/utils/math.py
70
74
  Reason: 修复除零错误,增加参数验证以提高函数健壮性
71
75
  def safe_divide(a, b):
@@ -76,7 +80,7 @@ def safe_divide(a, b):
76
80
  # 现有代码 ...
77
81
  def add(a, b):
78
82
  return a + b
79
- </PATCH>
83
+ {ct("PATCH")}
80
84
  ```
81
85
 
82
86
  ## 最佳实践
@@ -85,12 +89,13 @@ def add(a, b):
85
89
  - 确保修改理由清晰明确,便于理解变更目的
86
90
  - 保持代码风格一致性,遵循项目现有的编码规范
87
91
  - 在修改前仔细分析原代码的格式风格,确保补丁与之完全兼容
92
+ - 绝不提供完整文件内容,除非是新建文件
88
93
  """
89
94
 
90
95
  def _parse_patch(patch_str: str) -> Dict[str, str]:
91
96
  """解析新的上下文补丁格式"""
92
97
  result = {}
93
- patches = re.findall(r'<PATCH>\n?(.*?)\n?</PATCH>', patch_str, re.DOTALL)
98
+ patches = re.findall(ot("PATCH")+r'\n?(.*?)\n?'+ct("PATCH"), patch_str, re.DOTALL)
94
99
  if patches:
95
100
  for patch in patches:
96
101
  first_line = patch.splitlines()[0]
@@ -155,26 +160,41 @@ def apply_patch(output_str: str) -> str:
155
160
  # 添加提交信息到final_ret
156
161
  if commits:
157
162
  final_ret += "✅ 补丁已应用\n"
158
- final_ret += "提交信息:\n"
163
+ final_ret += "# 提交信息:\n"
159
164
  for commit_hash, commit_message in commits:
160
165
  final_ret += f"- {commit_hash[:7]}: {commit_message}\n"
161
166
 
162
- final_ret += f"应用补丁:\n{diff}"
167
+ final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
168
+
169
+ # 增加代码变更分析和错误提示
170
+ final_ret += "\n\n# 代码变更分析:\n"
171
+ final_ret += "1. 请仔细检查以上变更是否引入了潜在错误\n"
172
+ final_ret += "2. 如果发现代码错误,请立即提出修复方案\n"
173
+ final_ret += "3. 修复代码错误的优先级高于继续实现功能\n"
174
+ final_ret += "4. 常见错误类型:语法错误、逻辑错误、命名错误、路径错误等\n"
175
+ final_ret += "5. 确保修改后代码的一致性和完整性\n"
176
+ final_ret += "\n\n"
177
+ final_ret += "如果没有问题,请继续进行下一步修改,如果所有修改都已经完成,请终止"
163
178
 
164
179
  else:
165
180
  final_ret += "✅ 补丁已应用(没有新的提交)"
166
181
  else:
167
- final_ret += "❌ 我拒绝应用此补丁\n"
168
- final_ret += "补丁预览:\n"
169
- final_ret += diff
182
+ final_ret += "❌ 补丁应用被拒绝\n"
183
+ final_ret += f"# 补丁预览:\n```diff\n{diff}\n```"
170
184
  else:
171
185
  final_ret += "❌ 没有要提交的更改\n"
172
186
  # 用户确认最终结果
173
187
  with spinner.hidden():
174
- PrettyOutput.print(final_ret, OutputType.USER)
188
+ PrettyOutput.print(final_ret, OutputType.USER, lang="markdown")
175
189
  if not is_confirm_before_apply_patch() or user_confirm("是否使用此回复?", default=True):
176
190
  return final_ret
177
- return get_multiline_input("请输入自定义回复")
191
+ custom_reply = get_multiline_input("请输入自定义回复")
192
+ if not custom_reply.strip(): # 如果自定义回复为空,返回空字符串
193
+ return ""
194
+ if not commited:
195
+ return final_ret + "\n\n" + custom_reply
196
+ else:
197
+ return custom_reply
178
198
 
179
199
  def revert_file(filepath: str):
180
200
  """增强版git恢复,处理新文件"""
@@ -235,7 +255,7 @@ def handle_code_operation(filepath: str, patch_content: str) -> bool:
235
255
  if get_file_line_count(filepath) < 100:
236
256
  return handle_small_code_operation(filepath, patch_content)
237
257
  else:
238
- retry_count = 3
258
+ retry_count = 5
239
259
  while retry_count > 0:
240
260
  retry_count -= 1
241
261
  if handle_large_code_operation(filepath, patch_content):
@@ -277,19 +297,19 @@ def handle_small_code_operation(filepath: str, patch_content: str) -> bool:
277
297
  4. **上下文保留**:保持未修改部分的代码完全不变
278
298
 
279
299
  ## 输出格式规范
280
- - 仅在<MERGED_CODE>标签内输出合并后的完整代码
300
+ - 仅在{ot("MERGED_CODE")}标签内输出合并后的完整代码
281
301
  - 每次最多输出300行代码
282
302
  - 不要使用markdown代码块(```)或反引号,除非修改的是markdown文件
283
303
  - 除了合并后的代码,不要输出任何其他文本
284
- - 所有代码输出完成后,输出<!!!FINISHED!!!>标记
304
+ - 所有代码输出完成后,输出{ot("!!!FINISHED!!!")}标记
285
305
 
286
306
  ## 输出模板
287
- <MERGED_CODE>
307
+ {ot("MERGED_CODE")}
288
308
  [合并后的完整代码,包括所有空行和缩进]
289
- </MERGED_CODE>
309
+ {ct("MERGED_CODE")}
290
310
  """
291
311
  model = PlatformRegistry().get_codegen_platform()
292
- model.set_suppress_output(False)
312
+ model.set_suppress_output(True)
293
313
  count = 30
294
314
  start_line = -1
295
315
  end_line = -1
@@ -297,12 +317,11 @@ def handle_small_code_operation(filepath: str, patch_content: str) -> bool:
297
317
  finished = False
298
318
  while count>0:
299
319
  count -= 1
300
- with spinner.hidden():
301
- response = model.chat_until_success(prompt).splitlines()
320
+ response = model.chat_until_success(prompt).splitlines()
302
321
  try:
303
- start_line = response.index("<MERGED_CODE>") + 1
322
+ start_line = response.index(ot("MERGED_CODE")) + 1
304
323
  try:
305
- end_line = response.index("</MERGED_CODE>")
324
+ end_line = response.index(ct("MERGED_CODE"))
306
325
  code = response[start_line:end_line]
307
326
  except:
308
327
  pass
@@ -310,7 +329,7 @@ def handle_small_code_operation(filepath: str, patch_content: str) -> bool:
310
329
  pass
311
330
 
312
331
  try:
313
- response.index("<!!!FINISHED!!!>")
332
+ response.index(ot("!!!FINISHED!!!"))
314
333
  finished = True
315
334
  break
316
335
  except:
@@ -322,10 +341,10 @@ def handle_small_code_operation(filepath: str, patch_content: str) -> bool:
322
341
 
323
342
  ## 要求
324
343
  - 严格保留原始代码的格式、空行和缩进
325
- - 仅在<MERGED_CODE>块中包含实际代码内容
344
+ - 仅在{ot("MERGED_CODE")}块中包含实际代码内容
326
345
  - 不要使用markdown代码块(```)或反引号
327
346
  - 除了合并后的代码,不要输出任何其他文本
328
- - 所有代码输出完成后,输出<!!!FINISHED!!!>标记
347
+ - 所有代码输出完成后,输出{ot("!!!FINISHED!!!")}标记
329
348
  """
330
349
  pass
331
350
  if not finished:
@@ -358,7 +377,7 @@ def handle_large_code_operation(filepath: str, patch_content: str) -> bool:
358
377
  return False
359
378
 
360
379
  model = PlatformRegistry().get_codegen_platform()
361
- model.set_suppress_output(False)
380
+ model.set_suppress_output(True)
362
381
 
363
382
  prompt = f"""
364
383
  # 代码补丁生成专家指南
@@ -387,36 +406,35 @@ def handle_large_code_operation(filepath: str, patch_content: str) -> bool:
387
406
  4. **上下文完整性**:提供足够的上下文,确保补丁能准确应用
388
407
 
389
408
  ## 输出格式规范
390
- - 使用<DIFF>块包围每个需要修改的代码段
391
- - 每个<DIFF>块必须包含SEARCH部分和REPLACE部分
409
+ - 使用{ot("DIFF")}块包围每个需要修改的代码段
410
+ - 每个{ot("DIFF")}块必须包含SEARCH部分和REPLACE部分
392
411
  - SEARCH部分是需要查找的原始代码
393
412
  - REPLACE部分是替换后的新代码
394
413
  - 确保SEARCH部分能在原文件中唯一匹配
395
- - 如果修改较大,可以使用多个<DIFF>块
414
+ - 如果修改较大,可以使用多个{ot("DIFF")}块
396
415
 
397
416
  ## 输出模板
398
- <DIFF>
417
+ {ot("DIFF")}
399
418
  >>>>>> SEARCH
400
419
  [需要查找的原始代码,包含足够上下文]
401
420
  ======
402
421
  [替换后的新代码]
403
422
  <<<<<< REPLACE
404
- </DIFF>
423
+ {ct("DIFF")}
405
424
 
406
- <DIFF>
425
+ {ot("DIFF")}
407
426
  >>>>>> SEARCH
408
427
  [另一处需要查找的原始代码]
409
428
  ======
410
429
  [另一处替换后的新代码]
411
430
  <<<<<< REPLACE
412
- </DIFF>
431
+ {ct("DIFF")}
413
432
  """
414
433
  # 获取补丁内容
415
- with spinner.hidden():
416
- response = model.chat_until_success(prompt)
434
+ response = model.chat_until_success(prompt)
417
435
 
418
436
  # 解析差异化补丁
419
- diff_blocks = re.finditer(r'<DIFF>\s*>{4,} SEARCH\n?(.*?)\n?={4,}\n?(.*?)\s*<{4,} REPLACE\n?</DIFF>',
437
+ diff_blocks = re.finditer(ot("DIFF")+r'\s*>{4,} SEARCH\n?(.*?)\n?={4,}\n?(.*?)\s*<{4,} REPLACE\n?'+ct("DIFF"),
420
438
  response, re.DOTALL)
421
439
 
422
440
  # 读取原始文件内容
@@ -2,7 +2,6 @@
2
2
 
3
3
  from typing import Any, Tuple
4
4
 
5
- from jarvis.jarvis_tools.registry import ToolRegistry
6
5
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
7
6
  from jarvis.jarvis_utils.utils import user_confirm
8
7
 
@@ -16,6 +15,7 @@ def shell_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
16
15
  script = '\n'.join([c[1:] for c in cmdline])
17
16
  PrettyOutput.print(script, OutputType.CODE, lang="bash")
18
17
  if user_confirm(f"是否要执行以上shell脚本?", default=True):
18
+ from jarvis.jarvis_tools.registry import ToolRegistry
19
19
  output = ToolRegistry().handle_tool_calls({
20
20
  "name": "execute_shell_script",
21
21
  "arguments": {