jarvis-ai-assistant 0.1.91__py3-none-any.whl → 0.1.93__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/tools/thinker.py CHANGED
@@ -17,11 +17,10 @@ class ThinkerTool:
17
17
  "description": "问题相关的上下文信息或背景知识",
18
18
  "default": ""
19
19
  },
20
- "approach": {
20
+ "goal": {
21
21
  "type": "string",
22
- "enum": ["chain_of_thought", "tree_of_thought", "step_by_step"],
23
- "description": "思考方式:chain_of_thought(思维链)、tree_of_thought(思维树)、step_by_step(步骤分解)",
24
- "default": "chain_of_thought"
22
+ "description": "期望达成的具体目标或结果",
23
+ "default": ""
25
24
  }
26
25
  },
27
26
  "required": ["question"]
@@ -31,89 +30,36 @@ class ThinkerTool:
31
30
  """初始化思考工具"""
32
31
  self.model = PlatformRegistry.get_global_platform_registry().get_thinking_platform()
33
32
 
34
- def _generate_prompt(self, question: str, context: str, approach: str) -> str:
33
+ def _generate_prompt(self, question: str, context: str, goal: str) -> str:
35
34
  """生成提示词
36
35
 
37
36
  Args:
38
37
  question: 问题
39
38
  context: 上下文
40
- approach: 思考方式
39
+ goal: 期望目标
41
40
 
42
41
  Returns:
43
42
  str: 完整的提示词
44
43
  """
45
44
  # 基础提示词
46
- base_prompt = "你是一个擅长深度思考和逻辑推理的助手。"
47
-
48
- # 根据不同的思考方式添加具体指导
49
- approach_prompts = {
50
- "chain_of_thought": """请使用思维链方式分析问题:
51
- 1. 仔细阅读问题和上下文
52
- 2. 逐步推理,每一步都要说明推理依据
53
- 3. 考虑多个可能的角度
54
- 4. 得出最终结论
55
-
56
- 请按以下格式输出:
57
- 思考过程:
58
- 1. [第一步推理]
59
- 2. [第二步推理]
60
- ...
61
-
62
- 结论:
63
- [最终结论]""",
64
-
65
- "tree_of_thought": """请使用思维树方式分析问题:
66
- 1. 将问题分解为多个子问题
67
- 2. 对每个子问题进行分支探索
68
- 3. 评估每个分支的可行性
69
- 4. 整合最优路径
70
-
71
- 请按以下格式输出:
72
- 问题分解:
73
- - 子问题1
74
- - 分支1.1
75
- - 分支1.2
76
- - 子问题2
77
- - 分支2.1
78
- - 分支2.2
79
-
80
- 分析过程:
81
- [详细分析每个分支]
82
-
83
- 最优路径:
84
- [说明选择原因]
85
-
86
- 结论:
87
- [最终结论]""",
45
+ prompt = f"""你是一个擅长深度思考和逻辑推理的助手。请帮助分析问题并给出解决方案。
88
46
 
89
- "step_by_step": """请使用步骤分解方式分析问题:
90
- 1. 将问题分解为具体步骤
91
- 2. 详细说明每个步骤的执行方法
92
- 3. 考虑每个步骤可能的问题
93
- 4. 提供完整的解决方案
94
-
95
- 请按以下格式输出:
96
- 步骤分解:
97
- 步骤1: [具体内容]
98
- 步骤2: [具体内容]
99
- ...
100
-
101
- 执行分析:
102
- [详细分析每个步骤]
103
-
104
- 解决方案:
105
- [完整方案]"""
106
- }
107
-
108
- # 构建完整提示词
109
- prompt = f"""{base_prompt}
110
-
111
- {approach_prompts[approach]}
47
+ 请按以下方式思考:
48
+ 1. 仔细理解问题和目标
49
+ 2. 进行系统性分析和推理
50
+ 3. 考虑多个可能的解决方案
51
+ 4. 给出最佳建议和具体行动步骤
112
52
 
113
53
  问题:
114
54
  {question}
115
-
116
55
  """
56
+ # 如果有目标,添加到提示词中
57
+ if goal:
58
+ prompt += f"""
59
+ 期望目标:
60
+ {goal}
61
+ """
62
+
117
63
  # 如果有上下文,添加到提示词中
118
64
  if context:
119
65
  prompt += f"""
@@ -131,7 +77,7 @@ class ThinkerTool:
131
77
  args: 包含参数的字典
132
78
  - question: 问题
133
79
  - context: 上下文(可选)
134
- - approach: 思考方式(可选)
80
+ - goal: 期望目标(可选)
135
81
 
136
82
  Returns:
137
83
  Dict[str, Any]: 执行结果
@@ -140,16 +86,17 @@ class ThinkerTool:
140
86
  # 获取参数
141
87
  question = args["question"]
142
88
  context = args.get("context", "")
143
- approach = args.get("approach", "chain_of_thought")
89
+ goal = args.get("goal", "")
144
90
 
145
91
  # 生成提示词
146
- prompt = self._generate_prompt(question, context, approach)
92
+ prompt = self._generate_prompt(question, context, goal)
147
93
 
148
94
  # 记录开始分析
149
95
  PrettyOutput.print(f"开始分析问题: {question}", OutputType.INFO)
150
96
  if context:
151
97
  PrettyOutput.print("包含上下文信息", OutputType.INFO)
152
- PrettyOutput.print(f"使用{approach}方式思考", OutputType.INFO)
98
+ if goal:
99
+ PrettyOutput.print(f"目标: {goal}", OutputType.INFO)
153
100
 
154
101
  # 调用模型进行分析
155
102
  response = self.model.chat(prompt)
@@ -182,15 +129,14 @@ def main():
182
129
  parser = argparse.ArgumentParser(description='深度思考分析工具')
183
130
  parser.add_argument('--question', required=True, help='需要分析的问题')
184
131
  parser.add_argument('--context', help='问题相关的上下文信息')
185
- parser.add_argument('--approach', choices=['chain_of_thought', 'tree_of_thought', 'step_by_step'],
186
- default='chain_of_thought', help='思考方式')
132
+ parser.add_argument('--goal', help='期望达成的具体目标或结果')
187
133
  args = parser.parse_args()
188
134
 
189
135
  tool = ThinkerTool()
190
136
  result = tool.execute({
191
137
  "question": args.question,
192
138
  "context": args.context,
193
- "approach": args.approach
139
+ "goal": args.goal
194
140
  })
195
141
 
196
142
  if result["success"]:
jarvis/utils.py CHANGED
@@ -1,3 +1,5 @@
1
+ from ast import List, Str
2
+ import hashlib
1
3
  from pathlib import Path
2
4
  import sys
3
5
  import time
@@ -16,6 +18,9 @@ import torch
16
18
  # 初始化colorama
17
19
  colorama.init()
18
20
 
21
+ os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
22
+ os.environ["TOKENIZERS_PARALLELISM"] = "false"
23
+
19
24
  class OutputType(Enum):
20
25
  SYSTEM = "system" # AI助手消息
21
26
  CODE = "code" # 代码相关
@@ -212,7 +217,6 @@ def find_git_root(dir="."):
212
217
  return ret
213
218
 
214
219
  def load_embedding_model():
215
- os.environ["TOKENIZERS_PARALLELISM"] = "false"
216
220
  model_name = "BAAI/bge-large-zh-v1.5"
217
221
  PrettyOutput.print(f"正在加载嵌入模型: {model_name}...", OutputType.INFO)
218
222
  try:
@@ -275,5 +279,29 @@ def load_rerank_model():
275
279
  def get_max_context_length():
276
280
  return int(os.getenv('JARVIS_MAX_CONTEXT_LENGTH', '131072')) # 默认128k
277
281
 
282
+ def is_long_context(files: list) -> bool:
283
+ """检测文件列表是否属于长上下文(总字符数超过最大上下文长度的80%)"""
284
+ max_length = get_max_context_length()
285
+ threshold = max_length * 0.8
286
+ total_chars = 0
287
+
288
+ for file_path in files:
289
+ try:
290
+ with open(file_path, 'r', encoding='utf-8') as f:
291
+ content = f.read()
292
+ total_chars += len(content)
293
+
294
+ # 提前终止检查如果已经超过阈值
295
+ if total_chars > threshold:
296
+ return True
297
+ except Exception as e:
298
+ PrettyOutput.print(f"无法读取文件 {file_path}: {e}", OutputType.WARNING)
299
+ continue
300
+
301
+ return total_chars > threshold
302
+
278
303
  def get_thread_count():
279
- return int(os.getenv('JARVIS_THREAD_COUNT', '1'))
304
+ return int(os.getenv('JARVIS_THREAD_COUNT', '1'))
305
+
306
+ def get_file_md5(filepath: str)->str:
307
+ return hashlib.md5(open(filepath, "rb").read(100*1024*1024)).hexdigest()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.91
3
+ Version: 0.1.93
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
@@ -53,6 +53,8 @@ Requires-Dist: PyMuPDF>=1.21.0
53
53
  Requires-Dist: python-docx>=0.8.11
54
54
  Requires-Dist: tiktoken>=0.3.0
55
55
  Requires-Dist: tqdm>=4.65.0
56
+ Requires-Dist: docx>=0.2.4
57
+ Requires-Dist: yaspin>=2.5.0
56
58
  Provides-Extra: dev
57
59
  Requires-Dist: pytest; extra == "dev"
58
60
  Requires-Dist: black; extra == "dev"
@@ -0,0 +1,47 @@
1
+ jarvis/__init__.py,sha256=f8113pl4O0dw4MOgNk0fK63GV0FVrx2v-G0-w75BjWc,50
2
+ jarvis/agent.py,sha256=vjWR-bIyac7nL3qMUOhastXMdT9PqufwRjT-h_hAnk0,19403
3
+ jarvis/main.py,sha256=kHvlVDmjznWvXugl56M4HRb1Uedkn8lKsMEKr8tNy1Q,5824
4
+ jarvis/utils.py,sha256=gIpS62j9cbKndvXQ7E36RQCaNOgl5bl2PRPcpiZZvew,11292
5
+ jarvis/jarvis_codebase/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ jarvis/jarvis_codebase/main.py,sha256=li3ccKSs4RwQw8EK35RssC3IHDg1PjEji0pNCC-HMtE,29885
7
+ jarvis/jarvis_coder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ jarvis/jarvis_coder/git_utils.py,sha256=u5mUe_R3JDJthDoamlNOkrN3bJKf-47pf8YqCvtmYK4,2284
9
+ jarvis/jarvis_coder/main.py,sha256=ZgmASwDsRLUx8_E_9Cnr2n_pXnyp-lHWAA1IGHwsfb8,25294
10
+ jarvis/jarvis_coder/patch_handler.py,sha256=OsAt-hCz49eoRgUW0c2hGf9Bcq_i5JrkCWaUtg4WWiw,21500
11
+ jarvis/jarvis_coder/plan_generator.py,sha256=xtiYEE-RhexBWamBnsat_pUyzzc4IdP5PCI6p8wyqLE,2845
12
+ jarvis/jarvis_platform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ jarvis/jarvis_platform/main.py,sha256=uOv5TlxKVWO_lD2mnB7KAILkqCbezhOwiJ6g_CRQBlU,4868
14
+ jarvis/jarvis_rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ jarvis/jarvis_rag/main.py,sha256=Gu8llgtBaRTg7sKMB-3pRLb0Tjs1ee_mbZLOku0kDPk,32752
16
+ jarvis/jarvis_smart_shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ jarvis/jarvis_smart_shell/main.py,sha256=wqTbbXMaM3X6YIdOtNVF6B3Ua7fxu0XTeXBR7lfdWg0,3812
18
+ jarvis/models/__init__.py,sha256=mrOt67nselz_H1gX9wdAO4y2DY5WPXzABqJbr5Des8k,63
19
+ jarvis/models/ai8.py,sha256=ARzNIg7v7-Vy5TtHHmTGV3Fn8rXbNxKw2pe_BylyADE,11887
20
+ jarvis/models/base.py,sha256=qIpO32lejPhaZk5T3VIua3td4gEguXMaeFER5kXYwLY,1782
21
+ jarvis/models/kimi.py,sha256=cB1tC_ifdTAZUEqndzNTIcgHWi4w4tM8zdzSOcDhOrQ,16348
22
+ jarvis/models/ollama.py,sha256=fLVGGBfE5S_sFDiQ1ZC6-Oz9AY6EMnRqvILLi7lP-gw,5603
23
+ jarvis/models/openai.py,sha256=XdBsWRwlJgUwsqasux0IhUHhjo4UGZt0eg7xFQVNZhY,4400
24
+ jarvis/models/oyi.py,sha256=ZMyX2WMHC_HG0mGCtTyJwfiARQmlLKtgOfpNP5YX0DI,14463
25
+ jarvis/models/registry.py,sha256=SDnrNzf0wQi8mb7qbu4ZNfYIy5vhz1CxmVL3Ru-VATk,8797
26
+ jarvis/tools/__init__.py,sha256=7Rqyj5hBAv5cWDVr5T9ZTZASO7ssBHeQNm2_4ZARdkA,72
27
+ jarvis/tools/ask_user.py,sha256=naLLVYKKMSVkQSExvnyZbL9FHwFrpTqEQjlBFcJadp8,1865
28
+ jarvis/tools/base.py,sha256=EGRGbdfbLXDLwtyoWdvp9rlxNX7bzc20t0Vc2VkwIEY,652
29
+ jarvis/tools/chdir.py,sha256=TjfPbX8yvNKgUNJEMXh3ZlVDEIse_Fo8xMoVsiK7_dA,2688
30
+ jarvis/tools/codebase_qa.py,sha256=Lk8EXkin45RKUsp5C_UHm6jADBhyCT-xsYubwJ1hSiE,2403
31
+ jarvis/tools/coder.py,sha256=ws25Vni7Q_fKxSNyQLapqlcjlpP9jkavgJRIv78ATww,2315
32
+ jarvis/tools/file_ops.py,sha256=h8g0eT9UvlJf4kt0DLXvdSsjcPj7x19lxWdDApeDfpg,3842
33
+ jarvis/tools/generator.py,sha256=TB1zcw_JmRL2W9w6L4IxtrLF3gjnNw5Jj2Zrowj0eSg,5763
34
+ jarvis/tools/methodology.py,sha256=UG6s5VYRcd9wrKX4cg6f7zJhet5AIcthFGMOAdevBiw,5175
35
+ jarvis/tools/rag.py,sha256=tJzuhHaTrujVXCBgmyMqSynVF0UFsIJeRTG0Y_Tt964,4483
36
+ jarvis/tools/registry.py,sha256=AbADf8pcjHqfNoQNJkWqEuVg6zHRdryhJyDQ5w4O2sc,9177
37
+ jarvis/tools/search.py,sha256=c9dXtyICdl8Lm8shNPNyIx9k67uY0rMF8xnIKu2RsnE,8787
38
+ jarvis/tools/shell.py,sha256=UPKshPyOaUwTngresUw-ot1jHjQIb4wCY5nkJqa38lU,2520
39
+ jarvis/tools/sub_agent.py,sha256=rEtAmSVY2ZjFOZEKr5m5wpACOQIiM9Zr_3dT92FhXYU,2621
40
+ jarvis/tools/thinker.py,sha256=yjY-JMf-Vp_UZdBNa7auvFZl8Wohcu1AqqNO2GSel-w,4598
41
+ jarvis/tools/webpage.py,sha256=d3w3Jcjcu1ESciezTkz3n3Zf-rp_l91PrVoDEZnckOo,2391
42
+ jarvis_ai_assistant-0.1.93.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
43
+ jarvis_ai_assistant-0.1.93.dist-info/METADATA,sha256=9Xodq2q2pIZAi9fGA48lhjOgttGzDQafYVtK7OURt9c,12766
44
+ jarvis_ai_assistant-0.1.93.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
45
+ jarvis_ai_assistant-0.1.93.dist-info/entry_points.txt,sha256=1D14s9v6rwpNzVD0muwe0tCKffJDEvLRBlEShbSFSbQ,331
46
+ jarvis_ai_assistant-0.1.93.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
47
+ jarvis_ai_assistant-0.1.93.dist-info/RECORD,,
@@ -1,6 +1,7 @@
1
1
  [console_scripts]
2
2
  jarvis = jarvis.main:main
3
3
  jarvis-codebase = jarvis.jarvis_codebase.main:main
4
+ jarvis-coder = jarvis.jarvis_coder.main:main
4
5
  jarvis-platform = jarvis.jarvis_platform.main:main
5
6
  jarvis-rag = jarvis.jarvis_rag.main:main
6
7
  jarvis-smart-shell = jarvis.jarvis_smart_shell.main:main
@@ -1,41 +0,0 @@
1
- jarvis/__init__.py,sha256=3Ab7ipGCmdagjBEJ81C-I_xiKdsal6hFcitNVQKYwt4,50
2
- jarvis/agent.py,sha256=82F6n8YKOaLaHp40eljZLfV-Ad4RktB8s-1c8X8-LGU,19128
3
- jarvis/main.py,sha256=72od8757A3bhe0ncE38S7u-YZsAh0y50w9ozMhgqIU8,5423
4
- jarvis/utils.py,sha256=Maqu93-rixR-_rjvoBCocCH6XiB1ol1Xozj1eMjNjE0,10308
5
- jarvis/jarvis_codebase/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- jarvis/jarvis_codebase/main.py,sha256=hbFYetHZOKSU0HBbKUU8Vu4o3m25nufvBnHGI8OxT6g,26503
7
- jarvis/jarvis_platform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- jarvis/jarvis_platform/main.py,sha256=V-gJQdfHihtrZD6WIYbVAQSDmtrf0PFVndZ7jPrlGZg,4277
9
- jarvis/jarvis_rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- jarvis/jarvis_rag/main.py,sha256=ZzNnU0KhAiz64kMmHd5BSBhImieXYbcfgRT-s-PiP2Y,26415
11
- jarvis/jarvis_smart_shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- jarvis/jarvis_smart_shell/main.py,sha256=4BKXMIz7zGATC_4K47UQxHh7sHPH4K2dqj4RSIH9t4Y,3552
13
- jarvis/models/__init__.py,sha256=mrOt67nselz_H1gX9wdAO4y2DY5WPXzABqJbr5Des8k,63
14
- jarvis/models/ai8.py,sha256=ejMUAf614wBgmsYPkcWrCzONBcIAP4pUTy4b9hrolJY,11830
15
- jarvis/models/base.py,sha256=qIpO32lejPhaZk5T3VIua3td4gEguXMaeFER5kXYwLY,1782
16
- jarvis/models/kimi.py,sha256=cB1tC_ifdTAZUEqndzNTIcgHWi4w4tM8zdzSOcDhOrQ,16348
17
- jarvis/models/ollama.py,sha256=3Mb9ukwKk_HFfYp5dU0Zao5aa9AH_cTJoYhwHJt3MOo,5626
18
- jarvis/models/openai.py,sha256=W1FmaNnFSxeu-4qFQcuop5xeb-zh8-x6E-D56hMaVuA,4370
19
- jarvis/models/oyi.py,sha256=IWsrReLmphm-UMzxXcbAoiWP6w1fJRP3iQTlyDpSyg8,14491
20
- jarvis/models/registry.py,sha256=SDnrNzf0wQi8mb7qbu4ZNfYIy5vhz1CxmVL3Ru-VATk,8797
21
- jarvis/tools/__init__.py,sha256=7Rqyj5hBAv5cWDVr5T9ZTZASO7ssBHeQNm2_4ZARdkA,72
22
- jarvis/tools/ask_user.py,sha256=KNRaiBlAqqAZ0uUkq_l7AKi-y9ZCLE83uLtTdd-UM0o,1919
23
- jarvis/tools/base.py,sha256=EGRGbdfbLXDLwtyoWdvp9rlxNX7bzc20t0Vc2VkwIEY,652
24
- jarvis/tools/chdir.py,sha256=TjfPbX8yvNKgUNJEMXh3ZlVDEIse_Fo8xMoVsiK7_dA,2688
25
- jarvis/tools/codebase_qa.py,sha256=Lk8EXkin45RKUsp5C_UHm6jADBhyCT-xsYubwJ1hSiE,2403
26
- jarvis/tools/file_ops.py,sha256=h8g0eT9UvlJf4kt0DLXvdSsjcPj7x19lxWdDApeDfpg,3842
27
- jarvis/tools/generator.py,sha256=TB1zcw_JmRL2W9w6L4IxtrLF3gjnNw5Jj2Zrowj0eSg,5763
28
- jarvis/tools/methodology.py,sha256=UG6s5VYRcd9wrKX4cg6f7zJhet5AIcthFGMOAdevBiw,5175
29
- jarvis/tools/rag.py,sha256=tJzuhHaTrujVXCBgmyMqSynVF0UFsIJeRTG0Y_Tt964,4483
30
- jarvis/tools/registry.py,sha256=AbADf8pcjHqfNoQNJkWqEuVg6zHRdryhJyDQ5w4O2sc,9177
31
- jarvis/tools/search.py,sha256=c9dXtyICdl8Lm8shNPNyIx9k67uY0rMF8xnIKu2RsnE,8787
32
- jarvis/tools/shell.py,sha256=UPKshPyOaUwTngresUw-ot1jHjQIb4wCY5nkJqa38lU,2520
33
- jarvis/tools/sub_agent.py,sha256=rEtAmSVY2ZjFOZEKr5m5wpACOQIiM9Zr_3dT92FhXYU,2621
34
- jarvis/tools/thinker.py,sha256=Zv1v4Mp7R08w5p3e2iv5X4UWQstgAMyRD9huE-b-ZS0,5938
35
- jarvis/tools/webpage.py,sha256=d3w3Jcjcu1ESciezTkz3n3Zf-rp_l91PrVoDEZnckOo,2391
36
- jarvis_ai_assistant-0.1.91.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
37
- jarvis_ai_assistant-0.1.91.dist-info/METADATA,sha256=ahfOtRplwS5KpK_gh3_YP2WzfbRsc3wi5D8GaSvAUps,12710
38
- jarvis_ai_assistant-0.1.91.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
39
- jarvis_ai_assistant-0.1.91.dist-info/entry_points.txt,sha256=47WUorU2y8wAKrGEVh5n6o3NaOB7A-4-PfSWp-xuFSg,286
40
- jarvis_ai_assistant-0.1.91.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
41
- jarvis_ai_assistant-0.1.91.dist-info/RECORD,,