jarvis-ai-assistant 0.1.222__py3-none-any.whl → 0.1.223__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 +1 -1
- jarvis/jarvis_agent/builtin_input_handler.py +3 -6
- jarvis/jarvis_multi_agent/__init__.py +74 -31
- jarvis/jarvis_platform/kimi.py +2 -2
- {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/METADATA +51 -22
- {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/RECORD +10 -10
- {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/top_level.txt +0 -0
jarvis/__init__.py
CHANGED
@@ -39,12 +39,9 @@ def builtin_input_handler(user_input: str, agent_: Any) -> Tuple[str, bool]:
|
|
39
39
|
return "", True
|
40
40
|
elif tag == "ToolUsage":
|
41
41
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
tool_registry_ if tool_registry_ else ToolRegistry()
|
46
|
-
)
|
47
|
-
agent.set_addon_prompt(tool_registry.prompt())
|
42
|
+
from jarvis.jarvis_agent.prompt_builder import build_action_prompt
|
43
|
+
action_prompt = build_action_prompt(agent.output_handler) # type: ignore
|
44
|
+
agent.set_addon_prompt(action_prompt)
|
48
45
|
return "", False
|
49
46
|
elif tag == "ReloadConfig":
|
50
47
|
from jarvis.jarvis_utils.utils import load_config
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
import re
|
3
|
-
from typing import Any, Dict, List, Tuple
|
3
|
+
from typing import Any, Dict, List, Optional, Tuple
|
4
4
|
|
5
5
|
import yaml
|
6
6
|
|
@@ -14,9 +14,10 @@ from jarvis.jarvis_utils.tag import ct, ot
|
|
14
14
|
class MultiAgent(OutputHandler):
|
15
15
|
def __init__(self, agents_config: List[Dict], main_agent_name: str):
|
16
16
|
self.agents_config = agents_config
|
17
|
-
self.
|
18
|
-
self.
|
17
|
+
self.agents_config_map = {c["name"]: c for c in agents_config}
|
18
|
+
self.agents: Dict[str, Agent] = {}
|
19
19
|
self.main_agent_name = main_agent_name
|
20
|
+
self.original_question: Optional[str] = None
|
20
21
|
|
21
22
|
def prompt(self) -> str:
|
22
23
|
return f"""
|
@@ -101,43 +102,85 @@ content: |2
|
|
101
102
|
continue
|
102
103
|
return ret
|
103
104
|
|
104
|
-
def
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
105
|
+
def _get_agent(self, name: str) -> Agent | None:
|
106
|
+
if name in self.agents:
|
107
|
+
return self.agents[name]
|
108
|
+
|
109
|
+
if name not in self.agents_config_map:
|
110
|
+
return None
|
111
|
+
|
112
|
+
config = self.agents_config_map[name].copy()
|
113
|
+
|
114
|
+
if name != self.main_agent_name and self.original_question:
|
115
|
+
system_prompt = config.get("system_prompt", "")
|
116
|
+
config["system_prompt"] = (
|
117
|
+
f"{system_prompt}\n\n# 原始问题\n{self.original_question}"
|
118
|
+
)
|
119
|
+
|
120
|
+
output_handler = config.get("output_handler", [])
|
121
|
+
if len(output_handler) == 0:
|
122
|
+
output_handler = [
|
123
|
+
ToolRegistry(),
|
124
|
+
self,
|
125
|
+
]
|
126
|
+
else:
|
127
|
+
if not any(isinstance(h, MultiAgent) for h in output_handler):
|
113
128
|
output_handler.append(self)
|
114
|
-
|
115
|
-
|
116
|
-
|
129
|
+
config["output_handler"] = output_handler
|
130
|
+
|
131
|
+
agent = Agent(**config)
|
132
|
+
self.agents[name] = agent
|
133
|
+
return agent
|
117
134
|
|
118
135
|
def run(self, user_input: str) -> str:
|
119
|
-
|
120
|
-
|
136
|
+
self.original_question = user_input
|
137
|
+
last_agent_name = self.main_agent_name
|
138
|
+
|
139
|
+
agent = self._get_agent(self.main_agent_name)
|
140
|
+
if not agent:
|
141
|
+
# This should not happen if main_agent_name is correctly configured
|
142
|
+
return f"主智能体 {self.main_agent_name} 未找到"
|
143
|
+
|
144
|
+
msg: Any = agent.run(user_input)
|
145
|
+
|
121
146
|
while msg:
|
122
147
|
if isinstance(msg, str):
|
123
148
|
return msg
|
124
|
-
|
125
|
-
|
149
|
+
|
150
|
+
if not isinstance(msg, Dict):
|
151
|
+
# Should not happen if agent.run() returns str or Dict
|
152
|
+
PrettyOutput.print(f"未知消息类型: {type(msg)}", OutputType.WARNING)
|
153
|
+
break
|
154
|
+
|
155
|
+
prompt = f"""
|
126
156
|
Please handle this message:
|
127
|
-
from: {
|
157
|
+
from: {last_agent_name}
|
128
158
|
content: {msg['content']}
|
129
159
|
"""
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
f"未找到智能体 {msg['to']},可用智能体列表: {self.agents.keys()}"
|
136
|
-
)
|
137
|
-
continue
|
160
|
+
to_agent_name = msg.get("to")
|
161
|
+
if not to_agent_name:
|
162
|
+
return f"消息中未指定 `to` 字段"
|
163
|
+
|
164
|
+
if to_agent_name not in self.agents_config_map:
|
138
165
|
PrettyOutput.print(
|
139
|
-
f"
|
166
|
+
f"未找到智能体 {to_agent_name},正在重试...", OutputType.WARNING
|
140
167
|
)
|
141
|
-
|
142
|
-
|
168
|
+
agent = self._get_agent(last_agent_name)
|
169
|
+
if not agent:
|
170
|
+
return f"智能体 {last_agent_name} 未找到"
|
171
|
+
msg = agent.run(
|
172
|
+
f"未找到智能体 {to_agent_name},可用智能体列表: {list(self.agents_config_map.keys())}"
|
173
|
+
)
|
174
|
+
continue
|
175
|
+
|
176
|
+
PrettyOutput.print(
|
177
|
+
f"{last_agent_name} 正在向 {to_agent_name} 发送消息...", OutputType.INFO
|
178
|
+
)
|
179
|
+
|
180
|
+
agent = self._get_agent(to_agent_name)
|
181
|
+
if not agent:
|
182
|
+
return f"智能体 {to_agent_name} 未找到"
|
183
|
+
|
184
|
+
last_agent_name = agent.name
|
185
|
+
msg = agent.run(prompt)
|
143
186
|
return ""
|
jarvis/jarvis_platform/kimi.py
CHANGED
@@ -24,8 +24,8 @@ class KimiModel(BasePlatform):
|
|
24
24
|
def get_model_list(self) -> List[Tuple[str, str]]:
|
25
25
|
"""Get model list"""
|
26
26
|
return [
|
27
|
-
("
|
28
|
-
("k1", "基于网页的 Kimi,深度思考模型"),
|
27
|
+
("k1.5", "基于网页的 Kimi,免费接口"),
|
28
|
+
("k1.5-thinking", "基于网页的 Kimi,深度思考模型"),
|
29
29
|
("k2", "基于网页的 Kimi,深度思考模型 K2"),
|
30
30
|
]
|
31
31
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: jarvis-ai-assistant
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.223
|
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
|
@@ -148,15 +148,16 @@ pip3 install jarvis-ai-assistant
|
|
148
148
|
jarvis
|
149
149
|
|
150
150
|
# 带参数使用
|
151
|
-
jarvis
|
151
|
+
jarvis --llm_type thinking -t "初始任务"
|
152
152
|
```
|
153
153
|
|
154
154
|
#### 3. 命令行参数
|
155
155
|
| 参数 | 描述 |
|
156
156
|
|------|------|
|
157
|
-
|
|
158
|
-
| `-
|
159
|
-
| `-
|
157
|
+
| `--llm_type` | 使用的LLM类型 (normal/thinking) |
|
158
|
+
| `-t/--task` | 直接从命令行输入任务内容 |
|
159
|
+
| `-f/--config` | 自定义配置文件的路径 |
|
160
|
+
| `--restore-session` | 从 .jarvis/saved_session.json 恢复会话 |
|
160
161
|
|
161
162
|
#### 4. 工作流程
|
162
163
|
1. 初始化环境
|
@@ -178,14 +179,14 @@ jarvis -p <平台> -m <模型> -t "初始任务"
|
|
178
179
|
# 基本使用
|
179
180
|
jarvis
|
180
181
|
|
181
|
-
#
|
182
|
-
jarvis
|
182
|
+
# 指定LLM类型
|
183
|
+
jarvis --llm_type thinking
|
183
184
|
|
184
185
|
# 直接执行任务
|
185
186
|
jarvis -t "分析项目结构并生成架构图"
|
186
187
|
|
187
188
|
# 组合使用
|
188
|
-
jarvis
|
189
|
+
jarvis --llm_type thinking -t "优化项目性能"
|
189
190
|
```
|
190
191
|
|
191
192
|
### 代码代理功能 (jarvis-code-agent)
|
@@ -207,15 +208,15 @@ jarvis-code-agent
|
|
207
208
|
jca
|
208
209
|
|
209
210
|
# 带参数使用
|
210
|
-
jarvis-code-agent
|
211
|
+
jarvis-code-agent --llm_type thinking -r "需求描述"
|
211
212
|
```
|
212
213
|
|
213
214
|
#### 3. 命令行参数
|
214
215
|
| 参数 | 描述 |
|
215
216
|
|------|------|
|
216
|
-
|
|
217
|
-
| `-
|
218
|
-
|
|
217
|
+
| `--llm_type` | 使用的LLM类型 (normal/thinking) |
|
218
|
+
| `-r/--requirement` | 要处理的需求 |
|
219
|
+
| `--restore-session` | 从 .jarvis/saved_session.json 恢复会话 |
|
219
220
|
|
220
221
|
#### 4. 工作流程
|
221
222
|
1. 初始化环境(查找git根目录,检查未提交修改)
|
@@ -229,8 +230,8 @@ jarvis-code-agent -p <平台> -m <模型> -r "需求描述"
|
|
229
230
|
# 使用默认平台分析代码
|
230
231
|
jca
|
231
232
|
|
232
|
-
#
|
233
|
-
jca
|
233
|
+
# 指定LLM类型
|
234
|
+
jca --llm_type thinking
|
234
235
|
|
235
236
|
# 直接处理需求
|
236
237
|
jca -r "修复src/example.py中的内存泄漏问题"
|
@@ -338,6 +339,7 @@ jarvis-agent -f <配置文件> -c <代理定义文件> -t "初始任务"
|
|
338
339
|
| `-f/--config` | 指定配置文件路径(可选) |
|
339
340
|
| `-c/--agent_definition` | 指定代理定义文件路径(可选) |
|
340
341
|
| `-t/--task` | 指定初始任务(可选) |
|
342
|
+
| `--llm_type` | 使用的LLM类型 (normal/thinking),会覆盖配置文件中的设置 |
|
341
343
|
|
342
344
|
#### 4. 配置文件格式
|
343
345
|
代理定义文件使用YAML格式:
|
@@ -413,6 +415,8 @@ jarvis-platform-manager chat -p <平台名称> -m <模型名称>
|
|
413
415
|
- `/shell <命令>` - 执行shell命令
|
414
416
|
- `/save <文件名>` - 保存最后一条消息
|
415
417
|
- `/saveall <文件名>` - 保存完整对话历史
|
418
|
+
- `/save_session <文件名>` - 保存当前会话状态
|
419
|
+
- `/load_session <文件名>` - 加载会话状态
|
416
420
|
|
417
421
|
##### 2.3 启动API服务
|
418
422
|
```bash
|
@@ -430,6 +434,7 @@ jarvis-platform-manager service --host <IP地址> --port <端口号> -p <平台
|
|
430
434
|
```bash
|
431
435
|
# 加载角色配置文件并开始对话
|
432
436
|
jarvis-platform-manager role -c <配置文件路径>
|
437
|
+
# 配置文件默认为 ~/.jarvis/roles.yaml
|
433
438
|
```
|
434
439
|
|
435
440
|
角色配置文件格式(YAML):
|
@@ -604,14 +609,36 @@ jarvis-rag add README.md ./docs/ 'src/jarvis/jarvis_rag/*.py'
|
|
604
609
|
|
605
610
|
**参数与选项:**
|
606
611
|
|
612
|
+
| 参数/选项 | 描述 |
|
613
|
+
|---|---|
|
607
614
|
| 参数/选项 | 描述 |
|
608
615
|
|---|---|
|
609
616
|
| `paths` | **[必需]** 一个或多个文件路径、目录路径或用引号包裹的通配符模式。 |
|
610
|
-
| `--collection` | 指定知识库的集合名称(默认为 `jarvis_rag_collection`)。 |
|
611
|
-
| `--embedding-model` | 覆盖全局配置,强制使用特定的嵌入模型名称。 |
|
617
|
+
| `--collection` / `-c` | 指定知识库的集合名称(默认为 `jarvis_rag_collection`)。 |
|
618
|
+
| `--embedding-model` / `-e` | 覆盖全局配置,强制使用特定的嵌入模型名称。 |
|
612
619
|
| `--db-path` | 覆盖全局配置,指定向量数据库的存储路径。 |
|
620
|
+
| `--batch-size` / `-b` | 单个批次中要处理的文档数(默认为 500)。 |
|
621
|
+
|
622
|
+
##### 2.2 列出知识库中的文档 (`list-docs`)
|
613
623
|
|
614
|
-
|
624
|
+
此命令用于列出知识库中所有唯一的文档来源。
|
625
|
+
|
626
|
+
```bash
|
627
|
+
# 基本用法
|
628
|
+
jarvis-rag list-docs
|
629
|
+
|
630
|
+
# 指定集合
|
631
|
+
jarvis-rag list-docs --collection my_collection
|
632
|
+
```
|
633
|
+
|
634
|
+
**参数与选项:**
|
635
|
+
|
636
|
+
| 参数/选项 | 描述 |
|
637
|
+
|---|---|
|
638
|
+
| `--collection` / `-c` | 指定要查询的知识库集合名称。 |
|
639
|
+
| `--db-path` | 覆盖全局配置,指定向量数据库的存储路径。 |
|
640
|
+
|
641
|
+
##### 2.3 查询知识库 (`query`)
|
615
642
|
|
616
643
|
此命令用于向已建立的知识库提出问题。
|
617
644
|
|
@@ -624,18 +651,20 @@ jarvis-rag query "你的问题"
|
|
624
651
|
jarvis-rag query "请总结一下我添加的文档的核心内容"
|
625
652
|
|
626
653
|
# 2. 指定使用Kimi模型进行查询
|
627
|
-
jarvis-rag query "代码中的 'PlatformRegistry' 类是做什么用的?" --platform kimi --model
|
654
|
+
jarvis-rag query "代码中的 'PlatformRegistry' 类是做什么用的?" --platform kimi --model kimi
|
628
655
|
```
|
629
656
|
|
630
657
|
**参数与选项:**
|
631
658
|
|
659
|
+
| 参数/选项 | 描述 |
|
660
|
+
|---|---|
|
632
661
|
| 参数/选项 | 描述 |
|
633
662
|
|---|---|
|
634
663
|
| `question` | **[必需]** 你要向知识库提出的问题。 |
|
635
|
-
| `--collection` | 指定要查询的知识库集合名称。 |
|
636
|
-
| `--platform` | 指定一个平台名称来回答问题,覆盖默认的“思考”模型。 |
|
637
|
-
| `--model` | 指定一个模型名称来回答问题,需要与 `--platform` 同时使用。 |
|
638
|
-
| `--embedding-model` | 覆盖全局配置,强制使用特定的嵌入模型名称。 |
|
664
|
+
| `--collection` / `-c` | 指定要查询的知识库集合名称。 |
|
665
|
+
| `--platform` / `-p` | 指定一个平台名称来回答问题,覆盖默认的“思考”模型。 |
|
666
|
+
| `--model` / `-m` | 指定一个模型名称来回答问题,需要与 `--platform` 同时使用。 |
|
667
|
+
| `--embedding-model` / `-e` | 覆盖全局配置,强制使用特定的嵌入模型名称。 |
|
639
668
|
|
640
669
|
### 3. 命令替换功能
|
641
670
|
支持使用特殊标记`'<tag>'`触发命令替换功能:
|
@@ -1,6 +1,6 @@
|
|
1
|
-
jarvis/__init__.py,sha256=
|
1
|
+
jarvis/__init__.py,sha256=YlYf-txS383hefwOHMnCEByeqa-lDVLEbMwcCc7hY3Q,75
|
2
2
|
jarvis/jarvis_agent/__init__.py,sha256=l37t2lnXsPeQEwPkqrQWmqQ0ogh37GY-iAOQxkjttzY,21479
|
3
|
-
jarvis/jarvis_agent/builtin_input_handler.py,sha256=
|
3
|
+
jarvis/jarvis_agent/builtin_input_handler.py,sha256=MtPm7N78hPJJJ9PV_p8pkyDE7epBmtngrE9Xn-wbnH8,2682
|
4
4
|
jarvis/jarvis_agent/edit_file_handler.py,sha256=ml1o-BE2Ca1-ybPlKuhstLQYwdJag39o0_-PXTUvFaE,11646
|
5
5
|
jarvis/jarvis_agent/jarvis.py,sha256=2Ilt-eLs-dCvD6V1-UGyJ3PleY0AozkYhi8Rx6_zUr4,6315
|
6
6
|
jarvis/jarvis_agent/main.py,sha256=nXOw2mewhYYmj_8rohcEmETjUFqror1NiRwDusFMUKQ,3055
|
@@ -47,13 +47,13 @@ jarvis/jarvis_mcp/sse_mcp_client.py,sha256=-3Qy1LyqgHswoc6YbadVRG3ias2op7lUp7Ne2
|
|
47
47
|
jarvis/jarvis_mcp/stdio_mcp_client.py,sha256=armvgyHAv-AxF5lqiK-TbVLzg3XgSCwmTdWmxBSTLRk,11248
|
48
48
|
jarvis/jarvis_mcp/streamable_mcp_client.py,sha256=1OZpsG82U2MLbGuojllJAblFUAMmp1N0i5fsKM4n5Ts,14453
|
49
49
|
jarvis/jarvis_methodology/main.py,sha256=-PqsWvtpUJkkhiGgV-1JegEnEZBmv8SHnNMNNm_-QQc,11720
|
50
|
-
jarvis/jarvis_multi_agent/__init__.py,sha256=
|
50
|
+
jarvis/jarvis_multi_agent/__init__.py,sha256=efB04nWPRl4EOD64RThqQ6w78GZc2t0GGisX2wwTP8I,5949
|
51
51
|
jarvis/jarvis_multi_agent/main.py,sha256=h7VUSwoPrES0XTK8z5kt3XLX1mmcm8UEuFEHQOUWPH4,1696
|
52
52
|
jarvis/jarvis_platform/__init__.py,sha256=WLQHSiE87PPket2M50_hHzjdMIgPIBx2VF8JfB_NNRk,105
|
53
53
|
jarvis/jarvis_platform/ai8.py,sha256=yi7xG8ld4Yrf7drz-uu_JT_XCGYRB0obhygt-jKik8o,10871
|
54
54
|
jarvis/jarvis_platform/base.py,sha256=-XegiAS8G_nzwsWPOVEAQ2iTxE33fxu5-TWV4c3Pz-g,8981
|
55
55
|
jarvis/jarvis_platform/human.py,sha256=cSN8Lqf0ts2_pPfS2_v7PaWxQKqcW_3bSmhRTHey7Qo,4674
|
56
|
-
jarvis/jarvis_platform/kimi.py,sha256=
|
56
|
+
jarvis/jarvis_platform/kimi.py,sha256=dn_P4EEZvWWCPS67MDbWStsP7n3MN4-Rrc6R7GhJyEg,15436
|
57
57
|
jarvis/jarvis_platform/openai.py,sha256=ccGqsU2cFfd5324P7SH1tSmFABpvto8fytmxQGkr3BA,6412
|
58
58
|
jarvis/jarvis_platform/oyi.py,sha256=GvVooV8ScRqDb9QxJdINtdZwsx6PUIdo1-bt9k0hmqY,12604
|
59
59
|
jarvis/jarvis_platform/registry.py,sha256=1bMy0YZUa8NLzuZlKfC4CBtpa0iniypTxUZk0Hv6g9Y,8415
|
@@ -102,9 +102,9 @@ jarvis/jarvis_utils/methodology.py,sha256=-cvM6pwgJK7BXCYg2uVjIId_j3v5RUh2z2PBcK
|
|
102
102
|
jarvis/jarvis_utils/output.py,sha256=PRCgudPOB8gMEP3u-g0FGD2c6tBgJhLXUMqNPglfjV8,10813
|
103
103
|
jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
|
104
104
|
jarvis/jarvis_utils/utils.py,sha256=ojupkZQfFIE6ysTyCy0jUdePucpwpvZlZJSXkGsdyQE,15263
|
105
|
-
jarvis_ai_assistant-0.1.
|
106
|
-
jarvis_ai_assistant-0.1.
|
107
|
-
jarvis_ai_assistant-0.1.
|
108
|
-
jarvis_ai_assistant-0.1.
|
109
|
-
jarvis_ai_assistant-0.1.
|
110
|
-
jarvis_ai_assistant-0.1.
|
105
|
+
jarvis_ai_assistant-0.1.223.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
|
106
|
+
jarvis_ai_assistant-0.1.223.dist-info/METADATA,sha256=Fn58Cq6CpCpo9MjyYGrSWjI9Y2M90LA6VW9IjOu2tOE,24061
|
107
|
+
jarvis_ai_assistant-0.1.223.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
108
|
+
jarvis_ai_assistant-0.1.223.dist-info/entry_points.txt,sha256=JXK_n-d9HZ_RLz959CvpK5-UPOCwssn5oAH8dAHuebA,1277
|
109
|
+
jarvis_ai_assistant-0.1.223.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
|
110
|
+
jarvis_ai_assistant-0.1.223.dist-info/RECORD,,
|
File without changes
|
{jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/entry_points.txt
RENAMED
File without changes
|
{jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
{jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.1.223.dist-info}/top_level.txt
RENAMED
File without changes
|