jarvis-ai-assistant 0.1.149__tar.gz → 0.1.150__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.149/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.150}/PKG-INFO +12 -16
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/README.md +10 -11
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/pyproject.toml +6 -5
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/setup.py +2 -5
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/jarvis.py +7 -5
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_lsp/registry.py +2 -1
- jarvis_ai_assistant-0.1.150/src/jarvis/jarvis_mcp/__init__.py +36 -0
- jarvis_ai_assistant-0.1.150/src/jarvis/jarvis_mcp/local_mcp_client.py +241 -0
- jarvis_ai_assistant-0.1.150/src/jarvis/jarvis_mcp/remote_mcp_client.py +230 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_platform/kimi.py +3 -2
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_platform/registry.py +2 -4
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_platform/yuanbao.py +4 -4
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/file_operation.py +7 -26
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/methodology.py +2 -1
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/registry.py +108 -3
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/config.py +14 -8
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/embedding.py +2 -2
- jarvis_ai_assistant-0.1.150/src/jarvis/jarvis_utils/file_processors.py +81 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/input.py +7 -1
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/methodology.py +2 -2
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/utils.py +5 -5
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150/src/jarvis_ai_assistant.egg-info}/PKG-INFO +12 -16
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +3 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis_ai_assistant.egg-info/requires.txt +1 -4
- jarvis_ai_assistant-0.1.149/src/jarvis/jarvis_utils/file_processors.py +0 -343
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/patch.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_dev/main.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_git_details/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_git_details/main.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_lsp/base.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_lsp/cpp.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_lsp/go.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_lsp/python.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_lsp/rust.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_platform/base.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/chdir.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/code_plan.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/execute_script.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/git_utils.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/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.150
|
|
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
|
|
@@ -43,20 +43,17 @@ License-File: LICENSE
|
|
|
43
43
|
Requires-Dist: requests==2.32.3
|
|
44
44
|
Requires-Dist: colorama==0.4.6
|
|
45
45
|
Requires-Dist: prompt_toolkit==3.0.50
|
|
46
|
-
Requires-Dist: PyMuPDF==1.24.11
|
|
47
46
|
Requires-Dist: yaspin==2.4.0
|
|
48
47
|
Requires-Dist: pygments==2.19.1
|
|
49
48
|
Requires-Dist: fuzzywuzzy==0.18.0
|
|
50
49
|
Requires-Dist: jedi==0.19.2
|
|
51
50
|
Requires-Dist: fastapi==0.115.12
|
|
52
51
|
Requires-Dist: uvicorn==0.33.0
|
|
53
|
-
Requires-Dist: pandas==2.0.3
|
|
54
52
|
Requires-Dist: rich==14.0.0
|
|
55
53
|
Requires-Dist: transformers==4.46.3
|
|
56
|
-
Requires-Dist: python-docx==1.1.2
|
|
57
|
-
Requires-Dist: python-pptx==1.0.2
|
|
58
54
|
Requires-Dist: torch==2.4.1
|
|
59
55
|
Requires-Dist: python-Levenshtein==0.25.1
|
|
56
|
+
Requires-Dist: sseclient==0.0.27
|
|
60
57
|
Provides-Extra: dev
|
|
61
58
|
Requires-Dist: pytest; extra == "dev"
|
|
62
59
|
Requires-Dist: black; extra == "dev"
|
|
@@ -191,13 +188,12 @@ jarvis-methodology --help
|
|
|
191
188
|
|------|----------|--------|------|
|
|
192
189
|
| 核心配置 | `JARVIS_MAX_TOKEN_COUNT` | 102400000 | 上下文窗口的最大token数量 |
|
|
193
190
|
| 核心配置 | `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
|
|
194
|
-
| 核心配置 | `
|
|
195
|
-
| 核心配置 | `JARVIS_AUTO_COMPLETE` | false | 是否启用自动补全功能
|
|
191
|
+
| 核心配置 | `JARVIS_AUTO_COMPLETE` | false | 是否启用自动完成功能(任务判定完成的时候会自动终止) |
|
|
196
192
|
| 核心配置 | `JARVIS_SHELL_NAME` | bash | 系统shell名称 |
|
|
197
193
|
| 核心配置 | `JARVIS_PLATFORM` | yuanbao | 默认AI平台 |
|
|
198
194
|
| 核心配置 | `JARVIS_MODEL` | deep_seek_v3 | 默认模型 |
|
|
199
|
-
| 核心配置 | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM |
|
|
200
|
-
| 核心配置 | `JARVIS_THINKING_MODEL` | JARVIS_MODEL |
|
|
195
|
+
| 核心配置 | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
|
|
196
|
+
| 核心配置 | `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
|
|
201
197
|
| 核心配置 | `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
|
|
202
198
|
| 核心配置 | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
|
|
203
199
|
| 核心配置 | `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
|
|
@@ -212,17 +208,17 @@ jarvis-methodology --help
|
|
|
212
208
|
| ask_user | 交互式用户输入收集 |
|
|
213
209
|
| chdir | 更改当前工作目录 |
|
|
214
210
|
| code_plan | 理解需求并制定详细的代码修改计划,在修改前获取用户确认 |
|
|
215
|
-
| create_code_agent |
|
|
211
|
+
| create_code_agent | 代码开发工具,当需要修改代码时使用 |
|
|
216
212
|
| create_sub_agent | 创建子代理以处理特定任务,子代理将生成任务总结报告 |
|
|
217
213
|
| execute_script | 执行脚本并返回结果,支持任意解释器。 |
|
|
218
214
|
| file_analyzer | 分析文件内容并提取关键信息。支持的文件:文本文件、word文档、pdf文件、图片 |
|
|
219
|
-
| file_operation |
|
|
215
|
+
| file_operation | 文件批量操作工具,可批量读写多个文件,支持文本文件,适用于需要同时处理多个文件的场景(读取配置文件、保存生成内容等) |
|
|
220
216
|
| find_methodology | 方法论查找工具,用于在执行过程中查看历史方法论辅助决策 |
|
|
221
217
|
| lsp_get_diagnostics | 获取代码诊断信息(错误、警告) |
|
|
222
|
-
| methodology |
|
|
218
|
+
| methodology | 方法论管理工具,支持添加、更新和删除操作 |
|
|
223
219
|
| read_code | 代码阅读与分析工具,用于读取源代码文件并添加行号,针对代码文件优化,提供更好的格式化输出和行号显示,适用于代码分析、审查和理解代码实现的场景 |
|
|
224
|
-
| read_webpage |
|
|
225
|
-
| search_web |
|
|
220
|
+
| read_webpage | 读取网页内容并分析 |
|
|
221
|
+
| search_web | 使用互联网搜索 |
|
|
226
222
|
| virtual_tty | 控制虚拟终端执行各种操作,如启动终端、输入命令、获取输出等。 |
|
|
227
223
|
|
|
228
224
|
|
|
@@ -232,7 +228,7 @@ jarvis-methodology --help
|
|
|
232
228
|
---
|
|
233
229
|
## 🛠️ 扩展开发 <a id="extensions"></a>
|
|
234
230
|
### 添加新工具
|
|
235
|
-
在 `~/.jarvis/tools
|
|
231
|
+
在 `~/.jarvis/tools/` 中创建新的 Python 文件:
|
|
236
232
|
```python
|
|
237
233
|
from typing import Dict, Any
|
|
238
234
|
from jarvis.utils import OutputType, PrettyOutput
|
|
@@ -281,7 +277,7 @@ class CustomTool:
|
|
|
281
277
|
|
|
282
278
|
|
|
283
279
|
### 添加新大模型平台
|
|
284
|
-
在 `~/.jarvis/platforms
|
|
280
|
+
在 `~/.jarvis/platforms/` 中创建新的 Python 文件:
|
|
285
281
|
```python
|
|
286
282
|
from jarvis.jarvis_platform.base import BasePlatform
|
|
287
283
|
class CustomPlatform(BasePlatform):
|
|
@@ -126,13 +126,12 @@ jarvis-methodology --help
|
|
|
126
126
|
|------|----------|--------|------|
|
|
127
127
|
| 核心配置 | `JARVIS_MAX_TOKEN_COUNT` | 102400000 | 上下文窗口的最大token数量 |
|
|
128
128
|
| 核心配置 | `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
|
|
129
|
-
| 核心配置 | `
|
|
130
|
-
| 核心配置 | `JARVIS_AUTO_COMPLETE` | false | 是否启用自动补全功能
|
|
129
|
+
| 核心配置 | `JARVIS_AUTO_COMPLETE` | false | 是否启用自动完成功能(任务判定完成的时候会自动终止) |
|
|
131
130
|
| 核心配置 | `JARVIS_SHELL_NAME` | bash | 系统shell名称 |
|
|
132
131
|
| 核心配置 | `JARVIS_PLATFORM` | yuanbao | 默认AI平台 |
|
|
133
132
|
| 核心配置 | `JARVIS_MODEL` | deep_seek_v3 | 默认模型 |
|
|
134
|
-
| 核心配置 | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM |
|
|
135
|
-
| 核心配置 | `JARVIS_THINKING_MODEL` | JARVIS_MODEL |
|
|
133
|
+
| 核心配置 | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
|
|
134
|
+
| 核心配置 | `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
|
|
136
135
|
| 核心配置 | `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
|
|
137
136
|
| 核心配置 | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
|
|
138
137
|
| 核心配置 | `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
|
|
@@ -147,17 +146,17 @@ jarvis-methodology --help
|
|
|
147
146
|
| ask_user | 交互式用户输入收集 |
|
|
148
147
|
| chdir | 更改当前工作目录 |
|
|
149
148
|
| code_plan | 理解需求并制定详细的代码修改计划,在修改前获取用户确认 |
|
|
150
|
-
| create_code_agent |
|
|
149
|
+
| create_code_agent | 代码开发工具,当需要修改代码时使用 |
|
|
151
150
|
| create_sub_agent | 创建子代理以处理特定任务,子代理将生成任务总结报告 |
|
|
152
151
|
| execute_script | 执行脚本并返回结果,支持任意解释器。 |
|
|
153
152
|
| file_analyzer | 分析文件内容并提取关键信息。支持的文件:文本文件、word文档、pdf文件、图片 |
|
|
154
|
-
| file_operation |
|
|
153
|
+
| file_operation | 文件批量操作工具,可批量读写多个文件,支持文本文件,适用于需要同时处理多个文件的场景(读取配置文件、保存生成内容等) |
|
|
155
154
|
| find_methodology | 方法论查找工具,用于在执行过程中查看历史方法论辅助决策 |
|
|
156
155
|
| lsp_get_diagnostics | 获取代码诊断信息(错误、警告) |
|
|
157
|
-
| methodology |
|
|
156
|
+
| methodology | 方法论管理工具,支持添加、更新和删除操作 |
|
|
158
157
|
| read_code | 代码阅读与分析工具,用于读取源代码文件并添加行号,针对代码文件优化,提供更好的格式化输出和行号显示,适用于代码分析、审查和理解代码实现的场景 |
|
|
159
|
-
| read_webpage |
|
|
160
|
-
| search_web |
|
|
158
|
+
| read_webpage | 读取网页内容并分析 |
|
|
159
|
+
| search_web | 使用互联网搜索 |
|
|
161
160
|
| virtual_tty | 控制虚拟终端执行各种操作,如启动终端、输入命令、获取输出等。 |
|
|
162
161
|
|
|
163
162
|
|
|
@@ -167,7 +166,7 @@ jarvis-methodology --help
|
|
|
167
166
|
---
|
|
168
167
|
## 🛠️ 扩展开发 <a id="extensions"></a>
|
|
169
168
|
### 添加新工具
|
|
170
|
-
在 `~/.jarvis/tools
|
|
169
|
+
在 `~/.jarvis/tools/` 中创建新的 Python 文件:
|
|
171
170
|
```python
|
|
172
171
|
from typing import Dict, Any
|
|
173
172
|
from jarvis.utils import OutputType, PrettyOutput
|
|
@@ -216,7 +215,7 @@ class CustomTool:
|
|
|
216
215
|
|
|
217
216
|
|
|
218
217
|
### 添加新大模型平台
|
|
219
|
-
在 `~/.jarvis/platforms
|
|
218
|
+
在 `~/.jarvis/platforms/` 中创建新的 Python 文件:
|
|
220
219
|
```python
|
|
221
220
|
from jarvis.jarvis_platform.base import BasePlatform
|
|
222
221
|
class CustomPlatform(BasePlatform):
|
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
requires = ["setuptools>=45", "wheel"]
|
|
3
3
|
build-backend = "setuptools.build_meta"
|
|
4
4
|
|
|
5
|
+
[[tool.uv.index]]
|
|
6
|
+
url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
|
|
7
|
+
default = true
|
|
8
|
+
|
|
5
9
|
[project]
|
|
6
10
|
name = "jarvis-ai-assistant"
|
|
7
|
-
version = "0.1.
|
|
11
|
+
version = "0.1.150"
|
|
8
12
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
|
9
13
|
readme = "README.md"
|
|
10
14
|
authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
|
|
@@ -25,20 +29,17 @@ dependencies = [
|
|
|
25
29
|
"requests==2.32.3",
|
|
26
30
|
"colorama==0.4.6",
|
|
27
31
|
"prompt_toolkit==3.0.50",
|
|
28
|
-
"PyMuPDF==1.24.11",
|
|
29
32
|
"yaspin==2.4.0",
|
|
30
33
|
"pygments==2.19.1",
|
|
31
34
|
"fuzzywuzzy==0.18.0",
|
|
32
35
|
"jedi==0.19.2",
|
|
33
36
|
"fastapi==0.115.12",
|
|
34
37
|
"uvicorn==0.33.0",
|
|
35
|
-
"pandas==2.0.3",
|
|
36
38
|
"rich==14.0.0",
|
|
37
39
|
"transformers==4.46.3",
|
|
38
|
-
"python-docx==1.1.2",
|
|
39
|
-
"python-pptx==1.0.2",
|
|
40
40
|
"torch==2.4.1",
|
|
41
41
|
"python-Levenshtein==0.25.1",
|
|
42
|
+
"sseclient==0.0.27",
|
|
42
43
|
]
|
|
43
44
|
requires-python = ">=3.8"
|
|
44
45
|
|
|
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|
|
2
2
|
|
|
3
3
|
setup(
|
|
4
4
|
name="jarvis-ai-assistant",
|
|
5
|
-
version="0.1.
|
|
5
|
+
version="0.1.150",
|
|
6
6
|
author="skyfire",
|
|
7
7
|
author_email="skyfireitdiy@hotmail.com",
|
|
8
8
|
description="An AI assistant that uses various tools to interact with the system",
|
|
@@ -16,20 +16,17 @@ setup(
|
|
|
16
16
|
"requests==2.32.3",
|
|
17
17
|
"colorama==0.4.6",
|
|
18
18
|
"prompt_toolkit==3.0.50",
|
|
19
|
-
"PyMuPDF==1.24.11",
|
|
20
19
|
"yaspin==2.4.0",
|
|
21
20
|
"pygments==2.19.1",
|
|
22
21
|
"fuzzywuzzy==0.18.0",
|
|
23
22
|
"jedi==0.19.2",
|
|
24
23
|
"fastapi==0.115.12",
|
|
25
24
|
"uvicorn==0.33.0",
|
|
26
|
-
"pandas==2.0.3",
|
|
27
25
|
"rich==14.0.0",
|
|
28
26
|
"transformers==4.46.3",
|
|
29
|
-
"python-docx==1.1.2",
|
|
30
|
-
"python-pptx==1.0.2",
|
|
31
27
|
"torch==2.4.1",
|
|
32
28
|
"python-Levenshtein==0.25.1",
|
|
29
|
+
"sseclient==0.0.27",
|
|
33
30
|
],
|
|
34
31
|
entry_points={
|
|
35
32
|
"console_scripts": [
|
{jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_agent/jarvis.py
RENAMED
|
@@ -4,6 +4,7 @@ import sys
|
|
|
4
4
|
|
|
5
5
|
from typing import Dict # 仅保留实际使用的类型导入
|
|
6
6
|
|
|
7
|
+
from jarvis.jarvis_utils.config import get_data_dir
|
|
7
8
|
from prompt_toolkit import prompt
|
|
8
9
|
import yaml
|
|
9
10
|
from yaspin import yaspin
|
|
@@ -25,13 +26,14 @@ def _load_tasks() -> Dict[str, str]:
|
|
|
25
26
|
"""Load tasks from .jarvis files in user home and current directory."""
|
|
26
27
|
tasks: Dict[str, str] = {}
|
|
27
28
|
|
|
28
|
-
# Check
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
# Check pre-command in data directory
|
|
30
|
+
data_dir = get_data_dir()
|
|
31
|
+
pre_command_path = os.path.join(data_dir, "pre-command")
|
|
32
|
+
if os.path.exists(pre_command_path):
|
|
33
|
+
spinner_text = f"从{pre_command_path}加载预定义任务..."
|
|
32
34
|
with yaspin(text=spinner_text, color="cyan") as spinner:
|
|
33
35
|
try:
|
|
34
|
-
with open(
|
|
36
|
+
with open(pre_command_path, "r", encoding="utf-8", errors="ignore") as f:
|
|
35
37
|
user_tasks = yaml.safe_load(f)
|
|
36
38
|
if isinstance(user_tasks, dict):
|
|
37
39
|
for name, desc in user_tasks.items():
|
{jarvis_ai_assistant-0.1.149 → jarvis_ai_assistant-0.1.150}/src/jarvis/jarvis_lsp/registry.py
RENAMED
|
@@ -6,6 +6,7 @@ import sys
|
|
|
6
6
|
from typing import Dict, Type, Optional, List
|
|
7
7
|
from jarvis.jarvis_lsp.base import BaseLSP
|
|
8
8
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
9
|
+
from jarvis.jarvis_utils.config import get_data_dir
|
|
9
10
|
|
|
10
11
|
REQUIRED_METHODS = [
|
|
11
12
|
('initialize', ['workspace_path']),
|
|
@@ -21,7 +22,7 @@ class LSPRegistry:
|
|
|
21
22
|
@staticmethod
|
|
22
23
|
def get_lsp_dir() -> str:
|
|
23
24
|
"""Get LSP implementation directory."""
|
|
24
|
-
user_lsp_dir = os.path.
|
|
25
|
+
user_lsp_dir = os.path.join(get_data_dir(), "lsp")
|
|
25
26
|
if not os.path.exists(user_lsp_dir):
|
|
26
27
|
try:
|
|
27
28
|
os.makedirs(user_lsp_dir)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Any, Dict, List
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class McpClient(ABC):
|
|
6
|
+
"""MCP客户端抽象基类"""
|
|
7
|
+
|
|
8
|
+
@abstractmethod
|
|
9
|
+
def get_tool_list(self) -> List[Dict[str, Any]]:
|
|
10
|
+
"""获取工具列表
|
|
11
|
+
|
|
12
|
+
返回:
|
|
13
|
+
List[Dict[str, Any]]: 工具列表,每个工具包含以下字段:
|
|
14
|
+
- name: str - 工具名称
|
|
15
|
+
- description: str - 工具描述
|
|
16
|
+
- parameters: Dict - 工具参数
|
|
17
|
+
"""
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def execute(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:
|
|
22
|
+
"""执行工具
|
|
23
|
+
|
|
24
|
+
参数:
|
|
25
|
+
tool_name: 工具名称
|
|
26
|
+
arguments: 参数字典,包含工具执行所需的参数
|
|
27
|
+
|
|
28
|
+
返回:
|
|
29
|
+
Dict[str, Any]: 执行结果,包含以下字段:
|
|
30
|
+
- success: bool - 是否执行成功
|
|
31
|
+
- stdout: str - 标准输出
|
|
32
|
+
- stderr: str - 标准错误
|
|
33
|
+
"""
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
from typing import Any, Dict, List
|
|
2
|
+
import subprocess
|
|
3
|
+
import os
|
|
4
|
+
import json
|
|
5
|
+
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
6
|
+
from . import McpClient
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class LocalMcpClient(McpClient):
|
|
10
|
+
"""本地MCP客户端实现
|
|
11
|
+
|
|
12
|
+
参数:
|
|
13
|
+
config: 配置字典(command、args、env)
|
|
14
|
+
"""
|
|
15
|
+
def __init__(self, config: Dict[str, Any]):
|
|
16
|
+
self.config = config
|
|
17
|
+
self.process = None
|
|
18
|
+
self.protocol_version = "2025-03-26" # MCP协议版本
|
|
19
|
+
self._start_process()
|
|
20
|
+
self._initialize()
|
|
21
|
+
|
|
22
|
+
def _start_process(self) -> None:
|
|
23
|
+
"""启动MCP进程"""
|
|
24
|
+
try:
|
|
25
|
+
# 构建命令和参数
|
|
26
|
+
command = self.config.get('command', '')
|
|
27
|
+
if not command:
|
|
28
|
+
raise ValueError('No command specified in config')
|
|
29
|
+
|
|
30
|
+
# 获取参数列表
|
|
31
|
+
args = self.config.get('args', [])
|
|
32
|
+
if not isinstance(args, list):
|
|
33
|
+
args = [str(args)]
|
|
34
|
+
|
|
35
|
+
# 获取环境变量
|
|
36
|
+
env = os.environ.copy()
|
|
37
|
+
env.update(self.config.get('env', {}))
|
|
38
|
+
|
|
39
|
+
# 启动进程
|
|
40
|
+
self.process = subprocess.Popen(
|
|
41
|
+
[command] + args,
|
|
42
|
+
stdin=subprocess.PIPE,
|
|
43
|
+
stdout=subprocess.PIPE,
|
|
44
|
+
stderr=subprocess.PIPE,
|
|
45
|
+
env=env,
|
|
46
|
+
text=True
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
except Exception as e:
|
|
50
|
+
PrettyOutput.print(f"启动MCP进程失败: {str(e)}", OutputType.ERROR)
|
|
51
|
+
raise
|
|
52
|
+
|
|
53
|
+
def _initialize(self) -> None:
|
|
54
|
+
"""初始化MCP连接"""
|
|
55
|
+
try:
|
|
56
|
+
# 发送初始化请求
|
|
57
|
+
response = self._send_request('initialize', {
|
|
58
|
+
'processId': os.getpid(),
|
|
59
|
+
'clientInfo': {
|
|
60
|
+
'name': 'jarvis',
|
|
61
|
+
'version': '1.0.0'
|
|
62
|
+
},
|
|
63
|
+
'capabilities': {},
|
|
64
|
+
'protocolVersion': self.protocol_version
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
# 验证服务器响应
|
|
68
|
+
if 'result' not in response:
|
|
69
|
+
raise RuntimeError(f"初始化失败: {response.get('error', 'Unknown error')}")
|
|
70
|
+
|
|
71
|
+
result = response['result']
|
|
72
|
+
|
|
73
|
+
# 发送initialized通知 - 使用正确的方法名格式
|
|
74
|
+
self._send_notification('notifications/initialized', {})
|
|
75
|
+
|
|
76
|
+
except Exception as e:
|
|
77
|
+
PrettyOutput.print(f"MCP初始化失败: {str(e)}", OutputType.ERROR)
|
|
78
|
+
raise
|
|
79
|
+
|
|
80
|
+
def _send_request(self, method: str, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
81
|
+
"""发送请求到MCP进程
|
|
82
|
+
|
|
83
|
+
参数:
|
|
84
|
+
method: 请求方法
|
|
85
|
+
params: 请求参数
|
|
86
|
+
|
|
87
|
+
返回:
|
|
88
|
+
Dict[str, Any]: 响应结果
|
|
89
|
+
"""
|
|
90
|
+
if not self.process:
|
|
91
|
+
raise RuntimeError('MCP process not started')
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
# 构建请求
|
|
95
|
+
request = {
|
|
96
|
+
'jsonrpc': '2.0',
|
|
97
|
+
'method': method,
|
|
98
|
+
'params': params,
|
|
99
|
+
'id': 1
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# 发送请求
|
|
103
|
+
self.process.stdin.write(json.dumps(request) + '\n') # type: ignore
|
|
104
|
+
self.process.stdin.flush() # type: ignore
|
|
105
|
+
|
|
106
|
+
# 读取响应
|
|
107
|
+
response = self.process.stdout.readline() # type: ignore
|
|
108
|
+
return json.loads(response)
|
|
109
|
+
|
|
110
|
+
except Exception as e:
|
|
111
|
+
PrettyOutput.print(f"发送请求失败: {str(e)}", OutputType.ERROR)
|
|
112
|
+
raise
|
|
113
|
+
|
|
114
|
+
def _send_notification(self, method: str, params: Dict[str, Any]) -> None:
|
|
115
|
+
"""发送通知到MCP进程(不需要响应)
|
|
116
|
+
|
|
117
|
+
参数:
|
|
118
|
+
method: 通知方法
|
|
119
|
+
params: 通知参数
|
|
120
|
+
"""
|
|
121
|
+
if not self.process:
|
|
122
|
+
raise RuntimeError('MCP process not started')
|
|
123
|
+
|
|
124
|
+
try:
|
|
125
|
+
# 构建通知
|
|
126
|
+
notification = {
|
|
127
|
+
'jsonrpc': '2.0',
|
|
128
|
+
'method': method,
|
|
129
|
+
'params': params
|
|
130
|
+
}
|
|
131
|
+
# 发送通知
|
|
132
|
+
self.process.stdin.write(json.dumps(notification) + '\n') # type: ignore
|
|
133
|
+
self.process.stdin.flush() # type: ignore
|
|
134
|
+
|
|
135
|
+
except Exception as e:
|
|
136
|
+
PrettyOutput.print(f"发送通知失败: {str(e)}", OutputType.ERROR)
|
|
137
|
+
raise
|
|
138
|
+
|
|
139
|
+
def get_tool_list(self) -> List[Dict[str, Any]]:
|
|
140
|
+
"""获取工具列表
|
|
141
|
+
|
|
142
|
+
返回:
|
|
143
|
+
List[Dict[str, Any]]: 工具列表,每个工具包含以下字段:
|
|
144
|
+
- name: str - 工具名称
|
|
145
|
+
- description: str - 工具描述
|
|
146
|
+
- parameters: Dict - 工具参数
|
|
147
|
+
"""
|
|
148
|
+
try:
|
|
149
|
+
response = self._send_request('tools/list', {})
|
|
150
|
+
if 'result' in response and 'tools' in response['result']:
|
|
151
|
+
# 注意这里: 响应结构是 response['result']['tools']
|
|
152
|
+
tools = response['result']['tools']
|
|
153
|
+
# 将MCP协议字段转换为内部格式
|
|
154
|
+
formatted_tools = []
|
|
155
|
+
for tool in tools:
|
|
156
|
+
# 从inputSchema中提取参数定义
|
|
157
|
+
input_schema = tool.get('inputSchema', {})
|
|
158
|
+
parameters = {}
|
|
159
|
+
if 'properties' in input_schema:
|
|
160
|
+
parameters = input_schema['properties']
|
|
161
|
+
|
|
162
|
+
formatted_tools.append({
|
|
163
|
+
'name': tool.get('name', ''),
|
|
164
|
+
'description': tool.get('description', ''),
|
|
165
|
+
'parameters': parameters
|
|
166
|
+
})
|
|
167
|
+
return formatted_tools
|
|
168
|
+
else:
|
|
169
|
+
error_msg = "获取工具列表失败"
|
|
170
|
+
if 'error' in response:
|
|
171
|
+
error_msg += f": {response['error']}"
|
|
172
|
+
elif 'result' in response:
|
|
173
|
+
error_msg += f": 响应格式不正确 - {response['result']}"
|
|
174
|
+
else:
|
|
175
|
+
error_msg += ": 未知错误"
|
|
176
|
+
|
|
177
|
+
PrettyOutput.print(error_msg, OutputType.ERROR)
|
|
178
|
+
return []
|
|
179
|
+
except Exception as e:
|
|
180
|
+
PrettyOutput.print(f"获取工具列表失败: {str(e)}", OutputType.ERROR)
|
|
181
|
+
return []
|
|
182
|
+
|
|
183
|
+
def execute(self, tool_name: str, arguments: Dict[str, Any]) -> Dict[str, Any]:
|
|
184
|
+
"""执行工具
|
|
185
|
+
|
|
186
|
+
参数:
|
|
187
|
+
tool_name: 工具名称
|
|
188
|
+
arguments: 参数字典,包含工具执行所需的参数
|
|
189
|
+
|
|
190
|
+
返回:
|
|
191
|
+
Dict[str, Any]: 执行结果,包含以下字段:
|
|
192
|
+
- success: bool - 是否执行成功
|
|
193
|
+
- stdout: str - 标准输出
|
|
194
|
+
- stderr: str - 标准错误
|
|
195
|
+
"""
|
|
196
|
+
try:
|
|
197
|
+
response = self._send_request('tools/call', {
|
|
198
|
+
'name': tool_name,
|
|
199
|
+
'arguments': arguments
|
|
200
|
+
})
|
|
201
|
+
if 'result' in response:
|
|
202
|
+
result = response['result']
|
|
203
|
+
# 从content中提取输出信息
|
|
204
|
+
stdout = ''
|
|
205
|
+
stderr = ''
|
|
206
|
+
for content in result.get('content', []):
|
|
207
|
+
if content.get('type') == 'text':
|
|
208
|
+
stdout += content.get('text', '')
|
|
209
|
+
elif content.get('type') == 'error':
|
|
210
|
+
stderr += content.get('text', '')
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
'success': True,
|
|
214
|
+
'stdout': stdout,
|
|
215
|
+
'stderr': stderr
|
|
216
|
+
}
|
|
217
|
+
else:
|
|
218
|
+
return {
|
|
219
|
+
'success': False,
|
|
220
|
+
'stdout': '',
|
|
221
|
+
'stderr': response.get('error', 'Unknown error')
|
|
222
|
+
}
|
|
223
|
+
except Exception as e:
|
|
224
|
+
PrettyOutput.print(f"执行工具失败: {str(e)}", OutputType.ERROR)
|
|
225
|
+
return {
|
|
226
|
+
'success': False,
|
|
227
|
+
'stdout': '',
|
|
228
|
+
'stderr': str(e)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
def __del__(self):
|
|
232
|
+
"""清理资源"""
|
|
233
|
+
if self.process:
|
|
234
|
+
try:
|
|
235
|
+
# 发送退出通知 - 使用通知而非请求
|
|
236
|
+
self._send_notification('notifications/exit', {})
|
|
237
|
+
# 等待进程结束
|
|
238
|
+
self.process.wait(timeout=1)
|
|
239
|
+
except:
|
|
240
|
+
# 如果进程没有正常退出,强制终止
|
|
241
|
+
self.process.kill()
|