jarvis-ai-assistant 0.1.172__tar.gz → 0.1.174__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 (111) hide show
  1. {jarvis_ai_assistant-0.1.172/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.174}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform/base.py +4 -3
  6. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/cli/main.py +31 -12
  7. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/config.py +1 -1
  8. jarvis_ai_assistant-0.1.174/src/jarvis/jarvis_utils/embedding.py +122 -0
  9. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  10. jarvis_ai_assistant-0.1.172/src/jarvis/jarvis_utils/embedding.py +0 -181
  11. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/LICENSE +0 -0
  12. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/MANIFEST.in +0 -0
  13. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/README.md +0 -0
  14. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/setup.cfg +0 -0
  15. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_agent/__init__.py +0 -0
  16. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  17. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_agent/file_input_handler.py +0 -0
  18. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_agent/jarvis.py +0 -0
  19. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_agent/main.py +0 -0
  20. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  21. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  22. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  23. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
  24. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  25. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  26. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  27. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  28. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  29. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  30. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  31. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  32. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  33. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  34. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  35. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  36. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  37. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  38. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  39. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  40. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  41. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  42. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  43. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  44. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  45. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_data/huggingface.tar.gz +0 -0
  46. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_dev/main.py +0 -0
  47. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_git_details/__init__.py +0 -0
  48. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_git_details/main.py +0 -0
  49. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  50. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_git_squash/main.py +0 -0
  51. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  52. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_lsp/base.py +0 -0
  53. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_lsp/cpp.py +0 -0
  54. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_lsp/go.py +0 -0
  55. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_lsp/python.py +0 -0
  56. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_lsp/registry.py +0 -0
  57. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_lsp/rust.py +0 -0
  58. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  59. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  60. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  61. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_methodology/main.py +0 -0
  62. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  63. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  64. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform/__init__.py +0 -0
  65. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform/human.py +0 -0
  66. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform/kimi.py +0 -0
  67. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform/openai.py +0 -0
  68. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform/registry.py +0 -0
  69. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  70. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  71. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  72. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  73. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  74. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/__init__.py +0 -0
  75. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/ask_codebase.py +0 -0
  76. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  77. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/base.py +0 -0
  78. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/chdir.py +0 -0
  79. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  80. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/code_plan.py +0 -0
  81. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
  82. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
  83. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  84. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  85. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  86. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/file_operation.py +0 -0
  87. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/find_methodology.py +0 -0
  88. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  89. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/lsp_get_diagnostics.py +0 -0
  90. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/methodology.py +0 -0
  91. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/read_code.py +0 -0
  92. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  93. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/registry.py +0 -0
  94. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  95. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/search_web.py +0 -0
  96. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  97. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/__init__.py +0 -0
  98. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  99. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  100. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  101. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/globals.py +0 -0
  102. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/input.py +0 -0
  103. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/methodology.py +0 -0
  104. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/output.py +0 -0
  105. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/tag.py +0 -0
  106. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis/jarvis_utils/utils.py +0 -0
  107. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  108. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  109. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  110. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  111. {jarvis_ai_assistant-0.1.172 → jarvis_ai_assistant-0.1.174}/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.172
3
+ Version: 0.1.174
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
@@ -8,7 +8,7 @@ default = true
8
8
 
9
9
  [project]
10
10
  name = "jarvis-ai-assistant"
11
- version = "0.1.172"
11
+ version = "0.1.174"
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.172",
6
+ version="0.1.174",
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.172"
4
+ __version__ = "0.1.174"
@@ -48,7 +48,6 @@ class BasePlatform(ABC):
48
48
  start_time = time.time()
49
49
 
50
50
  input_token_count = get_context_token_count(message)
51
-
52
51
  if is_context_overflow(message):
53
52
  PrettyOutput.print("错误:输入内容超过最大限制", OutputType.WARNING)
54
53
  return "错误:输入内容超过最大限制"
@@ -56,10 +55,12 @@ class BasePlatform(ABC):
56
55
  if input_token_count > get_max_input_token_count():
57
56
  current_suppress_output = self.suppress_output
58
57
  self.set_suppress_output(True)
59
- inputs = split_text_into_chunks(message, get_max_input_token_count() - 1024, get_max_input_token_count() - 2048)
58
+ max_chunk_size = get_max_input_token_count() - 1024 # 留出一些余量
59
+ min_chunk_size = max_chunk_size // 2 # 最小块大小设为最大块大小的一半
60
+ inputs = split_text_into_chunks(message, max_chunk_size, min_chunk_size)
60
61
  with yaspin(text="正在提交长上下文...", color="cyan") as spinner:
61
62
  prefix_prompt = f"""
62
- 我将分多次提供大量内容,在我明确告诉你内容已经全部提供完毕之前,每次仅需要输出“已收到”,明白请输出“开始接收输入”。
63
+ 我将分多次提供大量内容,在我明确告诉你内容已经全部提供完毕之前,每次仅需要输出"已收到",明白请输出"开始接收输入"。
63
64
  """
64
65
  while_true(lambda: while_success(lambda: self.chat(prefix_prompt), 5), 5)
65
66
  submit_count = 0
@@ -6,7 +6,26 @@ from jarvis.jarvis_utils.utils import init_env
6
6
 
7
7
 
8
8
  def main() -> int:
9
- """命令行工具入口,提供工具列表查看和工具调用功能"""
9
+ """
10
+ 命令行工具入口,提供工具列表查看和工具调用功能
11
+
12
+ 功能:
13
+ 1. 列出所有可用工具 (list命令)
14
+ 2. 调用指定工具 (call命令)
15
+
16
+ 参数:
17
+ 通过命令行参数传递,包括:
18
+ - list: 列出工具
19
+ --json: 以JSON格式输出
20
+ --detailed: 显示详细信息
21
+ - call: 调用工具
22
+ tool_name: 工具名称
23
+ --args: 工具参数(JSON格式)
24
+ --args-file: 从文件加载工具参数
25
+
26
+ 返回值:
27
+ int: 0表示成功,非0表示错误
28
+ """
10
29
  import argparse
11
30
  import json
12
31
 
@@ -34,24 +53,24 @@ def main() -> int:
34
53
  registry = ToolRegistry()
35
54
 
36
55
  if args.command == "list":
37
- tools = registry.get_all_tools()
56
+ tools = registry.get_all_tools() # 从注册表获取所有工具信息
38
57
 
39
58
  if args.json:
40
59
  if args.detailed:
41
- print(json.dumps(tools, indent=2, ensure_ascii=False))
60
+ print(json.dumps(tools, indent=2, ensure_ascii=False)) # 输出完整JSON格式
42
61
  else:
43
62
  simple_tools = [
44
63
  {"name": t["name"], "description": t["description"]} for t in tools
45
- ]
64
+ ] # 简化工具信息
46
65
  print(json.dumps(simple_tools, indent=2, ensure_ascii=False))
47
66
  else:
48
- PrettyOutput.section("可用工具列表", OutputType.SYSTEM)
67
+ PrettyOutput.section("可用工具列表", OutputType.SYSTEM) # 使用美化输出
49
68
  for tool in tools:
50
69
  print(f"\n✅ {tool['name']}")
51
70
  print(f" 描述: {tool['description']}")
52
71
  if args.detailed:
53
72
  print(f" 参数:")
54
- print(tool["parameters"])
73
+ print(tool["parameters"]) # 显示详细参数信息
55
74
 
56
75
  elif args.command == "call":
57
76
  tool_name = args.tool_name
@@ -63,11 +82,11 @@ def main() -> int:
63
82
  print(f"可用工具: {available_tools}")
64
83
  return 1
65
84
 
66
- # 获取参数
85
+ # 获取参数: 支持从命令行直接传入或从文件加载
67
86
  tool_args = {}
68
87
  if args.args:
69
88
  try:
70
- tool_args = json.loads(args.args)
89
+ tool_args = json.loads(args.args) # 解析JSON格式参数
71
90
  except json.JSONDecodeError:
72
91
  PrettyOutput.print("错误: 参数必须是有效的JSON格式", OutputType.ERROR)
73
92
  return 1
@@ -75,14 +94,14 @@ def main() -> int:
75
94
  elif args.args_file:
76
95
  try:
77
96
  with open(args.args_file, "r", encoding="utf-8") as f:
78
- tool_args = json.load(f)
97
+ tool_args = json.load(f) # 从文件加载JSON参数
79
98
  except (json.JSONDecodeError, FileNotFoundError) as e:
80
99
  PrettyOutput.print(
81
100
  f"错误: 无法从文件加载参数: {str(e)}", OutputType.ERROR
82
101
  )
83
102
  return 1
84
103
 
85
- # 检查必需参数
104
+ # 检查必需参数是否完整
86
105
  required_params = tool_obj.parameters.get("required", [])
87
106
  missing_params = [p for p in required_params if p not in tool_args]
88
107
 
@@ -98,10 +117,10 @@ def main() -> int:
98
117
  print(f" - {param_name}: {desc}")
99
118
  return 1
100
119
 
101
- # 执行工具
120
+ # 执行工具并处理结果
102
121
  result = registry.execute_tool(tool_name, tool_args)
103
122
 
104
- # 显示结果
123
+ # 显示执行结果
105
124
  if result["success"]:
106
125
  PrettyOutput.section(f"工具 {tool_name} 执行成功", OutputType.SUCCESS)
107
126
  else:
@@ -160,4 +160,4 @@ def get_max_big_content_size() -> int:
160
160
  返回:
161
161
  int: 最大大内容大小,默认为1MB
162
162
  """
163
- return int(os.getenv('JARVIS_MAX_BIG_CONTENT_SIZE', '163840'))
163
+ return int(os.getenv('JARVIS_MAX_BIG_CONTENT_SIZE', '96000'))
@@ -0,0 +1,122 @@
1
+ # -*- coding: utf-8 -*-
2
+ import os
3
+ from transformers import AutoTokenizer
4
+ from typing import List
5
+ import functools
6
+
7
+ from jarvis.jarvis_utils.output import PrettyOutput, OutputType
8
+ from jarvis.jarvis_utils.config import get_data_dir
9
+
10
+ # 全局缓存,避免重复加载模型
11
+ _global_tokenizers = {}
12
+
13
+ def get_context_token_count(text: str) -> int:
14
+ """使用分词器获取文本的token数量。
15
+
16
+ 参数:
17
+ text: 要计算token的输入文本
18
+
19
+ 返回:
20
+ int: 文本中的token数量
21
+ """
22
+ try:
23
+ tokenizer = load_tokenizer()
24
+ # 分批处理长文本,确保不超过模型最大长度
25
+ total_tokens = 0
26
+ chunk_size = 100 # 每次处理100个字符,避免超过模型最大长度(考虑到中文字符可能被编码成多个token)
27
+ for i in range(0, len(text), chunk_size):
28
+ chunk = text[i:i + chunk_size]
29
+ tokens = tokenizer.encode(chunk) # type: ignore
30
+ total_tokens += len(tokens)
31
+ return total_tokens
32
+ except Exception as e:
33
+ PrettyOutput.print(f"计算token失败: {str(e)}", OutputType.WARNING)
34
+ return len(text) // 4 # 每个token大约4个字符的粗略估计
35
+
36
+ def split_text_into_chunks(text: str, max_length: int = 512, min_length: int = 50) -> List[str]:
37
+ """将文本分割成块,基于token数量进行切割。
38
+
39
+ 参数:
40
+ text: 要分割的输入文本
41
+ max_length: 每个块的最大token数量
42
+ min_length: 每个块的最小token数量(除了最后一块可能较短)
43
+
44
+ 返回:
45
+ List[str]: 文本块列表,每个块的token数量不超过max_length且不小于min_length
46
+ """
47
+ if not text:
48
+ return []
49
+
50
+ try:
51
+ chunks = []
52
+ current_chunk = ""
53
+ current_tokens = 0
54
+
55
+ # 按较大的块处理文本,避免破坏token边界
56
+ chunk_size = 50 # 每次处理50个字符
57
+ for i in range(0, len(text), chunk_size):
58
+ chunk = text[i:i + chunk_size]
59
+ chunk_tokens = get_context_token_count(chunk)
60
+
61
+ # 如果当前块加上新块会超过最大长度,且当前块已经达到最小长度,则保存当前块
62
+ if current_tokens + chunk_tokens > max_length and current_tokens >= min_length:
63
+ chunks.append(current_chunk)
64
+ current_chunk = chunk
65
+ current_tokens = chunk_tokens
66
+ else:
67
+ current_chunk += chunk
68
+ current_tokens += chunk_tokens
69
+
70
+ # 处理最后一个块
71
+ if current_chunk:
72
+ if current_tokens >= min_length:
73
+ chunks.append(current_chunk)
74
+ elif chunks: # 如果最后一个块太短,尝试与前面的块合并
75
+ last_chunk = chunks[-1]
76
+ combined = last_chunk + current_chunk
77
+ combined_tokens = get_context_token_count(combined)
78
+ if combined_tokens <= max_length:
79
+ chunks[-1] = combined
80
+ else:
81
+ chunks.append(current_chunk)
82
+
83
+ return chunks
84
+
85
+ except Exception as e:
86
+ PrettyOutput.print(f"文本分割失败: {str(e)}", OutputType.WARNING)
87
+ # 发生错误时回退到简单的字符分割
88
+ return [text[i:i + max_length] for i in range(0, len(text), max_length)]
89
+
90
+
91
+ @functools.lru_cache(maxsize=1)
92
+ def load_tokenizer() -> AutoTokenizer:
93
+ """
94
+ 加载用于文本处理的分词器,使用缓存避免重复加载。
95
+
96
+ 返回:
97
+ AutoTokenizer: 加载的分词器
98
+ """
99
+ model_name = "gpt2"
100
+ cache_dir = os.path.join(get_data_dir(), "huggingface", "hub")
101
+
102
+ # 检查全局缓存
103
+ if model_name in _global_tokenizers:
104
+ return _global_tokenizers[model_name]
105
+
106
+ try:
107
+ tokenizer = AutoTokenizer.from_pretrained(
108
+ model_name,
109
+ cache_dir=cache_dir,
110
+ local_files_only=True
111
+ )
112
+ except Exception:
113
+ tokenizer = AutoTokenizer.from_pretrained(
114
+ model_name,
115
+ cache_dir=cache_dir,
116
+ local_files_only=False
117
+ )
118
+
119
+ # 保存到全局缓存
120
+ _global_tokenizers[model_name] = tokenizer
121
+
122
+ return tokenizer # type: ignore
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.172
3
+ Version: 0.1.174
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,181 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- import os
3
- from transformers import AutoTokenizer
4
- from typing import List
5
- import functools
6
-
7
- from jarvis.jarvis_utils.output import PrettyOutput, OutputType
8
- from jarvis.jarvis_utils.config import get_data_dir
9
-
10
- # 全局缓存,避免重复加载模型
11
- _global_tokenizers = {}
12
-
13
- def get_context_token_count(text: str) -> int:
14
- """使用分词器获取文本的token数量。
15
-
16
- 参数:
17
- text: 要计算token的输入文本
18
-
19
- 返回:
20
- int: 文本中的token数量
21
- """
22
- try:
23
- # 使用擅长处理通用文本的快速分词器
24
- tokenizer = load_tokenizer()
25
- chunks = split_text_into_chunks(text, 512)
26
- return sum([len(tokenizer.encode(chunk)) for chunk in chunks]) # type: ignore
27
-
28
- except Exception as e:
29
- PrettyOutput.print(f"计算token失败: {str(e)}", OutputType.WARNING)
30
- # 回退到基于字符的粗略估计
31
- return len(text) // 4 # 每个token大约4个字符的粗略估计
32
-
33
- def split_text_into_chunks(text: str, max_length: int = 512, min_length: int = 50) -> List[str]:
34
- """将文本分割成带重叠窗口的块,优化RAG检索效果。
35
-
36
- 参数:
37
- text: 要分割的输入文本
38
- max_length: 每个块的最大长度
39
- min_length: 每个块的最小长度(除了最后一块可能较短)
40
-
41
- 返回:
42
- List[str]: 文本块列表,每个块的长度尽可能接近但不超过max_length
43
- """
44
- if not text:
45
- return []
46
-
47
- # 如果文本长度小于最大长度,直接返回整个文本
48
- if len(text) <= max_length:
49
- return [text]
50
-
51
- # 预处理:规范化文本,移除多余空白字符
52
- text = ' '.join(text.split())
53
-
54
- # 中英文标点符号集合,优化RAG召回的句子边界
55
- primary_punctuation = {'.', '!', '?', '\n', '。', '!', '?'} # 主要句末标点
56
- secondary_punctuation = {';', ':', '…', ';', ':'} # 次级分隔符
57
- tertiary_punctuation = {',', ',', '、', ')', ')', ']', '】', '}', '》', '"', "'"} # 最低优先级
58
-
59
- chunks = []
60
- start = 0
61
-
62
- while start < len(text):
63
- # 初始化结束位置为最大可能长度
64
- end = min(start + max_length, len(text))
65
-
66
- # 只有当不是最后一块且结束位置等于最大长度时,才尝试寻找句子边界
67
- if end < len(text) and end == start + max_length:
68
- # 优先查找段落边界,这对RAG特别重要
69
- paragraph_boundary = text.rfind('\n\n', start, end)
70
- if paragraph_boundary > start and paragraph_boundary < end - min_length: # 确保不会切得太短
71
- end = paragraph_boundary + 2
72
- else:
73
- # 寻找句子边界,从end-1位置开始
74
- found_boundary = False
75
- best_boundary = -1
76
-
77
- # 扩大搜索范围以找到更好的语义边界
78
- search_range = min(120, end - start - min_length) # 扩大搜索范围,但确保新块不小于min_length
79
-
80
- # 先尝试找主要标点(句号等)
81
- for i in range(end-1, max(start, end-search_range), -1):
82
- if text[i] in primary_punctuation:
83
- best_boundary = i
84
- found_boundary = True
85
- break
86
-
87
- # 如果没找到主要标点,再找次要标点(分号、冒号等)
88
- if not found_boundary:
89
- for i in range(end-1, max(start, end-search_range), -1):
90
- if text[i] in secondary_punctuation:
91
- best_boundary = i
92
- found_boundary = True
93
- break
94
-
95
- # 最后考虑逗号和其他可能的边界
96
- if not found_boundary:
97
- for i in range(end-1, max(start, end-search_range), -1):
98
- if text[i] in tertiary_punctuation:
99
- best_boundary = i
100
- found_boundary = True
101
- break
102
-
103
- # 如果找到了合适的边界且不会导致太短的块,使用它
104
- if found_boundary and (best_boundary - start) >= min_length:
105
- end = best_boundary + 1
106
-
107
- # 添加当前块,并确保删除开头和结尾的空白字符
108
- chunk = text[start:end].strip()
109
- if chunk and len(chunk) >= min_length: # 只添加符合最小长度的非空块
110
- chunks.append(chunk)
111
- elif chunk and not chunks: # 如果是第一个块且小于最小长度,也添加它
112
- chunks.append(chunk)
113
- elif chunk: # 如果块太小,尝试与前一个块合并
114
- if chunks:
115
- if len(chunks[-1]) + len(chunk) <= max_length * 1.1: # 允许略微超过最大长度
116
- chunks[-1] = chunks[-1] + " " + chunk
117
- else:
118
- # 如果合并会导致太长,添加这个小块(特殊情况)
119
- chunks.append(chunk)
120
-
121
- # 计算下一块的开始位置,调整重叠窗口大小以提高RAG检索质量
122
- next_start = end - int(max_length * 0.2) # 20%的重叠窗口大小
123
-
124
- # 确保总是有前进,避免无限循环
125
- if next_start <= start:
126
- next_start = start + max(1, min_length // 2)
127
-
128
- start = next_start
129
-
130
- # 最后检查是否有太短的块,尝试合并相邻的短块
131
- if len(chunks) > 1:
132
- merged_chunks = []
133
- i = 0
134
- while i < len(chunks):
135
- current = chunks[i]
136
- # 如果当前块太短且不是最后一个块,尝试与下一个合并
137
- if len(current) < min_length and i < len(chunks) - 1:
138
- next_chunk = chunks[i + 1]
139
- if len(current) + len(next_chunk) <= max_length * 1.1:
140
- merged_chunks.append(current + " " + next_chunk)
141
- i += 2 # 跳过下一个块
142
- continue
143
- merged_chunks.append(current)
144
- i += 1
145
- chunks = merged_chunks
146
-
147
- return chunks
148
-
149
-
150
- @functools.lru_cache(maxsize=1)
151
- def load_tokenizer() -> AutoTokenizer:
152
- """
153
- 加载用于文本处理的分词器,使用缓存避免重复加载。
154
-
155
- 返回:
156
- AutoTokenizer: 加载的分词器
157
- """
158
- model_name = "gpt2"
159
- cache_dir = os.path.join(get_data_dir(), "huggingface", "hub")
160
-
161
- # 检查全局缓存
162
- if model_name in _global_tokenizers:
163
- return _global_tokenizers[model_name]
164
-
165
- try:
166
- tokenizer = AutoTokenizer.from_pretrained(
167
- model_name,
168
- cache_dir=cache_dir,
169
- local_files_only=True
170
- )
171
- except Exception:
172
- tokenizer = AutoTokenizer.from_pretrained(
173
- model_name,
174
- cache_dir=cache_dir,
175
- local_files_only=False
176
- )
177
-
178
- # 保存到全局缓存
179
- _global_tokenizers[model_name] = tokenizer
180
-
181
- return tokenizer # type: ignore