jarvis-ai-assistant 0.1.34__py3-none-any.whl → 0.1.36__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.
jarvis/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """Jarvis AI Assistant"""
2
2
 
3
- __version__ = "0.1.34"
3
+ __version__ = "0.1.36"
Binary file
Binary file
jarvis/agent.py CHANGED
@@ -88,14 +88,15 @@ class Agent:
88
88
 
89
89
 
90
90
  def _load_methodology(self) -> str:
91
- """加载方法论"""
91
+ """加载经验总结"""
92
92
  user_jarvis_methodology = os.path.expanduser("~/.jarvis_methodology")
93
93
  ret = ""
94
94
  if os.path.exists(user_jarvis_methodology):
95
95
  with open(user_jarvis_methodology, "r", encoding="utf-8") as f:
96
96
  data = yaml.safe_load(f)
97
97
  for k, v in data.items():
98
- ret += f"问题类型: \n{k}\n方法论: \n{v}\n\n"
98
+ ret += f"问题类型: \n{k}\n经验总结: \n{v}\n\n"
99
+ PrettyOutput.print(f"从 {user_jarvis_methodology} 加载经验总结: {', '.join(data.keys())}", OutputType.INFO)
99
100
  return ret
100
101
 
101
102
  def run(self, user_input: str, file_list: Optional[List[str]] = None, keep_history: bool = False) -> str:
@@ -115,12 +116,12 @@ class Agent:
115
116
  if file_list:
116
117
  self.model.upload_files(file_list)
117
118
 
118
- # 加载方法论
119
+ # 加载经验总结
119
120
  methodology = self._load_methodology()
120
121
 
121
122
  methodology_prompt = ""
122
123
  if methodology:
123
- methodology_prompt = f"""这是以往处理问题的标准方法论,如果当前任务与此类似,可参考:
124
+ methodology_prompt = f"""这是以往处理问题的标准经验总结,如果当前任务与此类似,可参考:
124
125
  {methodology}
125
126
 
126
127
  """
@@ -145,11 +146,11 @@ class Agent:
145
146
  6. 制定行动计划:根据目前可以使用的工具制定行动计划
146
147
  7. 执行行动计划:每步执行一个步骤,最多使用一个工具(工具执行完成后,等待工具结果再执行下一步)
147
148
  8. 监控与调整:如果执行结果与预期不符,则反思并调整行动计划,迭代之前的步骤
148
- 9. 更新方法论(如有必要):任务完成后总结执行过程中的经验教训,生成同类问题的通用方法论,使用方法论工具进行更新或者添加
149
+ 9. 更新经验总结(如有必要):任务完成后总结执行过程中的经验教训,生成同类问题的通用经验总结,使用经验总结工具进行更新或者添加
149
150
 
150
151
  -------------------------------------------------------------
151
152
 
152
- 方法论模板:
153
+ 经验总结模板:
153
154
  1. 问题重述
154
155
  2. 最优解决方案
155
156
  3. 最优方案执行步骤(失败的行动不需要体现)
@@ -223,7 +224,7 @@ arguments:
223
224
 
224
225
  if not user_input:
225
226
  while True:
226
- choice = prompt("是否需要手动为此任务生成方法论以提升Jarvis对类似任务的处理能力?(y/n), 回车跳过: ")
227
+ choice = prompt("是否需要手动为此任务生成经验总结以提升Jarvis对类似任务的处理能力?(y/n), 回车跳过: ")
227
228
  if choice == "y":
228
229
  self._make_methodology()
229
230
  break
@@ -273,9 +274,9 @@ arguments:
273
274
  self.model.reset()
274
275
 
275
276
  def _make_methodology(self):
276
- """生成方法论"""
277
- current_response = self._call_model("""请根据之前的对话内容,判断是否有必要更新、添加、删除现有方法论,如果有,使用methodology工具进行管理。
278
- 方法论模板:
277
+ """生成经验总结"""
278
+ current_response = self._call_model("""请根据之前的对话内容,判断是否有必要更新、添加、删除现有经验总结,如果有,使用methodology工具进行管理。
279
+ 经验总结模板:
279
280
  1. 问题重述
280
281
  2. 最优解决方案
281
282
  3. 最优方案执行步骤(失败的行动不需要体现)
@@ -286,4 +287,8 @@ arguments:
286
287
  except Exception as e:
287
288
  PrettyOutput.print(f"工具调用错误: {str(e)}", OutputType.ERROR)
288
289
  return
290
+ if len(result) > 0:
291
+ PrettyOutput.print("执行工具调用...", OutputType.PROGRESS)
292
+ tool_result = self.tool_registry.handle_tool_calls(result)
293
+ PrettyOutput.print(tool_result, OutputType.RESULT)
289
294
 
jarvis/models/ai8.py CHANGED
@@ -59,7 +59,7 @@ class AI8Model(BaseModel):
59
59
  PrettyOutput.print("ERNIE-3.5-128K", OutputType.INFO)
60
60
 
61
61
 
62
- PrettyOutput.print("使用AI8_MODEL配置模型", OutputType.SUCCESS)
62
+ PrettyOutput.print("使用AI8_MODEL环境变量配置模型", OutputType.SUCCESS)
63
63
 
64
64
  self.system_message = ""
65
65
  self.conversation = None
jarvis/models/oyi.py CHANGED
@@ -39,7 +39,7 @@ class OyiModel(BaseModel):
39
39
  PrettyOutput.print("generalv3.5", OutputType.INFO)
40
40
  PrettyOutput.print("gemini-pro", OutputType.INFO)
41
41
  PrettyOutput.print("llama3-70b-8192", OutputType.INFO)
42
- PrettyOutput.print("使用OYI_MODEL配置模型", OutputType.SUCCESS)
42
+ PrettyOutput.print("使用OYI_MODEL环境变量配置模型", OutputType.SUCCESS)
43
43
 
44
44
 
45
45
  self.messages = []
@@ -8,7 +8,7 @@ class MethodologyTool:
8
8
  """经验管理工具"""
9
9
 
10
10
  name = "methodology"
11
- description = "管理问题处理方法论,支持添加、更新、删除操作"
11
+ description = "管理问题处理经验总结,支持添加、更新、删除操作"
12
12
  parameters = {
13
13
  "type": "object",
14
14
  "properties": {
@@ -23,7 +23,7 @@ class MethodologyTool:
23
23
  },
24
24
  "content": {
25
25
  "type": "string",
26
- "description": "方法论内容 (update/add 时必需)",
26
+ "description": "经验总结内容 (update/add 时必需)",
27
27
  "optional": True
28
28
  }
29
29
  },
@@ -36,39 +36,39 @@ class MethodologyTool:
36
36
  self._ensure_file_exists()
37
37
 
38
38
  def _ensure_file_exists(self):
39
- """确保方法论文件存在"""
39
+ """确保经验总结文件存在"""
40
40
  if not os.path.exists(self.methodology_file):
41
41
  try:
42
42
  with open(self.methodology_file, 'w', encoding='utf-8') as f:
43
43
  yaml.safe_dump({}, f, allow_unicode=True)
44
44
  except Exception as e:
45
- PrettyOutput.print(f"创建方法论文件失败: {str(e)}", OutputType.ERROR)
45
+ PrettyOutput.print(f"创建经验总结文件失败: {str(e)}", OutputType.ERROR)
46
46
 
47
47
  def _load_methodologies(self) -> Dict:
48
- """加载所有方法论"""
48
+ """加载所有经验总结"""
49
49
  try:
50
50
  with open(self.methodology_file, 'r', encoding='utf-8') as f:
51
51
  return yaml.safe_load(f) or {}
52
52
  except Exception as e:
53
- PrettyOutput.print(f"加载方法论失败: {str(e)}", OutputType.ERROR)
53
+ PrettyOutput.print(f"加载经验总结失败: {str(e)}", OutputType.ERROR)
54
54
  return {}
55
55
 
56
56
  def _save_methodologies(self, methodologies: Dict):
57
- """保存所有方法论"""
57
+ """保存所有经验总结"""
58
58
  try:
59
59
  with open(self.methodology_file, 'w', encoding='utf-8') as f:
60
60
  yaml.safe_dump(methodologies, f, allow_unicode=True)
61
61
  except Exception as e:
62
- PrettyOutput.print(f"保存方法论失败: {str(e)}", OutputType.ERROR)
62
+ PrettyOutput.print(f"保存经验总结失败: {str(e)}", OutputType.ERROR)
63
63
 
64
64
  def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
65
- """执行方法论管理操作
65
+ """执行经验总结管理操作
66
66
 
67
67
  Args:
68
68
  args: 包含操作参数的字典
69
69
  - operation: 操作类型 (delete/update/add)
70
70
  - problem_type: 问题类型
71
- - content: 方法论内容 (update/add 时必需)
71
+ - content: 经验总结内容 (update/add 时必需)
72
72
 
73
73
  Returns:
74
74
  Dict[str, Any]: 包含执行结果的字典
@@ -92,32 +92,28 @@ class MethodologyTool:
92
92
  self._save_methodologies(methodologies)
93
93
  return {
94
94
  "success": True,
95
- "stdout": f"已删除问题类型 '{problem_type}' 的方法论"
95
+ "stdout": f"已删除问题类型 '{problem_type}' 的经验总结"
96
96
  }
97
97
  else:
98
98
  return {
99
99
  "success": False,
100
- "error": f"未找到问题类型 '{problem_type}' 的方法论"
100
+ "error": f"未找到问题类型 '{problem_type}' 的经验总结"
101
101
  }
102
102
 
103
103
  elif operation in ["update", "add"]:
104
104
  if not content:
105
105
  return {
106
106
  "success": False,
107
- "error": f"{operation} 操作需要提供方法论内容"
108
- }
109
-
110
- if operation == "update" and problem_type not in methodologies:
111
- return {
112
- "success": False,
113
- "error": f"未找到问题类型 '{problem_type}' 的方法论,无法更新"
107
+ "error": "需要提供经验总结内容"
114
108
  }
115
109
 
116
110
  methodologies[problem_type] = content
117
111
  self._save_methodologies(methodologies)
112
+
113
+ action = "更新" if problem_type in methodologies else "添加"
118
114
  return {
119
115
  "success": True,
120
- "stdout": f"已{'更新' if operation == 'update' else '添加'}问题类型 '{problem_type}' 的方法论"
116
+ "stdout": f"已{action}问题类型 '{problem_type}' 的经验总结"
121
117
  }
122
118
 
123
119
  else:
@@ -133,13 +129,13 @@ class MethodologyTool:
133
129
  }
134
130
 
135
131
  def get_methodology(self, problem_type: str) -> Optional[str]:
136
- """获取指定问题类型的方法论
132
+ """获取指定问题类型的经验总结
137
133
 
138
134
  Args:
139
135
  problem_type: 问题类型
140
136
 
141
137
  Returns:
142
- Optional[str]: 方法论内容,如果不存在则返回 None
138
+ Optional[str]: 经验总结内容,如果不存在则返回 None
143
139
  """
144
140
  methodologies = self._load_methodologies()
145
141
  return methodologies.get(problem_type)
jarvis/tools/registry.py CHANGED
@@ -99,7 +99,7 @@ class ToolRegistry:
99
99
  parameters=tool_instance.parameters,
100
100
  func=tool_instance.execute
101
101
  )
102
- PrettyOutput.print(f"已加载工具: {tool_instance.name}: {tool_instance.description}", OutputType.INFO)
102
+ PrettyOutput.print(f" {file_path} 加载工具: {tool_instance.name}: {tool_instance.description}", OutputType.INFO)
103
103
  tool_found = True
104
104
 
105
105
  if not tool_found:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.34
3
+ Version: 0.1.36
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,34 +1,34 @@
1
- jarvis/__init__.py,sha256=RVT-55Tcimq7qZyDboUbuGqg9M05dnJ_nxixuHNVsWk,50
2
- jarvis/agent.py,sha256=y-BkxqRzaUMNYr8wlAjkch1zzkaVpA9XoA447yP94R4,11811
1
+ jarvis/__init__.py,sha256=1K8mUIwEsy3sPUIxD7iDbKMFX8NiGdBp69nW5a43mLE,50
2
+ jarvis/agent.py,sha256=i_tETgROksmPp95RYnwb7m-ERl0Ob1OEybXXcXJUpPk,12213
3
3
  jarvis/main.py,sha256=FOfc2v7iX9my5USyf4oxcGzyJe4AH4TwIEQk2WdNWrI,5768
4
4
  jarvis/utils.py,sha256=JlkuC9RtspXH2VWDmj9nR0vnb8ie1gIsKc4vC7WRco8,7321
5
- jarvis/__pycache__/__init__.cpython-313.pyc,sha256=IcR2PLYNeOmMFHca120FExEodc6S-FsJQV3hstw5izE,209
6
- jarvis/__pycache__/agent.cpython-313.pyc,sha256=HdWVkR2FwKACF-V_YWKTqnG3G19H9zwy78qIqwsTri4,15206
5
+ jarvis/__pycache__/__init__.cpython-313.pyc,sha256=y7E-wyD0KJpDfXJV1b-kHQFkNsSNBhIk3DalwVG3xBs,209
6
+ jarvis/__pycache__/agent.cpython-313.pyc,sha256=OfeSUMB3KcaFXrCiYENrFVcdfRyxBNQks3OtVb8PXO4,15864
7
7
  jarvis/__pycache__/main.cpython-313.pyc,sha256=KKVD1bs_4MDOdq2f04rsJpI8Osp959Fo5KOsUUBvrDM,7985
8
8
  jarvis/__pycache__/models.cpython-313.pyc,sha256=uWuRIjGrY4YDB3dGW5PGDLWaS03et8g11O725TjY_eU,5960
9
9
  jarvis/__pycache__/tools.cpython-313.pyc,sha256=lAD4LrnnWzNZQmHXGfZ_2l7oskOpr2_2OC-gdFhxQY8,33933
10
10
  jarvis/__pycache__/utils.cpython-313.pyc,sha256=eXXM-V-2ax7qBNxktdUrEIwhAXPQHAlI7gLGewlKOj4,10276
11
11
  jarvis/__pycache__/zte_llm.cpython-313.pyc,sha256=kMm9IGundGmOPqjsgrm9oIaWLDagYGCPRAaE3ipkc-0,5662
12
12
  jarvis/models/__init__.py,sha256=Lqb1NWFIfq7HlZIsJ7eUGyGjdYyaJqOoOf7cG_yo73A,57
13
- jarvis/models/ai8.py,sha256=mXa_fE_tHztK9SP3gUOFoSl6A-ceUkNsTVC6flEXlow,11457
13
+ jarvis/models/ai8.py,sha256=WfvQzSDUz19EVgqOwDzhlvPy5rNRS0bMkSNqWDwgIG4,11469
14
14
  jarvis/models/base.py,sha256=dNkYPg9ISrHGEpmQLN9kxCDU-kqJAJlm_owdDC302Dk,1132
15
15
  jarvis/models/kimi.py,sha256=iI8mBzUxiyxa_bzDG9uwE3BZtreEUt0EJOIP_l2rSDM,16788
16
16
  jarvis/models/openai.py,sha256=aFpRH6K0YG6suCRGlJLw2JzLh2Ftpn6AYhdnKtMQQlY,3940
17
- jarvis/models/oyi.py,sha256=DzRKD0jVYvU_O5dXKlOmy83j8tPIcGGHVJcV90QEmxs,12219
17
+ jarvis/models/oyi.py,sha256=6EzUcPkE5dtVZJa8zMhFfcjdKPPFVCg6hqYtFzgh9zM,12231
18
18
  jarvis/models/registry.py,sha256=ecIo3a0G-pRPw4eg77ozzbGVh6vy93DHF8oAnU2g51w,7511
19
19
  jarvis/models/__pycache__/__init__.cpython-313.pyc,sha256=hD4Uui0EPCTfoPOasTYzIi46Kv_q7OI8m-Lck-nX4zM,220
20
- jarvis/models/__pycache__/ai8.cpython-313.pyc,sha256=xexoy9Qgy0BYAfKY85Yy3oj2B-Sw9q2TXxeTmeK6tvQ,14775
20
+ jarvis/models/__pycache__/ai8.cpython-313.pyc,sha256=4tK3twFcGA4gbKciw9GpiI4-e9CxHPINtwvOz3sN_1I,14787
21
21
  jarvis/models/__pycache__/base.cpython-313.pyc,sha256=9VvOXFPYOrB-2pO2py7dWOVbimODnXQJFLlFbyF7-LI,2207
22
22
  jarvis/models/__pycache__/kimi.cpython-313.pyc,sha256=FGtHoTv747oNY4Lqnwf5BkGYKnevHOlIEDIlbsY7va0,20893
23
23
  jarvis/models/__pycache__/openai.cpython-313.pyc,sha256=CU3KaUA0XcOK55sexF7OxfQ6_jdofABsufmFxm0T3mk,6004
24
- jarvis/models/__pycache__/oyi.cpython-313.pyc,sha256=AzChNnqApFVNNXVi77uw7GwL7EfWnXp0T8G7_VUPpyY,14037
24
+ jarvis/models/__pycache__/oyi.cpython-313.pyc,sha256=HbZxBtfuR6G_KkKNCmI924SGtRb1tTfexg6Mw2paLtA,14049
25
25
  jarvis/models/__pycache__/registry.cpython-313.pyc,sha256=jUZUyHyfzeQtjCdk2NCZGTsTUsvKyIlnZVDzZY1gLuU,9985
26
26
  jarvis/tools/__init__.py,sha256=Kj1bKj34lwRDKMKHLOrLyQElf2lHbqA2tDgP359eaDo,71
27
27
  jarvis/tools/base.py,sha256=EGRGbdfbLXDLwtyoWdvp9rlxNX7bzc20t0Vc2VkwIEY,652
28
28
  jarvis/tools/file_ops.py,sha256=h8g0eT9UvlJf4kt0DLXvdSsjcPj7x19lxWdDApeDfpg,3842
29
29
  jarvis/tools/generator.py,sha256=qyNdarq5SGEFBjkIlohk13cP5wV9IeQK5qJs7MwGUZg,5740
30
- jarvis/tools/methodology.py,sha256=ptYOJR2yX6wHqv8hbvA3QshOYiga1r-c1-WQtaDJpq8,5434
31
- jarvis/tools/registry.py,sha256=lSdx1coMf2IFE8hfwCbCgSW83yVRCp0H981kj7c80e0,7167
30
+ jarvis/tools/methodology.py,sha256=G3cOaHTMujGZBhDLhQEqyCV2NISizO3MXRuho1KfI6Y,5223
31
+ jarvis/tools/registry.py,sha256=_M18bNfcn39razBo47IXtxUnT625oQIrkKx45qq2Ims,7180
32
32
  jarvis/tools/shell.py,sha256=UPKshPyOaUwTngresUw-ot1jHjQIb4wCY5nkJqa38lU,2520
33
33
  jarvis/tools/sub_agent.py,sha256=rEtAmSVY2ZjFOZEKr5m5wpACOQIiM9Zr_3dT92FhXYU,2621
34
34
  jarvis/tools/__pycache__/__init__.cpython-313.pyc,sha256=2ezw_ULVg9CJCUdX-RXTgYHLxQBs5X7wWJu1GNAN3ro,231
@@ -38,10 +38,10 @@ jarvis/tools/__pycache__/calculator.cpython-313.pyc,sha256=C_qwTDGm6gc7QNxtPzPZX
38
38
  jarvis/tools/__pycache__/calculator_tool.cpython-313.pyc,sha256=PI4LZNDTPdSe3ffWDRovLZ-r-vF8Kl-n6xdGdFWiBpY,4296
39
39
  jarvis/tools/__pycache__/file_ops.cpython-313.pyc,sha256=qfgRIcO7JFsa_FxOOXV-3pNSnlovZDrcIkZ1WN3pOJI,3773
40
40
  jarvis/tools/__pycache__/generator.cpython-313.pyc,sha256=sSO-y6fREIenF4cvFgaAtd0rAu95Epd5VZpjhmOfPRk,6155
41
- jarvis/tools/__pycache__/methodology.cpython-313.pyc,sha256=bsSQdQBeEit_hqbkgHOdiilQP3CFC5AUjLu7WF8XGRQ,6318
41
+ jarvis/tools/__pycache__/methodology.cpython-313.pyc,sha256=GWPSF5b0i6gUsgvJgXIkVQHpLRYQ7OzEiTLwe6aAuWU,6226
42
42
  jarvis/tools/__pycache__/python_script.cpython-313.pyc,sha256=8JpryqTovEiTvBlWAK1KjZmPvHUuPc9GT9rTXBEQoJc,6693
43
43
  jarvis/tools/__pycache__/rag.cpython-313.pyc,sha256=JH6-PSZRMKAvTZqCwlRXJGClxYXNMs-vetU0q7hBLz0,6064
44
- jarvis/tools/__pycache__/registry.cpython-313.pyc,sha256=TFRMsyO-g0YiQiez-jpi2YwBLzWu89Y6QyuidNB-ojc,9310
44
+ jarvis/tools/__pycache__/registry.cpython-313.pyc,sha256=BE91SasFW5pLIGvnaEuy0wMVLowLStK9xwsGXoPTYdw,9344
45
45
  jarvis/tools/__pycache__/search.cpython-313.pyc,sha256=wLMIkFwT-h4NGHgssytT4xme7sGO6ZhEnex7kjcy0-k,5990
46
46
  jarvis/tools/__pycache__/shell.cpython-313.pyc,sha256=ATt7BraEX6Sd3Ih6etwFpZ8fYczlZn5f0IqdjaqXt6c,3349
47
47
  jarvis/tools/__pycache__/sub_agent.cpython-313.pyc,sha256=ROqk3BEwB_2-ALp6jG3wf18ShUr1lO0bhJjibOn6f3o,2799
@@ -49,9 +49,9 @@ jarvis/tools/__pycache__/user_confirmation.cpython-313.pyc,sha256=wK3Ev10lHSUSRv
49
49
  jarvis/tools/__pycache__/user_input.cpython-313.pyc,sha256=JjTFOhObKsKF4Pn8KBRuKfV1_Ssj083fjU7Mfc_5z7c,2531
50
50
  jarvis/tools/__pycache__/user_interaction.cpython-313.pyc,sha256=RuVZ-pmiPBDywY3efgXSfohMAciC1avMGPmBK5qlnew,3305
51
51
  jarvis/tools/__pycache__/webpage.cpython-313.pyc,sha256=BjzSfnNzsKCrLETCcWjt32lNDLzwnjqcVGg4JfWd9OM,3008
52
- jarvis_ai_assistant-0.1.34.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
53
- jarvis_ai_assistant-0.1.34.dist-info/METADATA,sha256=S_8lh2XQ52K4VEXV-prKPu9uJHPjmUPkseye8QWmquE,9765
54
- jarvis_ai_assistant-0.1.34.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
55
- jarvis_ai_assistant-0.1.34.dist-info/entry_points.txt,sha256=iKu7OMfew9dtfGhW71gIMTg4wvafuPqKb4wyQOnMAGU,44
56
- jarvis_ai_assistant-0.1.34.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
57
- jarvis_ai_assistant-0.1.34.dist-info/RECORD,,
52
+ jarvis_ai_assistant-0.1.36.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
53
+ jarvis_ai_assistant-0.1.36.dist-info/METADATA,sha256=vCANngD8_2pKamajo7DXgPMM54K13Ja6s5iBtqsPqLk,9765
54
+ jarvis_ai_assistant-0.1.36.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
55
+ jarvis_ai_assistant-0.1.36.dist-info/entry_points.txt,sha256=iKu7OMfew9dtfGhW71gIMTg4wvafuPqKb4wyQOnMAGU,44
56
+ jarvis_ai_assistant-0.1.36.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
57
+ jarvis_ai_assistant-0.1.36.dist-info/RECORD,,