jarvis-ai-assistant 0.1.175__tar.gz → 0.1.176__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 (110) hide show
  1. {jarvis_ai_assistant-0.1.175/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.176}/PKG-INFO +3 -2
  2. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/README.md +2 -1
  3. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/pyproject.toml +1 -1
  4. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/setup.py +1 -1
  5. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/__init__.py +1 -1
  6. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_agent/__init__.py +15 -30
  7. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_agent/jarvis.py +4 -2
  8. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_agent/code_agent.py +2 -4
  9. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform/base.py +47 -29
  10. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform/human.py +4 -3
  11. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform/kimi.py +22 -170
  12. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform/openai.py +8 -30
  13. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform/yuanbao.py +34 -82
  14. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/ask_codebase.py +7 -1
  15. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/config.py +10 -1
  16. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/embedding.py +1 -10
  17. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/output.py +51 -43
  18. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176/src/jarvis_ai_assistant.egg-info}/PKG-INFO +3 -2
  19. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -1
  20. jarvis_ai_assistant-0.1.175/src/jarvis/jarvis_agent/file_input_handler.py +0 -108
  21. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/LICENSE +0 -0
  22. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/MANIFEST.in +0 -0
  23. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/setup.cfg +0 -0
  24. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  25. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_agent/main.py +0 -0
  26. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  27. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  28. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  29. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  30. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  31. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  32. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  33. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  34. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  35. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  36. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  37. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  38. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  39. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  40. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  41. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  42. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  43. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  44. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  45. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  46. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  47. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  48. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  49. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  50. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_data/huggingface.tar.gz +0 -0
  51. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_dev/main.py +0 -0
  52. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  53. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_git_details/main.py +0 -0
  54. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  55. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_git_squash/main.py +0 -0
  56. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  57. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_lsp/base.py +0 -0
  58. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  59. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_lsp/go.py +0 -0
  60. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_lsp/python.py +0 -0
  61. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_lsp/registry.py +0 -0
  62. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_lsp/rust.py +0 -0
  63. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  64. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  65. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  66. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_methodology/main.py +0 -0
  67. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  68. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  69. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform/__init__.py +0 -0
  70. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform/registry.py +0 -0
  71. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  72. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  73. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  74. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  75. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/__init__.py +0 -0
  76. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  77. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/base.py +0 -0
  78. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/chdir.py +0 -0
  79. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  80. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  81. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  82. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  83. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  84. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  85. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  86. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  87. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  88. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
  89. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  90. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  91. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/methodology.py +0 -0
  92. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/read_code.py +0 -0
  93. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  94. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/registry.py +0 -0
  95. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  96. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/search_web.py +0 -0
  97. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  98. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/__init__.py +0 -0
  99. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  100. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  101. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  102. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/globals.py +0 -0
  103. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/input.py +0 -0
  104. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/methodology.py +0 -0
  105. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/tag.py +0 -0
  106. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis/jarvis_utils/utils.py +0 -0
  107. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  108. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  109. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  110. {jarvis_ai_assistant-0.1.175 → jarvis_ai_assistant-0.1.176}/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.175
3
+ Version: 0.1.176
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
@@ -213,7 +213,8 @@ OPENAI_API_BASE=https://api.openai.com/v1 # 可选,默认为官方API地址
213
213
  | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | true | 应用补丁前是否需要确认 |
214
214
  | `JARVIS_MAX_TOOL_CALL_COUNT` | 20 | 最大连续工具调用次数 |
215
215
  | `JARVIS_AUTO_UPDATE` | true | 是否自动更新Jarvis(仅在以git仓库方式安装时有效) |
216
- | `JARVIS_MAX_BIG_CONTENT_SIZE` | 10485760 | 最大大内容大小 |
216
+ | `JARVIS_MAX_BIG_CONTENT_SIZE` | 96000 | 最大大内容大小 |
217
+ | `JARVIS_PRETTY_OUTPUT` | false | 是否启用PrettyOutput |
217
218
 
218
219
  所有配置编写到`~/.jarvis/env`文件中即可生效。
219
220
 
@@ -143,7 +143,8 @@ 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
+ | `JARVIS_MAX_BIG_CONTENT_SIZE` | 96000 | 最大大内容大小 |
147
+ | `JARVIS_PRETTY_OUTPUT` | false | 是否启用PrettyOutput |
147
148
 
148
149
  所有配置编写到`~/.jarvis/env`文件中即可生效。
149
150
 
@@ -8,7 +8,7 @@ default = true
8
8
 
9
9
  [project]
10
10
  name = "jarvis-ai-assistant"
11
- version = "0.1.175"
11
+ version = "0.1.176"
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.175",
6
+ version="0.1.176",
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.175"
4
+ __version__ = "0.1.176"
@@ -337,33 +337,20 @@ class Agent:
337
337
  action_handlers = '\n'.join([f'- {handler.name()}' for handler in self.output_handler])
338
338
 
339
339
  # 任务完成提示
340
- complete_prompt = f"3. 输出{ot('!!!COMPLETE!!!')}" if need_complete and self.auto_complete else ""
340
+ complete_prompt = f"- 输出{ot('!!!COMPLETE!!!')}" if need_complete and self.auto_complete else ""
341
341
 
342
342
  addon_prompt = f"""
343
- <addon>
344
- <instructions>
345
- **系统指令:**
346
- - 每次响应必须且只能包含一个操作
347
- - 严格遵循操作调用格式
348
- - 必须包含参数和说明
349
- - 操作结束需等待结果
350
- - 如果判断任务已经完成,不必输出操作
343
+ 请判断是否已经完成任务,如果已经完成:
344
+ - 说明完成原因,不需要再有新的操作
345
+ {complete_prompt}
346
+ 如果没有完成,请进行下一步操作:
347
+ - 仅包含一个操作
351
348
  - 如果信息不明确,请请求用户补充
352
349
  - 如果执行过程中连续失败5次,请使用ask_user询问用户操作
353
- </instructions>
354
-
355
- <actions>
356
- **可用操作列表:**
350
+ - 操作列表:
357
351
  {action_handlers}
358
- </actions>
359
352
 
360
- <completion>
361
- 如果任务已完成,请:
362
- 1. 说明完成原因
363
- 2. 保持输出格式规范
364
- {complete_prompt}
365
- </completion>
366
- </addon>
353
+ 请继续。
367
354
  """
368
355
 
369
356
  return addon_prompt
@@ -401,8 +388,6 @@ class Agent:
401
388
  if self.conversation_length > self.max_token_count:
402
389
  message = self._summarize_and_clear_history() + "\n\n" + message
403
390
  self.conversation_length += get_context_token_count(message)
404
-
405
- print("🤖 模型思考:")
406
391
  return self.model.chat_until_success(message) # type: ignore
407
392
 
408
393
 
@@ -547,7 +532,7 @@ class Agent:
547
532
  1. 首先检查现有工具或方法论是否已经可以完成该任务,如果可以,直接说明即可,无需生成新内容
548
533
  2. 如果现有工具/方法论不足,评估当前任务是否可以通过编写新工具来自动化解决
549
534
  3. 如果可以通过工具解决,请设计并提供工具代码
550
- 4. 如果无法通过编写通用工具完成,评估是否可以总结为通用方法论
535
+ 4. 如果无法通过编写通用工具完成,评估当前的执行流程是否可以总结为通用方法论
551
536
  5. 如果以上都不可行,给出详细理由
552
537
 
553
538
  请根据分析结果采取相应行动:说明现有工具/方法论、创建新工具、生成新方法论或说明原因。
@@ -570,6 +555,7 @@ class Agent:
570
555
  2. 方法论应该具备足够的通用性,可应用于同类问题
571
556
  3. 特别注意用户在执行过程中提供的修正、反馈和改进建议
572
557
  4. 如果用户明确指出了某个解决步骤的优化方向,这应该被纳入方法论
558
+ 5. 方法论要严格按照实际的执行流程来总结,不要遗漏或增加任何步骤
573
559
  </evaluation_criteria>
574
560
 
575
561
  <tool_requirements>
@@ -751,19 +737,18 @@ arguments:
751
737
  self.prompt = f"{user_input}"
752
738
 
753
739
  if self.first:
754
- msg = user_input
755
- for handler in self.input_handler:
756
- msg, _ = handler(msg, self)
757
740
 
758
741
  # 先尝试上传方法轮
759
742
  platform = self.model if hasattr(self.model, 'upload_files') else None
760
743
  if platform and upload_methodology(platform):
761
- methodology_prompt = f"{user_input}\n\n方法论已上传到平台,请参考平台上的方法论内容"
744
+ self.prompt = f"{user_input}\n\n方法论已上传到平台,请参考平台上的方法论内容"
762
745
  else:
746
+ msg = user_input
747
+ for handler in self.input_handler:
748
+ msg, _ = handler(msg, self)
763
749
  # 上传失败则回退到本地加载
764
- methodology_prompt = f"{user_input}\n\n以下是历史类似问题的执行经验,可参考:\n{load_methodology(msg, self.get_tool_registry())}"
750
+ self.prompt = f"{user_input}\n\n以下是历史类似问题的执行经验,可参考:\n{load_methodology(msg, self.get_tool_registry())}"
765
751
 
766
- self.prompt = methodology_prompt
767
752
  self.first = False
768
753
 
769
754
  self.conversation_length = get_context_token_count(self.prompt)
@@ -18,7 +18,6 @@ from jarvis.jarvis_agent import (
18
18
  )
19
19
  from jarvis.jarvis_tools.registry import ToolRegistry
20
20
  from jarvis.jarvis_utils.utils import init_env
21
- from jarvis.jarvis_agent.file_input_handler import file_input_handler
22
21
  from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
23
22
  from jarvis.jarvis_agent.builtin_input_handler import builtin_input_handler
24
23
 
@@ -122,7 +121,10 @@ def main() -> None:
122
121
  system_prompt=origin_agent_system_prompt,
123
122
  platform=args.platform,
124
123
  model_name=args.model,
125
- input_handler=[file_input_handler, shell_input_handler, builtin_input_handler],
124
+ input_handler=[
125
+ shell_input_handler,
126
+ builtin_input_handler
127
+ ],
126
128
  output_handler=[ToolRegistry()],
127
129
  need_summary=False
128
130
  )
@@ -16,7 +16,6 @@ from yaspin import yaspin # type: ignore
16
16
 
17
17
  from jarvis.jarvis_agent import Agent
18
18
  from jarvis.jarvis_agent.builtin_input_handler import builtin_input_handler
19
- from jarvis.jarvis_agent.file_input_handler import file_input_handler
20
19
  from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
21
20
  from jarvis.jarvis_platform.registry import PlatformRegistry
22
21
  from jarvis.jarvis_git_utils.git_commiter import GitCommitTool
@@ -109,7 +108,6 @@ class CodeAgent:
109
108
  platform=platform_instance,
110
109
  input_handler=[
111
110
  shell_input_handler,
112
- file_input_handler,
113
111
  builtin_input_handler
114
112
  ],
115
113
  need_summary=need_summary
@@ -374,8 +372,8 @@ class CodeAgent:
374
372
  final_ret += f"# 应用补丁:\n```diff\n{diff}\n```"
375
373
 
376
374
  # 修改后的提示逻辑
377
- addon_prompt = "如果对应语言有静态检查工具,请使用静态检查工具检查代码,如果本次修改引入了警告和错误,请根据警告和错误信息修复代码\n"
378
- addon_prompt += "在引入警告和错误都被修复的前提下,如果用户的需求未完成,请继续生成补丁,如果已经完成,请终止,不要实现任何超出用户需求外的内容\n"
375
+ addon_prompt = "如果对应语言有静态检查工具,请使用静态检查工具检查修改的代码,如果本次修改引入了警告和错误,请根据警告和错误信息修复代码\n"
376
+ addon_prompt += "在引入警告和错误都被修复的前提下,如果用户的需求未完成,请继续修改代码,如果已经完成,请终止,不要实现任何超出用户需求外的内容\n"
379
377
  addon_prompt += "如果有任何信息不明确,调用工具获取信息\n"
380
378
  addon_prompt += "每次响应必须且只能包含一个操作\n"
381
379
 
@@ -1,15 +1,19 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  from abc import ABC, abstractmethod
3
3
  import re
4
- from typing import List, Tuple
4
+ from typing import Generator, List, Tuple
5
5
 
6
6
  from yaspin import yaspin
7
- from jarvis.jarvis_utils.config import get_max_input_token_count
7
+
8
+ from jarvis.jarvis_utils.config import get_max_input_token_count, get_pretty_output
8
9
  from jarvis.jarvis_utils.embedding import split_text_into_chunks
9
10
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
10
11
  from jarvis.jarvis_utils.utils import get_context_token_count, is_context_overflow, while_success, while_true
11
12
  from jarvis.jarvis_utils.tag import ot, ct
12
-
13
+ from rich.live import Live
14
+ from rich.text import Text
15
+ from rich.panel import Panel
16
+ from rich import box
13
17
 
14
18
  class BasePlatform(ABC):
15
19
  """Base class for large language models"""
@@ -33,7 +37,7 @@ class BasePlatform(ABC):
33
37
  self.delete_chat()
34
38
 
35
39
  @abstractmethod
36
- def chat(self, message: str) -> str:
40
+ def chat(self, message: str) -> Generator[str, None, None]:
37
41
  """Execute conversation"""
38
42
  raise NotImplementedError("chat is not implemented")
39
43
 
@@ -53,8 +57,6 @@ class BasePlatform(ABC):
53
57
  return "错误:输入内容超过最大限制"
54
58
 
55
59
  if input_token_count > get_max_input_token_count():
56
- current_suppress_output = self.suppress_output
57
- self.set_suppress_output(True)
58
60
  max_chunk_size = get_max_input_token_count() - 1024 # 留出一些余量
59
61
  min_chunk_size = max_chunk_size // 2 # 最小块大小设为最大块大小的一半
60
62
  inputs = split_text_into_chunks(message, max_chunk_size, min_chunk_size)
@@ -70,32 +72,48 @@ class BasePlatform(ABC):
70
72
  while_true(lambda: while_success(lambda: self.chat(f"<part_content>{input}</part_content>请返回已收到"), 5), 5)
71
73
  spinner.text = "提交完成"
72
74
  spinner.ok("✅")
73
- self.set_suppress_output(current_suppress_output)
74
- response = while_true(lambda: while_success(lambda: self.chat("内容已经全部提供完毕,请继续"), 5), 5)
75
-
75
+ response = while_true(lambda: while_success(lambda: self._chat("内容已经全部提供完毕,请继续"), 5), 5)
76
76
  else:
77
- response = self.chat(message)
78
-
79
- end_time = time.time()
80
- duration = end_time - start_time
81
- char_count = len(response)
82
-
83
- # Calculate token count and tokens per second
84
- try:
85
- token_count = get_context_token_count(response)
86
- tokens_per_second = token_count / duration if duration > 0 else 0
87
- except Exception as e:
88
- PrettyOutput.print(f"Tokenization failed: {str(e)}", OutputType.WARNING)
89
- token_count = 0
90
- tokens_per_second = 0
91
-
92
- # Print statistics
93
- if not self.suppress_output:
94
- PrettyOutput.print(
95
- f"对话完成 - 耗时: {duration:.2f}秒, 输入字符数: {len(message)}, 输入Token数量: {input_token_count}, 输出字符数: {char_count}, 输出Token数量: {token_count}, 每秒Token数量: {tokens_per_second:.2f}",
96
- OutputType.INFO,
77
+ response = ""
78
+
79
+ text_content = Text()
80
+ panel = Panel(
81
+ text_content,
82
+ title=f"[bold cyan]{self.name()}[/bold cyan]",
83
+ subtitle="[dim]思考中...[/dim]",
84
+ border_style="bright_blue",
85
+ box=box.ROUNDED
97
86
  )
98
87
 
88
+ if not self.suppress_output:
89
+ if get_pretty_output():
90
+ with Live(panel, refresh_per_second=10, transient=False) as live:
91
+ for s in self.chat(message):
92
+ response += s
93
+ text_content.append(s, style="bright_white")
94
+ panel.subtitle = "[yellow]正在回答...[/yellow]"
95
+ live.update(panel)
96
+ end_time = time.time()
97
+ duration = end_time - start_time
98
+ char_count = len(response)
99
+ # Calculate token count and tokens per second
100
+ try:
101
+ token_count = get_context_token_count(response)
102
+ tokens_per_second = token_count / duration if duration > 0 else 0
103
+ except Exception as e:
104
+ PrettyOutput.print(f"Tokenization failed: {str(e)}", OutputType.WARNING)
105
+ token_count = 0
106
+ tokens_per_second = 0
107
+ panel.subtitle = f"[bold green]✓ 对话完成耗时: {duration:.2f}秒, 输入字符数: {len(message)}, 输入Token数量: {input_token_count}, 输出字符数: {char_count}, 输出Token数量: {token_count}, 每秒Token数量: {tokens_per_second:.2f}[/bold green]"
108
+ live.update(panel)
109
+ else:
110
+ for s in self.chat(message):
111
+ print(s, end="", flush=True)
112
+ response += s
113
+ print()
114
+ else:
115
+ for s in self.chat(message):
116
+ response += s
99
117
  # Keep original think tag handling
100
118
  response = re.sub(ot("think")+r'.*?'+ct("think"), '', response, flags=re.DOTALL)
101
119
  return response
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- from typing import Dict, List, Tuple
2
+ from typing import Generator, List, Tuple
3
3
  import random
4
4
  import string
5
5
  from jarvis.jarvis_platform.base import BasePlatform
@@ -34,7 +34,7 @@ class HumanPlatform(BasePlatform):
34
34
  else:
35
35
  PrettyOutput.print(f"错误:不支持的模型: {model_name}", OutputType.ERROR)
36
36
 
37
- def chat(self, message: str) -> str:
37
+ def chat(self, message: str) -> Generator[str, None, None]:
38
38
  """发送消息并获取人类响应"""
39
39
  if not self.conversation_id:
40
40
  self.conversation_id = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
@@ -49,7 +49,8 @@ class HumanPlatform(BasePlatform):
49
49
  prompt = f"{message} {session_info}\n\n请回复:"
50
50
 
51
51
  response = get_multiline_input(prompt)
52
- return response
52
+ yield response
53
+ return None
53
54
 
54
55
  def upload_files(self, file_list: List[str]) -> bool:
55
56
  """文件上传功能,人类平台不需要实际处理"""
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- from typing import Dict, List, Tuple
2
+ from typing import Dict, Generator, List, Tuple
3
3
  import requests # type: ignore
4
4
  import json
5
5
  import os
@@ -241,7 +241,7 @@ class KimiModel(BasePlatform):
241
241
  return True
242
242
 
243
243
 
244
- def chat(self, message: str) -> str:
244
+ def chat(self, message: str) -> Generator[str, None, None]:
245
245
  """Send message and get response"""
246
246
  if not self.chat_id:
247
247
  if not self._create_chat():
@@ -279,177 +279,29 @@ class KimiModel(BasePlatform):
279
279
 
280
280
  try:
281
281
  response = while_success(lambda: requests.post(url, headers=headers, json=payload, stream=True), sleep_time=5)
282
- full_response = ""
283
-
284
- # 收集搜索和引用结果
285
- search_results = []
286
- ref_sources = []
287
-
288
- # 使用Rich的Live组件来实时展示更新
289
- if not self.suppress_output:
290
- text_content = Text()
291
- panel = Panel(text_content,
292
- title=f"[bold magenta]{self.model_name}[/bold magenta]",
293
- subtitle="思考中...",
294
- border_style="magenta",
295
- box=box.ROUNDED)
296
-
297
- with Live(panel, refresh_per_second=3, transient=False) as live:
298
- for line in response.iter_lines():
299
- if not line:
300
- continue
301
-
302
- line = line.decode('utf-8')
303
- if not line.startswith("data: "):
304
- continue
305
-
306
- try:
307
- data = json.loads(line[6:])
308
- event = data.get("event")
309
-
310
- if event == "cmpl":
311
- # 处理补全文本
312
- text = data.get("text", "")
313
- if text:
314
- full_response += text
315
- text_content.append(text)
316
- panel.subtitle = "生成中..."
317
- live.update(panel)
318
-
319
- elif event == "search_plus":
320
- # 收集搜索结果
321
- msg = data.get("msg", {})
322
- if msg.get("type") == "get_res":
323
- search_results.append({
324
- "date": msg.get("date", ""),
325
- "site_name": msg.get("site_name", ""),
326
- "snippet": msg.get("snippet", ""),
327
- "title": msg.get("title", ""),
328
- "type": msg.get("type", ""),
329
- "url": msg.get("url", "")
330
- })
331
- panel.subtitle = f"搜索中: 找到 {len(search_results)} 个结果"
332
- live.update(panel)
333
-
334
- elif event == "ref_docs":
335
- # 收集引用来源
336
- ref_cards = data.get("ref_cards", [])
337
- for card in ref_cards:
338
- ref_sources.append({
339
- "idx_s": card.get("idx_s", ""),
340
- "idx_z": card.get("idx_z", ""),
341
- "ref_id": card.get("ref_id", ""),
342
- "url": card.get("url", ""),
343
- "title": card.get("title", ""),
344
- "abstract": card.get("abstract", ""),
345
- "source": card.get("source_label", ""),
346
- "rag_segments": card.get("rag_segments", []),
347
- "origin": card.get("origin", {})
348
- })
349
- panel.subtitle = f"分析引用: 找到 {len(ref_sources)} 个来源"
350
- live.update(panel)
351
-
352
- except json.JSONDecodeError:
353
- continue
354
-
355
- # 显示对话完成状态
356
- panel.subtitle = "[bold green]回答完成[/bold green]"
357
- live.update(panel)
358
- else:
359
- # 如果禁止输出,则静默处理
360
- for line in response.iter_lines():
361
- if not line:
362
- continue
363
-
364
- line = line.decode('utf-8')
365
- if not line.startswith("data: "):
366
- continue
367
-
368
- try:
369
- data = json.loads(line[6:])
370
- event = data.get("event")
371
-
372
- if event == "cmpl":
373
- # 处理补全文本
374
- text = data.get("text", "")
375
- if text:
376
- full_response += text
377
-
378
- elif event == "search_plus":
379
- # 收集搜索结果
380
- msg = data.get("msg", {})
381
- if msg.get("type") == "get_res":
382
- search_results.append({
383
- "date": msg.get("date", ""),
384
- "site_name": msg.get("site_name", ""),
385
- "snippet": msg.get("snippet", ""),
386
- "title": msg.get("title", ""),
387
- "type": msg.get("type", ""),
388
- "url": msg.get("url", "")
389
- })
390
-
391
- elif event == "ref_docs":
392
- # 收集引用来源
393
- ref_cards = data.get("ref_cards", [])
394
- for card in ref_cards:
395
- ref_sources.append({
396
- "idx_s": card.get("idx_s", ""),
397
- "idx_z": card.get("idx_z", ""),
398
- "ref_id": card.get("ref_id", ""),
399
- "url": card.get("url", ""),
400
- "title": card.get("title", ""),
401
- "abstract": card.get("abstract", ""),
402
- "source": card.get("source_label", ""),
403
- "rag_segments": card.get("rag_segments", []),
404
- "origin": card.get("origin", {})
405
- })
406
-
407
- except json.JSONDecodeError:
408
- continue
409
-
410
- # 显示搜索结果摘要
411
- if search_results and not self.suppress_output:
412
- output = ["搜索结果:"]
413
- for result in search_results:
414
- output.append(f"- {result['title']}")
415
- if result['date']:
416
- output.append(f" 日期: {result['date']}")
417
- output.append(f" 来源: {result['site_name']}")
418
- if result['snippet']:
419
- output.append(f" 摘要: {result['snippet']}")
420
- output.append(f" 链接: {result['url']}")
421
- output.append("")
422
- PrettyOutput.print("\n".join(output), OutputType.PROGRESS)
423
-
424
- # 显示引用来源
425
- if ref_sources and not self.suppress_output:
426
- output = ["引用来源:"]
427
- for source in ref_sources:
428
- output.append(f"- [{source['ref_id']}] {source['title']} ({source['source']})")
429
- output.append(f" 链接: {source['url']}")
430
- if source['abstract']:
431
- output.append(f" 摘要: {source['abstract']}")
432
-
433
- # 显示相关段落
434
- if source['rag_segments']:
435
- output.append(" 相关段落:")
436
- for segment in source['rag_segments']:
437
- text = segment.get('text', '').replace('\n', ' ').strip()
438
- if text:
439
- output.append(f" - {text}")
440
-
441
- # 显示原文引用
442
- origin = source['origin']
443
- if origin:
444
- text = origin.get('text', '')
445
- if text:
446
- output.append(f" 原文: {text}")
282
+ # 如果禁止输出,则静默处理
283
+ for line in response.iter_lines():
284
+ if not line:
285
+ continue
286
+
287
+ line = line.decode('utf-8')
288
+ if not line.startswith("data: "):
289
+ continue
290
+
291
+ try:
292
+ data = json.loads(line[6:])
293
+ event = data.get("event")
447
294
 
448
- output.append("")
295
+ if event == "cmpl":
296
+ # 处理补全文本
297
+ text = data.get("text", "")
298
+ if text:
299
+ yield text
300
+ except json.JSONDecodeError:
301
+ continue
449
302
 
450
- PrettyOutput.print("\n".join(output), OutputType.PROGRESS)
451
303
 
452
- return full_response
304
+ return None
453
305
 
454
306
  except Exception as e:
455
307
  raise Exception(f"Chat failed: {str(e)}")
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- from typing import Dict, List, Tuple
2
+ from typing import Dict, Generator, List, Tuple
3
3
  import os
4
4
  from openai import OpenAI
5
5
  from rich.live import Live
@@ -73,7 +73,7 @@ class OpenAIModel(BasePlatform):
73
73
  self.system_message = message
74
74
  self.messages.append({"role": "system", "content": self.system_message})
75
75
 
76
- def chat(self, message: str) -> str:
76
+ def chat(self, message: str) -> Generator[str, None, None]:
77
77
  """Execute conversation"""
78
78
  try:
79
79
 
@@ -87,38 +87,16 @@ class OpenAIModel(BasePlatform):
87
87
  ) # type: ignore
88
88
 
89
89
  full_response = ""
90
-
91
- # 使用Rich的Live组件来实时展示更新
92
- if not self.suppress_output:
93
- text_content = Text()
94
- panel = Panel(text_content,
95
- title=f"[bold blue]{self.model_name}[/bold blue]",
96
- subtitle="生成中...",
97
- border_style="cyan",
98
- box=box.ROUNDED)
99
-
100
- with Live(panel, refresh_per_second=3, transient=False) as live:
101
- for chunk in response:
102
- if chunk.choices and chunk.choices[0].delta.content:
103
- text = chunk.choices[0].delta.content
104
- full_response += text
105
- text_content.append(text)
106
- live.update(panel)
107
-
108
- # 显示对话完成状态
109
- panel.subtitle = "[bold green]对话完成[/bold green]"
110
- live.update(panel)
111
- else:
112
- # 如果禁止输出,则静默处理
113
- for chunk in response:
114
- if chunk.choices and chunk.choices[0].delta.content:
115
- text = chunk.choices[0].delta.content
116
- full_response += text
90
+ for chunk in response:
91
+ if chunk.choices and chunk.choices[0].delta.content:
92
+ text = chunk.choices[0].delta.content
93
+ full_response += text
94
+ yield text
117
95
 
118
96
  # Add assistant reply to history
119
97
  self.messages.append({"role": "assistant", "content": full_response})
120
98
 
121
- return full_response
99
+ return None
122
100
 
123
101
  except Exception as e:
124
102
  PrettyOutput.print(f"对话失败:{str(e)}", OutputType.ERROR)