jarvis-ai-assistant 0.3.28__tar.gz → 0.3.30__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.
Files changed (144) hide show
  1. {jarvis_ai_assistant-0.3.28/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.3.30}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/__init__.py +154 -32
  6. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/event_bus.py +2 -2
  7. jarvis_ai_assistant-0.3.30/src/jarvis/jarvis_agent/events.py +157 -0
  8. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/file_methodology_manager.py +17 -4
  9. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/jarvis.py +3 -3
  10. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/memory_manager.py +4 -3
  11. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompts.py +2 -2
  12. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/protocols.py +4 -1
  13. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/run_loop.py +10 -27
  14. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/shell_input_handler.py +6 -1
  15. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/task_analyzer.py +18 -13
  16. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/task_manager.py +6 -4
  17. jarvis_ai_assistant-0.3.30/src/jarvis/jarvis_agent/utils.py +50 -0
  18. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/code_agent.py +3 -2
  19. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_data/config_schema.json +8 -0
  20. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/sse_mcp_client.py +1 -1
  21. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +4 -4
  22. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/kimi.py +1 -1
  23. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/tongyi.py +1 -1
  24. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/yuanbao.py +1 -1
  25. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/retriever.py +3 -3
  26. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/stats.py +2 -2
  27. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/storage.py +3 -3
  28. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/edit_file.py +3 -3
  29. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/execute_script.py +2 -2
  30. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/generate_new_tool.py +13 -2
  31. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/sub_agent.py +2 -2
  32. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/sub_code_agent.py +2 -2
  33. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/config.py +17 -3
  34. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/fzf.py +4 -3
  35. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/git_utils.py +20 -16
  36. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/input.py +5 -5
  37. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/utils.py +109 -20
  38. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  39. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +2 -0
  40. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/LICENSE +0 -0
  41. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/MANIFEST.in +0 -0
  42. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/README.md +0 -0
  43. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/setup.cfg +0 -0
  44. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/agent_manager.py +0 -0
  45. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  46. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/config.py +0 -0
  47. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/config_editor.py +0 -0
  48. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  49. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/main.py +0 -0
  50. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
  51. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  52. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  53. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompt_manager.py +0 -0
  54. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/session_manager.py +0 -0
  55. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/share_manager.py +0 -0
  56. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  57. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
  58. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/user_interaction.py +0 -0
  59. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  60. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  61. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  62. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  63. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  64. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  65. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  66. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  67. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  68. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  69. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  70. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  71. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  72. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  73. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  74. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  75. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  76. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  77. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  78. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  79. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  80. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  81. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  82. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  83. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  84. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_squash/main.py +0 -0
  85. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  86. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  87. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  88. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  89. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
  90. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_methodology/main.py +0 -0
  91. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  92. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  93. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/__init__.py +0 -0
  94. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/ai8.py +0 -0
  95. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/base.py +0 -0
  96. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/human.py +0 -0
  97. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/openai.py +0 -0
  98. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/registry.py +0 -0
  99. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  100. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  101. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  102. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/__init__.py +0 -0
  103. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/cache.py +0 -0
  104. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/cli.py +0 -0
  105. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  106. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
  107. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  108. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
  109. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/reranker.py +0 -0
  110. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  111. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  112. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/__init__.py +0 -0
  113. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/cli.py +0 -0
  114. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/visualizer.py +0 -0
  115. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/__init__.py +0 -0
  116. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  117. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/base.py +0 -0
  118. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
  119. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  120. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  121. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  122. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/methodology.py +0 -0
  123. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/read_code.py +0 -0
  124. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  125. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/registry.py +0 -0
  126. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
  127. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  128. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/save_memory.py +0 -0
  129. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/search_web.py +0 -0
  130. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  131. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/__init__.py +0 -0
  132. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  133. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/clipboard.py +0 -0
  134. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/embedding.py +0 -0
  135. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  136. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/globals.py +0 -0
  137. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/http.py +0 -0
  138. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/methodology.py +0 -0
  139. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/output.py +0 -0
  140. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/tag.py +0 -0
  141. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  142. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  143. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  144. {jarvis_ai_assistant-0.3.28 → jarvis_ai_assistant-0.3.30}/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.3.28
3
+ Version: 0.3.30
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.3.28"
7
+ version = "0.3.30"
8
8
  description = "Jarvis: An AI assistant that uses tools to interact with the system"
9
9
  readme = "README.md"
10
10
  authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages # type: ignore
3
3
 
4
4
  setup(
5
5
  name="jarvis-ai-assistant",
6
- version="0.3.28",
6
+ version="0.3.30",
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.3.28"
4
+ __version__ = "0.3.30"
@@ -4,6 +4,7 @@ import datetime
4
4
  import os
5
5
  import platform
6
6
  import re
7
+ import sys
7
8
  from pathlib import Path
8
9
  from enum import Enum
9
10
  from typing import Any, Callable, Dict, List, Optional, Protocol, Tuple, Union
@@ -34,7 +35,24 @@ from jarvis.jarvis_agent.prompt_manager import PromptManager
34
35
  from jarvis.jarvis_agent.event_bus import EventBus
35
36
  from jarvis.jarvis_agent.config import AgentConfig
36
37
  from jarvis.jarvis_agent.run_loop import AgentRunLoop
38
+ from jarvis.jarvis_agent.events import (
39
+ BEFORE_SUMMARY,
40
+ AFTER_SUMMARY,
41
+ TASK_COMPLETED,
42
+ TASK_STARTED,
43
+ BEFORE_ADDON_PROMPT,
44
+ AFTER_ADDON_PROMPT,
45
+ BEFORE_HISTORY_CLEAR,
46
+ AFTER_HISTORY_CLEAR,
47
+ BEFORE_MODEL_CALL,
48
+ AFTER_MODEL_CALL,
49
+ INTERRUPT_TRIGGERED,
50
+ BEFORE_TOOL_FILTER,
51
+ TOOL_FILTERED,
52
+ AFTER_TOOL_CALL,
53
+ )
37
54
  from jarvis.jarvis_agent.user_interaction import UserInteractionHandler
55
+ from jarvis.jarvis_agent.utils import join_prompts
38
56
  from jarvis.jarvis_utils.methodology import _load_all_methodologies
39
57
 
40
58
  # jarvis_platform 相关
@@ -52,6 +70,7 @@ from jarvis.jarvis_utils.config import (
52
70
  is_use_analysis,
53
71
  is_use_methodology,
54
72
  get_tool_filter_threshold,
73
+ get_after_tool_call_cb_dirs,
55
74
  )
56
75
  from jarvis.jarvis_utils.embedding import get_context_token_count
57
76
  from jarvis.jarvis_utils.globals import (
@@ -212,6 +231,15 @@ class LoopAction(Enum):
212
231
 
213
232
 
214
233
  class Agent:
234
+ # Attribute type annotations to satisfy static type checkers
235
+ event_bus: EventBus
236
+ memory_manager: MemoryManager
237
+ task_analyzer: TaskAnalyzer
238
+ file_methodology_manager: FileMethodologyManager
239
+ prompt_manager: PromptManager
240
+ model: BasePlatform
241
+ session: SessionManager
242
+
215
243
  def clear_history(self):
216
244
  """
217
245
  Clears the current conversation history by delegating to the session manager.
@@ -219,7 +247,7 @@ class Agent:
219
247
  self.session.clear_history()
220
248
  # 广播清理历史后的事件
221
249
  try:
222
- self.event_bus.emit("after_history_clear", agent=self)
250
+ self.event_bus.emit(AFTER_HISTORY_CLEAR, agent=self)
223
251
  except Exception:
224
252
  pass
225
253
 
@@ -285,7 +313,7 @@ class Agent:
285
313
  self.first = True
286
314
  self.run_input_handlers_next_turn = False
287
315
  self.user_data: Dict[str, Any] = {}
288
- self.after_tool_call_cb: Optional[Callable[[Agent], None]] = None
316
+
289
317
 
290
318
  # 用户确认回调:默认使用 CLI 的 user_confirm,可由外部注入以支持 TUI/GUI
291
319
  self.user_confirm: Callable[[str, bool], bool] = (
@@ -336,18 +364,23 @@ class Agent:
336
364
  self.get_tool_registry(), # type: ignore
337
365
  platform_name=self.model.platform_name(), # type: ignore
338
366
  )
367
+ # 动态加载工具调用后回调
368
+ self._load_after_tool_callbacks()
339
369
 
340
370
  def _init_model(self, model_group: Optional[str]):
341
371
  """初始化模型平台(统一使用 normal 平台/模型)"""
342
372
  platform_name = get_normal_platform_name(model_group)
343
373
  model_name = get_normal_model_name(model_group)
344
374
 
345
- self.model = PlatformRegistry().create_platform(platform_name)
346
- if self.model is None:
375
+ maybe_model = PlatformRegistry().create_platform(platform_name)
376
+ if maybe_model is None:
347
377
  PrettyOutput.print(
348
378
  f"平台 {platform_name} 不存在,将使用普通模型", OutputType.WARNING
349
379
  )
350
- self.model = PlatformRegistry().get_normal_platform()
380
+ maybe_model = PlatformRegistry().get_normal_platform()
381
+
382
+ # 在此处收敛为非可选类型,确保后续赋值满足类型检查
383
+ self.model = maybe_model
351
384
 
352
385
  if model_name:
353
386
  self.model.set_model_name(model_name)
@@ -474,13 +507,95 @@ class Agent:
474
507
  # Fallback for custom handlers that only accept one argument
475
508
  return self.multiline_inputer(tip) # type: ignore
476
509
 
477
- def set_after_tool_call_cb(self, cb: Callable[[Any], None]): # type: ignore
478
- """设置工具调用后回调函数。
479
-
480
- 参数:
481
- cb: 回调函数
510
+ def _load_after_tool_callbacks(self) -> None:
511
+ """
512
+ 扫描 JARVIS_AFTER_TOOL_CALL_CB_DIRS 中的 Python 文件并动态注册回调。
513
+ 约定优先级(任一命中即注册):
514
+ - 模块级可调用对象: after_tool_call_cb
515
+ - 工厂方法返回单个或多个可调用对象: get_after_tool_call_cb(), register_after_tool_call_cb()
482
516
  """
483
- self.after_tool_call_cb = cb
517
+ try:
518
+ dirs = get_after_tool_call_cb_dirs()
519
+ if not dirs:
520
+ return
521
+ for d in dirs:
522
+ p_dir = Path(d)
523
+ if not p_dir.exists() or not p_dir.is_dir():
524
+ continue
525
+ for file_path in p_dir.glob("*.py"):
526
+ if file_path.name == "__init__.py":
527
+ continue
528
+ parent_dir = str(file_path.parent)
529
+ added_path = False
530
+ try:
531
+ if parent_dir not in sys.path:
532
+ sys.path.insert(0, parent_dir)
533
+ added_path = True
534
+ module_name = file_path.stem
535
+ module = __import__(module_name)
536
+
537
+ candidates: List[Callable[[Any], None]] = []
538
+
539
+ # 1) 直接导出的回调
540
+ if hasattr(module, "after_tool_call_cb"):
541
+ obj = getattr(module, "after_tool_call_cb")
542
+ if callable(obj):
543
+ candidates.append(obj) # type: ignore[arg-type]
544
+
545
+ # 2) 工厂方法:get_after_tool_call_cb()
546
+ if hasattr(module, "get_after_tool_call_cb"):
547
+ factory = getattr(module, "get_after_tool_call_cb")
548
+ if callable(factory):
549
+ try:
550
+ ret = factory()
551
+ if callable(ret):
552
+ candidates.append(ret)
553
+ elif isinstance(ret, (list, tuple)):
554
+ for c in ret:
555
+ if callable(c):
556
+ candidates.append(c)
557
+ except Exception:
558
+ pass
559
+
560
+ # 3) 工厂方法:register_after_tool_call_cb()
561
+ if hasattr(module, "register_after_tool_call_cb"):
562
+ factory2 = getattr(module, "register_after_tool_call_cb")
563
+ if callable(factory2):
564
+ try:
565
+ ret2 = factory2()
566
+ if callable(ret2):
567
+ candidates.append(ret2)
568
+ elif isinstance(ret2, (list, tuple)):
569
+ for c in ret2:
570
+ if callable(c):
571
+ candidates.append(c)
572
+ except Exception:
573
+ pass
574
+
575
+ for cb in candidates:
576
+ try:
577
+ def _make_wrapper(callback):
578
+ def _wrapper(**kwargs: Any) -> None:
579
+ try:
580
+ agent = kwargs.get("agent")
581
+ callback(agent)
582
+ except Exception:
583
+ pass
584
+ return _wrapper
585
+ self.event_bus.subscribe(AFTER_TOOL_CALL, _make_wrapper(cb))
586
+ except Exception:
587
+ pass
588
+
589
+ except Exception as e:
590
+ PrettyOutput.print(f"从 {file_path} 加载回调失败: {e}", OutputType.WARNING)
591
+ finally:
592
+ if added_path:
593
+ try:
594
+ sys.path.remove(parent_dir)
595
+ except ValueError:
596
+ pass
597
+ except Exception as e:
598
+ PrettyOutput.print(f"加载回调目录时发生错误: {e}", OutputType.WARNING)
484
599
 
485
600
  def save_session(self) -> bool:
486
601
  """Saves the current session state by delegating to the session manager."""
@@ -555,7 +670,7 @@ class Agent:
555
670
  # 广播添加附加提示前事件(不影响主流程)
556
671
  try:
557
672
  self.event_bus.emit(
558
- "before_addon_prompt",
673
+ BEFORE_ADDON_PROMPT,
559
674
  agent=self,
560
675
  need_complete=need_complete,
561
676
  current_message=message,
@@ -567,16 +682,16 @@ class Agent:
567
682
  addon_text = ""
568
683
  if self.session.addon_prompt:
569
684
  addon_text = self.session.addon_prompt
570
- message += f"\n\n{addon_text}"
685
+ message = join_prompts([message, addon_text])
571
686
  self.session.addon_prompt = ""
572
687
  else:
573
688
  addon_text = self.make_default_addon_prompt(need_complete)
574
- message += f"\n\n{addon_text}"
689
+ message = join_prompts([message, addon_text])
575
690
 
576
691
  # 广播添加附加提示后事件(不影响主流程)
577
692
  try:
578
693
  self.event_bus.emit(
579
- "after_addon_prompt",
694
+ AFTER_ADDON_PROMPT,
580
695
  agent=self,
581
696
  need_complete=need_complete,
582
697
  addon_text=addon_text,
@@ -593,7 +708,7 @@ class Agent:
593
708
  if self.session.conversation_length > self.max_token_count:
594
709
  summary = self._summarize_and_clear_history()
595
710
  if summary:
596
- message = summary + "\n\n" + message
711
+ message = join_prompts([summary, message])
597
712
  self.session.conversation_length = get_context_token_count(message)
598
713
 
599
714
  return message
@@ -606,7 +721,7 @@ class Agent:
606
721
  # 事件:模型调用前
607
722
  try:
608
723
  self.event_bus.emit(
609
- "before_model_call",
724
+ BEFORE_MODEL_CALL,
610
725
  agent=self,
611
726
  message=message,
612
727
  )
@@ -618,7 +733,7 @@ class Agent:
618
733
  # 事件:模型调用后
619
734
  try:
620
735
  self.event_bus.emit(
621
- "after_model_call",
736
+ AFTER_MODEL_CALL,
622
737
  agent=self,
623
738
  message=message,
624
739
  response=response,
@@ -697,7 +812,7 @@ class Agent:
697
812
  if self.model:
698
813
  # 广播清理历史前事件
699
814
  try:
700
- self.event_bus.emit("before_history_clear", agent=self)
815
+ self.event_bus.emit(BEFORE_HISTORY_CLEAR, agent=self)
701
816
  except Exception:
702
817
  pass
703
818
  self.model.reset()
@@ -707,7 +822,7 @@ class Agent:
707
822
  self.session.clear_history()
708
823
  # 广播清理历史后的事件
709
824
  try:
710
- self.event_bus.emit("after_history_clear", agent=self)
825
+ self.event_bus.emit(AFTER_HISTORY_CLEAR, agent=self)
711
826
  except Exception:
712
827
  pass
713
828
 
@@ -717,13 +832,13 @@ class Agent:
717
832
  """使用文件上传方式处理历史"""
718
833
  # 广播清理历史前事件
719
834
  try:
720
- self.event_bus.emit("before_history_clear", agent=self)
835
+ self.event_bus.emit(BEFORE_HISTORY_CLEAR, agent=self)
721
836
  except Exception:
722
837
  pass
723
838
  result = self.file_methodology_manager.handle_history_with_file_upload()
724
839
  # 广播清理历史后的事件
725
840
  try:
726
- self.event_bus.emit("after_history_clear", agent=self)
841
+ self.event_bus.emit(AFTER_HISTORY_CLEAR, agent=self)
727
842
  except Exception:
728
843
  pass
729
844
  return result
@@ -771,7 +886,7 @@ class Agent:
771
886
  # 广播将要生成总结事件
772
887
  try:
773
888
  self.event_bus.emit(
774
- "before_summary",
889
+ BEFORE_SUMMARY,
775
890
  agent=self,
776
891
  prompt=self.session.prompt,
777
892
  auto_completed=auto_completed,
@@ -788,7 +903,7 @@ class Agent:
788
903
  # 广播完成总结事件
789
904
  try:
790
905
  self.event_bus.emit(
791
- "after_summary",
906
+ AFTER_SUMMARY,
792
907
  agent=self,
793
908
  summary=result,
794
909
  )
@@ -798,7 +913,7 @@ class Agent:
798
913
  # 广播任务完成事件(不影响主流程)
799
914
  try:
800
915
  self.event_bus.emit(
801
- "task_completed",
916
+ TASK_COMPLETED,
802
917
  agent=self,
803
918
  auto_completed=auto_completed,
804
919
  need_summary=self.need_summary,
@@ -842,6 +957,7 @@ class Agent:
842
957
  {complete_prompt}
843
958
  如果没有完成,请进行下一步操作:
844
959
  - 仅包含一个操作
960
+ - 不要询问用户是否继续,直接继续执行直至完成
845
961
  - 如果信息不明确,请请求用户补充
846
962
  - 如果执行过程中连续失败5次,请使用ask_user询问用户操作
847
963
  - 操作列表:{action_handlers}{memory_prompts}
@@ -873,7 +989,7 @@ class Agent:
873
989
  # 广播任务开始事件(不影响主流程)
874
990
  try:
875
991
  self.event_bus.emit(
876
- "task_started",
992
+ TASK_STARTED,
877
993
  agent=self,
878
994
  name=self.name,
879
995
  description=self.description,
@@ -910,7 +1026,7 @@ class Agent:
910
1026
  # 广播中断事件(包含用户输入,可能为空字符串)
911
1027
  try:
912
1028
  self.event_bus.emit(
913
- "interrupt_triggered",
1029
+ INTERRUPT_TRIGGERED,
914
1030
  agent=self,
915
1031
  current_response=current_response,
916
1032
  user_input=user_input,
@@ -926,10 +1042,16 @@ class Agent:
926
1042
 
927
1043
  if any(handler.can_handle(current_response) for handler in self.output_handler):
928
1044
  if self.user_confirm("检测到有工具调用,是否继续处理工具调用?", True):
929
- self.session.prompt = f"被用户中断,用户补充信息为:{user_input}\n\n用户同意继续工具调用。"
1045
+ self.session.prompt = join_prompts([
1046
+ f"被用户中断,用户补充信息为:{user_input}",
1047
+ "用户同意继续工具调用。"
1048
+ ])
930
1049
  return None # 继续执行工具调用
931
1050
  else:
932
- self.session.prompt = f"被用户中断,用户补充信息为:{user_input}\n\n检测到有工具调用,但被用户拒绝执行。请根据用户的补充信息重新考虑下一步操作。"
1051
+ self.session.prompt = join_prompts([
1052
+ f"被用户中断,用户补充信息为:{user_input}",
1053
+ "检测到有工具调用,但被用户拒绝执行。请根据用户的补充信息重新考虑下一步操作。"
1054
+ ])
933
1055
  return LoopAction.SKIP_TURN # 请求主循环 continue
934
1056
  else:
935
1057
  self.session.prompt = f"被用户中断,用户补充信息为:{user_input}"
@@ -1020,7 +1142,7 @@ class Agent:
1020
1142
  # 广播工具筛选开始事件
1021
1143
  try:
1022
1144
  self.event_bus.emit(
1023
- "before_tool_filter",
1145
+ BEFORE_TOOL_FILTER,
1024
1146
  agent=self,
1025
1147
  task=task,
1026
1148
  total_tools=len(all_tools),
@@ -1059,7 +1181,7 @@ class Agent:
1059
1181
  # 广播工具筛选事件
1060
1182
  try:
1061
1183
  self.event_bus.emit(
1062
- "tool_filtered",
1184
+ TOOL_FILTERED,
1063
1185
  agent=self,
1064
1186
  task=task,
1065
1187
  selected_tools=selected_tool_names,
@@ -1075,7 +1197,7 @@ class Agent:
1075
1197
  # 广播工具筛选事件(无筛选结果)
1076
1198
  try:
1077
1199
  self.event_bus.emit(
1078
- "tool_filtered",
1200
+ TOOL_FILTERED,
1079
1201
  agent=self,
1080
1202
  task=task,
1081
1203
  selected_tools=[],
@@ -8,7 +8,7 @@
8
8
  - 不引入额外依赖,便于在 Agent 中渐进集成
9
9
  """
10
10
  from collections import defaultdict
11
- from typing import Callable, DefaultDict, Dict, List
11
+ from typing import Callable, DefaultDict, Dict, List, Any
12
12
 
13
13
 
14
14
 
@@ -36,7 +36,7 @@ class EventBus:
36
36
  except ValueError:
37
37
  pass
38
38
 
39
- def emit(self, event: str, **payload: Dict) -> None:
39
+ def emit(self, event: str, **payload: Any) -> None:
40
40
  """
41
41
  广播事件。回调中的异常将被捕获并忽略,以保证主流程稳定。
42
42
  """
@@ -0,0 +1,157 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ 事件主题与负载类型定义(jarvis_agent.events)
4
+
5
+ 目的:
6
+ - 统一事件名称,避免在代码各处硬编码字符串导致的漂移
7
+ - 提供事件负载的类型提示,便于静态检查与后续文档化
8
+ - 本文件仅提供常量与类型定义,不改变现有行为
9
+ """
10
+ from typing import Any, TypedDict, List
11
+
12
+ # 事件主题常量
13
+ BEFORE_TOOL_CALL = "before_tool_call"
14
+ AFTER_TOOL_CALL = "after_tool_call"
15
+
16
+ # 会话与任务生命周期相关
17
+ TASK_STARTED = "task_started"
18
+ TASK_COMPLETED = "task_completed"
19
+
20
+ # 总结阶段
21
+ BEFORE_SUMMARY = "before_summary"
22
+ AFTER_SUMMARY = "after_summary"
23
+
24
+ # 附加提示
25
+ BEFORE_ADDON_PROMPT = "before_addon_prompt"
26
+ AFTER_ADDON_PROMPT = "after_addon_prompt"
27
+
28
+ # 历史清理
29
+ BEFORE_HISTORY_CLEAR = "before_history_clear"
30
+ AFTER_HISTORY_CLEAR = "after_history_clear"
31
+
32
+ # 模型调用
33
+ BEFORE_MODEL_CALL = "before_model_call"
34
+ AFTER_MODEL_CALL = "after_model_call"
35
+
36
+ # 其他
37
+ INTERRUPT_TRIGGERED = "interrupt_triggered"
38
+ BEFORE_TOOL_FILTER = "before_tool_filter"
39
+ TOOL_FILTERED = "tool_filtered"
40
+
41
+
42
+ # 事件负载类型(仅用于类型提示)
43
+ class BeforeToolCallEvent(TypedDict, total=False):
44
+ agent: Any
45
+ current_response: str
46
+
47
+ class AfterToolCallEvent(TypedDict, total=False):
48
+ agent: Any
49
+ current_response: str
50
+ need_return: bool
51
+ tool_prompt: str
52
+
53
+ # 任务生命周期
54
+ class TaskStartedEvent(TypedDict, total=False):
55
+ agent: Any
56
+ name: str
57
+ description: str
58
+ user_input: str
59
+
60
+ class TaskCompletedEvent(TypedDict, total=False):
61
+ agent: Any
62
+ auto_completed: bool
63
+ need_summary: bool
64
+
65
+ # 总结阶段
66
+ class BeforeSummaryEvent(TypedDict, total=False):
67
+ agent: Any
68
+ prompt: str
69
+ auto_completed: bool
70
+ need_summary: bool
71
+
72
+ class AfterSummaryEvent(TypedDict, total=False):
73
+ agent: Any
74
+ summary: str
75
+
76
+ # 附加提示
77
+ class BeforeAddonPromptEvent(TypedDict, total=False):
78
+ agent: Any
79
+ need_complete: bool
80
+ current_message: str
81
+ has_session_addon: bool
82
+
83
+ class AfterAddonPromptEvent(TypedDict, total=False):
84
+ agent: Any
85
+ need_complete: bool
86
+ addon_text: str
87
+ final_message: str
88
+
89
+ # 历史清理
90
+ class BeforeHistoryClearEvent(TypedDict, total=False):
91
+ agent: Any
92
+
93
+ class AfterHistoryClearEvent(TypedDict, total=False):
94
+ agent: Any
95
+
96
+ # 模型调用
97
+ class BeforeModelCallEvent(TypedDict, total=False):
98
+ agent: Any
99
+ message: str
100
+
101
+ class AfterModelCallEvent(TypedDict, total=False):
102
+ agent: Any
103
+ message: str
104
+ response: str
105
+
106
+ # 中断
107
+ class InterruptTriggeredEvent(TypedDict, total=False):
108
+ agent: Any
109
+ current_response: str
110
+ user_input: str
111
+
112
+ # 工具筛选
113
+ class BeforeToolFilterEvent(TypedDict, total=False):
114
+ agent: Any
115
+ task: str
116
+ total_tools: int
117
+ threshold: int
118
+
119
+ class ToolFilteredEvent(TypedDict, total=False):
120
+ agent: Any
121
+ task: str
122
+ selected_tools: List[str]
123
+ total_tools: int
124
+ threshold: int
125
+
126
+ __all__ = [
127
+ "BEFORE_TOOL_CALL",
128
+ "AFTER_TOOL_CALL",
129
+ "TASK_STARTED",
130
+ "TASK_COMPLETED",
131
+ "BEFORE_SUMMARY",
132
+ "AFTER_SUMMARY",
133
+ "BEFORE_ADDON_PROMPT",
134
+ "AFTER_ADDON_PROMPT",
135
+ "BEFORE_HISTORY_CLEAR",
136
+ "AFTER_HISTORY_CLEAR",
137
+ "BEFORE_MODEL_CALL",
138
+ "AFTER_MODEL_CALL",
139
+ "INTERRUPT_TRIGGERED",
140
+ "BEFORE_TOOL_FILTER",
141
+ "TOOL_FILTERED",
142
+ "BeforeToolCallEvent",
143
+ "AfterToolCallEvent",
144
+ "TaskStartedEvent",
145
+ "TaskCompletedEvent",
146
+ "BeforeSummaryEvent",
147
+ "AfterSummaryEvent",
148
+ "BeforeAddonPromptEvent",
149
+ "AfterAddonPromptEvent",
150
+ "BeforeHistoryClearEvent",
151
+ "AfterHistoryClearEvent",
152
+ "BeforeModelCallEvent",
153
+ "AfterModelCallEvent",
154
+ "InterruptTriggeredEvent",
155
+ "BeforeToolFilterEvent",
156
+ "ToolFilteredEvent",
157
+ ]
@@ -8,6 +8,7 @@ import tempfile
8
8
 
9
9
  from jarvis.jarvis_utils.methodology import load_methodology, upload_methodology
10
10
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
11
+ from jarvis.jarvis_agent.utils import join_prompts
11
12
 
12
13
 
13
14
  class FileMethodologyManager:
@@ -47,16 +48,25 @@ class FileMethodologyManager:
47
48
  # 上传成功
48
49
 
49
50
  if self.agent.files:
50
- self.agent.session.prompt = f"{self.agent.session.prompt}\n\n上传的文件包含历史对话信息和方法论文件,可以从中获取一些经验信息。"
51
+ self.agent.session.prompt = join_prompts([
52
+ self.agent.session.prompt,
53
+ "上传的文件包含历史对话信息和方法论文件,可以从中获取一些经验信息。"
54
+ ])
51
55
  else:
52
- self.agent.session.prompt = f"{self.agent.session.prompt}\n\n上传的文件包含历史对话信息,可以从中获取一些经验信息。"
56
+ self.agent.session.prompt = join_prompts([
57
+ self.agent.session.prompt,
58
+ "上传的文件包含历史对话信息,可以从中获取一些经验信息。"
59
+ ])
53
60
 
54
61
  def _handle_files_upload(self):
55
62
  """处理普通文件上传"""
56
63
  if not self.agent.model.upload_files(self.agent.files): # type: ignore
57
64
  PrettyOutput.print("文件上传失败,将忽略文件列表", OutputType.WARNING)
58
65
  else:
59
- self.agent.session.prompt = f"{self.agent.session.prompt}\n\n上传的文件包含历史对话信息,可以从中获取一些经验信息。"
66
+ self.agent.session.prompt = join_prompts([
67
+ self.agent.session.prompt,
68
+ "上传的文件包含历史对话信息,可以从中获取一些经验信息。"
69
+ ])
60
70
 
61
71
  def _handle_local_mode(self):
62
72
  """处理本地模式(不支持文件上传)"""
@@ -80,7 +90,10 @@ class FileMethodologyManager:
80
90
  platform_name=self.agent.model.platform_name(),
81
91
  model_name=self.agent.model.name(),
82
92
  )
83
- self.agent.session.prompt = f"{self.agent.session.prompt}\n\n以下是历史类似问题的执行经验,可参考:\n{methodology}"
93
+ self.agent.session.prompt = join_prompts([
94
+ self.agent.session.prompt,
95
+ f"以下是历史类似问题的执行经验,可参考:\n{methodology}"
96
+ ])
84
97
 
85
98
  def handle_history_with_file_upload(self) -> str:
86
99
  """使用文件上传方式处理历史"""
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI 助手主入口模块"""
3
- from typing import Optional
3
+ from typing import Optional, List
4
4
 
5
5
  import typer
6
6
 
@@ -391,7 +391,7 @@ def handle_builtin_config_selector(
391
391
  if category == "roles":
392
392
  count = opt.get("roles_count")
393
393
  details_val = opt.get("details", "")
394
- parts: list[str] = []
394
+ parts: List[str] = []
395
395
  if isinstance(count, int) and count > 0:
396
396
  parts.append(f"{count} 个角色")
397
397
  if isinstance(details_val, str) and details_val:
@@ -442,7 +442,7 @@ def handle_builtin_config_selector(
442
442
  if choice_index != -1:
443
443
  try:
444
444
  sel = options[choice_index]
445
- args: list[str] = []
445
+ args: List[str] = []
446
446
 
447
447
  if sel["category"] == "agent":
448
448
  # jarvis-agent 支持 -f/--config(全局配置)与 -c/--agent-definition