jarvis-ai-assistant 0.1.206__tar.gz → 0.1.208__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.
- {jarvis_ai_assistant-0.1.206/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.208}/PKG-INFO +7 -16
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/README.md +6 -14
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/pyproject.toml +1 -3
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/setup.py +5 -12
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/__init__.py +71 -61
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/edit_file_handler.py +42 -46
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/jarvis.py +33 -39
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_agent/code_agent.py +26 -27
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_agent/lint.py +5 -5
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/code_review.py +164 -175
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_data/config_schema.json +1 -1
- jarvis_ai_assistant-0.1.208/src/jarvis/jarvis_git_utils/git_commiter.py +331 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_methodology/main.py +70 -81
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/base.py +28 -23
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/kimi.py +39 -53
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/tongyi.py +108 -126
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/yuanbao.py +112 -120
- jarvis_ai_assistant-0.1.208/src/jarvis/jarvis_platform_manager/main.py +407 -0
- jarvis_ai_assistant-0.1.208/src/jarvis/jarvis_platform_manager/service.py +432 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_smart_shell/main.py +99 -33
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/edit_file.py +64 -55
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/file_analyzer.py +17 -25
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/read_code.py +80 -81
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/builtin_replace_map.py +1 -36
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/config.py +14 -4
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/git_utils.py +36 -35
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/methodology.py +12 -17
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208/src/jarvis_ai_assistant.egg-info}/PKG-INFO +7 -16
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -6
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -1
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -1
- jarvis_ai_assistant-0.1.206/src/jarvis/jarvis_dev/main.py +0 -1247
- jarvis_ai_assistant-0.1.206/src/jarvis/jarvis_git_utils/git_commiter.py +0 -336
- jarvis_ai_assistant-0.1.206/src/jarvis/jarvis_platform_manager/main.py +0 -807
- jarvis_ai_assistant-0.1.206/src/jarvis/jarvis_tools/chdir.py +0 -72
- jarvis_ai_assistant-0.1.206/src/jarvis/jarvis_tools/code_plan.py +0 -218
- jarvis_ai_assistant-0.1.206/src/jarvis/jarvis_tools/create_code_agent.py +0 -95
- jarvis_ai_assistant-0.1.206/src/jarvis/jarvis_tools/create_sub_agent.py +0 -82
- jarvis_ai_assistant-0.1.206/src/jarvis/jarvis_tools/file_operation.py +0 -238
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_data/huggingface.tar.gz +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_git_details/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_git_details/main.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/cli/main.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/execute_script.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/registry.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/input.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/jarvis_history.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_utils/utils.py +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: jarvis-ai-assistant
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.208
|
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,7 +43,6 @@ 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: yaspin==2.4.0
|
47
46
|
Requires-Dist: pygments==2.19.1
|
48
47
|
Requires-Dist: fuzzywuzzy==0.18.0
|
49
48
|
Requires-Dist: fastapi==0.115.12
|
@@ -109,7 +108,6 @@ pip3 install jarvis-ai-assistant
|
|
109
108
|
| `jarvis-platform-manager` | - | 使用平台管理功能 |
|
110
109
|
| `jarvis-code-review` | - | 使用代码审查功能 |
|
111
110
|
| `jarvis-git-commit` | `jgc` | 使用自动化git commit功能 |
|
112
|
-
| `jarvis-dev` | - | 使用dev功能(开发中) |
|
113
111
|
| `jarvis-git-squash` | - | 使用git squash功能 |
|
114
112
|
| `jarvis-multi-agent` | - | 使用多代理功能 |
|
115
113
|
| `jarvis-agent` | - | 使用agent功能 |
|
@@ -529,7 +527,7 @@ OPENAI_API_BASE: https://api.openai.com/v1
|
|
529
527
|
| `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
|
530
528
|
| `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
|
531
529
|
| `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
|
532
|
-
| `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` |
|
530
|
+
| `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | false | 应用补丁前是否需要确认 |
|
533
531
|
| `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
|
534
532
|
| `JARVIS_AUTO_UPDATE` | true | 是否自动更新Jarvis |
|
535
533
|
| `JARVIS_MAX_BIG_CONTENT_SIZE` | 160000 | 最大大内容大小 |
|
@@ -547,15 +545,10 @@ OPENAI_API_BASE: https://api.openai.com/v1
|
|
547
545
|
| 工具名称 | 描述 |
|
548
546
|
|----------|------|
|
549
547
|
| ask_user | 交互式用户输入收集 |
|
550
|
-
| chdir | 更改当前工作目录 |
|
551
548
|
| rewrite_file | 文件重写工具 |
|
552
549
|
| edit_file | 代码编辑工具 |
|
553
|
-
| code_plan | 理解需求并制定代码修改计划 |
|
554
|
-
| create_code_agent | 代码开发工具 |
|
555
|
-
| create_sub_agent | 创建子代理处理特定任务 |
|
556
550
|
| execute_script | 执行脚本并返回结果 |
|
557
551
|
| file_analyzer | 分析文件内容并提取关键信息 |
|
558
|
-
| file_operation | 文件批量操作工具 |
|
559
552
|
| methodology | 方法论管理工具 |
|
560
553
|
| read_code | 代码阅读与分析工具 |
|
561
554
|
| read_webpage | 读取网页内容并分析 |
|
@@ -569,14 +562,12 @@ OPENAI_API_BASE: https://api.openai.com/v1
|
|
569
562
|
|------|------|
|
570
563
|
| `'Summary'` | 总结当前会话并清空历史记录 |
|
571
564
|
| `'Clear'` | 清空当前会话 |
|
572
|
-
| `'
|
573
|
-
| `'
|
574
|
-
| `'
|
575
|
-
| `'
|
576
|
-
| `'FindRelatedFiles'` | 查找相关文件 |
|
577
|
-
| `'FindMethodology'` | 查找方法论 |
|
578
|
-
| `'Dev'` | 调用create_code_agent开发需求 |
|
565
|
+
| `'ToolUsage'` | 显示可用工具列表及使用方法 |
|
566
|
+
| `'ReloadConfig'` | 重新加载配置文件 |
|
567
|
+
| `'Web'` | 网页搜索,支持多种提问格式 |
|
568
|
+
| `'FindRelatedFiles'` | 查找与功能相关的文件 |
|
579
569
|
| `'Fix'` | 修复问题 |
|
570
|
+
| `'Check'` | 执行静态代码检查,包括错误和风格问题 |
|
580
571
|
|
581
572
|
### 3. 自定义替换配置
|
582
573
|
在`~/.jarvis/config.yaml`中添加:
|
@@ -39,7 +39,6 @@ pip3 install jarvis-ai-assistant
|
|
39
39
|
| `jarvis-platform-manager` | - | 使用平台管理功能 |
|
40
40
|
| `jarvis-code-review` | - | 使用代码审查功能 |
|
41
41
|
| `jarvis-git-commit` | `jgc` | 使用自动化git commit功能 |
|
42
|
-
| `jarvis-dev` | - | 使用dev功能(开发中) |
|
43
42
|
| `jarvis-git-squash` | - | 使用git squash功能 |
|
44
43
|
| `jarvis-multi-agent` | - | 使用多代理功能 |
|
45
44
|
| `jarvis-agent` | - | 使用agent功能 |
|
@@ -459,7 +458,7 @@ OPENAI_API_BASE: https://api.openai.com/v1
|
|
459
458
|
| `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
|
460
459
|
| `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
|
461
460
|
| `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
|
462
|
-
| `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` |
|
461
|
+
| `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | false | 应用补丁前是否需要确认 |
|
463
462
|
| `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
|
464
463
|
| `JARVIS_AUTO_UPDATE` | true | 是否自动更新Jarvis |
|
465
464
|
| `JARVIS_MAX_BIG_CONTENT_SIZE` | 160000 | 最大大内容大小 |
|
@@ -477,15 +476,10 @@ OPENAI_API_BASE: https://api.openai.com/v1
|
|
477
476
|
| 工具名称 | 描述 |
|
478
477
|
|----------|------|
|
479
478
|
| ask_user | 交互式用户输入收集 |
|
480
|
-
| chdir | 更改当前工作目录 |
|
481
479
|
| rewrite_file | 文件重写工具 |
|
482
480
|
| edit_file | 代码编辑工具 |
|
483
|
-
| code_plan | 理解需求并制定代码修改计划 |
|
484
|
-
| create_code_agent | 代码开发工具 |
|
485
|
-
| create_sub_agent | 创建子代理处理特定任务 |
|
486
481
|
| execute_script | 执行脚本并返回结果 |
|
487
482
|
| file_analyzer | 分析文件内容并提取关键信息 |
|
488
|
-
| file_operation | 文件批量操作工具 |
|
489
483
|
| methodology | 方法论管理工具 |
|
490
484
|
| read_code | 代码阅读与分析工具 |
|
491
485
|
| read_webpage | 读取网页内容并分析 |
|
@@ -499,14 +493,12 @@ OPENAI_API_BASE: https://api.openai.com/v1
|
|
499
493
|
|------|------|
|
500
494
|
| `'Summary'` | 总结当前会话并清空历史记录 |
|
501
495
|
| `'Clear'` | 清空当前会话 |
|
502
|
-
| `'
|
503
|
-
| `'
|
504
|
-
| `'
|
505
|
-
| `'
|
506
|
-
| `'FindRelatedFiles'` | 查找相关文件 |
|
507
|
-
| `'FindMethodology'` | 查找方法论 |
|
508
|
-
| `'Dev'` | 调用create_code_agent开发需求 |
|
496
|
+
| `'ToolUsage'` | 显示可用工具列表及使用方法 |
|
497
|
+
| `'ReloadConfig'` | 重新加载配置文件 |
|
498
|
+
| `'Web'` | 网页搜索,支持多种提问格式 |
|
499
|
+
| `'FindRelatedFiles'` | 查找与功能相关的文件 |
|
509
500
|
| `'Fix'` | 修复问题 |
|
501
|
+
| `'Check'` | 执行静态代码检查,包括错误和风格问题 |
|
510
502
|
|
511
503
|
### 3. 自定义替换配置
|
512
504
|
在`~/.jarvis/config.yaml`中添加:
|
@@ -8,7 +8,7 @@ default = true
|
|
8
8
|
|
9
9
|
[project]
|
10
10
|
name = "jarvis-ai-assistant"
|
11
|
-
version = "0.1.
|
11
|
+
version = "0.1.208"
|
12
12
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
13
13
|
readme = "README.md"
|
14
14
|
authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
|
@@ -29,7 +29,6 @@ dependencies = [
|
|
29
29
|
"requests==2.32.3",
|
30
30
|
"colorama==0.4.6",
|
31
31
|
"prompt_toolkit==3.0.50",
|
32
|
-
"yaspin==2.4.0",
|
33
32
|
"pygments==2.19.1",
|
34
33
|
"fuzzywuzzy==0.18.0",
|
35
34
|
"fastapi==0.115.12",
|
@@ -61,7 +60,6 @@ jarvis-platform-manager = "jarvis.jarvis_platform_manager.main:main"
|
|
61
60
|
jarvis-git-commit = "jarvis.jarvis_git_utils.git_commiter:main"
|
62
61
|
jarvis-code-review = "jarvis.jarvis_code_analysis.code_review:main"
|
63
62
|
jgc = "jarvis.jarvis_git_utils.git_commiter:main"
|
64
|
-
jarvis-dev = "jarvis.jarvis_dev.main:main"
|
65
63
|
jarvis-git-squash = "jarvis.jarvis_git_squash.main:main"
|
66
64
|
jarvis-multi-agent = "jarvis.jarvis_multi_agent.main:main"
|
67
65
|
jarvis-agent = "jarvis.jarvis_agent.main:main"
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
from setuptools import setup, find_packages
|
2
|
+
from setuptools import setup, find_packages # type: ignore
|
3
3
|
|
4
4
|
setup(
|
5
5
|
name="jarvis-ai-assistant",
|
6
|
-
version="0.1.
|
6
|
+
version="0.1.208",
|
7
7
|
author="skyfire",
|
8
8
|
author_email="skyfireitdiy@hotmail.com",
|
9
9
|
description="An AI assistant that uses various tools to interact with the system",
|
@@ -14,16 +14,12 @@ setup(
|
|
14
14
|
package_dir={"": "src"},
|
15
15
|
include_package_data=True,
|
16
16
|
package_data={
|
17
|
-
"jarvis": [
|
18
|
-
"jarvis_data/huggingface.tar.gz",
|
19
|
-
"jarvis_data/config_schema.json"
|
20
|
-
],
|
17
|
+
"jarvis": ["jarvis_data/huggingface.tar.gz", "jarvis_data/config_schema.json"],
|
21
18
|
},
|
22
19
|
install_requires=[
|
23
20
|
"requests==2.32.3",
|
24
21
|
"colorama==0.4.6",
|
25
22
|
"prompt_toolkit==3.0.50",
|
26
|
-
"yaspin==2.4.0",
|
27
23
|
"pygments==2.19.1",
|
28
24
|
"fuzzywuzzy==0.18.0",
|
29
25
|
"fastapi==0.115.12",
|
@@ -37,9 +33,7 @@ setup(
|
|
37
33
|
"tabulate==0.9.0",
|
38
34
|
"pyte==0.8.2",
|
39
35
|
],
|
40
|
-
extras_require={
|
41
|
-
"dev": ["pytest", "black", "isort", "mypy", "build", "twine"]
|
42
|
-
},
|
36
|
+
extras_require={"dev": ["pytest", "black", "isort", "mypy", "build", "twine"]},
|
43
37
|
entry_points={
|
44
38
|
"console_scripts": [
|
45
39
|
"jarvis=jarvis.jarvis_agent.jarvis:main",
|
@@ -49,9 +43,8 @@ setup(
|
|
49
43
|
"jss=jarvis.jarvis_smart_shell.main:main",
|
50
44
|
"jarvis-platform-manager=jarvis.jarvis_platform_manager.main:main",
|
51
45
|
"jarvis-code-review=jarvis.jarvis_code_analysis.code_review:main",
|
52
|
-
"jarvis-git-commit=jarvis.jarvis_git_utils.git_commiter:main",
|
46
|
+
"jarvis-git-commit=jarvis.jarvis_git_utils.git_commiter:main",
|
53
47
|
"jgc=jarvis.jarvis_git_utils.git_commiter:main",
|
54
|
-
"jarvis-dev=jarvis.jarvis_dev.main:main",
|
55
48
|
"jarvis-git-squash=jarvis.jarvis_git_squash.main:main",
|
56
49
|
"jarvis-multi-agent=jarvis.jarvis_multi_agent.main:main",
|
57
50
|
"jarvis-agent=jarvis.jarvis_agent.main:main",
|
{jarvis_ai_assistant-0.1.206 → jarvis_ai_assistant-0.1.208}/src/jarvis/jarvis_agent/__init__.py
RENAMED
@@ -7,27 +7,35 @@ import platform
|
|
7
7
|
from typing import Any, Callable, Dict, List, Optional, Protocol, Tuple, Union
|
8
8
|
|
9
9
|
# 第三方库导入
|
10
|
-
from yaspin import yaspin # type: ignore
|
11
10
|
|
12
11
|
# 本地库导入
|
13
12
|
# jarvis_agent 相关
|
14
13
|
# jarvis_platform 相关
|
15
14
|
from jarvis.jarvis_platform.base import BasePlatform
|
16
15
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
16
|
+
|
17
17
|
# jarvis_utils 相关
|
18
|
-
from jarvis.jarvis_utils.config import (
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
from jarvis.jarvis_utils.config import (
|
19
|
+
get_data_dir,
|
20
|
+
get_max_token_count,
|
21
|
+
get_max_tool_call_count,
|
22
|
+
is_auto_complete,
|
23
|
+
is_execute_tool_confirm,
|
24
|
+
is_use_analysis,
|
25
|
+
get_history_count,
|
26
|
+
is_use_methodology,
|
27
|
+
)
|
23
28
|
from jarvis.jarvis_utils.embedding import get_context_token_count
|
24
|
-
from jarvis.jarvis_utils.globals import (
|
25
|
-
|
26
|
-
|
29
|
+
from jarvis.jarvis_utils.globals import (
|
30
|
+
delete_agent,
|
31
|
+
get_interrupt,
|
32
|
+
make_agent_name,
|
33
|
+
set_agent,
|
34
|
+
set_interrupt,
|
35
|
+
)
|
27
36
|
from jarvis.jarvis_utils.input import get_multiline_input
|
28
37
|
from jarvis.jarvis_utils.jarvis_history import JarvisHistory
|
29
|
-
from jarvis.jarvis_utils.methodology import
|
30
|
-
upload_methodology)
|
38
|
+
from jarvis.jarvis_utils.methodology import load_methodology, upload_methodology
|
31
39
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
32
40
|
from jarvis.jarvis_utils.tag import ct, ot
|
33
41
|
from jarvis.jarvis_utils.utils import user_confirm
|
@@ -240,11 +248,12 @@ class Agent:
|
|
240
248
|
self.after_tool_call_cb: Optional[Callable[[Agent], None]] = None
|
241
249
|
|
242
250
|
self.history = JarvisHistory()
|
243
|
-
self.history_dir = str(Path(get_data_dir())/"history")
|
251
|
+
self.history_dir = str(Path(get_data_dir()) / "history")
|
244
252
|
self.history.start_record(self.history_dir)
|
245
253
|
|
246
|
-
self.history_count =
|
247
|
-
|
254
|
+
self.history_count = (
|
255
|
+
history_count if history_count is not None else get_history_count()
|
256
|
+
)
|
248
257
|
|
249
258
|
self.execute_tool_confirm = (
|
250
259
|
execute_tool_confirm
|
@@ -422,8 +431,8 @@ class Agent:
|
|
422
431
|
注意:
|
423
432
|
仅生成摘要,不修改对话状态
|
424
433
|
"""
|
425
|
-
|
426
|
-
|
434
|
+
print("📄 正在总结对话历史...")
|
435
|
+
summary_prompt = """
|
427
436
|
<summary_request>
|
428
437
|
<objective>
|
429
438
|
请对当前对话历史进行简明扼要的总结,提取关键信息和重要决策点。这个总结将作为上下文继续任务,因此需要保留对后续对话至关重要的内容。
|
@@ -447,14 +456,11 @@ class Agent:
|
|
447
456
|
"""
|
448
457
|
|
449
458
|
try:
|
450
|
-
|
451
|
-
|
452
|
-
spinner.text = "总结对话历史完成"
|
453
|
-
spinner.ok("✅")
|
459
|
+
summary = self.model.chat_until_success(self.prompt + "\n" + summary_prompt) # type: ignore
|
460
|
+
print("✅ 总结对话历史完成")
|
454
461
|
return summary
|
455
462
|
except Exception as e:
|
456
|
-
|
457
|
-
spinner.fail("❌")
|
463
|
+
print("❌ 总结对话历史失败")
|
458
464
|
return ""
|
459
465
|
|
460
466
|
def _summarize_and_clear_history(self) -> str:
|
@@ -482,6 +488,7 @@ class Agent:
|
|
482
488
|
summary = self.generate_summary()
|
483
489
|
else:
|
484
490
|
import tempfile
|
491
|
+
|
485
492
|
tmp_file = tempfile.NamedTemporaryFile(delete=False)
|
486
493
|
tmp_file_name = tmp_file.name
|
487
494
|
self.history.save_history(tmp_file_name)
|
@@ -553,15 +560,11 @@ class Agent:
|
|
553
560
|
if not self.execute_tool_confirm or user_confirm(
|
554
561
|
f"需要执行{tool_list[0].name()}确认执行?", True
|
555
562
|
):
|
556
|
-
|
557
|
-
|
558
|
-
)
|
559
|
-
|
560
|
-
|
561
|
-
spinner.text = f"{tool_list[0].name()}执行完成"
|
562
|
-
spinner.ok("✅")
|
563
|
-
self.tool_call_count += 1
|
564
|
-
return result
|
563
|
+
print(f"🔧 正在执行{tool_list[0].name()}...")
|
564
|
+
result = tool_list[0].handle(response, self)
|
565
|
+
print(f"✅ {tool_list[0].name()}执行完成")
|
566
|
+
self.tool_call_count += 1
|
567
|
+
return result
|
565
568
|
return False, ""
|
566
569
|
|
567
570
|
def reset_tool_call_count(self):
|
@@ -581,21 +584,19 @@ class Agent:
|
|
581
584
|
if self.use_analysis:
|
582
585
|
self._analysis_task()
|
583
586
|
if self.need_summary:
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
spinner.ok("✅")
|
590
|
-
return ret
|
587
|
+
print("📄 正在生成总结...")
|
588
|
+
self.prompt = self.summary_prompt
|
589
|
+
ret = self.model.chat_until_success(self.prompt) # type: ignore
|
590
|
+
print("✅ 总结生成完成")
|
591
|
+
return ret
|
591
592
|
|
592
593
|
return "任务完成"
|
593
594
|
|
594
595
|
def _analysis_task(self):
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
596
|
+
print("🔍 正在分析任务...")
|
597
|
+
try:
|
598
|
+
# 让模型判断是否需要生成方法论
|
599
|
+
analysis_prompt = f"""<task_analysis>
|
599
600
|
<request>
|
600
601
|
当前任务已结束,请分析该任务的解决方案:
|
601
602
|
1. 首先检查现有工具或方法论是否已经可以完成该任务,如果可以,直接说明即可,无需生成新内容
|
@@ -741,17 +742,12 @@ arguments:
|
|
741
742
|
</output_requirements>
|
742
743
|
</task_analysis>"""
|
743
744
|
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
spinner.text = "分析完成"
|
751
|
-
spinner.ok("✅")
|
752
|
-
except Exception as e:
|
753
|
-
spinner.text = "分析失败"
|
754
|
-
spinner.fail("❌")
|
745
|
+
self.prompt = analysis_prompt
|
746
|
+
response = self.model.chat_until_success(self.prompt) # type: ignore
|
747
|
+
self._call_tools(response)
|
748
|
+
print("✅ 分析完成")
|
749
|
+
except Exception as e:
|
750
|
+
print("❌ 分析失败")
|
755
751
|
|
756
752
|
def make_default_addon_prompt(self, need_complete: bool) -> str:
|
757
753
|
"""生成附加提示。
|
@@ -822,8 +818,13 @@ arguments:
|
|
822
818
|
)
|
823
819
|
if user_input:
|
824
820
|
# 如果有工具调用且用户确认继续,则将干预信息和工具执行结果拼接为prompt
|
825
|
-
if any(
|
826
|
-
|
821
|
+
if any(
|
822
|
+
handler.can_handle(current_response)
|
823
|
+
for handler in self.output_handler
|
824
|
+
):
|
825
|
+
if user_confirm(
|
826
|
+
"检测到有工具调用,是否继续处理工具调用?", True
|
827
|
+
):
|
827
828
|
self.prompt = f"{user_input}\n\n{current_response}"
|
828
829
|
continue
|
829
830
|
self.prompt += f"{user_input}"
|
@@ -871,18 +872,25 @@ arguments:
|
|
871
872
|
history_md = ""
|
872
873
|
if self.history_count > 0 and self.model and self.model.support_upload_files():
|
873
874
|
import tempfile
|
875
|
+
|
874
876
|
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
|
875
|
-
history_md = str(
|
876
|
-
|
877
|
+
history_md = str(
|
878
|
+
Path(tempfile.gettempdir()) / f"{self.name}_history_{timestamp}.md"
|
879
|
+
)
|
880
|
+
self.history.export_history_to_markdown(
|
881
|
+
self.history_dir, history_md, max_files=self.history_count
|
882
|
+
)
|
877
883
|
self.files.append(history_md)
|
878
884
|
|
879
|
-
|
885
|
+
# 如果有上传文件,先上传文件
|
880
886
|
if self.model and self.model.support_upload_files():
|
881
887
|
if self.use_methodology:
|
882
888
|
if not upload_methodology(self.model, other_files=self.files):
|
883
889
|
if self.files:
|
884
|
-
PrettyOutput.print(
|
885
|
-
|
890
|
+
PrettyOutput.print(
|
891
|
+
"文件上传失败,将忽略文件列表", OutputType.WARNING
|
892
|
+
)
|
893
|
+
# 上传失败则回退到本地加载
|
886
894
|
msg = self.prompt
|
887
895
|
for handler in self.input_handler:
|
888
896
|
msg, _ = handler(msg, self)
|
@@ -894,7 +902,9 @@ arguments:
|
|
894
902
|
self.prompt = f"{self.prompt}\n\n上传的文件包含历史对话信息,可以从中获取一些经验信息。"
|
895
903
|
elif self.files:
|
896
904
|
if not self.model.upload_files(self.files):
|
897
|
-
PrettyOutput.print(
|
905
|
+
PrettyOutput.print(
|
906
|
+
"文件上传失败,将忽略文件列表", OutputType.WARNING
|
907
|
+
)
|
898
908
|
else:
|
899
909
|
self.prompt = f"{self.prompt}\n\n上传的文件包含历史对话信息,可以从中获取一些经验信息。"
|
900
910
|
else:
|
@@ -2,9 +2,6 @@ import os
|
|
2
2
|
import re
|
3
3
|
from typing import Any, Dict, List, Tuple
|
4
4
|
|
5
|
-
from yaspin import yaspin # type: ignore
|
6
|
-
from yaspin.core import Yaspin # type: ignore
|
7
|
-
|
8
5
|
from jarvis.jarvis_agent.output_handler import OutputHandler
|
9
6
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
10
7
|
from jarvis.jarvis_utils.git_utils import revert_file
|
@@ -71,19 +68,19 @@ class EditFileHandler(OutputHandler):
|
|
71
68
|
{"SEARCH": diff["SEARCH"], "REPLACE": diff["REPLACE"]} for diff in diffs
|
72
69
|
]
|
73
70
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
71
|
+
print(f"📝 正在处理文件 {file_path}...")
|
72
|
+
# 首先尝试fast_edit模式
|
73
|
+
success, result = self._fast_edit(file_path, file_patches)
|
74
|
+
if not success:
|
75
|
+
# 如果fast_edit失败,尝试slow_edit模式
|
76
|
+
success, result = EditFileHandler._slow_edit(
|
77
|
+
file_path, file_patches, agent
|
78
|
+
)
|
82
79
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
80
|
+
if success:
|
81
|
+
results.append(f"✅ 文件 {file_path} 修改成功")
|
82
|
+
else:
|
83
|
+
results.append(f"❌ 文件 {file_path} 修改失败: {result}")
|
87
84
|
|
88
85
|
summary = "\n".join(results)
|
89
86
|
return False, summary
|
@@ -153,10 +150,11 @@ class EditFileHandler(OutputHandler):
|
|
153
150
|
file_path = match.group(1) or match.group(2) or match.group(3)
|
154
151
|
diffs = []
|
155
152
|
for diff_match in self.diff_pattern.finditer(match.group(0)):
|
153
|
+
# 完全保留原始格式(包括所有空白和换行)
|
156
154
|
diffs.append(
|
157
155
|
{
|
158
|
-
"SEARCH": diff_match.group(1)
|
159
|
-
"REPLACE": diff_match.group(2)
|
156
|
+
"SEARCH": diff_match.group(1), # 原始SEARCH内容
|
157
|
+
"REPLACE": diff_match.group(2), # 原始REPLACE内容
|
160
158
|
}
|
161
159
|
)
|
162
160
|
if diffs:
|
@@ -167,9 +165,7 @@ class EditFileHandler(OutputHandler):
|
|
167
165
|
return patches
|
168
166
|
|
169
167
|
@staticmethod
|
170
|
-
def _fast_edit(
|
171
|
-
file_path: str, patches: List[Dict[str, str]], spinner: Yaspin
|
172
|
-
) -> Tuple[bool, str]:
|
168
|
+
def _fast_edit(file_path: str, patches: List[Dict[str, str]]) -> Tuple[bool, str]:
|
173
169
|
"""快速应用补丁到文件
|
174
170
|
|
175
171
|
该方法直接尝试将补丁应用到目标文件,适用于简单、明确的修改场景。
|
@@ -182,7 +178,6 @@ class EditFileHandler(OutputHandler):
|
|
182
178
|
Args:
|
183
179
|
file_path: 要修改的文件路径,支持绝对路径和相对路径
|
184
180
|
patches: 补丁列表,每个补丁包含search(搜索文本)和replace(替换文本)
|
185
|
-
spinner: 进度显示对象,用于显示处理状态和结果
|
186
181
|
|
187
182
|
Returns:
|
188
183
|
Tuple[bool, str]:
|
@@ -207,17 +202,22 @@ class EditFileHandler(OutputHandler):
|
|
207
202
|
replace_text = patch["REPLACE"]
|
208
203
|
patch_count += 1
|
209
204
|
|
210
|
-
|
211
|
-
|
205
|
+
# 精确匹配搜索文本(保留原始换行和空格)
|
206
|
+
exact_search = search_text
|
207
|
+
|
208
|
+
if exact_search in modified_content:
|
209
|
+
if modified_content.count(exact_search) > 1:
|
212
210
|
PrettyOutput.print(
|
213
|
-
f"搜索文本在文件中存在多处匹配:\n{
|
211
|
+
f"搜索文本在文件中存在多处匹配:\n{exact_search}",
|
214
212
|
output_type=OutputType.WARNING,
|
215
213
|
)
|
216
|
-
return False, f"搜索文本在文件中存在多处匹配:\n{
|
214
|
+
return False, f"搜索文本在文件中存在多处匹配:\n{exact_search}"
|
215
|
+
|
216
|
+
# 直接执行替换(保留所有原始格式)
|
217
217
|
modified_content = modified_content.replace(
|
218
|
-
|
218
|
+
exact_search, replace_text
|
219
219
|
)
|
220
|
-
|
220
|
+
print(f"✅ 补丁 #{patch_count} 应用成功")
|
221
221
|
else:
|
222
222
|
# 尝试增加缩进重试
|
223
223
|
found = False
|
@@ -243,7 +243,7 @@ class EditFileHandler(OutputHandler):
|
|
243
243
|
modified_content = modified_content.replace(
|
244
244
|
indented_search, indented_replace
|
245
245
|
)
|
246
|
-
|
246
|
+
print(
|
247
247
|
f"✅ 补丁 #{patch_count} 应用成功 (自动增加 {space_count} 个空格缩进)"
|
248
248
|
)
|
249
249
|
found = True
|
@@ -260,19 +260,17 @@ class EditFileHandler(OutputHandler):
|
|
260
260
|
with open(file_path, "w", encoding="utf-8") as f:
|
261
261
|
f.write(modified_content)
|
262
262
|
|
263
|
-
|
264
|
-
spinner.ok("✅")
|
263
|
+
print(f"✅ 文件 {file_path} 修改完成,应用了 {patch_count} 个补丁")
|
265
264
|
return True, modified_content
|
266
265
|
|
267
266
|
except Exception as e:
|
268
|
-
|
269
|
-
spinner.fail("❌")
|
267
|
+
print(f"❌ 文件修改失败: {str(e)}")
|
270
268
|
revert_file(file_path)
|
271
269
|
return False, f"文件修改失败: {str(e)}"
|
272
270
|
|
273
271
|
@staticmethod
|
274
272
|
def _slow_edit(
|
275
|
-
file_path: str, patches: List[Dict[str, str]],
|
273
|
+
file_path: str, patches: List[Dict[str, str]], agent: Any
|
276
274
|
) -> Tuple[bool, str]:
|
277
275
|
"""使用AI模型生成补丁并应用到文件
|
278
276
|
|
@@ -287,7 +285,6 @@ class EditFileHandler(OutputHandler):
|
|
287
285
|
Args:
|
288
286
|
file_path: 要修改的文件路径,支持绝对路径和相对路径
|
289
287
|
patches: 补丁列表,每个补丁包含search(搜索文本)和replace(替换文本)
|
290
|
-
spinner: 进度显示对象,用于显示处理状态和结果
|
291
288
|
agent: 执行处理的agent实例,用于访问AI模型平台
|
292
289
|
|
293
290
|
Returns:
|
@@ -308,13 +305,12 @@ class EditFileHandler(OutputHandler):
|
|
308
305
|
upload_success = False
|
309
306
|
|
310
307
|
# 如果是大文件,尝试上传到模型平台
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
upload_success = True
|
308
|
+
if (
|
309
|
+
is_large_context
|
310
|
+
and model.support_upload_files()
|
311
|
+
and model.upload_files([file_path])
|
312
|
+
):
|
313
|
+
upload_success = True
|
318
314
|
|
319
315
|
model.set_suppress_output(True)
|
320
316
|
|
@@ -387,8 +383,9 @@ class EditFileHandler(OutputHandler):
|
|
387
383
|
# 检查是否被中断
|
388
384
|
if get_interrupt():
|
389
385
|
set_interrupt(False)
|
390
|
-
|
391
|
-
|
386
|
+
user_input = agent.multiline_inputer(
|
387
|
+
"补丁应用被中断,请输入补充信息:"
|
388
|
+
)
|
392
389
|
if not user_input.strip():
|
393
390
|
return False, "用户中断了补丁应用"
|
394
391
|
return False, f"用户中断了补丁应用并提供了补充信息: {user_input}"
|
@@ -422,7 +419,7 @@ class EditFileHandler(OutputHandler):
|
|
422
419
|
if generated_patches:
|
423
420
|
# 尝试应用生成的补丁
|
424
421
|
success, result = EditFileHandler._fast_edit(
|
425
|
-
file_path, generated_patches
|
422
|
+
file_path, generated_patches
|
426
423
|
)
|
427
424
|
if success:
|
428
425
|
return True, result
|
@@ -430,7 +427,6 @@ class EditFileHandler(OutputHandler):
|
|
430
427
|
return False, "AI模型无法生成有效的补丁"
|
431
428
|
|
432
429
|
except Exception as e:
|
433
|
-
|
434
|
-
spinner.fail("❌")
|
430
|
+
print(f"❌ 文件修改失败: {str(e)}")
|
435
431
|
revert_file(file_path)
|
436
432
|
return False, f"文件修改失败: {str(e)}"
|