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.
- {jarvis_ai_assistant-0.1.131/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.132}/PKG-INFO +3 -2
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/pyproject.toml +5 -2
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/setup.py +5 -2
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/__init__.py +48 -29
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/patch.py +61 -43
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/shell_input_handler.py +1 -1
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_code_agent/code_agent.py +87 -86
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_dev/main.py +706 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_git_squash/main.py +10 -31
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_multi_agent/__init__.py +19 -28
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/ai8.py +7 -32
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/base.py +2 -7
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/kimi.py +3 -144
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/ollama.py +54 -68
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/openai.py +0 -4
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/oyi.py +0 -75
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_platform/yuanbao.py +264 -0
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_rag/file_processors.py +138 -0
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_rag/main.py +1750 -0
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/ask_codebase.py +288 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/code_review.py +125 -99
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/execute_python_script.py +58 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/execute_shell.py +13 -26
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/execute_shell_script.py +1 -1
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/file_analyzer.py +271 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/file_operation.py +1 -1
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/find_caller.py +213 -0
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/find_symbol.py +211 -0
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/function_analyzer.py +248 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/git_commiter.py +4 -4
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/methodology.py +196 -0
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/project_analyzer.py +220 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/read_code.py +23 -2
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_tools/read_webpage.py +226 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/registry.py +132 -11
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/search_web.py +55 -10
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/tool_generator.py +6 -8
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/__init__.py +1 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/config.py +67 -3
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_utils/embedding.py +501 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/git_utils.py +9 -1
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/input.py +7 -6
- jarvis_ai_assistant-0.1.132/src/jarvis/jarvis_utils/methodology.py +518 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/output.py +5 -3
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/utils.py +59 -7
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132/src/jarvis_ai_assistant.egg-info}/PKG-INFO +3 -2
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +8 -11
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis_ai_assistant.egg-info/entry_points.txt +2 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis_ai_assistant.egg-info/requires.txt +2 -1
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_codebase/main.py +0 -1011
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_dev/main.py +0 -997
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_rag/main.py +0 -870
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/__init__.py +0 -0
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/ask_codebase.py +0 -122
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/methodology.py +0 -155
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/read_webpage.py +0 -112
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_tools/treesitter_analyzer.py +0 -331
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/README.md +0 -104
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/__init__.py +0 -20
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/database.py +0 -258
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/example.py +0 -115
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/grammar_builder.py +0 -182
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/language.py +0 -117
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/symbol.py +0 -31
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_treesitter/tools_usage.md +0 -121
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_utils/embedding.py +0 -202
- jarvis_ai_assistant-0.1.131/src/jarvis/jarvis_utils/methodology.py +0 -146
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/README.md +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_code_agent/file_select.py +0 -0
- {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
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/base.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/cpp.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/go.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/python.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/registry.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_lsp/rust.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform/registry.py +0 -0
- {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
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_platform_manager/openai_test.py +0 -0
- {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
- {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
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {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
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/chdir.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/lsp_find_definition.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/lsp_find_references.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/rag.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_tools/select_code_files.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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:
|
|
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.
|
|
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
|
-
"
|
|
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.
|
|
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
|
-
"
|
|
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",
|
{jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/__init__.py
RENAMED
|
@@ -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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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 "
|
|
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
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
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)
|
{jarvis_ai_assistant-0.1.131 → jarvis_ai_assistant-0.1.132}/src/jarvis/jarvis_agent/patch.py
RENAMED
|
@@ -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
|
-
|
|
36
|
+
使用{ot("PATCH")}块来精确指定代码更改:
|
|
34
37
|
```
|
|
35
|
-
|
|
38
|
+
{ot("PATCH")}
|
|
36
39
|
File: [文件路径]
|
|
37
40
|
Reason: [修改原因]
|
|
38
41
|
[上下文代码片段]
|
|
39
|
-
|
|
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
|
-
|
|
54
|
+
5. **新旧区分**:
|
|
51
55
|
- 对于新文件:提供完整的代码内容
|
|
52
|
-
-
|
|
53
|
-
|
|
56
|
+
- 对于现有文件:只提供修改部分及必要上下文,不要提供整个文件
|
|
57
|
+
6. **理由说明**:每个补丁必须包含清晰的修改理由,解释为什么需要此更改
|
|
54
58
|
|
|
55
59
|
## 格式兼容性要求
|
|
56
60
|
1. **缩进一致性**:
|
|
@@ -65,7 +69,7 @@ Reason: [修改原因]
|
|
|
65
69
|
|
|
66
70
|
## 补丁示例
|
|
67
71
|
```
|
|
68
|
-
|
|
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
|
-
|
|
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'
|
|
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 += "❌
|
|
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
|
-
|
|
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 =
|
|
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
|
-
-
|
|
300
|
+
- 仅在{ot("MERGED_CODE")}标签内输出合并后的完整代码
|
|
281
301
|
- 每次最多输出300行代码
|
|
282
302
|
- 不要使用markdown代码块(```)或反引号,除非修改的是markdown文件
|
|
283
303
|
- 除了合并后的代码,不要输出任何其他文本
|
|
284
|
-
-
|
|
304
|
+
- 所有代码输出完成后,输出{ot("!!!FINISHED!!!")}标记
|
|
285
305
|
|
|
286
306
|
## 输出模板
|
|
287
|
-
|
|
307
|
+
{ot("MERGED_CODE")}
|
|
288
308
|
[合并后的完整代码,包括所有空行和缩进]
|
|
289
|
-
|
|
309
|
+
{ct("MERGED_CODE")}
|
|
290
310
|
"""
|
|
291
311
|
model = PlatformRegistry().get_codegen_platform()
|
|
292
|
-
model.set_suppress_output(
|
|
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
|
-
|
|
301
|
-
response = model.chat_until_success(prompt).splitlines()
|
|
320
|
+
response = model.chat_until_success(prompt).splitlines()
|
|
302
321
|
try:
|
|
303
|
-
start_line = response.index("
|
|
322
|
+
start_line = response.index(ot("MERGED_CODE")) + 1
|
|
304
323
|
try:
|
|
305
|
-
end_line = response.index("
|
|
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("
|
|
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
|
-
-
|
|
344
|
+
- 仅在{ot("MERGED_CODE")}块中包含实际代码内容
|
|
326
345
|
- 不要使用markdown代码块(```)或反引号
|
|
327
346
|
- 除了合并后的代码,不要输出任何其他文本
|
|
328
|
-
-
|
|
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(
|
|
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
|
-
-
|
|
391
|
-
-
|
|
409
|
+
- 使用{ot("DIFF")}块包围每个需要修改的代码段
|
|
410
|
+
- 每个{ot("DIFF")}块必须包含SEARCH部分和REPLACE部分
|
|
392
411
|
- SEARCH部分是需要查找的原始代码
|
|
393
412
|
- REPLACE部分是替换后的新代码
|
|
394
413
|
- 确保SEARCH部分能在原文件中唯一匹配
|
|
395
|
-
-
|
|
414
|
+
- 如果修改较大,可以使用多个{ot("DIFF")}块
|
|
396
415
|
|
|
397
416
|
## 输出模板
|
|
398
|
-
|
|
417
|
+
{ot("DIFF")}
|
|
399
418
|
>>>>>> SEARCH
|
|
400
419
|
[需要查找的原始代码,包含足够上下文]
|
|
401
420
|
======
|
|
402
421
|
[替换后的新代码]
|
|
403
422
|
<<<<<< REPLACE
|
|
404
|
-
|
|
423
|
+
{ct("DIFF")}
|
|
405
424
|
|
|
406
|
-
|
|
425
|
+
{ot("DIFF")}
|
|
407
426
|
>>>>>> SEARCH
|
|
408
427
|
[另一处需要查找的原始代码]
|
|
409
428
|
======
|
|
410
429
|
[另一处替换后的新代码]
|
|
411
430
|
<<<<<< REPLACE
|
|
412
|
-
|
|
431
|
+
{ct("DIFF")}
|
|
413
432
|
"""
|
|
414
433
|
# 获取补丁内容
|
|
415
|
-
|
|
416
|
-
response = model.chat_until_success(prompt)
|
|
434
|
+
response = model.chat_until_success(prompt)
|
|
417
435
|
|
|
418
436
|
# 解析差异化补丁
|
|
419
|
-
diff_blocks = re.finditer(r'
|
|
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": {
|