jarvis-ai-assistant 0.1.79__py3-none-any.whl → 0.1.81__py3-none-any.whl

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.

jarvis/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.79"
3
+ __version__ = "0.1.81"
jarvis/agent.py CHANGED
@@ -33,7 +33,7 @@ class Agent:
33
33
 
34
34
  # 从环境变量加载配置
35
35
  self.embedding_dimension = 1536 # Default for many embedding models
36
- self.max_context_length = int(os.getenv('JARVIS_MAX_CONTEXT_LENGTH', '30720')) # 默认30k
36
+ self.max_context_length = int(os.getenv('JARVIS_MAX_CONTEXT_LENGTH', '65536')) # 默认30k
37
37
 
38
38
  # 初始化嵌入模型
39
39
  try:
@@ -195,7 +195,9 @@ class Agent:
195
195
  return {}
196
196
 
197
197
  def _summarize_and_clear_history(self) -> None:
198
- """总结当前对话历史并清空历史记录,只保留系统消息和总结
198
+ """
199
+ [系统消息]
200
+ 总结当前对话历史并清空历史记录,只保留系统消息和总结
199
201
 
200
202
  这个方法会:
201
203
  1. 请求模型总结当前对话的关键信息
@@ -219,7 +221,7 @@ class Agent:
219
221
  """
220
222
 
221
223
  try:
222
- summary = self.model.chat(prompt)
224
+ summary = self.model.chat(self.prompt + "\n" + prompt)
223
225
 
224
226
  # 清空当前对话历史,但保留系统消息
225
227
  self.model.delete_chat()
@@ -341,12 +343,11 @@ class Agent:
341
343
  3. 设定目标:需要可达成,可检验的一个或多个目标
342
344
  4. 生成解决方案:生成一个或者多个具备可操作性的解决方案
343
345
  5. 评估解决方案:从众多解决方案中选择一种最优的方案
344
- 6. 制定行动计划:根据目前可以使用的工具制定行动计划
346
+ 6. 制定行动计划:根据目前可以使用的工具制定行动计划,使用 PlantUML 格式输出明确的执行流程
345
347
  7. 执行行动计划:每步执行一个步骤,最多使用一个工具(工具执行完成后,等待工具结果再执行下一步)
346
348
  8. 监控与调整:如果执行结果与预期不符,则反思并调整行动计划,迭代之前的步骤
347
349
  9. 方法论:如果当前任务具有通用性且执行过程中遇到了值得记录的经验,使用方法论工具记录方法论,以提升后期处理类似问题的能力
348
350
  10. 任务结束:如果任务已经完成,使用任务结束指令结束任务
349
- -------------------------------------------------------------
350
351
 
351
352
  方法论模板:
352
353
  1. 问题重述
@@ -381,13 +382,6 @@ arguments:
381
382
  8. 在多次迭代却没有任何进展时,可请求用户指导
382
383
  9. 如果返回的yaml字符串中包含冒号,请将整个字符串用引号包裹,避免yaml解析错误
383
384
 
384
- -------------------------------------------------------------
385
-
386
- 特殊指令:
387
- 1. !<<SUMMARIZE>>! - 当你发现对话历史过长可能导致token超限时,可以使用此指令总结当前对话要点并清空历史。使用方法:直接回复"!<<SUMMARIZE>>!"即可。
388
-
389
- -------------------------------------------------------------
390
-
391
385
  {methodology_prompt}
392
386
 
393
387
  -------------------------------------------------------------
@@ -405,16 +399,11 @@ arguments:
405
399
 
406
400
  # 如果对话历史长度超过限制,在提示中添加提醒
407
401
  if self.conversation_length > self.max_context_length:
408
- self.prompt = f"{self.prompt}\n(提示:当前对话历史长度已超过{self.max_context_length}字符,建议使用 !<<SUMMARIZE>>! 指令总结对话历史,避免token超限)"
409
-
410
- current_response = self._call_model(self.prompt)
411
- self.conversation_length += len(current_response) # 添加响应长度
412
-
413
- # 检查是否需要总结对话历史
414
- if "!<<SUMMARIZE>>!" in current_response:
415
- self._summarize_and_clear_history()
402
+ current_response = self._summarize_and_clear_history()
416
403
  continue
417
-
404
+ else:
405
+ current_response = self._call_model(self.prompt)
406
+ self.conversation_length += len(current_response) # 添加响应长度
418
407
  try:
419
408
  result = Agent.extract_tool_calls(current_response)
420
409
  except Exception as e:
@@ -19,6 +19,7 @@ class CodeBase:
19
19
  self.root_dir = root_dir
20
20
  os.chdir(self.root_dir)
21
21
  self.thread_count = int(os.environ.get("JARVIS_THREAD_COUNT") or 10)
22
+ self.max_context_length = int(os.getenv("JARVIS_MAX_CONTEXT_LENGTH", 65536))
22
23
 
23
24
  # 初始化数据目录
24
25
  self.data_dir = os.path.join(self.root_dir, ".jarvis-codebase")
@@ -450,7 +451,7 @@ class CodeBase:
450
451
 
451
452
  return initial_results
452
453
 
453
- def search_similar(self, query: str, top_k: int = 20) -> List[Tuple[str, float, str]]:
454
+ def search_similar(self, query: str, top_k: int = 30) -> List[Tuple[str, float, str]]:
454
455
  """搜索相似文件"""
455
456
  model = PlatformRegistry.get_global_platform_registry().get_normal_platform()
456
457
  model.set_suppress_output(True)
@@ -515,7 +516,7 @@ class CodeBase:
515
516
  """
516
517
  for path, _, _ in results:
517
518
  try:
518
- if len(prompt) > 30 * 1024:
519
+ if len(prompt) > self.max_context_length:
519
520
  PrettyOutput.print(f"避免上下文超限,丢弃低相关度文件:{path}", OutputType.WARNING)
520
521
  continue
521
522
  content = open(path, "r", encoding="utf-8").read()
@@ -22,6 +22,8 @@ class JarvisCoder:
22
22
  def __init__(self, root_dir: str, language: str):
23
23
  """初始化代码修改工具"""
24
24
 
25
+ self.max_context_length = int(os.getenv("JARVIS_MAX_CONTEXT_LENGTH", 65536))
26
+
25
27
 
26
28
  self.root_dir = find_git_root(root_dir)
27
29
  if not self.root_dir:
@@ -154,7 +156,7 @@ class JarvisCoder:
154
156
  文件列表如下:
155
157
  """
156
158
  for i, file in enumerate(related_files):
157
- if len(prompt) > 30 * 1024:
159
+ if len(prompt) > self.max_context_length:
158
160
  PrettyOutput.print(f'避免上下文超限,丢弃低相关度文件:{file["file_path"]}', OutputType.WARNING)
159
161
  continue
160
162
  prompt += f"""{i}. {file["file_path"]}\n"""
File without changes
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env python3
2
+ import argparse
3
+ import os
4
+ import sys
5
+ import readline
6
+ from typing import Optional
7
+
8
+ from jarvis.models.registry import PlatformRegistry
9
+ from jarvis.utils import PrettyOutput, OutputType, load_env_from_file
10
+
11
+ def execute_command(command: str) -> None:
12
+ """显示命令并允许用户编辑,回车执行,Ctrl+C取消"""
13
+ try:
14
+ print("生成的命令 (可以编辑,回车执行,Ctrl+C取消):")
15
+ # 预填充输入行
16
+ readline.set_startup_hook(lambda: readline.insert_text(command))
17
+ try:
18
+ edited_command = input("> ")
19
+ if edited_command.strip(): # 确保命令不为空
20
+ os.system(edited_command)
21
+ except KeyboardInterrupt:
22
+ print("\n已取消执行")
23
+ finally:
24
+ readline.set_startup_hook() # 清除预填充
25
+ except Exception as e:
26
+ PrettyOutput.print(f"执行命令时发生错误: {str(e)}", OutputType.ERROR)
27
+
28
+ def process_request(request: str) -> Optional[str]:
29
+ """处理用户请求并返回对应的shell命令
30
+
31
+ Args:
32
+ request: 用户的自然语言请求
33
+
34
+ Returns:
35
+ Optional[str]: 对应的shell命令,如果处理失败则返回None
36
+ """
37
+ try:
38
+ # 获取语言模型实例
39
+ PlatformRegistry.suppress_output = True
40
+ model = PlatformRegistry.get_global_platform_registry().get_normal_platform()
41
+ model.set_suppress_output(True)
42
+
43
+ shell = os.environ.get("SHELL") or "bash"
44
+ current_path = os.getcwd()
45
+
46
+ # 设置系统提示
47
+ system_message = f"""你是一个 shell 命令生成助手。
48
+
49
+ 你的唯一任务是将用户的自然语言需求转换为对应的shell命令。
50
+
51
+ 严格要求:
52
+ 1. 只返回shell命令本身
53
+ 2. 不要添加任何标记(如```、/**/、//等)
54
+ 3. 不要添加任何解释或说明
55
+ 4. 不要添加任何换行或额外空格
56
+ 5. 如果需要多个命令,使用 && 连接
57
+
58
+ 安全要求:
59
+ - 生成的命令必须是安全的,不能包含危险操作
60
+ - 如果需要sudo权限,要明确提示用户
61
+ - 对于复杂操作,优先使用管道而不是临时文件
62
+ - 确保命令的可移植性,优先使用通用的POSIX命令
63
+
64
+ 示例输入:
65
+ "查找当前目录下的所有Python文件"
66
+
67
+ 示例输出:
68
+ find . -name "*.py"
69
+
70
+ 记住:只返回命令本身,不要有任何额外的内容。
71
+ """
72
+ model.set_system_message(system_message)
73
+
74
+ prefix = f"当前路径: {current_path}\n"
75
+ prefix += f"当前shell: {shell}\n"
76
+
77
+ # 处理请求
78
+ result = model.chat(prefix + request)
79
+
80
+ # 提取命令 - 简化处理逻辑,因为现在应该只返回纯命令
81
+ if result and isinstance(result, str):
82
+ return result.strip()
83
+
84
+ return None
85
+
86
+ except Exception as e:
87
+ PrettyOutput.print(f"处理请求时发生错误: {str(e)}", OutputType.ERROR)
88
+ return None
89
+
90
+ def main():
91
+ # 创建参数解析器
92
+ load_env_from_file()
93
+ parser = argparse.ArgumentParser(
94
+ description="将自然语言需求转换为shell命令",
95
+ formatter_class=argparse.RawDescriptionHelpFormatter,
96
+ epilog="""
97
+ 示例:
98
+ %(prog)s "查找当前目录下所有的Python文件"
99
+ %(prog)s "压缩所有jpg图片"
100
+ %(prog)s "查找最近一周修改过的文档"
101
+ """)
102
+
103
+ # 添加参数
104
+ parser.add_argument(
105
+ "request",
106
+ help="用自然语言描述你需要执行的操作"
107
+ )
108
+
109
+ # 解析参数
110
+ args = parser.parse_args()
111
+
112
+ # 处理请求
113
+ command = process_request(args.request)
114
+
115
+ # 输出结果
116
+ if command:
117
+ execute_command(command) # 显示并执行命令
118
+ return 0
119
+ else:
120
+ return 1
121
+
122
+ if __name__ == "__main__":
123
+ sys.exit(main())
jarvis/models/registry.py CHANGED
@@ -19,6 +19,7 @@ class PlatformRegistry:
19
19
 
20
20
  global_platform_name = "kimi"
21
21
  global_platform_registry = None
22
+ suppress_output = False
22
23
 
23
24
  @staticmethod
24
25
  def get_platform_dir() -> str:
@@ -121,7 +122,8 @@ class PlatformRegistry:
121
122
  # 检查平台实现
122
123
  if not PlatformRegistry.check_platform_implementation(obj):
123
124
  continue
124
- PrettyOutput.print(f"从 {os.path.join(directory, filename)} 加载平台:{obj.platform_name}", OutputType.SUCCESS)
125
+ if not PlatformRegistry.suppress_output:
126
+ PrettyOutput.print(f"从 {os.path.join(directory, filename)} 加载平台:{obj.platform_name}", OutputType.SUCCESS)
125
127
  platforms[obj.platform_name] = obj
126
128
  break
127
129
  except Exception as e:
jarvis/tools/registry.py CHANGED
@@ -19,7 +19,7 @@ class ToolRegistry:
19
19
  # 加载内置工具和外部工具
20
20
  self._load_builtin_tools()
21
21
  self._load_external_tools()
22
- self.max_context_length = int(os.getenv('JARVIS_MAX_CONTEXT_LENGTH', '30720')) # 默认30k
22
+ self.max_context_length = int(os.getenv('JARVIS_MAX_CONTEXT_LENGTH', '65536')) # 默认30k
23
23
 
24
24
  @staticmethod
25
25
  def get_global_tool_registry():
@@ -184,7 +184,7 @@ class ToolRegistry:
184
184
  # 如果输出超过30k,只取最后30k字符
185
185
  if len(output) > self.max_context_length:
186
186
  output_to_summarize = output[-self.max_context_length:]
187
- truncation_notice = "\n(注意: 由于输出过长,仅总结最后30720字符)"
187
+ truncation_notice = "\n(注意: 由于输出过长,仅总结最后65536字符)"
188
188
  else:
189
189
  output_to_summarize = output
190
190
  truncation_notice = ""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.79
3
+ Version: 0.1.81
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,20 +1,22 @@
1
- jarvis/__init__.py,sha256=yQPvXJ5FcieZn0Nq0nfH3oQgif5UqP0crtfwedPm4v8,50
2
- jarvis/agent.py,sha256=zFhEZDCly5JlezHOhWcwdE8WpYQ3fkyuqXv5Qq5wuDE,20032
1
+ jarvis/__init__.py,sha256=B8CWgNiQrlCsbghyy-YN5DH1HNMJhUoKmyegydchC2w,50
2
+ jarvis/agent.py,sha256=9cWBHjxrlqnI1GV3wB4wPvZUwK7d63ysyX40zqapNRc,19373
3
3
  jarvis/main.py,sha256=OJc7e5i988eQLByT7SzX7eoa0HKm4LMg814gZv9hBX8,5487
4
4
  jarvis/utils.py,sha256=jvo6ylvrTaSmXWcYY0qTTf14TwCkAhPsCUuIl5WHEuw,8640
5
5
  jarvis/jarvis_codebase/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- jarvis/jarvis_codebase/main.py,sha256=DPMPw8qoKHooydELKwf_bXPa0a3459kdFcZOXdrM-N8,24785
6
+ jarvis/jarvis_codebase/main.py,sha256=z6HRTkUjAhRQclfHqj4yt3wq_wxiRlp0OCJsL_99NfI,24884
7
7
  jarvis/jarvis_coder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- jarvis/jarvis_coder/main.py,sha256=Hr6T5LHC5n08s9tnOt-2_h8TmzothBUhqcd2-fzwuVI,23790
8
+ jarvis/jarvis_coder/main.py,sha256=WZCjtlPDEvg2y6F6e4djc4xYWXM3eB_0pHrPpvlZEC4,23890
9
+ jarvis/jarvis_rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ jarvis/jarvis_rag/main.py,sha256=drCH9KmwQozxtPICIfTFXmkIhwN8WDreMOCTxtj9SPc,20842
11
+ jarvis/jarvis_smart_shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ jarvis/jarvis_smart_shell/main.py,sha256=QgR1CZRcTVfC8a5hMso3onH3pFdDoniRjr0YQvY2jXQ,3809
9
13
  jarvis/models/__init__.py,sha256=mrOt67nselz_H1gX9wdAO4y2DY5WPXzABqJbr5Des8k,63
10
14
  jarvis/models/ai8.py,sha256=vgy-r_3HHxGMAalZrA65VWHC1PuwBTYgtprSgHkCbrk,12557
11
15
  jarvis/models/base.py,sha256=ShV1H8Unee4RMaiFO4idROQA0Hc6wu4dyeRPX5fcszk,1433
12
16
  jarvis/models/kimi.py,sha256=1iTB0Z_WOmCML3Ufsge6jmeKOYvccr7I5lS3JUXymU4,17611
13
17
  jarvis/models/openai.py,sha256=ayaBWAN5VexMcKVrjEPDNB-Q9wx0sCV9Z4BCrvwYJ9w,4315
14
18
  jarvis/models/oyi.py,sha256=X2c5SWDIuQDCCFBcEKbzIWEz3I34eOAi0d1XAFgxlpw,15001
15
- jarvis/models/registry.py,sha256=Ez3MNCYIlvPxRS5rJrgV7b8BkXtaZ75bCkemPr3L9nw,8156
16
- jarvis/rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- jarvis/rag/main.py,sha256=drCH9KmwQozxtPICIfTFXmkIhwN8WDreMOCTxtj9SPc,20842
19
+ jarvis/models/registry.py,sha256=Lt8IdVBAEx_CCFtfZJPgw3nxSEjfFcqI47I-U64kIbg,8257
18
20
  jarvis/tools/__init__.py,sha256=7Rqyj5hBAv5cWDVr5T9ZTZASO7ssBHeQNm2_4ZARdkA,72
19
21
  jarvis/tools/ask_user.py,sha256=xLXkYK3_f8EJ7kudA8MumOOCxyFl6z3DBS_zcscMH6Y,2151
20
22
  jarvis/tools/base.py,sha256=EGRGbdfbLXDLwtyoWdvp9rlxNX7bzc20t0Vc2VkwIEY,652
@@ -24,14 +26,14 @@ jarvis/tools/coder.py,sha256=kmotT2Klsug44S51QoSW9DzkxLzcF-XonyYAEoWZV6c,2295
24
26
  jarvis/tools/file_ops.py,sha256=h8g0eT9UvlJf4kt0DLXvdSsjcPj7x19lxWdDApeDfpg,3842
25
27
  jarvis/tools/generator.py,sha256=S1DhHBfhNvF6SrORnlk8Mz210yDiJPuxbfswbX_UACs,5791
26
28
  jarvis/tools/methodology.py,sha256=UG6s5VYRcd9wrKX4cg6f7zJhet5AIcthFGMOAdevBiw,5175
27
- jarvis/tools/registry.py,sha256=XhFufp57hJZkRj6MUC5m-q4WEHFp8hzGmW2zFIzk12w,9074
29
+ jarvis/tools/registry.py,sha256=sgj5EVbRgfHSzXW5v-kbIZS_8cwAxTjHvSPAicxBRf4,9074
28
30
  jarvis/tools/search.py,sha256=c9dXtyICdl8Lm8shNPNyIx9k67uY0rMF8xnIKu2RsnE,8787
29
31
  jarvis/tools/shell.py,sha256=UPKshPyOaUwTngresUw-ot1jHjQIb4wCY5nkJqa38lU,2520
30
32
  jarvis/tools/sub_agent.py,sha256=rEtAmSVY2ZjFOZEKr5m5wpACOQIiM9Zr_3dT92FhXYU,2621
31
33
  jarvis/tools/webpage.py,sha256=d3w3Jcjcu1ESciezTkz3n3Zf-rp_l91PrVoDEZnckOo,2391
32
- jarvis_ai_assistant-0.1.79.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
33
- jarvis_ai_assistant-0.1.79.dist-info/METADATA,sha256=rDiEYIVxK5o0hf9DBaTNURWMzrGyBOTlbXhu33S4Z-g,12736
34
- jarvis_ai_assistant-0.1.79.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
35
- jarvis_ai_assistant-0.1.79.dist-info/entry_points.txt,sha256=iEvZ0rn-muMxWCNH5QEvw_mTTy_EVhyQyxDxWXqQQVo,174
36
- jarvis_ai_assistant-0.1.79.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
37
- jarvis_ai_assistant-0.1.79.dist-info/RECORD,,
34
+ jarvis_ai_assistant-0.1.81.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
35
+ jarvis_ai_assistant-0.1.81.dist-info/METADATA,sha256=kVZXWoV6abWKNXWGuVA5Q0jodwrVDIgATc2jJEVhq6o,12736
36
+ jarvis_ai_assistant-0.1.81.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
37
+ jarvis_ai_assistant-0.1.81.dist-info/entry_points.txt,sha256=sdmIO86MrIUepJTGyHs0i_Ho9VGf1q9YRP4RgQvGWcI,280
38
+ jarvis_ai_assistant-0.1.81.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
39
+ jarvis_ai_assistant-0.1.81.dist-info/RECORD,,
@@ -2,4 +2,6 @@
2
2
  jarvis = jarvis.main:main
3
3
  jarvis-codebase = jarvis.jarvis_codebase.main:main
4
4
  jarvis-coder = jarvis.jarvis_coder.main:main
5
- jarvis-rag = jarvis.rag.main:main
5
+ jarvis-rag = jarvis.jarvis_rag.main:main
6
+ jarvis-smart-shell = jarvis.jarvis_smart_shell.main:main
7
+ jss = jarvis.jarvis_smart_shell.main:main
File without changes
File without changes