jarvis-ai-assistant 0.3.17__tar.gz → 0.3.18__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 (135) hide show
  1. {jarvis_ai_assistant-0.3.17/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.3.18}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/__init__.py +2 -0
  6. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/jarvis.py +13 -3
  7. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/methodology_share_manager.py +2 -2
  8. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/tool_share_manager.py +2 -2
  9. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_data/config_schema.json +5 -0
  10. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/base.py +8 -1
  11. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform_manager/main.py +12 -22
  12. jarvis_ai_assistant-0.3.18/src/jarvis/jarvis_tools/read_webpage.py +120 -0
  13. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/config.py +8 -0
  14. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/utils.py +9 -0
  15. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  16. jarvis_ai_assistant-0.3.17/src/jarvis/jarvis_tools/read_webpage.py +0 -59
  17. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/LICENSE +0 -0
  18. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/MANIFEST.in +0 -0
  19. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/README.md +0 -0
  20. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/setup.cfg +0 -0
  21. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/agent_manager.py +0 -0
  22. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  23. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/config_editor.py +0 -0
  24. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  25. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
  26. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/main.py +0 -0
  27. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/memory_manager.py +0 -0
  28. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  29. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  30. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/prompts.py +0 -0
  31. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/protocols.py +0 -0
  32. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/session_manager.py +0 -0
  33. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/share_manager.py +0 -0
  34. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  35. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/task_analyzer.py +0 -0
  36. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/task_manager.py +0 -0
  37. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  38. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  39. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
  40. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  41. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  42. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  43. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  44. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  45. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  46. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  47. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  48. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  49. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  50. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  51. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  52. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  53. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  54. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  55. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  56. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  57. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  58. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  59. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  60. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  61. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  62. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  63. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  64. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_git_squash/main.py +0 -0
  65. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  66. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  67. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  68. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  69. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  70. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
  71. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
  72. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_methodology/main.py +0 -0
  73. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  74. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  75. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/__init__.py +0 -0
  76. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/ai8.py +0 -0
  77. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/human.py +0 -0
  78. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/kimi.py +0 -0
  79. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/openai.py +0 -0
  80. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/registry.py +0 -0
  81. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  82. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  83. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  84. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  85. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/__init__.py +0 -0
  86. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/cache.py +0 -0
  87. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/cli.py +0 -0
  88. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  89. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
  90. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  91. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
  92. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/reranker.py +0 -0
  93. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/retriever.py +0 -0
  94. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  95. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  96. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/__init__.py +0 -0
  97. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/cli.py +0 -0
  98. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/stats.py +0 -0
  99. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/storage.py +0 -0
  100. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/visualizer.py +0 -0
  101. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/__init__.py +0 -0
  102. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  103. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/base.py +0 -0
  104. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
  105. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  106. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  107. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  108. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  109. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  110. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  111. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/methodology.py +0 -0
  112. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/read_code.py +0 -0
  113. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/registry.py +0 -0
  114. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
  115. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  116. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/save_memory.py +0 -0
  117. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/search_web.py +0 -0
  118. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  119. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/__init__.py +0 -0
  120. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  121. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/clipboard.py +0 -0
  122. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/embedding.py +0 -0
  123. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  124. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  125. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/globals.py +0 -0
  126. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/http.py +0 -0
  127. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/input.py +0 -0
  128. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/methodology.py +0 -0
  129. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/output.py +0 -0
  130. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/tag.py +0 -0
  131. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  132. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  133. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  134. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  135. {jarvis_ai_assistant-0.3.17 → jarvis_ai_assistant-0.3.18}/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.17
3
+ Version: 0.3.18
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.17"
7
+ version = "0.3.18"
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.17",
6
+ version="0.3.18",
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.17"
4
+ __version__ = "0.3.18"
@@ -791,6 +791,8 @@ class Agent:
791
791
  set_interrupt(False)
792
792
  user_input = self.multiline_inputer(f"模型交互期间被中断,请输入用户干预信息:")
793
793
 
794
+ self.run_input_handlers_next_turn = True
795
+
794
796
  if not user_input:
795
797
  # 用户输入为空,完成任务
796
798
  return self._complete_task(auto_completed=False)
@@ -240,6 +240,7 @@ def handle_builtin_config_selector(
240
240
  # 解析YAML以获取可读名称/描述(失败时静默降级为文件名)
241
241
  name = fpath.stem
242
242
  desc = ""
243
+ roles_count = 0
243
244
  try:
244
245
  with open(
245
246
  fpath, "r", encoding="utf-8", errors="ignore"
@@ -251,8 +252,9 @@ def handle_builtin_config_selector(
251
252
  if cat == "roles" and isinstance(
252
253
  data.get("roles"), list
253
254
  ):
255
+ roles_count = len(data["roles"])
254
256
  if not desc:
255
- desc = f"{len(data['roles'])} 个角色"
257
+ desc = f"{roles_count} 个角色"
256
258
  except Exception:
257
259
  # 忽略解析错误,使用默认显示
258
260
  pass
@@ -285,6 +287,7 @@ def handle_builtin_config_selector(
285
287
  "name": str(name),
286
288
  "desc": str(desc),
287
289
  "details": str(details),
290
+ "roles_count": int(roles_count),
288
291
  }
289
292
  )
290
293
 
@@ -302,9 +305,16 @@ def handle_builtin_config_selector(
302
305
  category = opt.get("category", "")
303
306
  name = opt.get("name", "")
304
307
  file_path = opt.get("file", "")
305
- # 描述列显示配置描述;若为 roles 则显示角色列表
308
+ # 描述列显示配置描述;若为 roles 同时显示角色数量与列表
306
309
  if category == "roles":
307
- desc_display = opt.get("details", "")
310
+ count = opt.get("roles_count")
311
+ details = opt.get("details", "")
312
+ parts = []
313
+ if isinstance(count, int) and count > 0:
314
+ parts.append(f"{count} 个角色")
315
+ if details:
316
+ parts.append(details)
317
+ desc_display = "\n".join(parts) if parts else ""
308
318
  else:
309
319
  desc_display = opt.get("desc", "")
310
320
  table.add_row(str(idx), category, name, file_path, desc_display)
@@ -151,12 +151,12 @@ class MethodologyShareManager(ShareManager):
151
151
  "没有找到新的方法论文件(所有方法论可能已存在于中心仓库)",
152
152
  OutputType.WARNING,
153
153
  )
154
- raise typer.Exit(code=0)
154
+ return
155
155
 
156
156
  # 选择要分享的资源
157
157
  selected_resources = self.select_resources(local_resources)
158
158
  if not selected_resources:
159
- raise typer.Exit(code=0)
159
+ return
160
160
 
161
161
  # 分享资源
162
162
  copied_list = self.share_resources(selected_resources)
@@ -112,12 +112,12 @@ class ToolShareManager(ShareManager):
112
112
  "没有找到新的工具文件(所有工具可能已存在于中心仓库)",
113
113
  OutputType.WARNING,
114
114
  )
115
- raise typer.Exit(code=0)
115
+ return
116
116
 
117
117
  # 选择要分享的资源
118
118
  selected_resources = self.select_resources(local_resources)
119
119
  if not selected_resources:
120
- raise typer.Exit(code=0)
120
+ return
121
121
 
122
122
  # 分享资源
123
123
  moved_list = self.share_resources(selected_resources)
@@ -294,6 +294,11 @@
294
294
  "description": "在进入默认通用代理前,列出可用配置(agent/multi_agent/roles)供选择",
295
295
  "default": false
296
296
  },
297
+ "JARVIS_IMMEDIATE_ABORT": {
298
+ "type": "boolean",
299
+ "description": "是否启用立即中断:在对话迭代中检测到中断信号时立即返回",
300
+ "default": false
301
+ },
297
302
  "JARVIS_TOOL_GROUP": {
298
303
  "type": "string",
299
304
  "description": "选择一个预定义的工具配置组",
@@ -15,9 +15,10 @@ from jarvis.jarvis_utils.config import (
15
15
  get_max_input_token_count,
16
16
  get_pretty_output,
17
17
  is_print_prompt,
18
+ is_immediate_abort,
18
19
  )
19
20
  from jarvis.jarvis_utils.embedding import split_text_into_chunks
20
- from jarvis.jarvis_utils.globals import set_in_chat
21
+ from jarvis.jarvis_utils.globals import set_in_chat, get_interrupt
21
22
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
22
23
  from jarvis.jarvis_utils.tag import ct, ot
23
24
  from jarvis.jarvis_utils.utils import get_context_token_count, while_success, while_true
@@ -137,6 +138,8 @@ class BasePlatform(ABC):
137
138
  with Live(panel, refresh_per_second=10, transient=False) as live:
138
139
  for s in self.chat(message):
139
140
  response += s
141
+ if is_immediate_abort() and get_interrupt():
142
+ return response
140
143
  text_content.append(s, style="bright_white")
141
144
  panel.subtitle = "[yellow]正在回答...[/yellow]"
142
145
  live.update(panel)
@@ -150,10 +153,14 @@ class BasePlatform(ABC):
150
153
  for s in self.chat(message):
151
154
  print(s, end="", flush=True)
152
155
  response += s
156
+ if is_immediate_abort() and get_interrupt():
157
+ return response
153
158
  print()
154
159
  else:
155
160
  for s in self.chat(message):
156
161
  response += s
162
+ if is_immediate_abort() and get_interrupt():
163
+ return response
157
164
  # Keep original think tag handling
158
165
  response = re.sub(
159
166
  ot("think") + r".*?" + ct("think"), "", response, flags=re.DOTALL
@@ -26,9 +26,7 @@ app = typer.Typer(help="Jarvis AI 平台")
26
26
 
27
27
  @app.command("info")
28
28
  def list_platforms(
29
- platform: Optional[str] = typer.Option(
30
- None, "--platform", "-p", help="指定要查看的平台"
31
- )
29
+ platform: Optional[str] = typer.Option(None, "--platform", "-p", help="指定要查看的平台")
32
30
  ) -> None:
33
31
  """列出所有支持的平台和模型,或指定平台的详细信息。"""
34
32
  registry = PlatformRegistry.get_global_platform_registry()
@@ -219,13 +217,9 @@ def chat_with_model(
219
217
  for entry in conversation_history:
220
218
  file_obj.write(f"{entry['role']}: {entry['content']}\n\n")
221
219
 
222
- PrettyOutput.print(
223
- f"所有对话已保存到 {file_path}", OutputType.SUCCESS
224
- )
220
+ PrettyOutput.print(f"所有对话已保存到 {file_path}", OutputType.SUCCESS)
225
221
  except Exception as exc:
226
- PrettyOutput.print(
227
- f"保存所有对话失败: {str(exc)}", OutputType.ERROR
228
- )
222
+ PrettyOutput.print(f"保存所有对话失败: {str(exc)}", OutputType.ERROR)
229
223
  continue
230
224
 
231
225
  # Check if it is a save_session command
@@ -246,9 +240,7 @@ def chat_with_model(
246
240
  file_path = file_path[1:-1]
247
241
 
248
242
  if platform.save(file_path):
249
- PrettyOutput.print(
250
- f"会话已保存到 {file_path}", OutputType.SUCCESS
251
- )
243
+ PrettyOutput.print(f"会话已保存到 {file_path}", OutputType.SUCCESS)
252
244
  else:
253
245
  PrettyOutput.print("保存会话失败", OutputType.ERROR)
254
246
  except Exception as exc:
@@ -274,9 +266,7 @@ def chat_with_model(
274
266
 
275
267
  if platform.restore(file_path):
276
268
  conversation_history = [] # Clear local history after loading
277
- PrettyOutput.print(
278
- f"会话已从 {file_path} 加载", OutputType.SUCCESS
279
- )
269
+ PrettyOutput.print(f"会话已从 {file_path} 加载", OutputType.SUCCESS)
280
270
  else:
281
271
  PrettyOutput.print("加载会话失败", OutputType.ERROR)
282
272
  except Exception as exc:
@@ -356,9 +346,7 @@ def validate_platform_model(platform: Optional[str], model: Optional[str]) -> bo
356
346
 
357
347
  @app.command("chat")
358
348
  def chat_command(
359
- platform: Optional[str] = typer.Option(
360
- None, "--platform", "-p", help="指定要使用的平台"
361
- ),
349
+ platform: Optional[str] = typer.Option(None, "--platform", "-p", help="指定要使用的平台"),
362
350
  model: Optional[str] = typer.Option(None, "--model", "-m", help="指定要使用的模型"),
363
351
  llm_type: str = typer.Option(
364
352
  "normal",
@@ -441,9 +429,7 @@ def role_command(
441
429
  platform: Optional[str] = typer.Option(
442
430
  None, "--platform", "-p", help="指定要使用的平台,覆盖角色配置"
443
431
  ),
444
- model: Optional[str] = typer.Option(
445
- None, "--model", "-m", help="指定要使用的模型,覆盖角色配置"
446
- ),
432
+ model: Optional[str] = typer.Option(None, "--model", "-m", help="指定要使用的模型,覆盖角色配置"),
447
433
  llm_type: Optional[str] = typer.Option(
448
434
  None,
449
435
  "-t",
@@ -472,8 +458,12 @@ def role_command(
472
458
  PrettyOutput.print(output_str, OutputType.INFO)
473
459
 
474
460
  # 让用户选择角色
461
+ raw_choice = get_single_line_input("请选择角色(输入编号,直接回车退出): ")
462
+ if not raw_choice.strip():
463
+ PrettyOutput.print("已取消,退出程序", OutputType.INFO)
464
+ raise typer.Exit(code=0)
475
465
  try:
476
- choice = int(get_single_line_input("请选择角色(输入编号): "))
466
+ choice = int(raw_choice)
477
467
  selected_role = config["roles"][choice - 1]
478
468
  except (ValueError, IndexError):
479
469
  PrettyOutput.print("无效的选择", OutputType.ERROR)
@@ -0,0 +1,120 @@
1
+ # -*- coding: utf-8 -*-
2
+ from typing import Any, Dict
3
+
4
+ from jarvis.jarvis_platform.registry import PlatformRegistry
5
+ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
6
+ from jarvis.jarvis_utils.config import (
7
+ get_web_search_platform_name,
8
+ get_web_search_model_name,
9
+ )
10
+ from jarvis.jarvis_utils.http import get as http_get
11
+ from markdownify import markdownify as md # type: ignore
12
+ import requests
13
+
14
+
15
+ class WebpageTool:
16
+ name = "read_webpage"
17
+ description = "读取网页内容,提取标题、文本和超链接"
18
+ parameters = {
19
+ "type": "object",
20
+ "properties": {
21
+ "url": {"type": "string", "description": "要读取的网页URL"},
22
+ "want": {
23
+ "type": "string",
24
+ "description": "具体想要从网页获取的信息或回答的问题",
25
+ "default": "请总结这个网页的主要内容",
26
+ },
27
+ },
28
+ "required": ["url"],
29
+ }
30
+
31
+ def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
32
+ """
33
+ 读取网页内容。
34
+ 优先使用配置的 web_search_platform 与模型的原生web能力;若不支持,则使用requests抓取页面并调用模型进行分析。
35
+ """
36
+ try:
37
+ url = str(args.get("url", "")).strip()
38
+ want = str(args.get("want", "请总结这个网页的主要内容"))
39
+
40
+ if not url:
41
+ return {"success": False, "stdout": "", "stderr": "缺少必需参数:url"}
42
+
43
+ # 1) 优先使用配置的 Web 搜索平台与模型(若支持web)
44
+ web_search_platform = get_web_search_platform_name()
45
+ web_search_model = get_web_search_model_name()
46
+ if web_search_platform and web_search_model:
47
+ model = PlatformRegistry().create_platform(web_search_platform)
48
+ if model:
49
+ model.set_model_name(web_search_model)
50
+ if model.support_web():
51
+ PrettyOutput.print("▶️ 使用配置的 Web 搜索平台读取网页...", OutputType.INFO)
52
+ model.set_web(True)
53
+ model.set_suppress_output(False) # type: ignore
54
+ prompt = f"""请帮我处理这个网页:{url}
55
+ 用户的具体需求是:{want}
56
+ 请按照以下要求输出结果:
57
+ 1. 使用Markdown格式
58
+ 2. 包含网页标题
59
+ 3. 根据用户需求提供准确、完整的信息"""
60
+ response = model.chat_until_success(prompt) # type: ignore
61
+ return {"success": True, "stdout": response, "stderr": ""}
62
+
63
+ # 2) 然后尝试使用默认平台(normal)的 web 能力
64
+ model = PlatformRegistry().get_normal_platform()
65
+ if model.support_web():
66
+ PrettyOutput.print("▶️ 使用默认平台的 Web 能力读取网页...", OutputType.INFO)
67
+ model.set_web(True)
68
+ model.set_suppress_output(False) # type: ignore
69
+ prompt = f"""请帮我处理这个网页:{url}
70
+ 用户的具体需求是:{want}
71
+ 请按照以下要求输出结果:
72
+ 1. 使用Markdown格式
73
+ 2. 包含网页标题
74
+ 3. 根据用户需求提供准确、完整的信息"""
75
+ response = model.chat_until_success(prompt) # type: ignore
76
+ return {"success": True, "stdout": response, "stderr": ""}
77
+
78
+ # 3) 回退:使用 requests 抓取网页,再用模型分析
79
+ PrettyOutput.print("ℹ️ 当前模型不支持Web,使用requests抓取网页并进行分析。", OutputType.INFO)
80
+ try:
81
+ resp = http_get(url, timeout=10.0, allow_redirects=True)
82
+ content_md = md(resp.text, strip=["script", "style"])
83
+ except requests.exceptions.HTTPError as e:
84
+ PrettyOutput.print(f"⚠️ HTTP错误 {e.response.status_code} 访问 {url}", OutputType.WARNING)
85
+ return {"success": False, "stdout": "", "stderr": f"HTTP错误:{e.response.status_code}"}
86
+ except requests.exceptions.RequestException as e:
87
+ PrettyOutput.print(f"⚠️ 请求错误: {e}", OutputType.WARNING)
88
+ return {"success": False, "stdout": "", "stderr": f"请求错误:{e}"}
89
+
90
+ if not content_md or not content_md.strip():
91
+ return {"success": False, "stdout": "", "stderr": "无法从网页抓取有效内容。"}
92
+
93
+ PrettyOutput.print("🧠 正在分析抓取到的网页内容...", OutputType.INFO)
94
+ summary_prompt = f"""以下是网页 {url} 的内容(已转换为Markdown):
95
+ ----------------
96
+ {content_md}
97
+ ----------------
98
+ 请根据用户的具体需求“{want}”进行总结与回答:
99
+ - 使用Markdown格式
100
+ - 包含网页标题(若可推断)
101
+ - 提供准确、完整的信息"""
102
+
103
+ model = PlatformRegistry().get_normal_platform()
104
+ model.set_suppress_output(False) # type: ignore
105
+ summary = model.chat_until_success(summary_prompt) # type: ignore
106
+
107
+ return {"success": True, "stdout": summary, "stderr": ""}
108
+
109
+ except Exception as e:
110
+ PrettyOutput.print(f"读取网页失败: {str(e)}", OutputType.ERROR)
111
+ return {
112
+ "success": False,
113
+ "stdout": "",
114
+ "stderr": f"Failed to parse webpage: {str(e)}",
115
+ }
116
+
117
+ @staticmethod
118
+ def check() -> bool:
119
+ """工具可用性检查:始终可用;若模型不支持web将回退到requests抓取。"""
120
+ return True
@@ -624,3 +624,11 @@ def is_enable_builtin_config_selector() -> bool:
624
624
  return (
625
625
  GLOBAL_CONFIG_DATA.get("JARVIS_ENABLE_STARTUP_CONFIG_SELECTOR", False) is True
626
626
  )
627
+
628
+
629
+ def is_immediate_abort() -> bool:
630
+ """
631
+ 是否启用立即中断:当在对话过程中检测到用户中断信号时,立即停止输出并返回。
632
+ 默认关闭
633
+ """
634
+ return GLOBAL_CONFIG_DATA.get("JARVIS_IMMEDIATE_ABORT", False) is True
@@ -947,6 +947,15 @@ def _load_and_process_config(jarvis_dir: str, config_file: str) -> None:
947
947
  )
948
948
  or changed
949
949
  )
950
+ changed = (
951
+ _ask_and_set(
952
+ "JARVIS_IMMEDIATE_ABORT",
953
+ "是否启用立即中断?\n- 选择 是/true:在对话输出流的每次迭代中检测到用户中断(例如 Ctrl+C)时,立即返回当前已生成的内容并停止继续输出。\n- 选择 否/false:不会在输出过程中立刻返回,而是按既有流程处理(不中途打断输出)。",
954
+ False,
955
+ "bool",
956
+ )
957
+ or changed
958
+ )
950
959
  changed = (
951
960
  _ask_and_set(
952
961
  "JARVIS_ENABLE_STATIC_ANALYSIS",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.3.17
3
+ Version: 0.3.18
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
@@ -1,59 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- from typing import Any, Dict
3
-
4
- from jarvis.jarvis_platform.registry import PlatformRegistry
5
- from jarvis.jarvis_utils.output import OutputType, PrettyOutput
6
-
7
-
8
- class WebpageTool:
9
- name = "read_webpage"
10
- description = "读取网页内容,提取标题、文本和超链接"
11
- parameters = {
12
- "type": "object",
13
- "properties": {
14
- "url": {"type": "string", "description": "要读取的网页URL"},
15
- "want": {
16
- "type": "string",
17
- "description": "具体想要从网页获取的信息或回答的问题",
18
- "default": "请总结这个网页的主要内容",
19
- },
20
- },
21
- "required": ["url"],
22
- }
23
-
24
- def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
25
- """Read webpage content using Yuanbao model"""
26
- try:
27
- url = args["url"].strip()
28
- want = args.get("want", "请总结这个网页的主要内容")
29
-
30
- # Create Yuanbao model instance
31
- model = PlatformRegistry().get_normal_platform()
32
- model.set_web(True)
33
- model.set_suppress_output(False) # type: ignore
34
-
35
- # Construct prompt based on want parameter
36
- prompt = f"""请帮我处理这个网页:{url}
37
- 用户的具体需求是:{want}
38
- 请按照以下要求输出结果:
39
- 1. 使用Markdown格式
40
- 2. 包含网页标题
41
- 3. 根据用户需求提供准确、完整的信息"""
42
-
43
- # Get response from Yuanbao model
44
- response = model.chat_until_success(prompt) # type: ignore
45
-
46
- return {"success": True, "stdout": response, "stderr": ""}
47
-
48
- except Exception as e:
49
- PrettyOutput.print(f"读取网页失败: {str(e)}", OutputType.ERROR)
50
- return {
51
- "success": False,
52
- "stdout": "",
53
- "stderr": f"Failed to parse webpage: {str(e)}",
54
- }
55
-
56
- @staticmethod
57
- def check() -> bool:
58
- """检查当前平台是否支持web功能"""
59
- return PlatformRegistry().get_normal_platform().support_web()