jarvis-ai-assistant 0.1.43__py3-none-any.whl → 0.1.44__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.43"
3
+ __version__ = "0.1.44"
Binary file
jarvis/models/ai8.py CHANGED
@@ -14,58 +14,59 @@ class AI8Model(BasePlatform):
14
14
 
15
15
  def __init__(self):
16
16
  """Initialize model"""
17
- PrettyOutput.section("支持的模型", OutputType.SUCCESS)
18
-
19
- PrettyOutput.print("gpt-3.5-turbo", OutputType.INFO)
20
- PrettyOutput.print("gpt-4-turbo", OutputType.INFO)
21
- PrettyOutput.print("gpt-4o", OutputType.INFO)
22
- PrettyOutput.print("gpt-4o-mini", OutputType.INFO)
23
- PrettyOutput.print("o1-mini", OutputType.INFO)
24
- PrettyOutput.print("gpt-4-vision-preview", OutputType.INFO)
25
- PrettyOutput.print("gpt-4-turbo-preview", OutputType.INFO)
26
- PrettyOutput.print("o1-mini-all", OutputType.INFO)
27
- PrettyOutput.print("gpt-4o-all", OutputType.INFO)
28
- PrettyOutput.print("o1-preview", OutputType.INFO)
29
- PrettyOutput.print("claude-3-5-sonnet-20241022", OutputType.INFO)
30
- PrettyOutput.print("claude-3-opus-20240229", OutputType.INFO)
31
- PrettyOutput.print("claude-3-haiku-20240307", OutputType.INFO)
32
- PrettyOutput.print("claude-3-5-sonnet-20240620", OutputType.INFO)
33
- PrettyOutput.print("deepseek-chat", OutputType.INFO)
34
- PrettyOutput.print("deepseek-coder", OutputType.INFO)
35
- PrettyOutput.print("glm-4-flash", OutputType.INFO)
36
- PrettyOutput.print("glm-4-air", OutputType.INFO)
37
- PrettyOutput.print("glm-4v-flash", OutputType.INFO)
38
- PrettyOutput.print("qwen-plus", OutputType.INFO)
39
- PrettyOutput.print("qwen-vl-max", OutputType.INFO)
40
- PrettyOutput.print("qwen-turbo", OutputType.INFO)
41
- PrettyOutput.print("lite", OutputType.INFO)
42
- PrettyOutput.print("generalv3.5", OutputType.INFO)
43
- PrettyOutput.print("yi-lightning", OutputType.INFO)
44
- PrettyOutput.print("yi-vision", OutputType.INFO)
45
- PrettyOutput.print("yi-spark", OutputType.INFO)
46
- PrettyOutput.print("yi-medium", OutputType.INFO)
47
- PrettyOutput.print("Doubao-lite-4k", OutputType.INFO)
48
- PrettyOutput.print("Doubao-lite-32k", OutputType.INFO)
49
- PrettyOutput.print("Doubao-pro-4k", OutputType.INFO)
50
- PrettyOutput.print("Doubao-pro-32k", OutputType.INFO)
51
- PrettyOutput.print("step-1-flash", OutputType.INFO)
52
- PrettyOutput.print("step-1v-8k", OutputType.INFO)
53
- PrettyOutput.print("Baichuan4-Air", OutputType.INFO)
54
- PrettyOutput.print("Baichuan4-Turbo", OutputType.INFO)
55
- PrettyOutput.print("moonshot-v1-8k", OutputType.INFO)
56
- PrettyOutput.print("ERNIE-Speed-128K", OutputType.INFO)
57
- PrettyOutput.print("ERNIE-3.5-128K", OutputType.INFO)
17
+ self.system_message = ""
18
+ self.conversation = None
19
+ self.files = []
20
+ self.models = {} # 存储模型信息
58
21
 
22
+ # 获取可用模型列表
23
+ available_models = self.get_available_models()
24
+
25
+ if available_models:
26
+ PrettyOutput.section("支持的模型", OutputType.SUCCESS)
27
+ for model in self.models.values():
28
+ # 格式化显示模型信息
29
+ model_str = f"{model['value']:<30}"
30
+
31
+ # 添加标签
32
+ model_str += f"{model['label']}"
33
+
34
+ # 添加标签和积分信息
35
+ attrs = []
36
+ if model['attr'].get('tag'):
37
+ attrs.append(model['attr']['tag'])
38
+ if model['attr'].get('integral'):
39
+ attrs.append(model['attr']['integral'])
40
+
41
+ # 添加特性标记
42
+ features = []
43
+ if model['attr'].get('multimodal'):
44
+ features.append("多模态")
45
+ if model['attr'].get('plugin'):
46
+ features.append("插件支持")
47
+ if model['attr'].get('onlyImg'):
48
+ features.append("图像支持")
49
+ if features:
50
+ model_str += f" [{'|'.join(features)}]"
51
+
52
+ # 添加备注
53
+ if model['attr'].get('note'):
54
+ model_str += f" - {model['attr']['note']}"
55
+
56
+ PrettyOutput.print(model_str, OutputType.INFO)
57
+ else:
58
+ PrettyOutput.print("获取模型列表失败", OutputType.WARNING)
59
59
 
60
+ self.token = os.getenv("AI8_API_KEY")
61
+ if not self.token:
62
+ raise Exception("AI8_API_KEY is not set")
63
+
60
64
  PrettyOutput.print("使用AI8_MODEL环境变量配置模型", OutputType.SUCCESS)
61
65
 
62
- self.system_message = ""
63
- self.conversation = None
64
- self.files = []
65
66
  self.model_name = os.getenv("AI8_MODEL") or "deepseek-chat"
66
- self.token = os.getenv("AI8_API_KEY")
67
- if not all([self.model_name, self.token]):
68
- raise Exception("AI8_MODEL or AI8_API_KEY is not set")
67
+ if self.model_name not in self.models:
68
+ PrettyOutput.print(f"警告: 当前选择的模型 {self.model_name} 不在可用列表中", OutputType.WARNING)
69
+
69
70
  PrettyOutput.print(f"当前使用模型: {self.model_name}", OutputType.SYSTEM)
70
71
 
71
72
  def set_model_name(self, model_name: str):
@@ -279,3 +280,45 @@ class AI8Model(BasePlatform):
279
280
  PrettyOutput.print(f"删除会话异常: {str(e)}", OutputType.ERROR)
280
281
  return False
281
282
 
283
+ def get_available_models(self) -> List[str]:
284
+ """获取可用的模型列表
285
+
286
+ Returns:
287
+ List[str]: 可用模型名称列表
288
+ """
289
+ try:
290
+ headers = {
291
+ 'Content-Type': 'application/json',
292
+ 'Accept': 'application/json, text/plain, */*',
293
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
294
+ 'X-APP-VERSION': '2.2.2',
295
+ 'Origin': self.BASE_URL,
296
+ 'Referer': f'{self.BASE_URL}/chat?_userMenuKey=chat'
297
+ }
298
+
299
+ response = requests.get(
300
+ f"{self.BASE_URL}/api/chat/template",
301
+ headers=headers
302
+ )
303
+
304
+ if response.status_code != 200:
305
+ PrettyOutput.print(f"获取模型列表失败: {response.status_code}", OutputType.ERROR)
306
+ return []
307
+
308
+ data = response.json()
309
+ if data['code'] != 0:
310
+ PrettyOutput.print(f"获取模型列表失败: {data.get('msg', '未知错误')}", OutputType.ERROR)
311
+ return []
312
+
313
+ # 保存模型信息
314
+ self.models = {
315
+ model['value']: model
316
+ for model in data['data']['models']
317
+ }
318
+
319
+ return list(self.models.keys())
320
+
321
+ except Exception as e:
322
+ PrettyOutput.print(f"获取模型列表异常: {str(e)}", OutputType.ERROR)
323
+ return []
324
+
jarvis/models/base.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from typing import Dict, List
3
- from ..utils import OutputType, PrettyOutput
4
3
 
5
4
 
6
5
  class BasePlatform(ABC):
jarvis/models/oyi.py CHANGED
@@ -15,42 +15,31 @@ class OyiModel(BasePlatform):
15
15
  def __init__(self):
16
16
  """Initialize model"""
17
17
  PrettyOutput.section("支持的模型", OutputType.SUCCESS)
18
- PrettyOutput.print("gpt-4o-mini", OutputType.INFO)
19
- PrettyOutput.print("gpt-3.5-turbo", OutputType.INFO)
20
- PrettyOutput.print("gpt-4o", OutputType.INFO)
21
- PrettyOutput.print("gpt-4o-2024-11-20", OutputType.INFO)
22
- PrettyOutput.print("o1-mini", OutputType.INFO)
23
- PrettyOutput.print("o1-mini-2024-09-12", OutputType.INFO)
24
- PrettyOutput.print("gpt-4o-all", OutputType.INFO)
25
- PrettyOutput.print("claude-3-5-sonnet-20240620", OutputType.INFO)
26
- PrettyOutput.print("claude-3-opus-20240229", OutputType.INFO)
27
- PrettyOutput.print("deepseek-chat", OutputType.INFO)
28
- PrettyOutput.print("deepseek-coder", OutputType.INFO)
29
- PrettyOutput.print("glm-4-flash", OutputType.INFO)
30
- PrettyOutput.print("glm-4-air", OutputType.INFO)
31
- PrettyOutput.print("qwen-plus", OutputType.INFO)
32
- PrettyOutput.print("qwen-turbo", OutputType.INFO)
33
- PrettyOutput.print("Doubao-lite-4k", OutputType.INFO)
34
- PrettyOutput.print("Doubao-pro-4k", OutputType.INFO)
35
- PrettyOutput.print("yi-lightning", OutputType.INFO)
36
- PrettyOutput.print("step-1-flash", OutputType.INFO)
37
- PrettyOutput.print("moonshot-v1-8k", OutputType.INFO)
38
- PrettyOutput.print("lite", OutputType.INFO)
39
- PrettyOutput.print("generalv3.5", OutputType.INFO)
40
- PrettyOutput.print("gemini-pro", OutputType.INFO)
41
- PrettyOutput.print("llama3-70b-8192", OutputType.INFO)
18
+
19
+ # 获取可用模型列表
20
+ available_models = self.get_available_models()
21
+ if available_models:
22
+ for model in available_models:
23
+ PrettyOutput.print(model, OutputType.INFO)
24
+ else:
25
+ PrettyOutput.print("获取模型列表失败", OutputType.WARNING)
26
+
42
27
  PrettyOutput.print("使用OYI_MODEL环境变量配置模型", OutputType.SUCCESS)
43
28
 
44
-
45
29
  self.messages = []
46
30
  self.system_message = ""
47
31
  self.conversation = None
48
32
  self.upload_files = []
49
33
  self.first_chat = True
50
- self.model_name = os.getenv("OYI_MODEL") or "deepseek-chat"
34
+
51
35
  self.token = os.getenv("OYI_API_KEY")
52
- if not all([self.model_name, self.token]):
53
- raise Exception("OYI_MODEL or OYI_API_KEY is not set")
36
+ if not self.token:
37
+ raise Exception("OYI_API_KEY is not set")
38
+
39
+ self.model_name = os.getenv("OYI_MODEL") or "deepseek-chat"
40
+ if self.model_name not in [m.split()[0] for m in available_models]:
41
+ PrettyOutput.print(f"警告: 当前选择的模型 {self.model_name} 不在可用列表中", OutputType.WARNING)
42
+
54
43
  PrettyOutput.print(f"当前使用模型: {self.model_name}", OutputType.SYSTEM)
55
44
 
56
45
  def set_model_name(self, model_name: str):
@@ -265,6 +254,12 @@ class OyiModel(BasePlatform):
265
254
  Dict: Upload response data
266
255
  """
267
256
  try:
257
+ # 检查当前模型是否支持文件上传
258
+ model_info = self.models.get(self.model_name)
259
+ if not model_info or not model_info.get('uploadFile', False):
260
+ PrettyOutput.print(f"当前模型 {self.model_name} 不支持文件上传", OutputType.WARNING)
261
+ return None
262
+
268
263
  headers = {
269
264
  'Authorization': f'Bearer {self.token}',
270
265
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
@@ -276,7 +271,7 @@ class OyiModel(BasePlatform):
276
271
 
277
272
  with open(file_path, 'rb') as f:
278
273
  files = {
279
- 'file': (os.path.basename(file_path), f, mimetypes.guess_type(file_path)[0]) # Adjust content-type based on file type
274
+ 'file': (os.path.basename(file_path), f, mimetypes.guess_type(file_path)[0])
280
275
  }
281
276
 
282
277
  response = requests.post(
@@ -302,3 +297,70 @@ class OyiModel(BasePlatform):
302
297
  except Exception as e:
303
298
  PrettyOutput.print(f"文件上传异常: {str(e)}", OutputType.ERROR)
304
299
  return None
300
+
301
+ def get_available_models(self) -> List[str]:
302
+ """获取可用的模型列表
303
+
304
+ Returns:
305
+ List[str]: 可用模型名称列表
306
+ """
307
+ try:
308
+ headers = {
309
+ 'Content-Type': 'application/json',
310
+ 'Accept': 'application/json, text/plain, */*',
311
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
312
+ 'Origin': 'https://ai.rcouyi.com',
313
+ 'Referer': 'https://ai.rcouyi.com/'
314
+ }
315
+
316
+ response = requests.get(
317
+ "https://ai.rcouyi.com/config/system.json",
318
+ headers=headers
319
+ )
320
+
321
+ if response.status_code != 200:
322
+ PrettyOutput.print(f"获取模型列表失败: {response.status_code}", OutputType.ERROR)
323
+ return []
324
+
325
+ data = response.json()
326
+
327
+ # 保存模型信息
328
+ self.models = {
329
+ model['value']: model
330
+ for model in data.get('model', [])
331
+ if model.get('enable', False) # 只保存启用的模型
332
+ }
333
+
334
+ # 格式化显示
335
+ models = []
336
+ for model in self.models.values():
337
+ # 基本信息
338
+ model_str = f"{model['value']:<30} {model['label']}"
339
+
340
+ # 添加后缀标签
341
+ suffix = model.get('suffix', [])
342
+ if suffix:
343
+ # 处理新格式的suffix (字典列表)
344
+ if suffix and isinstance(suffix[0], dict):
345
+ suffix_str = ', '.join(s.get('tag', '') for s in suffix)
346
+ # 处理旧格式的suffix (字符串列表)
347
+ else:
348
+ suffix_str = ', '.join(str(s) for s in suffix)
349
+ model_str += f" ({suffix_str})"
350
+
351
+ # 添加描述或提示
352
+ info = model.get('tooltip') or model.get('description', '')
353
+ if info:
354
+ model_str += f" - {info}"
355
+
356
+ # 添加文件上传支持标记
357
+ if model.get('uploadFile'):
358
+ model_str += " [支持文件上传]"
359
+
360
+ models.append(model_str)
361
+
362
+ return sorted(models)
363
+
364
+ except Exception as e:
365
+ PrettyOutput.print(f"获取模型列表异常: {str(e)}", OutputType.ERROR)
366
+ return []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.43
3
+ Version: 0.1.44
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,8 +1,8 @@
1
- jarvis/__init__.py,sha256=OJVxHJQi99bOxMOkdKLvxRutQ_Lc4AyKCH4e-FnQNfw,50
1
+ jarvis/__init__.py,sha256=30wDVtD64NoYQ74EdslpVbhr4wp-p_fPgv7AeQ0i-Ug,50
2
2
  jarvis/agent.py,sha256=5GmC9iAOerTR4JoxzrfgLSspoz6qRm1E6xEIWLTR2OI,12222
3
3
  jarvis/main.py,sha256=3kpohHORc13A5RBjTSHYF7cdnc6W15hO23R78Iqnz8w,5843
4
4
  jarvis/utils.py,sha256=JlkuC9RtspXH2VWDmj9nR0vnb8ie1gIsKc4vC7WRco8,7321
5
- jarvis/__pycache__/__init__.cpython-313.pyc,sha256=FWB9E8zChLF1EI0hTB-cEMjRy5wB24APzutV1cZJLqY,209
5
+ jarvis/__pycache__/__init__.cpython-313.pyc,sha256=Yc1GRrJWnBTglkYG4V1_bmBz7PIuq1V53ZeSEfcE-wQ,209
6
6
  jarvis/__pycache__/agent.cpython-313.pyc,sha256=H7FXCYJSJm0k062oMVFZx1unUD-khreKrZfaKQ2aJqY,15870
7
7
  jarvis/__pycache__/main.cpython-313.pyc,sha256=-tDMANWAyPk45zx-lnxM1_uxTUzEqrWwcBe2nWtzH2E,8133
8
8
  jarvis/__pycache__/models.cpython-313.pyc,sha256=uWuRIjGrY4YDB3dGW5PGDLWaS03et8g11O725TjY_eU,5960
@@ -10,18 +10,18 @@ jarvis/__pycache__/tools.cpython-313.pyc,sha256=lAD4LrnnWzNZQmHXGfZ_2l7oskOpr2_2
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=mrOt67nselz_H1gX9wdAO4y2DY5WPXzABqJbr5Des8k,63
13
- jarvis/models/ai8.py,sha256=d1h3L32QBfyf5iQvyncTo-RfvA-kTDGrL7gtxAL6gDg,11609
14
- jarvis/models/base.py,sha256=CMjODEh2c9KbCMfQGF7WgGbn-CfpIaGdA5yK1RxKMLY,1282
13
+ jarvis/models/ai8.py,sha256=9i7n_-TPbvq0AaRILs9ERQ7Vy5tDyoibXkiPsJvwQio,12520
14
+ jarvis/models/base.py,sha256=eeNJJbv9ikPVTtV_E7mgW8LZzVgjQ-OzxlHF6slYrHw,1237
15
15
  jarvis/models/kimi.py,sha256=N0bPQ1ugx0RwjR96jLchmOPvCmws-fXyA0mnOAdo2k4,17161
16
16
  jarvis/models/openai.py,sha256=pB7AaZuorHlmudTPaUnEbFOyl51Fy6uhU9KQBm98Ov8,4156
17
- jarvis/models/oyi.py,sha256=2-PTdoboHl0Jtn0RrBXC7gSCYbI9_yVUmNDBVYw-U5M,12458
17
+ jarvis/models/oyi.py,sha256=12jskOgo77LWtXq4u-LX7s_sYomBJSlry4oONtdmVCU,14443
18
18
  jarvis/models/registry.py,sha256=iVBjN9ImEvGHcz8WR-z8pPMJQZI907o_nccVOFANhak,7951
19
19
  jarvis/models/__pycache__/__init__.cpython-313.pyc,sha256=b9Z3owWpzLnKKwqQH6bWHZJZDeThHGD9Oa7TMCpyHwc,224
20
- jarvis/models/__pycache__/ai8.cpython-313.pyc,sha256=Bu4NXc_CV-GViEL55b0keW6coToPW9aYXhTcOsZIcvg,14972
21
- jarvis/models/__pycache__/base.cpython-313.pyc,sha256=Bsu0p7yNCNa4jO-i2A58i3H3xYzxzhtty5BeHAC5lmE,2488
20
+ jarvis/models/__pycache__/ai8.cpython-313.pyc,sha256=r3KAXgiIpNHC9X9Z9vbAEorDNmfeiKQOXlKiKC0A_CA,14176
21
+ jarvis/models/__pycache__/base.cpython-313.pyc,sha256=xltXUMcaO5oVNzSmz0-bhPvsH3oHWU7QEPUTPV48x-g,2419
22
22
  jarvis/models/__pycache__/kimi.cpython-313.pyc,sha256=uqDghVAZe5bpw9RtVGoiFd3-hJnIkhbNDaBdrAwiq2w,21662
23
23
  jarvis/models/__pycache__/openai.cpython-313.pyc,sha256=3buu7rqBwDV8mJ4wMff6xy_8pf6XPt2NYTlfIdPpz8M,6384
24
- jarvis/models/__pycache__/oyi.cpython-313.pyc,sha256=49JKEc1tGhbdMV0PiBRnGxq4OGAfNnKmozNw87aRmP8,14441
24
+ jarvis/models/__pycache__/oyi.cpython-313.pyc,sha256=142O2W2Qrf2OXppA_ScQVkH9Ix2OotK2tQuFW_z7S8c,15691
25
25
  jarvis/models/__pycache__/registry.cpython-313.pyc,sha256=iL3zjkiOC-xUnW3SLV_UN1P_CaxS8-RJm5njLZ1z3cg,10384
26
26
  jarvis/tools/__init__.py,sha256=Kj1bKj34lwRDKMKHLOrLyQElf2lHbqA2tDgP359eaDo,71
27
27
  jarvis/tools/base.py,sha256=EGRGbdfbLXDLwtyoWdvp9rlxNX7bzc20t0Vc2VkwIEY,652
@@ -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.43.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
53
- jarvis_ai_assistant-0.1.43.dist-info/METADATA,sha256=BolaQ4qPW5JleYCO9bdksEjAEgBVCuJVXIFs6zzlLz8,10015
54
- jarvis_ai_assistant-0.1.43.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
55
- jarvis_ai_assistant-0.1.43.dist-info/entry_points.txt,sha256=iKu7OMfew9dtfGhW71gIMTg4wvafuPqKb4wyQOnMAGU,44
56
- jarvis_ai_assistant-0.1.43.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
57
- jarvis_ai_assistant-0.1.43.dist-info/RECORD,,
52
+ jarvis_ai_assistant-0.1.44.dist-info/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
53
+ jarvis_ai_assistant-0.1.44.dist-info/METADATA,sha256=7GkjCkI2v9zr2UjGXletzOPTq9Hhj0sOPTF1J7aDQjo,10015
54
+ jarvis_ai_assistant-0.1.44.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
55
+ jarvis_ai_assistant-0.1.44.dist-info/entry_points.txt,sha256=iKu7OMfew9dtfGhW71gIMTg4wvafuPqKb4wyQOnMAGU,44
56
+ jarvis_ai_assistant-0.1.44.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
57
+ jarvis_ai_assistant-0.1.44.dist-info/RECORD,,