jarvis-ai-assistant 0.1.167__tar.gz → 0.1.170__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of jarvis-ai-assistant might be problematic. Click here for more details.

Files changed (108) hide show
  1. {jarvis_ai_assistant-0.1.167/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.170}/PKG-INFO +4 -2
  2. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/README.md +1 -0
  3. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/pyproject.toml +1 -1
  4. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/setup.py +1 -1
  5. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/__init__.py +1 -1
  6. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_agent/__init__.py +246 -85
  7. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_agent/jarvis.py +2 -0
  8. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_agent/code_agent.py +3 -3
  9. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/code_review.py +13 -12
  10. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_git_utils/git_commiter.py +6 -5
  11. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform/base.py +33 -20
  12. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/edit_file.py +7 -1
  13. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/generate_new_tool.py +30 -81
  14. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/registry.py +2 -6
  15. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/config.py +10 -1
  16. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/methodology.py +3 -19
  17. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/utils.py +4 -35
  18. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170/src/jarvis_ai_assistant.egg-info}/PKG-INFO +4 -2
  19. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/LICENSE +0 -0
  20. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/MANIFEST.in +0 -0
  21. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/setup.cfg +0 -0
  22. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  23. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
  24. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_agent/main.py +0 -0
  25. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  26. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  27. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  28. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  29. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  30. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  31. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  32. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  33. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  34. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  35. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  36. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  37. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  38. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  39. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  40. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  41. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  42. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  43. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  44. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  45. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  46. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  47. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  48. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_data/huggingface.tar.gz +0 -0
  49. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_dev/main.py +0 -0
  50. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  51. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_git_details/main.py +0 -0
  52. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  53. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_git_squash/main.py +0 -0
  54. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_lsp/base.py +0 -0
  55. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  56. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_lsp/go.py +0 -0
  57. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_lsp/python.py +0 -0
  58. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_lsp/registry.py +0 -0
  59. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_lsp/rust.py +0 -0
  60. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  61. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  62. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  63. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_methodology/main.py +0 -0
  64. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  65. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  66. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform/__init__.py +0 -0
  67. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform/human.py +0 -0
  68. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform/kimi.py +0 -0
  69. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform/openai.py +0 -0
  70. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform/registry.py +0 -0
  71. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  72. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  73. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  74. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  75. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  76. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/__init__.py +0 -0
  77. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
  78. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  79. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/base.py +0 -0
  80. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/chdir.py +0 -0
  81. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  82. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  83. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  84. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  85. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  86. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  87. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
  88. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  89. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/methodology.py +0 -0
  90. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/read_code.py +0 -0
  91. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  92. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  93. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/search_web.py +0 -0
  94. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  95. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/__init__.py +0 -0
  96. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  97. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/embedding.py +0 -0
  98. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  99. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  100. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/globals.py +0 -0
  101. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/input.py +0 -0
  102. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/output.py +0 -0
  103. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis/jarvis_utils/tag.py +0 -0
  104. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  105. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  106. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  107. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  108. {jarvis_ai_assistant-0.1.167 → jarvis_ai_assistant-0.1.170}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.167
3
+ Version: 0.1.170
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
@@ -65,6 +65,7 @@ Requires-Dist: build; extra == "dev"
65
65
  Requires-Dist: twine; extra == "dev"
66
66
  Dynamic: author
67
67
  Dynamic: home-page
68
+ Dynamic: license-file
68
69
  Dynamic: requires-python
69
70
 
70
71
  # 🤖 Jarvis AI 助手
@@ -212,6 +213,7 @@ OPENAI_API_BASE=https://api.openai.com/v1 # 可选,默认为官方API地址
212
213
  | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
213
214
  | `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
214
215
  | `JARVIS_AUTO_UPDATE` | true | 是否自动更新Jarvis(仅在以git仓库方式安装时有效) |
216
+ | `JARVIS_MAX_BIG_CONTENT_SIZE` | 10485760 | 最大大内容大小 |
215
217
 
216
218
  所有配置编写到`~/.jarvis/env`文件中即可生效。
217
219
 
@@ -143,6 +143,7 @@ OPENAI_API_BASE=https://api.openai.com/v1 # 可选,默认为官方API地址
143
143
  | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
144
144
  | `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
145
145
  | `JARVIS_AUTO_UPDATE` | true | 是否自动更新Jarvis(仅在以git仓库方式安装时有效) |
146
+ | `JARVIS_MAX_BIG_CONTENT_SIZE` | 10485760 | 最大大内容大小 |
146
147
 
147
148
  所有配置编写到`~/.jarvis/env`文件中即可生效。
148
149
 
@@ -8,7 +8,7 @@ default = true
8
8
 
9
9
  [project]
10
10
  name = "jarvis-ai-assistant"
11
- version = "0.1.167"
11
+ version = "0.1.170"
12
12
  description = "Jarvis: An AI assistant that uses tools to interact with the system"
13
13
  readme = "README.md"
14
14
  authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
3
3
 
4
4
  setup(
5
5
  name="jarvis-ai-assistant",
6
- version="0.1.167",
6
+ version="0.1.170",
7
7
  author="skyfire",
8
8
  author_email="skyfireitdiy@hotmail.com",
9
9
  description="An AI assistant that uses various tools to interact with the system",
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.1.167"
4
+ __version__ = "0.1.170"
@@ -421,56 +421,27 @@ class Agent:
421
421
 
422
422
  with yaspin(text="正在总结对话历史...", color="cyan") as spinner:
423
423
 
424
- summary_prompt = """<methodology_analysis>
425
- <request>
426
- 当前任务已结束,请分析是否需要生成方法论。基于本次对话的内容和结果:
427
-
428
- 如果你认为需要生成方法论,请先确定是创建新方法论还是更新现有方法论。如果是更新现有方法论,请使用'update',否则使用'add'。
429
- 如果你认为不需要方法论,请解释原因。
430
- </request>
431
-
432
- <evaluation_criteria>
433
- 方法论评估标准:
434
- 1. 方法论应聚焦于通用且可重复的解决方案流程
435
- 2. 方法论应该具备足够的通用性,可应用于同类问题
436
- 3. 特别注意用户在执行过程中提供的修正、反馈和改进建议
437
- 4. 如果用户明确指出了某个解决步骤的优化方向,这应该被纳入方法论
438
- 5. 如果用户在解决过程中发现了更高效的方法,这应被记录并优先使用
439
- </evaluation_criteria>
440
-
441
- <format_requirements>
442
- 方法论格式要求:
443
- 1. 问题重述: 简明扼要的问题归纳,不含特定细节
444
- 2. 最优解决方案: 经过用户验证的、最终有效的解决方案(将每个步骤要使用的工具也列举出来)
445
- 3. 注意事项: 执行中可能遇到的常见问题和注意点,尤其是用户指出的问题
446
- 4. 可选步骤: 对于有多种解决路径的问题,标注出可选步骤和适用场景
447
- </format_requirements>
448
-
449
- <quality_control>
450
- 方法论质量控制:
451
- 1. 只记录有实际意义的流程,不记录执行过程中的错误或无效尝试
452
- 2. 保留最终有效的解决步骤和用户认可的解决方案
453
- 3. 不要包含特定代码片段、文件路径或其他特定于单一任务的细节
454
- 4. 确保方法论遵循用户认可的执行路径,尤其是用户指出的改进点
455
- </quality_control>
456
-
457
- <output_requirements>
458
- 只输出方法论工具调用指令,或不生成方法论的解释。不要输出其他内容。
459
- </output_requirements>
424
+ summary_prompt = """
425
+ <summary_request>
426
+ <objective>
427
+ 请对当前对话历史进行简明扼要的总结,提取关键信息和重要决策点。这个总结将作为上下文继续任务,因此需要保留对后续对话至关重要的内容。
428
+ </objective>
429
+
430
+ <guidelines>
431
+ 1. 提取关键信息:任务目标、已确定的事实、重要决策、达成的共识
432
+ 2. 保留技术细节:命令、代码片段、文件路径、配置设置等技术细节
433
+ 3. 记录任务进展:已完成的步骤、当前所处阶段、待解决的问题
434
+ 4. 包含用户偏好:用户表达的明确偏好、限制条件或特殊要求
435
+ 5. 省略冗余内容:问候语、重复信息、不相关的讨论
436
+ </guidelines>
460
437
 
461
- <template>
462
- 方法论格式:
463
- {ot("TOOL_CALL")}
464
- want: 添加/更新xxxx的方法论
465
- name: methodology
466
- arguments:
467
- operation: add/update
468
- problem_type: 方法论类型,不要过于细节,也不要过于泛化
469
- content: |
470
- 方法论内容
471
- {ct("TOOL_CALL")}
472
- </template>
473
- </methodology_analysis>
438
+ <format>
439
+ - 使用简洁、客观的语言
440
+ - 按时间顺序或主题组织信息
441
+ - 使用要点列表增强可读性
442
+ - 总结应控制在500词以内
443
+ </format>
444
+ </summary_request>
474
445
  """
475
446
 
476
447
  try:
@@ -559,58 +530,162 @@ arguments:
559
530
  2. 对于子Agent: 可能会生成总结(如果启用)
560
531
  3. 使用spinner显示生成状态
561
532
  """
562
- """Complete the current task and generate summary if needed.
563
-
564
- Returns:
565
- str: Task summary or completion status
566
-
567
- Note:
568
- - For main agent: May generate methodology if enabled
569
- - For sub-agent: May generate summary if enabled
570
- """
571
- with yaspin(text="正在生成方法论...", color="cyan") as spinner:
533
+ with yaspin(text="正在分析任务...", color="cyan") as spinner:
572
534
  try:
573
-
574
535
  # 让模型判断是否需要生成方法论
575
- analysis_prompt = f"""<methodology_analysis>
536
+ analysis_prompt = f"""<task_analysis>
576
537
  <request>
577
- 当前任务已结束,请分析是否需要生成方法论。基于本次对话的内容和结果:
538
+ 当前任务已结束,请分析该任务的解决方案:
578
539
 
579
- 如果你认为需要生成方法论,请先确定是创建新方法论还是更新现有方法论。如果是更新现有方法论,请使用'update',否则使用'add'。
580
- 如果你认为不需要方法论,请解释原因。
540
+ 1. 首先检查现有工具或方法论是否已经可以完成该任务,如果可以,直接说明即可,无需生成新内容
541
+ 2. 如果现有工具/方法论不足,评估当前任务是否可以通过编写新工具来自动化解决
542
+ 3. 如果可以通过工具解决,请设计并提供工具代码
543
+ 4. 如果无法通过编写通用工具完成,评估是否可以总结为通用方法论
544
+ 5. 如果以上都不可行,给出详细理由
545
+
546
+ 请根据分析结果采取相应行动:说明现有工具/方法论、创建新工具、生成新方法论或说明原因。
581
547
  </request>
582
548
 
583
549
  <evaluation_criteria>
550
+ 现有资源评估:
551
+ 1. 现有工具 - 检查系统中是否已有可以完成该任务的工具
552
+ 2. 现有方法论 - 检查是否已有适用于该任务的方法论
553
+ 3. 组合使用 - 评估现有工具和方法论组合使用是否可以解决问题
554
+
555
+ 工具评估标准:
556
+ 1. 通用性 - 该工具是否可以解决一类问题,而不仅仅是当前特定问题
557
+ 2. 自动化 - 该工具是否可以减少人工干预,提高效率
558
+ 3. 可靠性 - 该工具是否可以在不同场景下稳定工作
559
+ 4. 简单性 - 该工具是否易于使用,参数设计是否合理
560
+
584
561
  方法论评估标准:
585
562
  1. 方法论应聚焦于通用且可重复的解决方案流程
586
563
  2. 方法论应该具备足够的通用性,可应用于同类问题
587
564
  3. 特别注意用户在执行过程中提供的修正、反馈和改进建议
588
565
  4. 如果用户明确指出了某个解决步骤的优化方向,这应该被纳入方法论
589
- 5. 如果用户在解决过程中发现了更高效的方法,这应被记录并优先使用
590
566
  </evaluation_criteria>
591
567
 
592
- <format_requirements>
568
+ <tool_requirements>
569
+ 工具代码要求:
570
+ 1. 工具类名应与工具名称保持一致
571
+ 2. 必须包含name、description、parameters属性
572
+ 3. 必须实现execute方法处理输入参数
573
+ 4. 可选实现check方法验证环境
574
+ 5. 工具描述应详细说明用途、适用场景和使用示例
575
+ 6. 参数定义应遵循JSON Schema格式
576
+ 7. 不要包含特定任务的细节,保持通用性
577
+
578
+ 工具设计关键点:
579
+ 1. **使用PrettyOutput打印执行过程**:强烈建议在工具中使用PrettyOutput显示执行过程,
580
+ 这样用户可以了解工具在做什么,提升用户体验。示例:
581
+ ```python
582
+ from jarvis.jarvis_utils.output import PrettyOutput, OutputType
583
+
584
+ # 执行中打印信息
585
+ PrettyOutput.print("正在处理数据...", OutputType.INFO)
586
+ # 成功信息
587
+ PrettyOutput.print("操作成功完成", OutputType.SUCCESS)
588
+ # 警告信息
589
+ PrettyOutput.print("发现潜在问题", OutputType.WARNING)
590
+ # 错误信息
591
+ PrettyOutput.print("操作失败", OutputType.ERROR)
592
+ ```
593
+
594
+ 2. **结构化返回结果**:工具应该始终返回结构化的结果字典,包含以下字段:
595
+ - success: 布尔值,表示操作是否成功
596
+ - stdout: 字符串,包含工具的主要输出内容
597
+ - stderr: 字符串,包含错误信息(如果有)
598
+
599
+ 3. **异常处理**:工具应该妥善处理可能发生的异常,并在失败时清理已创建的资源
600
+ ```python
601
+ try:
602
+ # 执行逻辑
603
+ return {{
604
+ "success": True,
605
+ "stdout": "成功结果",
606
+ "stderr": ""
607
+ }}
608
+ except Exception as e:
609
+ PrettyOutput.print(f"操作失败: {{str(e)}}", OutputType.ERROR)
610
+ # 清理资源(如果有创建)
611
+ return {{
612
+ "success": False,
613
+ "stdout": "",
614
+ "stderr": f"操作失败: {{str(e)}}"
615
+ }}
616
+ ```
617
+ </tool_requirements>
618
+
619
+ <methodology_requirements>
593
620
  方法论格式要求:
594
621
  1. 问题重述: 简明扼要的问题归纳,不含特定细节
595
622
  2. 最优解决方案: 经过用户验证的、最终有效的解决方案(将每个步骤要使用的工具也列举出来)
596
623
  3. 注意事项: 执行中可能遇到的常见问题和注意点,尤其是用户指出的问题
597
624
  4. 可选步骤: 对于有多种解决路径的问题,标注出可选步骤和适用场景
598
- </format_requirements>
599
-
600
- <quality_control>
601
- 方法论质量控制:
602
- 1. 只记录有实际意义的流程,不记录执行过程中的错误或无效尝试
603
- 2. 保留最终有效的解决步骤和用户认可的解决方案
604
- 3. 不要包含特定代码片段、文件路径或其他特定于单一任务的细节
605
- 4. 确保方法论遵循用户认可的执行路径,尤其是用户指出的改进点
606
- </quality_control>
625
+ </methodology_requirements>
607
626
 
608
627
  <output_requirements>
609
- 只输出方法论工具调用指令,或不生成方法论的解释。不要输出其他内容。
610
- </output_requirements>
628
+ 根据分析结果,输出以下三种情况之一:
629
+
630
+ 1. 如果现有工具/方法论可以解决,直接输出说明:
631
+ 已有工具/方法论可以解决该问题,无需创建新内容。
632
+ 可用的工具/方法论:[列出工具名称或方法论名称]
633
+ 使用方法:[简要说明如何使用]
634
+
635
+ 2. 工具创建(如果需要创建新工具):
636
+ {ot("TOOL_CALL")}
637
+ want: 创建新工具来解决XXX问题
638
+ name: generate_new_tool
639
+ arguments:
640
+ tool_name: 工具名称
641
+ tool_code: |
642
+ # -*- coding: utf-8 -*-
643
+ from typing import Dict, Any
644
+ from jarvis.jarvis_utils.output import PrettyOutput, OutputType
645
+
646
+ class 工具名称:
647
+ name = "工具名称"
648
+ description = "Tool for text transformation"
649
+ Tool description
650
+ 适用场景:1. 格式化文本; 2. 处理标题; 3. 标准化输出
651
+ \"\"\"
652
+
653
+ parameters = {{
654
+ "type": "object",
655
+ "properties": {{
656
+ # 参数定义
657
+ }},
658
+ "required": []
659
+ }}
660
+
661
+ @staticmethod
662
+ def check() -> bool:
663
+ return True
664
+
665
+ def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
666
+ try:
667
+ # 使用PrettyOutput显示执行过程
668
+ PrettyOutput.print("开始执行操作...", OutputType.INFO)
669
+
670
+ # 实现逻辑
671
+ # ...
672
+
673
+ PrettyOutput.print("操作已完成", OutputType.SUCCESS)
674
+ return {{
675
+ "success": True,
676
+ "stdout": "结果输出",
677
+ "stderr": ""
678
+ }}
679
+ except Exception as e:
680
+ PrettyOutput.print(f"操作失败: {{str(e)}}", OutputType.ERROR)
681
+ return {{
682
+ "success": False,
683
+ "stdout": "",
684
+ "stderr": f"操作失败: {{str(e)}}"
685
+ }}
686
+ {ct("TOOL_CALL")}
611
687
 
612
- <template>
613
- 方法论格式:
688
+ 3. 方法论创建(如果需要创建新方法论):
614
689
  {ot("TOOL_CALL")}
615
690
  want: 添加/更新xxxx的方法论
616
691
  name: methodology
@@ -620,19 +695,105 @@ arguments:
620
695
  content: |
621
696
  方法论内容
622
697
  {ct("TOOL_CALL")}
623
- </template>
624
- </methodology_analysis>
625
- """
698
+
699
+ 如果以上三种情况都不适用,则直接输出原因分析,不要使用工具调用格式。
700
+ </output_requirements>
701
+
702
+ <tool_example>
703
+ 以下是一个完整的工具示例,供参考:
704
+
705
+ ```python
706
+ # -*- coding: utf-8 -*-
707
+ from typing import Dict, Any
708
+ from jarvis.jarvis_utils.output import PrettyOutput, OutputType
709
+
710
+ class text_transformer:
711
+ name = "text_transformer"
712
+ description = "Tool for text transformation"
713
+ Tool description for text transformation
714
+ 适用场景:1. 格式化文本; 2. 处理标题; 3. 标准化输出
715
+ \"\"\"
716
+
717
+ parameters = {{
718
+ "type": "object",
719
+ "properties": {{
720
+ "text": {{
721
+ "type": "string",
722
+ "description": "需要转换格式的文本"
723
+ }},
724
+ "transform_type": {{
725
+ "type": "string",
726
+ "description": "转换类型,可选值为 upper(大写)、lower(小写)或 title(首字母大写)",
727
+ "enum": ["upper", "lower", "title"]
728
+ }}
729
+ }},
730
+ "required": ["text", "transform_type"]
731
+ }}
732
+
733
+ @staticmethod
734
+ def check() -> bool:
735
+ return True
736
+
737
+ def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
738
+ try:
739
+ text = args["text"]
740
+ transform_type = args["transform_type"]
741
+
742
+ # 使用PrettyOutput显示执行过程
743
+ PrettyOutput.print(f"正在将文本转换为 {{transform_type}} 格式...", OutputType.INFO)
744
+
745
+ if transform_type == "upper":
746
+ result = text.upper()
747
+ PrettyOutput.print("文本已转换为大写", OutputType.SUCCESS)
748
+ elif transform_type == "lower":
749
+ result = text.lower()
750
+ PrettyOutput.print("文本已转换为小写", OutputType.SUCCESS)
751
+ elif transform_type == "title":
752
+ result = text.title()
753
+ PrettyOutput.print("文本已转换为首字母大写", OutputType.SUCCESS)
754
+ else:
755
+ PrettyOutput.print(f"不支持的转换类型: {{transform_type}}", OutputType.ERROR)
756
+ return {{
757
+ "success": False,
758
+ "stdout": "",
759
+ "stderr": f"不支持的转换类型: {{transform_type}}"
760
+ }}
761
+
762
+ return {{
763
+ "success": True,
764
+ "stdout": result,
765
+ "stderr": ""
766
+ }}
767
+
768
+ except Exception as e:
769
+ PrettyOutput.print(f"转换失败: {{str(e)}}", OutputType.ERROR)
770
+ return {{
771
+ "success": False,
772
+ "stdout": "",
773
+ "stderr": f"转换失败: {{str(e)}}"
774
+ }}
775
+ ```
776
+
777
+ 使用方法:
778
+ ```
779
+ name: text_transformer
780
+ arguments:
781
+ text: hello world
782
+ transform_type: upper
783
+ ```
784
+ </tool_example>
785
+ </task_analysis>"""
786
+
626
787
  self.prompt = analysis_prompt
627
788
  with spinner.hidden():
628
789
  response = self.model.chat_until_success(self.prompt) # type: ignore
629
790
 
630
791
  with spinner.hidden():
631
792
  self._call_tools(response)
632
- spinner.text = "方法论生成完成"
793
+ spinner.text = "分析完成"
633
794
  spinner.ok("✅")
634
795
  except Exception as e:
635
- spinner.text = "方法论生成失败"
796
+ spinner.text = "分析失败"
636
797
  spinner.fail("❌")
637
798
  if self.need_summary:
638
799
  with yaspin(text="正在生成总结...", color="cyan") as spinner:
@@ -689,7 +850,7 @@ arguments:
689
850
  if self.after_tool_call_cb:
690
851
  self.after_tool_call_cb(self)
691
852
 
692
- if self.prompt:
853
+ if self.prompt or self.addon_prompt:
693
854
  continue
694
855
 
695
856
  if self.auto_complete and ot("!!!COMPLETE!!!") in current_response:
@@ -127,6 +127,8 @@ def main() -> None:
127
127
  need_summary=False
128
128
  )
129
129
 
130
+ agent.set_addon_prompt(agent.make_default_addon_prompt(False) + "\n如果使用脚本可以完成任务,优先execute_script工具")
131
+
130
132
  # 优先处理命令行直接传入的任务
131
133
  if args.task:
132
134
  agent.run(args.task)
@@ -395,10 +395,10 @@ class CodeAgent:
395
395
  if not is_confirm_before_apply_patch() or user_confirm("是否使用此回复?", default=True):
396
396
  agent.prompt += final_ret
397
397
  return
398
+ agent.prompt += final_ret
398
399
  custom_reply = get_multiline_input("请输入自定义回复")
399
- if not custom_reply.strip(): # 如果自定义回复为空,返回空字符串
400
- agent.prompt += final_ret
401
- agent.set_addon_prompt(custom_reply)
400
+ if custom_reply.strip(): # 如果自定义回复为空,返回空字符串
401
+ agent.set_addon_prompt(custom_reply)
402
402
  agent.prompt += final_ret
403
403
 
404
404
 
@@ -591,8 +591,8 @@ class CodeReviewTool:
591
591
  is_large_content = is_context_overflow(diff_output)
592
592
 
593
593
  # Upload the file to the agent's model
594
- with yaspin(text="正在上传代码差异文件...", color="cyan") as spinner:
595
- if is_large_content and agent.model and hasattr(agent.model, 'upload_files'):
594
+ if is_large_content and agent.model and hasattr(agent.model, 'upload_files'):
595
+ with yaspin(text="正在上传代码差异文件...", color="cyan") as spinner:
596
596
  upload_success = agent.model.upload_files([temp_file_path])
597
597
  if upload_success:
598
598
  spinner.ok("✅")
@@ -600,8 +600,8 @@ class CodeReviewTool:
600
600
  else:
601
601
  spinner.fail("❌")
602
602
  PrettyOutput.print(f"上传代码差异文件失败,将使用分块处理", OutputType.WARNING)
603
- else:
604
- upload_success = False
603
+ else:
604
+ upload_success = False
605
605
 
606
606
  # Prepare the prompt based on upload status
607
607
  if upload_success:
@@ -617,14 +617,15 @@ class CodeReviewTool:
617
617
  # Run the agent with the prompt
618
618
  result = agent.run(complete_prompt)
619
619
  else:
620
- # If upload failed or not needed, handle based on context size
621
- if is_large_content and agent.model and hasattr(agent.model, 'chat_big_content'):
622
- # Use chat_big_content for large content when upload fails
623
- result = agent.model.chat_big_content(diff_output, user_prompt)
624
- else:
625
- # Include the diff directly in the prompt for smaller content
626
- complete_prompt = user_prompt + "\n\n代码差异内容:\n```diff\n" + diff_output + "\n```"
627
- result = agent.run(complete_prompt)
620
+ if is_large_content:
621
+ return {
622
+ "success": False,
623
+ "stdout": "",
624
+ "stderr": "错误:上传代码差异文件失败"
625
+ }
626
+ # Include the diff directly in the prompt for smaller content
627
+ complete_prompt = user_prompt + "\n\n代码差异内容:\n```diff\n" + diff_output + "\n```"
628
+ result = agent.run(complete_prompt)
628
629
  finally:
629
630
  # Clean up the temporary file
630
631
  if os.path.exists(temp_file_path):
@@ -180,11 +180,12 @@ class GitCommitTool:
180
180
  '''
181
181
  commit_message = platform.chat_until_success(prompt)
182
182
  else:
183
- # 如果上传失败但内容较大,使用chat_big_content
184
- if is_large_content and hasattr(platform, 'chat_big_content'):
185
- spinner.text = "正在使用分块处理生成提交信息..."
186
- commit_message = platform.chat_big_content(diff, base_prompt)
187
- else:
183
+ if is_large_content:
184
+ return {
185
+ "success": False,
186
+ "stdout": "",
187
+ "stderr": "错误:上传代码差异文件失败"
188
+ }
188
189
  # 直接在提示中包含差异内容
189
190
  prompt = base_prompt + f'''
190
191
  # 分析材料
@@ -2,10 +2,12 @@
2
2
  from abc import ABC, abstractmethod
3
3
  import re
4
4
  from typing import List, Tuple
5
+
6
+ from yaspin import yaspin
5
7
  from jarvis.jarvis_utils.config import get_max_input_token_count
6
8
  from jarvis.jarvis_utils.embedding import split_text_into_chunks
7
9
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
8
- from jarvis.jarvis_utils.utils import get_context_token_count, while_success, while_true
10
+ from jarvis.jarvis_utils.utils import get_context_token_count, is_context_overflow, while_success, while_true
9
11
  from jarvis.jarvis_utils.tag import ot, ct
10
12
 
11
13
 
@@ -38,29 +40,40 @@ class BasePlatform(ABC):
38
40
  @abstractmethod
39
41
  def upload_files(self, file_list: List[str]) -> bool:
40
42
  raise NotImplementedError("upload_files is not implemented")
41
-
42
- def chat_big_content(self, content: str, prompt: str) -> str:
43
- # 检查content大小不超过10MB
44
- if len(content.encode('utf-8')) > 10 * 1024 * 1024:
45
- return "Error: Content size exceeds 10MB limit"
46
-
47
- prefix_prompt = f"""
48
- 我将分多次提供大量的上下文内容,在我明确告诉你内容已经全部提供完毕之前,每次仅需要输出“已收到”。
49
- """
50
- self.chat_until_success(prefix_prompt)
51
- split_content = split_text_into_chunks(content, get_max_input_token_count() - 1024, get_max_input_token_count() - 2048)
52
- submit_count = 0
53
- for chunk in split_content:
54
- submit_count += 1
55
- PrettyOutput.print(f"已提交{submit_count}次(总{len(split_content)}次)", OutputType.INFO)
56
- self.chat_until_success(f"<part_content>{chunk}</part_content>请返回已收到")
57
- return self.chat_until_success(f"内容已经全部提供完毕\n\n{prompt}")
43
+
58
44
 
59
45
 
60
46
  def _chat(self, message: str):
61
47
  import time
62
48
  start_time = time.time()
63
- response = self.chat(message)
49
+
50
+ input_token_count = get_context_token_count(message)
51
+
52
+ if is_context_overflow(message):
53
+ PrettyOutput.print("错误:输入内容超过最大限制", OutputType.WARNING)
54
+ return "错误:输入内容超过最大限制"
55
+
56
+ if input_token_count > get_max_input_token_count():
57
+ current_suppress_output = self.suppress_output
58
+ self.set_suppress_output(True)
59
+ inputs = split_text_into_chunks(message, get_max_input_token_count() - 1024, get_max_input_token_count() - 2048)
60
+ with yaspin(text="正在提交长上下文...", color="cyan") as spinner:
61
+ prefix_prompt = f"""
62
+ 我将分多次提供大量内容,在我明确告诉你内容已经全部提供完毕之前,每次仅需要输出“已收到”,明白请输出“开始接收输入”。
63
+ """
64
+ while_true(lambda: while_success(lambda: self.chat(prefix_prompt), 5), 5)
65
+ submit_count = 0
66
+ for input in inputs:
67
+ submit_count += 1
68
+ spinner.text = f"正在提交第{submit_count}部分(共{len(inputs)}部分)"
69
+ while_true(lambda: while_success(lambda: self.chat(f"<part_content>{input}</part_content>请返回已收到"), 5), 5)
70
+ spinner.text = "提交完成"
71
+ spinner.ok("✅")
72
+ self.set_suppress_output(current_suppress_output)
73
+ response = while_true(lambda: while_success(lambda: self.chat("内容已经全部提供完毕,请继续"), 5), 5)
74
+
75
+ else:
76
+ response = self.chat(message)
64
77
 
65
78
  end_time = time.time()
66
79
  duration = end_time - start_time
@@ -78,7 +91,7 @@ class BasePlatform(ABC):
78
91
  # Print statistics
79
92
  if not self.suppress_output:
80
93
  PrettyOutput.print(
81
- f"对话完成 - 耗时: {duration:.2f}秒, 输出字符数: {char_count}, 输出Token数量: {token_count}, 每秒Token数量: {tokens_per_second:.2f}",
94
+ f"对话完成 - 耗时: {duration:.2f}秒, 输入字符数: {len(message)}, 输入Token数量: {input_token_count}, 输出字符数: {char_count}, 输出Token数量: {token_count}, 每秒Token数量: {tokens_per_second:.2f}",
82
95
  OutputType.INFO,
83
96
  )
84
97
 
@@ -23,6 +23,7 @@ from yaspin import yaspin
23
23
  from jarvis.jarvis_platform.registry import PlatformRegistry
24
24
  from jarvis.jarvis_tools.file_operation import FileOperationTool
25
25
  from jarvis.jarvis_utils.git_utils import revert_file
26
+ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
26
27
  from jarvis.jarvis_utils.tag import ct, ot
27
28
  from jarvis.jarvis_utils.utils import is_context_overflow
28
29
 
@@ -230,6 +231,11 @@ def patch_apply(filepath: str, patch_content: str) -> Tuple[bool, str]:
230
231
  2. 失败时自动回滚文件修改
231
232
  3. 提供详细的执行状态输出
232
233
  """
234
+ import os
235
+ work_dir = os.path.abspath(os.curdir)
236
+ filepath = os.path.abspath(filepath)
237
+ if not filepath.startswith(work_dir):
238
+ PrettyOutput.print(f"文件 {filepath} 不在工作目录 {work_dir} 下,不会进行版本控制管理", OutputType.WARNING)
233
239
  model = PlatformRegistry().get_normal_platform()
234
240
  with yaspin(text=f"正在处理文件 {filepath}...", color="cyan") as spinner:
235
241
  try:
@@ -300,7 +306,7 @@ def patch_apply(filepath: str, patch_content: str) -> Tuple[bool, str]:
300
306
  if upload_success:
301
307
  response = model.chat_until_success(main_prompt)
302
308
  else:
303
- response = model.chat_big_content(file_content, main_prompt)
309
+ return False, ""
304
310
 
305
311
  # 解析差异化补丁
306
312
  diff_blocks = re.finditer(ot("DIFF")+r'\s*>{4,} SEARCH\n?(.*?)\n?={4,}\n?(.*?)\s*<{4,} REPLACE\n?'+ct("DIFF"),